memsim.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. import os
  2. import glob
  3. import sqlite3
  4. import time
  5. import logging
  6. from datetime import datetime
  7. from selenium import webdriver
  8. from selenium.webdriver.chrome.options import Options
  9. from sim.config import Configuration
  10. from sim.utils.unzipfile import unzipfile_and_remove
  11. from sim.utils.common import Validation
  12. from sim.utils.exceptions import CertificadosIncorrectos
  13. from sim.utils.mailsender import Emailer
  14. import sim.utils.logconfig
  15. from dotenv import load_dotenv
  16. import pyodbc
  17. from sim.filemanager import move_file_to_server
  18. def download_files():
  19. load_dotenv()
  20. rootLogger = logging.getLogger(__name__)
  21. rootLogger.info("Iniciando proceso de descarga de Facturas")
  22. start = time.time()
  23. config = Configuration()
  24. val = Validation()
  25. mail = Emailer(config.SMTP_SERVER,config.SMTP_PORT,config.AUTH_USER,config.AUTH_PASS)
  26. downloadFilePath = config.DOWNLOAD_PATH
  27. chromedriver = config.DRIVER_PATH
  28. exts = [".pdf", ".xml"]
  29. url = "https://memsim.cenace.gob.mx/produccion/participantes/LOGIN/"
  30. try:
  31. options = Options()
  32. options.add_argument("start-maximized")
  33. prefs = {"download.default_directory": downloadFilePath,
  34. "download.prompt_for_download": False,
  35. "download.directory_upgrade": True,
  36. "safebrowsing.enabled":True,
  37. "plugins.always_open_pdf_externally": True}
  38. options.add_experimental_option("prefs", prefs)
  39. driver = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)
  40. #driver.implicitly_wait(10)
  41. rootLogger.info("Ingresando a la url: {0}".format(url))
  42. driver.get(url)
  43. rootLogger.info("Iniciando proceso de certificación y login...")
  44. val.validate_element_by_id(driver,"uploadCerfile0")
  45. driver.find_element_by_id("uploadCerfile0").send_keys(
  46. os.path.join(config.CERT_PATH,"carlosmauriciojuarez-mexicanenergytrading.cer"))
  47. val.validate_element_by_id(driver,"uploadKeyfile0")
  48. driver.find_element_by_id("uploadKeyfile0").send_keys(
  49. os.path.join(config.CERT_PATH,"carlosmauriciojuarez-mexicanenergytrading_user.key"))
  50. val.validate_element_by_id(driver,"txtPrivateKey")
  51. driver.find_element_by_id("txtPrivateKey").send_keys(config.PRIVATE_KEY)
  52. time.sleep(1)
  53. driver.find_element_by_id("btnEnviar").click()
  54. if not val.check_element_by_id(driver, "txtUsuario"):
  55. raise CertificadosIncorrectos(driver.find_element_by_id("lblCertificadoIncorrecto").text)
  56. driver.find_element_by_id("txtUsuario").send_keys(config.USER_NAME)
  57. driver.find_element_by_id("txtPassword").send_keys(config.PASSWORD)
  58. driver.find_element_by_id("Button1").click()
  59. rootLogger.info("Inicio de sesión satisfactorio...")
  60. rootLogger.info("Ingreso a la sección de Estados de Cuenta y Facturas...")
  61. driver.find_element_by_css_selector(
  62. "#ctl07 > ul:nth-child(1) > li:nth-child(4) > a:nth-child(1) > span:nth-child(1)").click()
  63. driver.find_element_by_css_selector("#FACT_Consultar > span:nth-child(1)").click()
  64. val.validate_element_by_tag_name(driver, "iframe")
  65. driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
  66. driver.find_element_by_css_selector("li.rtLI:nth-child(2) > ul:nth-child(2) > li:nth-child(1) > div:nth-child(1) > span:nth-child(2)").click()
  67. val.validate_element_not_present(driver, "RadAjaxLoadingPanel1RadAjaxPanel1")
  68. val.validate_element_by_id(driver, "Div7")
  69. ecd_div = driver.find_element_by_id("Div7")
  70. trs = ecd_div.find_elements_by_tag_name("tr")
  71. regs = []
  72. rootLogger.info("Leyendo listado de DF en la página web...")
  73. for tr in trs:
  74. tr_id = tr.get_property("id")
  75. if tr_id != "":
  76. tds = tr.find_elements_by_tag_name("td")
  77. df_name = tds[0].get_attribute("innerHTML")
  78. xml_id = tds[1].find_element_by_tag_name("input").get_property("id")
  79. pdf_id = tds[2].find_element_by_tag_name("input").get_property("id")
  80. update = tds[3].get_attribute("innerHTML")
  81. rootLogger.debug(" DF: {0} | actualizacion: {1}".format(df_name, update))
  82. ecd_info = [df_name, xml_id, pdf_id, update]
  83. regs.append(ecd_info)
  84. num_regs = len(regs)
  85. rootLogger.info("Se encontraton {0} registros".format(num_regs))
  86. i = 1
  87. d = 0
  88. e = 0
  89. scroll=1
  90. downloaded_dfs = []
  91. for reg in regs:
  92. df_name = reg[0]
  93. rootLogger.info("{0} de {1} -- Descargando información del Estado de Cuenta: {2} ...".format(i, num_regs, df_name))
  94. conn = pyodbc.connect('Driver={SQL Server};'
  95. 'Server=192.168.98.207;'
  96. 'Database=PRD_ORION;'
  97. 'UID='+config.DBUSER+';'
  98. 'PWD='+config.DBPASS+';')
  99. cursor = conn.cursor()
  100. rootLogger.info("Buscando en la base de datos...")
  101. cursor.execute("SELECT * FROM MEXICO.DF_DOWNLOAD_LOG WHERE NOMBRE_FACTURA = '{0}'".format(df_name))
  102. data = cursor.fetchall()
  103. if len(data) == 0:
  104. rootLogger.info("No se encontró en la base de datos... Se inicia la Descarga!")
  105. filepath = downloadFilePath + "\\" + df_name
  106. rootLogger.info("filepath: " + filepath)
  107. try:
  108. driver.find_element_by_id(reg[1]).click()
  109. except:
  110. driver.execute_script("document.getElementById(\"RadGrid6_GridData\").scroll(0,"+str(175*scroll)+")")
  111. scroll=scroll+1
  112. driver.find_element_by_id(reg[1]).click()
  113. val.validate_download(filepath+".xml")
  114. try:
  115. driver.find_element_by_id(reg[2]).click()
  116. except:
  117. driver.execute_script("document.getElementById(\"RadGrid6_GridData\").scroll(0,"+str(175*scroll)+")")
  118. driver.find_element_by_id(reg[2]).click()
  119. val.validate_download(filepath+".pdf")
  120. flag = True
  121. for ext in exts:
  122. if not os.path.exists(filepath + ext):
  123. flag = False
  124. for filename in glob.glob(filepath + "*"):
  125. os.remove(filename)
  126. for filename in glob.glob(downloadFilePath + "*.tmp"):
  127. os.remove(filename)
  128. e = e + 1
  129. break
  130. if flag:
  131. rootLogger.info("Archivos Descargados satisfactoriamente... df_name: "+df_name)
  132. downloaded_dfs.append(df_name)
  133. rootLogger.info("Moviendo archivos al servidor...")
  134. move_file_to_server(df_name)
  135. for filename in glob.glob(filepath + "*"):
  136. os.remove(filename)
  137. rootLogger.info("Guardando información en la base de datos...")
  138. cursor.execute(
  139. "INSERT INTO MEXICO.DF_DOWNLOAD_LOG(NOMBRE_FACTURA) values ('{0}')".format(df_name))
  140. d = d + 1
  141. else:
  142. rootLogger.info("Los archivos ya se descargaron...")
  143. conn.commit()
  144. conn.close()
  145. i = i + 1
  146. driver.switch_to.default_content()
  147. driver.find_element_by_id("btnCerrarSesion").click()
  148. driver.quit()
  149. end = time.time()
  150. total_time = end - start
  151. mins, secs = divmod(total_time, 60)
  152. hours, mins = divmod(mins, 60)
  153. rootLogger.info("Se descargaron un total de {0} Documentos Fiscales".format(d))
  154. rootLogger.info("Falló la descarga de {0} Documentos Fiscales".format(e))
  155. rootLogger.info("El proceso finalizón en {0:.0f}:{1:.0f}:{2:.2f} ".format(hours, mins, secs))
  156. if d > 0:
  157. mail.send_success_email('robot@mercadoselectricos.com.sv','francisco.huezo@mercadoselectricos.com.sv',
  158. "Proceso de Descarga finalizado","Descarga de archivos finalizada",
  159. type='success', report_count= d)
  160. return downloaded_dfs
  161. except Exception as ex:
  162. template = "An exception of type {0} occurred. Arguments:\n{1!r}"
  163. for filename in glob.glob(downloadFilePath+"\\" + "*"):
  164. os.remove(filename)
  165. message = template.format(type(ex).__name__, ex.args)
  166. rootLogger.error(message, exc_info=True)
  167. driver.quit()
  168. mail.send_warning_email('robot@mercadoselectricos.com.sv', 'francisco.huezo@mercadoselectricos.com.sv',
  169. "Proceso de Descarga finalizado", "Error en el proceso de descarga de archivos")
  170. return []
  171. if __name__ == "__main__":
  172. download_files()