Esempio n. 1
0
 /**
  *
  *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());
 }