Pular para o conteúdo principal

DRE gerencial: o plano de contas agrupado pela classificação × meses (com o CMV do estoque na competência), ou o que forma uma célula (títulos, itens ou pedidos)

GET 

/accounts/income-statement

Monta a DRE gerencial (Demonstrativo de Resultado do Exercício). Não há estrutura própria de linhas: a DRE é a própria árvore do plano de contas (GET /type/account/type, hierarquia por IDTypeAccountPaybleFather) agrupada pela classificação (natureza) de cada plano — IDTypeCategoryAccountPayble, catálogo GET /type/account/type/category (1 Ativo, 2 Passivo, 3 Patrimônio, 4 Receita de produto, 5 Despesa fixa, 6 Custo, 7 Outros resultados, 8 Deduções da receita, 9 Despesa variável, 10 Depreciação e amortização, 11 Resultado financeiro, 12 Impostos sobre o lucro, 13 Receita de serviço) — × os meses do período, somando os títulos (AccountsPayableReceivable). Classificar é editar o plano de contas (POST /type/account/type e PUT /type/account/type/{idtypeaccount}); esta rota só lê.

Dois modos, controlados por Type:

  • Resumo (Type=Summary, ou sem Type): um objeto IncomeStatementSummary.
  • Detalhe (Type=Detail): o que forma uma célula do resumo — os títulos (no DateType=DatePayment, as baixas) e, nos recortes do estoque e dos descontos de venda, os itens (movimentos de estoque) ou os pedidos. Exige um recorte — IDTypeCategoryAccountPayble, IDTypeAccountPayble, Unclassified=1, WithoutAccount=1, WithoutCompetence=1, CostOfGoodsSold=1, CostOfGoodsSoldCheck, Packaging=1, SalesDiscount=1 ou PurchaseInCost=1 — e é paginado em 1000 linhas por Page (a partir de 0). Com mais de um recorte, vale o primeiro nesta ordem: CostOfGoodsSoldCheck, CostOfGoodsSold, Packaging, SalesDiscount, PurchaseInCost, WithoutCompetence, WithoutAccount, IDTypeAccountPayble, IDTypeCategoryAccountPayble, Unclassified; os outros não filtram nem são validados. A exceção é o IDTypeAccountPayble junto com SalesDiscount=1: aí ele não é recorte próprio e restringe a lista dos descontos à conta-âncora (ver SalesDiscount).

Classificação efetiva

  • A de um plano é a própria ou, sem ela, a do plano superior mais próximo que tiver uma. Pode ser escolhida em qualquer nível: classificar Despesas leva todas as filhas junto, e só a exceção precisa de classificação própria.
  • É resolvida de cima para baixo, independe da ordem dos ids e é à prova de ciclo no plano de contas: um plano de ciclo sem raiz alcançável fica só com a própria.
  • Planos inativos entram (título antigo continua apontando para eles).

Blocos e subtotais (Lines, nesta ordem fixa)

  • ProductRevenue (4 Receita de produto, +) → ServiceRevenue (13 Receita de serviço, +) → Revenue (Receita bruta) = ProductRevenue + ServiceRevenue → Deductions (8 Deduções da receita, -) → NetRevenue (Receita líquida) = Revenue + Deductions → CostOfGoodsSold (CMV, -, só no DateType=Competence) → Cost (6 Custo, -) → GrossProfit (Lucro bruto) = NetRevenue + CostOfGoodsSold + Cost → VariableExpense (9 Despesa variável, -) → ContributionMargin (Margem de contribuição) = GrossProfit + VariableExpense → FixedExpense (5 Despesa fixa, -) → OperatingResult (Resultado operacional (EBITDA)) = ContributionMargin + FixedExpense → DepreciationAmortization (10 Depreciação e amortização, -) → Ebit (EBIT) = OperatingResult + DepreciationAmortization → FinancialResult (11 Resultado financeiro, ±) → OtherResult (7 Outros resultados, ±) → ProfitBeforeTax (Resultado antes dos impostos (LAIR)) = Ebit + FinancialResult + OtherResult → IncomeTax (12 Impostos sobre o lucro, -) → NetResult (Resultado do período) = ProfitBeforeTax + IncomeTax.
  • São 19 linhas no DateType=Competence e 18 nas outras datas base (sem o CMV). A chave Expense não existe mais: a classificação 5 é a linha FixedExpense. A Revenue deixou de ser bloco de classificação e virou subtotal: quem soma a classificação 4 é a ProductRevenue.
  • Bloco de classificação (Kind=Category): a árvore do plano restrita aos planos com aquela classificação efetiva. O pai de um nó no bloco é o pai real se ele também estiver no bloco; senão o nó é raiz do bloco (o CategoryTree dá o contexto). O valor de cada nó inclui os descendentes dele no bloco e, com IncludeSalesDiscount=1, o desconto de venda ancorado nele e nas contas filhas (ver Descontos de venda). Nó sem título nem desconto ancorado no período (na subárvore) é omitido. Depois das raízes do plano podem vir nós sintéticos, que não vêm de título e somam na linha: Embalagens (estoque) na VariableExpense (só no DateType=Competence) e, com IncludeSalesDiscount=1, Descontos de venda nas Deductions e, na ProductRevenue, o Descontos concedidos (receita cheia) do desconto que não coube numa conta de receita — ver IncomeStatementAccountNode. O Detalhe da linha (IDTypeCategoryAccountPayble) e o do plano (IDTypeAccountPayble) listam só os títulos; cada nó sintético abre pelo seu recorte (Packaging=1, SalesDiscount=1).
  • CMV (Kind=CostOfGoodsSold): o custo da mercadoria vendida, que vem do estoque e não de título — ver CMV abaixo. Accounts vem vazio; a abertura fica em Groups.
  • Subtotal (Kind=Subtotal): acumula as linhas que vêm antes dele (blocos de classificação, com os nós sintéticos, e o CMV); Accounts vem vazio e nenhum nó sintético fica nele. Nada inverte sinal — o sinal vem do título (no CMV, custo negativo), então todo subtotal é soma simples.

Fora do resultado (não entra em nenhum subtotal)

  • OutsideResult: Ativo (1), Passivo (2) e Patrimônio (3), sempre presentes, mesmo zerados; depois deles, qualquer classificação do catálogo fora de 1..13, só se tiver título. Informativo.
  • Unclassified: planos sem classificação efetiva (nem própria nem herdada), títulos sem plano de contas (nó Sem plano de contas) e títulos cujo plano não é das empresas consultadas (nó Plano de contas <id> (de outra empresa)). A tela deve mostrar quanto ficou de fora em vez de misturar no resultado.

Títulos sem data de competência (só no DateType=Competence)

  • A competência é só DateCompetence, sem data substituta: título sem ela fica fora da DRE inteira — não entra em bloco, subtotal, OutsideResult nem Unclassified.
  • O resumo avisa em WithoutCompetence quantos são e quanto somam a receber e a pagar, contando os que vencem no período (mesmo filtro de empresa, status, filial e pedido, qualquer plano de contas). O Detalhe com WithoutCompetence=1 lista exatamente esses títulos, para a competência ser preenchida.

CMV — custo da mercadoria vendida (só no DateType=Competence; nas outras datas base a linha CostOfGoodsSold não sai e CostOfGoodsSoldCheck vem null)

  • Não vem de título: vem do estoque, o custo que a venda gravou no movimento (StockKeepingUnitMovement.ValueCostTotal, custo histórico; nada de custo de hoje). A compra de mercadoria para revenda e a de embalagem devem ser classificadas como Ativo (entram no estoque, fora do resultado); o custo chega à DRE quando o item sai: pelo CMV (mercadoria e bonificação) ou pelo nó Embalagens (estoque) da Despesa variável (embalagem de envio). Compra num plano classificado como Custo ou Despesa variável conta em dobro com o estoque — ver CostOfGoodsSoldCheck.PurchaseInCost.
  • Âncora: o CMV de um pedido entra no mês da competência da receita do pedido, não na data da NF. Título de receita do pedido = a receber (IDTypeAccount=0), com IDOrder e DateCompetence, status diferente de Não lançado, das empresas consultadas e, com IDCompanyInvoice, da filial. A data-âncora é a menor DateCompetence entre todos esses títulos, e o pedido entra quando ela está no período — o CMV de um pedido cai num único mês, mesmo com títulos em meses diferentes. Motivo: a NF emitida pelos crons, importada (Bling, Tiny, upload) ou por feed de marketplace não data os títulos; ancorado na receita, quem corrige a competência do título move o CMV junto.
  • Pedidos: da empresa consultada (Orders.IDCompany — o estoque é do dono do pedido). Ficam fora orçamento (Budget=1), transferência (TypeOrder.IsTransfer=1), devolução ao fornecedor (NFeFin=4 com NfeType=1) e os pedidos filhos de triangulação (remessa por conta e ordem e remessa simbólica).
  • Itens: as linhas de saída (IDTypeMovement=1) do pedido, de SKU que não é serviço (IDTypeSku=5 fica fora). Entram no CMV as que baixaram estoque (BalanceChange=1) com custo válido. Kit: a venda grava só as linhas dos componentes, cada uma com o seu custo.
  • Valor: Values/Total = −Σ ValueCostTotal (custo negativo, na convenção da DRE) e Qty = linhas de movimento somadas. Groups abre a linha em Goods (Mercadorias) e Gratification (Bonificações: item bonificado), nesta ordem e só os que têm linha; a soma dos grupos é a linha.
  • Embalagens: as linhas de SKU embalagem (Package=1) seguem as mesmas regras (âncora, pedidos, itens, custo), mas não estão no CMV: a embalagem de envio é despesa de venda e sai na linha VariableExpense (Despesa variável), no nó sintético Embalagens (estoque) (Source=Stock, StockGroup=Packaging), depois dos planos de contas e só quando há linha. O Lucro bruto fica sem a embalagem; o EBITDA e o resultado não mudam. Lista: Packaging=1.
  • Custo inválido: custo unitário acima de R$ 10.000.000 (|ValueCostTotal| > 10.000.000 × |Quantity|), o que pega a sentinela ±9.999.999.999.999,99. Fica fora da soma (do CMV e das Embalagens) e é contado em CostOfGoodsSoldCheck.InvalidCost, de qualquer grupo.
  • Sem custo: mercadoria com custo 0 ou nulo entra como 0 (não há custo substituto) e é contada em CostOfGoodsSoldCheck.ZeroCost, com a venda dessas linhas.
  • Devolução de cliente (NFeFin=4 e NfeType=0) entra pelas mesmas regras: quantidade e custo negativos reduzem o CMV no mês da receita estornada.
  • Limitações: a devolução feita no modo padrão da tela não baixa estoque (a mercadoria volta por uma compra) e não estorna o CMV — o pedido aparece em CostOfGoodsSoldCheck.WithoutStockOut. No drop-seller, a receita do fornecedor aponta para o pedido do seller, que não é dele: o fornecedor fica sem esse CMV. E o custo recalculado depois da venda (recálculo de custo, edição do pedido) muda o CMV de um mês já fechado.
  • Pontos de atenção em CostOfGoodsSoldCheck (ver IncomeStatementCostOfGoodsSoldCheck). Cada um tem um recorte do Detalhe que lista exatamente o que foi contado, com o mesmo filtro e a mesma âncora.

Descontos de venda (IncludeSalesDiscount=1, só no resumo e só no DateType=Competence; nas outras datas base o parâmetro é ignorado)

  • O título a receber do pedido é o valor cobrado, já sem o desconto do item. Com o parâmetro, a DRE mostra esse desconto sem mudar a Receita líquida: +D na receita (a Receita bruta volta ao valor cheio) e −D na linha Deductions, no nó sintético Descontos de venda. Os nós do desconto têm Source=OrderItems e StockGroup=SalesDiscount. Os valores dos subtotais não mudam; o Qty deles soma as linhas de desconto duas vezes (na receita e nas Deduções).
  • Onde entra o +D: na conta-âncora do pedido, o plano de contas do título de receita que deu a âncora (o de menor DateCompetence, com desempate pelo id do título). Quando a classificação efetiva dela é 4 (Receita de produto) ou 13 (Receita de serviço), o +D entra no valor da própria conta, que passa a mostrar a receita cheia (e, pela soma, os superiores dela e a linha ProductRevenue ou ServiceRevenue), e a conta ganha no fim de Children, depois das subcontas, o nó sintético Descontos concedidos (receita cheia) com o quanto. A conta que no período só tem desconto não é omitida.
  • Resíduo: quando a conta-âncora não é de receita (título sem plano de contas, plano de outra empresa, plano sem classificação efetiva ou com outra, como um Passivo de adiantamento de cliente), o +D vai para o nó Descontos concedidos (receita cheia) no fim de Accounts da linha ProductRevenue, que só aparece quando há resíduo. Assim o +D nunca sai do resultado enquanto o −D fica nas Deduções.
  • D vem dos itens do pedido (StockKeepingUnitMovement): desconto da linha = ValueDiscount × Quantity (o ValueDiscount é por unidade), arredondado a centavos na própria linha. Limite conhecido: pedido cuja NF foi importada pelo upload do XML pode ter o ValueDiscount gravado como total da linha, e aí o desconto sai multiplicado pela quantidade — o mesmo desvio dos relatórios de Vendas e Fiscal. Entram as linhas de saída (IDTypeMovement=1) dos pedidos com a mesma âncora e os mesmos filtros de pedido do CMV (competência da receita; fora orçamento, transferência, devolução ao fornecedor e filhos de triangulação), sem exigir baixa de estoque e com SKU de serviço (o desconto é da receita, não do estoque). Ficam fora a bonificação (Gratification=1: vai com o preço de tabela e desconto de 100%, que não é desconto comercial) e a linha sem desconto. Devolução de cliente (quantidade negativa) reduz.
  • O resumo traz SalesDiscount (ver IncomeStatementSalesDiscount) e o Detalhe com SalesDiscount=1 lista as linhas, com ValueDiscountTotal: sem conta, todas as do período (o total de SalesDiscount e do nó Descontos de venda); com IDTypeAccountPayble=<id>, só as dos pedidos cuja conta-âncora é exatamente esse plano, sem as contas filhas (a célula do nó Descontos concedidos (receita cheia) que fica dentro dele). O nó residual da ProductRevenue não tem recorte próprio: a lista sem conta traz também o que entrou dentro das contas.

Filtros de pedido (IDTypeCompanyIntegration, IDCompanyIntegration, IDOrderType)

  • Canal de vendas (o IDTypeCompanyIntegration da integração do pedido, CompanyIntegration), integração (Orders.IDCompanyIntegration) e tipo de pedido (Orders.IDOrderType). Cada um é uma lista de ids separada por vírgula (ex.: 12,15), com até 200 ids; vazio é o mesmo que ausente.
  • Com qualquer um ativo, a DRE vira a DRE desses pedidos: entram só os títulos ligados a pedido (IDOrder) cujo pedido é das empresas consultadas e bate com todos os filtros ativos. Título sem pedido (aluguel, salários, compras, tarifa de marketplace sem pedido) fica de fora, e também o título cujo pedido é de outra empresa (drop-seller).
  • Vale para tudo que vem de título: linhas, OutsideResult, Unclassified, WithoutCompetence, CostOfGoodsSoldCheck.PurchaseInCost e os recortes de título do Detalhe, em qualquer DateType (no DatePayment, as baixas desses títulos). O CMV, as Embalagens (estoque) e os descontos de venda só ancoram os pedidos que batem com os filtros, no resumo, nos pontos de atenção e nos recortes do Detalhe: cada lista continua batendo com o seu número.
  • Devolução de cliente é um pedido próprio (NFeFin=4): os títulos do estorno e os movimentos dela (o CMV negativo) apontam para ela, e os filtros valem para a integração e o tipo dela, não os da venda estornada. A integração da devolução é a da venda, salvo com o parâmetro Utilizar integração idworks no pedido de devolução (ReturnOrderIDWorksDefaultIntegration): aí ela vai para a integração padrão da conta, e a DRE do canal ou da integração da venda fica sem o estorno (margem maior), que aparece no canal da integração padrão. O tipo da devolução é sempre um tipo de devolução, nunca o da venda: para o filtro por tipo trazer as devoluções, inclua também o tipo de devolução.
  • Sem filtro de pedido, nada muda.

Regras

  • DateFrom e DateTo são obrigatórios nos dois modos: datas reais no formato YYYY-MM-DD (2026-02-30 é inválida), DateFrom ≤ DateTo, e o período cobre no máximo 24 meses, contados por mês-calendário (o mês de DateFrom e o de DateTo entram na conta).
  • DateType decide qual data põe o título num mês: Competence (padrão) usa só DateCompetence — título sem competência fica fora (ver acima). Por isso o total pode diferir do relatório 111 (Demonstrativo Financeiro por Plano de Contas), que usa a data do documento quando falta a competência. DateDue usa o vencimento. DatePayment usa a data da baixa (AccountsPayableReceivableBankStatement) e o valor baixado, que já inclui juros, multa e desconto — é o regime de caixa. Só a Competence tem o CMV, as Embalagens (estoque) e os descontos de venda.
  • Os valores saem com sinal: a pagar (IDTypeAccount=1) negativo, a receber (IDTypeAccount=0) positivo. As somas são feitas em centavos inteiros.
  • Títulos com status Não lançado (IDStatusAccountPayableReceivable=4) ficam de fora.
  • Na conta principal, consolida todas as empresas do grupo; nas demais, só a empresa do subdomínio. IDCompanyInvoice restringe à empresa faturadora (filial).

Request​

Responses​

Type=Summary (ou sem Type): o demonstrativo (IncomeStatementSummary). Type=Detail: array de IncomeStatementDetailItem, ordenado pela data do DateType (no recorte WithoutCompetence, pelo vencimento) e pelo título — vazio quando o recorte não tem títulos ou a página passou do fim. Nos recortes CostOfGoodsSold, Packaging e CostOfGoodsSoldCheck=ZeroCost|InvalidCost, array de IncomeStatementCostOfGoodsSoldItem; em SalesDiscount, o mesmo item com ValueDiscountTotal; em CostOfGoodsSoldCheck=WithoutStockOut, array de IncomeStatementCostOfGoodsSoldOrder; em PurchaseInCost, títulos (IncomeStatementDetailItem).