DynamicFormController.php 17 KB

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