Pular para o conteúdo
Todos os projetos

Seguros · .NET · React

Apólice

Seguro de ponta a ponta, da cotação ao pagamento do sinistro: cálculo de prêmio auditável, eventos que não se perdem e API documentada, em .NET 10 e React.

Cliente
Projeto pessoal open source
Cargo
Engenheiro de Software — projeto independente
Ano
2026
Tecnologias
  • C#
  • .NET 10
  • ASP.NET Core
  • EF Core
  • React
  • TypeScript
  • PostgreSQL
  • Aurora DSQL
  • RabbitMQ
  • Amazon SQS
  • AWS Lambda
  • Terraform
  • xUnit
  • Testcontainers
  • Playwright
  • GitHub Actions

Contexto

Plataforma de seguros open source, construída em outubro de 2026, que cobre o ciclo de vida de uma apólice de Auto, Residencial e Vida: cotação, emissão, endosso, cancelamento e sinistro. Corretor, analista de sinistros e administrador têm autorização por recurso, e o corretor só enxerga a própria carteira. Os dados são 100% fictícios, com login de demonstração por persona. O projeto leva para um back-end em C# e .NET o domínio de seguros que conheci no front-end do ERP da i4Pro, onde consumia APIs .NET, e foi conduzido com Spec-Driven Development: especificação versionada como fonte da verdade, guia de design, 8 ADRs e revisão independente de cada camada antes do merge.

Desafio

Seguro é um domínio em que cada centavo precisa fechar: o prêmio depende de fatores por produto, o endosso cobra ou devolve pro rata, o cancelamento tem três regras de restituição e o sinistro passa por análise, aprovação e pagamento com registro de quem fez o quê. O desafio era entregar esse ciclo completo como um sistema de produção de verdade: regras de negócio testáveis e isoladas da infraestrutura, eventos que não se perdem nem duplicam efeitos, proteção contra acesso à carteira alheia, observabilidade e deploy automatizado na AWS com custo perto de zero.

Resultados

testes .NET passando: 548 de domínio, 398 de aplicação, 32 de arquitetura e 165 de integração com PostgreSQL e RabbitMQ reais
1.143
de cobertura de linhas no domínio, e cerca de 99,9% na camada de aplicação
~99%
testes do front-end com Vitest, Testing Library e axe, mais E2E em Playwright do fluxo principal contra a produção
168
de custo em produção na AWS, dentro do free tier, com orçamento e alerta configurados
~US$ 0

Principais entregas

  1. 01Arquitetei a API em C# e .NET 10 com Clean Architecture (Domain, Application, Infrastructure, Api e Worker), DDD tático com agregados, value objects e eventos de domínio e Strategy na tarifação de cada produto, com 32 testes de arquitetura (ArchUnitNET) sobre as dependências entre as camadas e as convenções de handlers e agregados.
  2. 02Desenvolvi 32 operações REST versionadas em /api/v1 com ASP.NET Core Minimal APIs, OpenAPI 3.1 no Scalar e erros em ProblemDetails (RFC 9457), com EF Core 10 na escrita, sob concorrência otimista, e Dapper na leitura, com paginação keyset (CQRS-lite).
  3. 03Implementei outbox transacional com consumidores idempotentes: RabbitMQ no ambiente local e Amazon SQS com fila de mensagens mortas em produção, em que um relay agendado republica o que ficou pendente.
  4. 04Protegi a API seguindo o OWASP API Top 10: JWT de 15 minutos com refresh token rotativo em cookie HttpOnly e detecção de reuso, recurso de outra carteira respondendo 404 (anti-BOLA), rate limiting, Idempotency-Key, headers de segurança e auditoria das ações sensíveis.
  5. 05Construí o front-end em React 19 e TypeScript strict, com TanStack Query, React Hook Form + Zod, Tailwind CSS 4 e Radix UI, mobile first, com tema claro e escuro e meta de acessibilidade WCAG 2.1 AA verificada com axe nos testes.
  6. 06Automatizei a entrega na AWS com Terraform e GitHub Actions por OIDC (Lambda .NET 10 arm64, Aurora DSQL com autenticação IAM, SQS, EventBridge e segredos no SSM), com 1.143 testes .NET, 165 deles de integração com Testcontainers, e E2E em Playwright do fluxo principal passando contra a produção.
  1. Entrada por persona

    No login de demonstração, quatro personas entram sem senha: corretora, corretor, analista de sinistros e admin, cada uma com o próprio escopo. Dados fictícios.

    Tela de login do Apólice no computador. À esquerda, o painel marinho com gravura guilloché, a frase Da cotação ao sinistro, cada apólice com histórico completo, a descrição da plataforma para corretoras e um cartão de apólice AUTO-2026-000042 marcado como exemplo ilustrativo com dados fictícios. À direita, Entrar, com quatro personas de demonstração, Ana Ribeiro (Corretora), Bruno Lima (Corretor), Carla Souza (Analista de sinistros) e Diego Martins (Admin), cada uma com o próprio escopo, o acesso com e-mail e senha e os links para a documentação da API e para o código no GitHub.
    Tela de login do Apólice no computador. À esquerda, o painel marinho com gravura guilloché, a frase Da cotação ao sinistro, cada apólice com histórico completo, a descrição da plataforma para corretoras e um cartão de apólice AUTO-2026-000042 marcado como exemplo ilustrativo com dados fictícios. À direita, Entrar, com quatro personas de demonstração, Ana Ribeiro (Corretora), Bruno Lima (Corretor), Carla Souza (Analista de sinistros) e Diego Martins (Admin), cada uma com o próprio escopo, o acesso com e-mail e senha e os links para a documentação da API e para o código no GitHub.
  2. Visão da carteira

    O dashboard mostra a carteira no escopo de quem entrou: apólices ativas, prêmio emitido nos últimos 12 meses, conversão, sinistralidade e distribuição por produto. Dados fictícios.

    Dashboard Visão da carteira da corretora Ana Ribeiro, com o escopo sua carteira: 12 apólices ativas, R$ 27,5 mil de prêmio emitido em outubro, 2 cotações em aberto, conversão de 60,0% em 90 dias, 2 sinistros em aberto e sinistralidade de 33,5% em 12 meses, com meta de até 60%; o gráfico de prêmio emitido nos últimos 12 meses, com R$ 53,1 mil no período, o mês corrente em dourado e a média mensal de R$ 2,3 mil; e a distribuição por produto, Auto com 7 apólices ativas (90%), Residencial com 3 (7%) e Vida com 2 (3%). Na lateral marinha, a corretora fictícia Ribeiro & Associados, o menu e as filas salvas.
    Dashboard Visão da carteira da corretora Ana Ribeiro, com o escopo sua carteira: 12 apólices ativas, R$ 27,5 mil de prêmio emitido em outubro, 2 cotações em aberto, conversão de 60,0% em 90 dias, 2 sinistros em aberto e sinistralidade de 33,5% em 12 meses, com meta de até 60%; o gráfico de prêmio emitido nos últimos 12 meses, com R$ 53,1 mil no período, o mês corrente em dourado e a média mensal de R$ 2,3 mil; e a distribuição por produto, Auto com 7 apólices ativas (90%), Residencial com 3 (7%) e Vida com 2 (3%). Na lateral marinha, a corretora fictícia Ribeiro & Associados, o menu e as filas salvas.
  3. Cotação com cálculo ao vivo

    Na etapa de coberturas do assistente de 5 passos, o prêmio é recalculado a cada alteração, e a memória de cálculo mostra cada cobertura, cada fator e o IOF. Dados fictícios.

    Assistente Nova cotação · Seguro Auto na etapa 4 de 5, Coberturas, com Produto, Segurado e Risco concluídos e o aviso de rascunho salvo. A lista de coberturas traz Colisão, incêndio e roubo e RC danos materiais a terceiros como obrigatórias, RC danos corporais a terceiros desligada com o aviso Ative para calcular e Vidros, faróis e retrovisores ligada com LMI fixo de R$ 3.000,00. Ao lado, o painel Cálculo do prêmio, ao vivo: o prêmio anual de cada cobertura, o fator Região de pernoite BA/SE de ×1,10, prêmio líquido de R$ 5.051,20, IOF de 7,38% (R$ 372,78) e o bloco marinho do prêmio total, R$ 5.423,98, ou até 10× de R$ 542,39 sem juros, com a cotação válida até 21/11/2026.
    Assistente Nova cotação · Seguro Auto na etapa 4 de 5, Coberturas, com Produto, Segurado e Risco concluídos e o aviso de rascunho salvo. A lista de coberturas traz Colisão, incêndio e roubo e RC danos materiais a terceiros como obrigatórias, RC danos corporais a terceiros desligada com o aviso Ative para calcular e Vidros, faróis e retrovisores ligada com LMI fixo de R$ 3.000,00. Ao lado, o painel Cálculo do prêmio, ao vivo: o prêmio anual de cada cobertura, o fator Região de pernoite BA/SE de ×1,10, prêmio líquido de R$ 5.051,20, IOF de 7,38% (R$ 372,78) e o bloco marinho do prêmio total, R$ 5.423,98, ou até 10× de R$ 542,39 sem juros, com a cotação válida até 21/11/2026.
  4. A apólice como certificado

    A apólice aparece como um certificado, com vigência, prêmio, parcelamento, coberturas, linha do tempo e as ações de PDF, sinistro, endosso e cancelamento. Dados fictícios.

    Detalhe da apólice AUTO-2026-000001 tratada como um certificado: faixa marinha com gravura e fio dourado, status Ativa, segurado Pedro Henrique Rocha com CPF mascarado, veículo de R$ 145.000,00, ano 2023, e as ações Baixar PDF, Abrir sinistro, Endossar e Cancelar; abaixo, a vigência de 22/02/2026 a 22/02/2027 com a barra de 242 de 365 dias, prêmio total de R$ 7.885,57, parcelamento em 10× de R$ 788,55 e LMI principal de R$ 145.000,00. Mais abaixo, as abas Coberturas, Parcelas, Endossos, Sinistros e Comunicações, com a tabela de coberturas e o prêmio anual de cada uma, e a linha do tempo da apólice com os e-mails enviados.
    Detalhe da apólice AUTO-2026-000001 tratada como um certificado: faixa marinha com gravura e fio dourado, status Ativa, segurado Pedro Henrique Rocha com CPF mascarado, veículo de R$ 145.000,00, ano 2023, e as ações Baixar PDF, Abrir sinistro, Endossar e Cancelar; abaixo, a vigência de 22/02/2026 a 22/02/2027 com a barra de 242 de 365 dias, prêmio total de R$ 7.885,57, parcelamento em 10× de R$ 788,55 e LMI principal de R$ 145.000,00. Mais abaixo, as abas Coberturas, Parcelas, Endossos, Sinistros e Comunicações, com a tabela de coberturas e o prêmio anual de cada uma, e a linha do tempo da apólice com os e-mails enviados.
  5. Cancelamento simulado

    Antes de confirmar, o cancelamento simula a restituição pela regra do motivo: tabela de prazo curto a pedido do segurado, pro rata nos demais. Dados fictícios.

    Diálogo Cancelar a apólice RESID-2026-000001? sobre o detalhe da apólice, com o aviso de que o cancelamento encerra a cobertura hoje e não pode ser desfeito. Três motivos: Pedido do segurado, selecionado, com restituição pela tabela de prazo curto, e Iniciativa da seguradora e Inadimplência, com restituição pro rata dos dias restantes. A simulação mostra o método Prazo curto, a data 22/10/2026, 226 de 365 dias decorridos, 80% retido pela tabela, prêmio líquido vigente de R$ 2.311,50 e restituição de R$ 462,30, com a nota de que o IOF não é restituído e os botões Voltar e Cancelar apólice.
    Diálogo Cancelar a apólice RESID-2026-000001? sobre o detalhe da apólice, com o aviso de que o cancelamento encerra a cobertura hoje e não pode ser desfeito. Três motivos: Pedido do segurado, selecionado, com restituição pela tabela de prazo curto, e Iniciativa da seguradora e Inadimplência, com restituição pro rata dos dias restantes. A simulação mostra o método Prazo curto, a data 22/10/2026, 226 de 365 dias decorridos, 80% retido pela tabela, prêmio líquido vigente de R$ 2.311,50 e restituição de R$ 462,30, com a nota de que o IOF não é restituído e os botões Voltar e Cancelar apólice.
  6. Regulação do sinistro

    Na visão da analista, o sinistro em análise reúne a triagem automática, o histórico e as ações de aprovar ou negar, aqui no tema escuro. Dados fictícios.

    Sinistro SIN-2026-000004 no tema escuro, na visão da analista Carla Souza: status Em análise, apólice AUTO-2026-000003 de Beatriz Carvalho Mendes e os botões Negar e Aprovar. O cartão Ocorrência mostra a cobertura Vidros, faróis e retrovisores, valor reclamado de R$ 1.850,00, LMI de R$ 3.000,00 e a descrição da trinca no para-brisa; o Histórico registra Sinistro aberto por Ana Ribeiro e Análise iniciada por Carla Souza, com data e hora; a Triagem automática traz score 0 de 100, risco baixo, sem alertas; e o cartão da apólice mostra número, segurado e corretor.
    Sinistro SIN-2026-000004 no tema escuro, na visão da analista Carla Souza: status Em análise, apólice AUTO-2026-000003 de Beatriz Carvalho Mendes e os botões Negar e Aprovar. O cartão Ocorrência mostra a cobertura Vidros, faróis e retrovisores, valor reclamado de R$ 1.850,00, LMI de R$ 3.000,00 e a descrição da trinca no para-brisa; o Histórico registra Sinistro aberto por Ana Ribeiro e Análise iniciada por Carla Souza, com data e hora; a Triagem automática traz score 0 de 100, risco baixo, sem alertas; e o cartão da apólice mostra número, segurado e corretor.
  7. No celular

    No celular, o dashboard vira grade de duas colunas, a memória de cálculo abre num painel inferior, a apólice mantém a face de certificado e o histórico do sinistro cabe numa tela. Dados fictícios.

    • Dashboard no celular: cabeçalho marinho com a marca Apólice, busca, notificações e avatar; Visão da carteira de quinta-feira, 22 de outubro de 2026, com o escopo sua carteira, o botão Nova cotação e os indicadores numa grade de duas colunas, 12 apólices ativas, R$ 27,5 mil de prêmio no mês, 2 cotações em aberto, conversão de 60,0% em 90 dias, 2 sinistros em aberto e sinistralidade de 33,5% em 12 meses, com meta de até 60%; o início do gráfico de prêmio emitido e a navegação inferior com Início, Cotações, Apólices, Sinistros e Mais.
      Dashboard no celular: cabeçalho marinho com a marca Apólice, busca, notificações e avatar; Visão da carteira de quinta-feira, 22 de outubro de 2026, com o escopo sua carteira, o botão Nova cotação e os indicadores numa grade de duas colunas, 12 apólices ativas, R$ 27,5 mil de prêmio no mês, 2 cotações em aberto, conversão de 60,0% em 90 dias, 2 sinistros em aberto e sinistralidade de 33,5% em 12 meses, com meta de até 60%; o início do gráfico de prêmio emitido e a navegação inferior com Início, Cotações, Apólices, Sinistros e Mais.
    • Memória de cálculo aberta num painel inferior no celular, sobre o assistente de cotação: Cálculo do prêmio, ao vivo, pela tarifa do Seguro Auto de referência 22/10/2026, com Colisão, incêndio e roubo (R$ 4.171,20), RC danos materiais a terceiros (R$ 660,00) e Vidros, faróis e retrovisores (fixo, R$ 220,00), o fator Região de pernoite BA/SE de ×1,10, prêmio líquido de R$ 5.051,20 e IOF de R$ 372,78; o bloco marinho do prêmio total, R$ 5.423,98, ou até 10× de R$ 542,39 sem juros, com validade até 21/11/2026; e o seletor de parcelamento em 1×, 3×, 6×, 10× ou outro valor.
      Memória de cálculo aberta num painel inferior no celular, sobre o assistente de cotação: Cálculo do prêmio, ao vivo, pela tarifa do Seguro Auto de referência 22/10/2026, com Colisão, incêndio e roubo (R$ 4.171,20), RC danos materiais a terceiros (R$ 660,00) e Vidros, faróis e retrovisores (fixo, R$ 220,00), o fator Região de pernoite BA/SE de ×1,10, prêmio líquido de R$ 5.051,20 e IOF de R$ 372,78; o bloco marinho do prêmio total, R$ 5.423,98, ou até 10× de R$ 542,39 sem juros, com validade até 21/11/2026; e o seletor de parcelamento em 1×, 3×, 6×, 10× ou outro valor.
    • Apólice AUTO-2026-000001 no celular: a face de certificado marinha com Seguro Auto, status Ativa, segurado Pedro Henrique Rocha, CPF mascarado e os dados do veículo; o botão Endossar e um menu com as demais ações; e, empilhados, a vigência de 22/02/2026 a 22/02/2027 com 242 de 365 dias, o prêmio total de R$ 7.885,57 e o parcelamento em 10× de R$ 788,55, acima da navegação inferior.
      Apólice AUTO-2026-000001 no celular: a face de certificado marinha com Seguro Auto, status Ativa, segurado Pedro Henrique Rocha, CPF mascarado e os dados do veículo; o botão Endossar e um menu com as demais ações; e, empilhados, a vigência de 22/02/2026 a 22/02/2027 com 242 de 365 dias, o prêmio total de R$ 7.885,57 e o parcelamento em 10× de R$ 788,55, acima da navegação inferior.
    • Histórico do sinistro SIN-2026-000001 no celular, na visão da analista: quatro transições com data, hora e autor, Pagamento registrado, Indenização aprovada com a justificativa Orçamento da oficina referenciada abaixo do valor reclamado e Análise iniciada, todas por Carla Souza, e Sinistro aberto por Ana Ribeiro, cada uma com o selo do status, Pago, Aprovado, Em análise e Aberto.
      Histórico do sinistro SIN-2026-000001 no celular, na visão da analista: quatro transições com data, hora e autor, Pagamento registrado, Indenização aprovada com a justificativa Orçamento da oficina referenciada abaixo do valor reclamado e Análise iniciada, todas por Carla Souza, e Sinistro aberto por Ana Ribeiro, cada uma com o selo do status, Pago, Aprovado, Em análise e Aberto.
  8. Fundamentos do design system

    As cores primitivas viram tokens semânticos com light-dark(), e um mesmo token atende os dois temas. A serifa marca números de apólice e valores, e espaçamento, raios, movimento e botões por variante e estado completam a base.

    Prancha do design system do Apólice, fundamentos e primitivos, com o selo marinho e dourado da marca ao lado do título e os chips tokens.css com light-dark(), Tailwind 4 com @theme inline, Radix UI com lucide e 1 token para 2 temas. Cor: as escalas primitivas Marinho, Dourado e Noite com hexadecimais e os tokens semânticos em pares claro e escuro (canvas, surface, ink, ink-2, line, primary-bg, brand-surface, gold-text, link e focus, ok, warn e bad), com a regra de que os componentes só usam os semânticos. Tipografia em três famílias: Source Serif 4 no número da apólice, nos títulos e no valor do prêmio, Public Sans no texto de interface e Geist Mono nos identificadores. Espaçamento em base 4 px, raios de 5 px ao círculo, sombras só no que flutua e tempos de movimento de 120 a 280 ms com reduced-motion. Botões primário, secundário, fantasma e perigo nos estados padrão, hover e desabilitado, e os botões sobre marinho com foco dourado; campos com foco, erro e desabilitado; badges por tom; toggle, controle segmentado e abas.
    Prancha do design system do Apólice, fundamentos e primitivos, com o selo marinho e dourado da marca ao lado do título e os chips tokens.css com light-dark(), Tailwind 4 com @theme inline, Radix UI com lucide e 1 token para 2 temas. Cor: as escalas primitivas Marinho, Dourado e Noite com hexadecimais e os tokens semânticos em pares claro e escuro (canvas, surface, ink, ink-2, line, primary-bg, brand-surface, gold-text, link e focus, ok, warn e bad), com a regra de que os componentes só usam os semânticos. Tipografia em três famílias: Source Serif 4 no número da apólice, nos títulos e no valor do prêmio, Public Sans no texto de interface e Geist Mono nos identificadores. Espaçamento em base 4 px, raios de 5 px ao círculo, sombras só no que flutua e tempos de movimento de 120 a 280 ms com reduced-motion. Botões primário, secundário, fantasma e perigo nos estados padrão, hover e desabilitado, e os botões sobre marinho com foco dourado; campos com foco, erro e desabilitado; badges por tom; toggle, controle segmentado e abas.
  9. Componentes de domínio

    Os componentes de domínio, em React e TypeScript strict, traduzem o seguro em interface: a apólice como certificado, o cálculo do prêmio com cada fator, os status, o histórico do sinistro, as parcelas e os KPIs. Dados fictícios.

    Prancha de componentes de domínio do Apólice, com dados fictícios. No alto, capturas do app: a face da apólice AUTO-2026-000043 como certificado marinho com folha dourada, status Programada, segurado com CPF mascarado, vigência, prêmio total, parcelamento em 10 vezes e LMI principal, com as ações Baixar PDF, Endossar e Cancelar; e o painel Cálculo do prêmio ao vivo, com o prêmio anual de cada cobertura, os fatores aplicados (condutor de 18 a 25 anos, região, garagem e bônus classe 3) com o efeito de cada um em reais, prêmio líquido, IOF de 7,38% e prêmio total. Abaixo, os status de cotação, apólice e sinistro mapeados para tons, inclusive o prazo de expiração; o histórico do sinistro com a triagem automática de risco baixo e os eventos de análise, indenização aprovada e pagamento; o cronograma de 10 parcelas com a próxima em destaque; e os cartões de KPI de prêmio do mês, sinistralidade de 12 meses contra a meta de até 60% e conversão em 90 dias.
    Prancha de componentes de domínio do Apólice, com dados fictícios. No alto, capturas do app: a face da apólice AUTO-2026-000043 como certificado marinho com folha dourada, status Programada, segurado com CPF mascarado, vigência, prêmio total, parcelamento em 10 vezes e LMI principal, com as ações Baixar PDF, Endossar e Cancelar; e o painel Cálculo do prêmio ao vivo, com o prêmio anual de cada cobertura, os fatores aplicados (condutor de 18 a 25 anos, região, garagem e bônus classe 3) com o efeito de cada um em reais, prêmio líquido, IOF de 7,38% e prêmio total. Abaixo, os status de cotação, apólice e sinistro mapeados para tons, inclusive o prazo de expiração; o histórico do sinistro com a triagem automática de risco baixo e os eventos de análise, indenização aprovada e pagamento; o cronograma de 10 parcelas com a próxima em destaque; e os cartões de KPI de prêmio do mês, sinistralidade de 12 meses contra a meta de até 60% e conversão em 90 dias.
  10. Estados e acessibilidade

    As telas preveem vazio, erro com ID de correlação, carregamento e falta de permissão, e o mesmo token muda de valor no tema escuro. O contraste segue a WCAG 2.1 AA, e o axe roda nos testes. Dados fictícios.

    Prancha de estados e acessibilidade do Apólice, com os chips WCAG 2.1 AA, prefers-reduced-motion, zoom de 200% com reflow em 320 px e axe nos testes. Estados capturados do app: vazio no primeiro uso, Nenhuma cotação ainda, com o botão Nova cotação; erro no tema escuro, Não foi possível carregar as apólices, com o ID de correlação copiável e o botão Tentar de novo; skeleton que só aparece depois de 200 ms e não pulsa com reduced-motion; e sem permissão, Disponível para o perfil Admin. Abaixo, o dashboard no tema escuro no computador, com o mesmo token e outro valor, dois celulares de 390 pt com a visão da carteira no tema claro e a lista de apólices no escuro, e o painel de acessibilidade com contrastes de 17,5:1 no texto, 7,9:1 no secundário, 5,4:1 ou mais nos estados e 7,3:1 no foco, e as regras de foco sempre visível, cor nunca sozinha, alvos de 40 px no desktop e 44 px no celular e os 168 testes do frontend com Vitest, Testing Library e axe.
    Prancha de estados e acessibilidade do Apólice, com os chips WCAG 2.1 AA, prefers-reduced-motion, zoom de 200% com reflow em 320 px e axe nos testes. Estados capturados do app: vazio no primeiro uso, Nenhuma cotação ainda, com o botão Nova cotação; erro no tema escuro, Não foi possível carregar as apólices, com o ID de correlação copiável e o botão Tentar de novo; skeleton que só aparece depois de 200 ms e não pulsa com reduced-motion; e sem permissão, Disponível para o perfil Admin. Abaixo, o dashboard no tema escuro no computador, com o mesmo token e outro valor, dois celulares de 390 pt com a visão da carteira no tema claro e a lista de apólices no escuro, e o painel de acessibilidade com contrastes de 17,5:1 no texto, 7,9:1 no secundário, 5,4:1 ou mais nos estados e 7,3:1 no foco, e as regras de foco sempre visível, cor nunca sozinha, alvos de 40 px no desktop e 44 px no celular e os 168 testes do frontend com Vitest, Testing Library e axe.
  11. API documentada

    A API documenta as 32 operações em OpenAPI 3.1 no Scalar, inclusive as simulações de endosso e de cancelamento e o header Idempotency-Key da emissão.

    Documentação da API no Scalar, no tema escuro, na seção Apólices: a lista de operações, POST e GET /api/v1/apolices, GET /api/v1/apolices/{id} e /documento, a simulação e a criação de endosso e a simulação e a criação do cancelamento; abaixo, Emitir uma apólice, com o header Idempotency-Key e o exemplo de requisição em curl. Na lateral, os grupos Autenticação, Sistema, Dashboard, Produtos, Cotações, Apólices, Sinistros, Administração e Models.
    Documentação da API no Scalar, no tema escuro, na seção Apólices: a lista de operações, POST e GET /api/v1/apolices, GET /api/v1/apolices/{id} e /documento, a simulação e a criação de endosso e a simulação e a criação do cancelamento; abaixo, Emitir uma apólice, com o header Idempotency-Key e o exemplo de requisição em curl. Na lateral, os grupos Autenticação, Sistema, Dashboard, Produtos, Cotações, Apólices, Sinistros, Administração e Models.
  12. Arquitetura

    O quadro segue a requisição de 1 a 10, da SPA na Vercel à Lambda em .NET e ao Aurora DSQL, e o evento pelo outbox até o SQS, o worker e, na falha, a DLQ com alarme por e-mail. A entrega vai de A a G por OIDC e Terraform, e as notas trazem as decisões dos ADRs.

    Quadro de arquitetura do Apólice no estilo de um board do Miro, Da requisição ao evento, em produção, com os números 32 operações REST em /api/v1, 5 projetos de Domain a Worker, 1.143 testes .NET, 168 testes do frontend e E2E e custo perto de US$ 0 por mês no free tier. Zonas: Cliente, com a SPA em React 19, TypeScript e Vite, TanStack Query, React Router, React Hook Form, Zod, Tailwind 4 e Radix UI, o access token só em memória e as personas de demonstração; Borda na Vercel, com CDN, rewrite de /api para a Function URL, cabeçalhos de segurança e OpenAPI 3.1 com Scalar; e AWS Cloud na região us-east-1, com a Lambda apolice-api em .NET 10 e arm64 (pipeline com correlation id, JWT, rate limit, validação, Idempotency-Key e o domínio emitindo o evento, com as camadas Api, Infra, Application e Domain verificadas por testes de arquitetura), Aurora DSQL com token IAM e sem senha de banco, SSM Parameter Store com KMS, EventBridge a cada 5 min acionando o outbox-relay, a fila SQS com lote de 10 e falha parcial para a Lambda apolice-worker, a DLQ após 5 recebimentos, o alarme e o aviso por e-mail via SNS, além de CloudWatch, Budgets e IAM com privilégio mínimo. O fluxo numerado de 1 a 10 vai da requisição ao evento gravado com o inbox na mesma transação e, na falha, à DLQ; os passos de A a G mostram a entrega pelo GitHub Actions, do push aos CIs de backend e frontend, ao deploy por OIDC, ao terraform apply, à migração com seed e smoke test e ao frontend na Vercel. Ao lado, as faixas de Segurança (OWASP API Top 10: JWT de 15 min com refresh rotativo, anti-BOLA, rate limiting, Idempotency-Key e FluentValidation com ProblemDetails), Observabilidade (Serilog, OpenTelemetry, health checks e alarmes por e-mail) e Local e testes (PostgreSQL 17, RabbitMQ 4, Aspire dashboard, Valkey e Testcontainers), notas adesivas com as decisões e os trade-offs dos ADRs e a legenda das linhas síncrona, do caminho do evento, assíncrona, de falha e de configuração.
    Quadro de arquitetura do Apólice no estilo de um board do Miro, Da requisição ao evento, em produção, com os números 32 operações REST em /api/v1, 5 projetos de Domain a Worker, 1.143 testes .NET, 168 testes do frontend e E2E e custo perto de US$ 0 por mês no free tier. Zonas: Cliente, com a SPA em React 19, TypeScript e Vite, TanStack Query, React Router, React Hook Form, Zod, Tailwind 4 e Radix UI, o access token só em memória e as personas de demonstração; Borda na Vercel, com CDN, rewrite de /api para a Function URL, cabeçalhos de segurança e OpenAPI 3.1 com Scalar; e AWS Cloud na região us-east-1, com a Lambda apolice-api em .NET 10 e arm64 (pipeline com correlation id, JWT, rate limit, validação, Idempotency-Key e o domínio emitindo o evento, com as camadas Api, Infra, Application e Domain verificadas por testes de arquitetura), Aurora DSQL com token IAM e sem senha de banco, SSM Parameter Store com KMS, EventBridge a cada 5 min acionando o outbox-relay, a fila SQS com lote de 10 e falha parcial para a Lambda apolice-worker, a DLQ após 5 recebimentos, o alarme e o aviso por e-mail via SNS, além de CloudWatch, Budgets e IAM com privilégio mínimo. O fluxo numerado de 1 a 10 vai da requisição ao evento gravado com o inbox na mesma transação e, na falha, à DLQ; os passos de A a G mostram a entrega pelo GitHub Actions, do push aos CIs de backend e frontend, ao deploy por OIDC, ao terraform apply, à migração com seed e smoke test e ao frontend na Vercel. Ao lado, as faixas de Segurança (OWASP API Top 10: JWT de 15 min com refresh rotativo, anti-BOLA, rate limiting, Idempotency-Key e FluentValidation com ProblemDetails), Observabilidade (Serilog, OpenTelemetry, health checks e alarmes por e-mail) e Local e testes (PostgreSQL 17, RabbitMQ 4, Aspire dashboard, Valkey e Testcontainers), notas adesivas com as decisões e os trade-offs dos ADRs e a legenda das linhas síncrona, do caminho do evento, assíncrona, de falha e de configuração.

Funcionalidades e as dores que resolvem

Cada funcionalidade nasceu de um problema real da operação.

  1. 01

    Cotação com cálculo ao vivo

    Dor
    O corretor monta a cotação sem saber quanto cada escolha custa, e um prêmio que ninguém consegue explicar gera desconfiança do segurado.
    Solução
    O assistente de 5 passos recalcula o prêmio a cada alteração, com uma simulação que não grava nada, e mostra a memória de cálculo: prêmio de cada cobertura, fatores aplicados (idade do condutor, região pelo CEP, uso comercial, bônus, tipo de imóvel, fumante), IOF e parcelamento máximo. Cada produto tem a própria estratégia de tarifação.

    Impacto: Auto, Residencial e Vida; a cotação gravada vale 30 dias

  2. 02

    Emissão sem duplicidade

    Dor
    Emitir a partir de uma cotação vencida, ou duas vezes por um clique repetido, gera apólice duplicada e cobrança errada.
    Solução
    A apólice só nasce de cotação aceita e válida, com início da vigência em até 30 dias, número no formato AUTO-2026-000042 e parcelamento em até 10 vezes. A emissão aceita Idempotency-Key: repetir a chave devolve a resposta original, e o PDF da apólice sai com QuestPDF.
  3. 03

    Endosso pro rata

    Dor
    Mudar o LMI ou incluir uma cobertura no meio da vigência exige cobrar ou devolver só pelos dias restantes, conta que costuma ir para planilha.
    Solução
    O sistema simula antes de confirmar e cobra ou devolve a diferença pro rata pelos dias restantes. Cada agregado tem versão, e uma alteração concorrente vira 409 em vez de sobrescrever a outra.
  4. 04

    Cancelamento com simulação

    Dor
    Cada motivo de cancelamento tem uma regra de restituição, e aplicar a regra errada devolve dinheiro a mais ou a menos.
    Solução
    Antes de confirmar, o diálogo mostra método, dias decorridos, percentual retido e valor a restituir: integral antes do início da vigência, tabela de prazo curto quando o segurado pede e pro rata die nos demais motivos.

    Impacto: O IOF não é restituído, e a tela avisa antes da confirmação

  5. 05

    Sinistro com triagem e regulação

    Dor
    Sem triagem, um aviso tardio com valor perto do LMI recebe o mesmo tratamento de um caso simples; sem histórico, ninguém sabe quem aprovou o quê.
    Solução
    Cada sinistro novo recebe uma triagem automática e assíncrona, com score de 0 a 100 e alertas (vigência recente, valor perto ou acima do LMI, comunicação tardia). A analista inicia a análise, aprova até o menor valor entre o reclamado e o LMI, nega com motivo ou registra o pagamento, e cada transição entra no histórico com autor e data.
  6. 06

    Carteira isolada por papel

    Dor
    Num sistema com vários corretores, trocar o id na URL não pode abrir a apólice de outra carteira (BOLA, o primeiro risco do OWASP API Top 10).
    Solução
    A autorização é por recurso: o corretor só vê a própria carteira, e um recurso alheio responde 404, como se não existisse. A analista enxerga tudo, mas não opera cotações nem apólices; o admin altera taxas do catálogo e consulta a trilha de auditoria.
  7. 07

    Sessão segura

    Dor
    Token de longa duração guardado no navegador pode ser roubado por XSS e não tem como ser revogado.
    Solução
    Access token JWT de 15 minutos só em memória e refresh token rotativo de 7 dias em cookie HttpOnly e SameSite=Strict, guardado no banco apenas como hash. Reutilizar um token já rotacionado revoga a família inteira, e o login bloqueia após 5 senhas erradas, mesmo com tentativas em paralelo.
  8. 08

    Eventos que não se perdem

    Dor
    Gravar no banco e publicar na fila em passos separados perde o evento quando um dos dois falha, e a reentrega duplica e-mail ou triagem.
    Solução
    O evento vira uma linha do outbox no mesmo SaveChanges do agregado; a API publica logo após o commit e um relay agendado cobre as falhas. O consumidor registra a mensagem na mesma transação do efeito, então a reentrega não repete nada.

    Impacto: RabbitMQ no local; SQS com DLQ e alarme em produção

  9. 09

    Dashboard da carteira

    Dor
    Para saber quanto emitiu, quanto converte e como anda a sinistralidade, o corretor precisa juntar relatórios.
    Solução
    O dashboard mostra apólices ativas, prêmio emitido no mês e nos últimos 12 meses, conversão de cotações, sinistros em aberto, sinistralidade e carteira por produto, no escopo de quem entrou: a própria carteira ou a global. As leituras usam Dapper com SQL parametrizado, separadas da escrita em EF Core.
  10. 10

    API com contrato sem drift

    Dor
    Integrar com uma API sem contrato atualizado é tentativa e erro, e o front-end quebra em silêncio quando o back-end muda.
    Solução
    As 32 operações em /api/v1 ficam documentadas em OpenAPI 3.1 no Scalar, com erros em ProblemDetails (RFC 9457). O CI regenera o contrato e falha se o commitado estiver desatualizado, e os tipos TypeScript do front-end saem do mesmo OpenAPI.
  11. 11

    Produção serverless e observável

    Dor
    Servidor ligado o tempo todo para uma demonstração custa caro, e sem logs e traces correlacionados não dá para seguir uma requisição até o worker.
    Solução
    A API roda em AWS Lambda (.NET 10, arm64) atrás de um rewrite da Vercel, na mesma origem do front-end, com Aurora DSQL autenticado por IAM, SQS e EventBridge, tudo em Terraform com deploy por OIDC. Serilog grava logs JSON com correlation id, sem dados pessoais, e o OpenTelemetry leva o trace da requisição até o worker.

    Impacto: Custo em produção perto de US$ 0 (free tier)