diff --git a/backend/src/application/dtos/consultor_dto.py b/backend/src/application/dtos/consultor_dto.py index 61ae32e..3f9d664 100644 --- a/backend/src/application/dtos/consultor_dto.py +++ b/backend/src/application/dtos/consultor_dto.py @@ -47,6 +47,7 @@ class AvaliacaoComissaoDTO: premio: str ano: int comissao_tipo: str + nome_comissao: str @dataclass diff --git a/backend/src/application/jobs/processar_ranking.py b/backend/src/application/jobs/processar_ranking.py index 6eb1c44..cd29a7b 100644 --- a/backend/src/application/jobs/processar_ranking.py +++ b/backend/src/application/jobs/processar_ranking.py @@ -149,7 +149,8 @@ class ProcessarRankingJob: "tipo": a.tipo, "premio": a.premio, "ano": a.ano, - "comissao_tipo": a.comissao_tipo + "comissao_tipo": a.comissao_tipo, + "nome_comissao": a.nome_comissao, } for a in consultor.avaliacoes_comissao ], diff --git a/backend/src/application/use_cases/obter_ranking.py b/backend/src/application/use_cases/obter_ranking.py index b6e34df..2856686 100644 --- a/backend/src/application/use_cases/obter_ranking.py +++ b/backend/src/application/use_cases/obter_ranking.py @@ -109,6 +109,7 @@ class ObterRankingUseCase: premio=a.premio, ano=a.ano, comissao_tipo=a.comissao_tipo, + nome_comissao=a.nome_comissao, ) for a in consultor.avaliacoes_comissao ], diff --git a/backend/src/domain/entities/consultor.py b/backend/src/domain/entities/consultor.py index f8c6c3f..9afc453 100644 --- a/backend/src/domain/entities/consultor.py +++ b/backend/src/domain/entities/consultor.py @@ -44,6 +44,7 @@ class AvaliacaoComissao: premio: str ano: int comissao_tipo: str = "" + nome_comissao: str = "" @dataclass diff --git a/backend/src/infrastructure/repositories/consultor_repository_impl.py b/backend/src/infrastructure/repositories/consultor_repository_impl.py index 3a67474..0287a83 100644 --- a/backend/src/infrastructure/repositories/consultor_repository_impl.py +++ b/backend/src/infrastructure/repositories/consultor_repository_impl.py @@ -253,6 +253,7 @@ class ConsultorRepositoryImpl(ConsultorRepository): comissao = dados.get("comissao", {}) or {} comissao_tipo = comissao.get("tipo", "") if isinstance(comissao, dict) else "" + nome_comissao = comissao.get("nome", "") if isinstance(comissao, dict) else "" is_grande_premio = "grande" in nome_premio.lower() is_coordenador = "coordenador" in tipo_part.lower() or "presidente" in tipo_part.lower() @@ -268,6 +269,7 @@ class ConsultorRepositoryImpl(ConsultorRepository): premio=nome_premio, ano=ano, comissao_tipo=comissao_tipo, + nome_comissao=nome_comissao, )) return avaliacoes diff --git a/backend/src/interface/api/app.py b/backend/src/interface/api/app.py index 9ea2eff..9a95943 100644 --- a/backend/src/interface/api/app.py +++ b/backend/src/interface/api/app.py @@ -1,9 +1,11 @@ import logging import json import asyncio +from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles from contextlib import asynccontextmanager from .routes import router @@ -147,6 +149,10 @@ app.add_middleware( app.include_router(router) +static_dir = Path(__file__).parent.parent.parent.parent / "static" +if static_dir.exists(): + app.mount("/api/static", StaticFiles(directory=str(static_dir)), name="static") + @app.get("/") async def root(): diff --git a/backend/src/interface/schemas/consultor_schema.py b/backend/src/interface/schemas/consultor_schema.py index 87ec079..d9fb9bc 100644 --- a/backend/src/interface/schemas/consultor_schema.py +++ b/backend/src/interface/schemas/consultor_schema.py @@ -42,6 +42,7 @@ class AvaliacaoComissaoSchema(BaseModel): premio: str ano: int comissao_tipo: str + nome_comissao: str = "" class PremiacaoSchema(BaseModel): diff --git a/backend/static/Manual_Ranking_Consultores_CAPES.pdf b/backend/static/Manual_Ranking_Consultores_CAPES.pdf new file mode 100644 index 0000000..a82846e Binary files /dev/null and b/backend/static/Manual_Ranking_Consultores_CAPES.pdf differ diff --git a/docker-compose.yml b/docker-compose.yml index f337d65..3b66282 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,6 +22,7 @@ services: volumes: - ./backend/src:/app/src - ./backend/scripts:/app/scripts + - ./backend/static:/app/static - /etc/localtime:/etc/localtime:ro networks: - shared_network diff --git a/frontend/src/App.css b/frontend/src/App.css index bf8a134..1d6268a 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -194,6 +194,28 @@ footer p + p { font-size: 0.8rem; } +.manual-link { + display: inline-flex; + align-items: center; + gap: 0.5rem; + margin-top: 1rem; + padding: 0.6rem 1.2rem; + background: linear-gradient(145deg, var(--accent), var(--accent-2)); + color: white; + text-decoration: none; + border-radius: 8px; + font-weight: 600; + font-size: 0.9rem; + transition: all 200ms ease; + box-shadow: 0 4px 12px rgba(79, 70, 229, 0.3); +} + +.manual-link:hover { + filter: brightness(1.1); + transform: translateY(-2px); + box-shadow: 0 6px 20px rgba(79, 70, 229, 0.4); +} + .selecao-flutuante { position: fixed; bottom: 2rem; diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 1d41eca..47a939e 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -262,7 +262,7 @@ function App() { ); diff --git a/frontend/src/components/ConsultorCard.jsx b/frontend/src/components/ConsultorCard.jsx index 9902dce..4f1d348 100644 --- a/frontend/src/components/ConsultorCard.jsx +++ b/frontend/src/components/ConsultorCard.jsx @@ -388,7 +388,7 @@ const ConsultorCard = memo(({ consultor, highlight, selecionado, onToggleSelecio