InterventionController.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Carbon\Carbon;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Storage;
  7. use Illuminate\Support\Facades\Validator;
  8. use stdClass;
  9. use Throwable;
  10. class InterventionController extends Controller{
  11. private $responseController;
  12. private $encryptionController;
  13. private $documentManagementController;
  14. private $functionsController;
  15. public function __construct(){
  16. $this->responseController = new ResponseController();
  17. $this->encryptionController = new EncryptionController();
  18. $this->documentManagementController = new DocumentManagementController();
  19. $this->functionsController = new FunctionsController();
  20. }
  21. public function storeContract(Request $request) {
  22. DB::enableQueryLog();
  23. $request['CONTRACT_COST'] = $this->encryptionController->decrypt($request->CONTRACT_COST) ? $this->encryptionController->decrypt($request->CONTRACT_COST) : 'ENC_ERR';
  24. $request['CONTRACT_COST'] = floatval($request->CONTRACT_COST);
  25. $validator = Validator::make($request->all(), [
  26. 'id_user' => 'required|string',
  27. 'linea' => 'required|integer',
  28. 'CONTRACT_NAME' => 'required|string|max:100',
  29. 'WORK_ORDER' => 'required|string',
  30. 'CONTRACT_TYPE' => 'required|string|in:Subcontratista,Interno',
  31. 'DENOMINATION' => 'required|string',
  32. 'START_DATE' => 'required|date',
  33. 'END_DATE' => 'required|date',
  34. 'CONTRACT_COST' => 'required|numeric',
  35. 'DOCUMENT' => 'required|json',
  36. ]);
  37. if ($validator->fails()) {
  38. return $this->responseController->makeResponse(
  39. TRUE,
  40. 'ERR_CONTRATO_REG001: Uno o más errores encontrados',
  41. $this->responseController->makeErrors($validator->errors()->messages()),
  42. 400
  43. );
  44. }
  45. $form = $request->all();
  46. foreach($form as $k=>$v){
  47. if($k == 'CONTRACT_COST' && $v == '0'){
  48. unset($form[$k]);
  49. }else if($v == '-'){
  50. unset($form[$k]);
  51. }
  52. }
  53. $idUser = $this->encryptionController->decrypt($form['id_user']);
  54. if(!$idUser){
  55. return $this->responseController->makeResponse(true, 'El ID de usuario no fue encriptado correctamente.', [], 400);
  56. }
  57. $usr = DB::table('S002V01TUSUA')->where([
  58. ['USUA_NULI', '=', $form['linea']],
  59. ['USUA_IDUS', '=', $idUser]
  60. ])->first();
  61. if(is_null($usr)){
  62. return $this->responseController->makeResponse(true, 'El usuario que realizó la petición no existe.', [], 404);
  63. }
  64. $idOrderArr = explode('-', $form['WORK_ORDER']);
  65. $idOrder = $this->encryptionController->decrypt($idOrderArr[0]);
  66. if(!$idOrder){
  67. return $this->responseController->makeResponse(true, 'El ID de la orden seleccionada no está encriptado correctamente.', [], 400);
  68. }
  69. $order = null;
  70. if($idOrderArr[1] == 'prev'){
  71. $order = DB::table('S002V01TOTPR')->where([
  72. ['OTPR_NULI', '=', $form['linea']],
  73. ['OTPR_IDOT', '=', $idOrder],
  74. ])->first();
  75. }else{
  76. //PENDIENTE MANTENIMIENTO CORRECTIVO
  77. }
  78. if(is_null($order)){
  79. return $this->responseController->makeResponse(true, 'La orden seleccionada no existe.', [], 404);
  80. }
  81. $workersStr = "[]";
  82. if($idOrderArr[1] == 'prev'){
  83. $workersStr = $order->OTPR_OPPR;
  84. }else{
  85. //PENDIENTE MANTENIMIENTO PREVENTIVO
  86. }
  87. $workersArr = json_decode($workersStr, true);
  88. $staff = [];
  89. foreach($workersArr as $worker){
  90. $type = $worker['TYPE'];
  91. switch($type){
  92. case "EM":
  93. if(!in_array(intval($worker['ID']), $staff)){
  94. $staff[] = intval($worker['ID']);
  95. }
  96. break;
  97. case "EQ":
  98. $employees = DB::table('S002V01TPERS')->where([
  99. ['PERS_NULI', '=', $form['linea']],
  100. ['PERS_EQTR', '=', $worker['ID']],
  101. ])->get()->all();
  102. foreach($employees as $employee){
  103. if(!in_array(intval($employee->PERS_IDPE), $staff)){
  104. $staff[] = intval($employee->PERS_IDPE);
  105. }
  106. }
  107. break;
  108. case "SU":
  109. $employees = DB::table('S002V01TPERS')->where([
  110. ['PERS_NULI', '=', $form['linea']],
  111. ['PERS_IDPS', '=', $worker['ID']],
  112. ])->get()->all();
  113. foreach($employees as $employee){
  114. if(!in_array(intval($employee->PERS_IDPE), $staff)){
  115. $staff[] = intval($employee->PERS_IDPE);
  116. }
  117. }
  118. break;
  119. }
  120. }
  121. $idEmployee = $this->encryptionController->decrypt($form['DENOMINATION']);
  122. if(!$idEmployee){
  123. return $this->responseController->makeResponse(true, 'El ID del empleado seleccionado no está encriptado correctamente.', [], 400);
  124. }else if(!in_array(intval($idEmployee), $staff)){
  125. return $this->responseController->makeResponse(true, 'El empleado seleccionado no está ligado a la orden de trabajo seleccionada.', [], 400);
  126. }
  127. $employee = DB::table('S002V01TPERS')->where([
  128. ['PERS_NULI', '=', $form['linea']],
  129. ['PERS_IDPE', '=', $idEmployee]
  130. ])->first();
  131. if(is_null($employee)){
  132. return $this->responseController->makeResponse(true, 'El empleado seleccionado no existe.', [], 404);
  133. }
  134. $orderType = $idOrderArr[1] == 'prev' ? 'Preventivo' : 'Correctivo';
  135. $contract = DB::table('S002V01TCONT')->where([
  136. ['CONT_NULI', '=', $form['linea']],
  137. ['CONT_IDEM', '=', $idEmployee],
  138. ['CONT_IDOT', '=', $idOrder],
  139. ['CONT_TOTR', '=', $orderType],
  140. ])->first();
  141. if(!is_null($contract)){
  142. return $this->responseController->makeResponse(true, "El empleado #$idEmployee ya tiene un contrato relacionado a la orden de trabajo $orderType #$idOrder", [], 404);
  143. }
  144. $docsArr = json_decode($form['DOCUMENT'], true);
  145. $finalDocsArr = [];
  146. foreach($docsArr as $doc){
  147. $idFileDec = $this->encryptionController->decrypt($doc['id']);
  148. $tempFile = DB::table('S002V01TARTE')->where([
  149. ['ARTE_NULI', '=', $form['linea']],
  150. ['ARTE_IDAR', '=', $idFileDec],
  151. ])->first();
  152. if(is_null($tempFile)){
  153. return $this->responseController->makeResponse(true, "El archivo $doc[name] no está registrado.", [], 404);
  154. }
  155. $cldo = "CO";
  156. $finalFile = $this->documentManagementController->moveFinalFile($form['linea'], "GPRS", $cldo, $tempFile, $idUser);
  157. if(!$finalFile[0]){
  158. return $this->responseController->makeResponse(true, $finalFile[1], [], 400);
  159. }else{
  160. $finalDocsArr[] = $finalFile[1];
  161. }
  162. }
  163. if(!isset($form['CONTRACT_COST'])){
  164. return $this->responseController->makeResponse(true, 'El costo del contrato no fue encriptado correctamente.', [], 400);
  165. }
  166. $lido = json_encode($finalDocsArr);
  167. $now = $this->functionsController->now();
  168. $nowStr = $now->toDateTimeString();
  169. $idContract = DB::table('S002V01TCONT')->insertGetId([
  170. 'CONT_NULI' => $form['linea'],
  171. 'CONT_NOCO' => $form['CONTRACT_NAME'],
  172. 'CONT_IDEM' => $idEmployee,
  173. 'CONT_IDOT' => $idOrder,
  174. 'CONT_TOTR' => $orderType,
  175. 'CONT_TIPO' => $form['CONTRACT_TYPE'],
  176. 'CONT_FEIN' => $form['START_DATE'],
  177. 'CONT_FEFI' => $form['END_DATE'],
  178. 'CONT_COST' => $form['CONTRACT_COST'],
  179. 'CONT_LIDO' => $lido,
  180. 'CONT_USRE' => $idUser,
  181. 'CONT_FERE' => $nowStr,
  182. ]);
  183. $actions = DB::getQueryLog();
  184. $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
  185. $idac = $this->functionsController->registerActivity(
  186. $form['linea'],
  187. 'S002V01M11GPRS',
  188. 'S002V01F02ADCN',
  189. 'S002V01P02RECO',
  190. 'Registro',
  191. "El usuario $name (" . $usr->USUA_IDUS . ") registró el contrato #$idContract.",
  192. $idUser,
  193. $nowStr,
  194. 'S002V01S03GEIN'
  195. );
  196. $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $form['linea']);
  197. return $this->responseController->makeResponse(false, 'EXITO');
  198. }
  199. public function getConsultOfContracts($idUser, $line) {
  200. DB::enableQueryLog();
  201. $idUser = $this->encryptionController->decrypt($idUser);
  202. if(!$idUser){
  203. return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la solicitud no está encriptado correctamente', [], 400);
  204. }
  205. $usr = DB::table('S002V01TUSUA')->where([
  206. ['USUA_NULI', '=', $line],
  207. ['USUA_IDUS', '=', $idUser],
  208. ])->first();
  209. if(is_null($usr)){
  210. return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado', [], 404);
  211. }
  212. $contracts = DB::table('S002V01TCONT')->select([
  213. 'CONT_IDCO AS CONTRACT_ID',
  214. 'CONT_NOCO AS CONTRACT_NAME',
  215. 'CONT_IDEM AS DENOMINATION',
  216. 'CONT_IDOT AS WORK_ORDER_ID',
  217. 'CONT_TOTR AS WORK_ORDER_TYPE',
  218. 'CONT_TIPO AS CONTRACT_TYPE',
  219. 'CONT_FEIN AS START_DATE',
  220. 'CONT_FEFI AS END_DATE',
  221. 'CONT_COST AS CONTRACT_COST',
  222. 'CONT_LIDO AS DOCUMENT',
  223. 'CONT_USRE AS REGISTERED_BY',
  224. 'CONT_FERE AS REGISTER_DATE',
  225. 'CONT_USMO AS MODIFIED_BY',
  226. 'CONT_FEMO AS MODIFICATION_DATE',
  227. ])->where('CONT_NULI', '=', $line)->get()->all();
  228. $now = $this->functionsController->now();
  229. $nowStr = $now->toDateTimeString();
  230. foreach($contracts as $key=>$contract){
  231. $contract->CONTRACT_ID = $this->encryptionController->encrypt($contract->CONTRACT_ID);
  232. $contract->CONTRACT_COST = $this->encryptionController->encrypt($contract->CONTRACT_COST);
  233. $docsArr = json_decode($contract->DOCUMENT);
  234. $docsFN = [];
  235. foreach($docsArr as $keyDoc=>$doc){
  236. $docIDArr = explode('=', $doc);
  237. $codeArr = explode('-', $docIDArr[0]);
  238. $file = DB::table('S002V01TAFAL')->where([
  239. ['AFAL_NULI', '=', $line],
  240. ['AFAL_COMO', '=', $codeArr[1]],
  241. ['AFAL_CLDO', '=', $codeArr[2]],
  242. ['AFAL_FECR', '=', $codeArr[3]],
  243. ['AFAL_NUSE', '=', $codeArr[4]],
  244. ['AFAL_NUVE', '=', $docIDArr[1]],
  245. ])->first();
  246. $docsFN[] = [
  247. 'id' => $this->encryptionController->encrypt($doc),
  248. 'name' => $doc,
  249. 'size' => $file->AFAL_TAMA
  250. ];
  251. }
  252. $contract->DOCUMENT = json_encode($docsFN);
  253. $usrReg = DB::table('S002V01TUSUA')->where([
  254. ['USUA_NULI', '=', $line],
  255. ['USUA_IDUS', '=', $contract->REGISTERED_BY],
  256. ])->first();
  257. $contract->REGISTERED_BY = $this->functionsController->joinName(
  258. $usrReg->USUA_NOMB, $usrReg->USUA_APPA, $usrReg->USUA_APMA
  259. ) . " (" . $contract->REGISTERED_BY . ")";
  260. if(!is_null($contract->MODIFIED_BY)){
  261. $usrMod = DB::table('S002V01TUSUA')->where([
  262. ['USUA_NULI', '=', $line],
  263. ['USUA_IDUS', '=', $contract->MODIFIED_BY],
  264. ])->first();
  265. $contract->MODIFIED_BY = $this->functionsController->joinName(
  266. $usrMod->USUA_NOMB, $usrMod->USUA_APPA, $usrMod->USUA_APMA
  267. ) . " (" . $contract->MODIFIED_BY . ")";
  268. }
  269. $employee = DB::table('S002V01TPERS')->join('S002V01TUSUA', 'USUA_IDUS', '=', 'PERS_IDUS')->where([
  270. ['PERS_NULI', '=', $line],
  271. ['PERS_IDPE', '=', $contract->DENOMINATION],
  272. ])->first();
  273. $contract->DENOMINATION = $this->functionsController->joinName(
  274. $employee->USUA_NOMB, $employee->USUA_APPA, $employee->USUA_APMA
  275. ) . ' (' . $employee->PERS_IDPE . ') (' . $employee->PERS_IDUS . ')';
  276. $contract->DURATION = $this->functionsController->getDatesDifference($contract->START_DATE, $contract->END_DATE);
  277. $contracts[$key] = $contract;
  278. $endDate = new Carbon($contract->END_DATE);
  279. $status = $now->gt($endDate) ? 'Expirado' : 'Activo';
  280. $contract->STATUS = $status;
  281. }
  282. $actions = DB::getQueryLog();
  283. $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
  284. $idac = $this->functionsController->registerActivity(
  285. $line,
  286. 'S002V01M11GPRS',
  287. 'S002V01F02ADCN',
  288. 'S002V01P01COCO',
  289. 'Consulta',
  290. "El usuario $name (" . $usr->USUA_IDUS . ") consultó los contratos registrados.",
  291. $idUser,
  292. $nowStr,
  293. 'S002V01S03GEIN'
  294. );
  295. $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
  296. return $this->responseController->makeResponse(false, 'EXITO', $contracts);
  297. }
  298. public function getConsultOfInterventions($idUser, $line) {
  299. DB::enableQueryLog();
  300. $idUser = $this->encryptionController->decrypt($idUser);
  301. if(!$idUser){
  302. return $this->responseController->makeResponse(true, 'El ID del usuario que realizó la solicitud no está encriptado correctamente', [], 400);
  303. }
  304. $usr = DB::table('S002V01TUSUA')->where([
  305. ['USUA_NULI', '=', $line],
  306. ['USUA_IDUS', '=', $idUser],
  307. ])->first();
  308. if(is_null($usr)){
  309. return $this->responseController->makeResponse(true, 'El usuario que realizó la consulta no está registrado', [], 404);
  310. }
  311. //PENDIENTE LIGAR CON EQUIPAMIENTOS
  312. $preventiveInterventions = DB::table('S002V01TBEOT')->select([
  313. DB::raw('CONCAT(BEOT_IDRE, "|", BEOT_FEPR) AS IDREG'),
  314. 'OTPR_IDOT AS IDORDER',
  315. 'OTPR_EQIN AS EQUIPMENT',
  316. 'BEOT_TIOR AS ORDER_TYPE',
  317. 'BEOT_TIAC AS ACTION_TYPE',
  318. 'BEOT_FEEJ AS START_DATE',
  319. 'BEOT_FEFI AS END_DATE',
  320. ])->join('S002V01TOTPR', 'OTPR_IDOT', '=', 'BEOT_IDOT')->where([
  321. ['BEOT_NULI', '=', $line],
  322. ['BEOT_TIOR', '=', 'Preventivo'],
  323. ])->get()->all();
  324. foreach($preventiveInterventions as $key=>$val){
  325. $val->IDREG = $this->encryptionController->encrypt($val->IDREG);
  326. $preventiveInterventions[$key] = $val;
  327. }
  328. //PENDIENTE MANTENIMIENTO CORRECTIVO
  329. $now = $this->functionsController->now();
  330. $nowStr = $now->toDateTimeString();
  331. $actions = DB::getQueryLog();
  332. $name = $this->functionsController->joinName($usr->USUA_NOMB, $usr->USUA_APPA, $usr->USUA_APMA);
  333. $idac = $this->functionsController->registerActivity(
  334. $line,
  335. 'S002V01M11GPRS',
  336. 'S002V01F01ADIN',
  337. '-',
  338. 'Consulta',
  339. "El usuario $name (" . $usr->USUA_IDUS . ") consultó las intervenciones registradas.",
  340. $idUser,
  341. $nowStr,
  342. 'S002V01S03GEIN'
  343. );
  344. $this->functionsController->registerLog($actions, $idUser, $nowStr, $idac, $line);
  345. return $this->responseController->makeResponse(false, 'EXITO', $preventiveInterventions);
  346. }
  347. }