NFS-e/Repasse: Repasse

Endpoints da WebApiAlcance para o cálculo e a gestão de repasses médicos (domínio repasse, financeiro crítico). Este domínio porta o app single-company webapp-nfs-repasse-medico (originalmente Supabase + edge function calcular-repasse) para a API. Cobrem o CRUD do cabeçalho do repasse, o cálculo síncrono (recalcula impostos, rateio e IRRF regravando as tabelas calculadas), os sub-recursos calculados (médicos, notas, créditos - somente leitura) e os sub-recursos manuais que servem de input do cálculo (despesas, antecipações, devolução de aporte, pró-labore).

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.

Escopo compartilhado do primeiro segmento

O primeiro segmento do path - nfse-repasse - é compartilhado por todos os módulos da família NFS-e/Repasse (tomadores, notas, prestadores, repasses etc.). Por isso o escopo desta página é nfse_repasse:read / nfse_repasse:write, e não um escopo específico de "repasse". Uma API Key com nfse_repasse:write habilita escrita em todo o domínio NFS-e/Repasse, não apenas em repasses. Emita chaves com o menor escopo possível - preferencialmente nfse_repasse:read.

Base path

/api/v1/nfse-repasse/repasses

Escopos necessários

  • nfse_repasse:read - leitura: listagem, busca por ID e todos os GET de sub-recursos (calculados e manuais).
  • nfse_repasse:write - escrita: criação, atualização, exclusão, o cálculo (POST /{repasse_id}/calcular) e todo o CRUD dos sub-recursos manuais.

Perfil administrador na WebApi. Além do escopo nfse_repasse:write, todas as operações de escrita (POST/PUT/DELETE) e o cálculo exigem o perfil administrador do usuário autenticado. A leitura (GET) é liberada para qualquer staff autenticado. API Keys emitidas para o gateway MCP devem usar apenas nfse_repasse:read sempre que possível - repasse é um domínio financeiro crítico.

Endpoints

Todos os endpoints devolvem o envelope padrão { success, message, data } (ou { success: false, message, details } em erro). O código HTTP reflete a semântica REST padrão; o service mapeia mensagens canônicas para 404 (não encontrado), 409 (conflito / já fechado / já existe), 403 (acesso negado) e 422 (validação).

Ordem de rotas no FastAPI

As rotas com segmento estático - sub-recursos aninhados e /{repasse_id}/calcular - são declaradas antes da rota dinâmica /{repasse_id}, porque o FastAPI casa na ordem de declaração. Isso não muda a forma de chamar, mas explica por que /{repasse_id}/calcular nunca é interpretado como um repasse_id inválido.

Cabeçalho do repasse

POST /nfse-repasse/repasses/

Cria um novo repasse. O usuário informa prestador + período + competência; os 10 totais não entram no body (são derivados pelo cálculo). O id_usuario_created é forçado pelo service a partir do usuário autenticado.

Parâmetros

Este endpoint não recebe parâmetros de rota ou query - os dados vão no corpo da requisição (RepasseCreate): id_prestador, periodo_inicio e periodo_fim (obrigatórios); data_fechamento, mes_referencia, status e uuid_legado (opcionais).

Request

{
  "id_prestador": 1,
  "periodo_inicio": "2026-06-01",
  "periodo_fim": "2026-06-30",
  "mes_referencia": "2026-06",
  "status": "em_calculo"
}

Response 201 Created

{
  "success": true,
  "message": "Repasse criado com sucesso!",
  "data": {
    "id": 1,
    "id_prestador": 1,
    "periodo_inicio": "2026-06-01",
    "periodo_fim": "2026-06-30",
    "mes_referencia": "2026-06",
    "status": "em_calculo",
    "faturamento_total": "0",
    "resultado_final": "0",
    "created_at": "2026-06-30T12:00:00",
    "updated_at": "2026-06-30T12:00:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

GET /nfse-repasse/repasses/

Lista os repasses, com filtros opcionais e paginação. Sempre retorna 200 OK, inclusive com data: [] quando não há repasses.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
statusstrquerynãoFiltro por status (ex.: em_calculo, fechado)
id_prestadorintquerynãoFiltro por prestador (prestador_medico.id)
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": "Repasses recuperados com sucesso!",
  "data": [
    {
      "id": 1,
      "id_prestador": 1,
      "periodo_inicio": "2026-06-01",
      "periodo_fim": "2026-06-30",
      "mes_referencia": "2026-06",
      "status": "em_calculo",
      "faturamento_total": "100000.00",
      "resultado_final": "83500.00",
      "created_at": "2026-06-30T12:00:00",
      "updated_at": "2026-06-30T12:00:00"
    }
  ]
}

Escopo: nfse_repasse:read

GET /nfse-repasse/repasses/{repasse_id}

Detalha um repasse pelo ID inteiro (inclui os 10 totais). Quando não encontrado, retorna 404 Not Found.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID interno do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Repasse encontrado!",
  "data": {
    "id": 1,
    "id_prestador": 1,
    "periodo_inicio": "2026-06-01",
    "periodo_fim": "2026-06-30",
    "mes_referencia": "2026-06",
    "status": "em_calculo",
    "faturamento_total": "100000.00",
    "total_impostos": "6000.00",
    "total_despesas": "5000.00",
    "total_nao_recebido": "0.00",
    "total_creditos_anteriores": "0.00",
    "total_antecipacoes": "1000.00",
    "total_irrf": "1500.00",
    "total_devolucao_aporte": "0.00",
    "total_prolabore_liquido": "3000.00",
    "resultado_final": "83500.00",
    "id_usuario_created": 42,
    "created_at": "2026-06-30T12:00:00",
    "updated_at": "2026-06-30T12:00:00"
  }
}

Escopo: nfse_repasse:read

PUT /nfse-repasse/repasses/{repasse_id}

Atualiza um repasse. O body é um RepasseUpdate com campos parciais - somente o que vier preenchido é alterado. id, uuid_legado, id_usuario_created, timestamps e os 10 totais (derivados pelo cálculo) são imutáveis por este endpoint.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request (RepasseUpdate - todos os campos opcionais)

{
  "mes_referencia": "2026-06",
  "status": "fechado"
}

Response 200 OK

{
  "success": true,
  "message": "Repasse atualizado!",
  "data": {
    "id": 1,
    "id_prestador": 1,
    "periodo_inicio": "2026-06-01",
    "periodo_fim": "2026-06-30",
    "mes_referencia": "2026-06",
    "status": "fechado",
    "resultado_final": "83500.00",
    "created_at": "2026-06-30T12:00:00",
    "updated_at": "2026-06-30T14:20:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

DELETE /nfse-repasse/repasses/{repasse_id}

Remove um repasse pelo ID. Operação destrutiva. A cascata dos sub-recursos (médicos, notas, créditos, despesas, antecipações, devoluções, pró-labores) é feita pelo banco via ON DELETE CASCADE.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Repasse removido!",
  "data": null
}

Escopo: nfse_repasse:write (perfil administrador)

Cálculo

POST /nfse-repasse/repasses/{repasse_id}/calcular

Cálculo síncrono. Porta o edge function calcular-repasse: recalcula impostos, rateio de despesas e IRRF, e regrava as tabelas calculadas (notas, médicos, créditos) numa única transação. Não retorna binário - retorna um resumo (RepasseCalculoResult).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse a calcular

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Repasse calculado com sucesso!",
  "data": {
    "faturamento_total": "100000.00",
    "total_impostos": "6000.00",
    "total_despesas": "5000.00",
    "total_nao_recebido": "0.00",
    "total_creditos_anteriores": "0.00",
    "total_antecipacoes": "1000.00",
    "total_irrf": "1500.00",
    "total_devolucao_aporte": "0.00",
    "total_prolabore_liquido": "3000.00",
    "resultado_final": "83500.00",
    "notas_count": 42,
    "creditos_count": 3,
    "medicos_count": 8
  }
}

Escopo: nfse_repasse:write (perfil administrador)

Sub-recursos calculados (somente leitura)

Recriados a cada execução do cálculo - não têm CRUD.

GET /nfse-repasse/repasses/{repasse_id}/medicos

Lista as linhas calculadas por médico do repasse (RepasseMedicoRead).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Médicos do repasse recuperados com sucesso!",
  "data": [
    {
      "id": 1,
      "id_repasse": 1,
      "id_medico": 1,
      "faturamento_medico": "20000.00",
      "impostos_medico": "1200.00",
      "despesas_rateadas": "625.00",
      "despesas_especificas": "0.00",
      "valor_nao_recebido": "0.00",
      "creditos_anteriores": "0.00",
      "total_antecipacoes": "1000.00",
      "irrf": "300.00",
      "base_irrf": "17175.00",
      "total_devolucao_aporte": "0.00",
      "prolabore_liquido": "3000.00",
      "valor_final": "13875.00",
      "created_at": "2026-06-30T12:05:00"
    }
  ]
}

Escopo: nfse_repasse:read

GET /nfse-repasse/repasses/{repasse_id}/notas

Lista as notas do período vinculadas ao repasse (RepasseNotaRead, calculadas).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Notas do repasse recuperadas com sucesso!",
  "data": [
    {
      "id": 1,
      "id_repasse": 1,
      "id_nota_fiscal": 1,
      "valor_bruto": "2500.00",
      "recebida": "S",
      "created_at": "2026-06-30T12:05:00"
    }
  ]
}

Escopo: nfse_repasse:read

GET /nfse-repasse/repasses/{repasse_id}/creditos

Lista os créditos de períodos anteriores considerados no repasse (RepasseCreditoRead, calculados).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Créditos do repasse recuperados com sucesso!",
  "data": [
    {
      "id": 1,
      "id_repasse": 1,
      "id_nota_fiscal": 5,
      "id_medico": 1,
      "valor_credito": "800.00",
      "created_at": "2026-06-30T12:05:00"
    }
  ]
}

Escopo: nfse_repasse:read

Sub-recurso manual: Despesas

CRUD completo. São input do cálculo. id_repasse vem sempre da rota aninhada (não entra no body).

GET /nfse-repasse/repasses/{repasse_id}/despesas

Lista as despesas do repasse (RepasseDespesaRead).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Despesas recuperadas com sucesso!",
  "data": [
    {
      "id": 1,
      "id_repasse": 1,
      "id_medico": null,
      "tipo_despesa": "fixa_rateada",
      "descricao": "Aluguel da clínica",
      "valor_total": "500.00",
      "rateio": "S",
      "created_at": "2026-06-30T12:00:00"
    }
  ]
}

Escopo: nfse_repasse:read

POST /nfse-repasse/repasses/{repasse_id}/despesas

Cria uma despesa no repasse. Body RepasseDespesaCreate.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

{
  "id_medico": null,
  "tipo_despesa": "fixa_rateada",
  "descricao": "Aluguel da clínica",
  "valor_total": "500.00",
  "rateio": "S"
}

Response 201 Created

{
  "success": true,
  "message": "Despesa criada com sucesso!",
  "data": {
    "id": 1,
    "id_repasse": 1,
    "id_medico": null,
    "tipo_despesa": "fixa_rateada",
    "descricao": "Aluguel da clínica",
    "valor_total": "500.00",
    "rateio": "S",
    "created_at": "2026-06-30T12:00:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

PUT /nfse-repasse/repasses/{repasse_id}/despesas/{despesa_id}

Atualiza uma despesa (campos parciais, RepasseDespesaUpdate).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse
despesa_idintpathsimID da despesa

Request (RepasseDespesaUpdate - todos os campos opcionais)

{
  "valor_total": "600.00"
}

Response 200 OK

{
  "success": true,
  "message": "Despesa atualizada!",
  "data": {
    "id": 1,
    "id_repasse": 1,
    "id_medico": null,
    "tipo_despesa": "fixa_rateada",
    "descricao": "Aluguel da clínica",
    "valor_total": "600.00",
    "rateio": "S",
    "created_at": "2026-06-30T12:00:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

DELETE /nfse-repasse/repasses/{repasse_id}/despesas/{despesa_id}

Remove uma despesa do repasse.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse
despesa_idintpathsimID da despesa

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Despesa removida!",
  "data": null
}

Escopo: nfse_repasse:write (perfil administrador)

Sub-recurso manual: Antecipações

CRUD completo. Forma "médico + valor + data + observação" (data_antecipacao).

GET /nfse-repasse/repasses/{repasse_id}/antecipacoes

Lista as antecipações do repasse (RepasseAntecipacaoRead).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Antecipações recuperadas com sucesso!",
  "data": [
    {
      "id": 1,
      "id_repasse": 1,
      "id_medico": 1,
      "valor": "1000.00",
      "data_antecipacao": "2026-06-15",
      "observacao": "Adiantamento quinzenal",
      "created_at": "2026-06-15T10:00:00"
    }
  ]
}

Escopo: nfse_repasse:read

POST /nfse-repasse/repasses/{repasse_id}/antecipacoes

Cria uma antecipação. Body RepasseAntecipacaoCreate.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

{
  "id_medico": 1,
  "valor": "1000.00",
  "data_antecipacao": "2026-06-15",
  "observacao": "Adiantamento quinzenal"
}

Response 201 Created

{
  "success": true,
  "message": "Antecipação criada com sucesso!",
  "data": {
    "id": 1,
    "id_repasse": 1,
    "id_medico": 1,
    "valor": "1000.00",
    "data_antecipacao": "2026-06-15",
    "observacao": "Adiantamento quinzenal",
    "created_at": "2026-06-15T10:00:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

PUT /nfse-repasse/repasses/{repasse_id}/antecipacoes/{antecipacao_id}

Atualiza uma antecipação (campos parciais, RepasseAntecipacaoUpdate).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse
antecipacao_idintpathsimID da antecipação

Request (RepasseAntecipacaoUpdate - todos os campos opcionais)

{
  "valor": "1200.00"
}

Response 200 OK

{
  "success": true,
  "message": "Antecipação atualizada!",
  "data": {
    "id": 1,
    "id_repasse": 1,
    "id_medico": 1,
    "valor": "1200.00",
    "data_antecipacao": "2026-06-15",
    "observacao": "Adiantamento quinzenal",
    "created_at": "2026-06-15T10:00:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

DELETE /nfse-repasse/repasses/{repasse_id}/antecipacoes/{antecipacao_id}

Remove uma antecipação do repasse.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse
antecipacao_idintpathsimID da antecipação

Request

Sem corpo de requisição.

Response 200 OK

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

Escopo: nfse_repasse:write (perfil administrador)

Sub-recurso manual: Devolução de aporte

CRUD completo. Mesma forma das antecipações, com coluna de data data_devolucao.

GET /nfse-repasse/repasses/{repasse_id}/devolucao-aporte

Lista as devoluções de aporte do repasse (RepasseDevolucaoAporteRead).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Devoluções de aporte recuperadas com sucesso!",
  "data": [
    {
      "id": 1,
      "id_repasse": 1,
      "id_medico": 1,
      "valor": "2000.00",
      "data_devolucao": "2026-06-20",
      "observacao": "Devolução de aporte inicial",
      "created_at": "2026-06-20T09:00:00"
    }
  ]
}

Escopo: nfse_repasse:read

POST /nfse-repasse/repasses/{repasse_id}/devolucao-aporte

Cria uma devolução de aporte. Body RepasseDevolucaoAporteCreate.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

{
  "id_medico": 1,
  "valor": "2000.00",
  "data_devolucao": "2026-06-20",
  "observacao": "Devolução de aporte inicial"
}

Response 201 Created

{
  "success": true,
  "message": "Devolução de aporte criada com sucesso!",
  "data": {
    "id": 1,
    "id_repasse": 1,
    "id_medico": 1,
    "valor": "2000.00",
    "data_devolucao": "2026-06-20",
    "observacao": "Devolução de aporte inicial",
    "created_at": "2026-06-20T09:00:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

PUT /nfse-repasse/repasses/{repasse_id}/devolucao-aporte/{devolucao_id}

Atualiza uma devolução de aporte (campos parciais, RepasseDevolucaoAporteUpdate).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse
devolucao_idintpathsimID da devolução

Request (RepasseDevolucaoAporteUpdate - todos os campos opcionais)

{
  "valor": "2500.00"
}

Response 200 OK

{
  "success": true,
  "message": "Devolução de aporte atualizada!",
  "data": {
    "id": 1,
    "id_repasse": 1,
    "id_medico": 1,
    "valor": "2500.00",
    "data_devolucao": "2026-06-20",
    "observacao": "Devolução de aporte inicial",
    "created_at": "2026-06-20T09:00:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

DELETE /nfse-repasse/repasses/{repasse_id}/devolucao-aporte/{devolucao_id}

Remove uma devolução de aporte do repasse.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse
devolucao_idintpathsimID da devolução

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Devolução de aporte removida!",
  "data": null
}

Escopo: nfse_repasse:write (perfil administrador)

Sub-recurso manual: Pró-labore

CRUD completo. Mesma forma, com coluna de data data_prolabore. É o único sub-recurso manual com updated_at no schema de leitura.

GET /nfse-repasse/repasses/{repasse_id}/prolabore

Lista os pró-labores do repasse (RepasseProlaboreRead).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Pró-labores recuperados com sucesso!",
  "data": [
    {
      "id": 1,
      "id_repasse": 1,
      "id_medico": 1,
      "valor": "3000.00",
      "data_prolabore": "2026-06-30",
      "observacao": "Pró-labore mensal",
      "created_at": "2026-06-30T11:00:00",
      "updated_at": "2026-06-30T11:00:00"
    }
  ]
}

Escopo: nfse_repasse:read

POST /nfse-repasse/repasses/{repasse_id}/prolabore

Cria um pró-labore. Body RepasseProlaboreCreate.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse

Request

{
  "id_medico": 1,
  "valor": "3000.00",
  "data_prolabore": "2026-06-30",
  "observacao": "Pró-labore mensal"
}

Response 201 Created

{
  "success": true,
  "message": "Pró-labore criado com sucesso!",
  "data": {
    "id": 1,
    "id_repasse": 1,
    "id_medico": 1,
    "valor": "3000.00",
    "data_prolabore": "2026-06-30",
    "observacao": "Pró-labore mensal",
    "created_at": "2026-06-30T11:00:00",
    "updated_at": "2026-06-30T11:00:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

PUT /nfse-repasse/repasses/{repasse_id}/prolabore/{prolabore_id}

Atualiza um pró-labore (campos parciais, RepasseProlaboreUpdate).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse
prolabore_idintpathsimID do pró-labore

Request (RepasseProlaboreUpdate - todos os campos opcionais)

{
  "valor": "3200.00"
}

Response 200 OK

{
  "success": true,
  "message": "Pró-labore atualizado!",
  "data": {
    "id": 1,
    "id_repasse": 1,
    "id_medico": 1,
    "valor": "3200.00",
    "data_prolabore": "2026-06-30",
    "observacao": "Pró-labore mensal",
    "created_at": "2026-06-30T11:00:00",
    "updated_at": "2026-06-30T14:30:00"
  }
}

Escopo: nfse_repasse:write (perfil administrador)

DELETE /nfse-repasse/repasses/{repasse_id}/prolabore/{prolabore_id}

Remove um pró-labore do repasse.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
repasse_idintpathsimID do repasse
prolabore_idintpathsimID do pró-labore

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Pró-labore removido!",
  "data": null
}

Escopo: nfse_repasse:write (perfil administrador)

Schemas

Schema RepasseCreate

Payload de criação do cabeçalho. Os 10 totais não entram (são derivados pelo cálculo).

CampoTipoObrigatórioDescrição
id_prestadorintsimID do prestador (prestador_medico.id)
periodo_iniciodatesimInício do período do repasse
periodo_fimdatesimFim do período do repasse
data_fechamentodatenãoData de fechamento (preenchida ao fechar)
mes_referenciastr (≤ 20)nãoMês de referência/competência (ex.: 2026-06)
statusstr (≤ 30)nãoem_calculo (default) ou fechado
uuid_legadostr (≤ 36)nãoUUID do registro original no Supabase (rastreabilidade)

RepasseUpdate tem os mesmos campos mutáveis (id_prestador, periodo_inicio, periodo_fim, data_fechamento, mes_referencia, status), todos opcionais.

Schema RepasseRead

Além dos campos do RepasseBase, o Read expõe id, uuid_legado, id_usuario_created, os timestamps created_at/updated_at e os 10 totais (todos Decimal, derivados pelo cálculo):

  • faturamento_total, total_impostos, total_despesas, total_nao_recebido, total_creditos_anteriores, total_antecipacoes, total_irrf, total_devolucao_aporte, total_prolabore_liquido, resultado_final.

Schema RepasseCalculoResult

Resumo retornado por POST /{repasse_id}/calcular - espelha o JSON do edge function calcular-repasse. Contém os 10 totais acima (todos Decimal) mais três contadores int: notas_count, creditos_count, medicos_count.

Schema dos sub-recursos manuais

RepasseDespesa (Create/Update/Read):

CampoTipoObrigatórioDescrição
id_medicointnãonull quando rateio='S' (despesa rateada não tem médico específico)
tipo_despesastr (≤ 50)nãoEx.: fixa_rateada (default), especifica, ajuste
descricaostrsimDescrição da despesa
valor_totalDecimalnãoValor total (default 0)
rateiostr (1)nãoS (rateada, default) ou N (específica/ajuste); aceita boolean
uuid_legadostr (≤ 36)nãoSó no Create

RepasseAntecipacao, RepasseDevolucaoAporte, RepasseProlabore compartilham a base _ValorMedicoBase (id_medico obrigatório, valor: Decimal, observacao opcional) e diferem apenas no nome da coluna de data:

Sub-recursoColuna de dataObservações
RepasseAntecipacaodata_antecipacao-
RepasseDevolucaoAportedata_devolucao-
RepasseProlaboredata_prolaboreÚnico Read com updated_at

Notas

  • Envelope. Toda resposta segue { success, message, data } (ou { success: false, message, details } em erro). Não há endpoints binários neste domínio - o cálculo (/calcular) é síncrono e retorna JSON (RepasseCalculoResult), não um arquivo.
  • Duas categorias de sub-recurso. Os calculados (medicos, notas, creditos) são somente leitura e recriados a cada POST /{repasse_id}/calcular; os manuais (despesas, antecipacoes, devolucao-aporte, prolabore) têm CRUD e são o input do cálculo.
  • Valores monetários. Todos os campos de valor são Decimal (string no JSON), nunca float, por se tratar de domínio financeiro crítico.
  • Cascata. O DELETE do repasse é único; a remoção dos sub-recursos é feita pelo banco via ON DELETE CASCADE.
  • id_repasse nunca vai no body dos sub-recursos - ele é sempre inferido da rota aninhada. id_usuario_created é forçado pelo service a partir do usuário autenticado, e uuid_legado é metadado de migração (aceito no Create, imutável depois).

Domínio financeiro crítico

Repasse recalcula impostos, rateio e IRRF e regrava tabelas em transação. Escrita (POST/PUT/DELETE) e o cálculo exigem nfse_repasse:write + perfil administrador. Nunca exponha escrita a clientes IA sem confirmação humana explícita - prefira emitir API Keys apenas com nfse_repasse:read.