DynamicFormController.php 18 KB

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