/** * *Envia productos fuera del almacen. Ya sea que sea un traspaso de un alamcen a otro o por motivos de inventarios fisicos. * * @param id_lote int Id del lote de donde se descontaran los productos. * @param productos json Objeto que contendra los ids de los productos que seran sacados del alamcen con sus cantidades y sus unidades * @param motivo string Motivo de la salida del producto * @return id_salida_lote int ID de la salida del producto **/ static function SalidaLote($id_lote, $productos, $motivo = null) { if (is_null(LoteDAO::getByPK($id_lote))) { throw new InvalidDataException("este lote no existe"); } if (!is_array($productos)) { throw new InvalidDataException("productos no es un array"); } $sesion = SesionController::Actual(); DAO::transBegin(); $sl = new LoteSalida(); $sl->setIdLote($id_lote); $sl->setIdUsuario($sesion["id_usuario"]); $sl->setFechaRegistro(time()); $sl->setMotivo(is_null($motivo) ? "" : $motivo); try { LoteSalidaDAO::save($sl); } catch (Exception $e) { DAO::transRollback(); throw new InvalidDatabaseOperationException($e); } for ($i = 0; $i < sizeof($productos); $i++) { if (!is_array($productos[$i])) { throw new InvalidDataException("El producto en la posicion {$i} no es un arreglo como se esperaba"); } if (!array_key_exists("id_producto", $productos[$i])) { throw new InvalidDataException("El producto en {$i} no tiene id_prodcuto"); } if (!array_key_exists("cantidad", $productos[$i])) { throw new InvalidDataException("El producto en {$i} no tiene cantidad"); } if (is_null(ProductoDAO::getByPK($productos[$i]["id_producto"]))) { throw new InvalidDataException("El producto " . $productos[$i]["id_producto"] . " no existe."); } $lp = LoteProductoDAO::getByPK($id_lote, $productos[$i]["id_producto"]); if (is_null($lp)) { throw new InvalidDataException("El lote {$id_lote} no tiene el producto " . $productos[$i]["id_producto"]); } if ($productos[$i]["cantidad"] > $lp->getCantidad()) { throw new InvalidDataException("Estas intentando sacar mas de lo que hay en el lote."); } if (!isset($productos[$i]["id_unidad"])) { throw new InvalidDataException("El producto " . $productos[$i]["id_producto"] . " proporcionado no tiene id_unidad"); } $equivalencia = UnidadMedidaDAO::convertir($productos[$i]["id_unidad"], $lp->getIdUnidad(), $productos[$i]["cantidad"]); if ($equivalencia > $lp->getCantidad()) { Logger::log("Se Comparara {$equivalencia} > {$lp->getCantidad()}"); throw new InvalidDataException("Estas intentando sacar mas de lo que hay en el lote."); } $lp->setCantidad($lp->getCantidad() - $productos[$i]["cantidad"]); try { LoteProductoDAO::save($lp); LoteSalidaProductoDAO::save(new LoteSalidaProducto(array("id_lote_salida" => $sl->getIdLoteSalida(), "id_producto" => $productos[$i]["id_producto"], "id_unidad" => $productos[$i]["id_unidad"], "cantidad" => $productos[$i]["cantidad"]))); Logger::log("Removiendo qty=" . $productos[$i]["cantidad"] . "; prod=" . $productos[$i]["id_producto"] . "; lote=" . $id_lote); } catch (Exception $e) { Logger::error($e); throw new InvalidDatabaseOperationException($e); } } DAO::transEnd(); return array("id_salida_lote" => $sl->getIdLoteSalida()); }