/**
  * Devuelve las líneas de la factura.
  * @return line_factura_proveedor
  */
 public function get_lineas()
 {
     $linea = new linea_factura_proveedor();
     return $linea->all_from_factura($this->idfactura);
 }
 /**
  * Genera el asiento contable para una factura de CRÉDITO de compra.
  * Devuelve TRUE si el asiento se ha generado correctamente, False en caso contrario.
  * Si genera el asiento, este es accesible desde $this->asiento.
  * @param type $factura
  */
 public function generar_asiento_compra_credito(&$factura)
 {
     $ok = FALSE;
     $this->asiento = FALSE;
     $proveedor0 = new proveedor();
     $subcuenta_prov = FALSE;
     $proveedor = $proveedor0->get($factura->codproveedor);
     if ($proveedor) {
         /// Obtengo subcuenta proveedor
         $subcuenta_prov = $proveedor->get_subcuenta($factura->codejercicio);
     }
     if (!$subcuenta_prov) {
         $eje0 = $this->ejercicio->get($factura->codejercicio);
         $this->new_message("No se ha podido generar una subcuenta para el proveedor\n            <a href='" . $eje0->url() . "'>¿Has importado los datos del ejercicio?</a>");
         if (!$this->soloasiento) {
             $this->new_message("Aun así la <a href='" . $factura->url() . "'>factura</a> se ha generado correctamente,\n            pero sin asiento contable.");
         }
     } else {
         $asiento = new asiento();
         $asiento->codejercicio = $factura->codejercicio;
         $asiento->concepto = "Factura de compra " . $factura->codigo . " - " . $factura->nombre;
         $asiento->documento = $factura->codigo;
         $asiento->editable = TRUE;
         $asiento->fecha = $factura->fecha;
         $asiento->importe = $factura->total;
         $asiento->tipodocumento = "Ingreso proveedor";
         if ($asiento->save()) {
             $asiento_correcto = TRUE;
             $subcuenta = new subcuenta();
             /////// Acá se genera la partida con cada subcuenta
             $subcuenta_compras = $subcuenta->get_cuentaesp('COMPRA', $asiento->codejercicio);
             ////////////////////////////////////////////////////////////////////////////////////////
             if ($subcuenta_compras and $asiento_correcto) {
                 $partida2 = new partida();
                 $partida2->idasiento = $asiento->idasiento;
                 $partida2->concepto = $asiento->concepto;
                 $partida2->idsubcuenta = $subcuenta_prov->idsubcuenta;
                 $partida2->codsubcuenta = $subcuenta_prov->codsubcuenta;
                 ///////// Proveedor compra debe  ////////////////////////
                 $partida2->debe = $factura->neto;
                 $partida2->coddivisa = $factura->coddivisa;
                 $partida2->tasaconv = $factura->tasaconv;
                 $partida2->codserie = $factura->codserie;
                 if (!$partida2->save()) {
                     $asiento_correcto = FALSE;
                     $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida2->codsubcuenta . "!");
                 }
             }
             /////////////////////////////////////////////////////////////////////////////////////////
             /// generamos una partida por cada impuesto
             $subcuenta_iva = $subcuenta->get_cuentaesp('IVASOP', $asiento->codejercicio);
             foreach ($factura->get_lineas_iva() as $li) {
                 if ($subcuenta_iva and $asiento_correcto) {
                     $partida1 = new partida();
                     $partida1->idasiento = $asiento->idasiento;
                     $partida1->concepto = $asiento->concepto;
                     $partida1->idsubcuenta = $subcuenta_iva->idsubcuenta;
                     $partida1->codsubcuenta = $subcuenta_iva->codsubcuenta;
                     $partida1->debe = $li->totaliva;
                     $partida1->idcontrapartida = $subcuenta_prov->idsubcuenta;
                     $partida1->codcontrapartida = $subcuenta_prov->codsubcuenta;
                     $partida1->cifnif = $proveedor->cifnif;
                     $partida1->documento = $asiento->documento;
                     $partida1->tipodocumento = $asiento->tipodocumento;
                     $partida1->codserie = $factura->codserie;
                     $partida1->factura = $factura->numero;
                     $partida1->baseimponible = $li->neto;
                     $partida1->iva = $li->iva;
                     $partida1->coddivisa = $factura->coddivisa;
                     $partida1->tasaconv = $factura->tasaconv;
                     if (!$partida1->save()) {
                         $asiento_correcto = FALSE;
                         $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida1->codsubcuenta . "!");
                     }
                     if ($li->recargo != 0) {
                         $partida11 = new partida();
                         $partida11->idasiento = $asiento->idasiento;
                         $partida11->concepto = $asiento->concepto;
                         $partida11->idsubcuenta = $subcuenta_iva->idsubcuenta;
                         $partida11->codsubcuenta = $subcuenta_iva->codsubcuenta;
                         $partida11->debe = $li->totalrecargo;
                         $partida11->idcontrapartida = $subcuenta_prov->idsubcuenta;
                         $partida11->codcontrapartida = $subcuenta_prov->codsubcuenta;
                         $partida11->cifnif = $proveedor->cifnif;
                         $partida11->documento = $asiento->documento;
                         $partida11->tipodocumento = $asiento->tipodocumento;
                         $partida11->codserie = $factura->codserie;
                         $partida11->factura = $factura->numero;
                         $partida11->baseimponible = $li->neto;
                         $partida11->recargo = $li->recargo;
                         $partida11->coddivisa = $factura->coddivisa;
                         $partida11->tasaconv = $factura->tasaconv;
                         if (!$partida11->save()) {
                             $asiento_correcto = FALSE;
                             $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida11->codsubcuenta . "!");
                         }
                     }
                 }
             }
             /////////////////////////////////////////////////////////////////////////////////////
             //////////////////////////////////////////////////////////
             ///  Separa las subcuentas de las facturas y crea los asientos
             //////////////////////////////////////////////////////////
             $partida0 = new partida();
             $lineas_f = new linea_factura_proveedor();
             $lineas_fact = $lineas_f->all_from_factura($factura->idfactura);
             for ($i = 0; $i < count($lineas_fact); $i++) {
                 $total_sub = 0;
                 $finaliza = 0;
                 $subcuenta1 = $lineas_fact[$i]->codsubcuenta;
                 $idsubcuen = $lineas_fact[$i]->idsubcuenta;
                 for ($j = 0; $j < $i; $j++) {
                     if ($subcuenta1 == $lineas_fact[$j]->codsubcuenta) {
                         $finaliza = 1;
                     }
                 }
                 if ($finaliza == 0) {
                     for ($k = 0; $k < count($lineas_fact); $k++) {
                         if ($subcuenta1 == $lineas_fact[$k]->codsubcuenta) {
                             $total_sub = $total_sub + $lineas_fact[$k]->pvptotal;
                         }
                     }
                     $partida0->idasiento = $asiento->idasiento;
                     $partida0->concepto = $asiento->concepto;
                     $partida0->idsubcuenta = $idsubcuen;
                     $partida0->codsubcuenta = $subcuenta1;
                     ///////////  Proveedor  haber			/////////
                     $partida0->haber = $total_sub;
                     $partida0->coddivisa = $factura->coddivisa;
                     $partida0->tasaconv = $factura->tasaconv;
                     $partida0->codserie = $factura->codserie;
                     if (!$partida0->save()) {
                         $asiento_correcto = FALSE;
                         $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida0->codsubcuenta . "!");
                     }
                 }
             }
             /////////////////////////////////////////////////////////
             ////////////////////////////////////////////////////////
             /////////////////////////////////////////////////////////
             ////////////////////////////////////////////////////////////////////////////////////////////
             /// ¿IRPF?
             if ($factura->totalirpf != 0 and $asiento_correcto) {
                 $subcuenta_irpf = $subcuenta->get_cuentaesp('IRPFPR', $asiento->codejercicio);
                 if ($subcuenta_irpf) {
                     $partida3 = new partida();
                     $partida3->idasiento = $asiento->idasiento;
                     $partida3->concepto = $asiento->concepto;
                     $partida3->idsubcuenta = $subcuenta_irpf->idsubcuenta;
                     $partida3->codsubcuenta = $subcuenta_irpf->codsubcuenta;
                     $partida3->haber = $factura->totalirpf;
                     $partida3->coddivisa = $factura->coddivisa;
                     $partida3->tasaconv = $factura->tasaconv;
                     $partida3->codserie = $factura->codserie;
                     if (!$partida3->save()) {
                         $asiento_correcto = FALSE;
                         $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida3->codsubcuenta . "!");
                     }
                 }
             }
             if ($asiento_correcto) {
                 $factura->idasiento = $asiento->idasiento;
                 if ($factura->save()) {
                     $ok = TRUE;
                     $this->asiento = $asiento;
                 } else {
                     $this->new_error_msg("¡Imposible añadir el asiento a la factura!");
                 }
             } else {
                 if ($asiento->delete()) {
                     $this->new_message("El asiento se ha borrado.");
                 } else {
                     $this->new_error_msg("¡Imposible borrar el asiento!");
                 }
             }
         }
     }
     return $ok;
 }