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