Open Luisrepi opened 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):
# 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):
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()
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):
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`
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.
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
Hola, muy bueno el codigo! Sin embargo al momento de seleccionar la entidad no esta funcionando. Particularmente aqui:
Has encontrado alguna solucion?