Hola a la comunidad de yii en español, estoy haciendo un formulario para cobrar las deudas de clientes de las facturas vendidas con tres modelos usando la extensión multimodelform y me genera varios errores visibles o no, tengo tres tablas de la siguiente forma:
- tabla docubancarios (capto el documento de pago), tiene los campos entre otros:
Id: llave principal autonumerico
CodCliente: varchar (Código del cliente que paga)
Importe: numerico (valor o importe del documento de pago) - tabla detallescheq (van los detalles del documento. o sea las facturas que paga el cliente con su documento tabla 1), tiene los siguientes campos entre otros:
Id: autonumerico y llave prinipal
Id_che: Integer, relacionado con Id de la tabla 1 (uno a varios, o sea un documento puede tener varios detalles)
valor: numerico (valor de los importes pagados de cada factura captada)
nfactura: varchar (numero de facturas pagadas) - tabla facturas se guardan las facturas realizadas, o sea, están las facturas a pagar por los clientes), con los siguientes campos entre otros:
id: autonumerico llave principal
nfactura varchar (numero de la factura a pagar) y relacionada con la la tabla 2 con el campo nfactura.
Importe: numerico (Importe de la factura)
ImportePag: numerico (importe cobrado debe ser menor o igual a importe)
Lo que quiero es que al captar un documento tabla 1 se capte este y cobre en detalles tabla 2 todas las facturas y me llene todos los campos, luego en la tabla 3 facturas me actualice los campos necesarios en este caso Importepag, así de fácil, pero se me ha hecho difícil:
En los modelos tengo las siguientes reglas y relaciones:
Tabla 1:
public function rules() {
// $cli = Clientes::model()->findAll();
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('CodDocBan, fecha, CodCliente', 'required', 'on' => 'docubancarios', 'message' => 'Tiene que escoger {attribute} su valor!'),
array('CodDocBan', 'unique', 'message' => 'Campo único',),
array('CodDoc, CodMon', 'numerical', 'integerOnly' => true),
array('Importe', 'length', 'max' => 15),
array('CodCliente', 'length', 'max' => 12),
array('CodDocBan', 'length', 'max' => 20),
array('fecha', 'safe'),
// array('CodCliente', 'compare', 'compareAttribute' => '$cli->CodCliente', 'operator' => '=', 'message' => 'El Cliente seleccionado debe estar en clientes'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, fecha, CodCliente, CodDocBan, CodDoc, CodMon, Importe', 'safe', 'on' => 'search'),
);
}
relaciones:
return array(
'detalleDocumento' => array(self::HAS_MANY, 'Detallescheq', 'Id_che'),
'codCliente' => array(self::HAS_MANY, 'Clientes', 'CodCliente'),
);
Tabla 2:
return array(
array('nfactura, valor, Id_che', 'required', 'on' => 'detallescheq', 'message' => 'Tiene que escoger {attribute} su valor!'),
array('nfactura, valor, Id_che', 'required', 'on' => 'detallescheq', 'message' => 'Tiene que escoger {attribute} para proseguir con la operacion!'),
array('Id_che', 'numerical', 'integerOnly' => true),
array('valor', 'numerical'),
array('nfactura', 'length', 'max' => 20),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('Id, Id_che, nfactura, valor', 'safe', 'on' => 'search'),
);
relaciones:
return array(
'idProducto' => array(self::BELONGS_TO, 'Facturas', 'nfactura'),
);
tabla 3:
return array(
array('nfactura, DocBan', 'required', 'on' => 'facturas', 'message' => 'Tiene que escoger {attribute} su valor!'),
array('CodDocBC, CodDocB, estado', 'numerical', 'integerOnly' => true),
array('ImporteMN, ImporteCUC, ImportePagMN, ImportePagCUC', 'numerical'),
array('nfactura, DocBan, DocBanC', 'length', 'max' => 20),
array('CodUEB, CodCliente', 'length', 'max' => 12),
array('ImportePagMN', 'compare', 'compareAttribute' => 'ImporteMN', 'operator' => '<=', 'message' => 'lo pagado en MN debe ser un numero menor o igual al ImporteMN'),
array('ImportePagCUC', 'compare', 'compareAttribute' => 'ImporteCUC', 'operator' => '<=', 'message' => 'lo pagado en CUC debe ser un numero menor o igual al ImporteCUC'),
array('FPago, FPagoC', 'safe'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('Id, nfactura, CodUEB, CodCliente, ImporteMN, ImporteCUC, ImportePagMN, ImportePagCUC, FPago, FPagoC, DocBan, DocBanC, CodDocBC, CodDocB, estado', 'safe', 'on' => 'search'),
);
relaciones
return array(
'codCliente' => array(self::BELONGS_TO, 'Clientes', 'CodCliente'),
);
la accion create del controlador de la tabla 1 es:
public function actionCreate() {
Yii::import('ext.multimodelform.MultiModelForm');
$a = new Docubancarios;
$b = new Detallescheq;
$c = new Facturas;
$this->performAjaxValidation($a, $b);
$validatedDocubancarios = array();
$validatedDetallescheq = array();
$validatedFacturas = array();
$deleteDetallescheq = array();
$DocubancariosValues = array();
$DetallescheqFormConfig = array();
$facturas = array();
if (isset($_POST['Docubancarios'], $_POST['Detallescheq'])) {
$a->attributes = $_POST['Docubancarios']; //
$b->attributes = $_POST['Detallescheq'];
$facturas = Facturas::model()->findAll('CodCliente=:CodCliente AND nfactura=:nfactura', array(':CodCliente' => $a->CodCliente, ':nfactura' => $b->nfactura));
// $c->attributes = $_POST['Facturas'];
if (//validate detail before saving the master
MultiModelForm::validate($b, $validatedDocubancarios, $validatedDetallescheq, $validatedFacturas, $deleteDetallescheq) && $a->save()
) {
//the value for the foreign key 'id de docubancarios'
$DocubancariosValues = array('id' => $a->id);
if (MultiModelForm::save($b, $validatedDetallescheq, $deleteDetallescheq, $DocubancariosValues)) {
// $this->redirect(array('admin', 'id' => $a->id));
foreach ($_POST['Detallescheq'] as $item) {
$b->Id_che = $a->id;
//$tAB = Transfusiones::model()->findAll('rut=:rutA OR rut=:rutB',array(':rutA'=>A->rut,':rutB'=>B->rut));
switch ($a->CodMon) {
case 1:
$facturas->FPago = $a->fecha; //vacio
$facturas->CodDocB = $a->CodDoc;
$facturas->DocBan = $a->CodDocBan;
$facturas->ImportePagMN = $b->valor + $facturas->ImportePagMN;
break;
case 2:
$facturas->FPagoC = $a->fecha;
$facturas->CodDocBC = $a->CodDoc;
$facturas->DocBanC = $a->CodDocBan;
$facturas->ImportePagCUC = $b > valor + $c->ImportePagCUC;
break;
}
}
}
$this->redirect(array('admin', 'id' => $a->id));
}
}
$this->render('create', array('a' => $a, 'b' => $b, 'c' => $c));
}
el form de la tabla es: para el multimodelform:
<?php
$cli = Clientes::model()->find('CodCliente=:CodCliente', array(':CodCliente' => $a->CodCliente));
$DetallescheqFormConfig = array(
'elements' => array(
'nfactura' => array(
'type' => 'zii.widgets.jui.CJuiAutoComplete',
'source' => $this->createUrl('docubancarios/autocomplete'),
'options' => array(
'showAnim' => 'fold',
'common_id_string' => 'nfactura',
'size' => '120',
'minLength' => '2', // Minimo de caracteres que hay que digitar antes de relizar la busqueda
'select' => "js:function(event, ui) {
var nomobj_texto = this.id; //El identificador del campo en mi caso #Detallescheq_nfactura
var indexid = nomobj_texto.substring(25,nomobj_texto.length);
$('#Detallescheq_nfactura'+indexid).val(ui.item.nfactura);
$('#Detallescheq_ImporteMN'+indexid).val(ui.item.ImporteMN);
$('#Detallescheq_ImporteCUC'+indexid).val(ui.item.ImporteCUC);
$('#Detallescheq_CodCliente'+indexid).val(ui.item.CodCliente);
}",
),
'htmlOptions' => array(
'size' => 30,
'onFocus' => "init(this.id)",
'placeholder' => 'Buscar ...',
'title' => 'Indique el producto.'
),
),
'nfactura' => array(
'type' => 'dropdownlist',
'prompt' => 'Seleccione las del cliente a pagar',
//'items'=>CHtml::listData(Producto::model()->findAll(array('order'=>'descripcion ASC', 'condition'=>'activo=1')), 'idProducto', 'ProductoPrecio'),
'items' => CHtml::listData(Facturas::model()->findAll(array('select' => 'facturas.Id, facturas.nfactura, facturas.CodCliente, facturas.ImporteMN, facturas.ImporteCUC, facturas.ImportePagMN, facturas.ImportePagCUC',
'alias' => 'facturas',
'order' => 'facturas.Id DESC',
'condition' => '(facturas.ImporteMN > facturas.ImportePagMN or facturas.ImporteCUC > facturas.ImportePagCUC)',
// 'params' => array('CodCliente' => $cli->CodCliente)
)), 'nfactura', 'nfactura'),
),
'valor' => array(
'type' => 'text',
'maxlength' => 25,
),
));
$this->widget('ext.multimodelform.MultiModelForm', array(
'tableView' => true,
'id' => 'id_member', //the unique widget id
'formConfig' => $DetallescheqFormConfig, //the form configuration array
'model' => $b, //instance of the form model
'data' => $b->findAll('Id_che=:Id_che', array(':Id_che' => $a->id)),
'clearInputs' => true,
'addItemText' => 'Agregar factuas',
'removeText' => 'Eliminar',
'removeConfirm' => '¿Eliminar la factura seleccionada?',
));
?>
Al captar los datos del cocumento me llena los campos de la tabla 1 correctamente, los campos de la tabla 2 los llena todos menos el campo Id_che (relacionado con el id de la tabla 1)
no actualiza la tabla 3 y me da un error que dice:
Array to string conversion en la linea:
$facturas = Facturas::model()->findAll('CodCliente=:CodCliente AND nfactura=:nfactura', array(':CodCliente' => $a->CodCliente, ':nfactura' => $b->nfactura));
el otro problema es que no valida ninguna tabla
Necesito de sus colaboraciones en lo que tengp mal