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 semType): um objetoIncomeStatementSummary. - Detalhe (
Type=Detail): o que forma uma célula do resumo — os títulos (noDateType=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=1ouPurchaseInCost=1— e é paginado em 1000 linhas porPage(a partir de0). 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 é oIDTypeAccountPayblejunto comSalesDiscount=1: aí ele não é recorte próprio e restringe a lista dos descontos à conta-âncora (verSalesDiscount).
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
Despesasleva 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ó noDateType=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=Competencee 18 nas outras datas base (sem o CMV). A chaveExpensenão existe mais: a classificação 5 é a linhaFixedExpense. ARevenuedeixou de ser bloco de classificação e virou subtotal: quem soma a classificação 4 é aProductRevenue. - 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 (oCategoryTreedá o contexto). O valor de cada nó inclui os descendentes dele no bloco e, comIncludeSalesDiscount=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)naVariableExpense(só noDateType=Competence) e, comIncludeSalesDiscount=1,Descontos de vendanasDeductionse, naProductRevenue, oDescontos concedidos (receita cheia)do desconto que não coube numa conta de receita — verIncomeStatementAccountNode. 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.Accountsvem vazio; a abertura fica emGroups. - Subtotal (
Kind=Subtotal): acumula as linhas que vêm antes dele (blocos de classificação, com os nós sintéticos, e o CMV);Accountsvem 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,OutsideResultnemUnclassified. - O resumo avisa em
WithoutCompetencequantos 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 comWithoutCompetence=1lista 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 — verCostOfGoodsSoldCheck.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), comIDOrdereDateCompetence, status diferente de Não lançado, das empresas consultadas e, comIDCompanyInvoice, da filial. A data-âncora é a menorDateCompetenceentre 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=4comNfeType=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=5fica 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) eQty= linhas de movimento somadas.Groupsabre a linha emGoods(Mercadorias) eGratification(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 linhaVariableExpense(Despesa variável), no nó sintéticoEmbalagens (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 emCostOfGoodsSoldCheck.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=4eNfeType=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(verIncomeStatementCostOfGoodsSoldCheck). 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éticoDescontos de venda. Os nós do desconto têmSource=OrderItemseStockGroup=SalesDiscount. Os valores dos subtotais não mudam; oQtydeles 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 linhaProductRevenueouServiceRevenue), e a conta ganha no fim deChildren, depois das subcontas, o nó sintéticoDescontos 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 deAccountsda linhaProductRevenue, 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(oValueDiscounté por unidade), arredondado a centavos na própria linha. Limite conhecido: pedido cuja NF foi importada pelo upload do XML pode ter oValueDiscountgravado 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(verIncomeStatementSalesDiscount) e o Detalhe comSalesDiscount=1lista as linhas, comValueDiscountTotal: sem conta, todas as do período (o total deSalesDiscounte do nóDescontos de venda); comIDTypeAccountPayble=<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 daProductRevenuenã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
IDTypeCompanyIntegrationda 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.PurchaseInCoste os recortes de título do Detalhe, em qualquerDateType(noDatePayment, 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
DateFromeDateTosão obrigatórios nos dois modos: datas reais no formatoYYYY-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 deDateFrome o deDateToentram na conta).DateTypedecide 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.DateDueusa o vencimento.DatePaymentusa a data da baixa (AccountsPayableReceivableBankStatement) e o valor baixado, que já inclui juros, multa e desconto — é o regime de caixa. Só aCompetencetem 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.
IDCompanyInvoicerestringe à empresa faturadora (filial).
Request
Responses
- 200
- 400
- 500
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).
Erro de validação. Mensagens possíveis:
[BadRequest] - Type inválido. Use Summary ou Detail—Typefora do enum.[BadRequest] - Erro na configuração da empresa— o token não traz empresa para o subdomínio.[BadRequest] - Informe o período da DRE (DateFrom e DateTo)—DateFromouDateToausente, fora do formatoYYYY-MM-DDou data que não existe (ex.:2026-02-30).[BadRequest] - A data final precisa ser igual ou posterior à data inicial[BadRequest] - Data base inválida. Use Competence, DateDue, DatePayment—DateTypefora do enum.[BadRequest] - O período da DRE pode ter no máximo 24 meses[BadRequest] - Empresa inválida—IDCompanyInvoicenão é inteiro positivo.[BadRequest] - Canal de vendas inválido—IDTypeCompanyIntegrationcom item que não é inteiro positivo (ex.:abc,0,12,) ou com mais de 200 ids.[BadRequest] - Integração inválida— o mesmo, emIDCompanyIntegration.[BadRequest] - Tipo de pedido inválido— o mesmo, emIDOrderType.[BadRequest] - Informe a classificação, o plano de contas ou os títulos sem classificação—Type=Detailsem nenhum recorte.[BadRequest] - O recorte WithoutCompetence só vale com a data base Competence—Type=DetailcomWithoutCompetence=1eDateTypediferente deCompetence.[BadRequest] - O recorte do CMV só vale com a data base Competence—Type=DetailcomCostOfGoodsSoldCheck,CostOfGoodsSold=1ouPurchaseInCost=1eDateTypediferente deCompetence.[BadRequest] - Verificação do CMV inválida. Use ZeroCost, InvalidCost ou WithoutStockOut—Type=DetailcomCostOfGoodsSoldCheckfora do enum.[BadRequest] - Grupo do CMV inválido. Use Goods ou Gratification—Type=DetailcomCostOfGoodsSold=1eCostOfGoodsSoldGroupfora do enum (inclusivePackaging, que virou o recortePackaging=1).[BadRequest] - O recorte de estoque só vale com a data base Competence—Type=DetailcomPackaging=1ouSalesDiscount=1eDateTypediferente deCompetence.[BadRequest] - Classificação não existe—Type=DetailcomIDTypeCategoryAccountPayblefora do catálogo (ou que não é inteiro positivo).[BadRequest] - Plano de contas inválido—Type=DetailcomIDTypeAccountPaybleque não é inteiro positivo (no recorte de plano ou junto comSalesDiscount=1).
Erro interno (prefixo Error:), com o erro do banco entre parênteses quando houver. Mensagens possíveis:
Error: falha ao consultar o plano de contas (<erro>)Error: falha ao consultar as classificações do plano de contas (<erro>)Error: falha ao somar os títulos da DRE (<erro>)— Resumo.Error: falha ao somar os títulos sem data de competência (<erro>)— Resumo, só noDateType=Competence.Error: falha ao somar o CMV (<erro>)— Resumo, só noDateType=Competence.Error: falha ao somar os descontos de venda (<erro>)— Resumo, só comIncludeSalesDiscount=1noDateType=Competence.Error: falha ao listar os títulos da DRE (<erro>)— Detalhe (recortes de título, inclusivePurchaseInCost).Error: falha ao listar os itens do CMV (<erro>)— Detalhe, recortesCostOfGoodsSoldeCostOfGoodsSoldCheck=ZeroCost|InvalidCost.Error: falha ao listar as embalagens do estoque (<erro>)— Detalhe, recortePackaging.Error: falha ao listar os descontos de venda (<erro>)— Detalhe, recorteSalesDiscount.Error: falha ao listar os pedidos sem baixa de estoque (<erro>)— Detalhe, recorteCostOfGoodsSoldCheck=WithoutStockOut.Error: falha ao montar a DRE(Resumo) eError: falha ao listar os títulos da DRE(Detalhe) — falha inesperada.