/** * Confirma el pedido y rebaja el inventario correspondiente de las fincas * con sus respectivas validaciones * * @param int $pedido_cab_id * @param int $usuario_id * @throws PedidoException * @throws Exception * @return array> */ public function confirmar($pedido_cab_id, $usuario_cliente_id, $usuario_vendedor_id) { $PedidoDetDAO = new PedidoDetDAO(); $PedidoCabDAO = new PedidoCabDAO(); $PedidoProveedorDAO = new PedidoProveedorDAO(); $GrupoDispoCabDAO = new GrupoDispoCabDAO(); $DispoDAO = new DispoDAO(); $GrupoDispoDetDAO = new GrupoDispoDetDAO(); $DispoBO = new DispoBO(); $UsuarioDAO = new UsuarioDAO(); $ParametrizarDAO = new ParametrizarDAO(); $PedidoProveedorData = new PedidoProveedorData(); $this->getEntityManager()->getConnection()->beginTransaction(); try { if (empty($usuario_vendedor_id)) { $usuario_procesa_id = $usuario_cliente_id; } else { $usuario_procesa_id = $usuario_vendedor_id; } //end if $PedidoCabDAO->setEntityManager($this->getEntityManager()); $PedidoDetDAO->setEntityManager($this->getEntityManager()); $GrupoDispoCabDAO->setEntityManager($this->getEntityManager()); $PedidoProveedorDAO->setEntityManager($this->getEntityManager()); $DispoDAO->setEntityManager($this->getEntityManager()); $GrupoDispoDetDAO->setEntityManager($this->getEntityManager()); $DispoBO->setEntityManager($this->getEntityManager()); $UsuarioDAO->setEntityManager($this->getEntityManager()); $ParametrizarDAO->setEntityManager($this->getEntityManager()); /** * Consulta datos relacionados al usuario */ $row_usuario = $UsuarioDAO->consultar($usuario_cliente_id, \Application\Constants\ResultType::MATRIZ); if (empty($row_usuario)) { throw new PedidoException('Usuario no tiene asignado un grupo!!'); } else { /* $grupo_precio_cab_id= $row_usuario['grupo_precio_cab_id']; //MORONITOR $grupo_dispo_cab_id = $row_usuario['grupo_dispo_cab_id']; $inventario_id = $row_usuario['inventario_id']; */ $clasifica_fox = $row_usuario['clasifica_fox']; $calidad_id = $row_usuario['calidad_id']; } //end if $PedidoCabData = $PedidoCabDAO->consultar($pedido_cab_id); if ($PedidoCabData->getEstado() == \Application\Constants\Pedido::ESTADO_ACTIVO) { throw new PedidoException('El pedido ya fue procesado anteriormente!!'); } //end if /** * Consulta el GRUPO_DISPO_CAB_ID del usuario del cliente */ $GrupoDispoCabData = $GrupoDispoCabDAO->consultarPorUsuarioId($usuario_cliente_id); if (empty($GrupoDispoCabData)) { throw new PedidoException('Usuario no tiene asignado un grupo de dispo!!'); } //end foreach /** * Se obtiene los detalles de los pedidos, siempre y cuando el estado de la CABECERA DEL PEDIDO * este en estado COMPRANDO, por tema de seguridad se pregunta este estado en el QUERY */ $result_pedido = $PedidoDetDAO->consultarPorPedidoCabId($pedido_cab_id, \Application\Constants\Pedido::ESTADO_COMPRANDO); if (empty($result_pedido)) { throw new PedidoException('No existe detalle para el pedido!!'); } //end if /* * 2. Verificar si existe el stock en las fincas, * en caso de estar incompleto el stock devolver lo que este disponible sin grabar */ $arr_novedad_pedido_det = array(); //En caso de tener registro en este array, significa que no existe stock para ese detalle $bd_rollback = false; foreach ($result_pedido as $reg_pedido) { /** * Obtiene la dispo Actual */ $result_dispo_actual = $DispoBO->getDispo($reg_pedido['cliente_id'], $usuario_cliente_id, $reg_pedido['marcacion_sec'], $reg_pedido['tipo_caja_id'], $reg_pedido['variedad_id'], $reg_pedido['grado_id'], true, false, true, $reg_pedido['variedad_producto_id'], $reg_pedido['tallos_x_bunch']); if (empty($result_dispo_actual)) { throw new PedidoException('Dispo Vacia, no es posible confirmar el pedido'); } //end if switch ($result_dispo_actual['respuesta_code']) { case 'OK': $reg_dispo_actual = $result_dispo_actual["result_dispo"][0]; break; case 12: //Sin registro en el inventario del grupo del cliente //Sin registro en el inventario del grupo del cliente case 13: //Sin stock en el grupo del cliente $reg_dispo_actual['nro_cajas'] = 0; //Se emula que la dispo Actual tiene CERO cajas. break; default: $this->getEntityManager()->getConnection()->rollback(); $result = array('respuesta' => $result_dispo_actual['respuesta_code'], 'respuesta_descripcion' => $result_dispo_actual['respuesta_msg'], 'novedades_pedido_det' => null); return $result; } //end switch if ($reg_pedido['nro_cajas'] > $reg_dispo_actual['nro_cajas']) { $bd_rollback = true; $reg_pedido['nro_cajas_en_stock'] = $reg_dispo_actual['nro_cajas']; $arr_novedad_pedido_det[] = $reg_pedido; } else { /* * 2. Grabar el Pedido de las Fincas */ $pedido_nro_cajas = $reg_pedido['nro_cajas']; foreach ($reg_dispo_actual['proveedores_dispo'] as $proveedor_dispo) { if ($pedido_nro_cajas > $proveedor_dispo['nro_cajas']) { $nro_cajas = $proveedor_dispo['nro_cajas']; $pedido_nro_cajas = $pedido_nro_cajas - $nro_cajas; } else { $nro_cajas = $pedido_nro_cajas; $pedido_nro_cajas = 0; } //end if $cantidad_bunchs = $nro_cajas * $reg_dispo_actual['cantidad_bunch']; $tallos_total = $cantidad_bunchs * $reg_dispo_actual['tallos_x_bunch']; $total = $tallos_total * $reg_dispo_actual['precio']; //Se crea la Data para PedidoProveedorData $PedidoProveedorData = new PedidoProveedorData(); $PedidoProveedorData->setPedidoCabId($reg_pedido['pedido_cab_id']); $PedidoProveedorData->setPedidoDetSec($reg_pedido['pedido_det_sec']); $PedidoProveedorData->setProveedorId($proveedor_dispo['proveedor_id']); $PedidoProveedorData->setNroCajas($nro_cajas); $PedidoProveedorData->setCantidadBunch($cantidad_bunchs); $PedidoProveedorData->setTallosxBunch($reg_pedido['tallos_x_bunch']); $PedidoProveedorData->setTallosTotal($tallos_total); $PedidoProveedorData->setVariedadId($reg_pedido['variedad_id']); $PedidoProveedorData->setGradoId($reg_pedido['grado_id']); $PedidoProveedorData->setPrecio($reg_pedido['precio']); $PedidoProveedorData->setTotal($total); //Equivalencias de Caja FB $cajas_fb = \Application\Classes\CajaConversion::equivalenciaFB($reg_pedido['tipo_caja_id'], $nro_cajas); $PedidoProveedorData->setEqFb($cajas_fb); $key_pedidoproveedor = $PedidoProveedorDAO->ingresar($PedidoProveedorData); /* * 3. Rebaja de la DISPO GENERAL */ $result_dispo = $DispoDAO->consultarInventarioPorProveedor($proveedor_dispo['proveedor_id'], $reg_dispo_actual['inventario_id'], $reg_dispo_actual['producto_id'], $reg_dispo_actual['variedad_id'], $reg_dispo_actual['grado_id'], $reg_dispo_actual['tallos_x_bunch'], $clasifica_fox); //$result_dispo = null; if (empty($result_dispo)) { throw new PedidoException('No hay bunches disponibles en la DISPO - FINCA'); } //end if $total_bunch_pedido = $cantidad_bunchs; foreach ($result_dispo as $row_dispo) { if ($row_dispo['cantidad_bunch_disponible'] > $total_bunch_pedido) { $cantidad_descontar = $total_bunch_pedido; $total_bunch_pedido = 0; } else { $cantidad_descontar = $row_dispo['cantidad_bunch_disponible']; $total_bunch_pedido = $total_bunch_pedido - $row_dispo['cantidad_bunch_disponible']; } //end if //REBAJA DE LA DISPO $DispoData = new DispoData(); $DispoData->setFecha($row_dispo['fecha']); $DispoData->setInventarioId($row_dispo['inventario_id']); $DispoData->setFechaBunch($row_dispo['fecha_bunch']); $DispoData->setProveedorId($row_dispo['proveedor_id']); $DispoData->setProducto($row_dispo['producto']); $DispoData->setVariedadId($row_dispo['variedad_id']); $DispoData->setGradoId($row_dispo['grado_id']); $DispoData->setTallosxBunch($row_dispo['tallos_x_bunch']); $DispoData->setClasifica($clasifica_fox); //NUEVO $DispoDAO->rebajar($DispoData, $cantidad_descontar); //REBAJA DE LA DISPO POR GRUPO $DispoGrupoDetData = new GrupoDispoDetData(); $DispoGrupoDetData->setGrupoDispoCabId($GrupoDispoCabData->getId()); $DispoGrupoDetData->setProductoId($row_dispo['producto']); $DispoGrupoDetData->setVariedadId($row_dispo['variedad_id']); $DispoGrupoDetData->setGradoId($row_dispo['grado_id']); $DispoGrupoDetData->setTallosXBunch($row_dispo['tallos_x_bunch']); $GrupoDispoDetDAO->rebajar($DispoGrupoDetData, $cantidad_descontar); if ($total_bunch_pedido == 0) { break; //SALE DEL WHILE } //end if } //end while if ($pedido_nro_cajas == 0) { break; //Sale del ciclo foreach } } //end foreach list($key_pedidocab, $reg_pedidocab) = $PedidoCabDAO->actualizarEstado($pedido_cab_id, \Application\Constants\Pedido::ESTADO_ACTIVO, $usuario_procesa_id); } //end if //CONTROL DE bd_rollback } //end foreach if ($bd_rollback == true) { $this->getEntityManager()->getConnection()->rollback(); $result = array('respuesta' => 'NOVEDAD', 'novedades_pedido_det' => $arr_novedad_pedido_det, 'nro_dias_procesa' => '', 'dia_semana_procesa' => ''); } else { /*-------------Indica los dias que debe que se procesan---*/ $reg_despacho = $ParametrizarDAO->getDiaDespacho($reg_pedidocab['fec_confirmado']); $PedidoCabDAO->actualizarFechaDespacho($pedido_cab_id, $reg_despacho['fecha_procesa']); $this->getEntityManager()->getConnection()->commit(); $this->enviarEmailAdjuntoPDF($pedido_cab_id); /*--------------Devuelve el resultado --------------------*/ $result = array('respuesta' => 'OK', 'novedades_pedido_det' => '', 'nro_dias_procesa' => $reg_despacho['nro_dias_procesa'], 'dia_semana_procesa' => $reg_despacho['dia_semana_procesa']); } //end if return $result; } catch (Exception $e) { $this->getEntityManager()->getConnection()->rollback(); $this->getEntityManager()->close(); throw $e; } //end try }