ResourcesController.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class ResourcesController extends Controller
  5. {
  6. private $responseController;
  7. public $arrAlphabet;
  8. public function __construct() {
  9. $this->responseController = new ResponseController();
  10. $this->arrAlphabet = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  11. }
  12. public function formatSecuence($cont, $length){
  13. $longigud = strlen($cont);
  14. $aumentar = $length - $longigud;
  15. $contador = '';
  16. for ($i = 0; $i < $aumentar; $i++) {
  17. $contador .= '0';
  18. }
  19. $contador .= $cont === 0 ? 1 : $cont;
  20. return $contador;
  21. }
  22. // Establece la duracion entre dos fechas
  23. public function durationDate($date)
  24. {
  25. if ($date->d > 29) {
  26. if ($date->m > 11) {
  27. $date->y++;
  28. } else {
  29. $date->m++;
  30. }
  31. }else{
  32. $date->d++;
  33. }
  34. if ($date->y > 0) {
  35. if ($date->y > 1) {
  36. $duration = $date->y . " años, ";
  37. } else {
  38. $duration = $date->y . " año, ";
  39. }
  40. if ($date->m > 1) {
  41. $duration .= $date->m . " meses, ";
  42. } else if ($date->m == 1) {
  43. $duration .= $date->m . " mes, ";
  44. }
  45. if ($date->d > 1) {
  46. $duration .= $date->d . " dias";
  47. } else if ($date->d == 1) {
  48. $duration .= $date->d . " dia";
  49. }
  50. } else if ($date->m > 0) {
  51. if ($date->m > 1) {
  52. $duration = $date->m . " meses, ";
  53. } else {
  54. $duration = $date->m . " mes, ";
  55. }
  56. if ($date->d > 1) {
  57. $duration .= $date->d . " dias";
  58. } else if ($date->d == 1) {
  59. $duration .= $date->d . " dia";
  60. }
  61. } else if ($date->d > 0) {
  62. if ($date->d > 1) {
  63. $duration = $date->d . " dias";
  64. } else {
  65. $duration = $date->d . " dia";
  66. }
  67. } else {
  68. $duration = "Menos de 1 dia";
  69. }
  70. return $duration;
  71. }
  72. public function saveImage($img, $pathSave, $nameImage, $line) {
  73. $ruta = storage_path().$pathSave;
  74. $secuenceNumber = 0;
  75. if ( !is_dir($ruta) ) {
  76. $arrResponseCreate = $this->createRouteSave($pathSave);
  77. if ($arrResponseCreate['error']) {
  78. return $arrResponseCreate;
  79. }else{
  80. $this->saveImage($img, $pathSave, $nameImage, $line);
  81. }
  82. }else{
  83. $gestor = opendir($ruta);
  84. while (($archivo = readdir($gestor)) !== false) {
  85. if ($archivo != '.' && $archivo != '..') {
  86. $secuenceNumber++;
  87. }
  88. }
  89. $numeroLinea = $this->formatSecuence($line, 2);
  90. $numeroSecuencia = $this->formatSecuence($secuenceNumber, 6);
  91. $image = str_replace('data:image/jpeg;base64,', '', $img);
  92. $image = str_replace(' ', '+', $image);
  93. $currentDate = date("ymd");
  94. $imageName = "$numeroLinea-GEAD-FO-$currentDate-$numeroSecuencia-01=$nameImage";
  95. try {
  96. $validate = \File::put( storage_path(). $pathSave . '/' . $imageName, base64_decode($image) );
  97. } catch (\Throwable $th) {
  98. return $this->responseController->makeResponse(true, "ERR_PATH_CRE000: Ocurrió un error al crear la carpeta.", $th->getMessage(), 500);
  99. }
  100. return [
  101. "error" => false,
  102. "msg" => "ÉXITO: Imagen Creada Exitosamente",
  103. "response" => $imageName
  104. ];
  105. }
  106. }
  107. public function saveDocument($documentBase, $pathSave, $nameDocument, $typeDocument, $line, $codeDocument = '') {
  108. try {
  109. // Se obtiene la ruta en donde se guardará el archivo
  110. $routeSaveDocument = "/app/public/$pathSave";
  111. // Se obtiene la ruta completa del archivo a guardar
  112. $pathRoute = storage_path().$routeSaveDocument;
  113. // Se pregunta si la ruta del archivo a guardar existe
  114. if ( !is_dir($pathRoute) ) {
  115. // Si no existe, entonces se intentará crear la ruta del archivo
  116. $arrResponseCreate = $this->createRouteSave($routeSaveDocument);
  117. // Si no se pudo crear la ruta del archivo, entonces regresa una respuesta negativa
  118. if ($arrResponseCreate['error']) {
  119. return $arrResponseCreate;
  120. }else{
  121. // Si si se pudo crear la ruta, entonces se vuelve a ejecutar el método
  122. return $this->saveDocument($documentBase, $pathSave, $nameDocument, $typeDocument, $line);
  123. }
  124. } else {
  125. // Se abré la ruta del archivo
  126. $management = opendir($pathRoute);
  127. // Se inicializa el número de secuencia
  128. $secuenceNumber = 0;
  129. // Se obtienen todos los archivos guardados en la ruta donde se guardará el archivo
  130. while (($file = readdir($management)) !== false) {
  131. if ($file != '.' && $file != '..') {
  132. $arrCodeDocument = explode('=',$file);
  133. $arrStructureDocument = explode('-', $arrCodeDocument[0]);
  134. // Se va incrementando el número de secuencia según los archivos obtenidos en la ruta
  135. if ($arrStructureDocument[2] == $typeDocument) {
  136. $secuenceNumber++;
  137. }
  138. }
  139. }
  140. // Si no se encontró ningún archivo, entonces se inicializa en 1
  141. if ( $secuenceNumber === 0 ) {
  142. $secuenceNumber = 1;
  143. } else {
  144. $secuenceNumber += 1;
  145. }
  146. // Se obtiene el número de línea en el formato deseado (XX)
  147. $lineNumber = $this->formatSecuence($line, 2);
  148. // Se obtiene el número de secuencia en el formato deseado (XXXXXX)
  149. $secuenceNumber = $this->formatSecuence($secuenceNumber, 6);
  150. // Se obtiene la fecha actual en el formato deseado (YYMMDD)
  151. $currentDate = date("ymd");
  152. // Se obtiene el nombre del documento en el formato deseado (mayuscula y sin espacios en blanco)
  153. $nameDocument = strtoupper(str_replace(' ', '_', trim($nameDocument)));
  154. // Se genera el código del documento
  155. $codeDocument = "$lineNumber-$pathSave-$typeDocument-$currentDate-$secuenceNumber-01=$nameDocument";
  156. $arrDocument = explode(',', $documentBase);
  157. if (count($arrDocument) > 1) {
  158. $document = $arrDocument[1];
  159. } else {
  160. $document = $arrDocument[0];
  161. }
  162. // Se obtiene la información del documento en base64
  163. $document = str_replace(' ', '+', $document);
  164. try {
  165. // Se guarda el documento en la ruta deseada con el nombre del código generado
  166. $validate = \File::put( storage_path(). $routeSaveDocument . '/' . $codeDocument, base64_decode($document) );
  167. } catch (\Throwable $th) {
  168. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_CRE001: Ocurrió un error al crear la carpeta.", "response" => $th->getMessage() ];
  169. }
  170. // Se valida que se haya guardado correctamente el documento
  171. if ( !$validate ) {
  172. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_CRE002: No se pudo crear la carpeta.", "response" => [] ];
  173. }
  174. // Se envía el código del documento
  175. return [ "error" => false, "msg" => "ÉXITO: Documento Creado Exitosamente", "response" => $codeDocument ];
  176. }
  177. } catch (\Throwable $th) {
  178. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_CRE000: Ocurrió un error al guardar el documento.", "response" => $th->getMessage() ];
  179. }
  180. }
  181. public function updateDocument($codeDocument, $documentBase, $pathSave, $nameDocument, $typeDocument, $line) {
  182. try {
  183. // Se obtiene la ruta en donde se guardará el archivo
  184. $routeSaveDocument = "/app/public/$pathSave";
  185. // Se obtiene la ruta completa del archivo a guardar
  186. $pathRoute = storage_path().$routeSaveDocument;
  187. // Se pregunta si la ruta del archivo a guardar existe
  188. if ( !is_dir($pathRoute) ) {
  189. // Si no existe, entonces se intentará crear la ruta del archivo
  190. $arrResponseCreate = $this->createRouteSave($routeSaveDocument);
  191. // Si no se pudo crear la ruta del archivo, entonces regresa una respuesta negativa
  192. if ($arrResponseCreate['error']) {
  193. return $arrResponseCreate;
  194. }else{
  195. // Si si se pudo crear la ruta, entonces se vuelve a ejecutar el método
  196. return $this->updateDocument($codeDocument, $documentBase, $pathSave, $nameDocument, $typeDocument, $line);
  197. }
  198. } else {
  199. // Se obtiene la escrutura del código
  200. $arrResponseStructure = $this->getStrucutreCode( $codeDocument );
  201. if ( $arrResponseStructure['error'] ) {
  202. return [ "error" => true, "msg" => $arrResponseStructure['msg'], "response" => [] ];
  203. }
  204. $arrStructureCode = $arrResponseStructure['response'];
  205. // Se abré la ruta del archivo
  206. $routeGetDocument = "/app/public/$pathSave";
  207. $management = opendir( storage_path() . $routeGetDocument );
  208. // Se inicializa la variable si el archivo es encontrado
  209. $isFound = false;
  210. // Se obtienen todos los archivos guardados en la ruta donde se guardará el archivo
  211. while ( ($file = readdir($management)) !== false) {
  212. $codeDocumentSave = explode('=', $file)[0];
  213. if ($codeDocumentSave == $codeDocument) {
  214. // Se va incrementando el número de secuencia según los archivos obtenidos en la ruta
  215. $isFound = true;
  216. }
  217. }
  218. // Si el documento es encontrado en la base de datos documental, entonces...
  219. if ( !$isFound ) {
  220. return [
  221. "error" => true,
  222. "msg" => "ERR_RESOURCE_DOCUMENT_UPD001: No se pudo encontrar el documento en la base de datos documental",
  223. "response" => []
  224. ];
  225. }
  226. // Se obtiene el número de línea en el formato deseado (XX)
  227. $lineNumber = $arrStructureCode['LINE'];
  228. // Se obtiene el número de secuencia en el formato deseado (XXXXXX)
  229. $secuenceNumber = $arrStructureCode['SECUENCE'];
  230. // Se obtiene la fecha actual en el formato deseado (YYMMDD)
  231. $currentDate = $arrStructureCode['DATE'];
  232. // Se obtiene el nombre del documento en el formato deseado (mayuscula y sin espacios en blanco)
  233. $nameDocument = strtoupper(str_replace(' ', '_', trim($nameDocument)));
  234. // Se obtiene la versión del documento y se le incrementa uno más
  235. $versionNumber = $this->formatSecuence( intval($arrStructureCode['VERSION']) + 1 , 2);
  236. // Se genera el código del documento
  237. $codeDocument = "$lineNumber-$pathSave-$typeDocument-$currentDate-$secuenceNumber-$versionNumber=$nameDocument";
  238. // Se obtiene la información del documento en base64
  239. $document = explode(',', $documentBase)[1];
  240. $document = str_replace(' ', '+', $document);
  241. try {
  242. // Se guarda el documento en la ruta deseada con el nombre del código generado
  243. $validate = \File::put( storage_path() . $routeSaveDocument . '/' . $codeDocument, base64_decode($document) );
  244. } catch (\Throwable $th) {
  245. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_UPD002: Ocurrió un error al crear la carpeta.", "response" => $th->getMessage() ];
  246. }
  247. // Se valida que se haya guardado correctamente el documento
  248. if ( !$validate ) {
  249. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_UPD003: No se pudo crear la carpeta.", "response" => [] ];
  250. }
  251. // Se envía el código del documento
  252. return [ "error" => false, "msg" => "ÉXITO: Documento Creado Exitosamente", "response" => $codeDocument ];
  253. }
  254. } catch (\Throwable $th) {
  255. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_UPD000: Ocurrió un error al crear la carpeta.", "response" => $th->getMessage() ];
  256. }
  257. }
  258. public function nameFormatDocument($nameDocument){
  259. $nameDocument = str_replace(' ', '_', $nameDocument);
  260. $nameDocument = str_replace('-', '', $nameDocument);
  261. $nameDocument = str_replace('/', '', $nameDocument);
  262. $nameDocument = str_replace('\\', '', $nameDocument);
  263. $nameDocument = str_replace('@', '', $nameDocument);
  264. $nameDocument = str_replace('&', '', $nameDocument);
  265. $nameDocument = str_replace('|', '', $nameDocument);
  266. $nameDocument = str_replace('!', '', $nameDocument);
  267. $nameDocument = str_replace('"', '', $nameDocument);
  268. $nameDocument = str_replace("'", '', $nameDocument);
  269. $nameDocument = str_replace('%', '', $nameDocument);
  270. $nameDocument = str_replace('(', '', $nameDocument);
  271. $nameDocument = str_replace(')', '', $nameDocument);
  272. $nameDocument = str_replace('+', '', $nameDocument);
  273. $nameDocument = str_replace('+', '', $nameDocument);
  274. $nameDocument = str_replace('[', '', $nameDocument);
  275. $nameDocument = str_replace(']', '', $nameDocument);
  276. $nameDocument = str_replace('?', '', $nameDocument);
  277. $nameDocument = str_replace('¿', '', $nameDocument);
  278. $nameDocument = str_replace('!', '', $nameDocument);
  279. $nameDocument = str_replace('#', '', $nameDocument);
  280. $nameDocument = str_replace('$', '', $nameDocument);
  281. $nameDocument = str_replace(':', '', $nameDocument);
  282. $nameDocument = str_replace('{', '', $nameDocument);
  283. $nameDocument = str_replace('}', '', $nameDocument);
  284. $nameDocument = str_replace('°', '', $nameDocument);
  285. $nameDocument = str_replace('¬', '', $nameDocument);
  286. $nameDocument = str_replace('=', '', $nameDocument);
  287. return $nameDocument;
  288. }
  289. private function getStrucutreCode($codeDocument) {
  290. $arrCodeDocument = explode('-', $codeDocument);
  291. if ( count($arrCodeDocument) < 6) {
  292. return [ "error" => true, "msg" => "ERR_RESOURCE_STRUCTURE_CRE000: No se pudo generar la estructura del código", "response" => [] ];
  293. }
  294. $arrStructure = [
  295. 'LINE' => $arrCodeDocument[0],
  296. 'MODULE' => $arrCodeDocument[1],
  297. 'TYPE' => $arrCodeDocument[2],
  298. 'DATE' => $arrCodeDocument[3],
  299. 'SECUENCE' => $arrCodeDocument[4],
  300. 'VERSION' => $arrCodeDocument[5],
  301. ];
  302. return [
  303. "error" => false,
  304. "msg" => "",
  305. "response" => $arrStructure
  306. ];
  307. }
  308. private $index = 0;
  309. public function createRouteSave ($path, $savePath = '') : Array {
  310. try {
  311. // Se obtiene cada carpeta de la ruta en un arreglo
  312. $arrPath = explode('/',$path);
  313. // Se obtiene la cantidad de iteraciones que tendrá el método
  314. $maxPath = count($arrPath);
  315. // Si existe el direcctorio y aún se tienen iteraciones disponibles, entonces...
  316. if ( is_dir( storage_path() . '/' . $savePath . $arrPath[$this->index] ) && $maxPath > $this->index){
  317. // Se agrega una nueva carpeta a la ruta
  318. $savePath .= $arrPath[$this->index] . '/';
  319. // Se incrementa el index para buscar en el arreglo de rutas
  320. $this->index += 1;
  321. // Si aún hay iteraciones disponibles, entonces se ejecutará el método de nuevo
  322. if ($maxPath > $this->index) {
  323. $this->createRouteSave($path, $savePath);
  324. }
  325. // Si no exite la carpeta, entonces
  326. } else if ( ! is_dir( storage_path() . '/' . $savePath . $arrPath[$this->index] ) ) {
  327. try {
  328. // Se creará la carpeta
  329. if ( ! mkdir( storage_path() . '/' . $savePath . $arrPath[$this->index] ) ) {
  330. // En caso de haber un error en la creación de la carpeta, mandará una respuesta negativa
  331. return [
  332. "error" => true,
  333. "msg" => "ERR_RESOURCE_ROUTE_CRE001: Ocurrió un error al crear la carpeta " . $arrPath[$this->index],
  334. "response" => storage_path() . '/' . $savePath . $arrPath[$this->index]
  335. ];
  336. }else{
  337. // Si la carpeta se pudo crear de manera exitosa, entonces se ejecutará el método de nuevo
  338. $this->createRouteSave($path, $savePath);
  339. }
  340. } catch (\Throwable $th) {
  341. return [
  342. "error" => true,
  343. "msg" => "ERR_RESOURCE_ROUTE_CRE002: Ocurrió un error inesperado al crear la ruta del archivo",
  344. "response" => $th->getMessage()
  345. ];
  346. }
  347. }
  348. // En caso de crear todas las carpetas, se reinicia las iteraciones a 0
  349. $this->index = 0;
  350. // Se envía una respuesta positiva
  351. return [
  352. "error" => false,
  353. "msg" => "Creación de Ruta Exitosa",
  354. "response" => storage_path() . '/' . $savePath . $arrPath[$this->index]
  355. ];
  356. } catch (\Throwable $th) {
  357. return [
  358. "error" => true,
  359. "msg" => "ERR_RESOURCE_ROUTE_CRE000: Ocurrió un error inesperado al generar la ruta del archivo",
  360. "response" => $th->getMessage()
  361. ];
  362. }
  363. }
  364. }