ResourcesController.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  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) {
  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. // Se va incrementando el número de secuencia según los archivos obtenidos en la ruta
  131. $secuenceNumber++;
  132. }
  133. }
  134. // Si no se encontró ningún archivo, entonces se inicializa en 1
  135. if ( $secuenceNumber === 0 ) {
  136. $secuenceNumber = 1;
  137. }
  138. // Se obtiene el número de línea en el formato deseado (XX)
  139. $lineNumber = $this->formatSecuence($line, 2);
  140. // Se obtiene el número de secuencia en el formato deseado (XXXXXX)
  141. $secuenceNumber = $this->formatSecuence($secuenceNumber, 6);
  142. // Se obtiene la fecha actual en el formato deseado (YYMMDD)
  143. $currentDate = date("ymd");
  144. // Se obtiene el nombre del documento en el formato deseado (mayuscula y sin espacios en blanco)
  145. $nameDocument = strtoupper(str_replace(' ', '_', trim($nameDocument)));
  146. // Se genera el código del documento
  147. $codeDocument = "$lineNumber-$pathSave-$typeDocument-$currentDate-$secuenceNumber-01=$nameDocument";
  148. // Se obtiene la información del documento en base64
  149. $document = explode(',', $documentBase)[1];
  150. $document = str_replace(' ', '+', $document);
  151. try {
  152. // Se guarda el documento en la ruta deseada con el nombre del código generado
  153. $validate = \File::put( storage_path(). $routeSaveDocument . '/' . $codeDocument, base64_decode($document) );
  154. } catch (\Throwable $th) {
  155. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_CRE001: Ocurrió un error al crear la carpeta.", "response" => $th->getMessage() ];
  156. }
  157. // Se valida que se haya guardado correctamente el documento
  158. if ( !$validate ) {
  159. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_CRE002: No se pudo crear la carpeta.", "response" => [] ];
  160. }
  161. // Se envía el código del documento
  162. return [ "error" => false, "msg" => "ÉXITO: Documento Creado Exitosamente", "response" => $codeDocument ];
  163. }
  164. } catch (\Throwable $th) {
  165. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_CRE000: Ocurrió un error al guardar el documento.", "response" => $th->getMessage() ];
  166. }
  167. }
  168. public function updateDocument($codeDocument, $documentBase, $pathSave, $nameDocument, $typeDocument, $line) {
  169. try {
  170. // Se obtiene la ruta en donde se guardará el archivo
  171. $routeSaveDocument = "/app/public/$pathSave";
  172. // Se obtiene la ruta completa del archivo a guardar
  173. $pathRoute = storage_path().$routeSaveDocument;
  174. // Se pregunta si la ruta del archivo a guardar existe
  175. if ( !is_dir($pathRoute) ) {
  176. // Si no existe, entonces se intentará crear la ruta del archivo
  177. $arrResponseCreate = $this->createRouteSave($routeSaveDocument);
  178. // Si no se pudo crear la ruta del archivo, entonces regresa una respuesta negativa
  179. if ($arrResponseCreate['error']) {
  180. return $arrResponseCreate;
  181. }else{
  182. // Si si se pudo crear la ruta, entonces se vuelve a ejecutar el método
  183. return $this->updateDocument($codeDocument, $documentBase, $pathSave, $nameDocument, $typeDocument, $line);
  184. }
  185. } else {
  186. // Se obtiene la escrutura del código
  187. $arrResponseStructure = $this->getStrucutreCode( $codeDocument );
  188. if ( $arrResponseStructure['error'] ) {
  189. return [ "error" => true, "msg" => $arrResponseStructure['msg'], "response" => [] ];
  190. }
  191. $arrStructureCode = $arrResponseStructure['response'];
  192. // Se abré la ruta del archivo
  193. $routeGetDocument = "/app/public/$pathSave";
  194. $management = opendir( storage_path() . $routeGetDocument );
  195. // Se inicializa la variable si el archivo es encontrado
  196. $isFound = false;
  197. // Se obtienen todos los archivos guardados en la ruta donde se guardará el archivo
  198. while ( ($file = readdir($management)) !== false) {
  199. $codeDocumentSave = explode('=', $file)[0];
  200. if ($codeDocumentSave == $codeDocument) {
  201. // Se va incrementando el número de secuencia según los archivos obtenidos en la ruta
  202. $isFound = true;
  203. }
  204. }
  205. // Si el documento es encontrado en la base de datos documental, entonces...
  206. if ( !$isFound ) {
  207. return [
  208. "error" => true,
  209. "msg" => "ERR_RESOURCE_DOCUMENT_UPD001: No se pudo encontrar el documento en la base de datos documental",
  210. "response" => []
  211. ];
  212. }
  213. // Se obtiene el número de línea en el formato deseado (XX)
  214. $lineNumber = $arrStructureCode['LINE'];
  215. // Se obtiene el número de secuencia en el formato deseado (XXXXXX)
  216. $secuenceNumber = $arrStructureCode['SECUENCE'];
  217. // Se obtiene la fecha actual en el formato deseado (YYMMDD)
  218. $currentDate = $arrStructureCode['DATE'];
  219. // Se obtiene el nombre del documento en el formato deseado (mayuscula y sin espacios en blanco)
  220. $nameDocument = strtoupper(str_replace(' ', '_', trim($nameDocument)));
  221. // Se obtiene la versión del documento y se le incrementa uno más
  222. $versionNumber = $this->formatSecuence( intval($arrStructureCode['VERSION']) + 1 , 2);
  223. // Se genera el código del documento
  224. $codeDocument = "$lineNumber-$pathSave-$typeDocument-$currentDate-$secuenceNumber-$versionNumber=$nameDocument";
  225. // Se obtiene la información del documento en base64
  226. $document = explode(',', $documentBase)[1];
  227. $document = str_replace(' ', '+', $document);
  228. try {
  229. // Se guarda el documento en la ruta deseada con el nombre del código generado
  230. $validate = \File::put( storage_path() . $routeSaveDocument . '/' . $codeDocument, base64_decode($document) );
  231. } catch (\Throwable $th) {
  232. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_UPD002: Ocurrió un error al crear la carpeta.", "response" => $th->getMessage() ];
  233. }
  234. // Se valida que se haya guardado correctamente el documento
  235. if ( !$validate ) {
  236. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_UPD003: No se pudo crear la carpeta.", "response" => [] ];
  237. }
  238. // Se envía el código del documento
  239. return [ "error" => false, "msg" => "ÉXITO: Documento Creado Exitosamente", "response" => $codeDocument ];
  240. }
  241. } catch (\Throwable $th) {
  242. return [ "error" => true, "msg" => "ERR_RESOURCE_DOCUMENT_UPD000: Ocurrió un error al crear la carpeta.", "response" => $th->getMessage() ];
  243. }
  244. }
  245. public function nameFormatDocument($nameDocument){
  246. $nameDocument = str_replace(' ', '_', $nameDocument);
  247. $nameDocument = str_replace('-', '', $nameDocument);
  248. $nameDocument = str_replace('/', '', $nameDocument);
  249. $nameDocument = str_replace('\\', '', $nameDocument);
  250. $nameDocument = str_replace('@', '', $nameDocument);
  251. $nameDocument = str_replace('&', '', $nameDocument);
  252. $nameDocument = str_replace('|', '', $nameDocument);
  253. $nameDocument = str_replace('!', '', $nameDocument);
  254. $nameDocument = str_replace('"', '', $nameDocument);
  255. $nameDocument = str_replace("'", '', $nameDocument);
  256. $nameDocument = str_replace('%', '', $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. return $nameDocument;
  275. }
  276. private function getStrucutreCode($codeDocument) {
  277. $arrCodeDocument = explode('-', $codeDocument);
  278. if ( count($arrCodeDocument) < 6) {
  279. return [ "error" => true, "msg" => "ERR_RESOURCE_STRUCTURE_CRE000: No se pudo generar la estructura del código", "response" => [] ];
  280. }
  281. $arrStructure = [
  282. 'LINE' => $arrCodeDocument[0],
  283. 'MODULE' => $arrCodeDocument[1],
  284. 'TYPE' => $arrCodeDocument[2],
  285. 'DATE' => $arrCodeDocument[3],
  286. 'SECUENCE' => $arrCodeDocument[4],
  287. 'VERSION' => $arrCodeDocument[5],
  288. ];
  289. return [
  290. "error" => false,
  291. "msg" => "",
  292. "response" => $arrStructure
  293. ];
  294. }
  295. private $index = 0;
  296. public function createRouteSave ($path, $savePath = '') {
  297. try {
  298. // Se obtiene cada carpeta de la ruta en un arreglo
  299. $arrPath = explode('/',$path);
  300. // Se obtiene la cantidad de iteraciones que tendrá el método
  301. $maxPath = count($arrPath);
  302. // Si existe el direcctorio y aún se tienen iteraciones disponibles, entonces...
  303. if ( is_dir( storage_path() . '/' . $savePath . $arrPath[$this->index] ) && $maxPath > $this->index){
  304. // Se agrega una nueva carpeta a la ruta
  305. $savePath .= $arrPath[$this->index] . '/';
  306. // Se incrementa el index para buscar en el arreglo de rutas
  307. $this->index += 1;
  308. // Si aún hay iteraciones disponibles, entonces se ejecutará el método de nuevo
  309. if ($maxPath > $this->index) {
  310. $this->createRouteSave($path, $savePath);
  311. }
  312. // Si no exite la carpeta, entonces
  313. } else if ( ! is_dir( storage_path() . '/' . $savePath . $arrPath[$this->index] ) ) {
  314. try {
  315. // Se creará la carpeta
  316. if ( ! mkdir( storage_path() . '/' . $savePath . $arrPath[$this->index] ) ) {
  317. // En caso de haber un error en la creación de la carpeta, mandará una respuesta negativa
  318. return [
  319. "error" => true,
  320. "msg" => "ERR_RESOURCE_ROUTE_CRE001: Ocurrió un error al crear la carpeta " . $arrPath[$this->index],
  321. "response" => storage_path() . '/' . $savePath . $arrPath[$this->index]
  322. ];
  323. }else{
  324. // Si la carpeta se pudo crear de manera exitosa, entonces se ejecutará el método de nuevo
  325. $this->createRouteSave($path, $savePath);
  326. }
  327. } catch (\Throwable $th) {
  328. return [
  329. "error" => true,
  330. "msg" => "ERR_RESOURCE_ROUTE_CRE002: Ocurrió un error inesperado al crear la ruta del archivo",
  331. "response" => $th->getMessage()
  332. ];
  333. }
  334. }
  335. // En caso de crear todas las carpetas, se reinicia las iteraciones a 0
  336. $this->index = 0;
  337. // Se envía una respuesta positiva
  338. return [
  339. "error" => false,
  340. "msg" => "Creación de Ruta Exitosa",
  341. "response" => storage_path() . '/' . $savePath . $arrPath[$this->index]
  342. ];
  343. } catch (\Throwable $th) {
  344. return [
  345. "error" => true,
  346. "msg" => "ERR_RESOURCE_ROUTE_CRE000: Ocurrió un error inesperado al generar la ruta del archivo",
  347. "response" => $th->getMessage()
  348. ];
  349. }
  350. }
  351. }