Parser.php 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. defined('BASEPATH') or exit('No direct script access allowed');
  3. class Parser extends CI_Controller
  4. {
  5. //TODO: PARAMETRIZAR BBDD -> SI EXISTE UN PROCESO EN MARCHA, NO INICIAR SIGUIENTE DESCARGA, AVISAR
  6. protected $rutaDiaria = FCPATH . "DOWNLOADS/DAILY/";
  7. protected $rutaDiariaFecha = "";
  8. protected $rutaMensual = FCPATH . "DOWNLOADS/MONTH/";
  9. protected $enlaceAtom = "";
  10. protected $fechaCreacionLog = "";
  11. public function __construct()
  12. {
  13. parent::__construct();
  14. $this->load->helper('file');
  15. $this->load->helper('xml');
  16. $this->load->library('Parserfile');
  17. $this->load->model("Parser_model");
  18. }
  19. public function index()
  20. {
  21. $fechaCarpeta = "";
  22. $this->Parser_model->inicioParser();
  23. $resultSetPerfiles = $this->Parser_model->getUrlArchivos();
  24. $fechaCarpeta = date("Y-m-d_H-i-s");
  25. $fechaImportacionLog = date("Y-m-d H:i:s");
  26. foreach ($resultSetPerfiles['datos'] as $row) {
  27. $idUltimaImportacion = $this->Parser_model->setFechaNuevaImportacion($fechaImportacionLog);
  28. $this->Xlsexport_model->getLastDateLog($idUltimaImportacion);
  29. $this->fechaCreacionLog = $fechaCarpeta;
  30. $rutaPerfil = $this->rutaDiaria . "/" . $row->prefijos_tablas;
  31. $this->removeFoldersFromThursdayToMonday($rutaPerfil);
  32. $this->newFolder($rutaPerfil);
  33. if ($this->newFolder($rutaPerfil . "/" . $fechaCarpeta)) {
  34. $this->rutaDiariaFecha = $rutaPerfil . "/" . $fechaCarpeta . "/";
  35. $this->downloadZip($row->url_descarga);
  36. }
  37. $files = get_filenames($this->rutaDiariaFecha . "/format");
  38. emailInicioProcesoDescarga($fechaImportacionLog, $files);
  39. $this->parserfile->index($this->rutaDiariaFecha, $fechaCarpeta, $row, $idUltimaImportacion);
  40. }
  41. $idUltimaImportacion = 81;
  42. $this->tablasCalculadas($idUltimaImportacion);
  43. $this->load->library('ExportXls');
  44. $this->exportxls->exportDatosCompletos();
  45. $this->Parser_model->stopParser();
  46. }
  47. private function downloadZip($urlXML)
  48. {
  49. $fechaDescarga = $this->getFechaForDownloadZip();
  50. $fileName = basename($urlXML);
  51. $downladedZip = $this->downloadFile($fileName, $urlXML . $fechaDescarga, $this->rutaDiariaFecha);
  52. if ($downladedZip) {
  53. $zip = new ZipArchive;
  54. if ($zip->open($this->rutaDiariaFecha . $fileName)) {
  55. $zip->extractTo($this->rutaDiariaFecha);
  56. $zip->close();
  57. unlink($this->rutaDiariaFecha . $fileName);
  58. $archivosTotales = get_filenames($this->rutaDiariaFecha);
  59. foreach ($archivosTotales as $file) {
  60. $this->getFile($this->rutaDiariaFecha . $file, $file);
  61. }
  62. }
  63. }
  64. }
  65. private function getFechaForDownloadZip(): String
  66. {
  67. $result = "_";
  68. $anyo = date("Y");
  69. $mes = date("m");
  70. $mesPrevious = date("m", strtotime("-1 months"));
  71. $yearPrevious = date("Y", strtotime("-1 year"));
  72. $dia = date("d");
  73. if (date("m") == "01") {
  74. $result .= $yearPrevious . $mesPrevious . ".zip";
  75. } else {
  76. if ($dia == "01") {
  77. $result .= $anyo . $mesPrevious . ".zip";
  78. } else {
  79. $result .= $anyo . $mes . ".zip";
  80. }
  81. }
  82. return $result;
  83. }
  84. private function getFile($url, $fileName)
  85. {
  86. $feed = implode(file($url));
  87. $xml = simplexml_load_string($feed);
  88. $json = json_encode($xml);
  89. $array = json_decode($json, true);
  90. $this->formatXml($feed, $fileName);
  91. return $array;
  92. }
  93. private function newFolder($rutaFinal)
  94. {
  95. $result = false;
  96. if (!is_dir($rutaFinal)) {
  97. $result = mkdir($rutaFinal);
  98. mkdir($rutaFinal . "/format");
  99. }
  100. return $result;
  101. }
  102. private function formatXml($xml, $fileName)
  103. {
  104. $openingFormat = $this->regExIniciosEsquema($xml);
  105. $closureFormat = $this->regExFinalesEsquema($openingFormat);
  106. unlink($this->rutaDiariaFecha . "/" . $fileName);
  107. file_put_contents($this->rutaDiariaFecha . "/format/" . $fileName, $closureFormat);
  108. }
  109. private function downloadFile($fileName, $url, $ruta)
  110. {
  111. if (file_put_contents($ruta . $fileName, file_get_contents($url))) {
  112. return true;
  113. } else {
  114. return false;
  115. }
  116. }
  117. private function regExIniciosEsquema($xml)
  118. {
  119. $pattern = "/(<cac:)|(<cbc:)|(<cac-place-ext:)|(<cbc-place-ext:)|(<at:)/";
  120. $result = preg_replace($pattern, "<", $xml);
  121. return $result;
  122. }
  123. private function regExFinalesEsquema($xml)
  124. {
  125. $pattern = "/(<\/cac:)|(<\/cbc:)|(<\/cac-place-ext:)|(<\/cbc-place-ext:)|(<\/at:)/";
  126. $result = preg_replace($pattern, "</", $xml);
  127. return $result;
  128. }
  129. private function tablasCalculadas($idUltimaImportacion)
  130. {
  131. $this->Parser_model->truncateTables("vista_datos_licitacion");
  132. $licitaciones = $this->Xlsexport_model->getLicitaciones($idUltimaImportacion);
  133. insertBucleDuplicateOnKey($licitaciones['datos'], "vista_datos_licitacion", "insertVistaDatosLicitacionesPreExcel");
  134. }
  135. private function removeFoldersFromThursdayToMonday($ruta)
  136. {
  137. $dayWeek = date('l');
  138. if ($dayWeek == "Friday") {
  139. $folders = glob($ruta . "/*");
  140. $thursday = date('Y-m-d', strtotime(date("Y-m-d") . ' -1 days'));
  141. $minusSixDays = date('Y-m-d', strtotime($thursday . ' -6 days'));
  142. foreach ($folders as $folder) {
  143. $folderDate = substr($folder, -19, 10);
  144. if ($folderDate <= $thursday && $folderDate >= $minusSixDays) {
  145. eliminarArchivosProcesoCompleto($folder);
  146. }
  147. }
  148. }
  149. }
  150. }