/**
  * Devuelve un array con los movimientos de stock del artículo.
  * @return type
  */
 public function get_movimientos()
 {
     $mlist = array();
     if (!isset($this->regularizaciones)) {
         $reg = new regularizacion_stock();
         $this->regularizaciones = $reg->all_from_articulo($this->articulo->referencia);
     }
     foreach ($this->regularizaciones as $reg) {
         $mlist[] = array('codalmacen' => $reg->codalmacendest, 'origen' => 'Regularización', 'url' => '#stock', 'movimiento' => '-', 'final' => $reg->cantidadfin, 'fecha' => $reg->fecha, 'hora' => $reg->hora);
     }
     /// nos guardamos la lista de tablas para agilizar
     $tablas = $this->db->list_tables();
     if ($this->db->table_exists('albaranesprov', $tablas) and $this->db->table_exists('lineasalbaranesprov', $tablas)) {
         /// buscamos el artículo en albaranes de compra
         $sql = "SELECT a.idalbaran,a.codigo,l.cantidad,a.fecha,a.hora,a.codalmacen\n            FROM albaranesprov a, lineasalbaranesprov l\n            WHERE a.idalbaran = l.idalbaran\n            AND l.referencia = " . $this->articulo->var2str($this->articulo->referencia);
         $data = $this->db->select_limit($sql, 500, 0);
         if ($data) {
             foreach ($data as $d) {
                 $mlist[] = array('codalmacen' => $d['codalmacen'], 'origen' => ucfirst(FS_ALBARAN) . ' compra ' . $d['codigo'], 'url' => 'index.php?page=compras_albaran&id=' . intval($d['idalbaran']), 'movimiento' => floatval($d['cantidad']), 'final' => 0, 'fecha' => date('d-m-Y', strtotime($d['fecha'])), 'hora' => date('H:i:s', strtotime($d['hora'])));
             }
         }
     }
     if ($this->db->table_exists('facturasprov', $tablas) and $this->db->table_exists('lineasfacturasprov', $tablas)) {
         /// buscamos el artículo en facturas de compra
         $sql = "SELECT f.idfactura,f.codigo,l.cantidad,f.fecha,f.hora,f.codalmacen\n            FROM facturasprov f, lineasfacturasprov l\n            WHERE f.idfactura = l.idfactura AND l.idalbaran IS NULL\n            AND l.referencia = " . $this->articulo->var2str($this->articulo->referencia);
         $data = $this->db->select_limit($sql, 500, 0);
         if ($data) {
             foreach ($data as $d) {
                 $mlist[] = array('codalmacen' => $d['codalmacen'], 'origen' => 'Factura compra ' . $d['codigo'], 'url' => 'index.php?page=compras_factura&id=' . intval($d['idfactura']), 'movimiento' => floatval($d['cantidad']), 'final' => 0, 'fecha' => date('d-m-Y', strtotime($d['fecha'])), 'hora' => date('H:i:s', strtotime($d['hora'])));
             }
         }
     }
     if ($this->db->table_exists('albaranescli', $tablas) and $this->db->table_exists('lineasalbaranescli', $tablas)) {
         /// buscamos el artículo en albaranes de venta
         $sql = "SELECT a.idalbaran,a.codigo,l.cantidad,a.fecha,a.hora,a.codalmacen\n            FROM albaranescli a, lineasalbaranescli l\n            WHERE a.idalbaran = l.idalbaran\n            AND l.referencia = " . $this->articulo->var2str($this->articulo->referencia);
         $data = $this->db->select_limit($sql, 500, 0);
         if ($data) {
             foreach ($data as $d) {
                 $mlist[] = array('codalmacen' => $d['codalmacen'], 'origen' => ucfirst(FS_ALBARAN) . ' venta ' . $d['codigo'], 'url' => 'index.php?page=ventas_albaran&id=' . intval($d['idalbaran']), 'movimiento' => 0 - floatval($d['cantidad']), 'final' => 0, 'fecha' => date('d-m-Y', strtotime($d['fecha'])), 'hora' => date('H:i:s', strtotime($d['hora'])));
             }
         }
     }
     if ($this->db->table_exists('facturascli', $tablas) and $this->db->table_exists('lineasfacturascli', $tablas)) {
         /// buscamos el artículo en facturas de venta
         $sql = "SELECT f.idfactura,f.codigo,l.cantidad,f.fecha,f.hora,f.codalmacen\n            FROM facturascli f, lineasfacturascli l\n            WHERE f.idfactura = l.idfactura AND l.idalbaran IS NULL\n            AND l.referencia = " . $this->articulo->var2str($this->articulo->referencia);
         $data = $this->db->select_limit($sql, 500, 0);
         if ($data) {
             foreach ($data as $d) {
                 $mlist[] = array('codalmacen' => $d['codalmacen'], 'origen' => 'Factura venta ' . $d['codigo'], 'url' => 'index.php?page=ventas_factura&id=' . intval($d['idfactura']), 'movimiento' => 0 - floatval($d['cantidad']), 'final' => 0, 'fecha' => date('d-m-Y', strtotime($d['fecha'])), 'hora' => date('H:i:s', strtotime($d['hora'])));
             }
         }
     }
     /// ordenamos por fecha y hora
     usort($mlist, function ($a, $b) {
         if (strtotime($a['fecha'] . ' ' . $a['hora']) == strtotime($b['fecha'] . ' ' . $b['hora'])) {
             return 0;
         } else {
             if (strtotime($a['fecha'] . ' ' . $a['hora']) < strtotime($b['fecha'] . ' ' . $b['hora'])) {
                 return -1;
             } else {
                 return 1;
             }
         }
     });
     /// recalculamos
     $inicial = 0;
     foreach (array_reverse($mlist) as $i => $value) {
         if ($value['movimiento'] == '-') {
             $inicial = $value['final'];
         } else {
             $inicial -= $value['movimiento'];
         }
     }
     $total = max(array($inicial, 0));
     foreach ($mlist as $i => $value) {
         if ($value['movimiento'] == '-') {
             $total = $value['final'];
         } else {
             $total += $value['movimiento'];
         }
         $mlist[$i]['final'] = $total;
     }
     return $mlist;
 }
 private function get_movimientos($ref, $desde = '', $hasta = '', $codagente = '')
 {
     $mlist = array();
     $regularizacion = new regularizacion_stock();
     foreach ($regularizacion->all_from_articulo($ref) as $reg) {
         $anyadir = TRUE;
         if ($desde != '') {
             if (strtotime($desde) > strtotime($reg->fecha)) {
                 $anyadir = FALSE;
             }
         }
         if ($hasta != '') {
             if (strtotime($hasta) < strtotime($reg->fecha)) {
                 $anyadir = FALSE;
             }
         }
         if ($anyadir) {
             $mlist[] = array('referencia' => $ref, 'codalmacen' => $reg->codalmacendest, 'origen' => 'Regularización', 'url' => 'index.php?page=ventas_articulo&ref=' . $ref, 'clipro' => '-', 'movimiento' => '-', 'precio' => 0, 'dto' => 0, 'final' => $reg->cantidadfin, 'fecha' => $reg->fecha, 'hora' => $reg->hora);
         }
     }
     /// forzamos la comprobación de las tablas de albaranes
     $albc = new albaran_cliente();
     $lin1 = new linea_albaran_cliente();
     $albp = new albaran_proveedor();
     $lin2 = new linea_albaran_proveedor();
     $sql_extra = '';
     if ($desde != '') {
         $sql_extra .= " AND fecha >= " . $this->empresa->var2str($desde);
     }
     if ($hasta != '') {
         $sql_extra .= " AND fecha <= " . $this->empresa->var2str($hasta);
     }
     if ($codagente != '') {
         $sql_extra .= " AND codagente = " . $this->empresa->var2str($codagente);
     }
     /// buscamos el artículo en albaranes de compra
     $sql = "SELECT a.codigo,l.cantidad,l.pvpunitario,l.dtopor,a.fecha,a.hora" . ",a.codalmacen,a.idalbaran,a.codproveedor,a.nombre" . " FROM albaranesprov a, lineasalbaranesprov l" . " WHERE a.idalbaran = l.idalbaran AND l.referencia = " . $albc->var2str($ref) . $sql_extra;
     $data = $this->db->select_limit($sql, 1000, 0);
     if ($data) {
         foreach ($data as $d) {
             $mlist[] = array('referencia' => $ref, 'codalmacen' => $d['codalmacen'], 'origen' => 'Albaran compra ' . $d['codigo'], 'url' => 'index.php?page=compras_albaran&id=' . $d['idalbaran'], 'clipro' => $d['codproveedor'] . ' - ' . $d['nombre'], 'movimiento' => floatval($d['cantidad']), 'precio' => floatval($d['pvpunitario']), 'dto' => floatval($d['dtopor']), 'final' => 0, 'fecha' => date('d-m-Y', strtotime($d['fecha'])), 'hora' => $d['hora']);
         }
     }
     /// buscamos el artículo en facturas de compra
     $sql = "SELECT f.codigo,l.cantidad,l.pvpunitario,l.dtopor,f.fecha,f.hora" . ",f.codalmacen,f.idfactura,f.codproveedor,f.nombre" . " FROM facturasprov f, lineasfacturasprov l" . " WHERE f.idfactura = l.idfactura AND l.idalbaran IS NULL" . " AND l.referencia = " . $albc->var2str($ref) . $sql_extra;
     $data = $this->db->select_limit($sql, 1000, 0);
     if ($data) {
         foreach ($data as $d) {
             $mlist[] = array('referencia' => $ref, 'codalmacen' => $d['codalmacen'], 'origen' => 'Factura compra ' . $d['codigo'], 'url' => 'index.php?page=compras_factura&id=' . $d['idfactura'], 'clipro' => $d['codproveedor'] . ' - ' . $d['nombre'], 'movimiento' => floatval($d['cantidad']), 'precio' => floatval($d['pvpunitario']), 'dto' => floatval($d['dtopor']), 'final' => 0, 'fecha' => date('d-m-Y', strtotime($d['fecha'])), 'hora' => $d['hora']);
         }
     }
     /// buscamos el artículo en albaranes de venta
     $sql = "SELECT a.codigo,l.cantidad,l.pvpunitario,l.dtopor,a.fecha,a.hora" . ",a.codalmacen,a.idalbaran,a.codcliente,a.nombrecliente" . " FROM albaranescli a, lineasalbaranescli l" . " WHERE a.idalbaran = l.idalbaran AND l.referencia = " . $albc->var2str($ref) . $sql_extra;
     $data = $this->db->select_limit($sql, 1000, 0);
     if ($data) {
         foreach ($data as $d) {
             $mlist[] = array('referencia' => $ref, 'codalmacen' => $d['codalmacen'], 'origen' => 'Albaran venta ' . $d['codigo'], 'url' => 'index.php?page=ventas_albaran&id=' . $d['idalbaran'], 'clipro' => $d['codcliente'] . ' - ' . $d['nombrecliente'], 'movimiento' => 0 - floatval($d['cantidad']), 'precio' => floatval($d['pvpunitario']), 'dto' => floatval($d['dtopor']), 'final' => 0, 'fecha' => date('d-m-Y', strtotime($d['fecha'])), 'hora' => $d['hora']);
         }
     }
     /// buscamos el artículo en facturas de venta
     $sql = "SELECT f.codigo,l.cantidad,l.pvpunitario,l.dtopor,f.fecha,f.hora" . ",f.codalmacen,f.idfactura,f.codcliente,f.nombrecliente" . " FROM facturascli f, lineasfacturascli l" . " WHERE f.idfactura = l.idfactura AND l.idalbaran IS NULL" . " AND l.referencia = " . $albc->var2str($ref) . $sql_extra;
     $data = $this->db->select_limit($sql, 1000, 0);
     if ($data) {
         foreach ($data as $d) {
             $mlist[] = array('referencia' => $ref, 'codalmacen' => $d['codalmacen'], 'origen' => 'Factura venta ' . $d['codigo'], 'url' => 'index.php?page=ventas_factura&id=' . $d['idfactura'], 'clipro' => $d['codcliente'] . ' - ' . $d['nombrecliente'], 'movimiento' => 0 - floatval($d['cantidad']), 'precio' => floatval($d['pvpunitario']), 'dto' => floatval($d['dtopor']), 'final' => 0, 'fecha' => date('d-m-Y', strtotime($d['fecha'])), 'hora' => $d['hora']);
         }
     }
     /// ordenamos por fecha y hora
     usort($mlist, function ($a, $b) {
         if (strtotime($a['fecha'] . ' ' . $a['hora']) == strtotime($b['fecha'] . ' ' . $b['hora'])) {
             return 0;
         } else {
             if (strtotime($a['fecha'] . ' ' . $a['hora']) < strtotime($b['fecha'] . ' ' . $b['hora'])) {
                 return -1;
             } else {
                 return 1;
             }
         }
     });
     /// recalculamos
     $inicial = 0;
     foreach (array_reverse($mlist) as $i => $value) {
         if ($value['movimiento'] == '-') {
             $inicial = $value['final'];
         } else {
             $inicial -= $value['movimiento'];
         }
     }
     $total = max(array($inicial, 0));
     foreach ($mlist as $i => $value) {
         if ($value['movimiento'] == '-') {
             $total = $value['final'];
         } else {
             $total += $value['movimiento'];
         }
         $mlist[$i]['final'] = $total;
     }
     return $mlist;
 }
 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.");
     }
 }