ResourcesController.php 18 KB

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