private function delete_factura()
 {
     $fact = $this->factura->get($_GET['delete']);
     if ($fact) {
         /// ¿Sumamos stock?
         $art0 = new articulo();
         $inventario = new inventario();
         foreach ($fact->get_lineas() as $linea) {
             if (is_null($linea->idalbaran)) {
                 $articulo = $art0->get($linea->referencia);
                 if ($articulo) {
                     $articulo->sum_stock($fact->codalmacen, $linea->cantidad);
                     $inventario->inventario_agregar($fact->codalmacen, $linea->referencia, $linea->cantidad, $linea->pvpunitario);
                 }
             }
         }
         if ($fact->delete()) {
             $this->new_message("Factura eliminada correctamente.");
         } else {
             $this->new_error_msg("¡Imposible eliminar la factura!");
         }
     } else {
         $this->new_error_msg("Factura no encontrada.");
     }
 }
 private function delete_albaran()
 {
     $inventario = new inventario();
     $alb = new albaran_cliente();
     $alb1 = $alb->get($_POST['delete']);
     if ($alb1) {
         /// ¿Actualizamos el stock de los artículos?
         if (isset($_POST['stock'])) {
             $articulo = new articulo();
             foreach ($alb1->get_lineas() as $linea) {
                 $art0 = $articulo->get($linea->referencia);
                 if ($art0) {
                     $art0->sum_stock($alb1->codalmacen, $linea->cantidad);
                     if ($art0->save()) {
                         $inventario->inventario_agregar($alb1->codalmacen, $linea->referencia, $linea->cantidad, $linea->pvpunitario);
                     }
                 }
             }
         }
         if ($alb1->delete()) {
             $this->new_message(FS_ALBARAN . " " . $alb1->codigo . " borrado correctamente.");
         } else {
             $this->new_error_msg("¡Imposible borrar el " . FS_ALBARAN . "!");
         }
     } else {
         $this->new_error_msg("¡" . FS_ALBARAN . " no encontrado!");
     }
 }
 protected function private_core()
 {
     $articulo = new articulo();
     $this->almacen = new almacen();
     $this->articulo = FALSE;
     $this->impuesto = new impuesto();
     $this->fabricante = new fabricante();
     $inventario = new inventario();
     /// ¿El usuario tiene permiso para eliminar en esta página?
     $this->allow_delete = $this->user->allow_delete_on(__CLASS__);
     /**
      * Si hay alguna extensión de tipo config y texto no_tab_recios,
      * desactivamos la pestaña precios.
      */
     $this->mostrar_tab_precios = TRUE;
     foreach ($this->extensions as $ext) {
         if ($ext->type == 'config' and $ext->text == 'no_tab_precios') {
             $this->mostrar_tab_precios = FALSE;
             break;
         }
     }
     /**
      * Si hay alguna extensión de tipo config y texto no_tab_stock,
      * desactivamos la pestaña stock.
      */
     $this->mostrar_tab_stock = TRUE;
     foreach ($this->extensions as $ext) {
         if ($ext->type == 'config' and $ext->text == 'no_tab_stock') {
             $this->mostrar_tab_stock = FALSE;
             break;
         }
     }
     /**
      * Si hay alguna extensión de tipo config y texto no_button_publicar,
      * desactivamos el botón publicar.
      */
     $this->mostrar_boton_publicar = TRUE;
     foreach ($this->extensions as $ext) {
         if ($ext->type == 'config' and $ext->text == 'no_button_publicar') {
             $this->mostrar_boton_publicar = FALSE;
             break;
         }
     }
     if (isset($_POST['pvpiva'])) {
         $this->articulo = $articulo->get($_POST['referencia']);
         if ($this->articulo) {
             $continuar = TRUE;
             $this->articulo->set_impuesto($_POST['codimpuesto']);
             $this->articulo->set_pvp_iva(floatval($_POST['pvpiva']));
             if (isset($_POST['preciocoste'])) {
                 $this->articulo->preciocoste = floatval($_POST['preciocoste']);
             }
             if ($this->articulo->save()) {
                 if (!($this->inventario = $inventario->get_ref($_POST['referencia']))) {
                     $inventario->referencia = $_POST['referencia'];
                     $inventario->preciocoste = $this->articulo->preciocoste;
                     $inventario->cantidad = 0;
                     $inventario->save();
                 } else {
                     $this->inventario->preciocoste = $this->articulo->preciocoste;
                     $this->inventario->cantidad = 0;
                     $this->inventario->inventario_agregar($this->inventario->codalmacen, $_POST['referencia'], $this->inventario->cantidad, $this->inventario->preciocoste);
                     //				$this->inventario->save();
                 }
             } else {
                 $this->new_message("Precio modificado correctamente.");
             }
         }
     } else {
         if (isset($_POST['almacen'])) {
             $this->articulo = $articulo->get($_POST['referencia']);
             if ($this->articulo) {
                 if ($_POST['cantidadini'] == $_POST['cantidad']) {
                     $this->new_message('Sin cambios.');
                 } else {
                     if ($this->articulo->set_stock($_POST['almacen'], $_POST['cantidad'])) {
                         $this->new_message("Stock guardado correctamente.");
                         /// añadimos la regularización
                         foreach ($this->articulo->get_stock() as $stock) {
                             if ($stock->codalmacen == $_POST['almacen']) {
                                 $regularizacion = new regularizacion_stock();
                                 $regularizacion->idstock = $stock->idstock;
                                 $regularizacion->cantidadini = floatval($_POST['cantidadini']);
                                 $regularizacion->cantidadfin = floatval($_POST['cantidad']);
                                 $regularizacion->codalmacendest = $_POST['almacen'];
                                 $regularizacion->motivo = $_POST['motivo'];
                                 $regularizacion->nick = $this->user->nick;
                                 if ($regularizacion->save()) {
                                     $inventario->inventario_agregar($_POST['almacen'], $_POST['referencia'], floatval($_POST['cantidad']) - floatval($_POST['cantidadini']), $this->articulo->preciocoste);
                                 }
                                 break;
                             }
                         }
                     } else {
                         $this->new_error_msg("Error al guardar el stock.");
                     }
                 }
             }
         } else {
             if (isset($_POST['imagen'])) {
                 $this->articulo = $articulo->get($_POST['referencia']);
                 if (is_uploaded_file($_FILES['fimagen']['tmp_name']) and $_FILES['fimagen']['size'] <= 1024000) {
                     $this->articulo->set_imagen(file_get_contents($_FILES['fimagen']['tmp_name']));
                     if ($this->articulo->save()) {
                         $this->new_message("Imagen del articulo modificada correctamente");
                     } else {
                         $this->new_error_msg("¡Error al guardar la imagen del articulo!");
                     }
                 }
             } else {
                 if (isset($_GET['delete_img'])) {
                     $this->articulo = $articulo->get($_GET['ref']);
                     $this->articulo->set_imagen(NULL);
                     if ($this->articulo->save()) {
                         $this->new_message("Imagen del articulo eliminada correctamente");
                     } else {
                         $this->new_error_msg("¡Error al eliminar la imagen del articulo!");
                     }
                 } else {
                     if (isset($_POST['referencia'])) {
                         $this->articulo = $articulo->get($_POST['referencia']);
                         $this->articulo->descripcion = $_POST['descripcion'];
                         $this->articulo->tipo = NULL;
                         if ($_POST['tipo'] != '') {
                             $this->articulo->tipo = $_POST['tipo'];
                         }
                         $this->articulo->codfamilia = NULL;
                         if ($_POST['codfamilia'] != '') {
                             $this->articulo->codfamilia = $_POST['codfamilia'];
                         }
                         $this->articulo->codfabricante = NULL;
                         if ($_POST['codfabricante'] != '') {
                             $this->articulo->codfabricante = $_POST['codfabricante'];
                         }
                         /// ¿Existe ya ese código de barras?
                         if ($_POST['codbarras'] != '') {
                             $arts = $this->articulo->search_by_codbar($_POST['codbarras']);
                             if ($arts) {
                                 foreach ($arts as $art2) {
                                     if ($art2->referencia != $this->articulo->referencia) {
                                         $this->new_advice('Ya hay un artículo con este mismo código de barras. ' . 'En concreto, el artículo <a href="' . $art2->url() . '">' . $art2->referencia . '</a>.');
                                         break;
                                     }
                                 }
                             }
                         }
                         $this->articulo->codbarras = $_POST['codbarras'];
                         $this->articulo->equivalencia = $_POST['equivalencia'];
                         $this->articulo->bloqueado = isset($_POST['bloqueado']);
                         $this->articulo->controlstock = isset($_POST['controlstock']);
                         $this->articulo->nostock = isset($_POST['nostock']);
                         $this->articulo->secompra = isset($_POST['secompra']);
                         $this->articulo->sevende = isset($_POST['sevende']);
                         $this->articulo->publico = isset($_POST['publico']);
                         $this->articulo->observaciones = $_POST['observaciones'];
                         $this->articulo->stockmin = floatval($_POST['stockmin']);
                         $this->articulo->stockmax = floatval($_POST['stockmax']);
                         if ($this->articulo->save()) {
                             if ($this->inventario = $inventario->get_ref($this->articulo->referencia)) {
                                 $this->inventario->guardar_modif_refe($_POST['nreferencia']);
                             }
                             $this->new_message("Datos del articulo modificados correctamente");
                             $this->articulo->set_referencia($_POST['nreferencia']);
                         } else {
                             $this->new_error_msg("¡Error al guardar el articulo!");
                         }
                     } else {
                         if (isset($_GET['ref'])) {
                             $this->articulo = $articulo->get($_GET['ref']);
                         }
                     }
                 }
             }
         }
     }
     if ($this->articulo) {
         $this->page->title = $this->articulo->referencia;
         if ($this->articulo->bloqueado) {
             $this->new_advice("Este artículo está bloqueado / obsoleto.");
         }
         /**
          * Si está desactivado el control de stok en el artículo, no muestro la pestaña.
          */
         if ($this->articulo->nostock) {
             $this->mostrar_tab_stock = FALSE;
         }
         $this->familia = $this->articulo->get_familia();
         if (!$this->familia) {
             $this->familia = new familia();
         }
         $this->fabricante = $this->articulo->get_fabricante();
         if (!$this->fabricante) {
             $this->fabricante = new fabricante();
         }
         $this->stocks = $this->articulo->get_stock();
         /// metemos en un array los almacenes que no tengan stock de este producto
         $this->nuevos_almacenes = array();
         foreach ($this->almacen->all() as $a) {
             $encontrado = FALSE;
             foreach ($this->stocks as $s) {
                 if ($a->codalmacen == $s->codalmacen) {
                     $encontrado = TRUE;
                 }
             }
             if (!$encontrado) {
                 $this->nuevos_almacenes[] = $a;
             }
         }
         $reg = new regularizacion_stock();
         $this->regularizaciones = $reg->all_from_articulo($this->articulo->referencia);
         $this->equivalentes = $this->articulo->get_equivalentes();
     } else {
         $this->new_error_msg("Artículo no encontrado.");
     }
 }
 private function modificar()
 {
     $inventario = new inventario();
     $error = FALSE;
     $this->albaran->numproveedor = $_POST['numproveedor'];
     $this->albaran->observaciones = $_POST['observaciones'];
     $this->albaran->cai = $_POST['cai'];
     $this->albaran->caivence = $_POST['caivence'];
     if ($this->albaran->ptefactura) {
         $eje0 = $this->ejercicio->get_by_fecha($_POST['fecha']);
         if ($eje0) {
             if ($eje0->codejercicio == $this->albaran->codejercicio) {
                 $continuar = TRUE;
             } else {
                 $continuar = FALSE;
             }
         } else {
             $continuar = FALSE;
         }
         if ($continuar == TRUE) {
             $this->albaran->fecha = $_POST['fecha'];
             $this->albaran->hora = $_POST['hora'];
         } else {
             $error = TRUE;
             $this->new_error_msg('La fecha seleccionada está fuere del rando del ejercicio ' . $this->albaran->codejercicio . '. Si deseas asignar la fecha ' . $_POST['fecha'] . ' pulsa <a href="' . $this->url() . '&forze_fecha=' . $_POST['fecha'] . '">aquí</a>' . ' y se asignará un nuevo código y un nuevo número al ' . FS_ALBARAN . '.');
         }
         /// ¿Cambiamos el proveedor?
         if ($_POST['proveedor'] != $this->albaran->codproveedor) {
             $proveedor = $this->proveedor->get($_POST['proveedor']);
             if ($proveedor) {
                 $this->albaran->codproveedor = $proveedor->codproveedor;
                 $this->albaran->nombre = $proveedor->razonsocial;
                 $this->albaran->cifnif = $proveedor->cifnif;
             } else {
                 die('No se ha encontrado el proveedor');
             }
         } else {
             $proveedor = $this->proveedor->get($this->albaran->codproveedor);
         }
         $serie = $this->serie->get($this->albaran->codserie);
         /// ¿cambiamos la serie?
         if ($_POST['serie'] != $this->albaran->codserie) {
             $serie2 = $this->serie->get($_POST['serie']);
             if ($serie2) {
                 $this->albaran->codserie = $serie2->codserie;
                 $this->albaran->irpf = $serie2->irpf;
                 $this->albaran->new_codigo();
                 $serie = $serie2;
             }
         }
         $this->albaran->codpago = $_POST['forma_pago'];
         /// ¿Cambiamos la divisa?
         if ($_POST['divisa'] != $this->albaran->coddivisa) {
             $divisa = $this->divisa->get($_POST['divisa']);
             if ($divisa) {
                 $this->albaran->coddivisa = $divisa->coddivisa;
                 $this->albaran->tasaconv = $divisa->tasaconv_compra;
             }
         } else {
             if ($_POST['tasaconv'] != '') {
                 $this->albaran->tasaconv = floatval($_POST['tasaconv']);
             }
         }
         if (isset($_POST['numlineas'])) {
             $numlineas = intval($_POST['numlineas']);
             $this->albaran->neto = 0;
             $this->albaran->totaliva = 0;
             $this->albaran->totalirpf = 0;
             $this->albaran->totalrecargo = 0;
             $lineas = $this->albaran->get_lineas();
             $articulo = new articulo();
             /// eliminamos las líneas que no encontremos en el $_POST
             foreach ($lineas as $l) {
                 $encontrada = FALSE;
                 for ($num = 0; $num <= $numlineas; $num++) {
                     if (isset($_POST['idlinea_' . $num])) {
                         if ($l->idlinea == intval($_POST['idlinea_' . $num])) {
                             $encontrada = TRUE;
                             break;
                         }
                     }
                 }
                 if (!$encontrada) {
                     if ($l->delete()) {
                         /// actualizamos el stock
                         $art0 = $articulo->get($l->referencia);
                         if ($art0) {
                             $art0->sum_stock($this->albaran->codalmacen, 0 - $l->cantidad);
                         }
                         if ($art0) {
                             $inventario->inventario_agregar($this->albaran->codalmacen, $l->referencia, 0 - $l->cantidad, $l->pvpunitario);
                         }
                     } else {
                         $this->new_error_msg("¡Imposible eliminar la línea del artículo " . $l->referencia . "!");
                     }
                 }
             }
             /// modificamos y/o añadimos las demás líneas
             for ($num = 0; $num < $numlineas; $num++) {
                 $encontrada = FALSE;
                 if (isset($_POST['idlinea_' . $num])) {
                     foreach ($lineas as $k => $value) {
                         /// modificamos la línea
                         if ($value->idlinea == intval($_POST['idlinea_' . $num])) {
                             $encontrada = TRUE;
                             $cantidad_old = $value->cantidad;
                             $lineas[$k]->cantidad = floatval($_POST['cantidad_' . $num]);
                             $lineas[$k]->pvpunitario = floatval($_POST['pvp_' . $num]);
                             $lineas[$k]->dtopor = floatval($_POST['dto_' . $num]);
                             $lineas[$k]->pvpsindto = $value->cantidad * $value->pvpunitario;
                             $lineas[$k]->pvptotal = $value->cantidad * $value->pvpunitario * (100 - $value->dtopor) / 100;
                             $lineas[$k]->descripcion = $_POST['desc_' . $num];
                             if (isset($_POST['subcuenta_' . $num])) {
                                 $postot = strlen($_POST['subcuenta_' . $num]);
                                 $poscad = strpos($_POST['subcuenta_' . $num], '/');
                                 $posid = strpos($_POST['subcuenta_' . $num], '%');
                                 $subcuencod = substr($_POST['subcuenta_' . $num], 0, $poscad);
                                 $subcuendes = substr($_POST['subcuenta_' . $num], $poscad + 1, $posid - $postot);
                                 $idsubcuen = substr($_POST['subcuenta_' . $num], $posid + 1);
                                 $lineas[$k]->codsubcuenta = $subcuencod;
                                 $lineas[$k]->idsubcuenta = $idsubcuen;
                                 $lineas[$k]->subcuentadesc = $subcuendes;
                             }
                             $lineas[$k]->codimpuesto = NULL;
                             $lineas[$k]->iva = 0;
                             $lineas[$k]->recargo = 0;
                             $lineas[$k]->irpf = floatval($_POST['irpf_' . $num]);
                             if (!$serie->siniva and $proveedor->regimeniva != 'Exento') {
                                 $imp0 = $this->impuesto->get_by_iva($_POST['iva_' . $num]);
                                 if ($imp0) {
                                     $lineas[$k]->codimpuesto = $imp0->codimpuesto;
                                 }
                                 $lineas[$k]->iva = floatval($_POST['iva_' . $num]);
                                 $lineas[$k]->recargo = floatval($_POST['recargo_' . $num]);
                             }
                             if ($lineas[$k]->save()) {
                                 $this->albaran->neto += $value->pvptotal;
                                 $this->albaran->totaliva += $value->pvptotal * $value->iva / 100;
                                 $this->albaran->totalirpf += $value->pvptotal * $value->irpf / 100;
                                 $this->albaran->totalrecargo += $value->pvptotal * $value->recargo / 100;
                                 if ($lineas[$k]->cantidad != $cantidad_old) {
                                     /// actualizamos el stock
                                     $art0 = $articulo->get($value->referencia);
                                     if ($art0) {
                                         $art0->sum_stock($this->albaran->codalmacen, $lineas[$k]->cantidad - $cantidad_old);
                                     }
                                     if ($art0) {
                                         $inventario->inventario_agregar($this->albaran->codalmacen, $lineas[$k]->referencia, $lineas[$k]->cantidad - $cantidad_old, $lineas[$k]->pvpunitario);
                                     }
                                 }
                             } else {
                                 $this->new_error_msg("¡Imposible modificar la línea del artículo " . $value->referencia . "!");
                             }
                             break;
                         }
                     }
                     /// añadimos la línea
                     if (!$encontrada and intval($_POST['idlinea_' . $num]) == -1 and isset($_POST['referencia_' . $num])) {
                         $linea = new linea_albaran_proveedor();
                         $linea->idalbaran = $this->albaran->idalbaran;
                         $linea->descripcion = $_POST['desc_' . $num];
                         /*                     if( !$serie->siniva AND $proveedor->regimeniva != 'Exento' )
                                              {
                                                 $imp0 = $this->impuesto->get_by_iva($_POST['iva_'.$num]);
                                                 if($imp0)
                                                    $linea->codimpuesto = $imp0->codimpuesto;
                                                 
                                                 $linea->iva = floatval($_POST['iva_'.$num]);
                                                 $linea->recargo = floatval($_POST['recargo_'.$num]);
                                              }
                          */
                         $linea->irpf = floatval($_POST['irpf_' . $num]);
                         $linea->cantidad = floatval($_POST['cantidad_' . $num]);
                         $linea->pvpunitario = floatval($_POST['pvp_' . $num]);
                         $linea->dtopor = floatval($_POST['dto_' . $num]);
                         $linea->pvpsindto = $linea->cantidad * $linea->pvpunitario;
                         $linea->pvptotal = $linea->cantidad * $linea->pvpunitario * (100 - $linea->dtopor) / 100;
                         if ($_POST['subcuenta_' . $num] == '/%') {
                             $linea->codsubcuenta = NULL;
                             $linea->idsubcuenta = NULL;
                             $linea->subcuentadesc = NULL;
                         } else {
                             $postot = strlen($_POST['subcuenta_' . $num]);
                             $poscad = strpos($_POST['subcuenta_' . $num], '/');
                             $posid = strpos($_POST['subcuenta_' . $num], '%');
                             $subcuencod = substr($_POST['subcuenta_' . $num], 0, $poscad);
                             $subcuendes = substr($_POST['subcuenta_' . $num], $poscad + 1, $posid - $postot);
                             $idsubcuen = substr($_POST['subcuenta_' . $num], $posid + 1);
                             $linea->codsubcuenta = $subcuencod;
                             $linea->idsubcuenta = $idsubcuen;
                             $linea->subcuentadesc = $subcuendes;
                         }
                         $art0 = $articulo->get($_POST['referencia_' . $num]);
                         if ($art0) {
                             $linea->referencia = $art0->referencia;
                         }
                         if ($linea->save()) {
                             if ($art0) {
                                 /// actualizamos el stock
                                 $art0->sum_stock($this->albaran->codalmacen, $linea->cantidad);
                                 if ($art0) {
                                     $inventario->inventario_agregar($this->albaran->codalmacen, $linea->referencia, $linea->cantidad, $linea->pvpunitario);
                                 }
                             }
                             $this->albaran->neto += $linea->pvptotal;
                             $this->albaran->totaliva += $linea->pvptotal * $linea->iva / 100;
                             $this->albaran->totalirpf += $linea->pvptotal * $linea->irpf / 100;
                             $this->albaran->totalrecargo += $linea->pvptotal * $linea->recargo / 100;
                         } else {
                             $this->new_error_msg("¡Imposible guardar la línea del artículo " . $linea->referencia . "!");
                         }
                     }
                 }
             }
             /// redondeamos
             $this->albaran->neto = round($this->albaran->neto, FS_NF0);
             $this->albaran->totaliva = round($this->albaran->totaliva, FS_NF0);
             $this->albaran->totalirpf = round($this->albaran->totalirpf, FS_NF0);
             $this->albaran->totalrecargo = round($this->albaran->totalrecargo, FS_NF0);
             $this->albaran->total = $this->albaran->neto + $this->albaran->totaliva - $this->albaran->totalirpf + $this->albaran->totalrecargo;
             if (abs(floatval($_POST['atotal']) - $this->albaran->total) >= 0.02) {
                 $this->new_error_msg("El total difiere entre el controlador y la vista (" . $this->albaran->total . " frente a " . $_POST['atotal'] . "). Debes informar del error.");
             }
         }
     }
     if ($this->albaran->save()) {
         if (!$error) {
             $this->new_message(ucfirst(FS_ALBARAN) . " modificado correctamente.");
         }
         $this->new_change(ucfirst(FS_ALBARAN) . ' Proveedor ' . $this->albaran->codigo, $this->albaran->url());
     } else {
         $this->new_error_msg("¡Imposible modificar el " . FS_ALBARAN . "!");
     }
 }
 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!");
         }
     }
 }
 public function boton_restab_anulada($idfactura)
 {
     $factura = new factura_proveedor();
     $fact = $factura->get($idfactura);
     if ($fact) {
         /// ¿Descontamos stock?
         $art0 = new articulo();
         $inventario = new inventario();
         foreach ($fact->get_lineas() as $linea) {
             if (is_null($linea->idalbaran)) {
                 $articulo = $art0->get($linea->referencia);
                 if ($articulo) {
                     $articulo->sum_stock($fact->codalmacen, $linea->cantidad, TRUE);
                     $inventario->inventario_agregar($fact->codalmacen, $linea->referencia, $linea->cantidad, $linea->pvpunitario);
                 }
             }
         }
         $sql = "UPDATE facturasprov SET idpagodevol = '0'   WHERE idfactura = " . $_GET['id'] . ";";
         if ($this->db->exec($sql)) {
             $this->idfactura = $this->db->lastval();
             return TRUE;
         } else {
             return FALSE;
         }
     } else {
         $this->new_error_msg("Factura no encontrada.");
     }
 }
 public function boton_anular($idfactura)
 {
     $factura = new factura_cliente();
     $fact = $factura->get($idfactura);
     if ($fact) {
         /// ¿Sumamos stock?
         $art0 = new articulo();
         $inventario = new inventario();
         foreach ($fact->get_lineas() as $linea) {
             if (is_null($linea->idalbaran)) {
                 $articulo = $art0->get($linea->referencia);
                 if ($articulo) {
                     $articulo->sum_stock($fact->codalmacen, $linea->cantidad);
                     $inventario->inventario_agregar($fact->codalmacen, $linea->referencia, $linea->cantidad, $linea->pvpunitario);
                 }
             }
         }
         $sql = "UPDATE " . $this->table_name . " SET idpagodevol = '1'   WHERE idfactura = " . $this->var2str($idfactura) . ";";
         if ($this->db->exec($sql)) {
             $this->idfactura = $this->db->lastval();
             return TRUE;
         } else {
             return FALSE;
         }
     } else {
         $this->new_error_msg("Factura no encontrada.");
     }
 }
 private function nueva_factura_cliente()
 {
     $continuar = TRUE;
     $cliente = $this->cliente->get($_POST['cliente']);
     if ($cliente) {
         $this->save_codcliente($cliente->codcliente);
     } else {
         $this->new_error_msg('Cliente 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_cliente();
     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->codalmacen = $almacen->codalmacen;
         $factura->codejercicio = $ejercicio->codejercicio;
         $factura->codserie = $serie->codserie;
         $factura->codpago = $forma_pago->codpago;
         $factura->coddivisa = $divisa->coddivisa;
         $factura->tasaconv = $divisa->tasaconv;
         if ($_POST['tasaconv'] != '') {
             $factura->tasaconv = floatval($_POST['tasaconv']);
         }
         $factura->codagente = $this->agente->codagente;
         $factura->observaciones = $_POST['observaciones'];
         $factura->numero2 = $_POST['numero2'];
         $factura->irpf = $serie->irpf;
         $factura->porcomision = $this->agente->porcomision;
         if ($forma_pago->genrecibos == 'Pagados') {
             $factura->pagada = TRUE;
         }
         $factura->vencimiento = Date('d-m-Y', strtotime($factura->fecha . ' ' . $forma_pago->vencimiento));
         $factura->codcliente = $cliente->codcliente;
         $factura->cifnif = $cliente->cifnif;
         $factura->nombrecliente = $cliente->razonsocial;
         $factura->ciudad = $_POST['ciudad'];
         $factura->codpais = $_POST['codpais'];
         $factura->codpostal = $_POST['codpostal'];
         $factura->direccion = $_POST['direccion'];
         $factura->provincia = $_POST['provincia'];
         if ($factura->save()) {
             $inventario = new inventario();
             $art0 = new articulo();
             $n = floatval($_POST['numlineas']);
             for ($i = 0; $i <= $n; $i++) {
                 if (isset($_POST['referencia_' . $i])) {
                     $linea = new linea_factura_cliente();
                     $linea->idfactura = $factura->idfactura;
                     $linea->descripcion = $_POST['desc_' . $i];
                     if (!$serie->siniva and $cliente->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 and isset($_POST['stock'])) {
                             /// descontamos del stock
                             $articulo->sum_stock($factura->codalmacen, 0 - $linea->cantidad);
                             $inventario->inventario_agregar($factura->codalmacen, $linea->referencia, 0 - $linea->cantidad, $linea->pvpunitario);
                         }
                         $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) {
                 /// 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 la vista y el controlador (" . $_POST['atotal'] . " frente a " . $factura->total . "). 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 Cliente ' . $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 nueva_factura_cliente()
 {
     $continuar = TRUE;
     $inventario = new inventario();
     $ejercicio = $this->ejercicio->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->save_codserie($serie->codserie);
     } else {
         $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 (isset($_POST['imprimir_desc'])) {
         $this->imprimir_descripciones = TRUE;
         setcookie('imprimir_desc', TRUE, time() + FS_COOKIES_EXPIRE);
     } else {
         $this->imprimir_descripciones = FALSE;
         setcookie('imprimir_desc', FALSE, time() - FS_COOKIES_EXPIRE);
     }
     if (isset($_POST['imprimir_obs'])) {
         $this->imprimir_observaciones = TRUE;
         setcookie('imprimir_obs', TRUE, time() + FS_COOKIES_EXPIRE);
     } else {
         $this->imprimir_observaciones = FALSE;
         setcookie('imprimir_obs', FALSE, time() - FS_COOKIES_EXPIRE);
     }
     $factura = new factura_cliente();
     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->codalmacen = $_POST['almacen'];
         $factura->codejercicio = $ejercicio->codejercicio;
         $factura->codserie = $serie->codserie;
         $factura->codpago = $forma_pago->codpago;
         $factura->coddivisa = $divisa->coddivisa;
         $factura->tasaconv = $divisa->tasaconv;
         if ($_POST['tasaconv'] != '') {
             $factura->tasaconv = floatval($_POST['tasaconv']);
         }
         $factura->codagente = $this->agente->codagente;
         $factura->observaciones = $_POST['observaciones'];
         $factura->numero2 = $_POST['numero2'];
         $factura->irpf = $serie->irpf;
         $factura->porcomision = $this->agente->porcomision;
         if ($forma_pago->genrecibos == 'Pagados') {
             $factura->pagada = TRUE;
         }
         $factura->vencimiento = Date('d-m-Y', strtotime($factura->fecha . ' ' . $forma_pago->vencimiento));
         foreach ($this->cliente_s->get_direcciones() as $d) {
             if ($d->domfacturacion) {
                 $factura->codcliente = $this->cliente_s->codcliente;
                 $factura->cifnif = $this->cliente_s->cifnif;
                 $factura->nombrecliente = $this->cliente_s->razonsocial;
                 $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->codcliente)) {
             $this->new_error_msg("No hay ninguna dirección asociada al cliente.");
         } else {
             if ($factura->save()) {
                 $n = floatval($_POST['numlineas']);
                 for ($i = 1; $i <= $n; $i++) {
                     if (isset($_POST['referencia_' . $i])) {
                         $articulo = $this->articulo->get($_POST['referencia_' . $i]);
                         if ($articulo) {
                             $linea = new linea_factura_cliente();
                             $linea->idfactura = $factura->idfactura;
                             $linea->referencia = $articulo->referencia;
                             $linea->descripcion = $_POST['desc_' . $i];
                             if (!$serie->siniva or $this->cliente_s->regimeniva != 'Exento') {
                                 $linea->codimpuesto = $articulo->codimpuesto;
                                 $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]);
                             if ($linea->save()) {
                                 /// descontamos del stock
                                 $articulo->sum_stock($factura->codalmacen, 0 - $linea->cantidad);
                                 $inventario->inventario_agregar($factura->codalmacen, $linea->referencia, 0 - $linea->cantidad, $linea->pvpunitario);
                                 $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['tpv_total2']) - $factura->total) >= 0.02) {
                         $this->new_error_msg("El total difiere entre la vista y el controlador (" . $_POST['tpv_total2'] . " frente a " . $factura->total . "). Debes informar del error.");
                         $factura->delete();
                     } else {
                         if ($factura->save()) {
                             $this->new_message("<a href='" . $factura->url() . "'>Factura</a> guardada correctamente.");
                             $this->generar_asiento($factura);
                             if ($_POST['regalo'] == 'TRUE') {
                                 $this->imprimir_ticket_regalo($factura);
                             } else {
                                 $this->imprimir_ticket($factura, floatval($_POST['num_tickets']));
                             }
                             $this->caja->sumar_importe($factura->total);
                         } 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!");
             }
         }
     }
 }