Files
app_faturas/app/utils.py
ewerton.almeida f3c2b08a69
All checks were successful
continuous-integration/drone/push Build is passing
Atualiza exibição do tempo por processo e garante consistência da estrutura em app/
2025-07-28 22:31:31 -03:00

66 lines
2.2 KiB
Python
Executable File

import os
import fitz
import logging
import re
from datetime import datetime
from app.database import AsyncSessionLocal
from app.models import Fatura, LogProcessamento
from app.calculos import calcular_campos_dinamicos
from app.layouts.equatorial_go import extrair_dados as extrair_dados_equatorial
from sqlalchemy.future import select
logger = logging.getLogger(__name__)
def extrair_dados_pdf(caminho_pdf):
try:
with fitz.open(caminho_pdf) as doc:
texto_final = ""
for page in doc:
blocos = page.get_text("blocks")
blocos.sort(key=lambda b: (b[1], b[0]))
for b in blocos:
texto_final += b[4] + "\n"
if not texto_final.strip():
raise ValueError("PDF não contém texto legível")
dados_extraidos = extrair_dados_equatorial(texto_final)
return dados_extraidos
except Exception as e:
raise ValueError(f"Erro ao processar PDF: {str(e)}")
async def nota_ja_existente(nota_fiscal, uc):
async with AsyncSessionLocal() as session:
result = await session.execute(
select(Fatura).filter_by(nota_fiscal=nota_fiscal, unidade_consumidora=uc)
)
return result.scalar_one_or_none() is not None
async def adicionar_fatura(dados, caminho_pdf):
async with AsyncSessionLocal() as session:
try:
dados_calculados = await calcular_campos_dinamicos(dados, session)
fatura = Fatura(**dados_calculados)
fatura.arquivo = os.path.basename(caminho_pdf)
fatura.link_arquivo = os.path.abspath(caminho_pdf)
fatura.data_processamento = datetime.now()
session.add(fatura)
log = LogProcessamento(
status="PROCESSAMENTO",
mensagem=f"Fatura adicionada com sucesso: {fatura.nota_fiscal} - {fatura.nome}",
nome_arquivo=os.path.basename(caminho_pdf)
)
session.add(log)
await session.commit()
logger.info(log.mensagem)
return True
except Exception as e:
logger.error(f"Erro ao adicionar fatura no banco: {e}")
await session.rollback()
raise