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()