Commit Inicial

This commit is contained in:
Ricardo 2026-08-06 10:30:13 -03:00
commit 0f47953453
24 changed files with 1366 additions and 0 deletions

View file

View file

@ -0,0 +1,10 @@
from fastapi import APIRouter
from .schemas import DadosCompras
from .service import processar_compras
router = APIRouter(prefix="/compras", tags=["compras"])
@router.post("/dados")
async def dados_compras(dados: DadosCompras):
return await processar_compras(dados)

View file

@ -0,0 +1,77 @@
from datetime import datetime
from pydantic import BaseModel, Field
class Parcela(BaseModel):
valor: float
vencimento: datetime | None = None
class ComprasProperties(BaseModel):
protocolo: str
pedido_linx: str = Field(alias="PEDIDO_LINX")
fornecedor: str = Field(alias="Fornecedores")
tipo_compra: str = Field(alias="Tipo de Compra")
cnpj: str = Field(alias="CNPJ")
nf_entrada: str = Field(alias="NUMERO NF ENTRADA")
num_parcelas: int | None = Field(default=None, alias="num. parcelas")
parcela1: float | None = Field(default=None, alias="parcela1")
parcela2: float | None = Field(default=None, alias="parcela2")
parcela3: float | None = Field(default=None, alias="parcela3")
parcela4: float | None = Field(default=None, alias="parcela4")
parcela5: float | None = Field(default=None, alias="parcela5")
parcela6: float | None = Field(default=None, alias="parcela6")
parcela7: float | None = Field(default=None, alias="parcela7")
parcela8: float | None = Field(default=None, alias="parcela8")
parcela9: float | None = Field(default=None, alias="parcela9")
parcela10: float | None = Field(default=None, alias="parcela10")
parcela11: float | None = Field(default=None, alias="parcela11")
parcela12: float | None = Field(default=None, alias="parcela12")
vencimento1: datetime | None = Field(default=None, alias="vencimento parcela1")
vencimento2: datetime | None = Field(default=None, alias="vencimento parcela2")
vencimento3: datetime | None = Field(default=None, alias="vencimento parcela3")
vencimento4: datetime | None = Field(default=None, alias="vencimento parcela4")
vencimento5: datetime | None = Field(default=None, alias="vencimento parcela5")
vencimento6: datetime | None = Field(default=None, alias="vencimento parcela6")
vencimento7: datetime | None = Field(default=None, alias="vencimento parcela7")
vencimento8: datetime | None = Field(default=None, alias="vencimento parcela8")
vencimento9: datetime | None = Field(default=None, alias="vencimento parcela9")
vencimento10: datetime | None = Field(default=None, alias="vencimento parcela10")
vencimento11: datetime | None = Field(default=None, alias="vencimento parcela11")
vencimento12: datetime | None = Field(default=None, alias="vencimento parcela12")
@property
def parcelas(self) -> dict[int, Parcela]:
"""Junta parcelaN + vencimento parcelaN, ignorando os slots vazios."""
parcelas = {}
for n in range(1, 13):
valor = getattr(self, f"parcela{n}")
if valor is None:
continue
parcelas[n] = Parcela(
valor=valor,
vencimento=getattr(self, f"vencimento{n}"),
)
return parcelas
@property
def total_parcelas(self) -> float:
return round(sum(p.valor for p in self.parcelas.values()), 2)
class DadosCompras(BaseModel):
id: str
properties: ComprasProperties
class PayloadCompras(BaseModel):
cnpj: str
pedido_linx: str
fornecedor: str
tipo: str
nf_entrada: str
aprovador: str
valor_total: float
parcelas: dict[int, Parcela]

View file

@ -0,0 +1,26 @@
from .schemas import DadosCompras, PayloadCompras
from .service import processar_compras
from app.services.api_cliente import
from app.services.holmes import
async def processar_compras(
dados: DadosCompras
) -> dict:
payload = montar_payload(dados)
ok, retorno = await apollo.enviar_compra(payload.model_dump(mode="json"), conn)
if not ok:
raise HTTPException(502, f"Falha ao enviar para a API externa: {retorno}")
return {"status": "enviado", "id_processo": dados.id, "retorno": retorno}
def montar_payload(dados: DadosCompras) -> PayloadCompras:
p = dados.properties
return PayloadCompras(
cnpj=p.cnpj,
pedido_linx=p.pedido_linx,
fornecedor=p.fornecedor,
tipo=p.tipo_compra,
valor_total=p.total_parcelas,
parcelas=p.parcelas,
)