SN Analytics: Prefeitura

Endpoints da WebApiAlcance para o módulo SN Analytics: Prefeitura - dados de prefeitura (notas fiscais de serviço, ISS e faturamento) no contexto do Simples Nacional. O domínio organiza os lançamentos em registros (cada NFS-e/serviço) que alimentam consolidados por empresa e competência (MM/YYYY), com totais de faturamento calculados no servidor. Cobrem listagem de consolidados, listagem paginada de registros, criação individual e em lote, atualização de valores em lote, atualização e exclusão de registro.

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/sn-prefeitura

Escopos necessários

  • sn_prefeitura:read - listagem de consolidados e de registros
  • sn_prefeitura:write - criação (individual e batch), atualização (individual e batch-valores) e exclusão

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

Endpoints

GET /sn-prefeitura/consolidados

Lista os consolidados de prefeitura (totais por empresa e competência). Os totais são calculados server-side a partir dos registros. Lista vazia é um estado válido - retorna 200 OK com data: [] (ex.: banco recém-migrado sem dados da empresa).

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
empresa_idintquerynãoFiltra por empresa (customer.id)

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Consolidados recuperados com sucesso",
  "data": [
    {
      "id": 10,
      "empresa_id": 1234,
      "competencia": "03/2026",
      "total_faturamento": 15000.0,
      "total_faturamento_retido_s": 5000.0,
      "total_faturamento_retido_n": 10000.0,
      "created_at": "2026-03-31T12:00:00",
      "updated_at": "2026-03-31T12:00:00"
    }
  ]
}

Escopo: sn_prefeitura:read

GET /sn-prefeitura/registros

Lista os registros de prefeitura de forma paginada, com filtros opcionais por empresa e intervalo de data_hora_nfe. Retorna data como objeto { items, total }, onde total é a contagem sem paginação.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
empresa_idintquerynãoFiltra por empresa (customer.id)
data_iniciodatetimequerynãoFiltro inicial de data_hora_nfe (ISO 8601)
data_fimdatetimequerynãoFiltro final de data_hora_nfe (ISO 8601)
limitintquerynãoItens por página (1-10000, default 1000)
offsetintquerynãoOffset de paginação (>= 0, default 0)

Request

Sem corpo de requisição. Exemplo de chamada com filtros e paginação:

GET /api/v1/sn-prefeitura/registros?empresa_id=1234&data_inicio=2026-03-01T00:00:00&data_fim=2026-03-31T23:59:59&limit=500&offset=0

Response 200 OK

{
  "success": true,
  "message": "Registros recuperados com sucesso",
  "data": {
    "items": [
      {
        "id": 501,
        "empresa_id": 1234,
        "consolidado_id": 10,
        "data_hora_nfe": "2026-03-15T09:30:00",
        "competencia": "03/2026",
        "valor_servicos": 2500.0,
        "iss_retido": "N",
        "numero_nfse": "2026000123",
        "created_at": "2026-03-15T09:31:00",
        "updated_at": "2026-03-15T09:31:00"
      }
    ],
    "total": 1
  }
}

Escopo: sn_prefeitura:read

POST /sn-prefeitura/registros

Cria um registro individual de prefeitura. Ao criar, o service recalcula o consolidado da empresa/competência correspondente.

Parâmetros

Este endpoint não recebe parâmetros de rota ou query - os dados vão no corpo da requisição (SnPrefeituraRegistroCreate): empresa_id, data_hora_nfe, competencia (padrão MM/YYYY), valor_servicos, iss_retido e numero_nfse.

Request

{
  "empresa_id": 1234,
  "data_hora_nfe": "2026-03-15T09:30:00",
  "competencia": "03/2026",
  "valor_servicos": 2500.0,
  "iss_retido": "N",
  "numero_nfse": "2026000123"
}

Response 201 Created

{
  "success": true,
  "message": "Registro criado com sucesso",
  "data": {
    "id": 501,
    "empresa_id": 1234,
    "consolidado_id": 10,
    "data_hora_nfe": "2026-03-15T09:30:00",
    "competencia": "03/2026",
    "valor_servicos": 2500.0,
    "iss_retido": "N",
    "numero_nfse": "2026000123",
    "created_at": "2026-03-15T09:31:00",
    "updated_at": "2026-03-15T09:31:00"
  }
}

Escopo: sn_prefeitura:write

POST /sn-prefeitura/registros/batch

Cria registros em lote (até 5000 itens por chamada). Recalcula os consolidados afetados, agrupados por empresa/competência.

Parâmetros

Este endpoint não recebe parâmetros de rota ou query - o corpo é um array de SnPrefeituraRegistroCreate (mesmos campos do POST individual).

Request

[
  {
    "empresa_id": 1234,
    "data_hora_nfe": "2026-03-15T09:30:00",
    "competencia": "03/2026",
    "valor_servicos": 2500.0,
    "iss_retido": "N",
    "numero_nfse": "2026000123"
  },
  {
    "empresa_id": 1234,
    "data_hora_nfe": "2026-03-16T10:00:00",
    "competencia": "03/2026",
    "valor_servicos": 800.0,
    "iss_retido": "S",
    "numero_nfse": "2026000124"
  }
]

Response 201 Created

{
  "success": true,
  "message": "Registros criados com sucesso",
  "data": [
    {
      "id": 501,
      "empresa_id": 1234,
      "consolidado_id": 10,
      "data_hora_nfe": "2026-03-15T09:30:00",
      "competencia": "03/2026",
      "valor_servicos": 2500.0,
      "iss_retido": "N",
      "numero_nfse": "2026000123",
      "created_at": "2026-03-15T09:31:00",
      "updated_at": "2026-03-15T09:31:00"
    }
  ]
}

Escopo: sn_prefeitura:write

PUT /sn-prefeitura/registros/batch-valores

Atualiza valores em lote (até 5000 itens). Recalcula os consolidados afetados. Cada item identifica o registro por id e atualiza apenas valor_servicos e, opcionalmente, numero_nfse.

Parâmetros

Este endpoint não recebe parâmetros de rota ou query - o corpo é um array de SnPrefeituraRegistroBatchValores.

Request

[
  { "id": 501, "valor_servicos": 2600.0, "numero_nfse": "2026000123" },
  { "id": 502, "valor_servicos": 900.0 }
]

Response 200 OK

{
  "success": true,
  "message": "Valores atualizados com sucesso",
  "data": [
    {
      "id": 501,
      "empresa_id": 1234,
      "consolidado_id": 10,
      "data_hora_nfe": "2026-03-15T09:30:00",
      "competencia": "03/2026",
      "valor_servicos": 2600.0,
      "iss_retido": "N",
      "numero_nfse": "2026000123",
      "created_at": "2026-03-15T09:31:00",
      "updated_at": "2026-03-16T14:20:00"
    }
  ]
}

Escopo: sn_prefeitura:write

PUT /sn-prefeitura/registros/{registro_id}

Atualiza um registro existente. Body é um SnPrefeituraRegistroUpdate com campos parciais - somente o que vier preenchido é alterado. Se empresa_id e/ou competencia mudarem, o service re-vincula o registro ao consolidado correto e recalcula ambos os consolidados envolvidos. O campo consolidado_id nunca é aceito do cliente.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
registro_idintpathsimID interno do registro

Request (SnPrefeituraRegistroUpdate - todos os campos opcionais)

{
  "valor_servicos": 2800.0,
  "iss_retido": "S"
}

Response 200 OK

{
  "success": true,
  "message": "Registro atualizado com sucesso",
  "data": {
    "id": 501,
    "empresa_id": 1234,
    "consolidado_id": 10,
    "data_hora_nfe": "2026-03-15T09:30:00",
    "competencia": "03/2026",
    "valor_servicos": 2800.0,
    "iss_retido": "S",
    "numero_nfse": "2026000123",
    "created_at": "2026-03-15T09:31:00",
    "updated_at": "2026-03-16T15:05:00"
  }
}

Quando não encontrado, retorna 404 Not Found. Escopo: sn_prefeitura:write

DELETE /sn-prefeitura/registros/{registro_id}

Remove um registro pelo ID. O service recalcula (ou apaga, se ficar vazio) o consolidado associado.

Parâmetros

ParâmetroTipoLocalObrigatórioDescrição
registro_idintpathsimID do registro

Request

Sem corpo de requisição.

Response 200 OK

{
  "success": true,
  "message": "Registro removido com sucesso",
  "data": null
}

Quando não encontrado, retorna 404 Not Found. Escopo: sn_prefeitura:write

Schemas

SnPrefeituraRegistroCreate

CampoTipoObrigatórioObservações
empresa_idintsimEmpresa dona do registro (customer.id).
data_hora_nfedatetimesimData/hora da NFS-e (ISO 8601).
competenciastrsimCompetência no padrão MM/YYYY (mês 01-12).
valor_servicosdecimalnãoValor dos serviços (até 15 dígitos, 2 casas). Default 0.
iss_retidostrnão"S" ou "N". Default "N".
numero_nfsestrnãoNúmero da NFS-e (até 50 caracteres). Default null.

SnPrefeituraRegistroUpdate

Todos os campos são opcionais; apenas os enviados são atualizados. consolidado_id não é aceito.

CampoTipoObservações
empresa_idintPode mudar - re-vincula ao consolidado correto.
data_hora_nfedatetimeNova data/hora da NFS-e.
competenciastrPadrão MM/YYYY. Pode mudar - recalcula consolidados envolvidos.
valor_servicosdecimalAté 15 dígitos, 2 casas.
iss_retidostr"S" ou "N".
numero_nfsestrAté 50 caracteres.

SnPrefeituraRegistroBatchValores

Item do PUT /registros/batch-valores.

CampoTipoObrigatórioObservações
idintsimID do registro a atualizar.
valor_servicosdecimalsimNovo valor dos serviços (até 15 dígitos, 2 casas).
numero_nfsestrnãoNovo número da NFS-e (até 50 caracteres).

SnPrefeituraRegistroRead

CampoTipoNotas
idintIdentificador do registro.
empresa_idintEmpresa dona (mapeia a coluna id_cliente).
consolidado_idintConsolidado ao qual o registro está vinculado.
data_hora_nfedatetimeData/hora da NFS-e.
competenciastrCompetência MM/YYYY.
valor_servicosfloatValor dos serviços (decimal exposto como número JSON).
iss_retidostr"S" ou "N".
numero_nfsestrNúmero da NFS-e (pode ser null).
created_atdatetimeCriação (mapeia data_hora_criacao).
updated_atdatetimeAtualização (mapeia data_hora_atualizacao).

SnPrefeituraConsolidadoRead

Somente leitura - os totais são calculados server-side a partir dos registros.

CampoTipoNotas
idintIdentificador do consolidado.
empresa_idintEmpresa (mapeia id_cliente).
competenciastrCompetência MM/YYYY.
total_faturamentofloatFaturamento total da competência.
total_faturamento_retido_sfloatTotal com ISS retido (iss_retido = "S").
total_faturamento_retido_nfloatTotal sem ISS retido (iss_retido = "N").
created_atdatetimeCriação (mapeia data_hora_criacao).
updated_atdatetimeAtualização (mapeia data_hora_atualizacao).

Notas

Armadilha de roteamento FastAPI. As rotas estáticas POST /registros/batch e PUT /registros/batch-valores são declaradas antes da rota dinâmica PUT|DELETE /registros/{registro_id}. O FastAPI faz match na ordem de declaração, então batch/batch-valores são resolvidos como rotas estáticas (e não interpretados como um registro_id).

  • Toda resposta segue o envelope { success, message, data } (ou { success: false, message, details } em erro).
  • O JSON expõe empresa_id, created_at e updated_at, que mapeiam as colunas id_cliente, data_hora_criacao e data_hora_atualizacao. O campo interno legacy_uuid não é exposto.
  • Valores decimais (valor_servicos, totais) saem como número JSON (float) nos schemas de leitura.
  • Operações de escrita (criar, atualizar, batch, excluir) sempre recalculam os consolidados afetados. Consolidados não têm endpoint de escrita direto - são derivados dos registros.
  • Erros de validação canônicos são mapeados para HTTP: "não encontrado" → 404, "já existe"/"duplicado" → 409, demais → 422.
  • Listas vazias retornam 200 OK com data: [] - estado normal para o front de analytics.