DynamicFormController.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. <?php
  2. /*
  3. Desarrollador: Ing. Jean Jairo Benitez Meza
  4. Ultima Modificación: 11/04/2023
  5. Módulo: Formularios Dinámicos
  6. */
  7. namespace App\Http\Controllers;
  8. use App\Http\Controllers\Controller;
  9. use App\Http\Controllers\ResponseController;
  10. use App\Http\Controllers\EncryptionController;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Carbon;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\Support\Facades\Validator;
  15. use App\Http\Controllers\FunctionsController;
  16. use App\Http\Controllers\ResourcesController;
  17. use Illuminate\Support\Facades\Schema;
  18. class DynamicFormController extends Controller
  19. {
  20. private $responseController;
  21. private $encController;
  22. private $functionsController;
  23. private $resourcesController;
  24. public function __construct(){
  25. $this->responseController = new ResponseController();
  26. $this->encController = new EncryptionController();
  27. $this->functionsController = new FunctionsController();
  28. $this->resourcesController = new ResourcesController();
  29. }
  30. // Obtener formularios
  31. public function getForms($user, $line){
  32. $arrResponseCheckUser = $this->resourcesController->checkUserEnc($user, $line);
  33. if ($arrResponseCheckUser['error']) {
  34. DB::rollBack();
  35. return $this->responseController->makeResponse(true, $arrResponseCheckUser['msg'], [], 401);
  36. }
  37. try{
  38. $arrForms = DB::table('S002V01TFODI')
  39. ->where('FODI_NULI', '=', $line)
  40. ->join('S002V01TMODU', 'MODU_IDMO', '=', 'FODI_IDMO')
  41. ->get([
  42. 'FODI_NUFO AS CODIGO_FORMULARIO',
  43. 'FODI_TIRE AS TITULO_REGISTRO',
  44. 'FODI_TIMO AS TITULO_MODIFICACION',
  45. 'MODU_NOMO AS MODULO',
  46. 'FODI_ESTA AS ESTADO',
  47. 'FODI_WOFL AS WORKFLOW',
  48. 'FODI_USRE AS USUARIO_REGISTRA',
  49. 'FODI_FERE AS FECHA_REGISTRA',
  50. 'FODI_USMO AS USUARIO_MODIFICA',
  51. 'FODI_FEMO AS FECHA_MODIFICA',
  52. ]);
  53. $arrForms = json_decode(json_encode($arrForms));
  54. } catch (\Throwable $th) {
  55. return $this->responseController->makeResponse(true, "ERR_DYNFORM_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  56. }
  57. $responseCheckLatestUpdate = $this->resourcesController->checkLatestUpdate($arrForms, $line);
  58. if ($responseCheckLatestUpdate['error']) {
  59. return $this->responseController->makeResponse(true, $responseCheckLatestUpdate['msg'], [], 500);
  60. }
  61. $arrForms = $responseCheckLatestUpdate['response'];
  62. return $this->responseController->makeResponse(false, "ÉXITO", $arrForms);
  63. }
  64. // Obtener un formulario especifico para editar los datos del formulario
  65. public function getDataForm($codigoForm, $user, $line){
  66. try{
  67. $resp = DB::table('S002V01TFODI')->where('FODI_NUFO', $codigoForm)
  68. ->where('FODI_NULI', '=', $line)
  69. ->join('S002V01TMODU', 'FODI_IDMO', '=', 'MODU_IDMO')
  70. ->first(['FODI_NUFO','FODI_TIRE','FODI_TIMO','FODI_DAFO', 'FODI_WOFL','MODU_IDMO','MODU_NOMO']);
  71. } catch (\Throwable $th) {
  72. return $this->responseController->makeResponse(true, "ERR_DYNFORM_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  73. }
  74. if(empty($resp)) return $this->responseController->makeResponse(true, "ERR_DYNFORM_GET001: El código " . $codigoForm . " no existe.", [], 500);
  75. $objResponse = [
  76. "CODIGO_FORM" => $resp->FODI_NUFO,
  77. "TITULO_REGISTRO" => $resp->FODI_TIRE,
  78. "TITULO_MODIFICACION" => $resp->FODI_TIMO,
  79. "IDMODULO" => $resp->MODU_IDMO,
  80. "MODULO" => $resp->MODU_NOMO,
  81. "WORKFLOW" => $resp->FODI_WOFL,
  82. "DATA_FORM" => json_decode($resp->FODI_DAFO),
  83. ];
  84. return $this->responseController->makeResponse(false, "ÉXITO", $objResponse);
  85. }
  86. // Obtener formularios con Workflow
  87. public function getFormWorkflow($user, $line){
  88. try{
  89. $arrForms = DB::table('S002V01TFODI')
  90. ->where('FODI_ESTA', '=', 'Activo')
  91. ->where('FODI_NULI', '=', $line)
  92. ->where('FODI_WOFL', '=', 'PARA WORKFLOW')
  93. ->get(['FODI_NUFO AS CODIGO_FORM', 'FODI_TIRE AS TITULO_REGISTRO', 'FODI_TIMO AS TITULO_MODIFICACION', 'FODI_DAFO AS DATA_FORM']);
  94. } catch (\Throwable $th) {
  95. return $this->responseController->makeResponse(true, "ERR_DYNFORM_GET000: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  96. }
  97. $arrResponse = array();
  98. foreach ($arrForms as $form) {
  99. $arrResponse[] = [
  100. 'CODIGO_FORM' => $form->CODIGO_FORM,
  101. 'NOMBRE_FORM' => $form->NOMBRE_FORM,
  102. 'DATA_FORM' => json_decode($form->DATA_FORM)
  103. ];
  104. }
  105. return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrResponse);
  106. }
  107. // Habilitar un workflow a formulario
  108. public function enableFormWorkflow(Request $request, $numberForm){
  109. $validator = Validator::make($request->all(), [
  110. 'USUARIO' => 'required|string',
  111. 'NUMERO_LINEA' => 'required|integer',
  112. ]);
  113. if ($validator->fails()) {
  114. return $this->responseController->makeResponse(
  115. true,
  116. "ERR_DYNFORM_ENA000: Se encontraron uno o más errores.",
  117. $this->responseController->makeErrors($validator->errors()->messages()),
  118. 401
  119. );
  120. }
  121. DB::beginTransaction();
  122. $response = $request->all();
  123. try {
  124. $usuario = $this->encController->decrypt($response['USER']);
  125. } catch (\Throwable $th) {
  126. DB::rollBack();
  127. return $this->responseController->makeResponse(true, "ERR_DYNFORM_ENA001: Ocurrió un error al desencriptar los datos.", $th->getMessage(), 401);
  128. }
  129. try{
  130. $validateExist = DB::table('S002V01TFODI')->where('FODI_NUFO', $numberForm)->exists();
  131. } catch (\Throwable $th) {
  132. DB::rollBack();
  133. return $this->responseController->makeResponse(true, "ERR_DYNFORM_ENA002: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  134. }
  135. if(!$validateExist) {
  136. DB::rollBack();
  137. return $this->responseController->makeResponse(true, "ERR_DYNFORM_ENA003: No se pudo encontrar el formulario seleccionado.", [], 500);
  138. }
  139. $now = $this->functionsController->now();
  140. $currentDate = $now->toDateTimeString();
  141. $arrUpdate = [
  142. 'FODI_WOFL' => 'CON WORKFLOW',
  143. 'FODI_USMO' => $usuario,
  144. 'FODI_FEMO' => $currentDate,
  145. 'FODI_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  146. ];
  147. try{
  148. $validateInsert = DB::table('S002V01TFODI')->where('FODI_NUFO', $numberForm)->update($arrUpdate);
  149. } catch (\Throwable $th) {
  150. DB::rollBack();
  151. return $this->responseController->makeResponse(true, "ERR_DYNFORM_ENA004: No se pudo realizar la modificación en la base.", $th->getMessage(), 500);
  152. }
  153. if (!$validateInsert) {
  154. DB::rollBack();
  155. return $this->responseController->makeResponse(true, "ERR_DYNFORM_ENA003: No se pudo realizar la modificación en la base." [], 500);
  156. }
  157. DB::commit();
  158. return $this->responseController->makeResponse(false, "ÉXITO: Modificación Exitosa");
  159. }
  160. // Consulta de datos para un select de formulario
  161. public function getDataSelect(Request $request){
  162. $validator = Validator::make($request->all(), [
  163. 'table' => 'required|string|max:50',
  164. 'column' => 'required|string|max:50',
  165. ]);
  166. if ($validator->fails()) {
  167. return $this->responseController->makeResponse(
  168. true,
  169. "ERR_DYNFORM_GET000: Se encontraron uno o más errores.",
  170. $this->responseController->makeErrors($validator->errors()->messages()),
  171. 401
  172. );
  173. }
  174. DB::beginTransaction();
  175. $response = $request->all();
  176. $arrResponseData = $this->getPrimaryKeyData($response['table']);
  177. if($arrResponseData['error']) {
  178. DB::rollBack();
  179. return $this->responseController->makeResponse(true, $arrResponseData['msg'], [], 500);
  180. }
  181. $columnName = $arrResponseData['response']->COLUMN_NAME;
  182. try{
  183. $arrGetData = DB::table($response['table'])->get([ $columnName.' AS valor', $response['column']. ' AS opcion' ]);
  184. } catch (\Throwable $th) {
  185. DB::rollBack();
  186. return $this->responseController->makeResponse(true, "ERR_DYNFORM_GET001: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  187. }
  188. DB::commit();
  189. return $this->responseController->makeResponse(false, "ÉXITO: Consulta Exitosa", $arrGetData);
  190. }
  191. // Elminación de un formulario
  192. public function deleteForm(Request $request){
  193. $validator = Validator::make($request->all(), [
  194. 'CODIGO_FORM' => 'required|string',
  195. 'USER' => 'required|string',
  196. ]);
  197. if ($validator->fails()) {
  198. return $this->responseController->makeResponse(
  199. true,
  200. "ERR_DYNFORM_DEL000: Se encontraron uno o más errores.",
  201. $this->responseController->makeErrors($validator->errors()->messages()),
  202. 401
  203. );
  204. }
  205. DB::beginTransaction();
  206. $response = $request->all();
  207. try{
  208. $user = $this->encController->decrypt($response['USER']);
  209. } catch (\Throwable $th) {
  210. DB::rollBack();
  211. return $this->responseController->makeResponse(true, "ERR_DYNFORM_DEL001: No se pudo obtener el usuario.", $th->getMessage(), 500);
  212. }
  213. try{
  214. $objForm = DB::table('S002V01TFODI')->where('FODI_NUFO', $response['CODIGO_FORM'])->first();
  215. } catch (\Throwable $th) {
  216. DB::rollBack();
  217. return $this->responseController->makeResponse(true, "ERR_DYNFORM_DEL002: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  218. }
  219. if(empty($objForm)) {
  220. DB::rollBack();
  221. return $this->responseController->makeResponse(true, "ERR_DYNFORM_DEL003: El codigo ".$response['CODIGO_FORM']." no existe.", [], 500);
  222. }
  223. if($objForm->FODI_ESTA == "Eliminado") {
  224. DB::rollBack();
  225. return $this->responseController->makeResponse(true, "ERR_DYNFORM_DEL004: El formulario ya se encuentra eliminado.", [], 500);
  226. }
  227. $now = $this->functionsController->now();
  228. $currentDate = $now->toDateTimeString();
  229. $arrUpdate = [
  230. "FODI_ESTA" => "Eliminado",
  231. "FODI_USMO" => $user,
  232. "FODI_FEMO" => $currentDate,
  233. "FODI_FEAR" => DB::raw('CURRENT_TIMESTAMP')
  234. ];
  235. try{
  236. $validateUpdate = DB::table('S002V01TFODI')->where('FODI_NUFO', $response['CODIGO_FORM'])->update($arrUpdate);
  237. } catch (\Throwable $th) {
  238. DB::rollBack();
  239. return $this->responseController->makeResponse(true, "ERR_DYNFORM_DEL005: No se pudo realizar la modificación en la base.", $th->getMessage(), 500);
  240. }
  241. if (!$validateUpdate) {
  242. DB::rollBack();
  243. return $this->responseController->makeResponse(true, "ERR_DYNFORM_DEL006: No se pudo realizar la modificación en la base.", [], 500);
  244. }
  245. DB::commit();
  246. return $this->responseController->makeResponse(false, "ÉXITO: Eliminación Exitosa");
  247. }
  248. // Creación de formulario
  249. public function createForm(Request $request) {
  250. $validator = Validator::make($request->all(), [
  251. 'NOMBRE_FORM_REGISTRO' => 'required|string',
  252. 'NOMBRE_FORM_MODIFICACION' => 'required|string',
  253. 'MODULE' => 'required|string',
  254. 'USER' => 'required|string',
  255. 'WORKFLOW' => 'boolean',
  256. 'DATA_FORM' => 'required',
  257. ]);
  258. if ($validator->fails()) {
  259. return $this->responseController->makeResponse(
  260. true,
  261. "ERR_DYNFORM_REG000: Se encontraron uno o más errores.",
  262. $this->responseController->makeErrors($validator->errors()->messages()),
  263. 401
  264. );
  265. }
  266. DB::beginTransaction();
  267. $response = $request->all();
  268. try {
  269. $response['DATA_FORM'] = json_encode($response['DATA_FORM']);
  270. } catch (\Throwable $th) {
  271. DB::rollBack();
  272. return $this->responseController->makeResponse(true, "ERR_DYNFORM_REG001: Ocurrió un error al desencriptar los datos.", $th->getMessage(), 401);
  273. }
  274. try {
  275. $user = $this->encController->decrypt($response['USER']);
  276. } catch (\Throwable $th) {
  277. DB::rollBack();
  278. return $this->responseController->makeResponse(true, "ERR_DYNFORM_REG002: Ocurrió un error al desencriptar los datos.", $th->getMessage(), 401);
  279. }
  280. try{
  281. $validateModule = DB::table('S002V01TMODU')->where('MODU_IDMO', $response['MODULE'])->exists();
  282. } catch (\Throwable $th) {
  283. DB::rollBack();
  284. return $this->responseController->makeResponse(true, "ERR_DYNFORM_REG003: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  285. }
  286. if (!$validateModule) {
  287. DB::rollBack();
  288. return $this->responseController->makeResponse(true, "ERR_DYNFORM_REG004: El módulo no existe", [], 500);
  289. }
  290. $now = $this->functionsController->now();
  291. $currentDate = $now->toDateTimeString();
  292. $objResponse = [
  293. 'FODI_TIRE' => $response['NOMBRE_FORM_REGISTRO'],
  294. 'FODI_TIMO' => $response['NOMBRE_FORM_MODIFICACION'],
  295. 'FODI_DAFO' => $response['DATA_FORM'],
  296. 'FODI_IDMO' => $response['MODULE'],
  297. 'FODI_WOFL' => $response['WORKFLOW'] ? 'PARA WORKFLOW' : 'NO WORKFLOW',
  298. 'FODI_USRE' => $user,
  299. 'FODI_NULI' => 1,
  300. 'FODI_FERE' => $currentDate,
  301. 'FODI_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  302. ];
  303. try{
  304. $validateInsert = DB::table('S002V01TFODI')->insert($objResponse);
  305. } catch (\Throwable $th) {
  306. DB::rollBack();
  307. return $this->responseController->makeResponse(true, "ERR_DYNFORM_REG005: No se pudo realizar la inserción a la base.", $th->getMessage(), 500);
  308. }
  309. if (!$validateInsert) {
  310. DB::rollBack();
  311. return $this->responseController->makeResponse(true, "ERR_MENU_REG006: No se pudo realizar la inserción en la base.", [], 500);
  312. }
  313. DB::commit();
  314. return $this->responseController->makeResponse(false, "ÉXITO: Registro Exitoso");
  315. }
  316. // Modificación de formulario
  317. public function updateForm(Request $request, $idform){
  318. $validator = Validator::make($request->all(), [
  319. 'NOMBRE_FORM_REGISTRO' => 'required|string',
  320. 'NOMBRE_FORM_MODIFICACION' => 'required|string',
  321. 'WORKFLOW' => 'boolean',
  322. 'USER' => 'required|string',
  323. 'DATA_FORM' => 'required',
  324. ]);
  325. if ($validator->fails()) {
  326. return $this->responseController->makeResponse(
  327. true,
  328. "ERR_DYNFORM_UPD000: Se encontraron uno o más errores.",
  329. $this->responseController->makeErrors($validator->errors()->messages()),
  330. 401
  331. );
  332. }
  333. DB::beginTransaction();
  334. $request = $request->all();
  335. $request['DATA_FORM'] = json_encode($request['DATA_FORM']);
  336. $user = $this->encController->decrypt($request['USER']);
  337. try{
  338. $validateForm = DB::table('S002V01TFODI')->where('FODI_NUFO', $idform)->exists();
  339. } catch (\Throwable $th) {
  340. return $this->responseController->makeResponse(true, "ERR_DYNFORM_UPD001: No se pudo realizar la consulta a la base.", $th->getMessage(), 500);
  341. }
  342. if (!$validateForm) {
  343. DB::rollBack();
  344. return $this->responseController->makeResponse(true, "ERR_DYNFORM_UPD002: No se pudo encontrar el formulario seleccionado.", [], 500);
  345. }
  346. $now = $this->functionsController->now();
  347. $currentDate = $now->toDateTimeString();
  348. $arrUpdate = [
  349. 'FODI_TIRE' => $request['NOMBRE_FORM_REGISTRO'],
  350. 'FODI_TIMO' => $request['NOMBRE_FORM_MODIFICACION'],
  351. 'FODI_DAFO' => $request['DATA_FORM'],
  352. 'FODI_WOFL' => $request['WORKFLOW'] ? 'PARA WORKFLOW' : 'NO WORKFLOW',
  353. 'FODI_USMO' => $user,
  354. 'FODI_FEMO' => $currentDate,
  355. 'FODI_FEAR' => DB::raw('CURRENT_TIMESTAMP')
  356. ];
  357. try{
  358. $validateRegister = DB::table('S002V01TFODI')->where('FODI_NUFO','=', $idform )->update($arrUpdate);
  359. } catch (\Throwable $th) {
  360. DB::rollBack();
  361. return $this->responseController->makeResponse(true, "ERR_DYNFORM_UPD003: No se pudo realizar la modificación a la base.", $th->getMessage(), 500);
  362. }
  363. if (!$validateRegister) {
  364. DB::rollBack();
  365. return $this->responseController->makeResponse(true, "ERR_DYNFORM_UPD004: No se pudo realizar la modificación de la base.", [], 500);
  366. }
  367. DB::commit();
  368. return $this->responseController->makeResponse(false, "ÉXITO: Modificación Exitosa");
  369. }
  370. // Obtener datos de la llave primaria
  371. private function getPrimaryKeyData($table_name_main): array {
  372. $databaseName = DB::connection()->getDatabaseName();
  373. $qry = "SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH AS LENGTH FROM INFORMATION_SCHEMA.COLUMNS
  374. WHERE TABLE_SCHEMA = '".$databaseName."' AND TABLE_NAME = '".$table_name_main."' AND COLUMN_KEY = 'PRI'";
  375. try{
  376. $response = Schema::getConnection()->getDoctrineSchemaManager()->listTableIndexes($table_name_main);
  377. var_dump($response);
  378. $resp = DB::select(DB::raw($qry));
  379. } catch(\Exception $th) {
  380. return [
  381. "error" => true,
  382. "msg" => "ERR_DYNFORM_GET001: No se pudo realizar la consulta a la base. $qry",
  383. "response" => $th->getMessage()
  384. ];
  385. }
  386. if (empty($resp)) {
  387. return [
  388. "error" => true,
  389. "msg" => "ERR_DYNFORM_REG002: Ocurrió un error con obtener los datos de la llave primaria. $qry",
  390. "response" => []
  391. ];
  392. }
  393. return [
  394. "error" => false,
  395. "msg" => "ÉXITO",
  396. "response" => $resp[0]
  397. ];
  398. }
  399. }