Necesidad De Validaciones

Hola de nuevo y ante todo agradecido por las ayudas que me han dado en anteriores tópicos que he puesto y de antemano agradeciendo por las que me den ahora.

El problema que tengo es el siguiente, tengo un sistema de facturación hecho en Yii, para el caso que me trae aquí hoy tengo las tablas tablas siguientes:

[color="#FF0000"][color="#000000"]1.[/color] Datossal[/color], aquí se guardan los datos generales de las facturas, por campos:

  • id: es la clave o indice Tipo autonómico
  • fecha: fecha de facturación
  • nfactura: Numero de la factura
  • Codsalida: Tipo de salida, relacionada con la tabla [color="#FF0000"]tiposalida [/color]por ese campo.
  • Codcliente: Cliente a facturar, relacionada con la tabla [color="#FF0000"]Clientes [/color]por ese campo.
  • CodUEB: UEB o Entidad que realiza la operación, relacionada con la tabla [color="#FF0000"]Entidades [/color]por ese campo.
  • CodMon: Moneda a utilizar, relacionada con la tabla [color="#FF0000"]Monedas [/color]por ese campo.

2. [color="#FF0000"]Detallesfact[/color]: aquí van los detalles de las facturas, por campos:

  • Id: es la clave o indice Tipo autonómico
  • Id_sal: relacionada con la tabla [color="#FF0000"]Datossal [/color]por el campo id
  • Codprod: Es el producto a facturar, relacionada con la tabla [color="#FF0000"]Productos [/color]por ese campo.
  • Cantidad: cantidad a facturar
  1. [color="#FF0000"]Submayorprod[/color]: Aquí se actualiza el saldo actual campo (Saldoact) al darle salida al producto, o sea se le resta la cantidad al saldo actual y es la existencia de es producto, para eso esta tabla esta relacionada con las tablas [color="#FF0000"]Detallesfact y [/color][color="#FF0000"]Productos [color="#000000"] por el campo Codprod[/color][/color].

Hasta aquí todo marcha bien, o sea al darle salida a un producto por facturacion se actualiza el saldo actual en el [color="#FF0000"]Submayorprod[/color], para eso hice esto en el contralador de [color="#FF0000"]Datossal[color="#000000"] :




public function actionSalvarFactura()

{

	$id=$_POST['modelid'];


	if($id)

    	$model=$this->loadModel($id); 	

	else        	

    	$model = new Datossal;   

	

	if(isset($_POST['detalle']))

	{

			$model->fecha=$_POST['fecha'];

			$model->nfactura=$_POST['nfactura'];

			$model->Codsalida=$_POST['codsalida'];

			$model->CodCliente=$_POST['cliente'];

			$model->CodUEB=$_POST['codueb'];

			$model->CodMon=$_POST['codmon'];


   	if ($model->save()) {


        	Detallesfact::model()->deleteAll('Id_sal=:id', array(':id'=>$model->id));


        	foreach($_POST['detalle'] as $item){


				$detalle=new Detallesfact;  	

            	$detalle->Id_sal=$model->id;

            	$detalle->Codprod=$item['producto'];

            	$detalle->cantidad=$item['cantidad'];

	           	          			

        	if(!$id){

            	$criteria=new CDbCriteria;                                    	

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

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

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

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

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

            	$objSubmp->save();

            	}

         	}

   		}		

 		}

  	}



Pero ahora quiero hacer lo siguiente, cuando vaya a facturar en el detalle a quiero que me de la opción de que la cantidad a facturar para ese producto en la UEB no puede ser mayor que el saldo actual de ese producto en la tabla [/color][/color][u][b][color="#FF0000"]Submayorprod, o sea:

[/color][/b][/u][color="#000000"]$detalle->cantidad=$item[‘cantidad’] menor o igual que el saldo actual en ese momento.[/color][color="#FF0000"]

[color="#000000"]Ver si es aquí o en la forma. Esta es la forma para captar las facturas:




[/color][/color][/b][/u][color="#FF0000"][color="#000000"]<?php

/* @var $this DatossalController */

/* @var $model Datossal */

/* @var $form CActiveForm */

?>

<script>


$(function(){

	//Add, Save, Edit and Delete functions code

	$(".btnEdit").on("click", Edit);

	$(".btnDelete").on("click", Delete);

	$("#btnAdd").on("click", Add);	

	ActualizarCodigo();

});




function Add(){

	

	if($('#producto option:selected').text()!=''){

		var codigo= $('#incodigo').val()==''?'0':$('#incodigo').val();

            	var cantidad= $('#incantidad').val()==''?'0':$('#incantidad').val();   

                          	

            	$("#tblData tbody").append(

            	"<tr class='even'>"+	

            	"<td>"+ codigo +"</td>"+

            	"<td>"+ $('#producto option:selected').text()+"</td>"+

            	"<td>"+ cantidad +"</td>"+	

            	"<td><img src='images/update.png' class='btnEdit' title='Actualizar' style='cursor:pointer'>	<img src='images/delete.png' class='btnDelete' title='Eliminar' style='cursor:pointer'/></td>"+

            	"</tr>");


            	$(".btnEdit").off("click");

            	$(".btnDelete").off("click");

            	$(".btnEdit").on("click", Edit); 	

            	$(".btnDelete").on("click", Delete);


            	document.getElementById('incantidad').value ='';   

            	$('#producto option:selected').remove();

            	

            	ActualizarCodigo();

	}

	else{

		alert('No quedan productos para adicionar');

	}

		

};


var oldCantidad;

function Edit(){

	var par = $(this).parent().parent(); //tr

	var tdCantidad = par.children("td:nth-child(3)");  

	var tdButtons = par.children("td:nth-child(4)");

	

	oldCantidad=tdCantidad.html();

	

   tdCantidad.html("<input type='text' id='txtCantidad' value='"+tdCantidad.html()+"'/>"); 

   tdButtons.html("<img src='images/save.png' class='btnSave' title='Guardar' style='cursor:pointer'/>	<img src='images/cancel.gif' class='btnCancel' title='Cancelar' style='cursor:pointer'/>");

 

	$(".btnEdit").off("click");

	$(".btnDelete").off("click");

	$(".btnSave").on("click", Save);

	$(".btnCancel").on("click", Cancel);

	$(".btnEdit").on("click", Edit);

	$(".btnDelete").on("click", Delete);

};


function Save(){

	var par = $(this).parent().parent(); //tr

	var tdCantidad = par.children("td:nth-child(3)"); 

	var tdButtons = par.children("td:nth-child(4)");

   

 	

	tdCantidad.html(tdCantidad.children("input[type=text]").val());  

	tdButtons.html("<img src='images/update.png' class='btnEdit' title='Actualizar' style='cursor:pointer'/>	<img src='images/delete.png' class='btnDelete' title='Eliminar' style='cursor:pointer'/>");

 

	$(".btnEdit").off("click");

	$(".btnDelete").off("click");

	$(".btnEdit").on("click", Edit);

	$(".btnDelete").on("click", Delete);

};


function Cancel(){

	var par = $(this).parent().parent(); //tr

	var tdCantidad = par.children("td:nth-child(3)"); 

	var tdButtons = par.children("td:nth-child(4)");

    	

	tdCantidad.html(oldCantidad); 

	tdButtons.html("<img src='images/update.png' class='btnEdit' title='Actualizar' style='cursor:pointer'/>	<img src='images/delete.png' class='btnDelete' title='Eliminar' style='cursor:pointer'/>");

 

	$(".btnEdit").off("click");

	$(".btnDelete").off("click");

	$(".btnEdit").on("click", Edit);

	$(".btnDelete").on("click", Delete);

};




function Delete(){

	var par = $(this).parent().parent(); //tr

	$('#producto')

 		.append($("<option></option>")

 		.attr("value",par.children("td:nth-child(1)").html())

 		.text(par.children("td:nth-child(2)").html())); 

 

 		ActualizarCodigo();

	

	par.remove();

};


function ActualizarCodigo(){

	

	$('#incodigo').val($('#producto option:selected').val());


};


$('#datossal-form').live('submit',function(event) {


	var tbl = $('#tblData tbody tr').map(function() {

			var row = $(this);

			return {	producto: row.find(':nth-child(1)').text(),

					cantidad: row.find(':nth-child(3)').text(),

                            	};

			}).get();

	

	$.ajax({

    	url: 'index.php?r=datossal/salvarFactura',

    	type: 'POST',

    	dataType: 'text',

    	data: {"detalle":tbl, 

		"fecha": $('#Datossal_fecha').val(),

            	"nfactura":$('#Datossal_nfactura').val(),

            	"codsalida":$('#Datossal_Codsalida').val(),

            	"cliente":$('#Datossal_CodCliente').val(),

		"codueb":$('#Datossal_CodUEB').val(),

            	"codmon":$('#Datossal_CodMon').val(),

		"modelid":$('#modelid').val() 

        		},

    	success: function(data) {

		window.location.href='index.php?r=datossal/admin';		

    	}

	});

	return false;

});

</script>


<style>

.mystyle

{

	background: white;

	border-collapse: collapse;

	width: 100%;

	border: 1px #D0E3EF solid;

	

}

.mystyle th, .mystyle td

{	

	border: 1px white solid;

	padding: 0.3em;

}

.mystyle th

{

	color: white;

	background: #69A8CD;

	text-align: center;

}

.mystyle tr.even

{

	background: #F8F8F8;

}

.mystyle tr.odd

{

	background: #E5F1F4;

}

.mystyle tr.selected

{

	background: #BCE774;

}

.mystyle tbody tr:hover

{

	background: #ECFBD4;

}


</style>

<div class="form">

<table width="138" border="1">

  <tr>

	<td width="28"><?php	

 	

    	echo CHtml::submitButton('Resumen de existencias ', array('submit'=>array('reportes/reporteResumenExistencias'))); 

	?>

    	<div></div>

  	<div align="left"></div></td>

	<td width="32"><div align="left">

  	<?php    	

    	echo CHtml::submitButton('Existencias por entidades', array('submit'=>array('/reportes/Existencias'))); 

	?>

	</div></td>

	<td width="17"><div align="left">

  	<?php    	

    	echo CHtml::submitButton('Estado del cliente', array('submit'=>array('/reportes/Clientes')));

		

	?>

	

	</div></td>

	<td width="33">&nbsp;</td>

  </tr>

</table>

<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'datossal-form',

	'enableAjaxValidation'=>false,

)); ?>

   <?php echo '<input type="hidden" id="modelid" value="'.$model->id.'"/>'; ?>

      	<p class="note"><span style="float: left;"><style>

        	.rojo1 {background-color: red; }

  	</style>

	</span></p>

	<p class="note">Los campos con <span class="required">*</span> son necesarios.</p>


	<?php echo $form->errorSummary($model); ?>

<table width="375" border="1">

  	<tr>

      	

    	<th width="81" scope="row"><div align="left"><span style="float: left;"> <?php echo $form->labelEx($model,'Fecha'); ?>

          	<?php $feriados="['25/12/2013','01/01/2014','02/01/2014', '01/05/2014','25/07/2014','26/07/2014','27/07/2014','10/10/2014','25/12/2014','01/01/2015','02/01/2015', '01/05/2015','25/07/2015','26/07/2015','27/07/2015','10/10/2015','25/12/2015','01/01/2016','02/01/2016', '01/05/2016','25/07/2016','26/07/2016','27/07/2016','10/10/2016','25/12/2016']";   

 $this->widget('CJuiDatePickerEvents', array(

                	'model'=>$model,

                	'attribute'=>'fecha',

                	'value'=>$model->fecha,

					'htmlOptions' => array('readonly'=>"readonly"),

                	'language' => 'es',

                	'events'=> array("beforeShowDay"=>"function(date) {var events = $feriados ;

                    	var current='';

                    	// agrego el cero a izq si corresponde

                    	if (date.getDate()<10)

                            	current='0'+date.getDate()+'/';

                    	else

                            	current=date.getDate()+'/';

                    	if (date.getMonth() + 1<10)

                            	current=current+'0'+(date.getMonth()+1)+'/';

                    	else

                            	current=current+(date.getMonth()+1)+'/';

                    	current=current+date.getFullYear();

                    	

                    	//feriados s&aacute;bados y domingos

                    	return (jQuery.inArray(current, events) == -1 && date.getDay()!=0 && date.getDay()!=7)?[true, '']:[true,'rojo1','D&iacute;a no laborable'];},"),

                	'options'=>array(

                    	'defaultDate'=>$model->fecha,

           				'dateFormat'=>'yy-mm-dd',

                    	'showAnim'=>'slide',

						//'minDate'=>'date-30("d-m-Y")', //fecha minima

						'maxDate'=> "+20Y", //fecha maxima

						

	  			),

   			)); ?>

 		<?php echo $form->error($model,'fecha'); ?></span></div></th>

    	<td width="144"><span class="row"><?php echo $form->labelEx($model,'nfactura'); ?> <?php echo $form->textField($model,'nfactura'); ?> <?php echo $form->error($model,'nfactura'); ?> </span></td>

    	<td width="72"><div align="left"><?php echo $form->labelEx($model,'Tipo Salida'); ?><?php echo $form->dropDownList($model,'Codsalida',  

	CHtml::listData(Tiposalida::model()->findAll(array('order'=>'Descripcion')), 'Codsalida', 'Descripcion')); ?><?php echo $form->error($model,'Codsalida'); ?></div></td>

 		<td width="63"><div align="left"><?php echo $form->labelEx($model,'Moneda'); ?><?php echo $form->dropDownList($model,'CodMon',  

	CHtml::listData(monedas::model()->findAll(array('order'=>'NMoneda')), 'CodMon', 'NMoneda')); ?><?php echo $form->error($model,'CodMon');?> </div></td>

    	<td width="59"><div align="left"><?php echo $form->labelEx($model,'Cliente'); ?><span class="row"><?php echo $form->dropDownList($model,'CodCliente',  

	CHtml::listData(Clientes::model()->findAll(array('order'=>'Descripcion')), 'CodCliente', 'Descripcion')); ?> <?php echo $form->error($model,'CodCliente'); ?></span></div></td>

    	<td width="66"><div align="left"><?php echo $form->labelEx($model,'Entidad o UEB'); ?><?php echo $form->dropDownList($model,'CodUEB',  

	CHtml::listData(Entidades::model()->findAll(array('order'=>'NEnt')), 'CodUEB', 'NEnt')); ?><?php echo $form->error($model,'CodUEB'); ?></div></td>

  	</tr>

  </table>

<!-- ---------------------------------------- Detalles de la Factura ------------------------------------- -->

    	<fieldset>

		<legend>Lista de Productos</legend>

		<table>

    	<tr>                 			

            	<td>

                	<label>Producto</label>

                	<?php 

                    	$conceptos=array();

                    	$todos=Productos::model()->findAll(array('order'=>'NProductos'));


                    	foreach ($todos as $producto) {

                        	$esta=false;

                        	foreach ($model->detalleFacturas as $value) {

                            	if($producto->NProductos==$value->idProducto->NProductos){

                                    	$esta=true;

                                    	break;

                            	}                                                	

                 			}

                 			if(!$esta)

                     			$conceptos[$producto->Codprod]=$producto->NProductos;

                    	}


                        	echo CHtml::dropDownList('producto','', $conceptos,array(                                    	

                                                	'onChange'=>'javascript:ActualizarCodigo()',								         

                                            	));                     			

                    	?>

            	</td>   

            	<td>

                    	<label>Codigo</label>

                    	<input type="text" id="incodigo"/>

            	</td>

            	<td>

                    	<label>Cantidad</label>

                    	<input type="text" id="incantidad"/>

            	</td>

 			</tr>

    	<tr>

            	<td>

                    	<input type="button" id="btnAdd" value="Adicionar Producto"/>

            	</td>

    	</tr>

</table>

		

	<table id="tblData" class="mystyle"> 		

    	<thead>

        	<tr>  

            	<th>Código</th>

            	<th>Producto</th>

            	<th>Cantidad</th>

            	<th style="width:50px"></th>

        	</tr>

    	</thead>

    	<tbody>

        	<?php 

            	foreach ($model->detalleFacturas as $value) {

                	echo "<tr>";

                	echo "<td>".$value->idProducto->Codprod."</td>";

                	echo "<td>".$value->idProducto->NProductos."</td>";

                	echo "<td>".$value->cantidad."</td>";   

       			echo "<td><img src='".Yii::app()->request->baseUrl."/images/update.png' class='btnEdit' title='Actualizar' style='cursor:pointer'>

                 			<img src='".Yii::app()->request->baseUrl."/images/delete.png' class='btnDelete' title='Eliminar' style='cursor:pointer'/></td>";

                	echo "</tr>";

     			}

        	?>  

    	</tbody>

	</table>

	

</fieldset>

	<div class="row buttons">

		<?php echo CHtml::submitButton($model->isNewRecord ? 'Crear' : 'Salvar'); ?>

	</div>


<?php $this->endWidget(); ?>


</div><!-- form -->[/color][/color][u][color="#FF0000"] [/color][b][color="#FF0000"][color="#000000"]

[/color][/color][u][b][color="#FF0000"] Espero me ayuden, ya que necesito validar eso

[/color][/b][/u]

Buenas Rafael.

Si te he entendido bien sólo tienes q crear una regla de validación en tú modelo y asignarla al campo que necesites y listo.

Crear regla validación

Un saludo.

Hola amigo, te he entendido perfectamente y gracias por responder, el problema es que no se como crear esa regla de validación, o sea, ya cree en el controlador esta acción [color="#FF0000"]actionSalvarFactura[/color] que ya puse en public function accessRules(), el problema es a la hora de crear la validacion, no se como decir esto que es lo que quiero:

[color="#FF0000"]si $detalle->cantidad=$item[‘cantidad’]>SaldoActua[/color]l (en submayor) entonces no me deje hacer la operación y me envíe un mensaje donde diga que no se puede hacer la operación, si te das cuenta debajo tengo el saldo actual en submayor después de echa la operación[color="#FF0000"] ($objSubmp->SaldoAct)[/color].

si pudieras ayudarme con los datos que puse te lo agradecería, no creo que esta sea una de las validaciones estándares de yii

Gracias

Te has leído el enlace q te puse?

No tienes q tener un action en tu controlador. Tienes q tener una regla de validación en tu modelo.

Y dentro de esa regla poner lo q desees.




public function comprobarSaldo($attribute,$params)

....

// AQUÍ ESCRIBES TUS CONDICIONES



Y en las rules añades:




array('nombreCampo', 'comprobarSaldo')



Y ya está.

Dentro de la función compruebas q el valor del atributo sea menor q el saldo actual y listo.

Si aún no lo tienes claro contéstame y te reviso tu código este fin de semana más a fondo.

Un saludo.

Ok amigo gracias por responder, yo entiendo perfectamente eso, lo que tengo problema es como redactar esa condición, o sea como puedo establecer la condición que saldoactual>cantidad, yo domino bien poco el php, yo estoy aprendiendo ahora con el uso del yii, así que te agredeceria que revises mi codigo el fin de semana y me contestes.

Teniendo en cuenta q supongo q en tu modelo tendrás el código de producto, y suponiendo que lo quieras hacer en el modelo de Detallesfact, entiendo que sería algo como esto:




public function comprobarSaldo($attribute,$params)

{

   $saldoActual = Submayorprod::model()->findByAttributes("CorProd" => $this->CodProd)->SaldoAct;


   if($attribute <= $saldoActual)

      return true;

   else

      return false;

}



Attribute será Cantidad.

Un saludo.

[solucionado]

Ok lagogz, gracias por responde, de todas formas ya resolví, lo hice de la siguiente forma:

En la forma hice lo siguiente:




function Add(){


	if($('#producto option:selected').text()!=''){

	

		var codigo= $('#incodigo').val()==''?'0':$('#incodigo').val();

    	var cantidad= $('#incantidad').val()==''?'0':$('#incantidad').val(); 

		var codigoUEB= $('#Datossal_CodUEB').val(); 

	

		$.ajax({

			url: 'index.php?r=datossal/comprobarSaldo',

			type: 'POST',

			dataType: 'text',

			data: {	"codigo":codigo, 

					"codigoUEB":codigoUEB,

					"cantidad": cantidad

					},

			success: function(data) {

					

					if(data.trim()=="ok")

					{

						$("#tblData tbody").append(

						"<tr class='even'>"+	

						"<td>"+ codigo +"</td>"+

						"<td>"+ $('#producto option:selected').text()+"</td>"+

						"<td>"+ cantidad +"</td>"+	

						"<td><img src='images/update.png' class='btnEdit' title='Actualizar' style='cursor:pointer'>	<img src='images/delete.png' class='btnDelete' title='Eliminar' style='cursor:pointer'/></td>"+

						"</tr>");


						$(".btnEdit").off("click");

						$(".btnDelete").off("click");

						$(".btnEdit").on("click", Edit); 	

						$(".btnDelete").on("click", Delete);


						document.getElementById('incantidad').value ='';   

						$('#producto option:selected').remove();

						

						ActualizarCodigo();

					}

					else

						alert("No tiene saldo para facturar");

			}

		});               	

	}

	else{

		alert('No quedan productos para adicionar');

	}

		

};



y en controlador hice lo siguiente:




public function actionComprobarSaldo()

{

	$codigo=$_POST['codigo'];

	$cantidad=$_POST['cantidad'];

	$codigoUEB=$_POST['codigoUEB'];

		

	$criteria=new CDbCriteria;                                    	

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

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

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

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

	

	if($objSubmp->SaldoAct < $cantidad)

		echo "error";

	else

		echo "ok";	

			

}



no se si es la mejor forma, pero fue lo que pude hacer, de todas formas voy a probar la opción que me das, ya que siempre seguiré los consejos de un gran conocedor del yii como usted

Un saludo.

[SOLUCIONADO] Necesidad De Validaciones

Coméntanos si te funcionó con la rule que te puse.

Un saludo.