DynamicFormController.php 17 KB

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