Regras de negócio centrais¶
Esta página é o mapa das regras do produto, bloco a bloco, com a spec de origem de cada uma — "spec 0057, RN7" quer dizer a regra RN7 da seção 9 de ../specifications/0057-taxa-da-mensalidade/. O detalhe (códigos de erro, ordem das recusas, casos de borda) fica na spec. Para os termos, ver o glossário.
Quando a spec e o código divergem, vale o código, e a seção Registro de cada spec diz o que mudou na implementação. Tudo aqui foi conferido contra apps/api/app/ em 2026-10-15; o que não pôde ser confirmado está marcado a confirmar.
Base de cálculo — Pacote Locatício¶
Tudo incide sobre o Pacote Locatício = aluguel + condomínio + IPTU, com condomínio e IPTU contando zero quando ausentes (spec 0006; services/pricing.py). Sobre ele:
- mensalidade = Pacote × taxa da garantia ÷ 100;
- LMI = Pacote ×
lmi_months_multiplier(0= ilimitado); - custos de saída = Pacote ×
exit_costs_multiplier, sub-limite próprio e menor (0= sem cobertura); - taxa de adesão percentual = percentual sobre o Pacote, o Pacote × meses da vigência ou o LMI, conforme a base escolhida.
Arredondamento a centavo, meio para cima, em toda conta de dinheiro.
Parâmetros da garantidora (TenantSettings)¶
Editados em PATCH /api/v1/settings, só pelo ADMIN_TENANT (tela Parâmetros). Os principais:
| Grupo | Campos | Regra | Origem |
|---|---|---|---|
| Mensalidade | sugerida, mínima e máxima para PF e para PJ (seis campos) | mínima ≤ sugerida ≤ máxima em cada tipo, validada sobre o estado resultante; nenhum pode ficar vazio. Partida: PF 8–11%, PJ 15–18%, sugerida no mínimo | spec 0057, RN1–RN4 |
| Taxa de adesão (regra padrão) | tipo (NONE/FIXED/PERCENTAGE), valor, base (RENT/TOTAL_GUARANTEE/LMI), permitir editar na análise, cobrar o 1º mês à vista, parcelamento | — | spec 0056, RN1 |
| Comissão | commission_percent (padrão 100%) e commission_tax_percent (impostos, padrão 0%, nunca vazio) | faixa 0–100 | spec 0056, RN1 |
| Encargo | multa (%), juros ao mês (%) e carência (dias) | juros e carência podem ficar vazios — vazio zera aquela parcela do encargo | spec 0054, RN10 e RN12 |
| Cobrança | collection_method (BOLETO ou PIX) e allowed_due_days | o meio de cobrança nunca é vazio | spec 0054, RN8; spec 0048, RN1 |
| Cobertura | múltiplo do LMI, múltiplo dos custos de saída | 0 tem sentidos opostos nos dois (ilimitado × sem cobertura) | spec 0006; spec 0039, RN11 |
| Sinistro | claim_grace_period_days, claim_trigger_days | só parâmetro, congelado na garantia — não há processo que os use (ver Sinistro) | — |
| Consultas de crédito | perfil, token da API Full, nível de preço, reaproveitamento e janela | ver Consultas de crédito | spec 0052, RN4–RN6 |
A taxa padrão única e a faixa única de mensalidade (guarantee_rate_percent, min_/max_guarantee_rate_percent) deixaram de existir com a spec 0057. A imobiliária lê os parâmetros (para saber cobrar o inquilino), mas recebe commission_percent nulo — o padrão das outras parceiras é informação de negociação (spec 0056, RN1).
Análise de crédito e estados¶
- Os estados e as transições estão no glossário e em
ALLOWED_TRANSITIONS(services/credit_analysis_service.py).APPROVED,REJECTEDeCANCELLEDsão terminais. - Quem cadastra:
OPERATOR,AGENCY_USER/AGENCY_MANAGEReADMIN_TENANT. A imobiliária da análise vem do imóvel e não muda depois de criada (spec 0056, RN5). - Devolver em pendência exige um tipo de pendência, vocabulário que o
ADMIN_TENANTmantém (spec 0037). Quem cadastrou corrige e retoma (PENDING → IN_ANALYSIS); o analista pode corrigir erro evidente sem devolver (spec 0036, RN13). - Desistir é da imobiliária, com motivo, e só em
DRAFT,SUBMITTEDouPENDING; cancelar é da garantidora — são permissões distintas (spec 0037). - Recomendação automática pela razão renda declarada ÷ Pacote: aprovar a partir de 3×, análise manual entre 2× e 3×, reprovar abaixo de 2× (
services/credit.py). É sugestão; quem decide é o analista. - Taxa de adesão informada na análise: quando a regra em vigor permite editar, quem preenche a análise pode informar outro valor de adesão; quem informou fica gravado, e o valor sobrevive a mudança posterior da regra (spec 0056, RN4–RN6).
Consultas de crédito¶
Specs 0050 (a primeira, Boa Vista) e 0052 (o catálogo, que a substituiu):
- Catálogo da plataforma, mantido pelo
ADMIN_GLOBAL, com itens de um provedor só, a API Full: Boa Vista Essencial, QUOD PF, Dados Financeiros, CADIN, Protesto Nacional e SCR Premium. QUOD e Boa Vista são mutuamente exclusivos numa composição (spec 0052, RN1–RN2). - Cada garantidora escolhe a composição —
NONE,ECONOMICO,COMPLETOouPERSONALIZADO— e tem preço por item com vigência; preço novo é linha nova, nunca sobrescrita (spec 0052, RN3–RN5). - Disparo na submissão da análise (
DRAFT → SUBMITTED), em background no worker; a falha da consulta nunca desfaz a transição. Só para locatário principal pessoa física com CPF (spec 0050, RN5 e RN7; spec 0052, RN8a). - Reexecutar ou acrescentar consulta tem custo confirmado antes. Uma consulta recente do mesmo locatário dentro da janela (padrão 30 dias, desligável) é reaproveitada em vez de paga de novo (spec 0052, RN9–RN10).
- Imutável depois de concluída; o retorno bruto do provedor é purgado após 12 meses pelo job diário das 6h (spec 0052, RN12–RN13).
- O resultado é só informativo — não entra na recomendação nem em cálculo nenhum (spec 0050, RN8; spec 0052, RN14).
- Quem vê: o resultado, quem tem
credit_checks:read—ADMIN_TENANT,ANALYST,OPERATOR,VIEWER; o retorno bruto, sóADMIN_TENANTeANALYST. Nem a imobiliária nem oADMIN_GLOBALveem consulta de cliente (spec 0052, RN22–RN24). - Visão financeira: o extrato do provedor é sincronizado e conciliado com as consultas, com relatório de divergências e proposta de ajuste de preço — nunca automática (spec 0052, RN15–RN18).
Parecer — a mensalidade e a taxa de adesão¶
A mensalidade (spec 0057):
- O tipo do tomador decide a faixa: o tipo atual do locatário principal, lido no momento do uso; sem principal, o primeiro locatário; sem locatário, PF (RN6).
- Toda aprovação grava uma taxa: informada, precisa estar na faixa do tipo (senão 422
RATE_OUT_OF_RANGE); omitida, grava-se a sugerida. Garantidora sem parâmetros não aprova (422SETTINGS_NOT_FOUND). Fica gravado quem fixou a taxa e quando (RN7–RN8). - Alterar entre aprovar e emitir tem endpoint próprio (
PATCH /credit-analyses/{id}/decision/guarantee-rate), com as mesmas permissões de aprovar (ADMIN_TENANT,ANALYST), auditado. Emitida a garantia, 409; oADMIN_GLOBALnunca altera (403). Alteração e emissão não se atravessam — as duas travam o parecer (RN9–RN10). - A emissão usa a taxa em vigor e não a revalida: mudar a faixa depois não invalida o que foi decidido. Garantia emitida não muda de taxa — mudar o preço é encerrar e emitir outra (RN11, RN12, RN14).
A taxa de adesão (spec 0056):
- Regra em vigor: a própria da imobiliária, quando ela tem; senão a padrão da garantidora (inclusive na carteira própria). A comissão segue à parte: o percentual da imobiliária, ou o padrão (RN3).
- Precedência do valor na emissão: o valor que o analista tocou no parecer (
approved_initial_fee_value); senão o informado na análise; senão o da regra em vigor na emissão (RN7).
Emissão e assinatura da garantia¶
- Só análise
APPROVEDemite, e só uma garantia por análise. EmitemADMIN_TENANT,ANALYSTeOPERATOR; oADMIN_GLOBALe a imobiliária, não (spec 0039, RN12–RN13; spec 0038). - O valor garantido é o Pacote da análise, e a vigência não passa do prazo aprovado, contada em meses de calendário (mês parcial arredonda para cima); mínimo de um mês; início livre, passado ou futuro (spec 0039, RN1–RN8).
- O dia de vencimento é escolhido na emissão entre os
allowed_due_daysda garantidora (omitido, o primeiro da lista) (spec 0048, RN1). - Toda garantia nasce Aguardando assinatura. Só o registro do contrato assinado — documento desta garantia mais a data, não futura — a leva a Vigente; garantia cuja vigência já acabou não se ativa, encerra-se. Registram
ADMIN_TENANTeOPERATOR(spec 0038, RN2, RN6–RN8a). A assinatura em si é fora do sistema: não há integração de assinatura eletrônica. - Vencida é derivada: vigente com
end_datepassada, no fuso de São Paulo (spec 0038, RN4–RN4d). - Encerrar exige motivo, é só do
ADMIN_TENANTe é irreversível. Cancela as cobranças do calendário ainda pendentes com vencimento futuro; as avulsas e as já vencidas ficam (spec 0038, RN14–RN15; spec 0048, RN4).
Cobrança¶
O calendário (spec 0048, RN2; spec 0054, RN6): ao registrar a assinatura, nasce na mesma transação o plano inteiro — a entrada (adesão, mais a 1ª mensalidade se a garantidora cobra o primeiro mês à vista) e as mensalidades do prazo. Cobrança nova só se cria em garantia vigente; dar baixa em cobrança já emitida vale em qualquer estado da garantia (spec 0038, RN12–RN13). A avulsa é lançada à mão, sempre no canal da garantidora (spec 0054, RN7).
Tipo e canal (spec 0054):
- Toda cobrança tem tipo (
SETUP,GUARANTEE,SETUP_AND_GUARANTEE,MISC), e a entrada guarda adesão e fiança discriminadas — a soma das duas é sempre o valor (RN1–RN2). - Toda cobrança tem canal, gravado quando nasce e nunca recalculado: a mensalidade é
AGENCY_PIXse a parceira recolhe (collects_monthly), senão o meio da garantidora; a entrada e a avulsa são sempre da garantidora (RN3, RN9). Só a garantidora decide se a parceira recolhe — oADMIN_GLOBALnão (RN11a). - Toda cobrança tem competência obrigatória (RN5).
Encargo (spec 0054, RN12–RN14): multa e juros são calculados pela API, sobre o principal: multa percentual fixa; juros ao mês pro rata dia sobre 30 dias; nada dentro da carência; passada a carência, os juros correm desde o vencimento. Cobrança paga ou cancelada não acumula encargo. Isto revoga a multa sugerida e editável calculada na tela (spec 0048, RN5).
Baixa (spec 0054, RN15–RN22): informa a data em que o dinheiro entrou (não futura), o canal do pagamento e a distribuição entre adesão, fiança, avulsa e multa e juros. A distribuição fecha com o valor recebido, nenhum balde é negativo nem passa do devido naquele item, e o total não passa de principal + encargo da data — não há crédito a favor do inquilino. Principal recebido a menos fica como abatido. Abonar o encargo exige motivo. O comprovante é um documento da cobrança. Só o ADMIN_TENANT dá baixa, e mensalidade de canal da imobiliária não tem baixa avulsa — ela se baixa no acerto (spec 0055, RN15).
Atraso e situação (spec 0054, RN23–RN25; spec 0055, RN16): o job diário das 7h marca em atraso a cobrança pendente vencida de canal da garantidora; a de canal da imobiliária fica Aguardando a imobiliária — não é inadimplência — até o fechamento do acerto dizer se o inquilino pagou. A fila de atrasados recorta pelo fato (venceu e não foi paga), não pelo status.
Agregados do mês (spec 0054, RN26–RN29): o resumo por tipo × canal e os indicadores fecham uma identidade — previsto = recebido + abatido + a receber da garantidora + a repassar pela imobiliária —, com encargo por fora. Resumo e exportação exigem tenant: o ADMIN_GLOBAL lê a lista de cobranças, mas não agrega nem exporta a carteira de um cliente.
Remoção lógica (spec 0049): imobiliária, inquilino, imóvel, análise, garantia e cobrança se removem sem apagar e se restauram em até 60 dias. Remover é de baixo para cima — a garantia com cobrança não removida não sai, e assim por diante (RN6); restaurar não depende do pai. Nada disso mexe no status de negócio. Remover e restaurar análise, garantia e cobrança é só do ADMIN_TENANT. Cobrança que um acerto fechado gravou não se altera, remove nem restaura (spec 0055, RN14; spec 0056, RN10).
Acerto com a imobiliária e comissão¶
O acerto (spec 0055) é o par (imobiliária, competência), e seus membros são as mensalidades AGENCY_PIX daquele mês de garantias daquela imobiliária, não removidas nem canceladas (RN1). Não é criado por agendamento: existe quando há membro ou comissão, e o registro nasce na primeira escrita (RN2–RN3).
- Declaração por membro: pagou (data não futura, multa cobrada até o teto do encargo daquela data; o valor é sempre o da mensalidade) ou não pagou (só o que já venceu). Uma declaração substitui a anterior; há declaração em lote para "todos pagaram no vencimento" (RN5–RN8a). Declaram o
AGENCY_MANAGER(do lado da imobiliária) e oADMIN_TENANT. - Transferências do repasse registradas pela garantidora, até o que a imobiliária deve (RN10; spec 0056, RN13).
- Fechar exige todo membro declarado e a conta zerada; numa transação, dá baixa nos declarados pagos pelo mesmo caminho da baixa avulsa e marca em atraso os declarados não pagos, revalidando cada declaração no momento. Reabrir exige motivo e desfaz as baixas, mantendo declarações, transferências e nota (RN11–RN13). O acerto fechado é imutável; cobrança que entra nele depois (emissão retroativa, restauração) é membro tardio e pede reabertura (RN14–RN14a).
- Nota fiscal do acerto fechado: número e arquivo, como documento do acerto (RN17).
A comissão (spec 0056):
- Na baixa da adesão de garantia com imobiliária, congela-se a comissão: impostos = adesão paga ×
commission_tax_percent; comissão = (adesão paga − impostos) × percentual de comissão em vigor. Depois de gravada não muda mais (RN8). - Entra no acerto da primeira competência ainda não fechada a partir do mês do pagamento (RN9).
- As contas do acerto: mensalidades e multas − comissão = saldo; falta = saldo − recebido + pago à imobiliária. Positiva, a imobiliária deve; negativa, a garantidora deve, e paga registrando uma transferência no sentido inverso (
TO_AGENCY). Recebido acima das mensalidades e multas, ou pago à imobiliária acima da comissão, impede o fechamento (RN11–RN13).
Quem faz o quê: ler, todos os papéis do tenant e a imobiliária (só a própria); declarar, ADMIN_TENANT e AGENCY_MANAGER; transferir, fechar, reabrir e anexar nota, só o ADMIN_TENANT; o ADMIN_GLOBAL não lê nem escreve acerto (spec 0055, 10.1–10.2 e RN23).
Papéis e escopo¶
Sete papéis de sistema (db/rbac_seed.py) — a tabela com o resumo de cada um está no glossário. Três regras atravessam todos:
- Isolamento por garantidora. Toda entidade de negócio carrega
tenant_id, filtrado automaticamente peloBaseRepository— nunca contornado, sempre passado pela camada de serviço. Recurso de outro tenant responde 404, indistinguível de inexistente (spec 0034). - O segundo eixo: a imobiliária.
AGENCY_USEReAGENCY_MANAGERsó alcançam o que é da própria imobiliária — inquilinos, imóveis, análises, garantias, cobranças e acertos com opartner_agency_iddela (services/scoping.py). O vínculo vem do perfil de quem grava, nunca do corpo da requisição. Usuário de parceiro sem imobiliária não alcança nada (spec 0051, RN8a); remover a imobiliária suspende os usuários dela, e restaurá-la os devolve (spec 0051, RN9). A imobiliária não vê a tela agregada de Cobranças, as consultas de crédito nem o parecer. - Plataforma × cliente. O
ADMIN_GLOBALnão tem filtro de tenant, mas administra a plataforma — garantidoras, convites, catálogo de consultas —, não o negócio dos clientes. Guardas de código o recusam em: emitir garantia, alterar a mensalidade, dar baixa, remover análise, garantia ou cobrança, agregar ou exportar cobranças, ler ou escrever acerto, ver consultas de crédito, e definir se a parceira recolhe (specs 0039, 0048, 0049, 0052, 0054, 0055, 0057).
Quem administra os usuários da imobiliária: o AGENCY_MANAGER (convidar, reenviar, cancelar convite, remover acesso, tornar responsável), e o ADMIN_TENANT. A imobiliária não fica sem responsável enquanto tiver outro usuário ativo, e ninguém tira o próprio acesso (spec 0051, RN6–RN7b).
Além dos papéis de sistema, a garantidora pode criar perfis personalizados. O detalhe de quem pode cada endpoint está na seção 10 (Autorização e isolamento) de cada spec, e o mecanismo técnico em ../architecture/data-model.md.
Sinistro — o que existe e o que não existe¶
Não existe processo de sinistro no produto. Não há entidade, tela nem endpoint para comunicar inadimplência, validar, pagar a imobiliária ou registrar regresso.
O que existe:
- os parâmetros
claim_grace_period_dayseclaim_trigger_daysemTenantSettings, congelados em cada garantia na emissão — nada os consome; - o LMI e os custos de saída, calculados e congelados na garantia;
- a inadimplência registrada na cobrança (status Em atraso, pelo job das 7h ou pelo fechamento do acerto) — é o dado de que um processo de sinistro partiria;
- o item Sinistros no menu, sem rota.
A regra que o contrato define (comunicado da imobiliária em até 60 dias do 1º vencimento, validação, pagamento à imobiliária, sub-rogação e regresso) e o plano para construí-la estão no roadmap. Uma consequência em aberto já registrada: o resumo do mês continua contando como "a repassar" a mensalidade que o acerto declarou não paga, porque classifica pelo canal — tratá-la como inadimplência em toda leitura é decisão que fica para quando o sinistro existir (spec 0055, Registro) — a confirmar.
Paginação — sempre com ORDER BY¶
Toda lista paginada ordena por created_at desc, id desc como desempate, salvo quando a spec da tela define outra ordem (a fila de atrasados, por vencimento; o acerto, por inquilino). Sem desempate, o PostgreSQL não garante ordem entre páginas — um registro editado pode aparecer duas vezes ou nunca. Regra de implementação, mas afeta o negócio: listas de centenas de análises e cobranças precisam ser confiáveis para quem trabalha nelas.