<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;

class DocumentManagementController extends Controller{
  private $responseController;
  private $encryptionController;
  private $functionsController;

  public function __construct(){
      $this->responseController = new ResponseController();
      $this->encryptionController = new EncryptionController();
      $this->functionsController = new FunctionsController();
  }

  public function downloadFile($token, $idUser, $line){
      DB::enableQueryLog();

      $tokenInfo = DB::table('S002V01TTODE')->where([
          ['TODE_NULI', '=', $line],
          ['TODE_TOKE', '=', $token]
      ])->first();

      if(is_null($tokenInfo)){
          return $this->responseController->makeResponse(true, 'El token de descarga no existe.', [], 404);
      }else if($tokenInfo->TODE_ESTA != 'Activo'){
          return $this->responseController->makeResponse(true, 'El token de descarga ya fue utilizado.', [], 401);
      }

      $token = $this->encryptionController->decrypt($token);
      if(!$token){
          return $this->responseController->makeResponse(true, 'El token de descarga no está encriptado correctamente.', [], 400);
      }

      $tokenArr = explode("|", $token);
      if(count($tokenArr) != 3){
          return $this->responseController->makeResponse(true, 'Estructura de token inválida.', [], 401);
      }else if(intval($tokenArr[1]) != $tokenInfo->TODE_LLAL){
          return $this->responseController->makeResponse(true, 'Token inválido.', [], 401);
      }else if($tokenArr[2] != 'syp'){
          return $this->responseController->makeResponse(true, 'Token inválido.', [], 401);
      }

      $idUser = $this->encryptionController->decrypt($idUser);
      if(!$idUser){
          return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_IDUS', '=', $idUser],
          ['USUA_NULI', '=', $line]
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
      }

      $id = $tokenArr[0];
      $codiArr = explode("=", $id);
      $prefArr = explode("-", $codiArr[0]);
      $suffArr = explode(".", $codiArr[2]);

      $nuli = intval($prefArr[0]);
      $como = $prefArr[1];
      $cldo = $prefArr[2];
      $fecr = $prefArr[3];
      $nuse = intval($prefArr[4]);
      $nuve = $codiArr[1];
      $noar = $suffArr[0];
      $exte = $suffArr[1];

      $nowStr = Carbon::now('America/Mexico_city')->toDateTimeString();
      DB::table('S002V01TTODE')->where([
          ['TODE_IDTO', '=', $tokenInfo->TODE_IDTO],
          ['TODE_NULI', '=', $line]
      ])->update([
          'TODE_ESTA' => 'Usado',
          'TODE_USDE' => $idUser,
          'TODE_FEDE' => $nowStr
      ]);
      
      $file = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $nuli],
          ['AFAL_COMO', '=', $como],
          ['AFAL_CLDO', '=', $cldo],
          ['AFAL_FECR', '=', $fecr],
          ['AFAL_NUSE', '=', $nuse],
          ['AFAL_NUVE', '=', $nuve],
          ['AFAL_NOAR', '=', $noar],
          ['AFAL_EXTE', '=', $exte],
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no existe.', [], 404);
      }

      return response()->download($file->AFAL_UBIC, $id);
  }

  public function getDownloadToken($idFile, $idUser, $line){
      DB::enableQueryLog();

      $idFile = $this->encryptionController->decrypt($idFile);
      if(!$idFile){
          return $this->responseController->makeResponse(true, 'El ID del archivo requerido no está encriptado correctamente.', [], 400);
      }

      $idUser = $this->encryptionController->decrypt($idUser);
      if(!$idUser){
          return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_IDUS', '=', $idUser],
          ['USUA_NULI', '=', $line]
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
      }

      $codiArr = explode("=", $idFile);
      $prefArr = explode("-", $codiArr[0]);
      $suffArr = explode(".", $codiArr[2]);

      $nuli = intval($prefArr[0]);
      $como = $prefArr[1];
      $cldo = $prefArr[2];
      $fecr = $prefArr[3];
      $nuse = intval($prefArr[4]);
      $nuve = $codiArr[1];
      $noar = $suffArr[0];
      $exte = $suffArr[1];
      
      $file = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $nuli],
          ['AFAL_COMO', '=', $como],
          ['AFAL_CLDO', '=', $cldo],
          ['AFAL_FECR', '=', $fecr],
          ['AFAL_NUSE', '=', $nuse],
          ['AFAL_NUVE', '=', $nuve],
          ['AFAL_NOAR', '=', $noar],
          ['AFAL_EXTE', '=', $exte],
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no existe.', [], 404);
      }

      $rand = rand(0, 99999);
      $tokenArr = [$idFile, $rand, "syp"];
      $tokenStr = join('|', $tokenArr);

      $token = $this->encryptionController->encrypt($tokenStr);
      $token = str_replace("+", "=P=", $token);
      $token = str_replace("/", "=S=", $token);
      $nowStr = Carbon::now('America/Mexico_city')->toDateTimeString();

      DB::table('S002V01TTODE')->insert([
          'TODE_NULI' => $line,
          'TODE_TOKE' => $token,
          'TODE_CODO' => $idFile,
          'TODE_LLAL' => $rand,
          'TODE_USRE' => $idUser,
          'TODE_FERE' => $nowStr
      ]);

      return $this->responseController->makeResponse(false, 'EXITO', ['TOKEN' => $token]);
  }

  public function getFileInfo($id, $idUser, $line){
      DB::enableQueryLog();

      $id = $this->encryptionController->decrypt($id);
      if(!$id){
          return $this->responseController->makeResponse(true, 'El ID del archivo requerido no está encriptado correctamente.', [], 400);
      }

      $idUser = $this->encryptionController->decrypt($idUser);
      if(!$idUser){
          return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_IDUS', '=', $idUser],
          ['USUA_NULI', '=', $line]
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
      }

      $idArr = explode("=", $id);
      $codiArr = explode("-", $idArr[0]);

      $nuli = $line;
      $como = $codiArr[1];
      $cldo = $codiArr[2];
      $fecr = $codiArr[3];
      $nuse = intval($codiArr[4]);
      $nuve = intval($idArr[1]);

      $fileInfo = DB::table('S002V01TAFAL')->select([
          'AFAL_NOAR AS NOMBREARCHIVO',
          'AFAL_EXTE AS EXTENSION',
          'AFAL_TAMA AS PESO',
          'AFAL_USAC AS ACCESO',
          'AFAL_ESTA AS ESTADO'
      ])->where([
          ['AFAL_NULI', '=', $nuli],
          ['AFAL_COMO', '=', $como],
          ['AFAL_CLDO', '=', $cldo],
          ['AFAL_FECR', '=', $fecr],
          ['AFAL_NUSE', '=', $nuse],
          ['AFAL_NUVE', '=', $nuve],
      ])->first();

      if(is_null($fileInfo)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no está registrado.', [], 404);
      }else if($fileInfo->ESTADO != 'Activo'){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no está disponible.', [], 404);
      }

      return $this->responseController->makeResponse(false, 'EXITO', $fileInfo);
  }

  public function getFiles($mod, $cla, $sda, $eda, $dna, $ext, $mode, $idUser, $line){
      DB::enableQueryLog();

      $idUser = $this->encryptionController->decrypt($idUser);
      if(!$idUser){
          return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_NULI', '=', $line],
          ['USUA_IDUS', '=', $idUser]
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
      }

      $availableModes = ['my-files', 'shared', 'deleted'];
      if(!in_array($mode, $availableModes)){
          return $this->responseController->makeResponse(true, 'El modo seleccionado es inválido.', [], 401);
      }

      $whereParameters = [
          ['AFAL_NULI', '=', $line]
      ];

      if($mod != '-'){
          $whereParameters[] = ['AFAL_COMO', '=', $mod];
      }
      
      if($cla != '-'){
          $whereParameters[] = ['AFAL_CLDO', '=', $cla];
      }

      $files = DB::table('S002V01TAFAL')->where($whereParameters)->get()->all();
      $filesDateFiltered = [];
      foreach($files as $file){
          $dateArr = str_split($file->AFAL_FECR, 2);
          $dateStr = "20$dateArr[0]-$dateArr[1]-$dateArr[2]";
          $dateObj = new Carbon($dateStr, 'America/Guatemala');

          if($sda != '-' && $eda == '-'){
              $dateIniArr = str_split($sda, 2);
              $dateIniStr = "20$dateIniArr[0]-$dateIniArr[1]-$dateIniArr[2]";
              $dateIniObj = new Carbon($dateIniStr, 'America/Guatemala');

              if($dateIniObj->lte($dateObj)){
                  $filesDateFiltered[] = $file;
              }
          }else if($sda == '-' && $eda != '-'){
              $dateFinArr = str_split($eda, 2);
              $dateFinStr = "20$dateFinArr[0]-$dateFinArr[1]-$dateFinArr[2]";
              $dateFinObj = new Carbon($dateFinStr, 'America/Guatemala');

              if($dateFinObj->gte($dateObj)){
                  $filesDateFiltered[] = $file;
              }
          }else if($sda != '-' && $eda != '-'){
              $dateIniArr = str_split($sda, 2);
              $dateIniStr = "20$dateIniArr[0]-$dateIniArr[1]-$dateIniArr[2]";
              $dateIniObj = new Carbon($dateIniStr, 'America/Guatemala');
              
              $dateFinArr = str_split($eda, 2);
              $dateFinStr = "20$dateFinArr[0]-$dateFinArr[1]-$dateFinArr[2]";
              $dateFinObj = new Carbon($dateFinStr, 'America/Guatemala');

              if($dateFinObj->gte($dateObj) && $dateIniObj->lte($dateObj)){
                  $filesDateFiltered[] = $file;
              }
          }else{
              $filesDateFiltered[] = $file;
          }
      }

      $filesNameFiltered = [];
      foreach($filesDateFiltered as $file){
          if($dna != '-' && $ext == '-'){
              if(str_contains($file->AFAL_NOAR, $dna)){
                  $filesNameFiltered[] = $file;
              }
          }else if($dna == '-' && $ext != '-'){
              //$extArr = explode(',', $ext);
              $extArr = json_decode($ext);
              if(in_array($file->AFAL_EXTE, $extArr)){
                  $filesNameFiltered[] = $file;
              }
          }else if($dna != '-' && $ext != '-'){
              $extArr = json_decode($ext);
              if(str_contains($file->AFAL_NOAR, $dna) && in_array($file->AFAL_EXTE, $extArr)){
                  $filesNameFiltered[] = $file;
              }
          }else{
              $filesNameFiltered[] = $file;
          }
      }
      
      $filesAccessFiltered = [];
      foreach($filesNameFiltered as $file){
          $access = json_decode($file->AFAL_USAC);

          if($mode == 'my-files' && $file->AFAL_USRE == $idUser && $file->AFAL_ESTA == 'Activo'){
              $filesAccessFiltered[] = $file;
          }else if($mode == 'shared' && in_array($idUser, $access) && $file->AFAL_USRE != $idUser && $file->AFAL_ESTA == 'Activo'){
              $filesAccessFiltered[] = $file;
          }else if($mode == 'deleted' && $file->AFAL_ESTA == 'Eliminado' && ($file->AFAL_USRE == $idUser || in_array($idUser, $access))){
              $filesAccessFiltered[] = $file;
          }
      }

      $filesF = [];
      foreach($filesAccessFiltered as $file){
          $linea = $file->AFAL_NULI < 10 ? "0" . $file->AFAL_NULI : "" . $file->AFAL_NULI . "";
          $secu = "";

          for($i = strlen($file->AFAL_NUSE); $i < 6; $i++){
              $secu .= "0";
          }

          $secu .= $file->AFAL_NUSE;
          $vers = $file->AFAL_NUVE < 10 ? "0" . $file->AFAL_NUVE : "" . $file->AFAL_NUVE . "";
          $fName = $file->AFAL_NOAR . '.' . $file->AFAL_EXTE;

          $usrReg = DB::table('S002V01TUSUA')->where([
              ['USUA_NULI', '=', $line],
              ['USUA_IDUS', '=', $file->AFAL_USRE],
          ])->first();
          $nameReg = $this->functionsController->joinName($usrReg->USUA_NOMB, $usrReg->USUA_APPA, $usrReg->USUA_APMA);
          $nameReg .= " (" . $file->AFAL_USRE . ")";

          $access = json_decode($file->AFAL_USAC, true);
          foreach($access as $k=>$v){
              $usrAcc = DB::table('S002V01TUSUA')->where([
                  ['USUA_NULI', '=', $line],
                  ['USUA_IDUS', '=', $v],
              ])->first();
              $nameAcc = $this->functionsController->joinName($usrAcc->USUA_NOMB, $usrAcc->USUA_APPA, $usrAcc->USUA_APMA);
              $nameAcc .= " (" . $v . ")";

              $access[$k] = $nameAcc;
          }

          $accessStr = json_encode($access); 

          $filesF[] = [
              'CODIGO' => $linea . '-' . $file->AFAL_COMO . '-' . $file->AFAL_CLDO . '-' . $file->AFAL_FECR . '-' . $secu,
              'VERSION' => $vers,
              'NOMBRE' => $fName,
              'TAMANIO' => $file->AFAL_TAMA,
              'USRREG' => $nameReg,
              'ACCESO' => $accessStr
          ];
      }

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();
      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $line,
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P01GEDO',
          'Consulta',
          "El usuario $name (" . $usr->USUA_IDUS . ") consultó los documentos registrados.",
          $idUser,
          $nowStr
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
      return $this->responseController->makeresponse(false, "EXITO", $filesF);
  }

  public function uploadTempFile(Request $request){
      DB::enableQueryLog();
      if(!$request->hasFile('file')){
          return $this->responseController->makeResponse(true, "No se envió ningún archivo.", [], 400);
      }

      $validator = Validator::make($request->all(), [
          'id_user' => 'required|string',
          'linea' => 'required|integer'
      ]);

      if($validator->fails()){
          return $this->responseController->makeResponse(
              true,
              "Se encontraron uno o más errores.",
              $this->responseController->makeErrors(
                  $validator->errors()->messages()
              ),
              401
          );
      }

      $form = $request->all();
      $idUser = $this->encryptionController->decrypt($form['id_user']);
      if(!$idUser){
          return $this->responseController->makeResponse(true, "El id del usuario que realizó la petición no fue encriptado correctamente", [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_IDUS', '=', $idUser],
          ['USUA_NULI', '=', $form['linea']]
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado', [], 404);
      }

      $originalFileName = $request->file('file')->getClientOriginalName();
      $extension = $request->file('file')->extension();
      $size = $request->file('file')->getSize();

      $extArr = explode(".", $originalFileName);
      $extArr = array_reverse($extArr);
      $extStr = $extArr[0];

      $isValid = $this->functionsController->checkFileSize($extStr, $size);
      if($isValid){
          $dir = str_replace("app\\Http\\Controllers", "storage\\app", __DIR__);
          $tmpPath = $request->file('file')->store('tempFiles');
          $tmpPath = str_replace("/", "\\", $tmpPath);

          $location = "$dir\\$tmpPath";
          $nowStr = Carbon::now('America/Mexico_city')->toDateTimeString();

          $fileID = DB::table('S002V01TARTE')->insertGetId([
              'ARTE_NULI' => $form['linea'],
              'ARTE_NOAR' => $originalFileName,
              'ARTE_EXTE' => $extension,
              'ARTE_TAMA' => $size,
              'ARTE_UBTE' => $location,
              'ARTE_USRE' => $idUser,
              'ARTE_FERE' => $nowStr
          ]);
          
          $actions = DB::getQueryLog();
          $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

          $idac = $this->functionsController->registerActivity(
              $form['linea'],
              'S002V01M04GDEL',
              'S002V01F01ADDO',
              'S002V01P05REDO',
              'Registro',
              "El usuario $name (" . $usr->USUA_IDUS . ") subió de manera temporal el archivo $originalFileName.",
              $idUser,
              $nowStr,
          );

          $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
          
          return $this->responseController->makeresponse(false, "EXITO", [
              'idArchivo' => $this->encryptionController->encrypt($fileID),
          ]);
      }else{
          return $this->responseController->makeResponse(true, "El archivo enviado tiene una extensión no soportada o sobrepasa el límite de peso de su categoría.", [], 400);
      }
  }

  public function deleteTempFile(Request $request){
      DB::enableQueryLog();
      $validator = Validator::make($request->all(), [
          'id_user' => 'required|string',
          'id_file' => 'required|string',
          'linea' => 'required|integer'
      ]);

      if($validator->fails()){
          return $this->responseController->makeResponse(
              true,
              "Se encontraron uno o más errores.",
              $this->responseController->makeErrors(
                  $validator->errors()->messages()
              ),
              401
          );
      }

      $form = $request->all();
      $idUser = $this->encryptionController->decrypt($form['id_user']);
      if(!$idUser){
          return $this->responseController->makeResponse(true, "El id del usuario que realizó la petición no fue encriptado correctamente", [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_IDUS', '=', $idUser],
          ['USUA_NULI', '=', $form['linea']]
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado', [], 404);
      }

      $idFile = $this->encryptionController->decrypt($form['id_file']);
      if(!$idFile){
          return $this->responseController->makeResponse(true, "El id del archivo que desea eliminar no fue encriptado correctamente", [], 400);
      }
      
      $file = DB::table('S002V01TARTE')->where([
          ['ARTE_IDAR', '=', $idFile],
          ['ARTE_NULI', '=', $form['linea']]
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo que desea eliminar no está registrado', [], 404);
      }

      if(file_exists($file->ARTE_UBTE)){
          unlink($file->ARTE_UBTE);
      }

      $nowStr = Carbon::now('America/Mexico_city')->toDateTimeString();
      DB::table('S002V01TARTE')->where([
          ['ARTE_IDAR', '=', $idFile],
          ['ARTE_NULI', '=', $form['linea']]
      ])->update([
          'ARTE_ESTA' => 'Eliminado',
          'ARTE_USMO' => $idUser,
          'ARTE_FEMO' => $nowStr
      ]);

      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $form['linea'],
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P05REDO',
          'Eliminación',
          "El usuario $name (" . $usr->USUA_IDUS . ") eliminó el archivo " . $file->ARTE_NOAR,
          $idUser,
          $nowStr,
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
      return $this->responseController->makeresponse(false, "EXITO");
  }
  
  public function saveFinalFile(Request $request) {
      DB::enableQueryLog();

      $validator = Validator::make($request->all(), [
          'id_user' => 'required|string',
          'id_file' => 'required|string',
          'linea' => 'required|integer',
          'module' => 'required|string|max:4',
          'clasification' => 'required|string|max:2',
          'has_order' => 'required|string|in:S,N',
          'id_order' => 'required_if:has_order,=,S|string',
      ]);

      if($validator->fails()){
          return $this->responseController->makeResponse(
              true,
              "Se encontraron uno o más errores.",
              $this->responseController->makeErrors(
                  $validator->errors()->messages()
              ),
              401
          );
      }

      $form = $request->all();
      $idUser = $this->encryptionController->decrypt($form['id_user']);
      if(!$idUser){
          return $this->responseController->makeResponse(true, "El id del usuario que realizó la petición no fue encriptado correctamente", [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_NULI', '=', $form['linea']],
          ['USUA_IDUS', '=', $idUser],
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado', [], 404);
      }

      $idFile = $this->encryptionController->decrypt($form['id_file']);
      if(!$idFile){
          return $this->responseController->makeResponse(true, "El id del archivo solicitado no fue encriptado correctamente", [], 400);
      }

      $tempFile = DB::table('S002V01TARTE')->where([
          ['ARTE_NULI', '=', $form['linea']],
          ['ARTE_IDAR', '=', $idFile],
      ])->first();

      if(is_null($tempFile)){
          return $this->responseController->makeResponse(true, 'El archivo consultado no está registrado', [], 404);
      }else if($tempFile->ARTE_ESTA == 'Eliminado'){
          return $this->responseController->makeResponse(true, 'El archivo consultado está eliminado', [], 404);
      }

      $fileResponse = $this->moveFinalFile(
          intval($form['linea']),
          $form['module'],
          $form['clasification'],
          $tempFile,
          $idUser,
      );

      if(!$fileResponse[0]){
          return $this->responseController->makeResponse(true, $fileResponse[1], [], 400);
      }

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();

      if($form['has_order'] == 'S' && ($form['module'] == 'GMPR' || $form['module'] == 'GMCO')){
          $idOrder = $this->encryptionController->decrypt($form['id_order']);
          if(!$idOrder){
              return $this->responseController->makeResponse(true, "El id de la orden relacionada no fue encriptado correctamente", [], 400);
          }

          $order = DB::table('S002V01TOTPR')->where([
              ['OTPR_IDOT', '=', $idOrder],
              ['OTPR_NULI', '=', $form['linea']]
          ])->first();

          if(is_null($order)){
              return $this->responseController->makeResponse(true, 'La orden solicitada no está registrada', [], 404);
          }

          $documentsArr = json_decode($order->OTPR_DONE, true);
          $fileCodeEnc = $this->encryptionController->encrypt($fileResponse[1]);

          $documentsArr[] = $fileCodeEnc;
          $documentsStr = json_encode($documentsArr);

          DB::table('S002V01TOTPR')->where([
              ['OTPR_IDOT', '=', $idOrder],
              ['OTPR_NULI', '=', $form['linea']]
          ])->update([
              'OTPR_DONE' => $documentsStr,
              'OTPR_USMO' => $idUser,
              'OTPR_FEMO' => $nowStr
          ]);
      }

      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $form['linea'],
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P05REDO',
          'Registro',
          "El usuario $name (" . $usr->USUA_IDUS . ") registró el archivo " . $tempFile->ARTE_NOAR,
          $idUser,
          $nowStr,
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
      return $this->responseController->makeresponse(false, "EXITO");
  }

  public function moveFinalFile(int $line, string $como, string $cldo, object $tempFile, string $idUser) {
      $modulesCodes = [
          "GEAD","GIST","GMPR","GMCO","GEEQ","COAC","GEPR",
          "ANFA","PCSA","GPRS","GEPR","GDEL","ADSI","USPE"
      ];

      $clasifications = [
          "AV","AU","CA","CE","CO","DP","FA","FI",
          "FO","IN","LA","OR","PL","RE","VI"
      ];

      if(!in_array($como, $modulesCodes)){
          return [false, "El código $como es inválido."];
      }

      if(!in_array($cldo, $clasifications)){
          return [false, "La clasificación $cldo es inválida."];
      }

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();
      $dateTimeArr = explode(' ', $nowStr);
      $dateArr = explode('-', $dateTimeArr[0]);
      $year = substr($dateArr[0], 2);

      $fecr = "$year$dateArr[1]$dateArr[2]";
      $sec = DB::table('S002V01TAFAL')->where([
          ['AFAL_COMO', '=', $como],
          ['AFAL_CLDO', '=', $cldo],
          ['AFAL_NULI', '=', $line],
      ])->orderBy('AFAL_NUSE', 'desc')->first();

      $nuse = 1;
      if(!is_null($sec)){
          $nuse = intval($sec->AFAL_NUSE) + 1;
      }

      $fileNameArr = explode('.', $tempFile->ARTE_NOAR);
      array_pop($fileNameArr);

      $noar = implode('.', $fileNameArr);
      $exte = $tempFile->ARTE_EXTE;

      $ver = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $line],
          ['AFAL_COMO', '=', $como],
          ['AFAL_CLDO', '=', $cldo],
          ['AFAL_NOAR', '=', $noar],
          ['AFAL_EXTE', '=', $exte],
      ])->orderBy('AFAL_NUVE', 'desc')->first();

      $nuve = 1;
      if(!is_null($ver)){
          $nuve = intval($sec->AFAL_NUVE) + 1;
      }

      $tama = $tempFile->ARTE_TAMA;
      $ubiFileArr = explode('tempFiles', $tempFile->ARTE_UBTE);
      $ubic = $ubiFileArr[0] . 'files' . $ubiFileArr[1];

      if(file_exists($tempFile->ARTE_UBTE)){
          rename($tempFile->ARTE_UBTE, $ubic);
          DB::table('S002V01TARTE')->where([
              ['ARTE_IDAR', '=', $tempFile->ARTE_IDAR],
              ['ARTE_NULI', '=', $line],
          ])->update([
              'ARTE_ESTA' => 'Eliminado',
              'ARTE_USMO' => $idUser,
              'ARTE_FEMO' => $nowStr,
          ]);
      }

      $code = $line < 10 ? "0$line" : "$line";
      $code .= "-$como-$cldo-$fecr-";

      for($i = strlen($nuse); $i < 6; $i++){
          $code .= "0";
      }

      $code .= "$nuse=";
      $code .= $nuve < 10 ? "0$nuve=" : "$nuve=";
      $code .= "$noar.$exte";

      $usac = json_encode([$idUser]);

      DB::table('S002V01TAFAL')->insert([
          'AFAL_NULI' => $line,
          'AFAL_COMO' => $como,
          'AFAL_CLDO' => $cldo,
          'AFAL_FECR' => $fecr,
          'AFAL_NUSE' => $nuse,
          'AFAL_NUVE' => $nuve,
          'AFAL_NOAR' => $noar,
          'AFAL_EXTE' => $exte,
          'AFAL_TAMA' => $tama,
          'AFAL_UBIC' => $ubic,
          'AFAL_USAC' => $usac,
          'AFAL_USRE' => $idUser,
          'AFAL_FERE' => $nowStr
      ]);

      return [true, $code];
  }
  
  public function getPublicDocumentURL($id, $idUser, $line) {
      DB::enableQueryLog();

      $idUser = $this->encryptionController->decrypt($idUser);
      if(!$idUser){
          return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_NULI', '=', $line],
          ['USUA_IDUS', '=', $idUser],
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
      }

      $id = $this->encryptionController->decrypt($id);
      if(!$id){
          return $this->responseController->makeResponse(true, 'El ID del archivo solicitado no está encriptado correctamente.', [], 400);
      }

      $idArr = explode('=', $id);
      $codeArr = explode('-', $idArr[0]);

      $file = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $codeArr[0]],
          ['AFAL_COMO', '=', $codeArr[1]],
          ['AFAL_CLDO', '=', $codeArr[2]],
          ['AFAL_FECR', '=', $codeArr[3]],
          ['AFAL_NUSE', '=', $codeArr[4]],
          ['AFAL_NUVE', '=', $idArr[1]],
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no está registrado.', [], 404);
      }

      $ubicArr = explode('storage', $file->AFAL_UBIC);
      $publicUbi = "$ubicArr[0]public\\public_files\\$id";

      if(!file_exists($publicUbi)){
          copy($file->AFAL_UBIC, $publicUbi);
      }

      $publicUbiStr = str_replace('C:\ITTEC\SAM\Dev\SistemaMantenimiento\sistema-mantenimiento-back\public\\', 'http://192.168.100.105:8000/', $publicUbi);
      $publicUbiStr = str_replace('\\', '/', $publicUbiStr);

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();
      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $line,
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P01GEDO',
          'Consulta',
          "El usuario $name (" . $usr->USUA_IDUS . ") consultó la URL pública del archivo $id.",
          $idUser,
          $nowStr
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
      return $this->responseController->makeresponse(false, "EXITO", ['public_uri' => $publicUbiStr]);
  }

  public function getFileAccess($id, $idUser, $line) {
      DB::enableQueryLog();

      $idUser = $this->encryptionController->decrypt($idUser);
      if(!$idUser){
          return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_NULI', '=', $line],
          ['USUA_IDUS', '=', $idUser],
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
      }

      $id = $this->encryptionController->decrypt($id);
      if(!$id){
          return $this->responseController->makeResponse(true, 'El ID del archivo solicitado no está encriptado correctamente.', [], 400);
      }

      $idArr = explode('=', $id);
      $codeArr = explode('-', $idArr[0]);

      $file = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $codeArr[0]],
          ['AFAL_COMO', '=', $codeArr[1]],
          ['AFAL_CLDO', '=', $codeArr[2]],
          ['AFAL_FECR', '=', $codeArr[3]],
          ['AFAL_NUSE', '=', $codeArr[4]],
          ['AFAL_NUVE', '=', $idArr[1]],
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no está registrado.', [], 404);
      }

      $owner = $this->encryptionController->encrypt($file->AFAL_USRE);
      $permissionsArr = json_decode($file->AFAL_USAC, true);
      foreach($permissionsArr as $k=>$v){
          $idEnc = $this->encryptionController->encrypt($v);
          $permissionsArr[$k] = $idEnc;
      }

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();
      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $line,
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P01GEDO',
          'Consulta',
          "El usuario $name (" . $usr->USUA_IDUS . ") consultó los usuarios con acceso al archivo $id.",
          $idUser,
          $nowStr
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
      return $this->responseController->makeresponse(false, "EXITO", [
          'access' => $permissionsArr,
          'owner' => $owner
      ]);
  }
  
  public function updateFilePermissions(Request $request) {
      DB::enableQueryLog();

      $validator = Validator::make($request->all(), [
          'id_user' => 'required|string',
          'id_file' => 'required|string',
          'linea' => 'required|integer',
          'permissions' => 'required|json',
      ]);

      if($validator->fails()){
          return $this->responseController->makeResponse(
              true,
              "Se encontraron uno o más errores.",
              $this->responseController->makeErrors(
                  $validator->errors()->messages()
              ),
              401
          );
      }

      $form = $request->all();
      $idUser = $this->encryptionController->decrypt($form['id_user']);
      if(!$idUser){
          return $this->responseController->makeResponse(true, "El ID del usuario que realizó la petición no fue encriptado correctamente", [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_NULI', '=', $form['linea']],
          ['USUA_IDUS', '=', $idUser],
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado', [], 404);
      }

      $idFile = $this->encryptionController->decrypt($form['id_file']);
      if(!$idFile){
          return $this->responseController->makeResponse(true, "El ID del archivo solicitado no fue encriptado correctamente.", [], 400);
      }

      $idFileArr = explode('=', $idFile);
      $codeArr = explode('-', $idFileArr[0]);
      $file = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $codeArr[0]],
          ['AFAL_COMO', '=', $codeArr[1]],
          ['AFAL_CLDO', '=', $codeArr[2]],
          ['AFAL_FECR', '=', $codeArr[3]],
          ['AFAL_NUSE', '=', $codeArr[4]],
          ['AFAL_NUVE', '=', $idFileArr[1]],
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no está registrado.', [], 404);
      }

      $permissionsArr = json_decode($file->AFAL_USAC, true);
      if(!in_array($idUser, $permissionsArr)){
          $usrName = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA) . " ($idUser)";
          return $this->responseController->makeResponse(true, "El usuario $usrName no tiene permisos para modificar el archivo $idFile.", [], 401);
      }

      $newPermissionsArr = json_decode($form['permissions'], true);
      if(count($newPermissionsArr) <= 0){
          return $this->responseController->makeResponse(true, "El arreglo de permisos está vacío.", [], 400);
      }

      $newPermissionsArrDec = [];
      foreach($newPermissionsArr as $val){
          $idDec = $this->encryptionController->decrypt($val);
          if(!$idDec){
              return $this->responseController->makeResponse(true, "Alguno de los ID's enviados no fue encriptado correctamente.", [], 400);
          }

          $newPermissionsArrDec[] = $idDec;
      }

      if(!in_array($file->AFAL_USRE, $newPermissionsArrDec)){
          return $this->responseController->makeResponse(true, "El arreglo de permisos no incluye el ID del propietario.", [], 401);
      }

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();
      $usac = json_encode($newPermissionsArrDec);
      DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $codeArr[0]],
          ['AFAL_COMO', '=', $codeArr[1]],
          ['AFAL_CLDO', '=', $codeArr[2]],
          ['AFAL_FECR', '=', $codeArr[3]],
          ['AFAL_NUSE', '=', $codeArr[4]],
          ['AFAL_NUVE', '=', $idFileArr[1]],
      ])->update([
          'AFAL_USAC' => $usac,
          'AFAL_USMO' => $idUser,
          'AFAL_FEMO' => $nowStr,
      ]);
      
      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $form['linea'],
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P01GEDO',
          'Actualización',
          "El usuario $name (" . $usr->USUA_IDUS . ") actualizó los usuarios con acceso del archivo $idFile.",
          $idUser,
          $nowStr
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
      return $this->responseController->makeresponse(false, "EXITO");
  }

  public function deleteFile(Request $request) {
      DB::enableQueryLog();

      $validator = Validator::make($request->all(), [
          'id_user' => 'required|string',
          'id_file' => 'required|string',
          'linea' => 'required|integer',
      ]);

      if($validator->fails()){
          return $this->responseController->makeResponse(
              true,
              "Se encontraron uno o más errores.",
              $this->responseController->makeErrors(
                  $validator->errors()->messages()
              ),
              401
          );
      }

      $form = $request->all();
      $idUser = $this->encryptionController->decrypt($form['id_user']);
      if(!$idUser){
          return $this->responseController->makeResponse(true, "El ID del usuario que realizó la petición no fue encriptado correctamente", [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_NULI', '=', $form['linea']],
          ['USUA_IDUS', '=', $idUser],
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado', [], 404);
      }

      $idFile = $this->encryptionController->decrypt($form['id_file']);
      if(!$idFile){
          return $this->responseController->makeResponse(true, "El ID del archivo solicitado no fue encriptado correctamente.", [], 400);
      }

      $idFileArr = explode('=', $idFile);
      $codeArr = explode('-', $idFileArr[0]);
      $file = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $codeArr[0]],
          ['AFAL_COMO', '=', $codeArr[1]],
          ['AFAL_CLDO', '=', $codeArr[2]],
          ['AFAL_FECR', '=', $codeArr[3]],
          ['AFAL_NUSE', '=', $codeArr[4]],
          ['AFAL_NUVE', '=', $idFileArr[1]],
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no está registrado.', [], 404);
      }else if($file->AFAL_ESTA == 'Eliminado'){
          return $this->responseController->makeResponse(true, 'El archivo solicitado está eliminado.', [], 401);
      }

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();
      DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $codeArr[0]],
          ['AFAL_COMO', '=', $codeArr[1]],
          ['AFAL_CLDO', '=', $codeArr[2]],
          ['AFAL_FECR', '=', $codeArr[3]],
          ['AFAL_NUSE', '=', $codeArr[4]],
          ['AFAL_NUVE', '=', $idFileArr[1]],
      ])->update([
          'AFAL_ESTA' => 'Eliminado',
          'AFAL_USMO' => $idUser,
          'AFAL_FEMO' => $nowStr
      ]);
      
      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $form['linea'],
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P01GEDO',
          'Eliminación',
          "El usuario $name (" . $usr->USUA_IDUS . ") eliminó el archivo $idFile.",
          $idUser,
          $nowStr
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
      return $this->responseController->makeresponse(false, "EXITO");
  }

  public function getAssociatedWorkOrders($idFile, $idUser, $line) {
      DB::enableQueryLog();

      $idUser = $this->encryptionController->decrypt($idUser);
      if(!$idUser){
          return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la petición no está encriptado correctamente.', [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_NULI', '=', $line],
          ['USUA_IDUS', '=', $idUser]
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado.', [], 404);
      }

      $idFile = $this->encryptionController->decrypt($idFile);
      if(!$idFile){
          return $this->responseController->makeResponse(true, 'El ID del archivo solicitado no está encriptado correctamente.', [], 400);
      }

      $idFileArr = explode('=', $idFile);
      $codeArr = explode('-', $idFileArr[0]);
      $file = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $line],
          ['AFAL_COMO', '=', $codeArr[1]],
          ['AFAL_CLDO', '=', $codeArr[2]],
          ['AFAL_FECR', '=', $codeArr[3]],
          ['AFAL_NUSE', '=', $codeArr[4]],
          ['AFAL_NUVE', '=', $idFileArr[1]],
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no está registrado.', [], 404);
      }

      $orders = DB::table('S002V01TOTPR')
      ->select([
          'OTPR_IDOT AS IDORDEN',
          'OTPR_EQIN AS EQUIPAMIENTO',
          'OTPR_ACAS AS ACTIVADOR',
          'OTPR_CLAS AS CLASIFICACION',
          'ACTI_PRIO AS PRIORIDAD',
          'ACTI_TIAC AS TIPOACTIVADOR'
      ])->join('S002V01TACTI', 'OTPR_ACAS', '=', 'ACTI_IDCO')
      ->where('OTPR_NULI', '=', $line)
      ->whereJsonContains('OTPR_DONE', $idFile)->get()->all();

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();
      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $line,
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P01GEDO',
          'Consulta',
          "El usuario $name (" . $usr->USUA_IDUS . ") consultó las órdenes de trabajo relacionadas al archivo $idFile.",
          $idUser,
          $nowStr
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
      return $this->responseController->makeresponse(false, "EXITO", $orders);
  }

  public function changeAssociationStatus(Request $request) {
      DB::enableQueryLog();

      $validator = Validator::make($request->all(), [
          'id_user' => 'required|string',
          'linea' => 'required|integer',
          'id_file' => 'required|string',
          'action' => 'required|string|in:disassociate,associate',
          'id_order' => 'required|string',
      ]);

      if($validator->fails()){
          return $this->responseController->makeResponse(
              true,
              "Se encontraron uno o más errores.",
              $this->responseController->makeErrors(
                  $validator->errors()->messages()
              ),
              401
          );
      }

      $form = $request->all();
      $idUser = $this->encryptionController->decrypt($form['id_user']);
      if(!$idUser){
          return $this->responseController->makeResponse(true, "El ID del usuario que realizó la petición no fue encriptado correctamente", [], 400);
      }

      $usr = DB::table('S002V01TUSUA')->where([
          ['USUA_NULI', '=', $form['linea']],
          ['USUA_IDUS', '=', $idUser],
      ])->first();

      if(is_null($usr)){
          return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado', [], 404);
      }

      $idFile = $this->encryptionController->decrypt($form['id_file']);
      if(!$idFile){
          return $this->responseController->makeResponse(true, "El ID del archivo solicitado no fue encriptado correctamente.", [], 400);
      }

      $idFileArr = explode('=', $idFile);
      $codeArr = explode('-', $idFileArr[0]);
      $file = DB::table('S002V01TAFAL')->where([
          ['AFAL_NULI', '=', $codeArr[0]],
          ['AFAL_COMO', '=', $codeArr[1]],
          ['AFAL_CLDO', '=', $codeArr[2]],
          ['AFAL_FECR', '=', $codeArr[3]],
          ['AFAL_NUSE', '=', $codeArr[4]],
          ['AFAL_NUVE', '=', $idFileArr[1]],
      ])->first();

      if(is_null($file)){
          return $this->responseController->makeResponse(true, 'El archivo solicitado no está registrado.', [], 404);
      }else if($file->AFAL_ESTA == 'Eliminado'){
          return $this->responseController->makeResponse(true, 'El archivo solicitado está eliminado.', [], 401);
      }

      $idOrder = $this->encryptionController->decrypt($form['id_order']);
      if(!$idOrder){
          return $this->responseController->makeResponse(true, 'El ID de la orden solicitada no fue encriptado correctamente.', [], 400);
      }

      $workOrder = DB::table('S002V01TOTPR')->where([
          ['OTPR_NULI', '=', $form['linea']],
          ['OTPR_IDOT', '=', $idOrder]
      ])->first();
      
      if(is_null($workOrder)){
          return $this->responseController->makeResponse(true, 'La orden solicitada no existe', [], 404);
      }else if($workOrder->OTPR_ESTA == 'E'){
          return $this->responseController->makeResponse(true, 'La orden solicitada está eliminada', [], 401);
      }
      
      $filesArr = json_decode($workOrder->OTPR_DONE, true);
      if($form['action'] == 'disassociate'){
          if(!in_array($idFile, $filesArr)){
              return $this->responseController->makeResponse(true, 'El archivo enviado no está asociado a la orden de trabajo.', [], 401);
          }

          $filesArrAux = [];
          foreach($filesArr as $fileStr){
              if($fileStr != $idFile){
                  $filesArrAux[] = $fileStr;
              }
          }

          $filesArr = $filesArrAux;
      }else{
          if(in_array($idFile, $filesArr)){
              return $this->responseController->makeResponse(true, 'El archivo enviado ya está asociado a la orden de trabajo.', [], 401);
          }
          $filesArr[] = $idFile;
      }

      $now = $this->functionsController->now();
      $nowStr = $now->toDateTimeString();
      $filesStr = json_encode($filesArr);

      DB::table('S002V01TOTPR')->where([
          ['OTPR_NULI', '=', $form['linea']],
          ['OTPR_IDOT', '=', $idOrder]
      ])->update([
          'OTPR_DONE' => $filesStr,
          'OTPR_USMO' => $idUser,
          'OTPR_FEMO' => $nowStr,
      ]);
      
      $actions = DB::getQueryLog();
      $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);

      $idac = $this->functionsController->registerActivity(
          $form['linea'],
          'S002V01M04GDEL',
          'S002V01F01ADDO',
          'S002V01P01GEDO',
          'Actualización',
          "El usuario $name (" . $usr->USUA_IDUS . ") actualizó la relación del archivo $idFile y la orden de trabajo #$idOrder.",
          $idUser,
          $nowStr
      );

      $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
      return $this->responseController->makeresponse(false, "EXITO");
  }
}