from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.select import Select from selenium.webdriver.firefox.firefox_profile import FirefoxProfile import time import sys class MyComprobantesAfip: def __init__(self, cuit, password, nombre_empresa, descargar_comprobante=True, confirmar_manualmente=True, directorio_comprobantes="./", tiempo_espera_confirmacion_automatica=5 ): self.cuit = cuit self.password = password self.nombre_empresa = nombre_empresa self.descargar_comprobante=descargar_comprobante self.confirmar_manualmente=confirmar_manualmente self.directorio_comprobantes=directorio_comprobantes self.tiempo_espera_confirmacion_automatica=tiempo_espera_confirmacion_automatica def esperar(self,secs=10): for remaining in range(secs, 0, -1): sys.stdout.write("\r") sys.stdout.write("quedan {:2d} segundos..".format(remaining)) sys.stdout.flush() time.sleep(1) sys.stdout.write("\rOk! \n") def inicializar_browser(self): print("Inicializando Navegador...") profile = FirefoxProfile() profile.set_preference("browser.download.panel.shown", False) profile.set_preference("browser.download.manager.showWhenStarting", False) profile.set_preference("browser.download.manager.alertOnEXEOpen", False) profile.set_preference("browser.download.manager.focusWhenStarting", False) profile.set_preference("browser.download.manager.useWindow", False) profile.set_preference("browser.download.manager.showAlertOnComplete", False) profile.set_preference("browser.download.manager.closeWhenDone", False) # profile.set_preference("browser.helperApps.neverAsk.openFile","text/csv,application/vnd.ms-excel,application/pdf") profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv,application/vnd.ms-excel,application/pdf") profile.set_preference("browser.download.folderList", 2) profile.set_preference("browser.download.dir", self.directorio_comprobantes) profile.set_preference("browser.helperApps.alwaysAsk.force", False) self.browser = webdriver.Firefox(firefox_profile=profile) self.browser.implicitly_wait(10) def login(self): self.inicializar_browser() print("Ingresando a AFIP...") self.browser.get('https://auth.afip.gob.ar/contribuyente_/login.xhtml') assert 'Acceso con Clave Fiscal - AFIP' in self.browser.title elem = self.browser.find_element(By.NAME, 'F1:username') elem.send_keys(self.cuit + Keys.RETURN) elem = self.browser.find_element(By.NAME, 'F1:password') elem.send_keys(self.password + Keys.RETURN) time.sleep(5) assert 'Mi Portal - Clave Fiscal' in self.browser.title print("Ingresando a Aplicativo Generacion de Comprobantes...") elem = self.browser.find_element(By.CSS_SELECTOR, "[title='rcel']") elem.click() time.sleep(4) self.browser.switch_to.window(self.browser.window_handles[-1]) time.sleep(2) self.seleccionarEmpresa(self.nombre_empresa) def seleccionarEmpresa(self, nombre_empresa): assert 'RCEL' in self.browser.title print("Seleccionando empresa...") elem = self.browser.find_element(By.CSS_SELECTOR, "[value='"+ nombre_empresa +"']") elem.click() print("Ingresando a generar nuevo comprobante...") elem = self.browser.find_element(By.ID, "btn_gen_cmp") elem.click() time.sleep(4) def cerrar(self): print("Finalizando...") self.browser.quit() def menu_principal(self): self.browser.get("https://serviciosjava2.afip.gob.ar/rcel/jsp/menu_ppal.jsp") def generar_comprobante(self, punto_de_venta=1, tipo_comprobante=0, fecha_comprobante="26/12/2021", id_concepto=2, fecha_desde="26/12/2021", fecha_hasta="26/12/2021", vencimiento_pago="26/12/2021", referencia="", id_iva_receptor="5", forma_de_pago="", concepto="", precio="" ): assert 'RCEL' in self.browser.title print("Iniciando generacion de nuevo comprobante...") # assert "Puntos de Ventas y Tipos de Comprobantes habilitados para impre" in self.browser.current_url ## PRIMERA PAGINA print("Seleccionando punto de venta y tipo de comprobante...") ### Punto de venta elem = self.browser.find_element(By.ID, "puntodeventa") select_object = Select(elem) # Comienza con 1 porque el 0 es vacio select_object.select_by_index(punto_de_venta) time.sleep(2) ### Tipo de comprobante (0 es factura) elem = self.browser.find_element(By.ID, "universocomprobante") select_object = Select(elem) # 0 es factura select_object.select_by_index(tipo_comprobante) time.sleep(2) elem = self.browser.find_element(By.CSS_SELECTOR, "[value='Continuar >']") elem.click() ## SEGUNDA PAGINA ### Fecha de Comprobante elem = self.browser.find_element(By.ID, "fc") elem.clear() elem.send_keys(fecha_comprobante) ### Concepto elem = self.browser.find_element(By.ID, "idconcepto") select_object = Select(elem) # 1 - Productos # 2 - Servicios # 3 - Productos y Servicios select_object.select_by_index(id_concepto) time.sleep(2) ### Fecha desde elem = self.browser.find_element(By.ID, "fsd") elem.clear() elem.send_keys(fecha_desde) ### Fecha hasta elem = self.browser.find_element(By.ID, "fsh") elem.clear() elem.send_keys(fecha_hasta) ### Fecha de pago elem = self.browser.find_element(By.ID, "vencimientopago") elem.clear() elem.send_keys(vencimiento_pago) ### Referencia elem = self.browser.find_element(By.ID, "refComEmisor") elem.clear() elem.send_keys(referencia) elem = self.browser.find_element(By.CSS_SELECTOR, "[value='Continuar >']") elem.click() ## TERCERA PAGINA elem = self.browser.find_element(By.ID, "idivareceptor") select_object = Select(elem) # # # # # # # # # # # # select_object.select_by_value(id_iva_receptor) time.sleep(2) ### Otra forma de pago # TODO: Mejorar esta parte estamos seleccionando otro elem = self.browser.find_element(By.ID, "formadepago7") elem.click() elem = self.browser.find_element(By.CSS_SELECTOR, "[value='Continuar >']") elem.click() ## CUARTA PAGINA elem = self.browser.find_element(By.ID, "detalle_descripcion1") elem.send_keys(concepto) elem = self.browser.find_element(By.ID, "detalle_precio1") elem.send_keys(precio) elem = self.browser.find_element(By.CSS_SELECTOR, "[value='Continuar >']") elem.click() self.confirmar_comprobante() def confirmar_comprobante(self): menu_principal_button = self.browser.find_element(By.CSS_SELECTOR, "[value='Menú Principal']") boton_generar = self.browser.find_element(By.ID, "btngenerar") confirmado=False confirmar="N" if self.confirmar_manualmente: confirmar=input('Confirmar comprobante? (Y/N):') else: print("Si no quiere continuar cancele la ejecucion") self.esperar(self.tiempo_espera_confirmacion_automatica) confirmar="Y" if confirmar=="Y": boton_generar.click() time.sleep(2) # TODO: Capturar el "Comprobante Generado" dialogo_confirmacion = self.browser.switch_to.alert dialogo_confirmacion.accept() time.sleep(2) confirmado = True if confirmado and self.descargar_comprobante: boton_imprimir = self.browser.find_element(By.CSS_SELECTOR, "[value='Imprimir...']") boton_imprimir.click() menu_principal_button.click() elem = self.browser.find_element(By.ID, "btn_gen_cmp") elem.click()