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!"); } } } } }
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_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->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!"); } } } }
/** * * @param factura_proveedor $factura */ public function sync_factura_prov(&$factura) { if ($factura) { $recibos = $this->recibo_proveedor->all_from_factura($factura->idfactura); if (count($recibos) == 0 and $factura->pagada) { /// no hacemos nada } else { if (count($recibos) == 0) { $formap = $this->forma_pago->get($factura->codpago); if ($formap) { $plazos = $this->plazo_pago->all_from($formap->codpago); if ($plazos) { $pendiente = $factura->total; foreach ($plazos as $i => $pla) { $recibo = new recibo_proveedor(); $recibo->cifnif = $factura->cifnif; $recibo->coddivisa = $factura->coddivisa; $recibo->tasaconv = $factura->tasaconv; $recibo->codproveedor = $factura->codproveedor; $recibo->nombreproveedor = $factura->nombre; $recibo->estado = 'Emitido'; $recibo->fecha = $factura->fecha; $recibo->fechav = Date('d-m-Y', strtotime($factura->fecha . ' +' . $pla->dias . 'days')); $recibo->idfactura = $factura->idfactura; $recibo->codpago = $factura->codpago; $recibo->codserie = $factura->codserie; if ($i + 1 == count($plazos)) { $recibo->importe = round($pendiente, FS_NF0); } else { $recibo->importe = round($factura->total * $pla->aplazado / 100, FS_NF0); $pendiente -= $recibo->importe; } $recibo->numero = $recibo->new_numero($recibo->idfactura); $recibo->codigo = $factura->codigo . '-' . sprintf('%02s', $recibo->numero); foreach ($this->cbp->all_from_proveedor($recibo->codproveedor) as $cuenta) { if (is_null($recibo->codcuenta) or $cuenta->principal) { $recibo->codcuenta = $cuenta->codcuenta; $recibo->iban = $cuenta->iban; $recibo->swift = $cuenta->swift; } } if ($recibo->save()) { $recibos[] = $recibo; } else { $this->new_error_msg('Error al generar el recibo.'); } } } else { $recibo = new recibo_proveedor(); $recibo->cifnif = $factura->cifnif; $recibo->coddivisa = $factura->coddivisa; $recibo->tasaconv = $factura->tasaconv; $recibo->codproveedor = $factura->codproveedor; $recibo->nombreproveedor = $factura->nombre; $recibo->estado = 'Emitido'; $recibo->fecha = $factura->fecha; $recibo->fechav = Date('d-m-Y', strtotime($factura->fecha . ' ' . $formap->vencimiento)); $recibo->idfactura = $factura->idfactura; $recibo->codpago = $factura->codpago; $recibo->codserie = $factura->codserie; $recibo->importe = $factura->total; $recibo->numero = $recibo->new_numero($recibo->idfactura); $recibo->codigo = $factura->codigo . '-' . sprintf('%02s', $recibo->numero); foreach ($this->cbp->all_from_proveedor($recibo->codproveedor) as $cuenta) { if (is_null($recibo->codcuenta) or $cuenta->principal) { $recibo->codcuenta = $cuenta->codcuenta; $recibo->iban = $cuenta->iban; $recibo->swift = $cuenta->swift; } } if ($recibo->save()) { $recibos[] = $recibo; } else { $this->new_error_msg('Error al generar el recibo.'); } } } } else { $pagado = 0; foreach ($recibos as $res) { if ($res->estado == 'Pagado') { $pagado += $res->importe; } } $factura->pagada = $pagado >= $factura->total; $factura->save(); } } return $recibos; } else { return array(); } }
/** * Genera el asiento contable para una factura 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 factura_proveedor $factura */ public function generar_asiento_compra(&$factura) { $ok = FALSE; $this->asiento = FALSE; $proveedor0 = new proveedor(); $subcuenta_prov = FALSE; $proveedor = $proveedor0->get($factura->codproveedor); if ($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 = FALSE; $asiento->fecha = $factura->fecha; $asiento->importe = $factura->total; $asiento->tipodocumento = "Factura de proveedor"; if ($asiento->save()) { $asiento_correcto = TRUE; $subcuenta = new subcuenta(); $partida0 = new partida(); $partida0->idasiento = $asiento->idasiento; $partida0->concepto = $asiento->concepto; $partida0->idsubcuenta = $subcuenta_prov->idsubcuenta; $partida0->codsubcuenta = $subcuenta_prov->codsubcuenta; $partida0->haber = $factura->total; $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 . "!"); } /// generamos una partida por cada impuesto foreach ($factura->get_lineas_iva() as $li) { $subcuenta_iva = FALSE; /// ¿El impuesto tiene una subcuenta específica? if (isset($this->impuestos[$li->codimpuesto])) { if ($this->impuestos[$li->codimpuesto]->codsubcuentasop) { $subcuenta_iva = $subcuenta->get_by_codigo($this->impuestos[$li->codimpuesto]->codsubcuentasop, $asiento->codejercicio); } } if (!$subcuenta_iva) { $subcuenta_iva = $subcuenta->get_cuentaesp('IVASOP', $asiento->codejercicio); } 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 . "!"); } } } } $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_compras->idsubcuenta; $partida2->codsubcuenta = $subcuenta_compras->codsubcuenta; $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 . "!"); } } /// ¿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; }
/** * Genera el asiento contable para una factura 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 factura_proveedor $factura */ public function generar_asiento_compra(&$factura) { $ok = FALSE; $this->asiento = FALSE; $proveedor0 = new proveedor(); $subcuenta_prov = FALSE; /// obtenemos las tasas de conversión, para las ocasiones en que la factura está en otra divisa $tasaconv = 1; $tasaconv2 = $factura->tasaconv; if ($factura->coddivisa != $this->empresa->coddivisa) { $div0 = new divisa(); $divisa = $div0->get($this->empresa->coddivisa); if ($divisa) { $tasaconv = $divisa->tasaconv_compra / $factura->tasaconv; $tasaconv2 = $divisa->tasaconv_compra; } } /// obtenemos el proveedor de la factura y su subcuenta $proveedor = $proveedor0->get($factura->codproveedor); if ($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; if ($factura->idfacturarect) { $asiento->concepto = ucfirst(FS_FACTURA_RECTIFICATIVA) . " de " . $factura->codigorect . " (compras) - " . $factura->nombre; } else { $asiento->concepto = "Factura de compra " . $factura->codigo . " - " . $factura->nombre; } $asiento->documento = $factura->codigo; $asiento->editable = FALSE; $asiento->fecha = $factura->fecha; $asiento->importe = abs($factura->total * $tasaconv); $asiento->tipodocumento = "Factura de proveedor"; if ($asiento->save()) { $asiento_correcto = TRUE; $subcuenta = new subcuenta(); $partida0 = new partida(); $partida0->idasiento = $asiento->idasiento; $partida0->concepto = $asiento->concepto; $partida0->idsubcuenta = $subcuenta_prov->idsubcuenta; $partida0->codsubcuenta = $subcuenta_prov->codsubcuenta; $partida0->haber = $factura->total * $tasaconv; $partida0->coddivisa = $this->empresa->coddivisa; $partida0->tasaconv = $tasaconv2; $partida0->codserie = $factura->codserie; if (!$partida0->save()) { $asiento_correcto = FALSE; $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida0->codsubcuenta . "!"); } /// generamos una partida por cada impuesto foreach ($factura->get_lineas_iva() as $li) { $subcuenta_iva = FALSE; /// ¿El impuesto tiene una subcuenta específica? if (isset($this->impuestos[$li->codimpuesto])) { if ($this->impuestos[$li->codimpuesto]->codsubcuentasop) { $subcuenta_iva = $subcuenta->get_by_codigo($this->impuestos[$li->codimpuesto]->codsubcuentasop, $asiento->codejercicio); } } if (!$subcuenta_iva) { $subcuenta_iva = $subcuenta->get_cuentaesp('IVASOP', $asiento->codejercicio); } 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 * $tasaconv; $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 * $tasaconv; $partida1->iva = $li->iva; $partida1->coddivisa = $this->empresa->coddivisa; $partida1->tasaconv = $tasaconv2; 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 * $tasaconv; $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 * $tasaconv; $partida11->recargo = $li->recargo; $partida11->coddivisa = $this->empresa->coddivisa; $partida11->tasaconv = $tasaconv2; if (!$partida11->save()) { $asiento_correcto = FALSE; $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida11->codsubcuenta . "!"); } } } else { if (!$subcuenta_iva) { $asiento_correcto = FALSE; $this->new_error_msg('No se encuentra la subcuenta de ' . FS_IVA); } } } $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_compras->idsubcuenta; $partida2->codsubcuenta = $subcuenta_compras->codsubcuenta; $partida2->debe = $factura->neto * $tasaconv; $partida2->coddivisa = $this->empresa->coddivisa; $partida2->tasaconv = $tasaconv2; $partida2->codserie = $factura->codserie; if (!$partida2->save()) { $asiento_correcto = FALSE; $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida2->codsubcuenta . "!"); } } else { if (!$subcuenta_compras) { $asiento_correcto = FALSE; $this->new_error_msg('No se encuentra la subcuenta de compras.'); } } /// ¿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 * $tasaconv; $partida3->coddivisa = $this->empresa->coddivisa; $partida3->tasaconv = $tasaconv2; $partida3->codserie = $factura->codserie; if (!$partida3->save()) { $asiento_correcto = FALSE; $this->new_error_msg("¡Imposible generar la partida para la subcuenta " . $partida3->codsubcuenta . "!"); } } else { if (!$subcuenta_irpf) { $asiento_correcto = FALSE; $this->new_error_msg('No se encuentra la subcuenta de ' . FS_IRPF); } } } /// comprobamos si los artículos tienen subcuentas asociadas if ($asiento_correcto) { $partidaA = new partida(); $partidaA->idasiento = $asiento->idasiento; $partidaA->concepto = $asiento->concepto; $partidaA->coddivisa = $this->empresa->coddivisa; $partidaA->tasaconv = $tasaconv2; /// importe a restar a la partida2 $restar = 0; /** * Para cada artículo de la factura, buscamos su subcuenta de compra o compra con irpf */ $art0 = new articulo(); foreach ($factura->get_lineas() as $lin) { $subcart = FALSE; $articulo = $art0->get($lin->referencia); if ($articulo) { if ($lin->irpf != 0) { $subcart = $subcuenta->get_by_codigo($articulo->codsubcuentairpfcom, $factura->codejercicio); } else { if ($articulo->codsubcuentacom) { $subcart = $subcuenta->get_by_codigo($articulo->codsubcuentacom, $factura->codejercicio); } } if (!$subcart) { /// no hay / no se encuentra ninguna subcuenta asignada al artículo } else { if ($subcart->idsubcuenta != $subcuenta_compras->idsubcuenta) { if (is_null($partidaA->idsubcuenta)) { $partidaA->idsubcuenta = $subcart->idsubcuenta; $partidaA->codsubcuenta = $subcart->codsubcuenta; $partidaA->debe = $lin->pvptotal * $tasaconv; } else { if ($partidaA->idsubcuenta == $subcart->idsubcuenta) { $partidaA->debe += $lin->pvptotal * $tasaconv; } else { $partidaA->debe = round($partidaA->debe, FS_NF0); $restar += $partidaA->debe; if (!$partidaA->save()) { $asiento_correcto = FALSE; $this->new_error_msg("¡Imposible generar la partida para la subcuenta del artículo " . $lin->referencia . "!"); } $partidaA = new partida(); $partidaA->idasiento = $asiento->idasiento; $partidaA->concepto = $asiento->concepto; $partidaA->idsubcuenta = $subcart->idsubcuenta; $partidaA->codsubcuenta = $subcart->codsubcuenta; $partidaA->debe = $lin->pvptotal * $tasaconv; $partidaA->coddivisa = $this->empresa->coddivisa; $partidaA->tasaconv = $tasaconv2; } } } } } } if ($partidaA->idsubcuenta and $partidaA->codsubcuenta) { $partidaA->debe = round($partidaA->debe, FS_NF0); $restar += $partidaA->debe; if ($partidaA->save()) { $partida2->debe -= $restar; $partida2->save(); } else { $asiento_correcto = FALSE; $this->new_error_msg("¡Imposible generar la partida para la subcuenta del artículo " . $lin->referencia . "!"); } } } if ($asiento_correcto) { /// si es una factura rectificativa, invertimos los importes if ($factura->idfacturarect) { $this->invertir_asiento($asiento); } $factura->idasiento = $asiento->idasiento; if ($factura->save()) { $ok = $this->check_asiento($asiento); if (!$ok) { $this->new_error_msg('El asiento está descuadrado.'); } $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; }
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!"); } } } }