Skip to content

API — Contabilidade

Base: GET /t/:slug/accounting/...

Todos os endpoints requerem autenticação JWT (manage_accounting permission — Admin ou Superadmin).


Plano de Contas

GET /t/:slug/accounting/chart

Lista todas as contas do plano (defaults do sistema + contas do tenant).

Resposta: ChartAccount[]

json
[
  {
    "_id": "...",
    "code": "1.1.1.01",
    "name": "Caixa",
    "nature": "ativo",
    "type": "analitica",
    "normalBalance": "debit",
    "parent": null,
    "dreGroup": null,
    "tenant": null,
    "active": true
  }
]

Campos nature: ativo | passivo | receita | despesa | custo | patrimonio_liquido

Campos type: sintetica | analitica

Campos normalBalance: debit | credit


POST /t/:slug/accounting/chart

Cria nova conta no plano do tenant.

Body:

json
{
  "code": "1.1.2.05",
  "name": "Contas a Receber – Vouchers",
  "nature": "ativo",
  "type": "analitica",
  "normalBalance": "debit",
  "parent": "optional-parent-id",
  "dreGroup": null
}

DELETE /t/:slug/accounting/chart/:id

Desativa uma conta do tenant (soft delete — active: false). Contas do sistema (tenant: null) não podem ser desativadas.


POST /t/:slug/accounting/chart/seed/defaults

Popula o plano de contas com os defaults do sistema brasileiro para restaurantes (~40 contas). Contas já existentes não são duplicadas.

Permissão: Superadmin only.


Diário de Lançamentos

GET /t/:slug/accounting/journal

Lista lançamentos paginados.

Query params:

ParamTipoDescrição
pagenumberPágina (default: 1)
limitnumberPor página (default: 20)
statusstringFiltrar por `draft

Resposta: JournalEntry[]

json
[
  {
    "_id": "...",
    "entryNumber": "JE-2026-00042",
    "competenceDate": "2026-04-07T00:00:00Z",
    "description": "Venda Pedido #20260407-0012",
    "status": "posted",
    "totalAmount": 150.00,
    "lines": [
      { "accountId": "...", "accountCode": "1.1.1.01", "accountName": "Caixa", "debit": 150.00, "credit": 0, "memo": null },
      { "accountId": "...", "accountCode": "3.1.1.01", "accountName": "Receita de Vendas", "debit": 0, "credit": 150.00, "memo": null }
    ]
  }
]

POST /t/:slug/accounting/journal

Cria lançamento manual em estado draft.

Body:

json
{
  "competenceDate": "2026-04-07",
  "description": "Ajuste manual de estoque",
  "lines": [
    { "accountId": "...", "debit": 500.00, "credit": 0, "memo": "Perda de insumo" },
    { "accountId": "...", "debit": 0, "credit": 500.00, "memo": null }
  ]
}

Validação: Soma de débitos deve ser igual à soma de créditos.


POST /t/:slug/accounting/journal/:id/post

Lança um rascunho (draft → posted). Após postado, o lançamento não pode ser editado.


POST /t/:slug/accounting/journal/:id/reverse

Estorna um lançamento postado — cria contra-lançamento automático com o prefixo [ESTORNO] na descrição.

Body:

json
{ "reason": "Estorno manual" }

Razão Geral & Balancete

GET /t/:slug/accounting/ledger/balancete

Balancete de verificação para um período.

Query params:

ParamTipoObrigatório
yearnumber
monthnumber

Resposta: BalanceteRow[]

json
[
  {
    "accountId": "...",
    "accountCode": "1.1.1.01",
    "accountName": "Caixa",
    "nature": "ativo",
    "totalDebit": 5000.00,
    "totalCredit": 2000.00,
    "balance": 3000.00
  }
]

GET /t/:slug/accounting/ledger/razao

Razão de uma conta analítica (histórico de movimentos com saldo acumulado).

Query params:

ParamTipoDescrição
accountIdstringID da conta analítica
startDatestringData inicial (YYYY-MM-DD)
endDatestringData final (YYYY-MM-DD)

Resposta: RazaoLine[]

json
[
  {
    "entryNumber": "JE-2026-00042",
    "competenceDate": "2026-04-07T00:00:00Z",
    "description": "Venda #0012",
    "debit": 150.00,
    "credit": 0,
    "runningBalance": 3150.00
  }
]

GET /t/:slug/accounting/ledger/periods

Lista todos os períodos mensais com lançamentos.

Resposta: PeriodClosing[]


POST /t/:slug/accounting/ledger/close

Fecha uma competência — congela lançamentos e captura snapshot do balancete.

Body: { "year": 2026, "month": 3 }


POST /t/:slug/accounting/ledger/reopen

Reabre um período fechado para correções.

Body: { "year": 2026, "month": 3 }


Contas a Receber

GET /t/:slug/accounting/receivables

Lista contas a receber com filtros opcionais.

Query params:

ParamTipoValores
statusstring`open

GET /t/:slug/accounting/receivables/aging

Aging report — agrupa recebíveis em buckets de vencimento.

Resposta:

json
{
  "grandTotal": 4500.00,
  "buckets": [
    { "label": "Vencidos >90d", "total": 500.00, "count": 2 },
    { "label": "Vencidos 60-90d", "total": 800.00, "count": 3 },
    { "label": "Vencidos 30-60d", "total": 1200.00, "count": 5 },
    { "label": "Vencidos até 30d", "total": 700.00, "count": 4 },
    { "label": "A Vencer", "total": 1300.00, "count": 6 }
  ]
}

POST /t/:slug/accounting/receivables/:id/settle

Registra recebimento (total ou parcial).

Body:

json
{ "amount": 150.00, "paymentMethod": "cash" }

POST /t/:slug/accounting/receivables/:id/write-off

Baixa um recebível (perdas, acordos).

Body:

json
{ "reason": "Baixa manual — acordo" }

Contas Bancárias

GET /t/:slug/accounting/bank

Lista contas bancárias cadastradas.


POST /t/:slug/accounting/bank

Cadastra nova conta bancária.

Body:

json
{
  "name": "Conta Corrente Itaú",
  "bank": "Itaú",
  "agency": "1234",
  "account": "56789-0",
  "type": "checking"
}

GET /t/:slug/accounting/bank/:id/statement

Lista linhas do extrato importado para uma conta.

Query: ?status=unmatched|matched|ignored


POST /t/:slug/accounting/bank/:id/import

Importa extrato OFX ou CSV.

Body: multipart/form-data com campo file.


POST /t/:slug/accounting/bank/:id/auto-match

Executa conciliação automática: pareia linhas do extrato com lançamentos por valor + janela de 3 dias.


Tipos TypeScript

Ver frontend-react/src/types/index.ts:

  • ChartAccount, AccountNature, AccountType, BalanceSide
  • JournalEntry, JournalEntryLine, JournalEntryStatus
  • AccountsReceivable, ReceivableStatus, AgingReport, AgingBucket
  • BankAccount, BankStatementLine
  • PeriodClosing, BalanceteRow, RazaoLine

Lançado sob a licença MIT.