DocumentsController.php 12 KB

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