Reimplementa sistema de ranking com novos critérios V2
Mudanças principais: - Substitui 4 Componentes (A,B,C,D) por 3 Blocos (A,C,D) - Remove Componente B (Coordenação PPG = 0 pts no V1) - Adiciona novos tipos de atuação do Elasticsearch - Implementa critérios de pontuação com tetos individuais Bloco A - Coordenação CAPES: - CA (max 450), CAJ (max 370), CAJ_MP (max 315), CAM (max 280) - Calcula base + tempo + bônus atualidade + bônus retorno Bloco C - Consultoria: - CONS_ATIVO (base 150), CONS_HIST (base 100), CONS_FALECIDO (base 100) - Bônus continuidade: 3anos=+5, 5anos=+10, 8anos=+15 - Bônus retorno: +15 Bloco D - Premiações/Avaliações: - Inscrições (INSC_AUTOR, INSC_INST) - Avaliações (AVAL_COMIS_PREMIO, AVAL_COMIS_GP) - Coordenações (COORD_COMIS_PREMIO, COORD_COMIS_GP) - Premiações (PREMIACAO, PREMIACAO_GP, MENCAO) - Bolsas CNPQ, Participações, Orientações, Membros de Banca Frontend: - Header, ConsultorCard, CompararModal atualizados para 3 blocos - API service atualizado para nova estrutura de dados
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
from dataclasses import dataclass, asdict
|
||||
from typing import List, Optional, Dict, Any
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -13,6 +12,7 @@ class PeriodoDTO:
|
||||
|
||||
@dataclass
|
||||
class CoordenacaoCapesDTO:
|
||||
codigo: str
|
||||
tipo: str
|
||||
area_avaliacao: str
|
||||
periodo: PeriodoDTO
|
||||
@@ -21,55 +21,94 @@ class CoordenacaoCapesDTO:
|
||||
|
||||
|
||||
@dataclass
|
||||
class CoordenacaoProgramaDTO:
|
||||
id_programa: int
|
||||
nome_programa: str
|
||||
codigo_programa: str
|
||||
nota_ppg: str
|
||||
modalidade: str
|
||||
area_avaliacao: str
|
||||
class ConsultoriaDTO:
|
||||
codigo: str
|
||||
situacao: str
|
||||
periodo: PeriodoDTO
|
||||
areas: List[str]
|
||||
anos_consecutivos: int
|
||||
retornos: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class ConsultoriaDTO:
|
||||
total_eventos: int
|
||||
eventos_recentes: int
|
||||
primeiro_evento: str
|
||||
ultimo_evento: str
|
||||
continuidade: int
|
||||
areas: List[str]
|
||||
class InscricaoDTO:
|
||||
codigo: str
|
||||
tipo: str
|
||||
premio: str
|
||||
ano: int
|
||||
situacao: str
|
||||
anos_completos: int
|
||||
anos_consecutivos: int
|
||||
retornos: int
|
||||
vezes_responsavel: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class AvaliacaoComissaoDTO:
|
||||
codigo: str
|
||||
tipo: str
|
||||
premio: str
|
||||
ano: int
|
||||
comissao_tipo: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class PremiacaoDTO:
|
||||
codigo: str
|
||||
tipo: str
|
||||
nome_premio: str
|
||||
ano: int
|
||||
pontos: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class ComponentePontuacaoDTO:
|
||||
class BolsaCNPQDTO:
|
||||
codigo: str
|
||||
nivel: str
|
||||
area: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class ParticipacaoDTO:
|
||||
codigo: str
|
||||
tipo: str
|
||||
descricao: str
|
||||
ano: Optional[int]
|
||||
|
||||
|
||||
@dataclass
|
||||
class OrientacaoDTO:
|
||||
codigo: str
|
||||
tipo: str
|
||||
nivel: str
|
||||
ano: Optional[int]
|
||||
|
||||
|
||||
@dataclass
|
||||
class MembroBancaDTO:
|
||||
codigo: str
|
||||
tipo: str
|
||||
nivel: str
|
||||
ano: Optional[int]
|
||||
|
||||
|
||||
@dataclass
|
||||
class PontuacaoAtuacaoDTO:
|
||||
codigo: str
|
||||
base: int
|
||||
tempo: int
|
||||
extras: int
|
||||
bonus: int
|
||||
retorno: int
|
||||
total: int
|
||||
quantidade: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class PontuacaoBlocoDTO:
|
||||
bloco: str
|
||||
total: int
|
||||
atuacoes: List[PontuacaoAtuacaoDTO]
|
||||
|
||||
|
||||
@dataclass
|
||||
class PontuacaoCompletaDTO:
|
||||
componente_a: ComponentePontuacaoDTO
|
||||
componente_b: ComponentePontuacaoDTO
|
||||
componente_c: ComponentePontuacaoDTO
|
||||
componente_d: ComponentePontuacaoDTO
|
||||
bloco_a: PontuacaoBlocoDTO
|
||||
bloco_c: PontuacaoBlocoDTO
|
||||
bloco_d: PontuacaoBlocoDTO
|
||||
pontuacao_total: int
|
||||
|
||||
|
||||
@@ -81,6 +120,9 @@ class ConsultorResumoDTO:
|
||||
ativo: bool
|
||||
veterano: bool
|
||||
pontuacao_total: int
|
||||
bloco_a: int
|
||||
bloco_c: int
|
||||
bloco_d: int
|
||||
rank: Optional[int] = None
|
||||
|
||||
|
||||
@@ -93,9 +135,14 @@ class ConsultorDetalhadoDTO:
|
||||
ativo: bool
|
||||
veterano: bool
|
||||
coordenacoes_capes: List[CoordenacaoCapesDTO]
|
||||
coordenacoes_programas: List[CoordenacaoProgramaDTO]
|
||||
consultoria: Optional[ConsultoriaDTO]
|
||||
inscricoes: List[InscricaoDTO]
|
||||
avaliacoes_comissao: List[AvaliacaoComissaoDTO]
|
||||
premiacoes: List[PremiacaoDTO]
|
||||
bolsas_cnpq: List[BolsaCNPQDTO]
|
||||
participacoes: List[ParticipacaoDTO]
|
||||
orientacoes: List[OrientacaoDTO]
|
||||
membros_banca: List[MembroBancaDTO]
|
||||
pontuacao: PontuacaoCompletaDTO
|
||||
rank: Optional[int] = None
|
||||
|
||||
|
||||
@@ -22,19 +22,10 @@ class ProcessarRankingJob:
|
||||
self.oracle_remote_client = oracle_remote_client
|
||||
self.oracle_local_client = oracle_local_client
|
||||
self.ranking_repo = ranking_repo
|
||||
# Para acelerar a carga principal, não buscamos PPG aqui (Componente B vem depois)
|
||||
self.consultor_repo = ConsultorRepositoryImpl(es_client, oracle_client=None)
|
||||
self.calculador = CalculadorPontuacao()
|
||||
|
||||
async def executar(self, limpar_antes: bool = True) -> Dict[str, Any]:
|
||||
"""
|
||||
Executa o processamento completo do ranking:
|
||||
1. Limpa tabela (se solicitado)
|
||||
2. Scroll por todos os documentos ES
|
||||
3. Para cada batch: calcula pontuação e insere no Oracle
|
||||
4. Atualiza posições
|
||||
5. Retorna estatísticas
|
||||
"""
|
||||
if job_status.is_running:
|
||||
raise RuntimeError("Job já está em execução")
|
||||
|
||||
@@ -73,13 +64,6 @@ class ProcessarRankingJob:
|
||||
raise RuntimeError(f"Erro ao processar ranking: {e}")
|
||||
|
||||
async def _processar_batch(self, docs: list, progress: dict) -> None:
|
||||
"""
|
||||
Processa um batch de documentos:
|
||||
1. Constrói consultores
|
||||
2. Calcula pontuação
|
||||
3. Insere no Oracle
|
||||
4. Atualiza status
|
||||
"""
|
||||
consultores_para_inserir = []
|
||||
|
||||
for doc in docs:
|
||||
@@ -90,10 +74,10 @@ class ProcessarRankingJob:
|
||||
"id_pessoa": consultor.id_pessoa,
|
||||
"nome": consultor.nome,
|
||||
"pontuacao_total": consultor.pontuacao_total,
|
||||
"componente_a": consultor.pontuacao.componente_a.total,
|
||||
"componente_b": consultor.pontuacao.componente_b.total,
|
||||
"componente_c": consultor.pontuacao.componente_c.total,
|
||||
"componente_d": consultor.pontuacao.componente_d.total,
|
||||
"componente_a": consultor.pontuacao_bloco_a,
|
||||
"componente_b": 0,
|
||||
"componente_c": consultor.pontuacao_bloco_c,
|
||||
"componente_d": consultor.pontuacao_bloco_d,
|
||||
"ativo": consultor.ativo,
|
||||
"anos_atuacao": consultor.anos_atuacao,
|
||||
"detalhes": self._gerar_json_detalhes(consultor)
|
||||
@@ -117,15 +101,13 @@ class ProcessarRankingJob:
|
||||
)
|
||||
|
||||
def _gerar_json_detalhes(self, consultor) -> dict:
|
||||
"""
|
||||
Gera JSON com detalhes completos do consultor para armazenar no CLOB.
|
||||
"""
|
||||
return {
|
||||
"id_pessoa": consultor.id_pessoa,
|
||||
"nome": consultor.nome,
|
||||
"cpf": consultor.cpf,
|
||||
"coordenacoes_capes": [
|
||||
{
|
||||
"codigo": c.codigo,
|
||||
"tipo": c.tipo,
|
||||
"area_avaliacao": c.area_avaliacao,
|
||||
"inicio": c.periodo.inicio.isoformat() if c.periodo.inicio else None,
|
||||
@@ -134,37 +116,78 @@ class ProcessarRankingJob:
|
||||
}
|
||||
for c in consultor.coordenacoes_capes
|
||||
],
|
||||
"coordenacoes_programas": [
|
||||
{
|
||||
"id_programa": c.id_programa,
|
||||
"nome_programa": c.nome_programa,
|
||||
"codigo_programa": c.codigo_programa,
|
||||
"nota_ppg": c.nota_ppg,
|
||||
"modalidade": c.modalidade,
|
||||
"area_avaliacao": c.area_avaliacao,
|
||||
"inicio": c.periodo.inicio.isoformat() if c.periodo.inicio else None,
|
||||
"fim": c.periodo.fim.isoformat() if c.periodo.fim else None
|
||||
}
|
||||
for c in consultor.coordenacoes_programas
|
||||
],
|
||||
"consultoria": {
|
||||
"total_eventos": consultor.consultoria.total_eventos,
|
||||
"eventos_recentes": consultor.consultoria.eventos_recentes,
|
||||
"continuidade": consultor.consultoria.continuidade,
|
||||
"anos_consecutivos": consultor.consultoria.anos_consecutivos,
|
||||
"codigo": consultor.consultoria.codigo,
|
||||
"situacao": consultor.consultoria.situacao,
|
||||
"anos_completos": consultor.consultoria.anos_completos,
|
||||
"inicio": consultor.consultoria.periodo.inicio.isoformat() if consultor.consultoria.periodo.inicio else None,
|
||||
"fim": consultor.consultoria.periodo.fim.isoformat() if consultor.consultoria.periodo.fim else None,
|
||||
"areas": consultor.consultoria.areas,
|
||||
"vezes_responsavel": consultor.consultoria.vezes_responsavel
|
||||
"anos_consecutivos": consultor.consultoria.anos_consecutivos,
|
||||
"retornos": consultor.consultoria.retornos
|
||||
} if consultor.consultoria else None,
|
||||
"inscricoes": [
|
||||
{
|
||||
"codigo": i.codigo,
|
||||
"tipo": i.tipo,
|
||||
"premio": i.premio,
|
||||
"ano": i.ano,
|
||||
"situacao": i.situacao
|
||||
}
|
||||
for i in consultor.inscricoes
|
||||
],
|
||||
"avaliacoes_comissao": [
|
||||
{
|
||||
"codigo": a.codigo,
|
||||
"tipo": a.tipo,
|
||||
"premio": a.premio,
|
||||
"ano": a.ano,
|
||||
"comissao_tipo": a.comissao_tipo
|
||||
}
|
||||
for a in consultor.avaliacoes_comissao
|
||||
],
|
||||
"premiacoes": [
|
||||
{
|
||||
"codigo": p.codigo,
|
||||
"tipo": p.tipo,
|
||||
"nome_premio": p.nome_premio,
|
||||
"ano": p.ano,
|
||||
"pontos": p.pontos
|
||||
"ano": p.ano
|
||||
}
|
||||
for p in consultor.premiacoes
|
||||
],
|
||||
"pontuacao": consultor.pontuacao.detalhamento
|
||||
"bolsas_cnpq": [
|
||||
{
|
||||
"codigo": b.codigo,
|
||||
"nivel": b.nivel,
|
||||
"area": b.area
|
||||
}
|
||||
for b in consultor.bolsas_cnpq
|
||||
],
|
||||
"participacoes": [
|
||||
{
|
||||
"codigo": p.codigo,
|
||||
"tipo": p.tipo,
|
||||
"descricao": p.descricao,
|
||||
"ano": p.ano
|
||||
}
|
||||
for p in consultor.participacoes
|
||||
],
|
||||
"orientacoes": [
|
||||
{
|
||||
"codigo": o.codigo,
|
||||
"tipo": o.tipo,
|
||||
"nivel": o.nivel,
|
||||
"ano": o.ano
|
||||
}
|
||||
for o in consultor.orientacoes
|
||||
],
|
||||
"membros_banca": [
|
||||
{
|
||||
"codigo": m.codigo,
|
||||
"tipo": m.tipo,
|
||||
"nivel": m.nivel,
|
||||
"ano": m.ano
|
||||
}
|
||||
for m in consultor.membros_banca
|
||||
],
|
||||
"pontuacao": consultor.pontuacao.to_dict() if consultor.pontuacao else None
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
from typing import List, Optional
|
||||
from datetime import datetime
|
||||
|
||||
from ...domain.repositories.consultor_repository import ConsultorRepository
|
||||
from ...domain.entities.consultor import Consultor
|
||||
@@ -8,10 +7,16 @@ from ..dtos.consultor_dto import (
|
||||
ConsultorDetalhadoDTO,
|
||||
PeriodoDTO,
|
||||
CoordenacaoCapesDTO,
|
||||
CoordenacaoProgramaDTO,
|
||||
ConsultoriaDTO,
|
||||
InscricaoDTO,
|
||||
AvaliacaoComissaoDTO,
|
||||
PremiacaoDTO,
|
||||
ComponentePontuacaoDTO,
|
||||
BolsaCNPQDTO,
|
||||
ParticipacaoDTO,
|
||||
OrientacaoDTO,
|
||||
MembroBancaDTO,
|
||||
PontuacaoAtuacaoDTO,
|
||||
PontuacaoBlocoDTO,
|
||||
PontuacaoCompletaDTO,
|
||||
)
|
||||
|
||||
@@ -33,6 +38,9 @@ class ObterRankingUseCase:
|
||||
ativo=c.ativo,
|
||||
veterano=c.veterano,
|
||||
pontuacao_total=c.pontuacao_total,
|
||||
bloco_a=c.pontuacao_bloco_a,
|
||||
bloco_c=c.pontuacao_bloco_c,
|
||||
bloco_d=c.pontuacao_bloco_d,
|
||||
rank=idx + 1,
|
||||
)
|
||||
for idx, c in enumerate(consultores)
|
||||
@@ -42,7 +50,6 @@ class ObterRankingUseCase:
|
||||
self, limite: int = 100, componente: Optional[str] = None
|
||||
) -> List[ConsultorDetalhadoDTO]:
|
||||
consultores = await self.repository.buscar_ranking(limite=limite, componente=componente)
|
||||
|
||||
return [self._converter_para_dto_detalhado(c, idx + 1) for idx, c in enumerate(consultores)]
|
||||
|
||||
def _converter_para_dto_detalhado(
|
||||
@@ -57,10 +64,11 @@ class ObterRankingUseCase:
|
||||
veterano=consultor.veterano,
|
||||
coordenacoes_capes=[
|
||||
CoordenacaoCapesDTO(
|
||||
codigo=cc.codigo,
|
||||
tipo=cc.tipo,
|
||||
area_avaliacao=cc.area_avaliacao,
|
||||
periodo=PeriodoDTO(
|
||||
inicio=cc.periodo.inicio.isoformat(),
|
||||
inicio=cc.periodo.inicio.isoformat() if cc.periodo.inicio else "",
|
||||
fim=cc.periodo.fim.isoformat() if cc.periodo.fim else None,
|
||||
ativo=cc.periodo.ativo,
|
||||
anos_decorridos=cc.periodo.anos_decorridos,
|
||||
@@ -70,79 +78,128 @@ class ObterRankingUseCase:
|
||||
)
|
||||
for cc in consultor.coordenacoes_capes
|
||||
],
|
||||
coordenacoes_programas=[
|
||||
CoordenacaoProgramaDTO(
|
||||
id_programa=cp.id_programa,
|
||||
nome_programa=cp.nome_programa,
|
||||
codigo_programa=cp.codigo_programa,
|
||||
nota_ppg=cp.nota_ppg,
|
||||
modalidade=cp.modalidade,
|
||||
area_avaliacao=cp.area_avaliacao,
|
||||
periodo=PeriodoDTO(
|
||||
inicio=cp.periodo.inicio.isoformat(),
|
||||
fim=cp.periodo.fim.isoformat() if cp.periodo.fim else None,
|
||||
ativo=cp.periodo.ativo,
|
||||
anos_decorridos=cp.periodo.anos_decorridos,
|
||||
),
|
||||
)
|
||||
for cp in consultor.coordenacoes_programas
|
||||
],
|
||||
consultoria=ConsultoriaDTO(
|
||||
total_eventos=consultor.consultoria.total_eventos,
|
||||
eventos_recentes=consultor.consultoria.eventos_recentes,
|
||||
primeiro_evento=consultor.consultoria.primeiro_evento.isoformat(),
|
||||
ultimo_evento=consultor.consultoria.ultimo_evento.isoformat(),
|
||||
continuidade=consultor.consultoria.continuidade,
|
||||
areas=consultor.consultoria.areas,
|
||||
codigo=consultor.consultoria.codigo,
|
||||
situacao=consultor.consultoria.situacao,
|
||||
anos_completos=consultor.consultoria.anos_completos,
|
||||
periodo=PeriodoDTO(
|
||||
inicio=consultor.consultoria.periodo.inicio.isoformat() if consultor.consultoria.periodo.inicio else "",
|
||||
fim=consultor.consultoria.periodo.fim.isoformat() if consultor.consultoria.periodo.fim else None,
|
||||
ativo=consultor.consultoria.periodo.ativo,
|
||||
anos_decorridos=consultor.consultoria.periodo.anos_decorridos,
|
||||
),
|
||||
areas=consultor.consultoria.areas,
|
||||
anos_consecutivos=consultor.consultoria.anos_consecutivos,
|
||||
retornos=consultor.consultoria.retornos,
|
||||
vezes_responsavel=consultor.consultoria.vezes_responsavel,
|
||||
)
|
||||
if consultor.consultoria
|
||||
else None,
|
||||
) if consultor.consultoria else None,
|
||||
inscricoes=[
|
||||
InscricaoDTO(
|
||||
codigo=i.codigo,
|
||||
tipo=i.tipo,
|
||||
premio=i.premio,
|
||||
ano=i.ano,
|
||||
situacao=i.situacao,
|
||||
)
|
||||
for i in consultor.inscricoes
|
||||
],
|
||||
avaliacoes_comissao=[
|
||||
AvaliacaoComissaoDTO(
|
||||
codigo=a.codigo,
|
||||
tipo=a.tipo,
|
||||
premio=a.premio,
|
||||
ano=a.ano,
|
||||
comissao_tipo=a.comissao_tipo,
|
||||
)
|
||||
for a in consultor.avaliacoes_comissao
|
||||
],
|
||||
premiacoes=[
|
||||
PremiacaoDTO(
|
||||
codigo=p.codigo,
|
||||
tipo=p.tipo,
|
||||
nome_premio=p.nome_premio,
|
||||
ano=p.ano,
|
||||
pontos=p.pontos,
|
||||
)
|
||||
for p in consultor.premiacoes
|
||||
],
|
||||
bolsas_cnpq=[
|
||||
BolsaCNPQDTO(
|
||||
codigo=b.codigo,
|
||||
nivel=b.nivel,
|
||||
area=b.area,
|
||||
)
|
||||
for b in consultor.bolsas_cnpq
|
||||
],
|
||||
participacoes=[
|
||||
ParticipacaoDTO(
|
||||
codigo=p.codigo,
|
||||
tipo=p.tipo,
|
||||
descricao=p.descricao,
|
||||
ano=p.ano,
|
||||
)
|
||||
for p in consultor.participacoes
|
||||
],
|
||||
orientacoes=[
|
||||
OrientacaoDTO(
|
||||
codigo=o.codigo,
|
||||
tipo=o.tipo,
|
||||
nivel=o.nivel,
|
||||
ano=o.ano,
|
||||
)
|
||||
for o in consultor.orientacoes
|
||||
],
|
||||
membros_banca=[
|
||||
MembroBancaDTO(
|
||||
codigo=m.codigo,
|
||||
tipo=m.tipo,
|
||||
nivel=m.nivel,
|
||||
ano=m.ano,
|
||||
)
|
||||
for m in consultor.membros_banca
|
||||
],
|
||||
pontuacao=PontuacaoCompletaDTO(
|
||||
componente_a=ComponentePontuacaoDTO(
|
||||
base=consultor.pontuacao.componente_a.base,
|
||||
tempo=consultor.pontuacao.componente_a.tempo,
|
||||
extras=consultor.pontuacao.componente_a.extras,
|
||||
bonus=consultor.pontuacao.componente_a.bonus,
|
||||
retorno=consultor.pontuacao.componente_a.retorno,
|
||||
total=consultor.pontuacao.componente_a.total,
|
||||
bloco_a=PontuacaoBlocoDTO(
|
||||
bloco="A",
|
||||
total=consultor.pontuacao.bloco_a.total,
|
||||
atuacoes=[
|
||||
PontuacaoAtuacaoDTO(
|
||||
codigo=a.codigo,
|
||||
base=a.base,
|
||||
tempo=a.tempo,
|
||||
bonus=a.bonus,
|
||||
total=a.total,
|
||||
quantidade=a.quantidade,
|
||||
)
|
||||
for a in consultor.pontuacao.bloco_a.atuacoes
|
||||
],
|
||||
),
|
||||
componente_b=ComponentePontuacaoDTO(
|
||||
base=consultor.pontuacao.componente_b.base,
|
||||
tempo=consultor.pontuacao.componente_b.tempo,
|
||||
extras=consultor.pontuacao.componente_b.extras,
|
||||
bonus=consultor.pontuacao.componente_b.bonus,
|
||||
retorno=0,
|
||||
total=consultor.pontuacao.componente_b.total,
|
||||
bloco_c=PontuacaoBlocoDTO(
|
||||
bloco="C",
|
||||
total=consultor.pontuacao.bloco_c.total,
|
||||
atuacoes=[
|
||||
PontuacaoAtuacaoDTO(
|
||||
codigo=a.codigo,
|
||||
base=a.base,
|
||||
tempo=a.tempo,
|
||||
bonus=a.bonus,
|
||||
total=a.total,
|
||||
quantidade=a.quantidade,
|
||||
)
|
||||
for a in consultor.pontuacao.bloco_c.atuacoes
|
||||
],
|
||||
),
|
||||
componente_c=ComponentePontuacaoDTO(
|
||||
base=consultor.pontuacao.componente_c.base,
|
||||
tempo=consultor.pontuacao.componente_c.tempo,
|
||||
extras=consultor.pontuacao.componente_c.extras,
|
||||
bonus=consultor.pontuacao.componente_c.bonus,
|
||||
retorno=0,
|
||||
total=consultor.pontuacao.componente_c.total,
|
||||
),
|
||||
componente_d=ComponentePontuacaoDTO(
|
||||
base=consultor.pontuacao.componente_d.base,
|
||||
tempo=consultor.pontuacao.componente_d.tempo,
|
||||
extras=consultor.pontuacao.componente_d.extras,
|
||||
bonus=consultor.pontuacao.componente_d.bonus,
|
||||
retorno=0,
|
||||
total=consultor.pontuacao.componente_d.total,
|
||||
bloco_d=PontuacaoBlocoDTO(
|
||||
bloco="D",
|
||||
total=consultor.pontuacao.bloco_d.total,
|
||||
atuacoes=[
|
||||
PontuacaoAtuacaoDTO(
|
||||
codigo=a.codigo,
|
||||
base=a.base,
|
||||
tempo=a.tempo,
|
||||
bonus=a.bonus,
|
||||
total=a.total,
|
||||
quantidade=a.quantidade,
|
||||
)
|
||||
for a in consultor.pontuacao.bloco_d.atuacoes
|
||||
],
|
||||
),
|
||||
pontuacao_total=consultor.pontuacao.total,
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user