|
|
@@ -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);
|