/**
  * 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;
 }