Ejemplo n.º 1
0
 /**
  *
  *Cambia el estado de un traspaso a recibido. La  bandera de completo se prende si los productos enviados son los mismos que los recibidos. La fecha de recibo es tomada del servidor. El usuario que recibe sera tomada de la sesion actual.
  *
  * @param productos json Productos que se reciben con sus cantidades
  * @param id_traspaso int Id del traspaso que se recibe
  **/
 public static function RecibirTraspasoAlmacen($id_traspaso, $productos)
 {
     Logger::log("Recibiendo traspaso " . $id_traspaso);
     //Se obtiene al usuario de la sesion
     $id_usuario = SesionController::getCurrentUser();
     if (is_null($id_usuario)) {
         Logger::error("El usuario no puede ser obtenido de la sesion, ya inicio sesion?");
         throw new Exception("El usuario no puede ser obtenido de la sesion, ya inicio sesion?");
     }
     //Valida que el traspaso exista, que no haya sido cancelado ni completado y que su estado sea el de enviado
     $validar = self::validarParametrosTraspaso($id_traspaso);
     if (is_string($validar)) {
         Logger::error($validar);
         throw new Exception($validar);
     }
     $traspaso = TraspasoDAO::getByPK($id_traspaso);
     if ($traspaso->getCancelado()) {
         Logger::error("El traspaso ya ha sido cancelado, no puede ser recibido");
         throw new Exception("El traspaso ya ha sido cancelado, no puede ser recibido");
     }
     if ($traspaso->getCompleto()) {
         Logger::error("El traspaso ya ha sido completado, no puede volver a ser recibido");
         throw new Exception("El traspaso ya ha sido completado, no puede volver a ser recibido");
     }
     if ($traspaso->getEstado() !== "Enviado") {
         Logger::error("El traspaso no ha sido enviado");
         throw new Exception("El traspaso no ha sido enviado");
     }
     //Actualiza el registro de traspaso
     $traspaso->setIdUsuarioRecibe($id_usuario);
     $traspaso->setFechaRecibo(time());
     $traspaso->setEstado("Recibido");
     $traspaso->setCompleto(1);
     DAO::transBegin();
     try {
         //Guarda el traspaso e inserta los productos en el almacen que recibe
         TraspasoDAO::save($traspaso);
         $productos = object_to_array($productos);
         if (!is_array($productos)) {
             throw new Exception("Los productos son invalidos", 901);
         }
         foreach ($productos as $p) {
             if (!array_key_exists("id_producto", $p) || !array_key_exists("id_unidad", $p) || !array_key_exists("cantidad", $p)) {
             }
             $producto_traspaso = TraspasoProductoDAO::getByPK($id_traspaso, $p["id_producto"], $p["id_unidad"]);
             //Si el producto que recibe no esta en el registro de productos enviados, se crea su registro
             if (is_null($producto_traspaso)) {
                 $producto_traspaso = new TraspasoProducto(array("id_traspaso" => $id_traspaso, "id_producto" => $p["id_producto"], "id_unidad" => $p["id_unidad"], "cantidad_enviada" => 0));
             }
             //Se busca el producto que sera isnertado en el almacen, si no existe se crea su registro
             $producto_almacen = ProductoAlmacenDAO::getByPK($p["id_producto"], $traspaso->getIdAlmacenRecibe(), $p["id_unidad"]);
             if (is_null($producto_almacen)) {
                 $producto_almacen = new ProductoAlmacen(array("id_producto" => $p_t->getIdProducto(), "id_almacen" => $traspaso->getIdAlmacenEnvia(), "id_unidad" => $p_t->getIdUnidad(), "cantidad" => 0));
             }
             //Se incrementa la cantidad del producto y se guarda el registro.
             $producto_almacen->setCantidad($producto_almacen->getCantidad() + $p["cantidad"]);
             $producto_traspaso->setCantidadRecibida($p["cantidad"]);
             ProductoAlmacenDAO::save($producto_almacen);
             TraspasoProductoDAO::save($producto_traspaso);
         }
         /* Fin de foreach  */
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo recibir el traspaso: " . $e);
         throw new Exception("No se pudo recibir el traspaso");
     }
     DAO::transEnd();
     Logger::log("El traspaso ha sido recibido exitosamente");
 }
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_almacen int Id del almacen del cual se hace el movimiento
  * @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 int ID de la salida del producto
  **/
 static function Salida($id_almacen, $productos, $motivo = null)
 {
     Logger::log("Registrando salida de almacen");
     //Se obtiene al usuario de la sesion
     $id_usuario = SesionController::getCurrentUser();
     if (is_null($id_usuario)) {
         Logger::error("No se pudo obtener al usuario de la sesion, ya inicio sesion?");
         throw new Exception("No se pudo obtener al usuario de la sesion, ya inicio sesion?");
     }
     //valida si el almacen existe y si esta activo
     $almacen = AlmacenDAO::getByPK($id_almacen);
     if (is_null($almacen)) {
         Logger::error("El almacen con id: " . $id_almacen . " no existe");
         throw new Exception("El almacen con id: " . $id_almacen . " no existe");
     }
     if (!$almacen->getActivo()) {
         Logger::error("El almacen no esta activo, no puede salir producto de el");
         throw new Exception("El almacen no esta activo, no puede salir producto de el");
     }
     //Valida que el motivo sea un string valido
     if (!is_null($motivo)) {
         $validar = self::validarString($motivo, 255, "motivo");
         if (is_string($validar)) {
             Logger::error($validar);
             throw new Exception($validar);
         }
     }
     //Se inicializa el registro de la tabla salida_almacen
     $salida_almacen = new SalidaAlmacen(array("id_almacen" => $id_almacen, "id_usuario" => $id_usuario, "fecha_registro" => time(), "motivo" => $motivo));
     DAO::transBegin();
     try {
         //Se guarda el registro de la salida almacen y se sacan los productos solicitados
         //del almacen
         SalidaAlmacenDAO::save($salida_almacen);
         $producto_salida_almacen = new ProductoSalidaAlmacen(array("id_salida_almacen" => $salida_almacen->getIdSalidaAlmacen()));
         $productos = object_to_array($productos);
         if (!is_array($productos)) {
             throw new Exception("Los productos son invalidos", 901);
         }
         foreach ($productos as $p) {
             if (!array_key_exists("id_producto", $p) || !array_key_exists("id_unidad", $p) || !array_key_exists("cantidad", $p)) {
                 throw new Exception("Los productos son invalidos", 901);
             }
             //Se busca en el almacen el producto solicitado, si no es encontrado, se manda una excepcion
             $producto_almacen = ProductoAlmacenDAO::getByPK($p["id_producto"], $id_almacen, $p["id_unidad"]);
             if (is_null($producto_almacen)) {
                 throw new Exception("El producto: " . $p["id_producto"] . " en la unidad: " . $p["id_unidad"] . "\n                            no se encuentra en el almacen: " . $id_almacen . ". No se puede registrar la salida");
             }
             //Se analiza la cantidad actual del producto en el almacen. Si la solicitada
             //es mayor que la cantidad actual, se arroja una excepcion.
             $cantidad_actual = $producto_almacen->getCantidad();
             if ($cantidad_actual < $p["cantidad"]) {
                 throw new Exception("Se busca sacar mas cantidad de producto de la que hay actualmente. Actual: " . $cantidad_actual . " - Salida: " . $p["cantidad"]);
             }
             $producto_almacen->setCantidad($cantidad_actual - $p["cantidad"]);
             $producto_salida_almacen->setIdProducto($p["id_producto"]);
             $producto_salida_almacen->setIdUnidad($p["id_unidad"]);
             $producto_salida_almacen->setCantidad($p["cantidad"]);
             ProductoAlmacenDAO::save($producto_almacen);
             ProductoSalidaAlmacenDAO::save($producto_salida_almacen);
         }
         /* Fin de foreach */
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("No se pudo registrar la salida de producto: " . $e);
         throw new Exception("No se pudo registrar la salida de producto");
     }
     DAO::transEnd();
     Logger::log("Salida de almacen registrada correctamente");
     return array("id_salida" => $salida_almacen->getIdSalidaAlmacen());
 }