|
|
@@ -44,7 +44,7 @@ class RequestController extends Controller
|
|
|
//FORM NO REQUERIDO POR EL MOMENTO
|
|
|
$validator = Validator::make($request->all(), [
|
|
|
'form' => 'array',
|
|
|
- 'id_module' => 'required|integer|exists:modules,id',
|
|
|
+ 'id_module' => 'required|string|max:50|exists:modules,id',
|
|
|
'id_user' => 'required|integer|exists:users,id',
|
|
|
]);
|
|
|
|
|
|
@@ -479,7 +479,6 @@ class RequestController extends Controller
|
|
|
$request->workflow->tasks[$key]->status = $isCompleted ? 'Completed' : 'Canceled';
|
|
|
$request->workflow->tasks[$key]->isValidated = $isCompleted;
|
|
|
|
|
|
- $request->workflow->isCompleted = true;
|
|
|
$request->workflow->status = $isCompleted ? 'Completed' : 'Canceled';
|
|
|
$request->workflow->isStopped = false;
|
|
|
|
|
|
@@ -499,7 +498,6 @@ class RequestController extends Controller
|
|
|
}, $request->currentTask->workflow->tasks);
|
|
|
|
|
|
$request->currentTask->workflow->status = $isCompleted ? 'Completed' : 'Canceled';
|
|
|
- $request->currentTask->workflow->isCompleted = $isCompleted;
|
|
|
}
|
|
|
|
|
|
$request->form = json_encode($request->form);
|
|
|
@@ -650,7 +648,6 @@ class RequestController extends Controller
|
|
|
$key = array_search($lastTask->sequence, array_column($item->workflow->tasks, 'sequence'));
|
|
|
$item->workflow->tasks[$key]->status = 'Completed';
|
|
|
$item->workflow->tasks[$key]->isValidated = true;
|
|
|
- $item->workflow->isCompleted = true;
|
|
|
$item->workflow->status = 'Completed';
|
|
|
|
|
|
/** SI LA LISTA TIENE MÁS DE 2 ITEMS, QUIERE DECIR QUE LA CURRENTTASK
|
|
|
@@ -725,54 +722,168 @@ class RequestController extends Controller
|
|
|
*/
|
|
|
public function updateWorkflowInRequests(int $id)
|
|
|
{
|
|
|
+ /** BUSCAR EL WORKFLOW MODIFICADO */
|
|
|
$workflow = DB::table('workflows')->find($id);
|
|
|
|
|
|
if ($workflow) {
|
|
|
+ /** CASTEAR TAREAS Y DIAGRAMA */
|
|
|
$workflow->tasks = json_decode($workflow->tasks);
|
|
|
$workflow->diagram = json_decode($workflow->diagram);
|
|
|
|
|
|
- $requests = DB::table('requests')->select('id', 'workflow')
|
|
|
+ /** OBTENER LAS SOLICITUDES QUE TENGAN EL WORKFLOW MODIFICADO Y SU WORKFLOW ESTE EN EJECUCIÓN */
|
|
|
+ $requests = DB::table('requests')->select('id', 'workflow', 'currentTask')
|
|
|
->where('id_workflow', $id)
|
|
|
->whereJsonContains('workflow->status', 'Executed')
|
|
|
->get()->toArray();
|
|
|
|
|
|
if ($requests) {
|
|
|
- $requests[0]->workflow = json_decode($requests[0]->workflow);
|
|
|
+ $flag = true;
|
|
|
+ $totalTasks = array();
|
|
|
+ foreach ($requests as &$request) {
|
|
|
+ /** OBTENER LA PRIMERA SOLICITUD, TODAS LAS SOLICITUDES DEBERÁN TENER EL MISMO NÚMERO DE .... ? */
|
|
|
+ //CUIDADO, SI LA SOLICITUD AVANZA, REALMENTE NO SERÁ IGUAL A TODAS
|
|
|
+ $request->workflow = json_decode($request->workflow);
|
|
|
+ $request->currentTask = json_decode($request->currentTask);
|
|
|
|
|
|
- $tasksRequests = $requests[0]->workflow->tasks;
|
|
|
- $tasksWorkflow = $workflow->tasks;
|
|
|
+ /** OBTENER LAS SECUENCIAS DE LA SOLICITUD */
|
|
|
+ $sequencesRequests = array_map(function ($task) {
|
|
|
+ return $task->sequence;
|
|
|
+ }, $request->workflow->tasks);
|
|
|
|
|
|
- return array_udiff($tasksRequests, $tasksWorkflow, function ($taskRequest, $taskWorkflow) {
|
|
|
- if ($taskRequest->id === $taskWorkflow->id && $taskRequest->sequence === $taskWorkflow->sequence) {
|
|
|
- return 0;
|
|
|
+ /** OBTENER LAS SECUENCIAS DEL WORKFLOW MODIFICADO */
|
|
|
+ $sequencesWorkflow = array_map(function ($task) {
|
|
|
+ return $task->sequence;
|
|
|
+ }, $workflow->tasks);
|
|
|
+
|
|
|
+ /** ¿HAY MAS TAREAS EN LA SOLICITUD O EN EL WORKFLOW?
|
|
|
+ AL REALIZAR LA COMPARACIÓN, ES NECESARIO COMPARAR EL ARREGLO QUE TENGA MÁS SECUENCIAS */
|
|
|
+ if (count($sequencesRequests) > count($sequencesWorkflow)) {
|
|
|
+ /** OBTENER LAS DIFERENCIAS ENTRE LAS SECUENCIAS */
|
|
|
+ $differences = array_values(array_diff($sequencesRequests, $sequencesWorkflow));
|
|
|
} else {
|
|
|
- return -1;
|
|
|
+ /** OBTENER LAS DIFERENCIAS ENTRE LAS SECUENCIAS */
|
|
|
+ $differences = array_values(array_diff($sequencesWorkflow, $sequencesRequests));
|
|
|
}
|
|
|
- });
|
|
|
|
|
|
+ /** UNA SOLICITUD TIENE UNA CURRENT TASK, SI LAS DIFERENCIAS ESTÁN DESPUÉS DE DICHA SECUENCIA
|
|
|
+ * SE REGRESARA EL TOTAL DE SECUENCIAS QUE PODRÁN SE MODIFICADAS */
|
|
|
+
|
|
|
+ /** ARREGLO QUE ALMACENA LAS SEQUENCIAS QUE PODRÁN SER MODIFICADAS */
|
|
|
+ $canUpdated = array();
|
|
|
+
|
|
|
+ /** RECORRER LAS SECUENCIAS DE DIFERENCIA Y VERIFICAR SI MODIFICACIÓN ES POSIBLE */
|
|
|
+ foreach ($differences as &$difference) {
|
|
|
+ /** SI LA DIFERENCIA ES MAYOR A LA ACTUAL SECUENCIA, ENTONCES NO HAY NINGÚN TIPO DE PROBLEMA */
|
|
|
+ if ($difference > $request->currentTask->sequence) {
|
|
|
+ $key = array_search($difference, array_column($request->workflow->tasks, 'changeSequence'));
|
|
|
+ if ($key) {
|
|
|
+ $conditionalTask = $request->workflow->tasks[$key]->sequence;
|
|
|
+
|
|
|
+ $keyWorkflow = array_search($conditionalTask, array_column($workflow->tasks, 'sequence'));
|
|
|
+ $canUpdated[] = $workflow->tasks[$keyWorkflow]->sequence;
|
|
|
+ }
|
|
|
+ $canUpdated[] = $difference;
|
|
|
+
|
|
|
+ /** SI LA DIFERENCIA ES IGUAL A LA ACTUAL SECUENCIA, ENTONCES SE VERIFICA SI SU SIGUIENTE SEQUENCIA NO CORRESPONDE A
|
|
|
+ * UNA TAREA CONDICIONAL, SI ES ASI, TAMBÍEN ES NECESARIO PORQUE PUEDE CAMBIAR SU CHANGESEQUENCE Y NO HABRÁ COINCIDENCIA
|
|
|
+ * DE SECUENCIAS */
|
|
|
+ } else if ($difference === $request->currentTask->sequence) {
|
|
|
+ /** BUSCAR LA SIGUENTE SECUENCIA DE LA CURRENTTASK */
|
|
|
+ $key = array_search($request->currentTask->nextSequence, array_column($request->workflow->tasks, 'sequence'));
|
|
|
+ $nextTask = $request->workflow->tasks[$key];
|
|
|
+ /** ¿ES CONDICIONAL? TAMBIÉN SE MODIFICARÁ */
|
|
|
+ if ($nextTask->isConditional){
|
|
|
+ $canUpdated[] = $nextTask->sequence;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- /*array_map(function ($request) use ($workflow) {
|
|
|
- $request->workflow = json_decode($request->workflow);
|
|
|
+ /** ¿HAY TAREAS QUE PODRÁN SER MODIFICADAS? */
|
|
|
+ if ($canUpdated) {
|
|
|
+ /** ¿CUÁL ES LA PRIMERA SECUENCIA?
|
|
|
+ SI LAS SECUENCIAS SON: 3, 5, 8, 9, BASTA CON EMPEZAR DESDE LA 3 */
|
|
|
+ $firstSequence = reset($canUpdated);
|
|
|
+
|
|
|
+ /** ARREGLO QUE ALMACENA LAS TAREAS A MODIFICAR */
|
|
|
+ $taskToModify = array();
|
|
|
+
|
|
|
+ /** A PARTIR DEL WORKFLOW MODIFICADO, SE BUSCARÁN LOS NUEVOS CAMBIOS */
|
|
|
+ foreach ($workflow->tasks as &$task) {
|
|
|
+ /** ¿LA TAREA (SECUENCIA) ES MAYOR O IGUAL A LA PRIMERA SEQUENCIA QUE SE PUEDE MODIFICAR?
|
|
|
+ * Ó
|
|
|
+ * ¿LA SIGUIENTE TAREA (SECUENCIA) ES MAYOR A LA PRIMERA SEQUENCIA QUE SE PUEDE MODIFICAR? */
|
|
|
+ if ($task->sequence >= $firstSequence || $task->nextSequence > $firstSequence) {
|
|
|
+ /** ¿LA SECUENCIA ES IGUAL LA SECUENCIA DE LA CURRENT TASK? */
|
|
|
+ if ($task->sequence === $request->currentTask->sequence) {
|
|
|
+ /** SI ES ASÍ, DE IGUAL FORMA ES NECESARIO MODIFICARLA PORQUE PUEDE CAMBIAR SU NEXT/CHANGE SEQUENCE
|
|
|
+ SIN EMBARGO, SU WORKFLOW DEBERÁ QUEDARSE IGUAL */
|
|
|
+ if ($request->currentTask->workflow) {
|
|
|
+ $task->workflow = $request->currentTask->workflow;
|
|
|
+ $task->id_workflow = $request->currentTask->id_workflow;
|
|
|
+ }
|
|
|
+ /** EL STATUS Y DISPONIBILIDAD TAMBIÉN SE QUEDAN IGUAL */
|
|
|
+ $task->status = $request->currentTask->status;
|
|
|
+ $task->isAvailable = $request->currentTask->isAvailable;
|
|
|
+
|
|
|
+ /** SE ACTUALIZA LA CURRENT TASK DE LA SOLICITUD */
|
|
|
+ $request->currentTask = $task;
|
|
|
+
|
|
|
+ /** SE ACTUALIZA EL WORKFLOW DE LA SOLCITUD */
|
|
|
+ $key = array_search($request->currentTask->sequence, array_column($request->workflow->tasks, 'sequence'));
|
|
|
+ $request->workflow->tasks[$key] = $request->currentTask;
|
|
|
+ }
|
|
|
+ $taskToModify[] = $task;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $firstTaskModify = reset($taskToModify);
|
|
|
+
|
|
|
+ /*$sequencesWorkflow = array_map(function ($task) {
|
|
|
+ return $task->sequence;
|
|
|
+ }, $workflow->tasks);*/
|
|
|
+
|
|
|
+ foreach ($request->workflow->tasks as $key => $task) {
|
|
|
+ if ($task->sequence >= $firstTaskModify->sequence) {
|
|
|
+ /*if (!in_array($task->sequence, $sequencesWorkflow)) {
|
|
|
+ unset($request->workflow->tasks[$key]);
|
|
|
+ }*/
|
|
|
+ unset($request->workflow->tasks[$key]);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- $response = $this->assignWorkflowToRequest($request->workflow, $workflow);
|
|
|
+ $request->workflow->tasks = array_merge($request->workflow->tasks, $taskToModify);
|
|
|
|
|
|
- if ($response) {
|
|
|
+ $response = DB::table('requests')->where('id', $request->id)->update([
|
|
|
+ 'workflow' => json_encode($request->workflow),
|
|
|
+ 'currentTask' => json_encode($request->currentTask),
|
|
|
+ 'updated_at' => Carbon::now()->timezone('America/Mexico_City')->toDateTimeString()
|
|
|
+ ]);
|
|
|
|
|
|
+ if (!$response) {
|
|
|
+ $flag = false;
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- return $request;
|
|
|
- }, $requests);*/
|
|
|
-
|
|
|
-
|
|
|
+ if ($flag) {
|
|
|
+ return $this->makeResponse(
|
|
|
+ false,
|
|
|
+ "El workflow ha sido modificado con éxito.",
|
|
|
+ 200
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ return $this->makeResponse(
|
|
|
+ true,
|
|
|
+ "Hubo un error al modificar el workflow de las solicitudes.",
|
|
|
+ 401
|
|
|
+ );
|
|
|
+ }
|
|
|
} else {
|
|
|
return $this->makeResponse(
|
|
|
false,
|
|
|
- "El workflow fue modificado con éxito.",
|
|
|
+ "El workflow ha sido modificado con éxito.",
|
|
|
200
|
|
|
);
|
|
|
}
|
|
|
-
|
|
|
- return $requests;
|
|
|
} else {
|
|
|
return $this->makeResponse(
|
|
|
true,
|
|
|
@@ -796,8 +907,6 @@ class RequestController extends Controller
|
|
|
/** SERÁ TRUE CUANDO EXISTA UNA ACTUALIZACIÓN EN UNA TAREA */
|
|
|
$flag = false;
|
|
|
|
|
|
-
|
|
|
-
|
|
|
$workflow->tasks = array_map(function ($task) use ($workflowChange, &$flag) {
|
|
|
/** SOLO SI TIENE WORKFLOW SE HARÁ LA VERIFICACIÓN */
|
|
|
if ($task->workflow) {
|
|
|
@@ -821,9 +930,6 @@ class RequestController extends Controller
|
|
|
return $task;
|
|
|
}, $workflow->tasks);
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
/** SI ES TRUE SE ENVIA EL WORKFLOW CON SUS TAREAS MODIFICADAS Y EN CASO CONTRARIO SE RETORNA UN FALSE */
|
|
|
return $flag ? $workflow : $flag;
|
|
|
}
|
|
|
@@ -1012,69 +1118,10 @@ class RequestController extends Controller
|
|
|
|
|
|
/** CANCELAR EL WORKFLOW */
|
|
|
$workflow->status = 'Canceled';
|
|
|
- $workflow->isCompleted = false;
|
|
|
|
|
|
return $workflow;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * Cancelar un Workflow
|
|
|
- *
|
|
|
- * @param $request
|
|
|
- * @param $nextTask
|
|
|
- * @return mixed
|
|
|
- */
|
|
|
- private function cancelWorkflowInTask2s($request, $nextTask) {
|
|
|
- $flag = false;
|
|
|
-
|
|
|
- if ($request->workflow->isStopped) {
|
|
|
- $item = array_pop($request->workflowList);
|
|
|
-
|
|
|
- if ($item->currentTask->workflow) {
|
|
|
- $item->currentTask->workflow = $this->cancelWorkflow($item->currentTask->workflow);
|
|
|
- }
|
|
|
-
|
|
|
- $key = array_search($item->currentTask->sequence, array_column($item->workflow->tasks, 'sequence'));
|
|
|
- $item->workflow->tasks[$key] = $item->currentTask;
|
|
|
-
|
|
|
- /** VERIFICAR SI NO ES LA ÚLTIMA TAREA (FINALIZAR WORKFLOW) */
|
|
|
- $lastTask = end($item->workflow->tasks);
|
|
|
-
|
|
|
- if ($lastTask->id === $nextTask->id) {
|
|
|
- /** SI LO ES, SE COMPLETA LA TAREA Y SE VALIDA PARA DESPUÉS ASIGNARSE */
|
|
|
- $nextTask->status = 'Completed';
|
|
|
- $nextTask->isValidated = true;
|
|
|
- } else {
|
|
|
- $item->currentTask = $nextTask;
|
|
|
- $item->workflowList[] = $item;
|
|
|
- }
|
|
|
- } else {
|
|
|
- if ($request->currentTask->workflow) {
|
|
|
- $request->currentTask->workflow = $this->cancelWorkflow($request->currentTask->workflow);
|
|
|
- }
|
|
|
-
|
|
|
- $key = array_search($request->currentTask->sequence, array_column($request->workflow->tasks, 'sequence'));
|
|
|
- $request->workflow->tasks[$key] = $request->currentTask;
|
|
|
-
|
|
|
- $request->currentTask = $nextTask;
|
|
|
- }
|
|
|
-
|
|
|
- $response = DB::table('requests')->where('id', $request->id)->update([
|
|
|
- 'workflowList' => json_encode($request->workflowList),
|
|
|
- 'workflow' => json_encode($request->workflow),
|
|
|
- 'currentTask' => json_encode($request->currentTask),
|
|
|
- 'updated_at' => Carbon::now()->timezone('America/Mexico_City')->toDateTimeString()
|
|
|
- ]);
|
|
|
-
|
|
|
- return $request;
|
|
|
-
|
|
|
- if ($response) {
|
|
|
- return $this->executeRequest($request->id);
|
|
|
- } else {
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* Cancelar un Workflow
|
|
|
*
|