Roadmap¶
Distância entre o negócio e o que está implementado.
Origem: anotações de negócio sobre o fluxo TXC Garantia (parceria com a imobiliária Solar), levantadas em 2026-07-24. É um retrato de um momento — ao mexer numa área, atualize a linha correspondente.
Revisto em 2026-09-27, conferido contra o código linha a linha; atualizado em 2026-10-01 com o fix 0021, que tirou da dívida técnica o seletor que só buscava. Este arquivo tinha ficado dois meses parado enquanto as specs 0005 a 0054 eram entregues, e descrevia o produto de julho: dava a cobrança recorrente como ausente (as specs 0048 e 0054 a entregaram), dizia que a taxa setup faltava (existe), que bureaus estavam fora de escopo (as specs 0050 e 0052 integraram dois), e listava como dívida técnica coisas já resolvidas — a produção no ar, o e2e destravado. Cada afirmação daqui em diante tem
arquivo:linhapara quem quiser abrir e conferir.
Modelo de domínio (alinhado em 2026-07-26, revisto na spec 0054)¶
Confirmado pelo contrato real da TXC Garantia (docs/contratos/: Termo de Condições Gerais + Quadro Resumo). Corrige leituras anteriores que tratavam o proprietário como parte — ou que faziam a garantidora pagá-lo direto:
- Garantidora contrata o SaaS; tem contrato de parceria com a Imobiliária. No negócio ela é a fiadora (fiança onerosa), não parte do contrato de locação.
- A Imobiliária (PARCEIRO) é o canal: fecha o aluguel e, quando a parceria prevê isso, cobra a garantia junto com o aluguel e repassa à garantidora (repasse mensal — só a Taxa TXC, nunca o aluguel).
- O contrato de garantia é do Inquilino (LOCATÁRIO) com a Garantidora, formalizado por assinatura digital (Autentique + biometria facial) + pagamento (Cl. 1ª).
- O Proprietário (LOCADOR) não tem relação com a garantidora: ela não o conhece nem o paga. No sinistro ela paga o PARCEIRO, que repassa ao LOCADOR (Cl. 3ª/15ª). Não existe "conta de repasse do proprietário" do lado da garantidora.
- Sinistro: inquilino não paga → imobiliária comunica (até 60 dias do 1º vencimento) → garantidora valida e paga a imobiliária → imobiliária repassa ao locador → garantidora sub-roga e regressa contra o inquilino/corresponsável.
Quem recolhe do 2º mês em diante é cláusula da parceria, não regra do domínio (spec 0054). O texto anterior dizia "do 2º mês em diante quem recolhe é a imobiliária", sem exceção — era descrição do piloto tratada como lei. O que decide são dois campos: PartnerAgency.collects_monthly (apps/api/app/models/partner_agency.py:48) e TenantSettings.collection_method (tenant_settings.py:74, BOLETO ou PIX). Juntos produzem o canal de cada parcela — GUARANTOR_BOLETO, GUARANTOR_PIX ou AGENCY_PIX (models/billing.py:115-117, derivados em domain/canal_de_cobranca.py:39-52). Consequência prática: "quanto entrou na minha conta" e "quanto está com a imobiliária para repassar" são perguntas diferentes.
Base de cálculo: tudo incide sobre o Pacote Locatício = aluguel + condomínio + IPTU + encargos. O limite (LMI) é um múltiplo do Pacote (ex.: 36×), com um sub-limite próprio e menor para Custos de Saída (reparos/multa, ex.: 5×).
Código e negócio falam a mesma língua desde a spec 0007. A entidade é CreditAnalysis (Análise de Crédito) e o parecer do analista dentro dela é Decision — o "rename pendente" que este arquivo anunciava foi feito. A entidade Contract também não existe mais: virou Guarantee (models/guarantee.py:77, spec 0027); ContractTemplate sobreviveu, mas é a minuta, não a garantia. Arquitetura de navegação-alvo em docs/navigation-brief.md.
Situação por processo¶
| Processo | Situação |
|---|---|
| 1 — Fechamento de parceria com imobiliária | ✅ Coberto |
| 2 — Fechamento de garantia | ⚠️ Coberto até a cobrança mensal e o acerto com a imobiliária (spec 0055); faltam boleto emitido e assinatura eletrônica |
| 3 — Sinistro | ❌ Não existe |
✅ Implementado¶
| Regra de negócio | Onde |
|---|---|
| Parceria com imobiliária | PartnerAgency (CNPJ, endereço, contato, status), papel AGENCY_USER escopado por partner_agency_id, tela agencies |
| Usuários da própria imobiliária | Spec 0051 — tela Minha Imobiliária (/imobiliaria), responsável convida e administra os usuários do canal |
| Proposta vira análise de crédito | CreditAnalysisService — SUBMITTED → IN_ANALYSIS |
| Aprovado segue, reprovado não | AnalysisService em services/decision_service.py:53; garantia só nasce de análise APPROVED |
| Taxa Setup arbitrada pelo analista | approved_initial_fee_value no AnalysisDecisionRequest (schemas/decision.py:74-79) — omitido, cai no padrão do tenant |
| Corresponsável (avalista) | ParticipantRole.CO_RESPONSIBLE (models/credit_analysis_participant.py:45-46), opcional, analisado junto |
| Garantia de 12 meses | min_guarantee_months default 12 (configurável 12–60), start_date / end_date |
| Taxa Setup + primeira parcela | services/pricing.py — initial_fee (fixa ou % sobre aluguel/contrato total), first_month_upfront, total_upfront, com snapshot na Guarantee |
| Parcelas como % do aluguel | monthly_value = rent_value × guarantee_rate_percent / 100 |
| Calendário de cobrança do prazo inteiro | _gerar_calendario_de_cobranca (services/guarantee_service.py:707, laço em :775-793) — a receita recorrente do 2º mês em diante existe |
| Cobrança com tipo, canal e competência | Specs 0048 e 0054 — fee_type (SETUP / GUARANTEE / SETUP_AND_GUARANTEE / MISC), channel, reference_month, installment_number/total (models/billing.py), com resumo do mês por tipo × canal (billing_service.py:475) |
| Acerto com a imobiliária | Spec 0055 — AgencySettlement por parceira e competência, declaração por mensalidade (Billing.agency_outcome), transferências, fechar/reabrir e nota fiscal como registro (services/agency_settlement_service.py); abas Repasses em Cobranças e em Minha Imobiliária |
| Consulta a bureau de crédito | Specs 0050 e 0052 — CreditCheck, catálogo de itens por provedor e cliente HTTP real da API Full / SCPC Boa Vista (services/credit_check_provider/api_full_client.py:50), executado no worker arq |
| Registro de assinatura da garantia | GuaranteeStatus.PENDING_SIGNATURE + register_signature (services/guarantee_service.py:816) — registro manual, sem integração |
| Prazos de sinistro (só o parâmetro) | claim_grace_period_days / claim_trigger_days em TenantSettings, com snapshot na Guarantee |
| Armazenar contrato assinado | Document polimórfico (binário no banco) |
A precificação e a cobrança são as áreas mais maduras: a primeira cobre taxa fixa ou percentual, base aluguel ou contrato total, parcelamento e antecipação do primeiro mês; a segunda sabe de que é feita cada parcela e por onde ela entra.
⚠️ Parcial¶
Bureau de crédito — integrado, mas não alimenta a recomendação¶
A decisão de 2026-07-26 dizia que os bureaus ficavam fora do escopo. Ela foi revertida: as specs 0050 e 0052 construíram a consulta de verdade — catálogo por provedor, seleção por garantidora, execução assíncrona no worker e tela própria (Consultas de Crédito).
O que ainda é parcial: a regra 3× aluguel sobre renda declarada segue sendo a única fonte da recomendação (services/credit.py:95-148 — APPROVE ≥3×, MANUAL_ANALYSIS 2–3×, REJECT <2×). O resultado do bureau fica disponível ao analista, mas não entra no cálculo. As duas coisas coexistem sem se falarem.
Registro de e-mail de cobrança¶
email_service envia código de verificação e convite de usuário. ChannelIntegration (EMAIL / WHATSAPP) existe como configuração, sem nada que dispare ou registre comunicação de cobrança.
Cláusula Obrigatória — implementada e depois revogada¶
A spec 0003 a implementou como checkpoint de validade (RN2: aprovar exigia confirmá-la), e o fix 0009 a retirou do produto — o teste que a cobria está marcado como revogado (apps/api/tests/test_analise_completa.py:305) e o e2e afirma a ausência do controle (apps/e2e/tests/e2e/credit-analyses.spec.ts:127-128). Se o negócio ainda a quiser, ela volta como decisão nova, não como pendência antiga.
❌ Ausente¶
Em ordem sugerida de ataque.
1. Sinistro — processo inteiro¶
Não existe modelo Claim/Sinistro em apps/api/app/models/. Existem só os parâmetros de prazo (tenant_settings.py:85-86, com snapshot em guarantee.py:163-164) e o item Sinistros no menu, marcado comingSoon e sem rota. O contrato define as regras (ver Modelo de domínio). Falta modelar:
- Comunicado de Inadimplência pela imobiliária, no prazo de até 60 dias corridos do 1º vencimento (passou, a garantidora fica desobrigada — Cl. 15ª)
- Validação pela garantidora antes de pagar + workflow de status do sinistro
- Pagamento à imobiliária (que repassa ao locador) — não à conta do proprietário; janela configurável, padrão 5 dias após a validação
- Controle do LMI (múltiplo do Pacote) e do sub-limite de Custos de Saída
- Sub-rogação e regresso contra inquilino/corresponsável (cartão cadastrado ou meios legais — Cl. 15ª P4)
- Término da fiança por chaves / certidão de despejo / desocupação (Cl. 15ª P6)
É o maior buraco e é o que justifica o produto. Dos três processos do negócio, é o único sem nenhuma linha de código.
2. Emissão de boleto¶
"Boleto" existe hoje só como rótulo de canal (BillingChannel.GUARANTOR_BOLETO, CollectionMethod.BOLETO). Não há linha digitável, nosso-número, gateway nem dependência de pagamento no pyproject.toml. Billing é registro contábil e a baixa é manual (billing_service.py:210).
3. Assinatura eletrônica — Autentique + biometria facial¶
O contrato confirma: Autentique é o fornecedor (Cl. 21ª), com biometria facial, e a fiança só se formaliza após assinatura + pagamento (Cl. 1ª P1) — é o gate de ativação da garantia. Não há uma única ocorrência de "autentique" em apps/api/: hoje a assinatura é registrada à mão por quem já a colheu fora do sistema. Falta gerar o documento, enviá-lo para assinatura e tratar o callback que ativa a garantia.
Decisões de negócio (resolvidas em 2026-07-26)¶
Levantadas com o negócio e resolvidas — pelo contrato real, pelo relatório de cobrança (docs/) e pelo dono da garantidora. Base para as specs; nenhuma é técnica.
- [x] TXC Garantia / Solar são só ilustrativos — não viram seed real (o exemplo nos docs já está anonimizado).
- [x] ~~Bureaus (Rede Busca / Caixa Aqui / LOFT) — fora do escopo~~ — revertida em 2026-09: as specs 0050 e 0052 integraram API Full / SCPC Boa Vista e Quod. O que continua valendo é que o bureau não decide: a recomendação segue na regra 3×.
Jornadas Garantidora × Imobiliária — sinistro/regresso¶
Levantado em 2026-07-26 e cravado pelo contrato real (docs/contratos/: Termo de Condições Gerais + Quadro Resumo da TXC Garantia).
Fluxo confirmado:
- Originação tem duas portas (mesma análise): a imobiliária cadastra inquilino + imóvel e pede a análise no próprio portal, ou a garantidora cadastra em nome dela.
- O cobrador pode trocar no meio: setup + 1ª Taxa TXC saem juntos no 1º vencimento; do 2º mês em diante o recolhimento segue a cláusula da parceria — a imobiliária cobra junto do aluguel e repassa só a Taxa TXC (Cl. 5ª), ou o inquilino paga a garantidora direto. É o
collects_monthlyda spec 0054. - Fechamento é por imobiliária: o sistema gera a fatura de repasse (automática, com revisão opcional), envia à imobiliária, ela paga, a garantidora dá baixa e emite nota fiscal. Relatórios por garantia por baixo.
- Sinistro: a imobiliária comunica a inadimplência (≤ 60 dias do 1º vencimento); a garantidora valida e paga a imobiliária (não o locador direto); a imobiliária repassa ao locador; a garantidora sub-roga e regressa contra o inquilino/ corresponsável. A fiança segue até chaves/despejo/desocupação.
Respondido pelo contrato:
- [x] Prazo para abrir — até 60 dias corridos do 1º vencimento (Cl. 15ª); passou, garantidora desobrigada.
- [x] Abertura é obrigação do parceiro (Cl. 4ª), não opcional.
- [x] O que a garantidora paga — Pacote Locatício (aluguel+condomínio+encargos+IPTU), água/luz/gás do locador, multa ≤10% da parcela, Custos de Saída, honorários de despejo, Taxa TXC inadimplida (Cl. 8ª).
- [x] Limite (LMI) — múltiplo do Pacote (ex.: 36×); Custos de Saída em múltiplo próprio (ex.: 5×) (Cl. 7ª + Quadro).
- [x] Quem recebe — a imobiliária (repassa ao locador); a garantidora não toca no proprietário (Cl. 15ª P2/P3).
- [x] Regresso — sub-rogação; cobra inquilino/corresponsável por cartão cadastrado ou meios legais, com encargos + multa 2% e juros 1%/mês (Cl. 15ª P4, Cl. 11ª).
- [x] Taxa continua durante o sinistro, até o término da fiança (Cl. 15ª P7).
- [x] Término da fiança — chaves / certidão de despejo / desocupação, o 1º que ocorrer (Cl. 15ª P6).
- [x] Imobiliária não repassa — fiança suspensa; após 60 dias, encerra — mesmo com inquilino em dia (Cl. 5ª P4, Cl. 13ª).
- [x] Ativação — só após assinatura digital (Autentique + biometria) + pagamento (Cl. 1ª P1).
- [x] Proprietário — não é parte, não assina, não recebe direto: sem relação com a plataforma.
Decidido com o dono (2026-07-26):
- [x] Janela para pagar o locador — configurável, padrão 5 dias após a validação (mapeia sobre
claim_*_days). - [x] Documentos do Comunicado de Inadimplência — checklist configurável na configuração do sistema, com valores padrão editáveis no SaaS Admin.
- [x] Fechamento — considerar só o caminho feliz (recebe e concilia); atraso da imobiliária no repasse não é tratado neste momento.
- [x] Corresponsável — sem obrigatoriedade agora (modelar como opcional). Entregue.
- [x] Taxa Setup — arbitrada pelo analista na aprovação. Entregue.
Plano de entregas — validar a jornada por incrementos¶
Cada entrega fecha uma etapa da jornada e é testável ponta a ponta. Constrói primeiro a lógica de domínio (E1→E3) e deixa as integrações externas (assinatura + boleto) por último (E4).
Trilha da jornada (sequencial)¶
A ativação real (assinatura Autentique + boleto) foi empurrada para o fim (E4) — são as integrações externas mais pesadas. E1–E3 constroem a lógica sobre uma garantia ativada por um caminho simplificado; E4 pluga o gate real no lugar.
E1 · Análise completa — etapa Análise / Contrato — ✅ IMPLEMENTADA (spec 0003, mesclada na main em 2026-07-27)
- ✅ Taxa setup arbitrada pelo analista na aprovação
- ⚠️ Cláusula Obrigatória — entregue e depois retirada pelo fix 0009 (ver Parcial)
- ✅ Corresponsável opcional (PF, analisado)
Entregue junto: menu por pipeline (Painel/OPERAÇÃO/CADASTROS/ADMINISTRAÇÃO) e o rename transversal
Person → Renter(proprietário virou dado do imóvel; papelLANDLORDremovido) — parte da trilha de base Linguagem & menu.
E2 · Cobrança recorrente & Fechamento — etapa Cobrança/Fechamento — ✅ ENTREGUE (specs 0048, 0054 e 0055)
- ✅ Billing mensal do 2º mês em diante — o calendário nasce com a garantia
- ✅ Cada parcela diz de que é feita (tipo) e por onde entra (canal); a competência fecha em si mesma, com resumo por tipo × canal
- ✅ Acerto por imobiliária (spec
0055): Previsão × Pagamentos × Acerto por parceira e competência; a imobiliária declara quem pagou, a garantidora registra as transferências e fecha o mês, que dá baixa nas pagas e carimba atraso nas não pagas - ✅ Recebimento e baixa do repasse (spec
0055); a nota fiscal entra como registro (número e arquivo) — a emissão integrada a emissor ficou fora, e quem emite contra quem segue em aberto
E3 · Sinistro & Regresso — etapa Sinistro — ❌ não começou
- Modelo
Claim+ workflow de status - Comunicado de Inadimplência (≤60 dias do 1º venc. + checklist configurável)
- Validação → pagamento à imobiliária (janela 5 dias), dentro do LMI + Custos de Saída
- Sub-rogação e regresso contra o inquilino; término (chaves/despejo/desocupação)
E4 · Ativação real (integrações) — etapa Contrato & Ativação · por último — ❌ não começou
- Geração do documento (Termo + Quadro Resumo) + assinatura Autentique/biometria
- Boleto inicial — setup + 1ª parcela
- Garantia ativa só após assinar + pagar — troca o registro manual pelo gate real
Trilha de base (habilitadores — antes ou em paralelo)¶
- Mobile & PWA — ✅ IMPLEMENTADA (spec
0004): casca mobile (top app bar + bottom tab bar + drawer do pipeline), PWA instalável, cadastros em cards abaixo do breakpoint e auth/onboarding em coluna única. - Linguagem & menu — ✅ IMPLEMENTADA (spec
0007):Proposal → CreditAnalysis,Analysis → Decision, menu por pipeline. - Portal da imobiliária — ⚠️ parcial:
AGENCY_USERescopado porpartner_agency_idorigina e acompanha; a spec0051deu a tela Minha Imobiliária e a gestão dos próprios usuários; a spec0055, a aba Repasses, onde o responsável declara quem pagou. Falta a abertura de sinistro (E3), que depende do que ainda não existe. - RBAC — 10 papéis area-scoped + landings por papel — ❌ pendente. O código tem sete (
ADMIN_GLOBAL > ADMIN_TENANT > ANALYST > OPERATOR > VIEWER, maisAGENCY_USEReAGENCY_MANAGER, este acrescentado pela spec 0051) —app/db/rbac_seed.py:193; o modelo-alvo está emdocs/navigation-brief.md.
Ordem sugerida: E3 → E4. RBAC entra quando a validação exigir o recorte por papel.
Dívida técnica¶
A dívida técnica e o que falta construir em cada parte da arquitetura estão em Implementação.