Apuração de Resultado

Endpoints da WebApiAlcance para gerenciar apurações de resultado - o cálculo do resultado (lucro/prejuízo) do período e do tributo devido por cliente (PIS, COFINS, ISS, IRPJ, CSLL). Cada apuração registra base de cálculo, alíquota aplicada, valor apurado, retenções e valor a recolher para um período (mensal, trimestral ou anual). Cobrem criação, fechamento (transição aberto → fechado), listagem por usuário autenticado, listagem por cliente, detalhamento por ID, atualização e exclusão.

Todos os endpoints exigem autenticação. Veja Autenticação para o fluxo de API Key. O Swagger oficial está em api.contabilidadealcance.com.br/docs.

Base path

/api/v1/apuracao-resultado

Escopos necessários

  • apuracao_resultado:read - listagem por usuário, listagem por cliente e detalhamento
  • apuracao_resultado:write - criação, fechamento, atualização e exclusão

O escopo é derivado da rota: o prefixo /apuracao-resultado vira o recurso apuracao_resultado (hífen → underscore), e o método HTTP define a ação (read para GET, write para POST/PUT/DELETE).

Endpoints

POST /apuracao-resultado/

Cria uma nova apuração de resultado vinculada ao usuário autenticado. O id_usuario_created vem do usuário logado e o campo status não é aceito no corpo - toda apuração nasce "aberto".

Parâmetros

Este endpoint não recebe parâmetros de rota ou query - os dados vão no corpo da requisição (ApuracaoResultadoCreate): id_customer, tributo, periodo, tipo_periodo, base_calculo, aliquota_aplicada, valor_apurado e valor_a_recolher obrigatórios; regime_apuracao, valor_retido, houve_majoracao, detalhes e status_conferencia opcionais.

Request

{
  "id_customer": 1,
  "tributo": "IRPJ",
  "periodo": "2026-Q2",
  "tipo_periodo": "trimestral",
  "regime_apuracao": "presumido",
  "base_calculo": "100000.00",
  "aliquota_aplicada": "1.6500",
  "valor_apurado": "1650.00",
  "valor_retido": "0",
  "valor_a_recolher": "1650.00",
  "houve_majoracao": false
}

Response 201 Created

{
  "success": true,
  "message": "Apuração criada com sucesso!",
  "data": {
    "id": 1,
    "id_customer": 1,
    "tributo": "IRPJ",
    "periodo": "2026-Q2",
    "tipo_periodo": "trimestral",
    "regime_apuracao": "presumido",
    "base_calculo": "100000.00",
    "aliquota_aplicada": "1.6500",
    "valor_apurado": "1650.00",
    "valor_retido": "0",
    "valor_a_recolher": "1650.00",
    "houve_majoracao": false,
    "detalhes": null,
    "status_conferencia": null,
    "status": "aberto",
    "data_fechamento": null,
    "id_usuario_created": 42,
    "created_at": "2026-07-08T09:15:00-03:00",
    "updated_at": "2026-07-08T09:15:00-03:00"
  }
}

Cliente inexistente retorna 404 Not Found; combinação (cliente, tributo, período, tipo_periodo) já existente retorna 409 Conflict; validações de campo retornam 422 Unprocessable Entity. Escopo: apuracao_resultado:write

POST /apuracao-resultado/fechar/{apuracao_id}

Fecha a apuração, setando status='fechado' e preenchendo data_fechamento. É a única porta para transitar status de "aberto" para "fechado". Após fechada, a apuração fica imutável: PUT e DELETE passam a devolver 422, e fechar novamente também retorna 422.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
apuracao_idintpathsimID interno da apuração

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Apuração fechada com sucesso!",
  "data": {
    "id": 1,
    "id_customer": 1,
    "tributo": "IRPJ",
    "periodo": "2026-Q2",
    "tipo_periodo": "trimestral",
    "regime_apuracao": "presumido",
    "base_calculo": "100000.00",
    "aliquota_aplicada": "1.6500",
    "valor_apurado": "1650.00",
    "valor_retido": "0",
    "valor_a_recolher": "1650.00",
    "houve_majoracao": false,
    "detalhes": null,
    "status_conferencia": null,
    "status": "fechado",
    "data_fechamento": "2026-07-08T14:30:00-03:00",
    "id_usuario_created": 42,
    "created_at": "2026-07-08T09:15:00-03:00",
    "updated_at": "2026-07-08T14:30:00-03:00"
  }
}

Escopo: apuracao_resultado:write

GET /apuracao-resultado/by-user

Lista todas as apurações do usuário autenticado, com filtros opcionais e paginação. Lista vazia é um estado válido - sempre retorna 200 OK, inclusive com data: [] e a mensagem "Nenhuma apuração encontrada.".

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
periodostrquerynãoFiltro por período exato (formato depende de tipo_periodo)
tipo_periodostrquerynãoFiltro por tipo de período: mensal, trimestral, anual
statusstrquerynãoFiltro por status: aberto, fechado
pageint >= 1querynãoPágina (1-based)
per_pageint 1..500querynãoItens por página

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Apurações recuperadas com sucesso!",
  "data": [
    {
      "id": 1,
      "id_customer": 1,
      "tributo": "IRPJ",
      "periodo": "2026-Q2",
      "tipo_periodo": "trimestral",
      "regime_apuracao": "presumido",
      "base_calculo": "100000.00",
      "aliquota_aplicada": "1.6500",
      "valor_apurado": "1650.00",
      "valor_retido": "0",
      "valor_a_recolher": "1650.00",
      "houve_majoracao": false,
      "detalhes": null,
      "status_conferencia": null,
      "status": "aberto",
      "data_fechamento": null,
      "id_usuario_created": 42,
      "created_at": "2026-07-08T09:15:00-03:00",
      "updated_at": "2026-07-08T09:15:00-03:00"
    }
  ]
}

Escopo: apuracao_resultado:read

GET /apuracao-resultado/by-customer/{customer_id}

Lista as apurações de um cliente, opcionalmente filtradas por tributo, período, tipo de período e status, com paginação. É o caso de uso primário do front. Quando o cliente não é acessível, o service devolve erro mapeado (403/404).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
customer_idintpathsimID interno do cliente
tributostrquerynãoFiltro por tributo: PIS, COFINS, ISS, IRPJ, CSLL
periodostrquerynãoFiltro por período exato
tipo_periodostrquerynãoFiltro por tipo de período: mensal, trimestral, anual
statusstrquerynãoFiltro por status: aberto, fechado
pageint >= 1querynãoPágina (1-based)
per_pageint 1..500querynãoItens por página

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Apurações recuperadas com sucesso!",
  "data": [
    {
      "id": 1,
      "id_customer": 1,
      "tributo": "IRPJ",
      "periodo": "2026-Q2",
      "tipo_periodo": "trimestral",
      "regime_apuracao": "presumido",
      "base_calculo": "100000.00",
      "aliquota_aplicada": "1.6500",
      "valor_apurado": "1650.00",
      "valor_retido": "0",
      "valor_a_recolher": "1650.00",
      "houve_majoracao": false,
      "detalhes": null,
      "status_conferencia": null,
      "status": "aberto",
      "data_fechamento": null,
      "id_usuario_created": 42,
      "created_at": "2026-07-08T09:15:00-03:00",
      "updated_at": "2026-07-08T09:15:00-03:00"
    }
  ]
}

Escopo: apuracao_resultado:read

GET /apuracao-resultado/{apuracao_id}

Detalha uma apuração pelo ID inteiro. Quando não encontrada, retorna 404 Not Found.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
apuracao_idintpathsimID interno da apuração

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Apuração encontrada!",
  "data": {
    "id": 1,
    "id_customer": 1,
    "tributo": "IRPJ",
    "periodo": "2026-Q2",
    "tipo_periodo": "trimestral",
    "regime_apuracao": "presumido",
    "base_calculo": "100000.00",
    "aliquota_aplicada": "1.6500",
    "valor_apurado": "1650.00",
    "valor_retido": "0",
    "valor_a_recolher": "1650.00",
    "houve_majoracao": false,
    "detalhes": null,
    "status_conferencia": null,
    "status": "aberto",
    "data_fechamento": null,
    "id_usuario_created": 42,
    "created_at": "2026-07-08T09:15:00-03:00",
    "updated_at": "2026-07-08T09:15:00-03:00"
  }
}

Escopo: apuracao_resultado:read

PUT /apuracao-resultado/{apuracao_id}

Atualiza uma apuração existente. O body é um ApuracaoResultadoUpdate com campos parciais - somente o que vier preenchido é alterado. Só é permitido quando status='aberto'; apurações fechadas devolvem 422. Campos como id_customer, id, status, data_fechamento e timestamps são imutáveis e não são aceitos.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
apuracao_idintpathsimID interno da apuração

Request (ApuracaoResultadoUpdate - todos os campos opcionais)

{
  "valor_retido": "150.00",
  "valor_a_recolher": "1500.00",
  "status_conferencia": "em_andamento"
}

Response 200 OK

{
  "success": true,
  "message": "Apuração atualizada!",
  "data": {
    "id": 1,
    "id_customer": 1,
    "tributo": "IRPJ",
    "periodo": "2026-Q2",
    "tipo_periodo": "trimestral",
    "regime_apuracao": "presumido",
    "base_calculo": "100000.00",
    "aliquota_aplicada": "1.6500",
    "valor_apurado": "1650.00",
    "valor_retido": "150.00",
    "valor_a_recolher": "1500.00",
    "houve_majoracao": false,
    "detalhes": null,
    "status_conferencia": "em_andamento",
    "status": "aberto",
    "data_fechamento": null,
    "id_usuario_created": 42,
    "created_at": "2026-07-08T09:15:00-03:00",
    "updated_at": "2026-07-08T11:42:00-03:00"
  }
}

Escopo: apuracao_resultado:write

DELETE /apuracao-resultado/{apuracao_id}

Remove uma apuração pelo ID. Só é permitido quando status='aberto'; apurações fechadas devolvem 422.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
apuracao_idintpathsimID interno da apuração

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Apuração removida!",
  "data": null
}

Escopo: apuracao_resultado:write

Schemas

ApuracaoResultadoCreate

Herda todos os campos de ApuracaoResultadoBase. status não é exposto - toda apuração nasce "aberto".

CampoTipoObrigatórioObservações
id_customerintsimID do cliente (customer.id) ao qual a apuração pertence.
tributostr (enum)simTributo apurado. Valores: PIS, COFINS, ISS, IRPJ, CSLL.
periodostrsimPeríodo de apuração. Formato depende de tipo_periodo (ver notas). 4 a 10 caracteres.
tipo_periodostr (enum)simGranularidade: mensal, trimestral ou anual.
regime_apuracaostr (enum)nãoRegime aplicado: presumido, real ou simples. Default null.
base_calculoDecimalsimBase de cálculo (R$) sobre a qual o tributo incide. >= 0 e < 10.000.000.000.000.
aliquota_aplicadaDecimalsimAlíquota efetiva aplicada (em %, ex.: 1.6500 = 1,65%). >= 0 e < 1000.
valor_apuradoDecimalsimValor apurado (R$) = base_calculo × aliquota_aplicada / 100. >= 0.
valor_retidoDecimalnãoRetenções na fonte (R$). Default 0. >= 0.
valor_a_recolherDecimalsimValor líquido a recolher (R$) = valor_apurado − valor_retido. >= 0.
houve_majoracaoboolnãotrue quando a majoração 2026 foi aplicada na aliquota_aplicada. Default false.
detalhesdict (JSON)nãoBreakdown completo da apuração (NFS-e usadas, lançamentos manuais, fórmulas). Útil para auditoria.
status_conferenciastr (enum)nãoStatus da conferência (revisão humana): pendente, em_andamento, finalizado. Default null.

ApuracaoResultadoUpdate

Todos os campos são opcionais; apenas os enviados são atualizados (exclude_unset). id_customer, id, status, data_fechamento, created_at e updated_at são imutáveis e não aparecem aqui.

CampoTipoObservações
tributostr (enum)PIS, COFINS, ISS, IRPJ, CSLL.
periodostr4 a 10 caracteres. Consistência com tipo_periodo validada quando ambos enviados.
tipo_periodostr (enum)mensal, trimestral, anual.
regime_apuracaostr (enum)presumido, real, simples.
base_calculoDecimal>= 0 e < 10.000.000.000.000.
aliquota_aplicadaDecimal>= 0 e < 1000.
valor_apuradoDecimal>= 0.
valor_retidoDecimal>= 0.
valor_a_recolherDecimal>= 0.
houve_majoracaoboolMarca aplicação da majoração 2026.
detalhesdict (JSON)Breakdown da apuração.
status_conferenciastr (enum)pendente, em_andamento, finalizado. Combinável com qualquer outro campo.

ApuracaoResultadoRead

Estende ApuracaoResultadoBase com os campos gerenciados pelo servidor.

CampoTipoNotas
idintIdentificador da apuração.
id_customerintCliente ao qual a apuração pertence.
tributostrTributo apurado.
periodostrPeríodo de apuração.
tipo_periodostrGranularidade do período.
regime_apuracaostr | nullRegime aplicado.
base_calculoDecimalBase de cálculo (R$).
aliquota_aplicadaDecimalAlíquota efetiva (%).
valor_apuradoDecimalValor apurado (R$).
valor_retidoDecimalRetenções na fonte (R$).
valor_a_recolherDecimalValor líquido a recolher (R$).
houve_majoracaoboolIndica aplicação da majoração 2026.
detalhesdict | nullBreakdown da apuração (JSON).
status_conferenciastr | nullStatus da conferência humana.
statusstrCiclo de vida: aberto ou fechado.
data_fechamentodatetime | nullTimestamp do fechamento (null quando aberto).
id_usuario_createdintUsuário que criou a apuração (multi-tenant).
created_atdatetimeTimestamp de criação (server-side).
updated_atdatetimeTimestamp da última atualização (server-side).

Notas

  • Toda resposta segue o envelope { success, message, data } (ou { success: false, message, details } em erro).
  • Formato de periodo × tipo_periodo (validado no schema):
    • mensal: YYYY-MM (ex.: 2026-05)
    • trimestral: YYYY-Qn com n = 1..4 (ex.: 2026-Q2)
    • anual: YYYY (ex.: 2026)
  • As rotas estáticas POST /fechar/{apuracao_id}, GET /by-user e GET /by-customer/{customer_id} são declaradas antes da rota dinâmica GET /{apuracao_id}, para que o FastAPI as resolva corretamente (e não interprete fechar/by-user/by-customer como um apuracao_id).
  • Imutabilidade após fechamento: POST /fechar/{apuracao_id} é a única transição para status='fechado'. Depois disso, PUT e DELETE retornam 422.
  • Valores monetários são Decimal (Numeric(15,2) no banco); aliquota_aplicada é Numeric(7,4).