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:
fertilidadefluxo 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.
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 fertilidadeinternal/services/cycle_service.go- Gestão de ciclosinternal/services/cycle_validations.go- Validaçõesinternal/services/symbol_rules.go- Regras de símbolosinternal/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 ciclointernal/models/observation.go- Modelo de observaçãointernal/models/symbol.go- Modelo de símbolointernal/models/client_profile.go- Perfil de cliente (objetivo)
Handlers¶
internal/handlers/client/fertility_status.go- Endpoint de status de fertilidadeinternal/handlers/general/observations.go- CRUD de observaçõesinternal/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¶
- FERTILITY_RULES.md - Documentação completa das regras
- API - Endpoints
- Fluxos do Sistema