73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
|
|
# app/routes/clientes.py
|
||
|
|
from fastapi import APIRouter, Request, Depends, HTTPException, Query
|
||
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
|
from sqlalchemy import select, or_
|
||
|
|
from app.database import get_session
|
||
|
|
from app.models import Cliente
|
||
|
|
from pydantic import BaseModel
|
||
|
|
from uuid import UUID
|
||
|
|
import uuid
|
||
|
|
from fastapi.responses import HTMLResponse
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
@router.get("/clientes")
|
||
|
|
async def clientes_page(request: Request):
|
||
|
|
return request.app.state.templates.TemplateResponse("clientes.html", {"request": request})
|
||
|
|
|
||
|
|
class ClienteIn(BaseModel):
|
||
|
|
nome_fantasia: str
|
||
|
|
cnpj: str | None = None
|
||
|
|
ativo: bool = True
|
||
|
|
|
||
|
|
@router.get("/api/clientes")
|
||
|
|
async def listar(
|
||
|
|
busca: str = Query(default="", description="Filtro por nome ou CNPJ"),
|
||
|
|
session: AsyncSession = Depends(get_session),
|
||
|
|
):
|
||
|
|
stmt = select(Cliente).order_by(Cliente.nome_fantasia)
|
||
|
|
if busca:
|
||
|
|
pattern = f"%{busca}%"
|
||
|
|
stmt = select(Cliente).where(
|
||
|
|
or_(
|
||
|
|
Cliente.nome_fantasia.ilike(pattern),
|
||
|
|
Cliente.cnpj.ilike(pattern),
|
||
|
|
)
|
||
|
|
).order_by(Cliente.nome_fantasia)
|
||
|
|
|
||
|
|
res = await session.execute(stmt)
|
||
|
|
clientes = res.scalars().all()
|
||
|
|
return [
|
||
|
|
{
|
||
|
|
"id": str(c.id),
|
||
|
|
"nome_fantasia": c.nome_fantasia,
|
||
|
|
"cnpj": c.cnpj,
|
||
|
|
"ativo": c.ativo,
|
||
|
|
}
|
||
|
|
for c in clientes
|
||
|
|
]
|
||
|
|
|
||
|
|
@router.post("/api/clientes")
|
||
|
|
async def criar_cliente(body: ClienteIn, session: AsyncSession = Depends(get_session)):
|
||
|
|
cliente = Cliente(**body.dict())
|
||
|
|
session.add(cliente)
|
||
|
|
await session.commit()
|
||
|
|
return {"id": str(cliente.id)}
|
||
|
|
|
||
|
|
@router.put("/api/clientes/{id}")
|
||
|
|
async def editar_cliente(id: UUID, body: ClienteIn, session: AsyncSession = Depends(get_session)):
|
||
|
|
await session.execute(
|
||
|
|
Cliente.__table__.update().where(Cliente.id == id).values(**body.dict())
|
||
|
|
)
|
||
|
|
await session.commit()
|
||
|
|
return {"ok": True}
|
||
|
|
|
||
|
|
@router.delete("/api/clientes/{id}")
|
||
|
|
async def excluir(id: uuid.UUID, session: AsyncSession = Depends(get_session)):
|
||
|
|
obj = await session.get(Cliente, id)
|
||
|
|
if not obj:
|
||
|
|
raise HTTPException(404, "Cliente não encontrado")
|
||
|
|
await session.delete(obj)
|
||
|
|
await session.commit()
|
||
|
|
return {"ok": True}
|