Ejemplo n.º 1
0
 /**
  * Regresa la cantidad total de producto en un lote especifico
  * 
  * ESTE METODO SIRVE PARA CUANDO EN LOTE PRODUCTO HAY REGISTROS CON UNIDADES DIFERENTES, YA QUE EN EL CASO DE ExistenciasTotales NO 
  * TRABAJARIA DE MANERA CORRECTA YA QUE SE INFIERE QUE TODOS LOS TEGISTROS EN LOTE PRODUCTO TIENEN LA MISMA UNIDAD
  * 
  * @param type $id_producto
  * @param type $id_lote
  * @param type $id_unidad
  * @return \stdClass 
  */
 public static function ExistenciasLote($id_producto, $id_lote, $id_unidad)
 {
     //Logger::log("EXISTENCIAS LOTE PARA RECIBE " . ProductoDAO::getByPK($id_producto)->getNombreProducto() . ", LOTE {$id_lote}, todas las operaciones para el calculo deberan hacerse en {$id_unidad} (" . UnidadMedidaDAO::getByPK($id_unidad)->getAbreviacion() . ")");
     $error = "";
     $cantidad = 0;
     $nentradas = 0;
     $nsalidas = 0;
     //verificamos si el producto existe
     if (!($producto = ProductoDAO::getByPK($id_producto))) {
         $error .= "No se tiene registro del producto {$id_producto}. \n";
     }
     //verificamos si se envia el lote
     if (!($lote = LoteDAO::getByPK($id_lote))) {
         $error .= "No se tiene registro del lote {$id_lote}. \n";
     }
     //obtenemos los lotes de entrada
     $lotes_entrada = LoteEntradaDAO::search(new LoteEntrada(array("id_lote" => $id_lote)));
     //Logger::log("Iteramos sobre los lote entrada, se encontraron " . count($lotes_entrada) . " lotes entrada.");
     //iteramos sobre los lote de entrada
     foreach ($lotes_entrada as $lote_entrada) {
         if ($lote_entrada->getIdLote() != $id_lote) {
             continue;
         }
         $array = array("id_lote_entrada" => $lote_entrada->getIdLoteEntrada(), "id_producto" => $id_producto);
         $lotes_entrada_producto = LoteEntradaProductoDAO::search(new LoteEntradaProducto($array));
         //Logger::log("--- Iteramos sobre los lote entrada producto , se encontraron " . count($lotes_entrada_producto) . " lotes entrada.");
         foreach ($lotes_entrada_producto as $lote_entrada_producto) {
             //Logger::log("--- Revisando el lote entrada producto tiene como unidad " . UnidadMedidaDAO::getByPK($lote_entrada_producto->getIdUnidad())->getAbreviacion() . " se comparara contra " . UnidadMedidaDAO::getByPK($id_unidad)->getAbreviacion() . ".");
             if ($lote_entrada_producto->getIdProducto() != $id_producto) {
                 //Logger::error("El search fallo!! el lote entrada producto trajo al producto {$lote_entrada_producto->getIdProducto()} y lo compara con {$id_producto}");
                 continue;
             } else {
                 //revisemos si es de la misma unidad
                 if ($lote_entrada_producto->getIdUnidad() == $id_unidad) {
                     //Logger::log("Se detectaron que las unidades son iguales, el conteo se encuentra en {$cantidad}, se agregaran {$lote_entrada_producto->getCantidad()}");
                     //es igual, solo hay que sumar
                     $cantidad += $lote_entrada_producto->getCantidad();
                     $nentradas += $lote_entrada_producto->getCantidad();
                     // Logger::log("Des pues de la operacion el conteo se encuentra en {$cantidad}");
                 } else {
                     //no es igual, hay que convertir
                     //Logger::log("Se detecto que las unidades son diferentes, se procede a transformar {$lote_entrada_producto->getCantidad()} " . UnidadMedidaDAO::getByPK($lote_entrada_producto->getIdUnidad())->getDescripcion() . " a " . UnidadMedidaDAO::getByPK($id_unidad)->getDescripcion());
                     //Logger::log("**** INFO DEL LOTE : " . $lote_entrada_producto . " ***");
                     $equivalencia = UnidadMedidaDAO::convertir($lote_entrada_producto->getIdUnidad(), $id_unidad, $lote_entrada_producto->getCantidad());
                     // Logger::log("El conteo se encuentra en {$cantidad}, se agregaran {$equivalencia} " . UnidadMedidaDAO::getByPK($id_unidad)->getDescripcion());
                     $cantidad += $equivalencia;
                     $nentradas += $equivalencia;
                     // Logger::log("Des pues de la operacion el conteo se encuentra en {$cantidad}");
                 }
             }
         }
     }
     //obtenemos los lotes de salida
     $lotes_salida = LoteSalidaDAO::search(new LoteSalida(array("id_lote" => $id_lote)));
     //Logger::log("Iteramos sobre los lote salida, se encontraron " . count($lotes_entrada) . " lotes salida.");
     //iteramos sobre los lote de salida
     foreach ($lotes_salida as $lote_salida) {
         $array = array("id_lote_salida" => $lote_salida->getIdLoteSalida(), "id_producto" => $id_producto);
         $lotes_salida_producto = LoteSalidaProductoDAO::search(new LoteSalidaProducto($array));
         //Logger::log("--- Iteramos sobre los lote salida producto , se encontraron " . count($lotes_salida_producto) . " lotes salida producto.");
         foreach ($lotes_salida_producto as $lote_salida_producto) {
             //Logger::log("--- Revisando el lote salida producto tiene como unidad " . UnidadMedidaDAO::getByPK($lote_salida_producto->getIdUnidad())->getAbreviacion() . " se comparara contra " . UnidadMedidaDAO::getByPK($id_unidad)->getAbreviacion() . ".");
             if ($lote_salida_producto->getIdProducto() != $id_producto) {
                 //Logger::error("El search fallo!! el lote salida producto trajo al producto {$lote_salida_producto->getIdProducto()} y lo compara con {$id_producto}");
                 continue;
             } else {
                 //revisemos si es de la misma unidad
                 if ($lote_salida_producto->getIdUnidad() == $id_unidad) {
                     //Logger::log("Se detectaron que las unidades son iguales, el conteo se encuentra en {$cantidad}, se restaran {$lote_salida_producto->getCantidad()}");
                     //es igual, solo hay que restar
                     $cantidad -= $lote_salida_producto->getCantidad();
                     $nsalidas += $lote_salida_producto->getCantidad();
                     //Logger::log("Des pues de la operacion el conteo se encuentra en {$cantidad}");
                 } else {
                     //Logger::log("Se detecto que las unidades son diferentes, se procede a transformar {$lote_salida_producto->getCantidad()} " . UnidadMedidaDAO::getByPK($lote_salida_producto->getIdUnidad())->getDescripcion() . " a " . UnidadMedidaDAO::getByPK($id_unidad)->getDescripcion());
                     // Logger::log("**** INFO DEL LOTE : " . $lote_salida_producto . " ***");
                     //no es igual, hay que convertir
                     $equivalencia = UnidadMedidaDAO::convertir($lote_salida_producto->getIdUnidad(), $id_unidad, $lote_salida_producto->getCantidad());
                     //   Logger::log("El conteo se encuentra en {$cantidad}, se restaran {$equivalencia} " . UnidadMedidaDAO::getByPK($id_unidad)->getDescripcion());
                     $cantidad -= $equivalencia;
                     $nsalidas += $equivalencia;
                     // Logger::log("Des pues de la operacion el conteo se encuentra en {$cantidad}");
                 }
             }
         }
     }
     if ($error != "") {
         Logger::error($error);
     }
     // Logger::log("########### Se encontro que para el producto " . ProductoDAO::getByPK($id_producto)->getNombreProducto() . " existen {$cantidad} " . UnidadMedidaDAO::getByPK($id_unidad)->getAbreviacion() . ". Hubo {$nentradas} entradas y {$nsalidas} salidas ###############");
     return $cantidad;
 }
Ejemplo n.º 2
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());
 }