commit
cba6d22fcb
8 changed files with 271 additions and 0 deletions
@ -0,0 +1 @@ |
|||||
|
*.pyc |
||||
@ -0,0 +1,3 @@ |
|||||
|
# README |
||||
|
|
||||
|
Download geckodriver package for example geckodriver-v0.30.0-linux32.tar.gz and uncompress on this same dir |
||||
@ -0,0 +1,237 @@ |
|||||
|
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() |
||||
@ -0,0 +1,26 @@ |
|||||
|
import csv |
||||
|
from afip.comprobantes.facturador import MyComprobantesAfip |
||||
|
|
||||
|
cuit = "" |
||||
|
password = "" |
||||
|
nombre_empresa = "" |
||||
|
|
||||
|
filename = "input.csv" |
||||
|
with open(filename, newline='') as csvfile: |
||||
|
reader = csv.DictReader(csvfile) |
||||
|
afip = MyComprobantesAfip(cuit, password, nombre_empresa, confirmar_manualmente=False) |
||||
|
afip.login() |
||||
|
fila = 1 |
||||
|
for row in reader: |
||||
|
print(f'Informacion de la fila: {fila} -> {row}') |
||||
|
afip.generar_comprobante(fecha_comprobante=row["fecha_comprobante"], |
||||
|
id_concepto=2, |
||||
|
fecha_desde=row["fecha_desde"], |
||||
|
fecha_hasta=row["fecha_hasta"], |
||||
|
vencimiento_pago=row["fecha_comprobante"], |
||||
|
referencia=row["referencia"], |
||||
|
concepto=row["concepto"], |
||||
|
precio=row["monto"] |
||||
|
) |
||||
|
fila = fila + 1 |
||||
|
afip.cerrar() |
||||
@ -0,0 +1 @@ |
|||||
|
PATH=$PATH:./ python facturar.py |
||||
Loading…
Reference in new issue