You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
9.1 KiB
237 lines
9.1 KiB
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)
|
|
# <option value="" selected="selected" style="color:#888;">seleccionar...</option>
|
|
# <option value="1"> IVA Responsable Inscripto</option>
|
|
# <option value="4"> IVA Sujeto Exento</option>
|
|
# <option value="5"> Consumidor Final</option>
|
|
# <option value="6"> Responsable Monotributo</option>
|
|
# <option value="7"> Sujeto No Categorizado</option>
|
|
# <option value="8"> Proveedor del Exterior</option>
|
|
# <option value="9"> Cliente del Exterior</option>
|
|
# <option value="10"> IVA Liberado - Ley Nº 19.640</option>
|
|
# <option value="13"> Monotributista Social</option>
|
|
# <option value="15"> IVA No Alcanzado</option>
|
|
# <option value="16"> Monotributista Trabajador Independiente Promovido</option>
|
|
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()
|