Ver Fonte

modificacion de funciones de visitas para nuevos estados. Probados todo bien.

EmilianoOrtiz há 4 dias atrás
pai
commit
50078106ad

+ 72 - 120
sistema-mantenimiento-back/app/Http/Controllers/PreventiveMaintenanceController.php

@@ -2352,7 +2352,7 @@ class PreventiveMaintenanceController extends Controller
         $statusHistoryStr = json_encode([
             [
                 'FECHA' => $nowStr,
-                'ESTADO' => 'P',
+                'ESTADO' => 'PE',
                 'USUARIO' => $idUser,
             ]
         ]);
@@ -2367,7 +2367,7 @@ class PreventiveMaintenanceController extends Controller
             'RVTN_TIAC' => 'M',
             'RVTN_PEIN' => $staffStr,
             'RVTN_MAUT' => $form['resources'],
-            'RVTN_ESTA' => 'P',
+            'RVTN_ESTA' => 'PE',
             'RVTN_HIES' => $statusHistoryStr,
             'RVTN_COME' => $commentsStr,
             'RVTN_USRE' => $idUser,
@@ -2633,16 +2633,13 @@ class PreventiveMaintenanceController extends Controller
     {
         DB::enableQueryLog();
 
-        // RVTN_ESTA enum: 'VA','EP','CP','CE','P','C','R','A','F'
-        // VA, EP, CP, CE: Solo para RVTN_TIAC='A' (Automática)
-        // P, C, R, A, F: Solo para RVTN_TIAC='M' (Manual)
-        // EP y C son compartidos entre ambos tipos
+        // RVTN_ESTA enum: 'PE','CA','RE','EL','VA','EP','CP','CE'
         $validator = Validator::make($request->all(), [
             'id_user' => 'required|string',
             'linea' => 'required|integer',
             'id_visit' => 'required|string',
             'comments' => 'nullable|string|min:15',
-            'status' => 'required|string|in:VA,EP,CP,CE,P,C,R,A,F'
+            'status' => 'required|string|in:PE,CA,RE,EL,VA,EP,CP,CE'
         ]);
 
         if ($validator->fails()) {
@@ -2687,78 +2684,44 @@ class PreventiveMaintenanceController extends Controller
 
         $currentStatus = $visit->RVTN_ESTA;
         $newStatus = $form['status'];
-        $visitType = $visit->RVTN_TIAC; // 'A' = Automática, 'M' = Manual
-
-        // Validar que el estado solicitado corresponda al tipo de activación
-        $automaticStates = ['VA', 'EP', 'CP', 'CE'];
-        $manualStates = ['P', 'C', 'R', 'A', 'F'];
-        $isRequestedStateAutomatic = in_array($newStatus, $automaticStates);
-        $isRequestedStateManual = in_array($newStatus, $manualStates);
-
-        // EP y C son compartidos, ajustar validación
-        if ($newStatus === 'EP' || $newStatus === 'C') {
-            // Permitir EP y C para ambos tipos
-        } elseif (($visitType === 'A' && !$isRequestedStateAutomatic) ||
-            ($visitType === 'M' && !$isRequestedStateManual)
-        ) {
-            return $this->responseController->makeResponse(true, "El estado {$newStatus} no corresponde al tipo de activación de la visita.", [], 400);
-        }
 
         // Matriz de transiciones permitidas
         $allowedTransitions = [
-            'A' => [ // Visitas Automáticas
-                'VA' => ['EP', 'C'],  // Validado -> En Proceso o Cancelar
-                'EP' => ['CP', 'C'],  // En Proceso -> Cerrado Pendiente o Cancelar
-                'CP' => ['CE', 'C'],  // Cerrado Pendiente -> Cerrado o Cancelar (aunque C desde CP está bloqueado)
-                'CE' => []            // Cerrado - Estado final, no se puede cambiar
-            ],
-            'M' => [ // Visitas Manuales
-                'P' => ['A', 'R', 'C'], // Pendiente -> Aprobar, Rechazar o Cancelar
-                'A' => ['EP', 'C'],     // Aprobado -> En Proceso o Cancelar
-                'EP' => ['F', 'C'],     // En Proceso -> Finalizar o Cancelar
-                'F' => [],              // Finalizado - Estado final, no se puede cambiar
-                'R' => []               // Rechazado - Estado final, no se puede cambiar
-            ]
+            'PE' => ['VA', 'RE', 'CA', 'EL'], // Pendiente
+            'VA' => ['EP', 'CA', 'EL'],       // Validado
+            'EP' => ['CP', 'CA', 'EL'],       // En proceso
+            'CP' => ['CE'],                   // Cerrado pendiente
+            'CE' => [],                       // Cerrado - Estado final
+            'CA' => [],                       // Cancelado - Estado final
+            'EL' => [],                       // Eliminado - Estado final
+            'RE' => []                        // Rechazado - Estado final
         ];
 
         // Validar transición permitida
-        $currentStatusTransitions = $allowedTransitions[$visitType][$currentStatus] ?? [];
+        $currentStatusTransitions = $allowedTransitions[$currentStatus] ?? [];
 
         // Si el estado actual no está en la matriz, no permitir cambios
-        if (!array_key_exists($currentStatus, $allowedTransitions[$visitType])) {
+        if (!array_key_exists($currentStatus, $allowedTransitions)) {
             return $this->responseController->makeResponse(true, "El estado actual {$currentStatus} no permite cambios.", [], 400);
         }
 
         // Validar si la transición está permitida
         if (!in_array($newStatus, $currentStatusTransitions)) {
             $statusNames = [
+                'PE' => 'Pendiente',
+                'CA' => 'Cancelado',
+                'RE' => 'Rechazado',
+                'EL' => 'Eliminado',
                 'VA' => 'Validado',
                 'EP' => 'En Proceso',
                 'CP' => 'Cerrado Pendiente',
-                'CE' => 'Cerrado',
-                'P' => 'Pendiente',
-                'A' => 'Aprobado',
-                'R' => 'Rechazado',
-                'F' => 'Finalizado',
-                'C' => 'Cancelado'
+                'CE' => 'Cerrado'
             ];
             $currentStatusName = $statusNames[$currentStatus] ?? $currentStatus;
             $newStatusName = $statusNames[$newStatus] ?? $newStatus;
             return $this->responseController->makeResponse(true, "No se puede cambiar de {$currentStatusName} a {$newStatusName}. Transición no permitida.", [], 400);
         }
 
-        // Validar cancelación desde estados finales
-        if ($newStatus === 'C') {
-            $finalStates = $visitType === 'A' ? ['CE'] : ['F', 'R'];
-            if (in_array($currentStatus, $finalStates)) {
-                return $this->responseController->makeResponse(true, "No se puede cancelar una visita que ya está en estado final.", [], 400);
-            }
-            // También bloquear desde CP según aclaración
-            if ($currentStatus === 'CP') {
-                return $this->responseController->makeResponse(true, "No se puede cancelar una visita en estado Cerrado Pendiente.", [], 400);
-            }
-        }
-
         // Obtener y actualizar historial de estados
         $statusHistoryArr = json_decode($visit->RVTN_HIES, true);
         if (!is_array($statusHistoryArr)) {
@@ -2784,43 +2747,41 @@ class PreventiveMaintenanceController extends Controller
             'RVTN_FEMO' => $nowStr,
         ];
 
-        // Estados automáticos: VA, EP, CP, CE
-        if (in_array($newStatus, ['VA', 'EP', 'CP', 'CE'])) {
-            $updateArr['RVTN_UARE'] = $idUser;
-            $updateArr['RVTN_FARE'] = $nowStr;
-        }
-
-        // Estados manuales
-        if ($newStatus == 'P') {
+        // Asignar campos específicos según el estado
+        if ($newStatus == 'PE') {
             // Pendiente - Ya registrado en creación
-        } elseif ($newStatus == 'C') {
+        } elseif ($newStatus == 'CA') {
             $updateArr['RVTN_USCA'] = $idUser;
             $updateArr['RVTN_FECA'] = $nowStr;
-        } elseif ($newStatus == 'R') {
+        } elseif ($newStatus == 'RE') {
             $updateArr['RVTN_UARE'] = $idUser;
             $updateArr['RVTN_FARE'] = $nowStr;
-            
+
             // Registrar comentario de rechazo
             if (!empty($form['comments'])) {
                 $commentsArr = json_decode($visit->RVTN_COME, true);
                 if (!is_array($commentsArr)) {
                     $commentsArr = [];
                 }
-                
+
                 $commentsArr['COMENTARIO_RECHAZO'] = [
                     'ID' => $idUser,
                     'COMENTARIO' => $form['comments'],
                     'FECHA' => $nowStr
                 ];
-                
+
                 $updateArr['RVTN_COME'] = json_encode($commentsArr);
             }
-        } elseif ($newStatus == 'A') {
+        } elseif ($newStatus == 'EL') {
+            // Eliminado - podría necesitar campos específicos
+        } elseif (in_array($newStatus, ['VA', 'EP', 'CP', 'CE'])) {
             $updateArr['RVTN_UARE'] = $idUser;
             $updateArr['RVTN_FARE'] = $nowStr;
-        } elseif ($newStatus == 'F') {
-            $updateArr['RVTN_USFI'] = $idUser;
-            $updateArr['RVTN_FEFI'] = $nowStr;
+
+            if ($newStatus == 'CE') {
+                $updateArr['RVTN_USFI'] = $idUser;
+                $updateArr['RVTN_FEFI'] = $nowStr;
+            }
         }
 
         DB::table('S002V01TRVTN')->where([
@@ -2859,22 +2820,22 @@ class PreventiveMaintenanceController extends Controller
 
         // Preparar mensajes de notificación según el estado
         $statusMessages = [
-            'A' => 'Aprobación',
-            'R' => 'Rechazo',
-            'C' => 'Cancelación',
-            'EP' => 'Inicio',
-            'F' => 'Finalización',
+            'PE' => 'Pendiente',
+            'CA' => 'Cancelación',
+            'RE' => 'Rechazo',
+            'EL' => 'Eliminación',
             'VA' => 'Validación',
+            'EP' => 'Inicio',
             'CP' => 'Cerrado Pendiente',
             'CE' => 'Cierre'
         ];
 
         $statusAction = $statusMessages[$newStatus] ?? 'Cambio de estado';
         $notificationTitle = "Visita Técnica No Programada #$idVisit";
-        $notificationMessage = "La visita técnica no programada #$idVisit ha sido actulizada a estado:{$statusAction}.";
+        $notificationMessage = "La visita técnica no programada #$idVisit ha sido actualizada a estado: {$statusAction}.";
 
-        // Notificación general para todos los cambios de estado (A, R, C, EP, F, VA, CE, CP)
-        if (in_array($newStatus, ['A', 'R', 'C', 'EP', 'F', 'VA', 'CE', 'CP']) && !empty($audience)) {
+        // Notificación general para todos los cambios de estado
+        if (in_array($newStatus, ['VA', 'RE', 'CA', 'EL', 'EP', 'CE', 'CP']) && !empty($audience)) {
             $this->notificationsController->emitNotification(
                 'S002V01M10GMPR',
                 $notificationTitle,
@@ -2906,7 +2867,7 @@ class PreventiveMaintenanceController extends Controller
             'S002V01F11RVTP',
             'S002V01P01REVI',
             'Actualización',
-            "El usuario $name (" . $usr->USUA_IDUS . ") actualizó la visita no programada #$idVisit.",
+            "El usuario $name (" . $usr->USUA_IDUS . ") actualizó la visita no programada #$idVisit a estado {$statusAction}.",
             $idUser,
             $nowStr,
             'S002V01S02AOTR'
@@ -3340,15 +3301,14 @@ class PreventiveMaintenanceController extends Controller
         }
 
         $visitStates = [
-            'VA' => 'Validada',
-            'EP' => 'En progreso',
-            'CP' => 'Cerrada pendiente',
-            'CE' => 'Cerrada',
-            'P' => 'Pendiente',
-            'C' => 'Cancelada',
-            'R' => 'Rechazada',
-            'A' => 'Aprobada',
-            'F' => 'Finalizada',
+            'PE' => 'Pendiente',
+            'CA' => 'Cancelado',
+            'RE' => 'Rechazado',
+            'EL' => 'Eliminado',
+            'VA' => 'Validado',
+            'EP' => 'En Proceso',
+            'CP' => 'Cerrado Pendiente',
+            'CE' => 'Cerrado'
         ];
 
         if ($visit->RVTN_ESTA !== 'VA') {
@@ -5668,11 +5628,10 @@ class PreventiveMaintenanceController extends Controller
             'EP' => 'En progreso',        // Automática
             'CP' => 'Cerrado pendiente',  // Automática
             'CE' => 'Cerrado',            // Automática
-            'P' => 'Pendiente',           // Manual
-            'C' => 'Cancelado',           // Manual
-            'R' => 'Rechazado',           // Manual
-            'A' => 'Aprobado',            // Manual
-            'F' => 'Finalizado',          // Manual
+            'PE' => 'Pendiente',           // Manual
+            'CA' => 'Cancelado',           // Manual
+            'RE' => 'Rechazado',           // Manual
+            'EL' => 'Eliminado',           // Manual
         ];
         $visit->ESTADO = $orderStates[$visit->ESTADO];
 
@@ -5755,7 +5714,7 @@ class PreventiveMaintenanceController extends Controller
 
         if (is_null($visit)) {
             return $this->responseController->makeResponse(true, 'La visita solicitada no existe.', [], 404);
-        } else if ($visit->RVTN_ESTA != 'P' && $visit->RVTN_ESTA != 'VA') {
+        } else if ($visit->RVTN_ESTA != 'PE' && $visit->RVTN_ESTA != 'VA') {
             return $this->responseController->makeResponse(true, 'La visita no está en un estado válido para asignar operarios.', [], 401);
         }
 
@@ -6039,16 +5998,14 @@ class PreventiveMaintenanceController extends Controller
         // Puede estar en estado VA en RVTN_ESTA sin tener aún el objeto VA en RVTN_HIES
         // (cuando se crea automáticamente pero aún no se han asignado operarios)
         $visitStates = [
-            'VA' => 'Validada',
-            'EP' => 'En progreso',
-            'CP' => 'Cerrada pendiente',
-            'CE' => 'Cerrada',
-            'PE' => 'Pendiente de validación',
-            'P' => 'Pendiente',
-            'C' => 'Cancelada',
-            'R' => 'Rechazada',
-            'A' => 'Aprobada',
-            'F' => 'Finalizada',
+            'PE' => 'Pendiente',
+            'CA' => 'Cancelado',
+            'RE' => 'Rechazado',
+            'EL' => 'Eliminado',
+            'VA' => 'Validado',
+            'EP' => 'En Proceso',
+            'CP' => 'Cerrado Pendiente',
+            'CE' => 'Cerrado'
         ];
 
         if ($visit->RVTN_ESTA !== 'VA') {
@@ -6228,20 +6185,15 @@ class PreventiveMaintenanceController extends Controller
             return $this->responseController->makeResponse(true, 'La visita solicitada no está registrada.', [], 404);
         }
 
-        // RVTN_ESTA enum: 'VA','EP','CP','CE','P','C','R','A','F'
-        // VA, EP, CP, CE: Solo para RVTN_TIAC='A' (Automática)
-        // P, C, R, A, F: Solo para RVTN_TIAC='M' (Manual)
         $visitStates = [
-            'VA' => 'Validado',           // Automática
-            'EP' => 'En progreso',        // Automática
-            'CP' => 'Cerrado pendiente',  // Automática
-            'CE' => 'Cerrado',            // Automática
-            'PE' => 'Pendiente de validación', // Automática
-            'P' => 'Pendiente',           // Manual
-            'C' => 'Cancelado',           // Manual
-            'R' => 'Rechazado',           // Manual
-            'A' => 'Aprobado',            // Manual
-            'F' => 'Finalizado',          // Manual
+            'PE' => 'Pendiente',
+            'CA' => 'Cancelado',
+            'RE' => 'Rechazado',
+            'EL' => 'Eliminado',
+            'VA' => 'Validado',
+            'EP' => 'En Proceso',
+            'CP' => 'Cerrado Pendiente',
+            'CE' => 'Cerrado'
         ];
 
         $statusHistoryArr = json_decode($visit->HISTORIAL, true);