""" 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). TELEFONE é gravado sempre com o DDI 55 embutido (normalizar_telefone_com_ddi, mesma normalização usada em CLIENTE.TELEFONE/CELULAR — ver app/normalize.py) porque é esse valor que o workflow de envio automático de chave por WhatsApp lê direto de CLIENTE_CONTATO.TELEFONE, sem nenhuma normalização própria (node "10 - Validar Telefones" do workflow n8n só faz `String(telefone)`, sem adicionar DDI). Um contato cadastrado aqui sem o 55 embutido nunca recebe a chave automaticamente — silencioso, sem erro visível no painel. """ from urllib.parse import urlencode from fastapi import APIRouter, Depends, Form from fastapi.responses import RedirectResponse from ..auth import exigir_login from ..csrf import exigir_csrf from ..db import clientes as db_clientes from ..db import contatos as db_contatos from ..db import log as db_log from ..normalize import normalizar_telefone_com_ddi 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", dependencies=[Depends(exigir_csrf)]) 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_com_ddi(telefone) if not telefone_normalizado: return _redirect_com_mensagem(cliente_id, "Telefone obrigatório.", "danger") if db_contatos.contato_duplicado(cliente_id, telefone_normalizado): db_log.registrar(usuario, "adicionar", "contato", str(cliente_id), False, "telefone duplicado") 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) db_log.registrar(usuario, "adicionar", "contato", str(cliente_id), True) return _redirect_com_mensagem(cliente_id, "Contato adicionado.") @router.post("/{cliente_id}/contatos/{contato_id}/editar", dependencies=[Depends(exigir_csrf)]) 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_com_ddi(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): db_log.registrar(usuario, "editar", "contato", str(contato_id), False, "telefone duplicado") return _redirect_com_mensagem(cliente_id, f"O telefone {telefone_normalizado} já está cadastrado para este cliente.", "warning") atualizado = db_contatos.atualizar_contato( contato_id, cliente_id, nome.strip() or None, telefone_normalizado, email.strip() or None ) if not atualizado: # ID de contato que não existe (ou pertence a outro cliente — a # query já é escopada por CLIENTE_ID) — sem essa checagem o log # registrava "sucesso" mesmo sem nenhuma linha alterada. db_log.registrar(usuario, "editar", "contato", str(contato_id), False, "contato não encontrado") return _redirect_com_mensagem(cliente_id, "Contato não encontrado.", "danger") db_log.registrar(usuario, "editar", "contato", str(contato_id), True) return _redirect_com_mensagem(cliente_id, "Contato atualizado.") @router.post("/{cliente_id}/contatos/{contato_id}/excluir", dependencies=[Depends(exigir_csrf)]) def excluir(cliente_id: int, contato_id: int, usuario: str = Depends(exigir_login)): excluido = db_contatos.excluir_contato(contato_id, cliente_id) if not excluido: db_log.registrar(usuario, "excluir", "contato", str(contato_id), False, "contato não encontrado") return _redirect_com_mensagem(cliente_id, "Contato não encontrado.", "danger") db_log.registrar(usuario, "excluir", "contato", str(contato_id), True) return _redirect_com_mensagem(cliente_id, "Contato excluído.")