feat: Sistema de Ranking de Consultores CAPES - versão inicial
Backend (FastAPI + DDD):
- Arquitetura DDD com camadas Domain, Application, Infrastructure, Interface
- Integração com Elasticsearch (ATUACAPES) para dados de consultores
- Integração com Oracle (SUCUPIRA_PAINEL) para coordenações PPG
- Cálculo dos 4 componentes de pontuação (A, B, C, D)
- Cache em memória para otimização de performance
- API REST com endpoints /ranking, /ranking/detalhado, /consultor/{id}
Frontend (React + Vite):
- Interface responsiva com cards expansíveis
- Visualização detalhada de pontuação por componente
- Filtro por quantidade de consultores (Top 10, 50, 100, etc)
Docker:
- docker-compose com shared_network externa
- Backend com Oracle Instant Client
- Frontend com Vite dev server
This commit is contained in:
23
backend/src/domain/value_objects/periodo.py
Normal file
23
backend/src/domain/value_objects/periodo.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class Periodo:
|
||||
inicio: datetime
|
||||
fim: Optional[datetime] = None
|
||||
|
||||
@property
|
||||
def ativo(self) -> bool:
|
||||
return self.fim is None
|
||||
|
||||
@property
|
||||
def anos_decorridos(self) -> float:
|
||||
fim = self.fim if self.fim else datetime.now()
|
||||
dias = (fim - self.inicio).days
|
||||
return round(dias / 365.25, 1)
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
if self.fim and self.fim < self.inicio:
|
||||
raise ValueError("Data de fim não pode ser anterior à data de início")
|
||||
Reference in New Issue
Block a user