Iniciativa Cidadã Independente · Transparência Parlamentar
TS356 linhas7.718 bytes

apps/web/src/lib/types.ts

SHA-256

12ab9dab5e65803afad255a17a3d0122a88d378c9054049f7d1b0442ffa5c230

Somente leiturafonte-e58fe007b6ee
export type SenadorStatus =
  | 'titular_pleno'
  | 'titular_voltou'
  | 'suplente_efetivo'
  | 'suplente_recente'
  | 'recente'
  | 'afastado'

export type Confianca = 'alta' | 'media' | 'baixa'

export type FilterPreset =
  | 'premio'
  | 'geral'
  | 'ativos'
  | 'titulares'
  | 'suplentes'
  | 'recentes'
  | 'encerrados'
  | 'afastados'

export interface IdsScore {
  senadorCod: string
  nome: string
  partido: string
  uf: string
  bloco: string
  fotoUrl?: string
  dataInicioExercicio?: string
  mesesAtivos?: number
  auxilioMoradia?: boolean
  imovelFuncional?: boolean
  idsTotal: number
  dimProdutividade: number
  dimEfetividade: number
  dimParticipacao: number
  dimFiscalizacao: number
  dimCeap: number
  dimTransparencia: number
  autoriasTotal: number
  autoriasAprovadas: number
  votacaoPresentes: number
  votacoesTotal: number
  relatoriasTotal: number
  discursosTotal: number
  apartesTotal: number
  votacoesComissaoPresentes?: number
  votacoesComissaoTotal?: number
  ceapTotalAno: number
  ceapDivulgacao?: number
  ceapEscritorio?: number
  ceapLocomocao?: number
  ceapConsultoria?: number
  ceapOutros?: number
  pctDivulgacao?: number
  escritoriosCount?: number
  cargosLideranca?: number
  cargosTitulos?: string[]
  posicao?: number
  totalSenadores?: number
  status?: SenadorStatus
  confianca?: Confianca
  idsTotalBruto?: number
  // IDS v4: coorte da legislatura + prêmio da Leg 57
  emExercicio?: boolean
  dataFimExercicio?: string
  elegivelPremio?: boolean
}

export interface SenadorAfastado {
  codigo: string
  nome: string
  partido: string
  uf: string
  fotoUrl?: string
  motivo: string
  dataInicio: string
  dataFim?: string
}

export interface RankingResponse {
  total: number
  filter?: FilterPreset
  ordenar?: string
  computedAt?: string | null
  empty?: boolean
  data: IdsScore[]
}

export interface AfastadosResponse {
  total: number
  filter: 'afastados'
  data: SenadorAfastado[]
}

export interface MetaResponse {
  partidos: string[]
  ufs: string[]
  blocos: string[]
  statuses?: string[]
  filtros?: FilterPreset[]
  ordenacao?: string[]
  premio?: {
    legislatura: number
    mesesMinimos: number
    elegiveis: number
    total: number
  }
}

// ─── Premiação Leg 57 ─────────────────────────────────────────────────────
export type RegiaoId = 'N' | 'NE' | 'CO' | 'SE' | 'S'
export type EixoPremio = 'grande_premio' | 'regional' | 'tematico'

/** Dado contado por trás da nota normalizada de uma categoria. */
export interface IndicadorBruto {
  rotulo: string
  valor: number
  unidade: string
  detalhe: string
  /** Decomposição por dimensão, presente nas categorias medidas pelo IDS. */
  composicao?: { rotulo: string; valor: number }[]
}

export interface Premiado {
  posicao: number
  senadorCod: string
  nome: string
  partido: string
  uf: string
  regiao?: RegiaoId
  fotoUrl?: string
  idsTotal: number
  /** Valor da métrica que ordena a categoria. */
  valor: number
  mesesAtivos: number
  emExercicio: boolean
  dataFimExercicio?: string
  indicador: IndicadorBruto
}

export interface CategoriaPremio {
  id: string
  eixo: EixoPremio
  titulo: string
  descricao: string
  criterio: string
  /** Peso da dimensão no IDS — só no eixo temático. */
  peso?: number
  regiao?: RegiaoId
  ufs?: string[]
  elegiveis: number
  vencedor: Premiado
  podio: Premiado[]
  /** true quando o 1º lugar empatou na métrica e caiu no critério secundário. */
  houveDesempate: boolean
}

export interface PremiacaoResponse {
  edicao: string
  legislatura: number
  congelado: boolean
  snapshot: string
  apuradoEm: string
  coorte: {
    avaliados: number
    elegiveis: number
    concorrentes: number
    mesesMinimos: number
    mesesMinimosVitoria: number
  }
  categorias: CategoriaPremio[]
}

/** Resposta de 503 quando a apuração recusa dados parciais. */
export interface PremiacaoIndisponivelResponse {
  error: string
  motivo: 'sem_snapshot' | 'snapshot_incompleto' | 'sem_elegiveis'
  detalhe: string
}

// ─── Detalhe ──────────────────────────────────────────────────────────────
export interface ListResultBase<T> {
  codigo: string
  total: number
  pagina: number
  porPagina: number
  data: T[]
  fonte: string
  atualizadoEm: string
}

export interface AutoriaItem {
  idProcesso: number
  identificacao: string
  ementa: string
  dataApresentacao: string
  sigla: string
  numero: string
  ano: string
  autoriaTexto?: string
  primeiroAutor?: boolean
  situacao?: string
  ultimoLocal?: string
  url?: string
}

export interface RelatoriaItem {
  idProcesso: number
  codigoMateria?: number
  identificacao?: string
  ementa: string
  comissaoCodigo?: number
  comissaoSigla?: string
  comissaoNome?: string
  papel: string
  dataDesignacao: string
  dataDestituicao?: string
  encerramento?: string
  url?: string
}

export interface VotacaoItem {
  codigoSessao: number
  codigoVotacao: number
  dataSessao: string
  identificacao: string
  ementa: string
  descricaoVotacao: string
  voto: string
  resultado?: string
  url?: string
}

export interface ComissaoItem {
  codigo: string
  sigla: string
  nome: string
  casa?: string
  participacao: string
  dataInicio: string
  dataFim?: string
  ativo: boolean
}

export interface CargoItem {
  cargo: string
  comissaoCodigo?: string
  comissaoSigla?: string
  comissaoNome?: string
  casa?: string
  dataInicio: string
  dataFim?: string
  ativo: boolean
}

export interface DiscursoItem {
  codigoPronunciamento: string
  data: string
  casa: string
  tipoUsoPalavra: string
  resumo: string
  urlTextoIntegral?: string
  urlTextoBinario?: string
}

export interface DespesaItem {
  id: number
  ano: number
  mes: number
  data?: string
  tipoDocumento: string
  tipoDespesa: string
  cpfCnpj: string
  fornecedor: string
  documento?: string
  detalhamento?: string
  valor: number
}

export interface DespesasResumo {
  totalAno: number
  totalTransacoes: number
  porTipo: Array<{ tipo: string; total: number; transacoes: number }>
  porMes: Array<{ mes: number; total: number }>
  topFornecedores: Array<{ nome: string; cpfCnpj: string; total: number; transacoes: number }>
}

export interface DespesasResponse extends ListResultBase<DespesaItem> {
  resumo: DespesasResumo
}

export interface PerfilSenador {
  codigo: string
  nome: string
  partido?: string
  uf?: string
  email?: string
  telefones?: string[]
  fotoUrl?: string
  paginaSenado?: string
  endereco?: string
  mandatos: Array<{
    legislatura: string
    inicio: string
    fim?: string
    participacao: string
    partido?: string
    suplentes?: Array<{ descricao: string; nome: string }>
  }>
  filiacoes: Array<{ partido: string; dataFiliacao: string; dataDesfiliacao?: string }>
  profissoes: string[]
  formacao: Array<{ nivel: string; curso: string; instituicao?: string }>
  fonte: string
  atualizadoEm: string
}

export type AbaSenador =
  | 'resumo'
  | 'autorias'
  | 'relatorias'
  | 'votacoes'
  | 'comissoes'
  | 'cargos'
  | 'discursos'
  | 'apartes'
  | 'despesas'
  | 'perfil'

export interface CeapMes {
  mes: number
  ano: number
  valorTotal: number
}

export interface CeapResponse {
  codigo: string
  ano: number
  meses: CeapMes[]
}

export type SortKey = keyof Pick<
  IdsScore,
  | 'idsTotal'
  | 'dimProdutividade'
  | 'dimEfetividade'
  | 'dimParticipacao'
  | 'dimFiscalizacao'
  | 'dimCeap'
  | 'dimTransparencia'
  | 'nome'
  | 'partido'
  | 'uf'
>

export type SortDir = 'asc' | 'desc'