diff --git a/app/routers/contatos.py b/app/routers/contatos.py new file mode 100644 index 0000000..008d4e2 --- /dev/null +++ b/app/routers/contatos.py @@ -0,0 +1,69 @@ +""" +Rotas de gestão de CLIENTE_CONTATO — sempre no contexto de um cliente +(cliente_id na URL). Redireciona de volta para /clientes/{cliente_id} +(a tela de detalhe do cliente, montada na Task 8). +""" +from urllib.parse import urlencode + +from fastapi import APIRouter, Depends, Form +from fastapi.responses import RedirectResponse + +from ..auth import exigir_login +from ..db import clientes as db_clientes +from ..db import contatos as db_contatos +from ..normalize import normalizar_telefone + +router = APIRouter(prefix="/clientes") + + +def _redirect_com_mensagem(cliente_id: int, mensagem: str, tipo: str = "success") -> RedirectResponse: + query = urlencode({"mensagem": mensagem, "mensagem_tipo": tipo}) + return RedirectResponse(f"/clientes/{cliente_id}?{query}", status_code=303) + + +@router.post("/{cliente_id}/contatos") +def adicionar( + cliente_id: int, + nome: str = Form(""), + telefone: str = Form(...), + email: str = Form(""), + usuario: str = Depends(exigir_login), +): + if db_clientes.obter_cliente(cliente_id) is None: + return _redirect_com_mensagem(cliente_id, "Cliente não encontrado.", "danger") + + telefone_normalizado = normalizar_telefone(telefone) + if not telefone_normalizado: + return _redirect_com_mensagem(cliente_id, "Telefone obrigatório.", "danger") + + if db_contatos.contato_duplicado(cliente_id, telefone_normalizado): + return _redirect_com_mensagem(cliente_id, f"O telefone {telefone_normalizado} já está cadastrado para este cliente.", "warning") + + db_contatos.inserir_contato(cliente_id, nome.strip() or None, telefone_normalizado, email.strip() or None) + return _redirect_com_mensagem(cliente_id, "Contato adicionado.") + + +@router.post("/{cliente_id}/contatos/{contato_id}/editar") +def editar( + cliente_id: int, + contato_id: int, + nome: str = Form(""), + telefone: str = Form(...), + email: str = Form(""), + usuario: str = Depends(exigir_login), +): + telefone_normalizado = normalizar_telefone(telefone) + if not telefone_normalizado: + return _redirect_com_mensagem(cliente_id, "Telefone obrigatório.", "danger") + + if db_contatos.contato_duplicado(cliente_id, telefone_normalizado, ignorar_id=contato_id): + return _redirect_com_mensagem(cliente_id, f"O telefone {telefone_normalizado} já está cadastrado para este cliente.", "warning") + + db_contatos.atualizar_contato(contato_id, cliente_id, nome.strip() or None, telefone_normalizado, email.strip() or None) + return _redirect_com_mensagem(cliente_id, "Contato atualizado.") + + +@router.post("/{cliente_id}/contatos/{contato_id}/excluir") +def excluir(cliente_id: int, contato_id: int, usuario: str = Depends(exigir_login)): + db_contatos.excluir_contato(contato_id, cliente_id) + return _redirect_com_mensagem(cliente_id, "Contato excluído.") diff --git a/app/templates/cliente_detalhe.html b/app/templates/cliente_detalhe.html index 6aae177..057bbfb 100644 --- a/app/templates/cliente_detalhe.html +++ b/app/templates/cliente_detalhe.html @@ -13,11 +13,27 @@
| Nome | Telefone | ||
|---|---|---|---|
| Nome | Telefone | ||
| {{ ct.NOME }} | {{ ct.TELEFONE }} | {{ ct.EMAIL or "" }} | |
| {{ ct.NOME }} | {{ ct.TELEFONE }} | {{ ct.EMAIL or "" }} | ++ + | +