public function __construct($l = FALSE)
 {
     parent::__construct('lineasfacturasprov');
     if (!isset(self::$facturas)) {
         self::$facturas = array();
     }
     if (!isset(self::$albaranes)) {
         self::$albaranes = array();
     }
     if ($l) {
         $this->idlinea = $this->intval($l['idlinea']);
         $this->idfactura = $this->intval($l['idfactura']);
         $this->idalbaran = $this->intval($l['idalbaran']);
         $this->referencia = $l['referencia'];
         $this->descripcion = $l['descripcion'];
         $this->cantidad = floatval($l['cantidad']);
         $this->pvpunitario = floatval($l['pvpunitario']);
         $this->pvpsindto = floatval($l['pvpsindto']);
         $this->dtopor = floatval($l['dtopor']);
         $this->dtolineal = floatval($l['dtolineal']);
         $this->pvptotal = floatval($l['pvptotal']);
         $this->codimpuesto = $l['codimpuesto'];
         $this->iva = floatval($l['iva']);
         $this->recargo = floatval($l['recargo']);
         $this->irpf = floatval($l['irpf']);
     } else {
         $this->idlinea = NULL;
         $this->idfactura = NULL;
         $this->idalbaran = NULL;
         $this->referencia = '';
         $this->descripcion = '';
         $this->cantidad = 0;
         $this->pvpunitario = 0;
         $this->pvpsindto = 0;
         $this->dtopor = 0;
         $this->dtolineal = 0;
         $this->pvptotal = 0;
         $this->codimpuesto = NULL;
         $this->iva = 0;
         $this->recargo = 0;
         $this->irpf = 0;
     }
 }
 public function full_test($duplicados = TRUE)
 {
     $status = TRUE;
     /// comprobamos las líneas
     $neto = 0;
     $iva = 0;
     $irpf = 0;
     $recargo = 0;
     foreach ($this->get_lineas() as $l) {
         if (!$l->test()) {
             $status = FALSE;
         }
         $neto += $l->pvptotal;
         $iva += $l->pvptotal * $l->iva / 100;
         $irpf += $l->pvptotal * $l->irpf / 100;
         $recargo += $l->pvptotal * $l->recargo / 100;
     }
     $neto = round($neto, FS_NF0);
     $iva = round($iva, FS_NF0);
     $irpf = round($irpf, FS_NF0);
     $recargo = round($recargo, FS_NF0);
     $total = $neto + $iva - $irpf + $recargo;
     if (!$this->floatcmp($this->neto, $neto, FS_NF0, TRUE)) {
         $this->new_error_msg("Valor neto de " . FS_ALBARAN . " incorrecto. Valor correcto: " . $neto);
         $status = FALSE;
     } else {
         if (!$this->floatcmp($this->totaliva, $iva, FS_NF0, TRUE)) {
             $this->new_error_msg("Valor totaliva de " . FS_ALBARAN . " incorrecto. Valor correcto: " . $iva);
             $status = FALSE;
         } else {
             if (!$this->floatcmp($this->totalirpf, $irpf, FS_NF0, TRUE)) {
                 $this->new_error_msg("Valor totalirpf de " . FS_ALBARAN . " incorrecto. Valor correcto: " . $irpf);
                 $status = FALSE;
             } else {
                 if (!$this->floatcmp($this->totalrecargo, $recargo, FS_NF0, TRUE)) {
                     $this->new_error_msg("Valor totalrecargo de " . FS_ALBARAN . " incorrecto. Valor correcto: " . $recargo);
                     $status = FALSE;
                 } else {
                     if (!$this->floatcmp($this->total, $total, FS_NF0, TRUE)) {
                         $this->new_error_msg("Valor total de " . FS_ALBARAN . " incorrecto. Valor correcto: " . $total);
                         $status = FALSE;
                     } else {
                         if (!$this->floatcmp($this->totaleuros, $this->total * $this->tasaconv, FS_NF0, TRUE)) {
                             $this->new_error_msg("Valor totaleuros de " . FS_ALBARAN . " incorrecto.\n            Valor correcto: " . round($this->total * $this->tasaconv, FS_NF0));
                             $status = FALSE;
                         }
                     }
                 }
             }
         }
     }
     /// comprobamos las facturas asociadas
     $linea_factura = new linea_factura_proveedor();
     $facturas = $linea_factura->facturas_from_albaran($this->idalbaran);
     if ($facturas) {
         if (count($facturas) > 1) {
             $msg = "Este " . FS_ALBARAN . " esta asociado a las siguientes facturas (y no debería):";
             foreach ($facturas as $f) {
                 $msg .= " <a href='" . $f->url() . "'>" . $f->codigo . "</a>";
             }
             $this->new_error_msg($msg);
             $status = FALSE;
         } else {
             if ($facturas[0]->idfactura != $this->idfactura) {
                 $this->new_error_msg("Este " . FS_ALBARAN . " esta asociado a una <a href='" . $this->factura_url() . "'>factura</a> incorrecta. La correcta es <a href='" . $facturas[0]->url() . "'>esta</a>.");
                 $status = FALSE;
             }
         }
     } else {
         if (isset($this->idfactura)) {
             $this->new_error_msg("Este " . FS_ALBARAN . " esta asociado a una <a href='" . $this->factura_url() . "'>factura</a> incorrecta.");
             $status = FALSE;
         }
     }
     if ($status and $duplicados) {
         /// comprobamos si es un duplicado
         $albaranes = $this->db->select("SELECT * FROM " . $this->table_name . " WHERE fecha = " . $this->var2str($this->fecha) . "\n            AND codproveedor = " . $this->var2str($this->codproveedor) . " AND total = " . $this->var2str($this->total) . "\n            AND codagente = " . $this->var2str($this->codagente) . " AND numproveedor = " . $this->var2str($this->numproveedor) . "\n            AND observaciones = " . $this->var2str($this->observaciones) . " AND idalbaran != " . $this->var2str($this->idalbaran) . ";");
         if ($albaranes) {
             foreach ($albaranes as $alb) {
                 /// comprobamos las líneas
                 $aux = $this->db->select("SELECT referencia FROM lineasalbaranesprov WHERE\n                  idalbaran = " . $this->var2str($this->idalbaran) . "\n                  AND referencia NOT IN (SELECT referencia FROM lineasalbaranesprov\n                  WHERE idalbaran = " . $this->var2str($alb['idalbaran']) . ");");
                 if (!$aux) {
                     $this->new_error_msg("Este " . FS_ALBARAN . " es un posible duplicado de\n                     <a href='index.php?page=compras_albaran&id=" . $alb['idalbaran'] . "'>este otro</a>.\n                     Si no lo es, para evitar este mensaje, simplemente modifica las observaciones.");
                     $status = FALSE;
                 }
             }
         }
     }
     return $status;
 }
 public function buscar_lineas()
 {
     /// cambiamos la plantilla HTML
     $this->template = 'ajax/compras_lineas_facturas';
     $this->buscar_lineas = $_POST['buscar_lineas'];
     $linea = new linea_factura_proveedor();
     $this->lineas = $linea->search($this->buscar_lineas);
 }
 private function generar_factura($albaranes)
 {
     $continuar = TRUE;
     $factura = new factura_proveedor();
     $factura->codagente = $this->user->codagente;
     $factura->codalmacen = $albaranes[0]->codalmacen;
     $factura->coddivisa = $albaranes[0]->coddivisa;
     $factura->tasaconv = $albaranes[0]->tasaconv;
     $factura->codejercicio = $albaranes[0]->codejercicio;
     $factura->codpago = $albaranes[0]->codpago;
     $factura->codserie = $albaranes[0]->codserie;
     $factura->irpf = $albaranes[0]->irpf;
     $factura->numproveedor = $albaranes[0]->numproveedor;
     $factura->observaciones = $albaranes[0]->observaciones;
     /// comprobamos la forma de pago para saber si hay que marcar la factura como pagada
     $formapago = $this->forma_pago->get($factura->codpago);
     if ($formapago) {
         if ($formapago->genrecibos == 'Pagados') {
             $factura->pagada = TRUE;
         }
     }
     /// obtenemos los datos actualizados del proveedor
     $proveedor = $this->proveedor->get($albaranes[0]->codproveedor);
     if ($proveedor) {
         $factura->cifnif = $proveedor->cifnif;
         $factura->codproveedor = $proveedor->codproveedor;
         $factura->nombre = $proveedor->razonsocial;
     }
     /// calculamos neto e iva
     foreach ($albaranes as $alb) {
         foreach ($alb->get_lineas() as $l) {
             $factura->neto += $l->pvptotal;
             $factura->totaliva += $l->pvptotal * $l->iva / 100;
             $factura->totalirpf += $l->pvptotal * $l->irpf / 100;
             $factura->totalrecargo += $l->pvptotal * $l->recargo / 100;
         }
     }
     /// redondeamos
     $factura->neto = round($factura->neto, FS_NF0);
     $factura->totaliva = round($factura->totaliva, FS_NF0);
     $factura->totalirpf = round($factura->totalirpf, FS_NF0);
     $factura->totalrecargo = round($factura->totalrecargo, FS_NF0);
     $factura->total = $factura->neto + $factura->totaliva - $factura->totalirpf + $factura->totalrecargo;
     /// asignamos la mejor fecha posible, pero dentro del ejercicio
     $ejercicio = new ejercicio();
     $eje0 = $ejercicio->get($factura->codejercicio);
     $factura->fecha = $eje0->get_best_fecha($factura->fecha);
     $regularizacion = new regularizacion_iva();
     if (!$eje0->abierto()) {
         $this->new_error_msg('El ejercicio ' . $eje0->codejercicio . ' está cerrado.');
     } else {
         if ($regularizacion->get_fecha_inside($factura->fecha)) {
             /*
              * comprobamos que la fecha de la factura no esté dentro de un periodo de
              * IVA regularizado.
              */
             $this->new_error_msg('El IVA de ese periodo ya ha sido regularizado. No se pueden añadir más facturas en esa fecha.');
         } else {
             if ($factura->save()) {
                 foreach ($albaranes as $alb) {
                     foreach ($alb->get_lineas() as $l) {
                         $n = new linea_factura_proveedor();
                         $n->idalbaran = $alb->idalbaran;
                         $n->idfactura = $factura->idfactura;
                         $n->cantidad = $l->cantidad;
                         $n->codimpuesto = $l->codimpuesto;
                         $n->descripcion = $l->descripcion;
                         $n->dtopor = $l->dtopor;
                         $n->irpf = $l->irpf;
                         $n->iva = $l->iva;
                         $n->pvpsindto = $l->pvpsindto;
                         $n->pvptotal = $l->pvptotal;
                         $n->pvpunitario = $l->pvpunitario;
                         $n->recargo = $l->recargo;
                         $n->referencia = $l->referencia;
                         if (!$n->save()) {
                             $continuar = FALSE;
                             $this->new_error_msg("¡Imposible guardar la línea el artículo " . $n->referencia . "! ");
                             break;
                         }
                     }
                 }
                 if ($continuar) {
                     foreach ($albaranes as $alb) {
                         $alb->idfactura = $factura->idfactura;
                         $alb->ptefactura = FALSE;
                         if (!$alb->save()) {
                             $this->new_error_msg("¡Imposible vincular el " . FS_ALBARAN . " con la nueva factura!");
                             $continuar = FALSE;
                             break;
                         }
                     }
                     if ($continuar) {
                         $this->generar_asiento($factura);
                     } else {
                         if ($factura->delete()) {
                             $this->new_error_msg("La factura se ha borrado.");
                         } else {
                             $this->new_error_msg("¡Imposible borrar la factura!");
                         }
                     }
                 } else {
                     if ($factura->delete()) {
                         $this->new_error_msg("La factura se ha borrado.");
                     } else {
                         $this->new_error_msg("¡Imposible borrar la factura!");
                     }
                 }
             } else {
                 $this->new_error_msg("¡Imposible guardar la factura!");
             }
         }
     }
 }
 private function generar_factura()
 {
     $factura = new factura_proveedor();
     $factura->cifnif = $this->albaran->cifnif;
     $factura->codalmacen = $this->albaran->codalmacen;
     $factura->coddivisa = $this->albaran->coddivisa;
     $factura->tasaconv = $this->albaran->tasaconv;
     $factura->codpago = $this->albaran->codpago;
     $factura->codproveedor = $this->albaran->codproveedor;
     $factura->codserie = $this->albaran->codserie;
     $factura->irpf = $this->albaran->irpf;
     $factura->neto = $this->albaran->neto;
     $factura->nombre = $this->albaran->nombre;
     $factura->numproveedor = $this->albaran->numproveedor;
     $factura->observaciones = $this->albaran->observaciones;
     $factura->total = $this->albaran->total;
     $factura->totalirpf = $this->albaran->totalirpf;
     $factura->totaliva = $this->albaran->totaliva;
     $factura->totalrecargo = $this->albaran->totalrecargo;
     $factura->codagente = $this->albaran->codagente;
     /// asignamos el ejercicio que corresponde a la fecha elegida
     $eje0 = $this->ejercicio->get_by_fecha($_POST['facturar']);
     if ($eje0) {
         $factura->codejercicio = $eje0->codejercicio;
         $factura->set_fecha_hora($_POST['facturar'], $factura->hora);
     }
     /// comprobamos la forma de pago para saber si hay que marcar la factura como pagada
     $forma0 = new forma_pago();
     $formapago = $forma0->get($factura->codpago);
     if ($formapago) {
         if ($formapago->genrecibos == 'Pagados') {
             $factura->pagada = TRUE;
         }
     }
     $regularizacion = new regularizacion_iva();
     if (!$eje0) {
         $this->new_error_msg("Ejercicio no encontrado o está cerrado.");
     } else {
         if (!$eje0->abierto()) {
             $this->new_error_msg("El ejercicio está cerrado.");
         } else {
             if ($regularizacion->get_fecha_inside($factura->fecha)) {
                 $this->new_error_msg("El " . FS_IVA . " de ese periodo ya ha sido regularizado. No se pueden añadir más facturas en esa fecha.");
             } else {
                 if ($factura->save()) {
                     $continuar = TRUE;
                     foreach ($this->albaran->get_lineas() as $l) {
                         $linea = new linea_factura_proveedor();
                         $linea->cantidad = $l->cantidad;
                         $linea->codimpuesto = $l->codimpuesto;
                         $linea->descripcion = $l->descripcion;
                         $linea->dtopor = $l->dtopor;
                         $linea->idalbaran = $l->idalbaran;
                         $linea->idfactura = $factura->idfactura;
                         $linea->irpf = $l->irpf;
                         $linea->iva = $l->iva;
                         $linea->pvpsindto = $l->pvpsindto;
                         $linea->pvptotal = $l->pvptotal;
                         $linea->pvpunitario = $l->pvpunitario;
                         $linea->recargo = $l->recargo;
                         $linea->referencia = $l->referencia;
                         if (!$linea->save()) {
                             $continuar = FALSE;
                             $this->new_error_msg("¡Imposible guardar la línea el artículo " . $linea->referencia . "! ");
                             break;
                         }
                     }
                     if ($continuar) {
                         $this->albaran->idfactura = $factura->idfactura;
                         $this->albaran->ptefactura = FALSE;
                         if ($this->albaran->save()) {
                             $this->generar_asiento($factura);
                         } else {
                             $this->new_error_msg("¡Imposible vincular el " . FS_ALBARAN . " con la nueva factura!");
                             if ($factura->delete()) {
                                 $this->new_error_msg("La factura se ha borrado.");
                             } else {
                                 $this->new_error_msg("¡Imposible borrar la factura!");
                             }
                         }
                     } else {
                         if ($factura->delete()) {
                             $this->new_error_msg("La factura se ha borrado.");
                         } else {
                             $this->new_error_msg("¡Imposible borrar la factura!");
                         }
                     }
                 } else {
                     $this->new_error_msg("¡Imposible guardar la factura!");
                 }
             }
         }
     }
 }
 /**
  * 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);
 }
Example #7
0
 private function nueva_factura_proveedor()
 {
     $continuar = TRUE;
     $proveedor = $this->proveedor->get($_POST['proveedor']);
     if (!$proveedor) {
         $this->new_error_msg('Proveedor no encontrado.');
         $continuar = FALSE;
     }
     $almacen = $this->almacen->get($_POST['almacen']);
     if ($almacen) {
         $this->save_codalmacen($_POST['almacen']);
     } else {
         $this->new_error_msg('Almacén no encontrado.');
         $continuar = FALSE;
     }
     $eje0 = new ejercicio();
     $ejercicio = $eje0->get_by_fecha($_POST['fecha']);
     if (!$ejercicio) {
         $this->new_error_msg('Ejercicio no encontrado o está cerrado.');
         $continuar = FALSE;
     }
     $serie = $this->serie->get($_POST['serie']);
     if (!$serie) {
         $this->new_error_msg('Serie no encontrada.');
         $continuar = FALSE;
     }
     $forma_pago = $this->forma_pago->get($_POST['forma_pago']);
     if ($forma_pago) {
         $this->save_codpago($_POST['forma_pago']);
     } else {
         $this->new_error_msg('Forma de pago no encontrada.');
         $continuar = FALSE;
     }
     $divisa = $this->divisa->get($_POST['divisa']);
     if (!$divisa) {
         $this->new_error_msg('Divisa no encontrada.');
         $continuar = FALSE;
     }
     $factura = new factura_proveedor();
     if ($this->duplicated_petition($_POST['petition_id'])) {
         $this->new_error_msg('Petición duplicada. Has hecho doble clic sobre el botón guardar
            y se han enviado dos peticiones. Mira en <a href="' . $factura->url() . '">Facturas</a>
            para ver si la factura se ha guardado correctamente.');
         $continuar = FALSE;
     }
     if ($continuar) {
         $factura->codejercicio = $ejercicio->codejercicio;
         $factura->codserie = $serie->codserie;
         $factura->set_fecha_hora($_POST['fecha'], $_POST['hora']);
         $factura->codproveedor = $proveedor->codproveedor;
         $factura->nombre = $_POST['nombre'];
         $factura->cifnif = $_POST['cifnif'];
         $factura->codalmacen = $almacen->codalmacen;
         $factura->codpago = $forma_pago->codpago;
         $factura->coddivisa = $divisa->coddivisa;
         $factura->tasaconv = $divisa->tasaconv_compra;
         if ($_POST['tasaconv'] != '') {
             $factura->tasaconv = floatval($_POST['tasaconv']);
         }
         $factura->codagente = $this->agente->codagente;
         $factura->numproveedor = $_POST['numproveedor'];
         $factura->observaciones = $_POST['observaciones'];
         if ($forma_pago->genrecibos == 'Pagados') {
             $factura->pagada = TRUE;
         }
         $regularizacion = new regularizacion_iva();
         if ($regularizacion->get_fecha_inside($factura->fecha)) {
             $this->new_error_msg("El " . FS_IVA . " de ese periodo ya ha sido regularizado. No se pueden añadir más facturas en esa fecha.");
         } else {
             if ($factura->save()) {
                 $art0 = new articulo();
                 $n = floatval($_POST['numlineas']);
                 for ($i = 0; $i < $n; $i++) {
                     if (isset($_POST['referencia_' . $i])) {
                         $linea = new linea_factura_proveedor();
                         $linea->idfactura = $factura->idfactura;
                         $linea->descripcion = $_POST['desc_' . $i];
                         if (!$serie->siniva and $proveedor->regimeniva != 'Exento') {
                             $imp0 = $this->impuesto->get_by_iva($_POST['iva_' . $i]);
                             if ($imp0) {
                                 $linea->codimpuesto = $imp0->codimpuesto;
                                 $linea->iva = floatval($_POST['iva_' . $i]);
                                 $linea->recargo = floatval($_POST['recargo_' . $i]);
                             } else {
                                 $linea->iva = floatval($_POST['iva_' . $i]);
                                 $linea->recargo = floatval($_POST['recargo_' . $i]);
                             }
                         }
                         $linea->irpf = floatval($_POST['irpf_' . $i]);
                         $linea->pvpunitario = floatval($_POST['pvp_' . $i]);
                         $linea->cantidad = floatval($_POST['cantidad_' . $i]);
                         $linea->dtopor = floatval($_POST['dto_' . $i]);
                         $linea->pvpsindto = $linea->pvpunitario * $linea->cantidad;
                         $linea->pvptotal = floatval($_POST['neto_' . $i]);
                         $articulo = $art0->get($_POST['referencia_' . $i]);
                         if ($articulo) {
                             $linea->referencia = $articulo->referencia;
                         }
                         if ($linea->save()) {
                             if ($articulo) {
                                 if (isset($_POST['costemedio'])) {
                                     if ($articulo->costemedio == 0) {
                                         $articulo->costemedio = $linea->pvptotal / $linea->cantidad;
                                     } else {
                                         $articulo->costemedio = $articulo->get_costemedio();
                                         if ($articulo->costemedio == 0) {
                                             $articulo->costemedio = $linea->pvptotal / $linea->cantidad;
                                         }
                                     }
                                     $this->actualizar_precio_proveedor($factura->codproveedor, $linea);
                                 }
                                 if (isset($_POST['stock'])) {
                                     $articulo->sum_stock($factura->codalmacen, $linea->cantidad);
                                 } else {
                                     if (isset($_POST['costemedio'])) {
                                         $articulo->save();
                                     }
                                 }
                             }
                             $factura->neto += $linea->pvptotal;
                             $factura->totaliva += $linea->pvptotal * $linea->iva / 100;
                             $factura->totalirpf += $linea->pvptotal * $linea->irpf / 100;
                             $factura->totalrecargo += $linea->pvptotal * $linea->recargo / 100;
                             if ($linea->irpf > $factura->irpf) {
                                 $factura->irpf = $linea->irpf;
                             }
                         } else {
                             $this->new_error_msg("¡Imposible guardar la linea con referencia: " . $linea->referencia);
                             $continuar = FALSE;
                         }
                     }
                 }
                 if ($continuar) {
                     /// redondeamos
                     $factura->neto = round($factura->neto, FS_NF0);
                     $factura->totaliva = round($factura->totaliva, FS_NF0);
                     $factura->totalirpf = round($factura->totalirpf, FS_NF0);
                     $factura->totalrecargo = round($factura->totalrecargo, FS_NF0);
                     $factura->total = $factura->neto + $factura->totaliva - $factura->totalirpf + $factura->totalrecargo;
                     if (abs(floatval($_POST['atotal']) - $factura->total) >= 0.02) {
                         $this->new_error_msg("El total difiere entre el controlador y la vista (" . $factura->total . " frente a " . $_POST['atotal'] . "). Debes informar del error.");
                         $factura->delete();
                     } else {
                         if ($factura->save()) {
                             $this->generar_asiento($factura);
                             $this->new_message("<a href='" . $factura->url() . "'>Factura</a> guardada correctamente.");
                             $this->new_change('Factura Proveedor ' . $factura->codigo, $factura->url(), TRUE);
                             if ($_POST['redir'] == 'TRUE') {
                                 header('Location: ' . $factura->url());
                             }
                         } else {
                             $this->new_error_msg("¡Imposible actualizar la <a href='" . $factura->url() . "'>factura</a>!");
                         }
                     }
                 } else {
                     if ($factura->delete()) {
                         $this->new_message("Factura eliminada correctamente.");
                     } else {
                         $this->new_error_msg("¡Imposible eliminar la <a href='" . $factura->url() . "'>factura</a>!");
                     }
                 }
             } else {
                 $this->new_error_msg("¡Imposible guardar la factura!");
             }
         }
     }
 }
 private function generar_factura_proveedor($albaranes)
 {
     $continuar = TRUE;
     $factura = new factura_proveedor();
     $factura->codalmacen = $albaranes[0]->codalmacen;
     $factura->coddivisa = $albaranes[0]->coddivisa;
     $factura->tasaconv = $albaranes[0]->tasaconv;
     $factura->codpago = $albaranes[0]->codpago;
     $factura->codserie = $albaranes[0]->codserie;
     $factura->irpf = $albaranes[0]->irpf;
     $factura->numproveedor = $albaranes[0]->numproveedor;
     $factura->observaciones = $albaranes[0]->observaciones;
     /// asignamos fecha y ejercicio usando la del albarán
     if ($_REQUEST['fecha'] == 'albaran') {
         $eje0 = $this->ejercicio->get($albaranes[0]->codejercicio);
         if ($eje0) {
             if ($eje0->abierto()) {
                 $factura->codejercicio = $albaranes[0]->codejercicio;
                 $factura->set_fecha_hora($albaranes[0]->fecha, $albaranes[0]->hora);
             }
         }
     }
     /**
      * Si se ha elegido fecha de hoy o no se ha podido usar la del albarán porque
      * el ejercicio estaba cerrado, asignamos ejercicio para hoy y usamos la mejor
      * fecha y hora.
      */
     if (is_null($factura->codejercicio)) {
         $eje0 = $this->ejercicio->get_by_fecha($factura->fecha);
         if ($eje0) {
             $factura->codejercicio = $eje0->codejercicio;
             $factura->set_fecha_hora($factura->fecha, $factura->hora);
         }
     }
     /// obtenemos los datos actualizados del proveedor
     $proveedor = $this->proveedor->get($albaranes[0]->codproveedor);
     if ($proveedor) {
         $factura->cifnif = $proveedor->cifnif;
         $factura->codproveedor = $proveedor->codproveedor;
         $factura->nombre = $proveedor->razonsocial;
     }
     /// calculamos neto e iva
     foreach ($albaranes as $alb) {
         foreach ($alb->get_lineas() as $l) {
             $factura->neto += $l->pvptotal;
             $factura->totaliva += $l->pvptotal * $l->iva / 100;
             $factura->totalirpf += $l->pvptotal * $l->irpf / 100;
             $factura->totalrecargo += $l->pvptotal * $l->recargo / 100;
         }
     }
     /// redondeamos
     $factura->neto = round($factura->neto, FS_NF0);
     $factura->totaliva = round($factura->totaliva, FS_NF0);
     $factura->totalirpf = round($factura->totalirpf, FS_NF0);
     $factura->totalrecargo = round($factura->totalrecargo, FS_NF0);
     $factura->total = $factura->neto + $factura->totaliva - $factura->totalirpf + $factura->totalrecargo;
     if (!$eje0) {
         $this->new_error_msg("Ningún ejercicio encontrado.");
     } else {
         if (!$eje0->abierto()) {
             $this->new_error_msg('El ejercicio ' . $eje0->codejercicio . ' está cerrado.');
         } else {
             if ($this->regularizacion->get_fecha_inside($factura->fecha)) {
                 /*
                  * comprobamos que la fecha de la factura no esté dentro de un periodo de
                  * IVA regularizado.
                  */
                 $this->new_error_msg('El IVA de ese periodo ya ha sido regularizado. No se pueden añadir más facturas en esa fecha.');
             } else {
                 if ($factura->save()) {
                     foreach ($albaranes as $alb) {
                         foreach ($alb->get_lineas() as $l) {
                             $n = new linea_factura_proveedor();
                             $n->idalbaran = $alb->idalbaran;
                             $n->idfactura = $factura->idfactura;
                             $n->cantidad = $l->cantidad;
                             $n->codimpuesto = $l->codimpuesto;
                             $n->descripcion = $l->descripcion;
                             $n->dtopor = $l->dtopor;
                             $n->irpf = $l->irpf;
                             $n->iva = $l->iva;
                             $n->pvpsindto = $l->pvpsindto;
                             $n->pvptotal = $l->pvptotal;
                             $n->pvpunitario = $l->pvpunitario;
                             $n->recargo = $l->recargo;
                             $n->referencia = $l->referencia;
                             if (!$n->save()) {
                                 $continuar = FALSE;
                                 $this->new_error_msg("¡Imposible guardar la línea el artículo " . $n->referencia . "! ");
                                 break;
                             }
                         }
                     }
                     if ($continuar) {
                         foreach ($albaranes as $alb) {
                             $alb->idfactura = $factura->idfactura;
                             $alb->ptefactura = FALSE;
                             if (!$alb->save()) {
                                 $this->new_error_msg("¡Imposible vincular el " . FS_ALBARAN . " con la nueva factura!");
                                 $continuar = FALSE;
                                 break;
                             }
                         }
                         if ($continuar) {
                             $this->generar_asiento_proveedor($factura);
                             $this->total++;
                         } else {
                             if ($factura->delete()) {
                                 $this->new_error_msg("La factura se ha borrado.");
                             } else {
                                 $this->new_error_msg("¡Imposible borrar la factura!");
                             }
                         }
                     } else {
                         if ($factura->delete()) {
                             $this->new_error_msg("La factura se ha borrado.");
                         } else {
                             $this->new_error_msg("¡Imposible borrar la factura!");
                         }
                     }
                 } else {
                     $this->new_error_msg("¡Imposible guardar la factura!");
                 }
             }
         }
     }
 }
 private function nueva_factura_proveedor()
 {
     $continuar = TRUE;
     $proveedor = $this->proveedor->get($_POST['proveedor']);
     if ($proveedor) {
         $this->save_codproveedor($proveedor->codproveedor);
     } else {
         $this->new_error_msg('Proveedor no encontrado.');
         $continuar = FALSE;
     }
     if (isset($_POST['almacen'])) {
         $almacen = $this->almacen->get($_POST['almacen']);
         if ($almacen) {
             $this->save_codalmacen($almacen->codalmacen);
         } else {
             $this->new_error_msg('Almacén no encontrado.');
             $continuar = FALSE;
         }
     }
     $factura = new factura_proveedor();
     $eje0 = new ejercicio();
     $ejercicio = $eje0->get_by_fecha($_POST['fecha']);
     if ($ejercicio) {
         $this->save_codejercicio($ejercicio->codejercicio);
     } else {
         $this->autorizar_factura = 1;
         //      $this->new_error_msg('Ejercicio no encontrado.1');
         header('Location: ' . $factura->url_list() . '&nueva=2');
         $continuar = FALSE;
     }
     $serie = $this->serie->get($_POST['serie']);
     if (!$serie) {
         $this->new_error_msg('Serie no encontrada.');
         $continuar = FALSE;
     }
     $forma_pago = $this->forma_pago->get($_POST['forma_pago']);
     if ($forma_pago) {
         $this->save_codpago($forma_pago->codpago);
     } else {
         $this->new_error_msg('Forma de pago no encontrada.');
         $continuar = FALSE;
     }
     $divisa = $this->divisa->get($_POST['divisa']);
     if ($divisa) {
         $this->save_coddivisa($divisa->coddivisa);
     } else {
         $this->new_error_msg('Divisa no encontrada.');
         $continuar = FALSE;
     }
     if ($this->duplicated_petition($_POST['petition_id'])) {
         $this->new_error_msg('Petición duplicada. Has hecho doble clic sobre el botón guardar
            y se han enviado dos peticiones. Mira en <a href="' . $factura->url() . '">Facturas</a>
            para ver si la factura se ha guardado correctamente.');
         $continuar = FALSE;
     }
     $a = strlen(substr($_POST['fecha'], 6));
     if ($a != 4) {
         $continuar = FALSE;
     }
     if ($continuar) {
         $factura->fecha = $_POST['fecha'];
         $fecha_factura = $_POST['fecha'];
         $factura->hora = $_POST['hora'];
         $factura->codproveedor = $proveedor->codproveedor;
         $factura->nombre = $proveedor->razonsocial;
         $factura->idpagodevol = 0;
         $factura->cifnif = $proveedor->cifnif;
         $factura->codalmacen = $almacen->codalmacen;
         $factura->codejercicio = $ejercicio->codejercicio;
         $factura->codserie = $serie->codserie;
         $factura->codpago = $forma_pago->codpago;
         $factura->coddivisa = $divisa->coddivisa;
         $factura->tasaconv = $divisa->tasaconv_compra;
         $factura->tipo = $_POST['tipo'];
         $factura->cai = $_POST['cai'];
         $factura->caivence = $_POST['caivence'];
         if ($_POST['tasaconv'] != '') {
             $factura->tasaconv = floatval($_POST['tasaconv']);
         }
         $factura->codagente = $this->agente->codagente;
         $factura->numproveedor = $_POST['tipo'] . '/' . $_POST['numproveedor'];
         $factura->observaciones = $_POST['observaciones'];
         $factura->irpf = $serie->irpf;
         if ($forma_pago->genrecibos == 'Pagados') {
             //            $factura->pagada = TRUE;
         }
         if ($factura->save()) {
             $art0 = new articulo();
             $inventario = new inventario();
             $n = floatval($_POST['numlineas']);
             for ($i = 0; $i < $n; $i++) {
                 if (isset($_POST['referencia_' . $i])) {
                     $linea = new linea_factura_proveedor();
                     $linea->idfactura = $factura->idfactura;
                     $this->id_factura = $factura->idfactura;
                     $linea->descripcion = $_POST['desc_' . $i];
                     $linea->irpf = floatval($_POST['irpf_' . $i]);
                     $linea->pvpunitario = floatval($_POST['pvp_' . $i]);
                     $linea->cantidad = floatval($_POST['cantidad_' . $i]);
                     $linea->dtopor = floatval($_POST['dto_' . $i]);
                     $linea->pvpsindto = $linea->pvpunitario * $linea->cantidad;
                     $linea->pvptotal = floatval($_POST['neto_' . $i]);
                     $postot = strlen($_POST['subcuenta_' . $i]);
                     $poscad = strpos($_POST['subcuenta_' . $i], '/');
                     $posid = strpos($_POST['subcuenta_' . $i], '%');
                     $subcuencod = substr($_POST['subcuenta_' . $i], 0, $poscad);
                     $subcuendes = substr($_POST['subcuenta_' . $i], $poscad + 1, $posid - $postot);
                     $idsubcuen = substr($_POST['subcuenta_' . $i], $posid + 1);
                     $linea->codsubcuenta = $subcuencod;
                     $linea->subcuentadesc = $subcuendes;
                     $linea->idsubcuenta = $idsubcuen;
                     $articulo = $art0->get($_POST['referencia_' . $i]);
                     ////////////////////////////////////////////////////////////////////////
                     ////  GUARDA subcuenta en articulo cuando se carga la factura
                     ////////////////////////////////////////////////////
                     $artval = $this->artsubcuentas->get_ref($_POST['referencia_' . $i]);
                     if ($artval != $subcuencod || $subcuencod == NULL) {
                         if ($_POST['tipo'] == 'B' || $_POST['tipo'] == 'F' || $_POST['tipo'] == 'T' || $_POST['tipo'] == 'Q' || $_POST['tipo'] == 'C' || $_POST['tipo'] == 'D') {
                             $this->artsubcuentas->guarda_subcuenta_comp($_POST['referencia_' . $i], $subcuencod, $subcuendes);
                         } else {
                             $this->artsubcuentas->guarda_subcuenta_dev($_POST['referencia_' . $i], $subcuencod, $subcuendes);
                         }
                     }
                     //////////////////////////////////////////////////////////////////
                     ////////////////////////////////////////////////////////////////
                     if ($articulo) {
                         $linea->referencia = $articulo->referencia;
                     }
                     if ($linea->save()) {
                         if ($articulo) {
                             if (isset($_POST['costemedio'])) {
                                 if ($articulo->costemedio == 0) {
                                     $articulo->costemedio = $linea->pvptotal / $linea->cantidad;
                                 } else {
                                     $articulo->costemedio = $articulo->get_costemedio();
                                     if ($articulo->costemedio == 0) {
                                         $articulo->costemedio = $linea->pvptotal / $linea->cantidad;
                                     }
                                 }
                                 $this->actualizar_precio_proveedor($factura->codproveedor, $linea);
                             }
                             if (isset($_POST['stock'])) {
                                 $articulo->sum_stock($factura->codalmacen, $linea->cantidad);
                                 if ($articulo) {
                                     $inventario->inventario_agregar($factura->codalmacen, $linea->referencia, $linea->cantidad, $linea->pvpunitario);
                                 }
                             } else {
                                 if (isset($_POST['costemedio'])) {
                                     $articulo->save();
                                 }
                             }
                         }
                         $factura->neto += $linea->pvptotal;
                         $factura->totaliva += $linea->pvptotal * $linea->iva / 100;
                         $factura->totalirpf += $linea->pvptotal * $linea->irpf / 100;
                         $factura->totalrecargo += $linea->pvptotal * $linea->recargo / 100;
                     } else {
                         $this->new_error_msg("¡Imposible guardar la linea con referencia: " . $linea->referencia);
                         $continuar = FALSE;
                     }
                 }
             }
             if ($continuar) {
                 $factura->fecha = $fecha_factura;
                 /// redondeamos
                 $factura->neto = round($factura->neto, FS_NF0);
                 $factura->totaliva = round($factura->totaliva, FS_NF0);
                 $factura->totalirpf = round($factura->totalirpf, FS_NF0);
                 $factura->totalrecargo = round($factura->totalrecargo, FS_NF0);
                 $factura->total = $factura->neto + $factura->totaliva - $factura->totalirpf + $factura->totalrecargo;
                 if (abs(floatval($_POST['atotal']) - $factura->total) >= 0.02) {
                     $this->new_error_msg("El total difiere entre el controlador y la vista (" . $factura->total . " frente a " . $_POST['atotal'] . "). Debes informar del error.");
                     $factura->delete();
                 } else {
                     if ($factura->save()) {
                         ///////// GENERA  ASIENTO
                         //                  $this->generar_asiento($factura);
                         //                  $this->new_message("<a href='".$factura->url()."'>Factura</a> guardada correctamente.");
                         //             $this->new_change('Factura Proveedor '.$factura->codigo, $factura->url(), TRUE);
                         $this->autorizar_factura = 1;
                         $this->new_error_msg('Factura Guardada');
                         if ($_POST['redir'] == 'TRUE') {
                             header('Location: ' . $factura->url_list() . '&nueva=1');
                         }
                     } else {
                         $this->new_error_msg("¡Imposible actualizar la <a href='" . $factura->url() . "'>factura</a>!");
                     }
                 }
             } else {
                 $this->new_message("Factura eliminada correctamente.");
             }
         } else {
             $this->new_error_msg("¡Imposible guardar la factura!");
         }
     }
 }
 private function nueva_factura_proveedor()
 {
     $continuar = TRUE;
     $proveedor = $this->proveedor->get($_POST['proveedor']);
     if ($proveedor) {
         $this->save_codproveedor($proveedor->codproveedor);
     } else {
         $this->new_error_msg('Proveedor no encontrado.');
         $continuar = FALSE;
     }
     $almacen = $this->almacen->get($_POST['almacen']);
     if ($almacen) {
         $this->save_codalmacen($almacen->codalmacen);
     } else {
         $this->new_error_msg('Almacén no encontrado.');
         $continuar = FALSE;
     }
     $eje0 = new ejercicio();
     $ejercicio = $eje0->get_by_fecha($_POST['fecha']);
     if ($ejercicio) {
         $this->save_codejercicio($ejercicio->codejercicio);
     } else {
         $this->new_error_msg('Ejercicio no encontrado.');
         $continuar = FALSE;
     }
     $serie = $this->serie->get($_POST['serie']);
     if (!$serie) {
         $this->new_error_msg('Serie no encontrada.');
         $continuar = FALSE;
     }
     $forma_pago = $this->forma_pago->get($_POST['forma_pago']);
     if ($forma_pago) {
         $this->save_codpago($forma_pago->codpago);
     } else {
         $this->new_error_msg('Forma de pago no encontrada.');
         $continuar = FALSE;
     }
     $divisa = $this->divisa->get($_POST['divisa']);
     if ($divisa) {
         $this->save_coddivisa($divisa->coddivisa);
     } else {
         $this->new_error_msg('Divisa no encontrada.');
         $continuar = FALSE;
     }
     $factura = new factura_proveedor();
     if ($this->duplicated_petition($_POST['petition_id'])) {
         $this->new_error_msg('Petición duplicada. Has hecho doble clic sobre el botón guardar
            y se han enviado dos peticiones. Mira en <a href="' . $factura->url() . '">Facturas</a>
            para ver si la factura se ha guardado correctamente.');
         $continuar = FALSE;
     }
     if ($continuar) {
         $factura->fecha = $_POST['fecha'];
         $factura->hora = $_POST['hora'];
         $factura->codproveedor = $proveedor->codproveedor;
         $factura->nombre = $proveedor->nombrecomercial;
         $factura->cifnif = $proveedor->cifnif;
         $factura->codalmacen = $almacen->codalmacen;
         $factura->codejercicio = $ejercicio->codejercicio;
         $factura->codserie = $serie->codserie;
         $factura->codpago = $forma_pago->codpago;
         $factura->coddivisa = $divisa->coddivisa;
         $factura->tasaconv = $divisa->tasaconv;
         $factura->codagente = $this->agente->codagente;
         $factura->numproveedor = $_POST['numproveedor'];
         $factura->observaciones = $_POST['observaciones'];
         $factura->irpf = $serie->irpf;
         if ($forma_pago->genrecibos == 'Pagados') {
             $factura->pagada = TRUE;
         }
         foreach ($proveedor->get_direcciones() as $d) {
             if ($d->domfacturacion) {
                 $factura->codproveedor = $proveedor->codproveedor;
                 $factura->cifnif = $proveedor->cifnif;
                 $factura->nombre = $proveedor->nombrecomercial;
                 $factura->apartado = $d->apartado;
                 $factura->ciudad = $d->ciudad;
                 $factura->coddir = $d->id;
                 $factura->codpais = $d->codpais;
                 $factura->codpostal = $d->codpostal;
                 $factura->direccion = $d->direccion;
                 $factura->provincia = $d->provincia;
                 break;
             }
         }
         if (is_null($factura->codproveedor)) {
             $this->new_error_msg("No hay ninguna dirección asociada al proveedor.");
         } else {
             if ($factura->save()) {
                 $art0 = new articulo();
                 $n = floatval($_POST['numlineas']);
                 for ($i = 0; $i < $n; $i++) {
                     if (isset($_POST['referencia_' . $i])) {
                         $articulo = $art0->get($_POST['referencia_' . $i]);
                         if ($articulo) {
                             $linea = new linea_factura_proveedor();
                             $linea->idfactura = $factura->idfactura;
                             $linea->referencia = $articulo->referencia;
                             $linea->descripcion = $_POST['desc_' . $i];
                             $linea->irpf = $factura->irpf;
                             if (!$serie->siniva and $proveedor->regimeniva != 'Exento') {
                                 $imp0 = $this->impuesto->get_by_iva($_POST['iva_' . $i]);
                                 if ($imp0) {
                                     $linea->codimpuesto = $imp0->codimpuesto;
                                     $linea->iva = floatval($_POST['iva_' . $i]);
                                     $linea->recargo = floatval($_POST['recargo_' . $i]);
                                 } else {
                                     $linea->iva = floatval($_POST['iva_' . $i]);
                                     $linea->recargo = floatval($_POST['recargo_' . $i]);
                                 }
                             }
                             $linea->pvpunitario = floatval($_POST['pvp_' . $i]);
                             $linea->cantidad = floatval($_POST['cantidad_' . $i]);
                             $linea->dtopor = floatval($_POST['dto_' . $i]);
                             $linea->pvpsindto = $linea->pvpunitario * $linea->cantidad;
                             $linea->pvptotal = floatval($_POST['neto_' . $i]);
                             if ($linea->save()) {
                                 /// sumamos al stock
                                 $articulo->sum_stock($factura->codalmacen, $linea->cantidad);
                                 if ($articulo->costemedio == 0) {
                                     $articulo->costemedio = $linea->pvptotal / $linea->cantidad;
                                     $articulo->save();
                                 }
                                 $factura->neto += $linea->pvptotal;
                                 $factura->totaliva += $linea->pvptotal * $linea->iva / 100;
                                 $factura->totalirpf += $linea->pvptotal * $linea->irpf / 100;
                                 $factura->totalrecargo += $linea->pvptotal * $linea->recargo / 100;
                             } else {
                                 $this->new_error_msg("¡Imposible guardar la linea con referencia: " . $linea->referencia);
                                 $continuar = FALSE;
                             }
                         } else {
                             $this->new_error_msg("Artículo no encontrado: " . $_POST['referencia_' . $i]);
                             $continuar = FALSE;
                         }
                     }
                 }
                 if ($continuar) {
                     /// redondeamos
                     $factura->neto = round($factura->neto, FS_NF0);
                     $factura->totaliva = round($factura->totaliva, FS_NF0);
                     $factura->totalirpf = round($factura->totalirpf, FS_NF0);
                     $factura->totalrecargo = round($factura->totalrecargo, FS_NF0);
                     $factura->total = $factura->neto + $factura->totaliva - $factura->totalirpf + $factura->totalrecargo;
                     if (abs(floatval($_POST['atotal']) - $factura->total) > 0.01) {
                         $this->new_error_msg("El total difiere entre el controlador y la vista (" . $factura->total . " frente a " . $_POST['atotal'] . "). Debes informar del error.");
                         $factura->delete();
                     } else {
                         if ($factura->save()) {
                             $this->generar_asiento($factura);
                             $this->new_message("<a href='" . $factura->url() . "'>Factura</a> guardada correctamente.");
                             $this->new_change('Factura Proveedor ' . $factura->codigo, $factura->url(), TRUE);
                         } else {
                             $this->new_error_msg("¡Imposible actualizar la <a href='" . $factura->url() . "'>factura</a>!");
                         }
                     }
                 } else {
                     if ($factura->delete()) {
                         $this->new_message("Factura eliminada correctamente.");
                     } else {
                         $this->new_error_msg("¡Imposible eliminar la <a href='" . $factura->url() . "'>factura</a>!");
                     }
                 }
             } else {
                 $this->new_error_msg("¡Imposible guardar la factura!");
             }
         }
     }
 }
 public function rectificar_factura()
 {
     $serie = $this->serie->get($_POST['codserie']);
     if (!$serie) {
         $this->new_error_msg('Serie no encontrada.');
         $continuar = FALSE;
     }
     $motivo = \filter_input(INPUT_POST, 'motivo');
     $motivo_anulacion = $this->ncf_tipo_anulacion->get($motivo);
     $monto0 = \filter_input(INPUT_POST, 'monto');
     $monto = $monto0 > 0 ? $monto0 * -1 : $monto0;
     $impuesto0 = \filter_input(INPUT_POST, 'codimpuesto');
     $impuesto = $impuesto0 > 0 ? $impuesto0 * -1 : $impuesto0;
     $monto_total = \filter_input(INPUT_POST, 'monto_total');
     $fecha = \filter_input(INPUT_POST, 'fecha');
     $irpf = 0;
     $recargo = 0;
     $factura = clone $this->factura;
     $factura->idfactura = NULL;
     $factura->numero = NULL;
     $factura->numproveedor = $_POST['numproveedor'];
     $factura->codigo = NULL;
     $factura->idasiento = NULL;
     $factura->idfacturarect = $this->factura->idfactura;
     $factura->codigorect = $this->factura->codigo;
     $factura->fecha = $fecha;
     $factura->neto = round($monto, FS_NF0);
     $factura->totaliva = round($monto * ($impuesto / 100), FS_NF0) * -1;
     $factura->totalirpf = round($irpf, FS_NF0);
     $factura->totalrecargo = round($recargo, FS_NF0);
     $factura->total = $factura->neto + $factura->totaliva - $factura->totalirpf + $factura->totalrecargo;
     $factura->observaciones = ucfirst(FS_FACTURA_RECTIFICATIVA) . " por rectificación contable de la " . ucfirst(FS_FACTURA) . ": " . $factura->codigorect;
     if ($factura->save()) {
         $linea = new linea_factura_proveedor();
         $linea->idfactura = $factura->idfactura;
         $linea->descripcion = "Rectificación de importe";
         if (!$serie->siniva and $this->cliente->regimeniva != 'Exento') {
             $imp0 = $this->impuesto->get_by_iva($impuesto);
             $linea->codimpuesto = $imp0 ? $imp0->codimpuesto : NULL;
             $linea->iva = $impuesto > 0 ? floatval($impuesto) : floatval($impuesto * -1);
             $linea->recargo = floatval($recargo);
         }
         $linea->irpf = floatval($irpf);
         $linea->pvpunitario = $monto > 0 ? floatval($monto) : floatval($monto * -1);
         $linea->cantidad = -1;
         $linea->dtopor = 0;
         $linea->pvpsindto = $linea->pvpunitario * $linea->cantidad;
         $linea->pvptotal = floatval($monto);
         if ($linea->save()) {
             $factura->get_lineas_iva();
             $this->generar_asiento($factura);
             $this->new_message("<a href='" . $factura->url() . "'>Factura</a> guardada correctamente con número NCF: " . $_POST['numproveedor']);
             $this->new_change('Factura Cliente ' . $factura->codigo, $factura->url(), TRUE);
         }
     }
 }
 /**
  * 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;
 }