# app/relatorios.py from fastapi import APIRouter, Depends, Query from fastapi.responses import StreamingResponse from sqlalchemy.orm import Session from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from database import get_session from models import Fatura, ParametrosFormula, AliquotaUF from io import BytesIO import pandas as pd from datetime import datetime router = APIRouter() def calcular_pis_cofins_corretos(base, icms, aliquota): try: return round((base - (base - icms)) * aliquota, 5) except: return 0.0 @router.get("/relatorio-exclusao-icms") async def relatorio_exclusao_icms(cliente: str = Query(None), db: AsyncSession = Depends(get_session)): faturas = db.query(Fatura).all() dados = [] for f in faturas: if f.base_pis == f.base_icms == f.base_cofins: pis_corr = calcular_pis_cofins_corretos(f.base_pis, f.valor_icms, f.aliq_pis) cofins_corr = calcular_pis_cofins_corretos(f.base_cofins, f.valor_icms, f.aliq_cofins) dados.append({ "Classificacao": f.classificacao, "Nome": f.nome, "UC": f.uc, "Competencia": f.referencia, "Valor Total": f.valor_total, "Alíquota PIS": f.aliq_pis, "Alíquota ICMS": f.aliq_icms, "Alíquota COFINS": f.aliq_cofins, "Valor PIS": f.valor_pis, "Valor ICMS": f.valor_icms, "Valor COFINS": f.valor_cofins, "Base PIS": f.base_pis, "Base ICMS": f.base_icms, "PIS Corrigido": pis_corr, "COFINS Corrigido": cofins_corr, "Arquivo": f.arquivo }) df = pd.DataFrame(dados) excel_file = BytesIO() df.to_excel(excel_file, index=False) excel_file.seek(0) return StreamingResponse(excel_file, media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", headers={"Content-Disposition": "attachment; filename=relatorio_exclusao_icms.xlsx"}) @router.get("/relatorio-aliquota-incorreta") async def relatorio_icms_errado(cliente: str = Query(None), db: AsyncSession = Depends(get_session)): result = await db.execute(select(Fatura)) faturas = result.scalars().all() dados = [] for f in faturas: aliq_registrada = db.query(AliquotaUF).filter_by(uf=f.estado, exercicio=f.referencia[-4:]).first() if aliq_registrada and abs(f.aliq_icms - aliq_registrada.aliquota) > 0.001: icms_corr = round((f.base_icms * aliq_registrada.aliquota), 5) dados.append({ "Classificacao": f.classificacao, "Nome": f.nome, "UC": f.uc, "Competencia": f.referencia, "Valor Total": f.valor_total, "Alíquota ICMS (Fatura)": f.aliq_icms, "Alíquota ICMS (Correta)": aliq_registrada.aliquota, "Base ICMS": f.base_icms, "Valor ICMS": f.valor_icms, "ICMS Corrigido": icms_corr, "Arquivo": f.arquivo }) df = pd.DataFrame(dados) excel_file = BytesIO() df.to_excel(excel_file, index=False) excel_file.seek(0) return StreamingResponse(excel_file, media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", headers={"Content-Disposition": "attachment; filename=relatorio_icms_errado.xlsx"})