protected function private_core()
 {
     /// ¿El usuario tiene permiso para eliminar en esta página?
     $this->allow_delete = $this->user->allow_delete_on(__CLASS__);
     $almacen = new almacen();
     $this->almacenes = $almacen->all();
     $articulo = new articulo();
     $this->familia = new familia();
     $this->fabricante = new fabricante();
     $this->impuesto = new impuesto();
     $this->tarifa = new tarifa();
     $this->transferencia_stock = new transferencia_stock();
     /**
      * Si hay alguna extensión de tipo config y texto no_tab_tarifas,
      * desactivamos la pestaña tarifas.
      */
     $this->mostrar_tab_tarifas = TRUE;
     foreach ($this->extensions as $ext) {
         if ($ext->type == 'config' and $ext->text == 'no_tab_tarifas') {
             $this->mostrar_tab_tarifas = FALSE;
             break;
         }
     }
     if (isset($_POST['codtarifa'])) {
         /// crear/editar tarifa
         $tar0 = $this->tarifa->get($_POST['codtarifa']);
         if (!$tar0) {
             $tar0 = new tarifa();
             $tar0->codtarifa = $_POST['codtarifa'];
         }
         $tar0->nombre = $_POST['nombre'];
         $tar0->aplicar_a = $_POST['aplicar_a'];
         $tar0->set_x(floatval($_POST['dtopor']));
         $tar0->set_y(floatval($_POST['inclineal']));
         $tar0->mincoste = isset($_POST['mincoste']);
         $tar0->maxpvp = isset($_POST['maxpvp']);
         if ($tar0->save()) {
             $this->new_message("Tarifa guardada correctamente.");
         } else {
             $this->new_error_msg("¡Imposible guardar la tarifa!");
         }
     } else {
         if (isset($_GET['delete_tarifa'])) {
             /// eliminar tarifa
             $tar0 = $this->tarifa->get($_GET['delete_tarifa']);
             if ($tar0) {
                 if ($tar0->delete()) {
                     $this->new_message("Tarifa " . $tar0->codtarifa . " eliminada correctamente.", TRUE);
                 } else {
                     $this->new_error_msg("¡Imposible eliminar la tarifa!");
                 }
             } else {
                 $this->new_error_msg("¡La tarifa no existe!");
             }
         } else {
             if (isset($_POST['referencia']) and isset($_POST['codfamilia']) and isset($_POST['codimpuesto'])) {
                 /// nuevo artículo
                 $this->save_codimpuesto($_POST['codimpuesto']);
                 $art0 = $articulo->get($_POST['referencia']);
                 if ($art0) {
                     $this->new_error_msg('Ya existe el artículo <a href="' . $art0->url() . '">' . $art0->referencia . '</a>');
                 } else {
                     if ($_POST['referencia'] == '') {
                         $articulo->referencia = $articulo->get_new_referencia();
                     } else {
                         $articulo->referencia = $_POST['referencia'];
                     }
                     $articulo->descripcion = $_POST['descripcion'];
                     $articulo->nostock = isset($_POST['nostock']);
                     if ($_POST['codfamilia'] != '') {
                         $articulo->codfamilia = $_POST['codfamilia'];
                     }
                     if ($_POST['codfabricante'] != '') {
                         $articulo->codfabricante = $_POST['codfabricante'];
                     }
                     $articulo->set_impuesto($_POST['codimpuesto']);
                     if (isset($_POST['coniva'])) {
                         $articulo->set_pvp_iva(floatval($_POST['pvp']));
                     } else {
                         $articulo->set_pvp(floatval($_POST['pvp']));
                     }
                     if ($articulo->save()) {
                         header('location: ' . $articulo->url());
                     } else {
                         $this->new_error_msg("¡Error al crear el articulo!");
                     }
                 }
             } else {
                 if (isset($_GET['delete'])) {
                     /// eliminar artículo
                     $art = $articulo->get($_GET['delete']);
                     if ($art) {
                         if ($art->delete()) {
                             $this->new_message("Articulo " . $art->referencia . " eliminado correctamente.", TRUE);
                         } else {
                             $this->new_error_msg("¡Error al eliminarl el articulo!");
                         }
                     }
                 } else {
                     if (isset($_POST['origen'])) {
                         /// nueva transferencia de stock
                         $this->transferencia_stock->usuario = $this->user->nick;
                         $this->transferencia_stock->codalmaorigen = $_POST['origen'];
                         $this->transferencia_stock->codalmadestino = $_POST['destino'];
                         if ($this->transferencia_stock->save()) {
                             $this->new_message('Datos guardados correctamente.');
                             header('Location: ' . $this->transferencia_stock->url());
                         } else {
                             $this->new_error_msg('Error al guardar los datos.');
                         }
                     } else {
                         if (isset($_GET['delete_transf'])) {
                             $transf = $this->transferencia_stock->get($_GET['delete_transf']);
                             if ($transf) {
                                 $ok = TRUE;
                                 /// eliminamos las líneas
                                 $ltf = new linea_transferencia_stock();
                                 foreach ($ltf->all_from_transferencia($transf->idtrans) as $lin) {
                                     if ($lin->delete()) {
                                         /// movemos el stock
                                         $art = $articulo->get($lin->referencia);
                                         if ($art) {
                                             $art->sum_stock($transf->codalmadestino, 0 - $lin->cantidad);
                                             $art->sum_stock($transf->codalmaorigen, $lin->cantidad);
                                         }
                                     } else {
                                         $this->new_error_msg('Error al eliminar la línea con referencia ' . $lin->referencia);
                                         $ok = FALSE;
                                     }
                                 }
                                 if ($ok) {
                                     if ($transf->delete()) {
                                         $this->new_message('Transferencia eliminada correctamente.');
                                     } else {
                                         $this->new_error_msg('Error al eliminar la transferencia.');
                                     }
                                 }
                             } else {
                                 $this->new_error_msg('Transferencia no encontrada.');
                             }
                         }
                     }
                 }
             }
         }
     }
     /// obtenemos los datos para la búsqueda
     $this->offset = 0;
     if (isset($_REQUEST['offset'])) {
         $this->offset = intval($_REQUEST['offset']);
     }
     $this->b_codalmacen = '';
     if (isset($_REQUEST['b_codalmacen'])) {
         $this->b_codalmacen = $_REQUEST['b_codalmacen'];
     }
     $this->b_codfamilia = '';
     if (isset($_REQUEST['b_codfamilia'])) {
         $this->b_codfamilia = $_REQUEST['b_codfamilia'];
     }
     $this->b_codfabricante = '';
     if (isset($_REQUEST['b_codfabricante'])) {
         $this->b_codfabricante = $_REQUEST['b_codfabricante'];
     }
     $this->b_constock = isset($_REQUEST['b_constock']);
     $this->b_bloqueados = isset($_REQUEST['b_bloqueados']);
     $this->b_publicos = isset($_REQUEST['b_publicos']);
     $this->b_codtarifa = '';
     if (isset($_REQUEST['b_codtarifa'])) {
         $this->b_codtarifa = $_REQUEST['b_codtarifa'];
         setcookie('b_codtarifa', $this->b_codtarifa, time() + FS_COOKIES_EXPIRE);
     } else {
         if (isset($_COOKIE['b_codtarifa'])) {
             $this->b_codtarifa = $_COOKIE['b_codtarifa'];
         }
     }
     $this->b_orden = 'refmin';
     if (isset($_REQUEST['b_orden'])) {
         $this->b_orden = $_REQUEST['b_orden'];
         setcookie('ventas_articulos_orden', $this->b_orden, time() + FS_COOKIES_EXPIRE);
     } else {
         if (isset($_COOKIE['ventas_articulos_orden'])) {
             $this->b_orden = $_COOKIE['ventas_articulos_orden'];
         }
     }
     $this->b_url = $this->url() . "&query=" . $this->query . "&b_codfabricante=" . $this->b_codfabricante . "&b_codalmacen=" . $this->b_codalmacen . "&b_codfamilia=" . $this->b_codfamilia . "&b_codtarifa=" . $this->b_codtarifa;
     if ($this->b_constock) {
         $this->b_url .= '&b_constock=TRUE';
     }
     if ($this->b_bloqueados) {
         $this->b_url .= '&b_bloqueados=TRUE';
     }
     if ($this->b_publicos) {
         $this->b_url .= '&b_publicos=TRUE';
     }
     $this->search_articulos();
 }
 private function modificar()
 {
     $this->transferencia->codalmaorigen = $_POST['codalmaorigen'];
     $this->transferencia->codalmadestino = $_POST['codalmadestino'];
     $this->transferencia->fecha = $_POST['fecha'];
     $this->transferencia->hora = $_POST['hora'];
     if ($this->transferencia->save()) {
         $ok = TRUE;
         $art0 = new articulo();
         $lin = new linea_transferencia_stock();
         $lineas = $lin->all_from_transferencia($this->transferencia->idtrans);
         $numlineas = floatval($_POST['numlineas']);
         /// eliminamos las líneas que ya no estén
         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()) {
                     /// movemos el stock
                     $articulo = $art0->get($l->referencia);
                     if ($articulo) {
                         $articulo->sum_stock($this->transferencia->codalmadestino, 0 - $l->cantidad);
                         $articulo->sum_stock($this->transferencia->codalmaorigen, $l->cantidad);
                     }
                 } else {
                     $this->new_error_msg("¡Imposible eliminar la línea del artículo " . $l->referencia . "!");
                 }
             }
         }
         /// añadimos las nuevas / modificamos las demás
         for ($i = 0; $i <= $numlineas; $i++) {
             if (isset($_POST['idlinea_' . $i])) {
                 $nlin = new linea_transferencia_stock();
                 $nlin->idtrans = $this->transferencia->idtrans;
                 foreach ($lineas as $l) {
                     if ($l->idlinea == intval($_POST['idlinea_' . $i])) {
                         $nlin = $l;
                         break;
                     }
                 }
                 $nlin->referencia = $_POST['referencia_' . $i];
                 $nlin->descripcion = $_POST['desc_' . $i];
                 $cantidad0 = $nlin->cantidad;
                 $nlin->cantidad = floatval($_POST['cantidad_' . $i]);
                 if ($nlin->save()) {
                     /// movemos el stock
                     $articulo = $art0->get($nlin->referencia);
                     if ($articulo) {
                         $articulo->sum_stock($this->transferencia->codalmaorigen, $cantidad0 - $nlin->cantidad);
                         $articulo->sum_stock($this->transferencia->codalmadestino, $nlin->cantidad - $cantidad0);
                     }
                 } else {
                     $this->new_error_msg('Error al guardar la línea para la referencia ' . $nlin->referencia);
                     $ok = FALSE;
                 }
             }
         }
         if ($ok) {
             $this->new_message('Datos guardados correctamente.');
         }
     } else {
         $this->new_error_msg('Error al guardar los datos.');
     }
 }