/**
  * Se encarga de validar que el valor de los grados se encuentre dentro del rango
  */
 public function isValid($doctrine, $entidad, $invId, $productor)
 {
     $msg = array();
     if ($this->getLocalDetLitros() && $invId) {
         if ($this->getLocalDetLitros() + 0 <= 0) {
             $msg[] = '- La cantidad en litros ingresados "' . $this->getLocalDetLitros() . '" debe ser mayor a 0';
         } else {
             $solLocalDao = new SolLocalDao($doctrine);
             $solLocalDetDao = new SolLocalDetDao($doctrine);
             $inventarioDao = new InventarioDao($doctrine);
             $litrosInventario = $solLocalDetDao->getLitrosInventarioXCuota($entidad->getEntId(), $this->getCuota()->getCuoId());
             $litrosSolicitudesPendientes = $solLocalDao->getLitrosSolicitudXCuota($entidad->getEntId(), $this->getCuota()->getCuoId());
             $disponible = $this->getCuota()->getCuoLitros() - $litrosInventario - $litrosSolicitudesPendientes;
             if ($this->getLocalDetLitros() > $disponible) {
                 $msg[] = '- La cantidad en litros ingresados "' . $this->getLocalDetLitros() . '" es mayor al saldo disponible de la cuota "' . $disponible . '"';
             }
             if ($productor == false) {
                 $inventario = $inventarioDao->getInventario($invId);
                 $litrosDisponiblesProveedor = $inventario->getInvLitros() - $inventario->getInvReservado();
                 if ($this->getLocalDetLitros() > $litrosDisponiblesProveedor) {
                     $msg[] = '- No se puede ingresar la solicitud debido a que las existencias del proveedor no pueden cubrir la cantidad a solicitar';
                 }
             }
         }
     } else {
         if (!$this->getLocalDetLitros()) {
             $msg[] = '- El campo "Cantidad" se encuentra vacio';
         }
         if (!$invId && $productor == false) {
             $msg[] = '- Debe seleccionar un proveedor';
         }
     }
     return $msg;
 }
 /**
  * Proceso encargado de realizar la expiración de solicitudes de 
  * Importacion y Registro Local de Compras
  * 
  */
 public function expiracionSolicitudesAction()
 {
     /*###########################################
       ##* Expiración de Solicitudes Importación ##
       ###########################################*/
     $solImportacionDao = new SolImportacionDao($this->getDoctrine());
     $transicionDao = new TransicionDao($this->getDoctrine());
     $solicitudes = $solImportacionDao->getSolicitudesExpiradas();
     $contSolImp = 0;
     foreach ($solicitudes as $sol) {
         $transiciones = $transicionDao->getTransicionesSiguientes($sol->getTransicion()->getTraId());
         foreach ($transiciones as $tran) {
             $estId = $tran->getEstado()->getEstId();
             if ($estId == Estado::$CANCELADO) {
                 $sol->setTransicion($tran);
                 $sol->setSolImpComentario('Solicitud Expirada');
                 $sol->setAuditUserUpd('SCA');
                 $sol->setAuditDateUpd(new \DateTime());
                 $solImportacionDet = $sol->getSolImportacionesDet();
                 $solImportacionDet = $solImportacionDet[0];
                 $solImportacionDao->editSolImportacion($sol);
                 $this->generarEmailSolImpNotificacion($solImportacionDet, $tran);
                 $contSolImp = $contSolImp + 1;
             }
         }
     }
     /*###############################################
       ##* Expiracion de Registros de compra local  ###
       ################################################*/
     $solLocalDao = new SolLocalDao($this->getDoctrine());
     $inventarioDetDao = new InventarioDetDao($this->getDoctrine());
     $solicitudes = $solLocalDao->getSolicitudesExpiradas();
     $contSolLocal = 0;
     foreach ($solicitudes as $sol) {
         $transiciones = $transicionDao->getTransicionesSiguientes($sol->getTransicion()->getTraId());
         foreach ($transiciones as $tran) {
             $estId = $tran->getEstado()->getEstId();
             if ($estId == Estado::$CANCELADO) {
                 //Buscamos el encabezado para realizar la transicion
                 $solLocalDet = $sol->getSolLocalesDet();
                 $solLocalDet = $solLocalDet[0];
                 $localDetId = $solLocalDet->getLocalDetId();
                 $invsDetTemp = $solLocalDet->getInventariosDet();
                 foreach ($invsDetTemp as $tmp) {
                     if ($solLocalDet->getSolLocal()->getEntidad()->getEntId() != $tmp->getInventario()->getEntidad()->getEntId()) {
                         $inventarioProv = $tmp->getInventario();
                     }
                 }
                 /*NOTA: Solo se busca el registro de inventario que esten en R (reserva) para eliminarse
                  * Los demás se asumen que si ya entraron a inventario no hay reversa 
                  */
                 $inventarioDetTmp = $inventarioDetDao->findInventarioDet($inventarioProv->getInvId(), $localDetId, 'R');
                 $inventarioDetTmp = $this->eliminarInventarioDetProveedorAction($inventarioDetTmp);
                 $sol->setTransicion($tran);
                 $sol->setSolLocalComentario('Solicitud Expirada');
                 $sol->setAuditUserUpd('SCA');
                 $sol->setAuditDateUpd(new \DateTime());
                 $solLocalDao->editSolLocal($sol);
                 $this->generarEmailSolLocalNotificacion($solLocalDet, $tran);
                 $contSolLocal = $contSolLocal + 1;
             }
         }
     }
     return new Response('ok -> SolImportacion Expiradas =' . $contSolImp . '   SolLocal Expiradas = ' . $contSolLocal);
 }
 /**
  * Actualiza el estado/transicion de la solicitud de local
  * 
  * pendiente revisar a que pagina se redirecciona de forma dinamica
  * pendiente extraer la nueva transicion a la que se actualizara la solicitud
  * pendiente validar si la solicitud no ha sido previamente cambiada de estado y se quiere volver a cambiar. (submit + back + submit again)
  * 
  * @param \Symfony\Component\HttpFoundation\Request $request
  * @param type $localDetId
  * @param type $traId
  * @return type
  */
 public function cambiarEstadoAction(Request $request, $localDetId, $traId)
 {
     $auditUser = $this->container->get('security.context')->getToken()->getUser();
     $errorList = '';
     $proseguir = false;
     $solLocalDao = new SolLocalDao($this->getDoctrine());
     $solLocalDetDao = new SolLocalDetDao($this->getDoctrine());
     $transicionDao = new TransicionDao($this->getDoctrine());
     $inventarioDetDao = new InventarioDetDao($this->getDoctrine());
     //Buscamos el encabezado para realizar la transicion
     $solLocalDet = new SolLocalDet();
     $solLocalDet = $solLocalDao->getSolLocalDet($localDetId);
     $invsDetTemp = $solLocalDet->getInventariosDet();
     foreach ($invsDetTemp as $tmp) {
         if ($solLocalDet->getSolLocal()->getEntidad()->getEntId() != $tmp->getInventario()->getEntidad()->getEntId()) {
             $inventarioProv = $tmp->getInventario();
         }
     }
     $roles = $auditUser->getRols();
     $nextTransiciones = $transicionDao->getTransicionesSiguientes($solLocalDet->getSolLocal()->getTransicion()->getTraId());
     //Validacion para asegurarse que el usuario que esta visualizando la solicitud tiene autorizacion para evaluarla y pasarla a la siguiente etapa
     foreach ($roles as $rol) {
         $transicionesRol = $rol->getTransiciones();
         foreach ($transicionesRol as $transicionRol) {
             foreach ($nextTransiciones as $reg) {
                 if ($reg->getFlujo()->getFluId() == Flujo::$LOCAL && $transicionRol->getTraId() == $reg->getTraId() && $traId == $reg->getTraId()) {
                     //Validacion de empresa que ingresa la solicitud
                     $entidad = $solLocalDet->getSolLocal()->getEntidad();
                     $year = new \DateTime();
                     $listadoDNMDao = new ListadoDNMDao($this->getDoctrine());
                     $autorizadoDNM = $listadoDNMDao->estaAutorizado($year->format('Y') + 0, $entidad->getEntNrc(), $entidad->getEntNit());
                     //Validacion de la empresa seleccionada como proveedor
                     $autorizadoDNMProv = true;
                     $inventarioDetTmp = $solLocalDet->getInventariosDet();
                     $inventarioDetTmp = $inventarioDetTmp[0];
                     $provEntidad = $inventarioDetTmp->getInventario()->getEntidad();
                     if ($provEntidad == null) {
                         $provEntidad = true;
                     } else {
                         $autorizadoDNM = $listadoDNMDao->estaAutorizado($year->format('Y') + 0, $provEntidad->getEntNrc(), $provEntidad->getEntNit());
                         $provEntidad = $autorizadoDNM && $provEntidad->getEntHabilitado();
                     }
                     if ($autorizadoDNM == true && $entidad->getEntHabilitado() == true && $provEntidad == true) {
                         if ($solLocalDet->getSolLocal()->getEntidad()->getEntId() == $auditUser->getEntidad()->getEntId() && $rol->getRolTipo() == User::$COMPRADOR || $inventarioProv->getEntidad()->getEntId() == $auditUser->getEntidad()->getEntId() && $rol->getRolTipo() == User::$VENDEDOR) {
                             $proseguir = true;
                         }
                         if ($proseguir == false) {
                             $errorList = $errorList . '#### AUDITORIA: Su usuario no tiene permisos para cambiar el estado de esta solicitud ####';
                         } else {
                             if ($reg->getTraComentario()) {
                                 $solLocalComentario = $request->get('solLocalComentario');
                                 if ($solLocalComentario == null || $solLocalComentario == '') {
                                     $errorList = $errorList . '- Es necesario detallar un comentario para pasar a la siguiente etapa';
                                 } else {
                                     $solLocalDet->getSolLocal()->setSolLocalComentario($solLocalComentario);
                                 }
                             }
                             if ($reg->getTraLitrosLibera() || $reg->getTraLiberaTotal()) {
                                 $localDetLitrosLib = $solLocalDet->getLocalDetLitrosLib();
                                 $localDetLitros = $solLocalDet->getLocalDetLitros();
                                 $litrosLib = $request->get('localDetLitrosLib');
                                 if ($reg->getTraLiberaTotal()) {
                                     $solLocalDet->setLocalDetLitrosLib($localDetLitros);
                                     $inventarioDet = $this->agregarInventario($solLocalDet->getCuota(), $localDetLitros - $localDetLitrosLib);
                                     $inventarioDet->setSolLocalDet($solLocalDet);
                                     $solLocalDet->addInventarioDet($inventarioDet);
                                     $inventarioDetProv = $this->agregarInventarioProveedor($solLocalDet, $inventarioProv->getInvId(), $localDetLitros - $localDetLitrosLib, $solLocalDet->getCuota()->getCuoGrado(), false, false);
                                     $inventarioDetProv->setSolLocalDet($solLocalDet);
                                     $inventarioDetProv->getSolLocalDet()->addInventarioDet($inventarioDet);
                                 } else {
                                     if ($reg->getTraLitrosLibera()) {
                                         try {
                                             $litrosLib = (double) $litrosLib;
                                             $localDetLitrosLib = (double) $localDetLitrosLib;
                                             $localDetLitros = (double) $localDetLitros;
                                             if ($litrosLib == null || $litrosLib == '') {
                                                 $errorList = $errorList . '- Debe ingresar los litros a liberar';
                                             } else {
                                                 if ($localDetLitros - $localDetLitrosLib - $litrosLib <= 0) {
                                                     $errorList = $errorList . '- La cantidad de litros liberados debe ser menor a la cantidad pendiente por liberar ' . ($localDetLitros - $localDetLitrosLib);
                                                 } else {
                                                     if ($litrosLib <= 0) {
                                                         $errorList = $errorList . '- Debe ingresar una cantidad mayor a 0';
                                                     } else {
                                                         $solLocalDet->setLocalDetLitrosLib($localDetLitrosLib + $litrosLib);
                                                         $inventarioDet = $this->agregarInventario($solLocalDet->getCuota(), $litrosLib);
                                                         $inventarioDet->setSolLocalDet($solLocalDet);
                                                         $solLocalDet->addInventarioDet($inventarioDet);
                                                         $inventarioDetProv = $this->agregarInventarioProveedor($solLocalDet, $inventarioProv->getInvId(), $litrosLib, $solLocalDet->getCuota()->getCuoGrado(), false, true);
                                                         $inventarioDetProv->setSolLocalDet($solLocalDet);
                                                         $inventarioDetProv->getSolLocalDet()->addInventarioDet($inventarioDet);
                                                     }
                                                 }
                                             }
                                         } catch (Exception $e) {
                                             $errorList = $errorList . '- Debe ingresar un número valido';
                                         }
                                     }
                                 }
                             }
                         }
                     } else {
                         $errorList = ' ';
                     }
                     if ($errorList == '') {
                         if ($reg->getEtpFin()->getEtpId() == Etapa::$FINALIZADA_OBS && ($reg->getEstado()->getEstId() == Estado::$CANCELADO || $reg->getEstado()->getEstId() == Estado::$RECHAZADO)) {
                             /*NOTA: Solo se busca el registro de inventario que esten en R (reserva) para eliminarse
                              * Los demás se asumen que si ya entraron a inventario no hay reversa 
                              */
                             $inventarioDetTmp = $inventarioDetDao->findInventarioDet($inventarioProv->getInvId(), $localDetId, 'R');
                             $inventarioDetTmp = $this->eliminarInventarioDetProveedorAction($inventarioDetTmp);
                         }
                         $solLocalDet->getSolLocal()->setTransicion($reg);
                         $solLocalDet->getSolLocal()->setAuditUserUpd($auditUser->getUsername());
                         $solLocalDet->getSolLocal()->setAuditDateUpd(new \DateTime());
                         $solLocalDetDao->editSolLocalDet($solLocalDet);
                         $this->generarEmailEtapaNotificacion($solLocalDet, $reg, $inventarioProv->getEntidad()->getEntId());
                         $this->get('session')->setFlash('notice', '#### El registro paso a etapa "' . $reg->getEtpFin()->getEtpNombre() . '" con estado "' . $reg->getEstado()->getEstNombre() . '" ####');
                         return $this->redirect($this->generateUrl('MinSalSCAProcesosBundle_mantSolLocalVerSolicitudes'));
                     }
                 }
             }
         }
     }
     if ($errorList == '') {
         $this->get('session')->setFlash('notice', '#### AUDITORIA: Su usuario no tiene permisos para cambiar el estado en esta etapa "' . $solLocalDet->getSolLocal()->getTransicion()->getEtpFin()->getEtpNombre() . '" ####');
     } else {
         $this->get('session')->setFlash('notice', $errorList);
     }
     return $this->redirect($this->generateUrl('MinSalSCAProcesosBundle_mantCargarSolLocal', array('localDetId' => $localDetId)));
 }