Validar Y Restar

Bueno nuevamente en busca de ayuda…

Tengo una tabla de medicamentos y una tabla de recetas. En la tabla recetas se introduce la cantidad del medicamento que se quiere, y esta cantidad debera sustraer de el valor que este disponible dentro de la tabla medicamentos, y al mismo tiempo quisiera validar para que la cantidad en recetas no pueda sobrepasar el valor disponible en medicamentos…

No queria volver a molestar en el foro, pero ya tenia varias horas buscando documentacion alguna y sin suerte…

Agradeceria mucho cualquier ayuda que pudieran brindar :)

No es molestia Dante, las preguntas ayudan a todos. En términos generales, ese es un sistema de control de inventario. El inventario (los medicamentos) deben tener un campo usualmente llamado "a la mano" (onhand en inglés). La manera clásica de trabajarlo es que en el controlador de recetas y justo antes de grabar la receta se hace una consulta al inventario a la mano y si la resta resulta menor de cero, entonces se cancela el save. La manera moderna y más elegante es hacer la consulta a través de una llamada Ajax en Javascript e informar al usuario sobre la deficiencia en el momento. De esa manera se evita llegar hasta el controlador cuando se sabe previamente que el save fallará.

Si la receta no consume todo el inventario a la mano, entonces se procede a grabar la misma e inmediatamente (en el mismo controlador de recetas) se actualiza el inventario restante en la tabla de inventario.

Buenas.

En mi opinión con añadir una regla a tu modelo bastaría.

Crear Regla Validación

Creas tu regla y se la pones a receta, con lo que esta regla comprobará si hai existencias.

Si las hay, despues del save actualizas tu stock, y si no las hay el modelo ya se encarga de mostrarte el error.

Un saludo.

En mi opinión están muy buenas las replicas anteriores, ahora te expongo lo que hice en mi sistema de inventarios:

En el controlador cree una regla para comparar los saldos en este caso:





public function actionComprobarSaldo()

{

    $codigo=$_POST['codigo'];

	$cantidad=$_POST['cantidad'];

	$codigoUEB=$_POST['codigoUEB'];			

	$criteria=new CDbCriteria;                                        

	$criteria->addCondition('CodUEB=:codueb'); 

	$criteria->addCondition('Codprod=:codigo'); 	

	$criteria->params=array(':codueb'=>$codigoUEB , ':codigo'=>$codigo);		

	$objSubmp = Submayorprod::model()->find($criteria);

	

	if($objSubmp->SaldoAct < $cantidad)

		echo "error";

	else

		echo "ok";

		

}



Con esto a la hora de escoger un producto compara y si la cantidad es mayor que el saldo o existencia entonces manda un mensaje

Ademas puse esto para rebajar del submayor al pasar una operación:





  //para actualizar los saldos en tabla Submayorprod 

            if(!$id){

            $criteria=new CDbCriteria;                                        

            $criteria->addCondition('CodUEB=:codueb'); 

            $criteria->addCondition('Codprod=:codigo'); 	

            $criteria->params=array(':codueb'=>$model->CodUEB, ':codigo'=>$item['producto']);			

            $objSubmp = Submayorprod::model()->find($criteria);

            $objSubmp->SaldoAct = $objSubmp->SaldoAct - $item['cantidad'];

            $objSubmp->SaldoAnt = $objSubmp->SaldoAct + $item['cantidad']; 

            $objSubmp->save();


            }

        }



Ojala con esto te pueda ayudar.

Gracias a todos por sus respuestas al final logre hacer todo lo necesario con el sistema y fue terminado con exito.

Queria compartir los codigos que termine utilizando en esta validacion por si llegan a ser de ayuda a alguien mas.

Validacion que nos informa si la cantidad que se escribio es mayor a la de existencia.


public function val1($attribute,$params)

	{

	

	$stock = CatMedicamento::model()->findByPK($this->CodigoMedicamento);

	

	if($this->$attribute > $stock->CantidadMedicamento)

	$this->addError($attribute,"Esta cantidad es mayor a la de el medicamento en existencia");

	}

Y la resta de la cantidad la coloque en un beforeSave como sugirieron.

public function beforeSave(){

 &#036;stock = CatMedicamento::model()-&gt;findByPK(&#036;this-&gt;CodigoMedicamento);


 &#036;resultado = &#036;stock-&gt;CantidadMedicamento - &#036;this-&gt;Cantidad;


 &#036;stock-&gt;CantidadMedicamento = &#036;resultado;


 &#036;stock-&gt;save();


 


 return parent::beforeSave();


 


}