/** * 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."); } }