/** * Generamos un asiento de pago del asiento seleccionado. * @param asiento $asiento */ public function generar_asiento_pago(&$asiento, $codpago = FALSE, $fecha = FALSE, $subclipro = FALSE) { $nasientop = new asiento(); $nasientop->editable = FALSE; $nasientop->importe = $asiento->importe; $nasientop->tipodocumento = $asiento->tipodocumento; $nasientop->documento = $asiento->documento; if ($asiento->tipodocumento == 'Factura de cliente') { $nasientop->concepto = 'Cobro ' . $asiento->concepto; } else { $nasientop->concepto = 'Pago ' . $asiento->concepto; } if ($fecha) { $nasientop->fecha = $fecha; } /// asignamos la mejor fecha $eje = $this->ejercicio->get_by_fecha($nasientop->fecha); if ($eje) { $nasientop->codejercicio = $eje->codejercicio; $nasientop->fecha = $eje->get_best_fecha($nasientop->fecha); } /// necesitamos la subcuenta de caja $subcaja = $this->subcuenta->get_cuentaesp('CAJA', $nasientop->codejercicio); if ($codpago) { /** * Si nos han pasado una forma de pago, intentamos buscar la subcuenta * asociada a la cuenta bancaria. */ $formap = $this->forma_pago->get($codpago); if ($formap) { if ($formap->codcuenta) { $cuentab = $this->cuenta_banco->get($formap->codcuenta); if ($cuentab) { $subc = $this->subcuenta->get_by_codigo($cuentab->codsubcuenta, $nasientop->codejercicio); if ($subc) { $subcaja = $subc; } } } } } if (!$eje) { $this->new_error_msg('Ningún ejercico encontrado.'); } else { if (!$eje->abierto()) { $this->new_error_msg('El ejercicio ' . $eje->codejercicio . ' está cerrado.'); } else { if (!$subcaja) { $this->new_error_msg('No se ha encontrado ninguna subcuenta de caja para el ejercicio ' . $eje->codejercicio . '. <a href="' . $eje->url() . '">¿Has importado los datos del ejercicio?</a>'); } else { if ($nasientop->save()) { /// buscamos la partida que coincida con el importe $encontrada = FALSE; foreach ($asiento->get_partidas() as $par) { if ($nasientop->floatcmp(abs($par->debe), $nasientop->importe, FS_NF0)) { if (!$subclipro) { $subclipro = $this->subcuenta->get_by_codigo($par->codsubcuenta, $nasientop->codejercicio); } if ($subclipro) { $partida1 = new partida(); $partida1->idasiento = $nasientop->idasiento; $partida1->concepto = $nasientop->concepto; $partida1->idsubcuenta = $subclipro->idsubcuenta; $partida1->codsubcuenta = $subclipro->codsubcuenta; $partida1->haber = $par->debe; $partida1->coddivisa = $par->coddivisa; $partida1->tasaconv = $par->tasaconv; $partida1->codserie = $par->codserie; $partida1->save(); $partida2 = new partida(); $partida2->idasiento = $nasientop->idasiento; $partida2->concepto = $nasientop->concepto; $partida2->idsubcuenta = $subcaja->idsubcuenta; $partida2->codsubcuenta = $subcaja->codsubcuenta; $partida2->debe = $par->debe; $partida2->coddivisa = $par->coddivisa; $partida2->tasaconv = $par->tasaconv; $partida2->codserie = $par->codserie; $partida2->save(); $encontrada = TRUE; } else { $this->new_error_msg('No se ha encontrado la subcuenta ' . $par->codsubcuenta . ' en el ejercicio ' . $nasientop->codejercicio); $nasientop->delete(); } break; } else { if ($nasientop->floatcmp(abs($par->haber), $nasientop->importe, FS_NF0)) { if (!$subclipro) { $subclipro = $this->subcuenta->get_by_codigo($par->codsubcuenta, $nasientop->codejercicio); } if ($subclipro) { $partida1 = new partida(); $partida1->idasiento = $nasientop->idasiento; $partida1->concepto = $nasientop->concepto; $partida1->idsubcuenta = $subclipro->idsubcuenta; $partida1->codsubcuenta = $subclipro->codsubcuenta; $partida1->debe = $par->haber; $partida1->coddivisa = $par->coddivisa; $partida1->tasaconv = $par->tasaconv; $partida1->codserie = $par->codserie; $partida1->save(); $partida2 = new partida(); $partida2->idasiento = $nasientop->idasiento; $partida2->concepto = $nasientop->concepto; $partida2->idsubcuenta = $subcaja->idsubcuenta; $partida2->codsubcuenta = $subcaja->codsubcuenta; $partida2->haber = $par->haber; $partida2->coddivisa = $par->coddivisa; $partida2->tasaconv = $par->tasaconv; $partida2->codserie = $par->codserie; $partida2->save(); $encontrada = TRUE; } else { $this->new_error_msg('No se ha encontrado la subcuenta ' . $par->codsubcuenta . ' en el ejercicio ' . $nasientop->codejercicio); $nasientop->delete(); } break; } } } if (!$encontrada) { $this->new_error_msg('No se ha encontrado la partida necesaria para generar el asiento ' . $nasientop->concepto); $nasientop->delete(); $nasientop->idasiento = NULL; } } else { $this->new_error_msg('Error al guardar el asiento de pago.'); } } } } return $nasientop->idasiento; }