/** * *Iniciar una orden de consignaci?n. La fecha sera tomada del servidor. * * @param productos json Objeto que contendra los ids de los productos que se daran a consignacion a ese cliente con sus cantidades. Se incluira el id del almacen del cual seran tomados para determinar a que empresa pertenece esta consignacion * @param id_consignatario int Id del cliente al que se le hace la consignacion * @return id_consignacion int Id de la consignacion autogenerado por la insercion. **/ public static function Nueva($fecha_termino, $folio, $id_consignatario, $productos, $tipo_consignacion, $fecha_envio_programada = null) { Logger::log("Creando nueva consignacion"); //Se valida al consignatario $e = self::validarConsignatario($id_consignatario); if (is_string($e)) { Logger::error($e); throw new Exception($e); } $consignatario = UsuarioDAO::getByPK($id_consignatario); //Se obtiene al usuario de la sesion actual $id_usuario = LoginController::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 el parametro tipo de consignacion if ($tipo_consignacion != "credito" && $tipo_consignacion != "contado") { Logger::error("El parametro tipo de consignacion (" . $tipo_consignacion . ") es invalido"); throw new Exception("El parametro tipo de consignacion (" . $tipo_consignacion . ") es invalido"); } //Si no se recibio fecha de envio, se toma la fecha actual if (is_null($fecha_envio_programada)) { $fecha_envio_programada = date("Y-m-d H:i:s"); } $consignacion = new Consignacion(array("id_cliente" => $id_consignatario, "id_usuario" => $id_usuario, "fecha_creacion" => date("Y-m-d H:i:s"), "activa" => 1, "cancelada" => 0, "folio" => $folio, "fecha_termino" => $fecha_termino, "saldo" => 0, "tipo_consignacion" => $tipo_consignacion)); //Se agrupan los productos que vienen del mismo almacen en subarreglos para //programar un solo traspaso por almacen. $productos_por_almacen = array(); $num_productos = count($productos); for ($i = 0; $i < $num_productos; $i++) { if ($productos[i] == null) { continue; } $temp = array(); array_push($temp, $productos[i]); for ($j = $i + 1; $j < $num_productos; $j++) { if ($productos[$i]["id_almacen"] == $productos[$j]["id_almacen"]) { array_push($temp, $productos[$j]); $productos[$j] = null; } } $productos[$i] = null; array_push($productos_por_almacen, $temp); } DAO::transBegin(); try { ConsignacionDAO::save($consignacion); $consignacion_producto = new ConsignacionProducto(array("id_consignacion" => $consignacion->getIdConsignacion())); foreach ($productos_por_almacen as $producto_por_almacen) { //Se validan los parametros obtenidos del arreglo de productos foreach ($producto_por_almacen as $producto) { $validar = self::validarConsignacionProducto($producto["id_producto"], $producto["id_unidad"], $producto["cantidad"], $producto["impuesto"], $producto["descuento"], $producto["retencion"], $producto["precio"]); if (is_string($validar)) { throw new Exception($validar); } $validar = self::validarAlmacen($producto["id_almacen"]); if (is_string($validar)) { throw new Eception($validar); } } /* * El consignatario puede contar con algún o ningún almacen de tipo consignacion, * pero solo tendra uno por empresa, esto quiere decir que todos los productos recibidos * seran repartidos en estos almacenes de acuerdo a la empresa a la que pertenece * el almacen de donde son extraidos. * * Si el consignatario no cuenta con un almacen para la empresa de ese producto, se creara uno * nuevo y se realizara la transferencia. */ //Se obtiene el id de la empresa de la cual vienen los productos $id_empresa = AlmacenDAO::getByPK($producto_por_almacen[0]["id_almacen"])->getIdEmpresa(); //Se busca el almacen de consignacion de este cliente para esta empresa $almacen = null; $almacenes = AlmacenDAO::search(new Almacen(array("id_empresa" => $id_empresa, "nombre" => $consignatario->getCodigoUsuario(), "id_sucursal" => 0))); //Si no existe, se crea if (empty($almacenes)) { $almacen = new Almacen(array("id_sucursal" => 0, "id_empresa" => $id_empresa, "id_tipo_almacen" => 2, "nombre" => $consignatario->getCodigoUsuario(), "descripcion" => "Almacen de consignacion del usuario " . $consignatario->getNombre() . " con clave " . $consignatario->getCodigoUsuario() . " para la empresa " . $id_empresa, "activo" => 1)); AlmacenDAO::save($almacen); } else { $almacen = $almacenes[0]; } //Se prepara el arreglo de productos para crear el traspaso de un almacen a otro $productos_para_traspaso = array(); foreach ($producto_por_almacen as $producto) { $p = array("id_producto" => $producto["id_producto"], "id_unidad" => $producto["id_unidad"], "cantidad" => $producto["cantidad"]); array_push($productos_para_traspaso, $p); } //Se programa el traspaso del almacen de donde se tomaron estos productos al almacen de consignacion SucursalesController::ProgramarTraspasoAlmacen($almacen->getIdAlmacen(), $producto_por_almacen[0]["id_almacen"], $fecha_envio_programada, $productos_para_traspaso); } } catch (Exception $e) { DAO::transRollback(); Logger::error("No se pudo crear la nueva consignacion: " . $e); throw new Exception("No se pudo crear la nueva consignacion"); } DAO::transEnd(); Logger::log("Consignacion creada exitosamente"); return array("id_consignacion" => $consignacion->getIdConsignacion()); }