Ir para o conteúdo

Backend - Domínio do Método Billings

Visão Geral

O Método Billings de Ovulação (MBO) é um método natural de reconhecimento da fertilidade baseado na observação diária de sinais de fertilidade. O sistema implementa as regras críticas deste método no backend, garantindo que os cálculos sejam consistentes e confiáveis.

Conceitos Fundamentais

Ciclo Menstrual

Um ciclo representa um período menstrual completo, desde o primeiro dia de sangramento até o dia anterior ao próximo sangramento.

Características: - Cada usuária pode ter apenas um ciclo ativo por vez - Ciclo começa no primeiro dia de sangramento (is_first_day_of_menstruation = true) - Ciclo termina quando novo sangramento é registrado - Duração típica: 21-35 dias

Observação Diária

Uma observação é o registro diário dos sinais de fertilidade:

Componentes: - Símbolo: Representação visual do muco cervical (ex: "seca", "fertilidade", "fluxo") - Sensação: Sensação percebida (ex: "seca", "úmida", "lubrificante") - Aparência: Aparência visual do muco (ex: "transparente", "opaca", "espessa") - Sangramento: Indica se há sangramento no dia - Relação sexual: Se houve relação sexual no dia

Regras: - Apenas uma observação por dia por usuária

Símbolos

Símbolos representam diferentes estados do muco cervical:

Tipos: - Símbolos de sangramento: - sangramento sem mancha - sangramento com mancha

  • Símbolos férteis:
  • fertilidade
  • fluxo 1, fluxo 2, fluxo 3
  • seca 1, seca 2, seca 3

  • Símbolos inférteis:

  • seca
  • fluxo

  • Símbolo de ápice:

  • fertilidade apice - Identifica o pico de fertilidade

Ápice de Fertilidade

O ápice é o último dia de muco fértil antes da mudança para muco infértil. É identificado quando o símbolo fertilidade apice é registrado.

Importância: - Marca o início do período pós-ovulação - Após o ápice, contam-se 3 dias completos de período fértil - A partir do 4º dia após o ápice, período infértil até próximo sangramento

Regras Críticas do Método Billings

Regra 1: Sangramento

Regra: Não é permitido ter relações sexuais nos dias de sangramento.

Aplicável a: Todas as mulheres, independente do objetivo.

Implementação: fertility_service.go - Verifica primeiro, antes de qualquer outra regra.

Regra 2: Primeiros 15 Dias

Regra: Não é permitido ter relações sexuais nos primeiros 15 dias.

Aplicável a: Todas as mulheres, independente do objetivo.

Implementação: fertility_service.go - Verifica após sangramento.

Exceção técnica (onboarding cliente v2): - Quando a cliente informa que conhece o método, já identificou seu próprio PBI e possui PBI completo salvo, o backend remove o bloqueio técnico dos símbolos dos 15 primeiros dias. - Essa exceção é aplicada em symbol_rules.go durante o cálculo de símbolos permitidos.

Regra 3: Período Fértil (Espaçar Gravidez)

Regra: Não é permitido ter relações sexuais nos dias de possível fertilidade quando o objetivo é espaçar a gravidez.

Aplicável a: Apenas mulheres que querem espaçar a gravidez.

Períodos considerados férteis: - Do dia do ápice até o 3º dia após o ápice - Após 15 dias, quando há símbolos férteis

Implementação: fertility_service.go - Aplica regras baseadas no objetivo.

Regra 4: Pós-Ápice

Regra: A partir do 4º dia após o ápice, relação sexual liberada até aparecer sangramento.

Aplicável a: Todas as mulheres, independente do objetivo.

Implementação: fertility_service.go - Retorna allowed_no_risk após 4 dias do ápice.

Objetivos da Paciente

O objetivo determina como as regras são aplicadas:

1. Espaçar a Gravidez

Comportamento: - Primeiros 15 dias: Proibido - Após 15 dias, símbolo infértil: Permitido sem risco - Após 15 dias, símbolo fértil: Proibido - Período do ápice (0-3 dias): Proibido - 4+ dias após ápice: Permitido sem risco

2. Engravidar

Comportamento: - Primeiros 15 dias: Proibido - Após 15 dias, qualquer símbolo (exceto sangramento): Permitido - Símbolo fértil: Permitido com risco (período ideal) - Símbolo infértil: Permitido sem risco - Período do ápice (0-3 dias): Permitido com risco (período ideal) - 4+ dias após ápice: Permitido sem risco

3. Conhecimento

Comportamento: - Informativo, sem restrições - Status indica fertilidade, mas não proíbe relações

Status de Relação Sexual

O sistema retorna três status possíveis:

"not_allowed"

Relação sexual não permitida.

Aplicado quando: - Há sangramento (Regra 1) - Primeiros 15 dias do ciclo (Regra 2) - Período fértil e objetivo é "espaçar a gravidez" (Regra 3) - Após 15 dias, símbolo fértil e objetivo é "espaçar a gravidez"

"allowed_with_risk"

Relação sexual permitida, mas com risco de gravidez.

Aplicado quando: - Período fértil e objetivo é "engravidar" - Período fértil e objetivo é "conhecimento" - Após 15 dias, símbolo fértil e objetivo é "engravidar"

"allowed_no_risk"

Relação sexual permitida, sem risco de gravidez.

Aplicado quando: - A partir do 4º dia após o ápice (sem sangramento) - Após 15 dias, símbolo infértil e objetivo é "espaçar a gravidez" - Após 15 dias, qualquer símbolo (exceto sangramento) e objetivo é "engravidar" - Objetivo é "conhecimento" e não está em período fértil

Implementação no Backend

Serviço de Fertilidade

Arquivo: internal/services/fertility_service.go

Função principal:

func (s *FertilityService) GetFertilityStatus(userID uint, date time.Time) (*FertilityStatus, error)

Processo: 1. Busca ciclo ativo 2. Busca observações do ciclo até a data 3. Aplica regras na ordem de prioridade: - Verifica sangramento (Regra 1) - Verifica primeiros 15 dias (Regra 2) - Verifica ápice e dias após ápice - Aplica regras baseadas em símbolo e objetivo 4. Retorna FertilityStatus

Documentação das Regras

Arquivo: internal/services/FERTILITY_RULES.md

Documentação completa e detalhada de todas as regras, incluindo: - Definições de símbolos - Regras por período do ciclo - Status de relação sexual - Ordem de verificação - Exemplos práticos

Validações de Ciclo

Arquivo: internal/services/cycle_validations.go

Validações de integridade: - Apenas um ciclo ativo por usuária - Datas válidas - Ciclos não podem se sobrepor

Regras de Símbolos

Arquivo: internal/services/symbol_rules.go

Determina quais símbolos são permitidos em cada dia do ciclo: - Aplica regras baseadas em dias (Day-Based Rules) - Considera restrições e permissões específicas

O que NÃO Pode Ser Replicado Fora do Backend

❌ Cálculos de Fertilidade

Por quê: - Regras complexas e críticas - Mudanças nas regras devem ser centralizadas - Garantia de consistência entre web e mobile

Onde deve estar: Apenas no backend (fertility_service.go)

❌ Validação de Regras do Método

Por quê: - Validações de negócio devem estar no backend - Previne inconsistências

Onde deve estar: Apenas no backend

❌ Determinação de Símbolos Permitidos

Por quê: - Regras baseadas em dias do ciclo - Configurável por admin - Deve ser consistente

Onde deve estar: Apenas no backend (symbol_rules.go)

✅ O que Pode Estar no Frontend/Mobile

  • Validação de formato (UI)
  • Exibição de dados retornados pela API
  • Interface de registro de observações
  • Visualização de gráficos e estatísticas

Referências aos Arquivos

Código Principal

  • internal/services/fertility_service.go - Cálculos de fertilidade
  • internal/services/cycle_service.go - Gestão de ciclos
  • internal/services/cycle_validations.go - Validações
  • internal/services/symbol_rules.go - Regras de símbolos
  • internal/services/mob_rules_service.go - Regras MOB

Documentação

  • internal/services/FERTILITY_RULES.md - Documentação completa das regras

Modelos

  • internal/models/cycle.go - Modelo de ciclo
  • internal/models/observation.go - Modelo de observação
  • internal/models/symbol.go - Modelo de símbolo
  • internal/models/client_profile.go - Perfil de cliente (objetivo)

Handlers

  • internal/handlers/client/fertility_status.go - Endpoint de status de fertilidade
  • internal/handlers/general/observations.go - CRUD de observações
  • internal/handlers/general/cycles.go - CRUD de ciclos

Exemplos de Uso

Calcular Status de Fertilidade

fertilityService := services.NewFertilityService(db)
status, err := fertilityService.GetFertilityStatus(userID, time.Now())
if err != nil {
    // Tratar erro
}

// status.IsFertile - Se está fértil
// status.IntercourseStatus - "not_allowed", "allowed_with_risk", "allowed_no_risk"
// status.DaysAfterPeak - Dias após o ápice (nil se não houver ápice)
// status.HasBleeding - Se há sangramento
// status.PeakDate - Data do ápice (nil se não houver)

Obter Status para Intervalo de Datas

startDate := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
endDate := time.Date(2024, 1, 31, 0, 0, 0, 0, time.UTC)
statusMap, err := fertilityService.GetFertilityStatusForDateRange(userID, startDate, endDate)
// statusMap é um map[string]*FertilityStatus, onde a chave é a data (YYYY-MM-DD)

Decisões Pendentes

  • Validação de anotação diária obrigatória: Após 15 dias, validar se há observação do dia
  • Notificações: Lembretes para registro diário (futuro)
  • Análise avançada: Padrões de ciclo, irregularidades (futuro)

Referências