DocumentsController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <?php
  2. /*
  3. Nombre del programador: Cordourier Rojas Mathew
  4. Ultima fecha de modificación: [ 24 / Marzo / 2023 ]
  5. Descripción: Controlador de ayuda para la nomenclatura e inserciòn de documentos.
  6. */
  7. namespace App\Http\Controllers;
  8. use Carbon\Carbon;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Support\Facades\Storage;
  11. use PhpOffice\PhpSpreadsheet\IOFactory;
  12. use Throwable;
  13. class DocumentsController extends Controller
  14. {
  15. private $resources_controller;
  16. private $response_controller;
  17. public function __construct()
  18. {
  19. $this->resources_controller = new ResourcesController();
  20. $this->response_controller = new ResponseController();
  21. }
  22. // Metodo para la creación de un documento y la inserción de la liga en la base de datos
  23. public function createDocument($module_code, $document_clasification, $document_name, $id_employee = null, $storage_disk, $line_number = 1, $user_id, $employee_new_document = "0")
  24. {
  25. try {
  26. // Engloba los segmentos de la nomenclatura del nombre del documento
  27. $name_document = "";
  28. $REGISTER_DATE = Carbon::now()->timezone('America/Mexico_City')->format("ymd");
  29. $sequence_number = "000001";
  30. $version_number = "01";
  31. $line_number = $this->resources_controller->formatSecuence($line_number, 2);
  32. // Verifica que el nombre de la nomenclatura no se duplique
  33. $document_name = $this->deleteCodificationStructureName($document_name, $line_number, $module_code);
  34. // Si se realizará la actualización de un archivo, entra directamente a crear el nombre
  35. if ($employee_new_document != "0") {
  36. // Agrega la secuencia del archivo
  37. $sequence_number = substr($employee_new_document, 18, 6);
  38. $version_number = substr($employee_new_document, 25, 2);
  39. // Busca el numero siguiente de versión
  40. $version_number++;
  41. if ($version_number <= 9) {
  42. $version_number = 0 . $version_number;
  43. }
  44. // Crea el nombre del archivo
  45. $name_document = $line_number . '-' . $module_code . '-' . $document_clasification . '-' .
  46. $REGISTER_DATE . '-' . $sequence_number . '=' .
  47. $version_number . '=' . $document_name;
  48. } else {
  49. //Obtiene los archivos del storage
  50. $files_uploaded = Storage::disk($storage_disk)->files();
  51. // Itera cada archivo guardado en el disco del storage
  52. foreach ($files_uploaded as $file) {
  53. // Encuentra el siguiente numero de secuencia
  54. if (substr($file, 18, 6) >= $sequence_number) {
  55. $sequence_number = substr($file, 18, 6);
  56. $sequence_number++;
  57. }
  58. }
  59. // Si la clasificación es nueva, crea su nuevo nombre
  60. if ($name_document == "") {
  61. $sequence_number = $this->resources_controller->formatSecuence($sequence_number, 6);
  62. $name_document = $line_number . '-' . $module_code . '-' . $document_clasification . '-' .
  63. $REGISTER_DATE . '-' . $sequence_number . '=' .
  64. $version_number . '=' . $document_name;
  65. }
  66. }
  67. DB::table("S002V01TDOCU_P")
  68. ->insert([
  69. "DOCU_NUSE" => $sequence_number,
  70. "DOCU_LIDO" => $name_document,
  71. "DOCU_IDPE" => $id_employee,
  72. "DOCU_NULI" => $line_number,
  73. "DOCU_USRE" => $user_id,
  74. "DOCU_FERE" => $REGISTER_DATE,
  75. "DOCU_FEAR" => DB::raw('CURRENT_TIMESTAMP'),
  76. ]);
  77. return $name_document;
  78. } catch (Throwable $th) {
  79. return $this->response_controller
  80. ->makeResponse(TRUE, 'ERR_DOCUMENTO_REG001: Error inesperado guardando el documento', strtoupper($th->getMessage()), 500);
  81. }
  82. }
  83. // Metodo para eliminar duplicado en la estructura de un mismo nombre
  84. public function deleteCodificationStructureName($document_name, $line_number, $module_code)
  85. {
  86. try {
  87. // Verifica que la nomenclatura no se duplique
  88. if (substr($document_name, 0, 8) == ($line_number . '-' . $module_code . '-') && strlen($document_name) > 28) {
  89. $document_name = substr($document_name, 28);
  90. }
  91. return $document_name;
  92. } catch (Throwable $th) {
  93. return $this->response_controller
  94. ->makeResponse(TRUE, 'ERR_DOCUMENTO_REG001: Error inesperado renombrando el documento', strtoupper($th->getMessage()), 500);
  95. }
  96. }
  97. // Metodo para buscar el nombre de la ultima versión de un documento
  98. public function getDocumentsWithSameName($document_name, $storage_disk)
  99. {
  100. try {
  101. $files_uploaded = Storage::disk($storage_disk)->files();
  102. $files = [];
  103. // Itera cada archivo guardado en el disco del storage
  104. foreach ($files_uploaded as $file) {
  105. if ($document_name == substr($file, 28)) {
  106. // Guarda la liga del documento con ese nombre, si es que existe
  107. $files[] = $file;
  108. }
  109. }
  110. // Verifica si el arreglo contiene algo
  111. if (isset($files[0]) && !empty($files[0])) {
  112. return $files;
  113. }
  114. // Si no hay coincidencias, devuelve el codigo de error XXXX
  115. return null;
  116. } catch (Throwable $th) {
  117. return $this->response_controller
  118. ->makeResponse(TRUE, 'ERR_DOCUMENTO_REG001: Error verificando el nombre del documento', strtoupper($th->getMessage()), 500);
  119. }
  120. }
  121. // Metodo para buscar el nombre de la ultima versión de un documento
  122. public function getDocumentsWithSameCodificationStructureName($document_name, $storage_disk)
  123. {
  124. try {
  125. $files_uploaded = Storage::disk($storage_disk)->files();
  126. $files = [];
  127. // Itera cada archivo guardado en el disco del storage
  128. foreach ($files_uploaded as $file) {
  129. if ($document_name == $file) {
  130. // Guarda la liga del documento con ese nombre, si es que existe
  131. $files[] = $file;
  132. }
  133. }
  134. // Verifica si el arreglo contiene algo
  135. if (isset($files[0]) && !empty($files[0])) {
  136. return $files;
  137. }
  138. // Si no hay, devuelve el codigo de error XXXX
  139. return null;
  140. } catch (Throwable $th) {
  141. return $this->response_controller
  142. ->makeResponse(TRUE, 'ERR_DOCUMENTO_REG001: Error verificando el nombre del documento', strtoupper($th->getMessage()), 500);
  143. }
  144. }
  145. // Metodo para verificar si ya existe el documento pdf
  146. public function sameDocumentsPdf($content, $old_documents_name)
  147. {
  148. try {
  149. // Se crea temporalmente un documento en el storage
  150. Storage::disk('pdf')->put(
  151. "TEMPORAL_FILE.pdf",
  152. $content
  153. );
  154. $new_file = (Storage::disk('pdf')->size("TEMPORAL_FILE.pdf"));
  155. // Itera cada archivo guardado en el disco del storage
  156. foreach ($old_documents_name as $file) {
  157. $old_file = (Storage::disk('pdf')->size($file));
  158. // Verifica si los documentos son iguales
  159. if ($old_file == $new_file) {
  160. Storage::disk('pdf')->delete('TEMPORAL_FILE.pdf');
  161. return $file;
  162. }
  163. }
  164. Storage::disk('pdf')->delete('TEMPORAL_FILE.pdf');
  165. return null;
  166. } catch (Throwable $th) {
  167. return $this->response_controller
  168. ->makeResponse(TRUE, 'ERR_DOCUMENTO_REG001: Error verificando autenticidad del documento', strtoupper($th), 500);
  169. }
  170. }
  171. // Metodo para eliminar una lista de documentos
  172. public function deleteAllDocumentsByName($document_names, $storage_disk)
  173. {
  174. foreach ($document_names as $document) {
  175. Storage::disk($storage_disk)->delete($document);
  176. }
  177. }
  178. // Metodo para verificar si ya existe el documento pdf enviando la información del request
  179. public function sameDocumentsPdfOnRequest($content, $old_documents_name)
  180. {
  181. try {
  182. // Se crea temporalmente un documento en el storage
  183. $content->storeAs('public/pdf_documents', "TEMPORAL_FILE.pdf");
  184. $new_file = (Storage::disk('pdf')->size("TEMPORAL_FILE.pdf"));
  185. // Itera cada archivo guardado en el disco del storage
  186. foreach ($old_documents_name as $file) {
  187. $old_file = (Storage::disk('pdf')->size($file));
  188. // Verifica si los documentos son iguales
  189. if ($old_file == $new_file) {
  190. Storage::disk('pdf')->delete('TEMPORAL_FILE.pdf');
  191. return $file;
  192. }
  193. }
  194. Storage::disk('pdf')->delete('TEMPORAL_FILE.pdf');
  195. return null;
  196. } catch (Throwable $th) {
  197. return $this->response_controller
  198. ->makeResponse(TRUE, 'ERR_DOCUMENTO_REG001: Error verificando autenticidad del documento', strtoupper($th->getMessage()), 500);
  199. }
  200. }
  201. // Metodo para verificar si ya existe el documento excel
  202. public function sameDocumentsExcel($document, $old_documents_name)
  203. {
  204. try {
  205. $document_repeated = null;
  206. $data_new_document = []; # Arreglo donde estarán los datos del nuevo documento
  207. $document = $document->getActiveSheet();
  208. $max_row = $document->getHighestRow(); # Fila
  209. $max_col = $document->getHighestColumn(); # Columna
  210. $max_col = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($max_col); # Se convierte la columna en numero
  211. // Se recorre el documento
  212. for ($row = 1; $row <= $max_row; $row++) {
  213. for ($col = 1; $col <= $max_col; $col++) {
  214. // Se obtiene el valor de esa celda del documento y se introduce en el arreglo
  215. $data_new_document[] = $document->getCellByColumnAndRow($col, $row)->getValue();
  216. }
  217. }
  218. foreach ($old_documents_name as $old_document_name) {
  219. $data_old_document = []; # Arreglo donde estarán los datos del viejo documento
  220. $old_document = IOFactory::load(Storage::disk('excel')->path($old_document_name));
  221. $document = $old_document->getActiveSheet();
  222. $max_row = $document->getHighestRow(); # Fila
  223. $max_col = $document->getHighestColumn(); # Columna
  224. $max_col = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($max_col); # Se convierte la columna en numero
  225. // Se recorre el documento
  226. for ($row = 1; $row <= $max_row; $row++) {
  227. for ($col = 1; $col <= $max_col; $col++) {
  228. // Se obtiene el valor de esa celda del documento y se introduce en el arreglo
  229. $data_old_document[] = $document->getCellByColumnAndRow($col, $row)->getValue();
  230. }
  231. }
  232. // Se compara dato por dato de cada documento para verificar si contiene lo mismo
  233. for ($i = 0; $i < sizeof($data_new_document); $i++) {
  234. if ($data_new_document[$i] != $data_old_document[$i]) {
  235. $document_repeated = null;
  236. break 1;
  237. }
  238. $document_repeated = $old_document_name;
  239. }
  240. if ($document_repeated != null) {
  241. return $document_repeated;
  242. }
  243. }
  244. return $document_repeated;
  245. } catch (Throwable $th) {
  246. return $this->response_controller
  247. ->makeResponse(TRUE, 'ERR_DOCUMENTO_REG001: Error verificando autenticidad del documento', strtoupper($th->getMessage()), 500);
  248. }
  249. }
  250. }