diefun / afip_fe_selenium

Generador de facturas electrónicas de AFIP con Python y Selenium
1 stars 0 forks source link

Problema. #1

Open Luisrepi opened 1 year ago

Luisrepi commented 1 year ago

Hola, muy bueno el codigo! Sin embargo al momento de seleccionar la entidad no esta funcionando. Particularmente aqui:

# Busca la entidad hace click
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="contenido"]/form/table/tbody/tr[4]/td/input[2]'))
)
entidad = driver.find_element(by='xpath', value='//*[@id="contenido"]/form/table/tbody/tr[4]/td/input[2]')
entidad.click()

Has encontrado alguna solucion?

diefun commented 1 year ago

Uh si, es que este código quedó muy desactualizado. El actual es este:

`import time import calendar

from datetime import date from flask import Blueprint, request from selenium.common.exceptions import NoSuchElementException from selenium import webdriver from selenium.webdriver.common.alert import Alert from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support.ui import Select from webdriver_manager.chrome import ChromeDriverManager

bp = Blueprint('facturar', name)

def acceso_comprobantes_en_linea(cuit, password):

sistema = request.user_agent.platform

# if sistema == 'macos':
driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())
#     driver = webdriver.Chrome('utils/driver/macos/chromedriver')
# elif sistema == 'windows':
#     driver = webdriver.Chrome('utils/driver/windows/chromedriver.exe')
# else:
#     driver = webdriver.Chrome('utils/driver/linux/chromedriver')

# Accede a la web de AFIP
driver.get('https://auth.afip.gob.ar/contribuyente_/login.xhtml')
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="F1:username"]'))
)

# Carga datos de acceso
driver.find_element(by='xpath', value='//*[@id="F1:username"]').send_keys(cuit)
driver.find_element(by='xpath', value='//*[@id="F1:btnSiguiente"]').send_keys(Keys.RETURN)
driver.find_element(by='xpath', value='//*[@id="F1:password"]').send_keys(password)
driver.find_element(by='xpath', value='//*[@id="F1:btnIngresar"]').send_keys(Keys.RETURN)

# Navega el sitio para encontrar servicios y acceder a comprobantes en línea
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="serviciosMasUtilizados"]/div/div/div/div[1]/a/div/h3'))
)
driver.find_element(by='xpath', value='//*[@id="serviciosMasUtilizados"]/div/div/div/div[5]/div/a').send_keys(
    Keys.RETURN)
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="root"]/div/main/div/section/div/div[3]/div[11]/a'))
)

comprobantes = driver.find_element(by='xpath', value='//*[@id="root"]/div/main/div/section/div/div[3]/div[11]/a') # Modificar para cada usuario
comprobantes.click()
time.sleep(2)

# Cambia el driver al tab de los comprobantes
driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.CONTROL + Keys.NUMPAD2)
driver.switch_to.window(driver.window_handles[-1])
time.sleep(1)

# Busca la entidad hace click
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="contenido"]/form/table/tbody/tr[4]/td/input[2]'))
)
entidad = driver.find_element(by='xpath', value='//*[@id="contenido"]/form/table/tbody/tr[4]/td/input[2]')
entidad.click()

return driver

def generar_comprobante(driver):

Busca el botón para generar comprobantes y hace click

WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="btn_gen_cmp"]'))
)
generar = driver.find_element(by='xpath', value='//*[@id="btn_gen_cmp"]')
generar.click()

# Busca el selector de punto de venta y selecciona las opciones
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="puntodeventa"]'))
)
pto_venta = driver.find_element(by='xpath', value='//*[@id="puntodeventa"]')
opciones = Select(pto_venta)
opciones.select_by_value('5') # Modificar según punto de venta del usuario
time.sleep(1)
tipo_comprobante = driver.find_element(by='xpath', value='//*[@id="universocomprobante"]')
opciones = Select(tipo_comprobante)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'option[value="2"]')))
opciones.select_by_value('2')
continuar = driver.find_element(by='xpath', value='//*[@id="contenido"]/form/input[2]')
continuar.click()

Busca el selector de fecha y carga los datos solicitados

def fechas_comprobante(driver, fecha, fecha_inicio, fecha_fin, error_fecha=False): WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//[@id="fc"]')) ) driver.find_element(by='xpath', value='//[@id="fc"]').send_keys(Keys.COMMAND + 'A' + Keys.DELETE) driver.find_element(by='xpath', value='//[@id="fc"]').send_keys(fecha) concepto = driver.find_element(by='xpath', value='//[@id="idconcepto"]') opciones_concepto = Select(concepto) if error_fecha: opciones_concepto.select_by_visible_text(' Productos')

opciones_concepto.select_by_visible_text(' Servicios')
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="fsd"]'))
)
driver.find_element(by='xpath', value='//*[@id="fsd"]').send_keys(Keys.COMMAND + 'A' + Keys.DELETE)
driver.find_element(by='xpath', value='//*[@id="fsd"]').send_keys(fecha_inicio)
driver.find_element(by='xpath', value='//*[@id="fsh"]').send_keys(Keys.COMMAND + 'A' + Keys.DELETE)
driver.find_element(by='xpath', value='//*[@id="fsh"]').send_keys(fecha_fin)
driver.find_element(by='xpath', value='//*[@id="contenido"]/form/input[2]').click()

def crear_factura(driver, pago_id, fecha, importe):

Fechas

today = date.today()
mes = str(today.month)
anio = str(today.year)
primer_dia, ultimo_dia = calendar.monthrange(today.year, today.month)

if today.month < 10:
    mes = '0' + mes

fecha_principio_mes = '01/' + mes + '/' + anio
fecha_fin_mes = str(ultimo_dia) + '/' + mes + '/' + anio

fecha_cruda = fecha
fecha_lista = fecha_cruda.split('-')
fecha_comprobante = fecha_lista[2].strip('\n') + '/' + fecha_lista[1] + '/' + fecha_lista[0]
descripcion = 'Clases'

generar_comprobante(driver)

fechas_comprobante(driver, fecha_comprobante, fecha_principio_mes, fecha_fin_mes)

verificar_fecha = True
dia = int(fecha_lista[2].strip('\n'))
while verificar_fecha:
    try:
        condicion = driver.find_element(by='xpath', value='//*[@id="idivareceptor"]')
        verificar_fecha = False
    except NoSuchElementException:
        dia += 1
        fecha_comprobante = str(dia) + '/' + fecha_lista[1] + '/' + fecha_lista[0]
        WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//*[@id="btnvolver"]'))
        )
        driver.find_element(by='xpath', value='//*[@id="btnvolver"]').click()

        fechas_comprobante(driver, fecha_comprobante, fecha_principio_mes, fecha_fin_mes, error_fecha=True)

opciones_tipo = Select(condicion)
opciones_tipo.select_by_visible_text(' Consumidor Final')
time.sleep(1)
tipo_documento = driver.find_element(by='xpath', value='//*[@id="idtipodocreceptor"]')
opciones_tipo = Select(tipo_documento)
opciones_tipo.select_by_visible_text('DNI')
driver.find_element(by='xpath', value='//*[@id="formadepago7"]').click()
driver.find_element(by='xpath', value='//*[@id="formulario"]/input[2]').click()

# Busca el campo de descripción y carga los datos solicitados
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="detalle_descripcion1"]'))
)
driver.find_element(by='xpath', value='//*[@id="detalle_descripcion1"]').send_keys(descripcion)
driver.find_element(by='xpath', value='//*[@id="detalle_precio1"]').send_keys(importe)
driver.find_element(by='xpath', value='//*[@id="contenido"]/form/input[8]').click()

# Busca el botón de "Confirmar Datos..." y continúa
WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//*[@id="btngenerar"]'))
)
driver.find_element(by='xpath', value='//*[@id="btngenerar"]').click()
time.sleep(1)
alerta = Alert(driver)
alerta.accept()

time.sleep(1)

driver.find_element(by='xpath', value='//*[@id="contenido"]/table/tbody/tr[2]/td/input').click()

return pago_id, True, driver`
Luisrepi commented 11 months ago

Muy agradecido por toda tu ayuda!! te hago la ultima consulta: trabajaste alguna vez con cuits que tienen dos items de producto por factura que lea los datos de un csv, json o algo por el estilo? tengo un codigo pero me los duplica.

diefun commented 11 months ago

No, siempre use un solo ítem por factura, pero podes hacerlo con un loop por la cantidad de items que tenes y si el ciclo es diferente del 1 que busque el XPATH del botón agregar ítem y lo clickee