public function listAction($idArticuloOrigen = '') { if ($idArticuloOrigen == '') { $idArticuloOrigen = $this->request[2]; } $articulo = new ArticulosEscandallos(); $rows = $articulo->cargaCondicion("*", "IDArticuloOrigen='{$idArticuloOrigen}' and IDArticuloDestino>0", "Id ASC"); $totales = $articulo->cargaCondicion("*", "IDArticuloOrigen='{$idArticuloOrigen}' and IDArticuloDestino=0"); unset($articulo); $escandallo[] = new ArticulosEscandallos(); foreach ($rows as $row) { $escandallo[] = new ArticulosEscandallos($row['Id']); } $this->values['articulos'] = $escandallo; if ($totales[0]['Id']) { $this->values['totales'] = new ArticulosEscandallos($totales[0]['Id']); } $this->values['IDArticuloOrigen'] = $idArticuloOrigen; $this->values['articuloOrigen'] = new Articulos($idArticuloOrigen); // Si hay existencias del articulo origen, no permito cambiar su escandallo $existencias = new Existencias(); $this->values['bloqueo'] = $existencias->hayRegistroExistencias($idArticuloOrigen); unset($existencias); return array('template' => $this->entity . '/index.html.twig', 'values' => $this->values); }
/** * Valida que la cantidad indicada esté disponible en * el almacén, ubicación y lote * * @return boolean */ public function validaLogico() { parent::validaLogico(); $articulo = new Articulos($this->IDArticulo); $bloqueoStock = $articulo->getBloqueoStock()->getIDTIpo() == '1'; if ($this->Unidades == 0) { $this->_errores[] = "Debe indicar una cantidad distinta a cero"; } $almacen = new Almacenes($this->IDAlmacen); //print_r($this); if ($almacen->getControlUbicaciones()->getIDTipo() == '1' and $this->IDUbicacion == 0) { $this->_errores[] = "Debe indicar la ubicación"; } unset($almacen); if ($bloqueoStock) { $udadMedidaVenta = $articulo->getUMV(); $udadMedidaAlmacen = $articulo->getUMA(); $stock = new Existencias(); $existencias = $stock->getStock($this->IDArticulo, $this->IDAlmacen, $this->IDLote, $this->IDUbicacion); unset($stock); // Calcular las cantidades de ese articulo, almacen, lote y ubicación que estan // en lineas de expediciones sin estar expedidas aún. O sea lo que está en // proceso de expedición. No tengo en cuenta los valores de la BD de la línea actual // porque puede que hayan cambiado. $filtro = "IDLinea<>'{$this->IDLinea}' and Expedida='0' and IDAlmacen='{$this->IDAlmacen}' and IDLote='{$this->IDLote}' and IDUbicacion='{$this->IDUbicacion}'"; $expedicion = new Expediciones(); $rows = $expedicion->cargaCondicion("sum(Unidades) as Unidades,sum(Pales) as Pales,sum(Cajas) as Cajas", $filtro); $row = $rows[0]; $row['Unidades'] += $this->Unidades; $row['Pales'] += $this->Pales; $row['Cajas'] += $this->Cajas; unset($expedicion); if ($existencias['DI'] < $articulo->convertUnit('UMV', 'UMA', $row['Unidades'])) { $this->_errores[] = "Hay " . round($articulo->convertUnit('UMA', 'UMV', $existencias['DI']), 2) . " {$udadMedidaVenta} (" . round($existencias['DI'], 2) . " {$udadMedidaAlmacen}) disponibles para ese lote y ubicación"; } if ($existencias['CA'] < $row['Cajas']) { $this->_errores[] = "Hay {$existencias['CA']} cajas disponibles para ese lote y ubicacion"; } if ($existencias['PT'] < $row['Pales']) { $this->_errores[] = "Hay {$existencias['PT']} pales disponibles para ese lote y ubicacion"; } } unset($articulo); return count($this->_errores) == 0; }
/** * Descatalogar los lotes (poner no vigentes) que no tengan existencias * entre todos los almacenes de la empresa */ public function DescatalogarAction() { if ($this->values['permisos']['permisosModulo']['UP']) { $lote = new Lotes(); $tablaLotes = $lote->getDataBaseName() . "." . $lote->getTableName(); $existencias = new Existencias(); $tablaExistencias = $existencias->getDataBaseName() . "." . $existencias->getTableName(); unset($existencias); $em = new EntityManager($lote->getConectionName()); if ($em->getDbLink()) { $query = "\n UPDATE {$tablaLotes} SET Vigente='0'\n WHERE IDLote not in (\n SELECT IDLote\n FROM {$tablaExistencias} e\n WHERE (\n IDLote>0 AND\n (\n Reales>0 OR\n Reservadas>0 OR\n Entrando>0\n )\n )\n GROUP BY IDLote\n ORDER BY IDLote\n );"; $em->query($query); $em->desConecta(); } unset($lote); return $this->indexAction(); } else { return array('template' => '_global/forbiden.html.twig'); } }
/** * Cierra el inventario. * * Consiste en generar los movimientos de almacén necesarios * para dejar las existencias de cada articulo/lote/ubicación * según lo indicado en las líneas de inventario */ public function cierra() { $ok = true; // Si no está cerrado if ($this->Cerrado == 0) { $lineas = new InventariosLineas(); $rows = $lineas->cargaCondicion("*", "IDInventario='{$this->IDInventario}'"); unset($lineas); $exi = new Existencias(); foreach ($rows as $row) { // Buscar la existencias que hay para calcular el mvto // de almacén de tal forma que se queden como dice el inventario $stock = $exi->cargaCondicion("*", "IDAlmacen='{$this->IDAlmacen}' and IDArticulo='{$row['IDArticulo']}' and IDLote='{$row['IDLote']}' and IDUbicacion='{$row['IDUbicacion']}'"); $valores = array('UM' => 'UMA', 'Reales' => $row['Stock'] - $stock[0]['Reales'], 'Pales' => $row['Pales'] - $stock[0]['Pales'], 'Cajas' => $row['Cajas'] - $stock[0]['Cajas'], 'Reservadas' => 0, 'Entrando' => 0); /** if ($valores['Reales']>=0) $signo = "E"; else { $signo = "S"; $valores['Reales'] = abs($valores['Reales']); } */ $signo = "E"; $mvtoAlmacen = new MvtosAlmacen(); $ok = $mvtoAlmacen->genera('InventariosCab', $signo, $this->IDInventario, $this->IDAlmacen, $row['IDArticulo'], $row['IDLote'], $row['IDUbicacion'], 0, $valores); // Valores con los que actualizar } unset($exi); unset($mvtoAlmacen); // Marcar el inventario como cerrado if ($ok) { $this->setCerrado(1); $this->save(); } } return $ok; }
/** * Recepciona la línea de pedido. * Pasa las existencias del estado "Entrando" (1) al estado "Recepionada" (2) * y marca la línea como Recepcionada. * * Las unidades recibidas pueden ser diferentes a las pedidas. * * Recalcula los precios (Pvd,Pmc,Margen,Pvp) del artículo en base a las unidades recepcionadas * * @return boolean */ public function recepciona() { $ok = true; $articulo = new Articulos($this->IDArticulo); $esInventariable = $articulo->getInventario()->getIDTipo(); if ($esInventariable) { // Quitar 'entrando' $exi = new Existencias(); $ok = $exi->quitaEntrando($this->IDAlmacen, $this->IDArticulo, $this->Unidades, $this->UnidadMedida); unset($exi); } if ($esInventariable and $ok) { // Recepcionar las líneas de recepción de la línea de pedido $recepcion = new Recepciones(); $unidadesNetas = $recepcion->recepciona("PedidosCab", $this->IDLinea); unset($recepcion); } else { $unidadesNetas = $this->Unidades; } if ($ok) { // Marcar la línea de pedido como recepcionada y // Poner las unidades netas recibidas y las unidades pendientes de facturar // Recalcular la línea de pedido en base a las Unidades Recibidas // Actualiza los precios del artículo $this->setIDEstado(2); $this->setUnidadesRecibidas($unidadesNetas); $this->setUnidadesPtesFacturar($unidadesNetas); $this->setImporte($unidadesNetas * $this->Precio * (1 - $this->Descuento / 100)); if ($unidadesNetas != 0) { $articulo = new Articulos($this->IDArticulo); $articulo->actualizaPrecios($unidadesNetas, abs($this->Importe / $unidadesNetas)); unset($articulo); } $this->save(); } return $ok; }
/** * Devuelve el registro de existencias del artículo para cada almacén * @return array */ public function getExistencias() { $array = array(); $existencias = new Existencias(); $tablaExistencias = $existencias->getDataBaseName() . "." . $existencias->getTableName(); $almacenes = new Almacenes(); $tablaAlmacenes = $almacenes->getDataBaseName() . "." . $almacenes->getTableName(); $em = new EntityManager($this->getConectionName()); if ($em->getDbLink()) { $query = "select\n a.Nombre,\n sum(e.Reales) as Reales,\n sum(e.Pales) as Pales,\n sum(e.Cajas) as Cajas,\n sum(e.Reservadas) as Reservadas,\n sum(e.Entrando) as Entrando\n from\n {$tablaExistencias} as e\n left join {$tablaAlmacenes} as a on e.IDAlmacen=a.IDAlmacen\n where\n e.IDArticulo='{$this->IDArticulo}'\n group by a.Nombre\n order by a.Nombre ASC"; $em->query($query); $array = $em->fetchResult(); $em->desConecta(); } unset($em); return $array; }
/** * Expide la linea de elaboracion de tipo 0 (la de envío) * Actualiza las existencias y marca la línea como expedida. * * NO SE REALIZA NINGUN TRATAMIENTO CON LAS EXISTENCIAS SI EL ARTICULO NO ES INVENTARIABLE * * @return boolean */ public function expide() { $ok = true; $articulo = new Articulos($this->IDArticulo); $esInventariable = $articulo->getInventario()->getIDTipo(); if ($esInventariable) { // Quitar la reserva de mercancía $exi = new Existencias(); $ok = $exi->quitaReserva($this->IDAlmacen, $this->IDArticulo, $this->Unidades, $this->UnidadMedida); unset($exi); } if ($esInventariable and $ok) { // Expedir la línea de elaboración $expedicion = new Expediciones(); $unidadesNetas = $expedicion->expide("ManufacCab", $this->IDLinea); unset($expedicion); } else { $unidadesNetas = $this->Unidades; } if ($ok) { // Marcar la línea de elaboracion como expedida y // poner las unidades netas expedidas $this->setIDEstado(2); $this->setUnidades($unidadesNetas); $this->totalizaLinea(); $this->save(); } unset($articulo); return $ok; }
public function Existencias() { $nItems = 0; $nErrores = 0; $dbLink = mysql_connect("localhost", "root", "albatronic"); $query = "TRUNCATE {$this->dbDestino}.ErpExistencias"; mysql_query($query); $query = "select e.*,a.IDArticulo as id from {$this->dbOrigen}.existencias e left join {$this->dbDestino}.ErpArticulos a on e.IDArticulo=a.Codigo"; $result = mysql_query($query, $dbLink); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $e = new Existencias(); $e->setIDAlmacen($row['IDSucursal']); $e->setIDArticulo($row['id']); $e->setReales($row['Reales']); $e->setReservadas($row['Reservadas']); $e->setEntrando($row['Entrando']); $e->setMaximo($row['Maximo']); $e->setMinimo($row['Minimo']); $id = $e->create(); if (!$id) { $errores[] = $e->getErrores(); $nErrores++; } else { $e->setPrimaryKeyMD5(md5($id)); $e->save(); $nItems++; } } echo "Existencias {$nItems}<br/>"; if (count($errores)) { echo "<pre>"; print_r($errores); echo "</pre>"; } }
/** * Validaciones antes de actualizar o crear */ public function valida() { unset($this->_errores); if ($this->IDArticulo == '') { $this->_errores[] = "Debe indicar un código de artículo"; return count($this->_errores) == 0; } //Para tener disponibles los datos de la //cabecera del albaran $psto = new PstoCab($this->IDPsto); // Compruebo la existencia del artículo y que pertenezca a // la sucursal de la cabecera del albaran. $articulo = new Articulos($this->IDArticulo); if ($articulo->getStatus() == 0) { $this->_errores[] = "El artículo indicado no existe o no pertenece a esta sucursal"; unset($articulo); } // Si existe el articulo ... if (count($this->_errores) == 0) { $aviso = $articulo->getAvisosPresupuestos(); if ($aviso) { $this->_alertas[] = $aviso; } // Si es version CRISTAL, comprueba multiplos y calcula medidas if ($_SESSION['ver'] == 1) { $this->checkMultiplos($articulo); } $this->checkPackingVentas($articulo); // Si la descripcion está vacia, pongo la del artículo // Si trae algo, la respeto. if ($this->Descripcion == '') { $this->setDescripcion($articulo->getDescripcion()); } // Si hay promo, ver si se aplica en base a la cantidad mínima. // Si es aplicable, prevalece sobre el precio y dcto indicado y tambien // sobre la tarifa del cliente. $precios = $articulo->cotizar($psto); if ($precios['Promocion']) { $alerta = "Promocion hasta el " . $precios['Promocion']->getFinPromocion() . " y compra mínima " . $precios['Promocion']->getCantidadMinima(); if ($precios['Promocion']->getIDFP()->getIDFP()) { $alerta .= " y forma de pago " . $precios['Promocion']->getIDFP(); } $this->_alertas[] = $alerta; } // Si hay promo, se aplica si se iguala o supera la cantidad mínima y si // no se restringe la forma de pago y en caso contrario la forma de pago // fijada para la promocion es igual a la del presupuesto if ($precios['Promocion'] and $this->getUnidades() >= $precios['Promocion']->getCantidadMinima() and (!$precios['Promocion']->getIDFP()->getIDFP() or $psto->getIDFP()->getIDFP() == $precios['Promocion']->getIDFP()->getIDFP())) { $this->IDPromocion = $precios['Promocion']->getIDPromocion(); $this->Precio = $precios['Promo']['Precio']; $this->Descuento = $precios['Promo']['Descuento']; } else { // Si no hay promo, se aplica la tarifa, o se respeta el precio y descuento // indicado por el usuario si tiene permiso dependiendo de si su rol está // incluido en el parámetro ROLCP $this->IDPromocion = 0; if ($this->Precio == '' or !$_SESSION['usuarioPortal']['cambioPrecios']) { $this->setPrecio($precios['Tarifa']['Precio']); } if ($this->Descuento == '' or !$_SESSION['usuarioPortal']['cambioPrecios']) { $this->setDescuento($precios['Tarifa']['Descuento']); } } // Totalizar la linea $this->totalizaLinea($articulo); //Comprobar que no se venda por debajo del costo if ($this->Importe < $this->ImporteCosto) { $this->_alertas[] = "Venta negativa"; } // Poner el mismo almacen y comercial de la cabecera del albarán $this->setIDAlmacen($psto->getIDAlmacen()->getIDAlmacen()); $this->setIDComercial($psto->getIDComercial()->getIDAgente()); $this->setIDAgente($_SESSION['usuarioPortal']['Id']); // Si el cliente no está sujeto a Iva, pongo a 0 el iva y el recargo if ($psto->getIDCliente()->getIva()->getIDTipo() == '0') { $this->setIva('0'); $this->setRecargo('0'); } else { // Si no se ha indicando iva, pongo el iva y recargo asociado al artículo, if ($this->Iva == '') { $this->setIva($articulo->getIDIva()->getIva()); if ($psto->getIDCliente()->getRecargoEqu()->getIDTipo() == '1') { $this->setRecargo($articulo->getIDIva()->getRecargo()); } else { $this->setRecargo('0'); } } } // Si el artículo es inventariable: // Comprobar existencias sin tener en cuenta lote ni ubicación // de almacen. Solo se buscan existencias en el almacen indicado // en la línea del albarán if ($articulo->getInventario()->getIDTipo() == '1') { $existencias = new Existencias(); $stock = $existencias->getStock($this->IDArticulo, $this->IDAlmacen); if ($stock['DI'] < $this->getUnidades()) { $this->_alertas[] = "Stock insuficiente"; $this->_alertas[] = "------------------"; } $this->_alertas[] = "Disponible: " . $stock['DI']; $this->_alertas[] = "Real: " . $stock['RE']; $this->_alertas[] = "Reservado: " . $stock['RV']; $this->_alertas[] = "Pte. Entrada: " . $stock['PE']; } } unset($articulo); unset($psto); unset($existencias); return count($this->_errores) == 0; }
private function recalcula($idAlmacen) { // Poner las reservadas y el entrando a cero $stock = new Existencias(); $stock->queryUpdate(array("Reservadas" => 0, "Entrando" => 0), "IDAlmacen='{$idAlmacen}'"); // Borrar los registros de stock que estén a cero $stock->queryDelete("IDAlmacen='{$idAlmacen}' and Reales=0 and Pales=0 and Cajas=0 and Reservadas=0 and Entrando=0"); // Calcular las reservas de los artículos inventariables $lineas = new AlbaranesLineas(); $articulos = new Articulos(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); unset($lineas); unset($articulos); $query = "select l.IDArticulo,a.Codigo,l.Descripcion, sum(l.Unidades) Unidades,l.UnidadMedida "; $query .= "from {$tablaLineas} as l "; $query .= "join {$tablaArticulos} as a on l.IDArticulo=a.IDArticulo "; $query .= "where l.IDEstado='1' and a.Inventario='1' "; $query .= "group by l.IDArticulo"; $em = new EntityManager($_SESSION['project']['conection']); $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); unset($em); $resultado['reservas'] = $rows; foreach ($rows as $row) { $stock = new Existencias(); $stock->hazReserva($idAlmacen, $row['IDArticulo'], $row['Unidades'], $row['UnidadMedida']); } // Calcular el entrando de los artículos inventariables $lineas = new PedidosLineas(); $articulos = new Articulos(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); unset($lineas); unset($articulos); $query = "select l.IDArticulo,a.Codigo,l.Descripcion,sum(l.Unidades) Unidades,l.UnidadMedida "; $query .= "from {$tablaLineas} as l "; $query .= "join {$tablaArticulos} as a on l.IDArticulo=a.IDArticulo "; $query .= "where l.IDEstado='1' and a.Inventario='1' "; $query .= "group by l.IDArticulo"; $em = new EntityManager($_SESSION['project']['conection']); $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); unset($em); $resultado['entrando'] = $rows; foreach ($rows as $row) { $stock = new Existencias(); $stock->hazEntrando($idAlmacen, $row['IDArticulo'], $row['Unidades'], $row['UnidadMedida']); } return $resultado; }
/** * Anula la confirmacion de la orden de traspaso, que consiste en: * * 1.- Quitar la reserva de mercancia en el registro de existencias sin indicar lote ni ubicacion * solo para aquellos artículos que estén sujetos a inventario * 2.- Poner la cabecera de la orden de traspaso y sus lineas en estado PTE. DE CONFIRMAR (0) * */ public function anulaConfirmacion() { // Si está confirmado if ($this->getIDEstado()->getIDTipo() == 1) { $em = new EntityManager($this->getConectionName()); $query = "SELECT t1.IDArticulo, t1.IDAlmacen, t1.Unidades, t1.UnidadMedida\n FROM {$this->_dataBaseName}.ErpTraspasosLineas as t1, ErpArticulos as t2\n WHERE t1.IDTraspaso='{$this->IDTraspaso}'\n AND t1.Tipo='0'\n AND t1.IDEstado='1'\n AND t1.IDArticulo=t2.IDArticulo\n AND t2.Inventario='1'"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); // Quitar las reservas $exi = new Existencias(); foreach ($rows as $row) { $exi->quitaReserva($row['IDAlmacen'], $row['IDArticulo'], $row['Unidades'], $row['UnidadMedida']); } unset($exi); // Poner en estado de PTE DE CONFIRMAR las líneas de la orden de traspaso de tipo 0 (salida) $lineas = new TraspasosLineas(); $lineas->queryUpdate(array("IDEstado" => 0), "IDTraspaso='{$this->IDTraspaso}' and IDEstado='1' and Tipo='0'"); unset($lineas); // Borrar las eventuales lineas de expedicion $expediciones = new Expediciones(); $expediciones->queryDelete("Entidad='TraspasosCab' and IDEntidad='{$this->IDTraspaso}'"); unset($expediciones); // Anular la reserva en la cabecera de la orden de traspaso $this->setIDEstado(0); $this->save(); } }
/** * Recepciona la línea de traspaso de tipo 1 (la de entrada) * Actualiza las existencias y marca la línea como expedida. * * NO SE REALIZA NINGUN TRATAMIENTO CON LAS EXISTENCIAS SI EL ARTICULO NO ES INVENTARIABLE * * @return boolean */ public function recepciona() { $ok = true; $articulo = new Articulos($this->IDArticulo); $esInventariable = $articulo->getInventario()->getIDTipo(); if ($esInventariable) { // Quitar 'entrando' $exi = new Existencias(); $ok = $exi->quitaEntrando($this->IDAlmacen, $this->IDArticulo, $this->Unidades, $this->UnidadMedida); unset($exi); } if ($esInventariable and $ok) { // Recepcionar las líneas de recepción de la línea de traspaso $recepcion = new Recepciones(); $unidadesNetas = $recepcion->recepciona("TraspasosCab", $this->IDLinea); unset($recepcion); } else { $unidadesNetas = $this->Unidades; } if ($ok) { // Marcar la línea de traspaso como recepcionada y // Poner las unidades netas recibidas // Recalcular la línea // Actualiza los precios del artículo $this->setIDEstado(3); $this->setUnidades($unidadesNetas); $this->TotalizaLinea(); if ($unidadesNetas != 0) { $articulo = new Articulos($this->IDArticulo); $articulo->actualizaPrecios($unidadesNetas, abs($this->Importe / $unidadesNetas)); unset($articulo); } $this->save(); } return $ok; }
/** * Anula la confirmación del pedido * Pasando del estado CONFIRMADO (1) a PTE. CONFIRMAR (0) * Solo se tienen en cuenta los artículos inventariables. * Anula del registro de existencias las cantidades pendientes de entrada */ public function anulaConfirmacion() { // Si está confirmado if ($this->getIDEstado()->getIDTipo() == 1) { $lineas = new PedidosLineas(); $tablaLineas = $lineas->getDataBaseName() . "." . $lineas->getTableName(); $articulos = new Articulos(); $tablaArticulos = $articulos->getDataBaseName() . "." . $articulos->getTableName(); $em = new EntityManager($this->getConectionName()); $query = "SELECT t1.IDArticulo, t1.IDAlmacen, sum(t1.Unidades) as Entrando, t1.UnidadMedida\n FROM {$tablaLineas} as t1, {$tablaArticulos} as t2\n WHERE t1.IDPedido='{$this->IDPedido}'\n AND t1.IDEstado='1'\n AND t1.IDArticulo=t2.IDArticulo\n AND t2.Inventario='1'\n GROUP BY t1.IDArticulo, t1.IDAlmacen, t1.UnidadMedida"; $em->query($query); $rows = $em->fetchResult(); $em->desConecta(); // Quitar previsión de entrada $exi = new Existencias(); foreach ($rows as $row) { $exi->quitaEntrando($row['IDAlmacen'], $row['IDArticulo'], $row['Entrando'], $row['UnidadMedida'], $this->Deposito); } unset($exi); // Marcar como NO CONFIRMADAS las líneas de pedido y // quitar la eventual asignación de lotes y UnidadesRecbidas $lineas->queryUpdate(array("IDEstado" => 0), "IDPedido='{$this->IDPedido}' and IDEstado='1'"); // Borrar las eventuales líneas de recepción $recepciones = new Recepciones(); $recepciones->queryDelete("Entidad='PedidosCab' and IDEntidad='{$this->IDPedido}'"); // Anular la reserva en la cabecera del pedido // y quitar la fecha prevista de entrega y las posibles incidencias $this->setIDEstado(0); $this->setFechaEntrega('00/00/0000'); $this->setIncidencias(''); $this->save(); } }
/** * Valida la idoneidad del movimiento. * * Chequea si se aplica o no la trazabilidad, la ubicacion y el bloqueo de stock * * @param char $signo El signo del movimiento (E=Entrada, S=Salida) * @return boolean */ private function validaMovimiento($signo) { $articulo = new Articulos($this->IDArticulo); $almacen = new Almacenes($this->IDAlmacen); $hayTrazabilidad = $articulo->getTrazabilidad()->getIDTipo(); $hayBloqueoStock = $articulo->getBloqueoStock()->getIDTipo(); $hayControlUbicaciones = $almacen->getControlUbicaciones()->getIDTipo(); if ($hayBloqueoStock) { $exi = new Existencias(); $stock = $exi->getStock($this->IDArticulo, $this->IDAlmacen, $this->IDLote, $this->IDUbicacion, '', 'UMA'); unset($exi); switch ($signo) { case 'S': $unidades = $this->UnidadesE + $this->UnidadesS; if ($unidades < 0) { $okBloqueoStock = true; } else { $okBloqueoStock = $stock['RE'] >= $unidades; } break; case 'E': $unidades = $this->UnidadesE + $this->UnidadesS; if ($unidades < 0) { $okBloqueoStock = $unidades + $stock['RE'] >= 0; } else { $okBloqueoStock = true; } break; } } else { $okBloqueoStock = true; } $okTrazabilidad = (!$hayTrazabilidad or $this->IDLote != 0); $okUbicacion = (!$hayControlUbicaciones or $this->IDUbicacion != 0); if (!$okBloqueoStock) { $this->_errores[] = "No hay stock suficiente para " . $articulo->getDescripcion(); } if (!$okTrazabilidad) { $this->_errores[] = "Debe indicar el lote para " . $articulo->getDescripcion(); } if (!$okUbicacion) { $this->_errores[] = "Debe indicar la ubicación para " . $articulo->getDescripcion(); } unset($articulo); unset($almacen); return count($this->_errores) == 0; }
/** * Preasigna stock sin control de trazabilidad ni de ubicación * * Si hay stock pero no es suficiente, se crea la línea de expedición proponiendo el que hay. * * Si NO hay stock: * * Caso 1) El artículo bloquea stock: no se crea la línea de expedición * Caso 2) El artículo NO bloquea stock: se crea la línea de expedición proponiendo 0 unidades * * @param AlbaranesLineas $lineaAlbaran * @param <type> $idRepartidor */ private function preasignaStock($entidad, $idEntidad, $linea, $idRepartidor = '') { echo "asdfasdfasdfasdfasdf"; $idLineaEntidad = $linea->getPrimaryKeyValue(); $articulo = $linea->getIDArticulo(); $idAlmacen = $linea->getIDAlmacen()->getIDAlmacen(); $unidades = $linea->getUnidades(); $unidadMedidaOrigen = $linea->getUnidadMedida(); $unidadesAlmacen = $articulo->convertUnit($unidadMedidaOrigen, 'UMA', $unidades); $bloqueoStock = $articulo->getBloqueoStock()->getIDTipo() == '1'; $exi = new Existencias(); $existencias = $exi->getStock($articulo->getIDArticulo(), $idAlmacen); unset($exi); if ($existencias['RE'] >= $unidadesAlmacen) { $asignado = $articulo->convertUnit('UMA', $unidadMedidaOrigen, $unidadesAlmacen); $stockInsuficiente = false; } else { $stockInsuficiente = true; $asignado = $articulo->convertUnit('UMA', $unidadMedidaOrigen, $existencias['RE']); } if ($asignado <= 0 and !$bloqueoStock) { $asignado = 0; } $lineaExpedicion = new Expediciones(); $lineaExpedicion->setEntidad($entidad); $lineaExpedicion->setIDEntidad($idEntidad); $lineaExpedicion->setIDLineaEntidad($idLineaEntidad); $lineaExpedicion->setIDAlmacen($idAlmacen); $lineaExpedicion->setIDAlmacenero($_SESSION['usuarioPortal']['Id']); $lineaExpedicion->setIDRepartidor($idRepartidor); $lineaExpedicion->setIDArticulo($articulo->getIDArticulo()); if ($existencias['RE'] > 0) { $asignado = $existencias['RE'] > $unidadesAlmacen ? $unidadesAlmacen : $existencias['RE']; } else { $asignado = 0; } $asignado = $articulo->convertUnit('UMA', $unidadMedidaOrigen, $asignado); $lineaExpedicion->setUnidades($asignado); $lineaExpedicion->setUnidadMedida($unidadMedidaOrigen); $lineaExpedicion->setIDLote(0); $lineaExpedicion->setIDUbicacion(0); $lineaExpedicion->setFlagTrazabilidad(0); $lineaExpedicion->setFlagUbicacion(0); $lineaExpedicion->setFlagSinStock($stockInsuficiente); $lineaExpedicion->create(); }
/** * Devuelve los artículos que son inventariables y están bajo mínimos * * @return type */ static function getRoturasStock() { $arti = new Articulos(); $tablaArticulos = $arti->getDataBaseName() . "." . $arti->getTableName(); $exi = new Existencias(); $tablaExistencias = $exi->getDataBaseName() . "." . $exi->getTableName(); $em = new EntityManager($arti->getConectionName()); if ($em->getDbLink()) { $query = "select a.Codigo,a.Descripcion,a.StockMinimo,sum(e.Reales) as sumaReales,sum(e.Reservadas) as sumaReservadas,sum(e.Entrando) as sumaEntrando,a.StockMinimo-sum(e.Reales-e.Reservadas+e.Entrando) as pedidoMinimo\n FROM {$tablaExistencias} as e left join {$tablaArticulos} as a on e.IDArticulo=a.IDArticulo\n WHERE (a.Inventario='1')\n GROUP BY e.IDArticulo\n HAVING ( (a.StockMinimo>0) and (sumaReales < a.StockMinimo) ) or (sumaReales<0)\n ORDER BY a.IDCategoria,a.Descripcion"; $em->query($query); $rows = $em->fetchResult(); } unset($em); unset($arti); unset($exi); return $rows; }