Hola a todos, recientemente di por terminado un post sobre extension Echosen, al cambiar para la extension select2, ya que con select2 se resolvia el problema de mostrar los valores del segundo combo en combos combinados, pero no analice la terminar de hacer la factura, el problema es que ahora me no me deja hacer la factura por el siguiente problema:
Me genera dos errores:
<p>Undefined index: idCodigo (D:\xampp\htdocs\SoftVentas\protected\controllers\DatossalController.php:130)</p>
Error [8] <p>Undefined index: codcliente (D:\xampp\htdocs\SoftVentas\protected\controllers\DatossalController.php
Voy a poner la forma como trabajo esta parte:
No creo la factura por la accion del controlador (actionCreate)
para eso creo una accion llamada [color="#FF0000"]public function actionSalvarFactura() [color="#000000"]en el controlador[/color][/color]
esta es la accion:
public function actionSalvarFactura() {
$id = $_POST['modelid'];
$importeTotal = 0;
$importeTotalc = 0;
$impdl = 0;
$imventas = 0;
$imrecargo = 0;
if ($id) {
$model = $this->loadModel($id);
} else {
$model = new Datossal;
//verificar si el consecutivo ya existe
/* $fact = Datossal::model()->find('Idn = :fa', array(':fa' => $_POST['idn']));
if ($fact) {
echo "fail";
yii::app()->end();
}*/
}
$firm = Firmantes::model()->find('CI=:CI', array(':CI' => $_POST['ci']));
$Ent = Entidades::model()->find('CodUEB=:CodUEB', array(':CodUEB' => $_POST['codUEB']));
//echo $firm->Fechaf;
if ($firm->Fechaf > date('Y-m-d') && (isset($_POST['detalle']))) {
$model->fecha = $_POST['fecha'];
$model->CodCliente = $_POST['codcliente'];
$model->CodUEB = $_POST['codUEB'];
$model->CI = $_POST['ci'];
$model->IdEstado = $_POST['idestado'];
$model->CIFac = $_POST['cifac'];
$model->CodOp = 1;
$model->NConduce = $_POST['nconduce'];
$model->norden = $_POST['norden'];
$model->Codde = 1;
$model->CodDoc = 2;
$model->CITra = $_POST['citra'];
$model->bultos = $_POST['bultos'];
$model->entregar = $_POST['entregar']; //
if ($model->save()) {
$fecha = date("y");
$cadena1 = "$Ent->Cod";
$cadena3 = "-";
$cadena4 = "$model->Idn"; //
$cadena5 = "0";
$cadena6 = "00";
$cadena7 = "000";
$cadena8 = "MN";
//llenar numero de factura
if (!$id) {
$criteria = new CDbCriteria;
$criteria->addCondition('Idn=:Idn');
$criteria->params = array(':Idn' => $model->Idn);
$objFact = datossal::model()->find($criteria);
if ($model->Idn <= 9) {
$objFact->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena7 . $cadena4;
} elseif ($model->Idn >= 10 & $model->Idn <= 99) {
$objFact->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena6 . $cadena4;
} elseif ($model->Idn >= 100 & $model->Idn <= 999) {
$objFact->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena5 . $cadena4;
} elseif ($model->Idn >= 1000) {
$objFact->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena4;
}
$objFact->save();
Detallesfact::model()->deleteAll('Id_sal=:nfactura', array(':nfactura' => $model->nfactura));
//date("y")
foreach ($_POST['detalle'] as $item) {
//Lo que se guarda en tabla Detallesfactc
$detalle = new Detallesfact;
$detalle->Id_sal = $objFact->nfactura;
$detalle->Codprod = $item['producto']; //
$detalle->cantidad = $item['cantidad']; //
$detalle->prod = $item['prod']; //
$detalle->recargo = $item['recargo']; //
$detalle->cmay = $item['cmay'];
$produ = Productos::model()->find('Codprod=:Codprod', array(':Codprod' => $item['producto']));
$produp = Subproductos::model()->find('Codpro=:Codpro', array(':Codpro' => $produ->CodSubp));
$prodtipo = Tipoprod::model()->find('Codtipo = :Codtipo', array(':Codtipo' => $produp->Codtipo));
$turcadm = Turcadm::model()->find('CodOp=:CodOp', array(':CodOp' => $model->CodOp));
$detalle->Codpro = $produp->Codpro; //
// $producmayor = Submyproductos::model()->find('Codpro=:Codpro and CodPVen=:codpven', array(':Codpro' => $produp->Codpro, ':codpven' => $venta));
$producmayor = Submyproductos::model()->find('Codpro=:Codpro', array(':Codpro' => $produp->Codpro));
$detalle->CodPVen = $producmayor->CodPVen;
$detalle->SaldoDes = $producmayor->SaldoAct - $detalle->cantidad;
$mayor = Cmayorista::model()->find('IdMay=:IdMay', array(':IdMay' => $item['cmay']));
//formacion de precio mn
switch ($model->CodOp) {
case 1:
if ($mayor->IdMay <> 1) {
$detalle->premn = ROUND($produ->PreMay / $turcadm->Tasa, $produ->lg);
} elseif ($mayor->IdMay <> 2) {
$detalle->premn = ROUND($produ->PreMay, $produ->lg);
}
break;
}
//importemn
$detalle->importemn = ROUND($detalle->premn * $detalle->cantidad, 2);
//iventas mn
switch ($model->CodOp) {//revisar cuando realmente lo lleve
case 1:
if ($mayor->IdMay <> 1) {
$detalle->imventas = ROUND((($produ->PreMay / $turcadm->Tasa - $produ->PreMay)) * $detalle->cantidad, 2);
} elseif ($mayor->IdMay <> 2) {
0;
}
break;
}
// $detalle->imventas = ROUND((($produ->PreMay / $turcadm->Tasa - $produ->PreMay)) * $detalle->cantidad, 2);
//recargo
if ($detalle->recargo <> 1) {
$detalle->Recargoca = ROUND($detalle->cantidad * $prodtipo->recargo, 2);
}
$importeTotal += $detalle->importemn;
$imventas += $detalle->imventas;
$imrecargo += $detalle->Recargoca;
$detalle->save();
//para actualizar los saldos en tabla Submyproductos
if (!$id) {
$criteria = new CDbCriteria;
$criteria->addCondition('CodPVen=:codpven');
$criteria->addCondition('Codpro=:codigo');
$criteria->params = array(':codpven' => $detalle->CodPVen, ':codigo' => $produp->Codpro);
$objSubmp = Submyproductos::model()->find($criteria);
$objSubmp->SaldoAct = $objSubmp->SaldoAct - $item['cantidad'];
$objSubmp->SaldoAnt = $objSubmp->SaldoAct + $item['cantidad'];
$objSubmp->save();
}
//llenar historico de operaciones
$histoper = Histoper::model()->find('nfactura=:nfactura and Cliente=:Cliente', array(':nfactura' => $objFact->nfactura, ':Cliente' => $model->CodCliente));
if (!$histoper) {//Si no existe crearla
$histoper = new Histoper;
$histoper->nfactura = $objFact->nfactura;
$histoper->fecha = $model->fecha; //
$histoper->CodUEB = $model->CodUEB; //
$histoper->Cliente = $model->CodCliente; //
$histoper->CodDoc = 2; //
$histoper->IdEstado = $model->IdEstado; //
$histoper->ndocu = $model->norden; //
$histoper->CodOp = $model->CodOp; //
$histoper->Codde = $model->Codde; //
$histoper->CIFac = $model->CIFac; //
$histoper->CICli = $model->CI; //
$histoper->CITra = $model->CITra; //
$histoper->save();
}
//llenar otros calculos
if (!$id) {
$criteria = new CDbCriteria;
$criteria->addCondition('nfactura=:nfactura');
$criteria->params = array(':nfactura' => $objFact->nfactura);
$objFac = Datossal::model()->find($criteria);
$histopera = Histoper::model()->find($criteria);
$histopera->ImporteMN = $importeTotal + $imrecargo;
$histopera->Recargo = $imrecargo;
$histopera->Imporventas = $imventas;
$objFac->Imporventas = $imventas;
$objFac->Recargo = $imrecargo;
$objFac->ImporteMN = $importeTotal + $imrecargo;
$histopera->save();
$objFac->save();
//llenar historico de facturas
}
//Guardar saldos despues de guardarlos en subcmayor en Histsalpro
$histsalpro = Histsalpro::model()->find('id=:id and Codpro=:Codpro and CodPVen=:CodPVen', array(':id' => $model->nfactura, ':Codpro' => $produp->Codpro, ':CodPVen' => $detalle->CodPVen));
// $productos = Submyproductos::model()->find('Codpro=:Codpro and CodPVen=:CodPVen', array(':Codpro' => $produp->Codpro, ':CodPVen' => $detalle->CodPVen));
$productos = Submyproductos::model()->find('Codpro=:Codpro', array(':Codpro' => $produp->Codpro));
if (!$histsalpro) {//Si no existe crearla
$histsalpro = new Histsalpro;
$histsalpro->Codpro = $produp->Codpro;
$histsalpro->CodPVen = $detalle->CodPVen;
$histsalpro->SaldoAnt = $productos->SaldoAnt;
$histsalpro->SaldoAct = $productos->SaldoAct;
$histsalpro->fecha = date('Y-m-d_h.i.s'); //Fecha de la modificación Y-m-d h:mm:ss
$histsalpro->save();
}
//llenar historicos de detalles de operaciones
$histdetaoper = Histdetallesoper::model()->find('nfactura=:nfactura and Codpro=:Codpro', array(':nfactura' => $model->nfactura, ':Codpro' => $produp->Codpro));
if (!$histdetaoper) {//Si no existe crearla
$histdetaoper = new Histdetallesoper;
$histdetaoper->nfactura = $detalle->Id_sal; //
$histdetaoper->Codprod = $detalle->Codprod; //
$histdetaoper->cantidad = $detalle->cantidad; //
$histdetaoper->Codpro = $produp->Codpro;
$histdetaoper->SaldoDes = $detalle->SaldoDes; //
$histdetaoper->importemne = ROUND($detalle->SaldoDes * $detalle->premn, 2); //
$histdetaoper->importemn = ROUND($detalle->cantidad * $detalle->premn, 2); //
$histdetaoper->Recargo = $detalle->Recargoca; //
$histdetaoper->impventasmn = $detalle->imventas; //
$histdetaoper->premn = $detalle->premn; //
$histdetaoper->CodPVen = $detalle->CodPVen;
$histdetaoper->cmay = $detalle->cmay; //
$histdetaoper->prod = $detalle->prod;
$histdetaoper->save();
}
}//para todos los detalles cierra aqui
$factura = Facturas::model()->find('nfactura=:nfactura and CodCliente=:CodCliente and CodUEB=:CodUEB', array(':nfactura' => $model->nfactura, ':CodCliente' => $model->CodCliente, ':CodUEB' => $model->CodUEB));
// printf("rafael"); //para ver si entra aqui
//die();
if (!$factura) {//Si no existe crearla
$factura = new Facturas;
$factura->CodCliente = $model->CodCliente;
$factura->CodUEB = $model->CodUEB;
$factura->nfactura = $objFac->nfactura;
$factura->estado = $model->IdEstado;
$factura->nfactura = $objFac->nfactura;
$factura->estado = $model->IdEstado;
$factura->ImporteMN = $objFac->ImporteMN;
$factura->save();
}
}
}
Yii::app()->user->setFlash('success', 'Factura realizada satisfactoriamente');
} else {
Yii::app()->user->setFlash('error', 'No puede facturar, actualice su contrato');
}
}
En el controlador tengo una funcion para la llamada de los combos:
public function actionActualizarFirmantes() {
$model = Clientes::model()->findByPk($_POST['idCodigo']);
//llenar firmantes
$data = CHtml::listData($model->firmantes, 'CI', 'Nombre');
$firmantes = "";
foreach ($data as $value => $name) {
$firmantes .= CHtml::tag('option', array('value' => $value), CHtml::encode($name), true);
}
// return data (JSON formatted)
echo CJSON::encode(array(
'firmantes' => $firmantes
));
}
El el form tengo un script:
$.ajax({
url: 'index.php?r=datossal/actualizarFirmantes',
type: 'POST',
dataType: 'json',
data: {
"idCodigo": $('#Datossal_CodCliente').val()
},
success: function(data) {
$("#Datossal_CI").html(data.firmantes);
}
});
......
$('#datossal-form').live('submit', function() {
var tbl = $('#tblData tbody tr').map(function() {
var row = $(this);
return {producto: row.find(':nth-child(1)').text(),
//return { prcmay: row.find(':nth-child(2)').text(),
// return { producto: row.find(':nth-child(3)').text(),
// productos: row.find(':nth-child(4)').text(),
cantidad: row.find(':nth-child(3)').text(),
prod: row.find(':nth-child(4)').text(),
recargo: row.find(':nth-child(5)').text(),
cmay: row.find(':nth-child(6)').text(),
};
}).get();
$.ajax({
url: 'index.php?r=datossal/salvarFactura',
type: 'POST',
dataType: 'text',
data: {"detalle": tbl,
// "idn": $('#Datossal_Idn').val(),
"fecha": $('#Datossal_fecha').val(),
"nfactura": $('#Datossal_nfactura').val(),
"codsalida": $('#Datossal_Codsalida').val(),
"codcliente": $('#Datossal_CodCliente').val(),
"codUEB": $('#Datossal_CodUEB').val(),
"codde": $('#Datossal_Codde').val(),
"ci": $('#Datossal_CI').val(),
"idestado": $('#Datossal_IdEstado').val(),
"cifac": $('#Datossal_CIFac').val(),
"1": $('#Datossal_CodDoc').val(),
"citra": $('#Datossal_CITra').val(),
"codop": $('#Datossal_CodOp').val(),
"nconduce": $('#Datossal_NConduce').val(),
"norden": $('#Datossal_norden').val(),
"bultos": $('#Datossal_bultos').val(),
"entregar": $('#Datossal_entregar').val(), //
"2": $('#Datossal_CodMon').val(),
"modelid": $('#modelid').val()
},
success: function(data) {
if (data === 'fail')
alert('Ya existe un registro con ese número consecutivo');
else
window.location.href = 'index.php?r=datossal/admin';
}
});
Muestro los clientes y personas autorizadas a firmar de esta forma:
primer combo (Cliente)
<?php echo $form->labelEx($model, 'CodCliente'); ?>
<?php
$this->widget('ext.select2.ESelect2', array(
'name' => 'CodCliente',
'data' => CHtml::listData(Clientes::model()->findAll(), 'CodCliente', 'Descripcion'),
'htmlOptions' => array(
'style' => 'width: 200px;',
'ajax' => array(
'type' => 'POST',
'url' => CController::createUrl('datossal/actualizarFirmantes'),
'dataType' => 'json',
'data' => array('idCodigo' => 'js:this.value'),
'success' => 'function(data) {
$("#Datossal_CI").html(data.firmantes);
}')
)));
?>
<?php echo $form->error($model, 'CodCliente'); ?>
Segundo combo dependiente del primero (personas autorizadas a firmar)
<?php echo $form->labelEx($model, 'CI'); ?>
<?php echo $form->dropDownList($model, 'CI', array()); ?>
<?php echo $form->error($model, 'CI'); ?>
Cuando acciono el boton crear me genera el segundo error, el primer error lo genera al actualizar el formulario. Espero de ustedes la ayuda necesaria para poder resolverlo, dando las gracias por adelantado.
Aclaro, antes de usar la extension select2 para filtro, esto funcionaba bien, pero necesito el filtro.
Aclaro ademas que al debuguear en los parametros del envio no muestra el cliente, que es el parametro asociado con el error:
bultos514124ci74100112907 este es el firmante, si lo muestra
cifac87121329938citra52040512663codUEB0161204detalle[0][cantidad]4detalle[0][cmay]2detalle[0][prod]1detalle[0][producto]123.3.03.0017detalle[0][recargo]1entregar
fecha2017-04-27idestado3