/** * 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; }
/** * Actualiza (incrementa o decrementa según el signo) las existencias del artículo, almacén, ubicación y lote * con los valores que recibe en el array $valores que tiene siete elementos: * * UM (unidad de medida origen), Reales, Pales, Cajas, Reservadas, Entrando, Deposito * * Si no existiese ninguna entrada en el registro de existencias para los valores recibidos, la crea. * * Si después de actualizar, las existencias se quedan a 0, se borra el registro. * * @param integer $idAlmacen id de almacén * @param integer $idArticulo id de artículo * @param integer $idLote id de lote * @param integer $idUbicacion id de la ubicación * @param integer $flagDeposito * @param array $valores array('UM',Reales','Pales','Cajas','Reservadas','Entrando') */ public function actualiza($idAlmacen, $idArticulo, $idLote, $idUbicacion, $flagDeposito, array $valores) { $condicion = "(IDAlmacen='{$idAlmacen}') AND (IDArticulo='{$idArticulo}') AND (IDLote='{$idLote}') AND (IDUbicacion='{$idUbicacion}') AND (EnDeposito='{$flagDeposito}')"; $rows = $this->cargaCondicion('*', $condicion); $this->setId($rows[0]['Id']); $this->load(); $articulo = new Articulos($idArticulo); // Si existe la entrada, la actualizo if (count($rows)) { $this->setReales($this->getReales() + $articulo->convertUnit($valores['UM'], 'UMA', $valores['Reales'], 6)); $this->setPales($this->getPales() + $valores['Pales']); $this->setCajas($this->getCajas() + $valores['Cajas']); $this->setReservadas($this->getReservadas() + $articulo->convertUnit($valores['UM'], 'UMA', $valores['Reservadas'], 6)); $this->setEntrando($this->getEntrando() + $articulo->convertUnit($valores['UM'], 'UMA', $valores['Entrando'], 6)); $this->save(); } else { // Si no existe, la creo $this->setIDAlmacen($idAlmacen); $this->setIDUbicacion($idUbicacion); $this->setIDArticulo($idArticulo); $this->setIDLote($idLote); $this->setReales($articulo->convertUnit($valores['UM'], 'UMA', $valores['Reales'], 6)); $this->setPales($valores['Pales']); $this->setCajas($valores['Cajas']); $this->setReservadas($articulo->convertUnit($valores['UM'], 'UMA', $valores['Reservadas'], 6)); $this->setEntrando($articulo->convertUnit($valores['UM'], 'UMA', $valores['Entrando'], 6)); $this->setEnDeposito($flagDeposito); $this->create(); } // Si despues de actualizar, todas las columnas de valores se han quedado a cero, borro el registro $haQuedado = $this->Reales + $this->Reservadas + $this->Entrando + $this->Pales + $this->Cajas; if ($haQuedado >= 0 and $haQuedado < 9.000000000000001E-5) { $this->erase(); } unset($articulo); }
/** * Genera un movimiento de almacén y actualiza el stock * * No se creará movimiento de almacén y por lo tanto tampoco se actualizarán existencias: * * * si el artículo no está sujeto a control de inventario * * * si el almacén está sujeto a control de ubicaciones y no se ha indicado ninguna * * * si el artículo está sujeto a control de trazabilidad y no se ha indicado ningún lote * * * si no hay existencias suficientes y el artículo bloquea stock * * @param string $documento El literal que identifica el controlador que provoca el movimiento * @param string $signo El signo que tendrá el movimiento (E = Entrada, S = Salida) * @param integer $idDocumento El id del documento que provoca el movimiento (albaran, pedido, traspaso, inventario, etc) * @param integer $idAlmacen El id del almacén * @param integer $idArticulo El id del articulo * @param integer $idLote El id del lote * @param integer $idUbicacion El id de la ubicacion * @param integer $flagDeposito Indica si el movimineto se ha de realizar contra stock de deposito o no (0, 1) * @param array $valores Array con los valores a actualizar * @return boolean Si el artículo no está sujeto a inventario devuelve TRUE, en caso contrario devuelve TRUE o FALSE dependiendo del éxito de la operación */ public function genera($documento, $signo, $idDocumento, $idAlmacen, $idArticulo, $idLote, $idUbicacion, $flagDeposito, array $valores) { $ok = false; $articulo = new Articulos($idArticulo); // Si el artículo está sujeto a inventario if ($articulo->getInventario()->getIDTipo()) { $tipoMvto = new TiposMvtosAlmacen(); $row = $tipoMvto->cargaCondicion("Id,Signo", "TipoDocumento='{$documento}' and Signo='{$signo}'"); unset($tipoMvto); $idTipo = $row[0]['Id']; $signo = $row[0]['Signo']; if ($signo) { if ($valores['UM'] == '') { $valores['UM'] = 'UMA'; } $this->setIDTipo($idTipo); $this->setIDAlmacen($idAlmacen); $this->setIDArticulo($idArticulo); $this->setIDLote($idLote); $this->setIDUbicacion($idUbicacion); $this->setIDDocumento($idDocumento); switch ($signo) { case 'E': $this->setUnidadesE($articulo->convertUnit($valores['UM'], 'UMA', $valores['Reales'])); $this->setPalesE($valores['Pales']); $this->setCajasE($valores['Cajas']); break; case 'S': $this->setUnidadesS($articulo->convertUnit($valores['UM'], 'UMA', $valores['Reales'])); $this->setPalesS($valores['Pales']); $this->setCajasS($valores['Cajas']); break; } if ($this->validaMovimiento($signo)) { if (parent::create()) { if ($signo == 'S') { $valores['Reales'] = -1 * $valores['Reales']; $valores['Pales'] = -1 * $valores['Pales']; $valores['Cajas'] = -1 * $valores['Cajas']; } $ok = true; $exi = new Existencias(); $exi->actualiza($idAlmacen, $idArticulo, $idLote, $idUbicacion, $flagDeposito, $valores); $this->_errores = $exi->getErrores(); unset($exi); } else { print_r($this->_errores); } } else { print_r($this->_errores); } } else { "NO SE HA DEFINIDIO EL TIPO DE MOVIMIENTO DE ALMACEN"; } } else { $ok = true; } unset($articulo); return $ok; }