---
id: object/codeunit/57
type: object
title: Codeunit 57 "Document Totals"
summary: Codeunit 57 "Document Totals" in Base Application (Microsoft.Utilities). 40 public procedures, 40 events. Present since at least BC23, still in BC30, changed in BC24-27, BC29.
tier: official
language: en
tags:
  - codeunit
  - base application
versions:
  introduced: null
  last_changed: "29"
  deprecated: null
review:
  state: derived
  by: null
  at: null
  flags: []
generated:
  at: "2026-10-11T00:31:51.816Z"
  pipeline: 0.2.0
  prompts: {}
  input_hash: d46f3f21a1b93babfa85333a3a3fcdf073d3309bb539ed257664e5c3c0b8679a
evidence:
  - kind: code
    url: https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Utilities/DocumentTotals.Codeunit.al
    title: src/Layers/W1/BaseApp/Utilities/DocumentTotals.Codeunit.al (releases/29.x)
    date: null
    commit: ea08af5ef2d6a9b5c5af4a029288abbe2c883220
    t: null
    quote: null
links:
  learn: []
  objects: []
  features: []
  topics: []
  localizations:
    - localization/be
    - localization/ca
    - localization/mx
    - localization/us
  videos: []
  posts: []
  guidelines: []
  changes:
    - change/bcapps/10798
    - change/bcapps/10736
    - change/bcapps/9585
object_type: codeunit
object_id: 57
name: Document Totals
namespace: Microsoft.Utilities
app: Base Application
extends: null
first_version: "23"
last_version: "30"
present_in:
  - "23"
  - "24"
  - "25"
  - "26"
  - "27"
  - "28"
  - "29"
  - "30"
changed_in:
  - "24"
  - "25"
  - "26"
  - "27"
  - "29"
source_major: "29"
obsolete: null
countries:
  - be
  - ca
  - mx
  - us
ms_search_form_ids: []
counts:
  fields: 0
  procedures: 96
  events: 40
  subscribers: 0
relations:
  out: 0
  referenced_by: 0
  pages: 0
  extended_by: 0
  event_subscribers: 1
  calls: 7
  called_by: 39
  implements: 0
---

# Codeunit 57 "Document Totals"

> Codeunit 57 "Document Totals" in Base Application (Microsoft.Utilities). 40 public procedures, 40 events. Present since at least BC23, still in BC30, changed in BC24-27, BC29.

Base Application · Microsoft.Utilities · BC23-30 · [source at ea08af5e](https://github.com/microsoft/BCApps/blob/ea08af5ef2d6a9b5c5af4a029288abbe2c883220/src/Layers/W1/BaseApp/Utilities/DocumentTotals.Codeunit.al) · facts from BC29

## Events published

- `OnAfterCalculatePostedSalesInvoiceTotals(var SalesInvoiceHeader: Record "Sales Invoice Header"; SalesInvoiceLine: Record "Sales Invoice Line"; var VATAmount: Decimal)` (integration)
- `OnAfterCalculatePostedSalesCreditMemoTotals(var SalesCrMemoHeader: Record "Sales Cr.Memo Header"; SalesCrMemoLine: Record "Sales Cr.Memo Line"; var VATAmount: Decimal)` (integration)
- `OnAfterCalculateSalesSubPageTotals(var TotalSalesHeader: Record "Sales Header"; var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal; var TotalSalesLine2: Record "Sales Line")` (integration)
- `OnAfterCalculatePostedPurchCreditMemoTotals(var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var VATAmount: Decimal; var PurchCrMemoLine: Record "Purch. Cr. Memo Line")` (integration)
- `OnAfterCalculatePostedPurchInvoiceTotals(var PurchInvHeader: Record "Purch. Inv. Header"; var VATAmount: Decimal; var PurchInvLine: Record "Purch. Inv. Line")` (integration)
- `OnAfterCalculatePurchaseSubPageTotals(var TotalPurchHeader: Record "Purchase Header"; var TotalPurchLine: Record "Purchase Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal; var TotalPurchaseLine2: Record "Purchase Line")` (integration)
- `OnAfterCalculateTotalPurchaseLineAndVATAmount(PurchaseHeader: Record "Purchase Header"; var VATAmount: Decimal; var TempTotalPurchaseLine: Record "Purchase Line" temporary)` (integration)
- `OnAfterSalesCheckIfDocumentChanged(SalesLine: Record "Sales Line"; xSalesLine: Record "Sales Line"; var TotalsUpToDate: Boolean)` (integration)
- `OnAfterSalesLineSetFilters(var TotalSalesLine: Record "Sales Line"; SalesLine: Record "Sales Line")` (integration)
- `OnAfterSalesRedistributeInvoiceDiscountAmounts(var TempSalesLine: Record "Sales Line" temporary; var TempTotalSalesLine: Record "Sales Line" temporary; var VATAmount: Decimal)` (integration)
- `OnAfterPurchaseCheckIfDocumentChanged(PurchaseLine: Record "Purchase Line"; xPurchaseLine: Record "Purchase Line"; var TotalsUpToDate: Boolean)` (integration)
- `OnAfterPurchaseLineSetFilters(var TotalPurchaseLine: Record "Purchase Line"; PurchaseLine: Record "Purchase Line")` (integration)
- `OnAfterPurchaseRedistributeInvoiceDiscountAmounts(var TempPurchaseLine: Record "Purchase Line" temporary; var TempTotalPurchaseLine: Record "Purchase Line" temporary; var VATAmount: Decimal)` (integration)
- `OnAfterPurchDeltaUpdateTotals(var PurchaseLine: Record "Purchase Line"; var xPurchaseLine: Record "Purchase Line"; var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal)` (integration)
- `OnAfterSalesDeltaUpdateTotals(var SalesLine: Record "Sales Line"; var xSalesLine: Record "Sales Line"; var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal)` (integration)
- `OnBeforeSalesDeltaUpdateTotals(var SalesLine: Record "Sales Line"; var xSalesLine: Record "Sales Line"; var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal; var IsHandled: Boolean)` (integration)
- `OnBeforeSalesUpdateTotals(var SalesHeader: Record "Sales Header"; PreviousTotalSalesHeader: Record "Sales Header"; var ForceTotalsRecalculation: Boolean; PreviousTotalSalesVATDifference: Decimal; var Result: Boolean; var IsHandled: Boolean)` (integration)
- `OnBeforeCalculatePostedPurchCreditMemoTotals(var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var VATAmount: Decimal; PurchCrMemoLine: Record "Purch. Cr. Memo Line"; var IsHandled: Boolean)` (integration)
- `OnBeforeCalculatePostedPurchInvoiceTotals(var PurchInvHeader: Record "Purch. Inv. Header"; var VATAmount: Decimal; PurchInvLine: Record "Purch. Inv. Line"; var IsHandled: Boolean)` (integration)
- `OnBeforeCalculatePostedSalesCreditMemoTotals(var SalesCrMemoHeader: Record "Sales Cr.Memo Header"; var VATAmount: Decimal; SalesCrMemoLine: Record "Sales Cr.Memo Line"; var IsHandled: Boolean)` (integration)
- `OnBeforeCalculatePostedSalesInvoiceTotals(var SalesInvoiceHeader: Record "Sales Invoice Header"; var VATAmount: Decimal; SalesInvoiceLine: Record "Sales Invoice Line"; var IsHandled: Boolean)` (integration)
- `OnBeforeCalculatePurchaseSubPageTotals(var TotalPurchaseHeader: Record "Purchase Header"; var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal; var IsHandled: Boolean)` (integration)
- `OnBeforeCalculateSalesSubPageTotals(var TotalSalesHeader: Record "Sales Header"; var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal; var IsHandled: Boolean; var TotalsUpToDate: Boolean; var NeedRefreshSalesLine: Boolean)` (integration)
- `OnBeforeSalesRedistributeInvoiceDiscountAmounts(var TempSalesLine: Record "Sales Line" temporary; var VATAmount: Decimal; var TempTotalSalesLine: Record "Sales Line" temporary; var IsHandled: Boolean)` (integration)
- `OnBeforeSalesUpdateTotalsControls(var SalesHeader: Record "Sales Header"; var InvDiscAmountEditable: Boolean; var IsHandled: Boolean)` (integration)
- `OnBeforePurchaseRedistributeInvoiceDiscountAmounts(var TempPurchaseLine: Record "Purchase Line" temporary; var VATAmount: Decimal; var TempTotalPurchaseLine: Record "Purchase Line" temporary; var IsHandled: Boolean)` (integration)
- `OnBeforePurchUpdateTotalsControls(var PurchaseHeader: Record "Purchase Header"; var InvDiscAmountEditable: Boolean; var IsHandled: Boolean)` (integration)
- `OnBeforePurchaseDeltaUpdateTotals(var PurchaseLine: Record "Purchase Line"; var xPurchaseLine: Record "Purchase Line"; var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal; var IsHandled: Boolean)` (integration)
- `OnBeforePurchaseUpdateTotalsControls(CurrentPurchaseLine: Record "Purchase Line"; var TotalPurchaseHeader: Record "Purchase Header"; var TotalsPurchaseLine: Record "Purchase Line"; var RefreshMessageEnabled: Boolean; var ControlStyle: Text; var RefreshMessageText: Text; var InvDiscAmountEditable: Boolean; var VATAmount: Decimal; var IsHandled: Boolean)` (integration)
- `OnCalculateSalesSubPageTotalsOnAfterSetFilters(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header")` (integration)
  - subscribers: [Codeunit 8001 "Sub. Contr. Renewal Subcribers"](../codeunit/8001.md) ExcludeLinesFromSalesDocumentTotal
- `OnCalculatePurchaseSubPageTotalsOnAfterRecalculate(var TotalPurchaseLine2: Record "Purchase Line")` (integration)
- `OnSalesUpdateTotalsControlsOnBeforeCheckDocumentNo(CurrentSalesLine: Record "Sales Line"; var TotalSalesHeader: Record "Sales Header"; var TotalsSalesLine: Record "Sales Line"; var RefreshMessageEnabled: Boolean; var ControlStyle: Text; var RefreshMessageText: Text; var InvDiscAmountEditable: Boolean; CurrPageEditable: Boolean; var VATAmount: Decimal; var IsHandled: Boolean)` (integration)
- `OnCalculatePurchaseSubPageTotalsOnAfterSetFilter(var PurchaseLine: Record "Purchase Line"; PurchaseHeader: Record "Purchase Header")` (integration)
- `OnBeforePurchaseCheckNumberOfLinesLimit(var PurchaseHeader: Record "Purchase Header"; var Result: Boolean; var IsHandled: Boolean)` (integration)
- `OnBeforeSalesCheckNumberOfLinesLimit(var SalesHeader: Record "Sales Header"; var Result: Boolean; var IsHandled: Boolean)` (integration)
- `OnCalculatePurchasePageTotalsOnAfterCalculateVATAmount(var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var PurchaseLine: Record "Purchase Line"; var TotalPurchaseLine2: Record "Purchase Line")` (integration)
- `OnAfterSalesCalculateTotalsWithInvoiceRounding(var SalesHeader: Record "Sales Header")` (integration)
- `OnBeforePurchaseUpdateTotals(var PurchaseHeader: Record "Purchase Header"; var PreviousTotalPurchaseHeader: Record "Purchase Header"; CurrentPurchaseLine: Record "Purchase Line"; var TotalsPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; Force: Boolean; var IsHandled: Boolean; var Result: Boolean)` (integration)
- `OnBeforeCalculateSalesTotals(var TotalSalesLine: Record "Sales Line")` (integration)
- `OnBeforeCalcTotalSalesAmountOnlyDiscountAllowed(var TotalSalesLine: Record "Sales Line")` (integration)

## Procedures

- `CalculateSalesPageTotals(var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var SalesLine: Record "Sales Line")`
- `CalculateSalesTotals(var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var SalesLine: Record "Sales Line")`
- `CalculateSalesSubPageTotals(var TotalSalesHeader: Record "Sales Header"; var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal)`
- `CalculatePostedSalesInvoiceTotals(var SalesInvoiceHeader: Record "Sales Invoice Header"; var VATAmount: Decimal; SalesInvoiceLine: Record "Sales Invoice Line")`
- `CalculatePostedSalesCreditMemoTotals(var SalesCrMemoHeader: Record "Sales Cr.Memo Header"; var VATAmount: Decimal; SalesCrMemoLine: Record "Sales Cr.Memo Line")`
- `CalcTotalPurchAmountOnlyDiscountAllowed(PurchLine: Record "Purchase Line"): Decimal`
- `CalcTotalSalesAmountOnlyDiscountAllowed(SalesLine: Record "Sales Line"): Decimal`
- `RefreshSalesLine(var SalesLine: Record "Sales Line")`
- `RefreshPurchaseLine(var PurchaseLine: Record "Purchase Line")`
- `SalesUpdateTotalsControls(CurrentSalesLine: Record "Sales Line"; var TotalSalesHeader: Record "Sales Header"; var TotalsSalesLine: Record "Sales Line"; var RefreshMessageEnabled: Boolean; var ControlStyle: Text; var RefreshMessageText: Text; var InvDiscAmountEditable: Boolean; CurrPageEditable: Boolean; var VATAmount: Decimal)`
- `SalesRedistributeInvoiceDiscountAmounts(var TempSalesLine: Record "Sales Line" temporary; var VATAmount: Decimal; var TempTotalSalesLine: Record "Sales Line" temporary)`
- `SalesRedistributeInvoiceDiscountAmountsOnDocument(SalesHeader: Record "Sales Header")`
- `SalesDocTotalsNotUpToDate()`
- `SalesCheckIfDocumentChanged(var SalesLine: Record "Sales Line"; var xSalesLine: Record "Sales Line")`
- `SalesCheckAndClearTotals(var SalesLine: Record "Sales Line"; var xSalesLine: Record "Sales Line"; var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal)`
- `SalesDeltaUpdateTotals(var SalesLine: Record "Sales Line"; var xSalesLine: Record "Sales Line"; var TotalSalesLine: Record "Sales Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal)`
- `PurchaseUpdateTotalsControls(CurrentPurchaseLine: Record "Purchase Line"; var TotalPurchaseHeader: Record "Purchase Header"; var TotalsPurchaseLine: Record "Purchase Line"; var RefreshMessageEnabled: Boolean; var ControlStyle: Text; var RefreshMessageText: Text; var InvDiscAmountEditable: Boolean; var VATAmount: Decimal)`
- `PurchaseUpdateTotalsControlsForceable(CurrentPurchaseLine: Record "Purchase Line"; var TotalPurchaseHeader: Record "Purchase Header"; var TotalsPurchaseLine: Record "Purchase Line"; var RefreshMessageEnabled: Boolean; var ControlStyle: Text; var RefreshMessageText: Text; var InvDiscAmountEditable: Boolean; var VATAmount: Decimal; Force: Boolean)`
- `PurchaseCalculateTotalsWithInvoiceRounding(var TempCurrentPurchaseLine: Record "Purchase Line" temporary; var VATAmount: Decimal; var TempTotalPurchaseLine: Record "Purchase Line" temporary)`
- `PurchaseRedistributeInvoiceDiscountAmounts(var TempPurchaseLine: Record "Purchase Line" temporary; var VATAmount: Decimal; var TempTotalPurchaseLine: Record "Purchase Line" temporary)`
- `PurchaseRedistributeInvoiceDiscountAmountsOnDocument(PurchaseHeader: Record "Purchase Header")`
- `PurchaseDocTotalsNotUpToDate()`
- `PurchaseCheckIfDocumentChanged(var PurchaseLine: Record "Purchase Line"; var xPurchaseLine: Record "Purchase Line")`
- `PurchaseCheckAndClearTotals(var PurchaseLine: Record "Purchase Line"; var xPurchaseLine: Record "Purchase Line"; var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal)`
- `PurchaseDeltaUpdateTotals(var PurchaseLine: Record "Purchase Line"; var xPurchaseLine: Record "Purchase Line"; var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal)`
- `CalculatePurchasePageTotals(var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var PurchaseLine: Record "Purchase Line")`
- `CalculatePurchaseTotals(var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var PurchaseLine: Record "Purchase Line")`
- `CalculatePurchaseSubPageTotals(var TotalPurchaseHeader: Record "Purchase Header"; var TotalPurchaseLine: Record "Purchase Line"; var VATAmount: Decimal; var InvoiceDiscountAmount: Decimal; var InvoiceDiscountPct: Decimal)`
- `CalculatePostedPurchInvoiceTotals(var PurchInvHeader: Record "Purch. Inv. Header"; var VATAmount: Decimal; PurchInvLine: Record "Purch. Inv. Line")`
- `CalculatePostedPurchCreditMemoTotals(var PurchCrMemoHdr: Record "Purch. Cr. Memo Hdr."; var VATAmount: Decimal; PurchCrMemoLine: Record "Purch. Cr. Memo Line")`
- `GetTotalVATCaption(CurrencyCode: Code[10]): Text`
- `GetTotalInclVATCaption(CurrencyCode: Code[10]): Text`
- `GetTotalExclVATCaption(CurrencyCode: Code[10]): Text`
- `GetTotalSalesHeaderAndCurrency(var SalesLine: Record "Sales Line"; var TotalSalesHeader: Record "Sales Header"; var Currency: Record Currency)`
- `GetTotalPurchaseHeaderAndCurrency(var PurchaseLine: Record "Purchase Line"; var TotalPurchaseHeader: Record "Purchase Header"; var Currency: Record Currency)`
- `GetInvoiceDiscAmountWithVATCaption(IncludesVAT: Boolean): Text`
- `GetInvoiceDiscAmountWithVATAndCurrencyCaption(InvDiscAmountCaptionClassWithVAT: Text; CurrencyCode: Code[10]): Text`
- `GetTotalLineAmountWithVATAndCurrencyCaption(CurrencyCode: Code[10]; IncludesVAT: Boolean): Text`
- `SalesCheckNumberOfLinesLimit(SalesHeader: Record "Sales Header"): Boolean`
- `PurchaseCheckNumberOfLinesLimit(PurchaseHeader: Record "Purchase Header"): Boolean`

Plus 16 local procedures.

## Triggers

OnRun

## Calls

From the extracted call graph of BC29 (graphify-al on the snapshot checkout): calls whose target is known from a declared type or an `Object::"Name"` argument. Interface dispatch and calls through events are not counted, so the list is not complete.

- [Codeunit 56 "Sales - Calc Discount By Type"](../codeunit/56.md) (3 calls: `SalesRedistributeInvoiceDiscountAmounts → (object)`, `SalesUpdateTotalsControls → InvoiceDiscIsAllowed`, `SalesUpdateTotalsControls → ShouldRedistributeInvoiceDiscountAmount`)
- [Codeunit 66 "Purch - Calc Disc. By Type"](../codeunit/66.md) (3 calls: `PurchaseRedistributeInvoiceDiscountAmounts → (object)`, `PurchaseUpdateTotalsControlsForceable → InvoiceDiscIsAllowed`, `PurchaseUpdateTotalsControlsForceable → ShouldRedistributeInvoiceDiscountAmount`)
- [Codeunit 80 "Sales-Post"](../codeunit/80.md) (2 calls: `CalculateTotalSalesLineAndVATAmount → GetSalesLines`, `CalculateTotalSalesLineAndVATAmount → SumSalesLinesTemp`)
- [Codeunit 90 "Purch.-Post"](../codeunit/90.md) (2 calls: `CalculateTotalPurchaseLineAndVATAmount → GetPurchLines`, `CalculateTotalPurchaseLineAndVATAmount → SumPurchLinesTemp`)
- [Codeunit 398 "Sales Tax Calculate"](../codeunit/398.md) (1 call: `CalculateSalesTaxForTempTotalPurchaseLine → CalculateTax`)
- [Codeunit 60 "Sales-Calc. Discount"](../codeunit/60.md) (1 call: `CalculateSalesSubPageTotals → CalculateInvoiceDiscountOnLine`)
- [Codeunit 70 "Purch.-Calc.Discount"](../codeunit/70.md) (1 call: `CalculatePurchaseSubPageTotals → CalculateInvoiceDiscountOnLine`)

## Called by

- [Page 6631 "Sales Return Order Subform"](../page/6631.md) (15 calls: `ApproveCalcInvDisc → SalesDocTotalsNotUpToDate`, `CalcInvDisc → SalesDocTotalsNotUpToDate`, `CalculateTotals → CalculateSalesSubPageTotals`, …)
- [Page 98 "Purch. Cr. Memo Subform"](../page/98.md) (15 calls: `ApproveCalcInvDisc → PurchaseDocTotalsNotUpToDate`, `CalcInvDisc → PurchaseDocTotalsNotUpToDate`, `CalculateTotals → CalculatePurchaseSubPageTotals`, …)
- [Page 46 "Sales Order Subform"](../page/46.md) (14 calls: `ApproveCalcInvDisc → SalesDocTotalsNotUpToDate`, `CalcInvDisc → SalesDocTotalsNotUpToDate`, `CalculateTotals → CalculateSalesSubPageTotals`, …)
- [Page 47 "Sales Invoice Subform"](../page/47.md) (14 calls: `ApproveCalcInvDisc → SalesDocTotalsNotUpToDate`, `CalcInvDisc → SalesDocTotalsNotUpToDate`, `CalculateTotals → CalculateSalesSubPageTotals`, …)
- [Page 55 "Purch. Invoice Subform"](../page/55.md) (14 calls: `ApproveCalcInvDisc → PurchaseDocTotalsNotUpToDate`, `CalculateTotals → CalculatePurchaseSubPageTotals`, `CalculateTotals → PurchaseCheckIfDocumentChanged`, …)
- [Page 6641 "Purchase Return Order Subform"](../page/6641.md) (14 calls: `ApproveCalcInvDisc → PurchaseDocTotalsNotUpToDate`, `CalculateTotals → CalculatePurchaseSubPageTotals`, `CalculateTotals → PurchaseCheckIfDocumentChanged`, …)
- [Page 95 "Sales Quote Subform"](../page/95.md) (14 calls: `ApproveCalcInvDisc → SalesDocTotalsNotUpToDate`, `CalcInvDisc → SalesDocTotalsNotUpToDate`, `CalculateTotals → CalculateSalesSubPageTotals`, …)
- [Page 96 "Sales Cr. Memo Subform"](../page/96.md) (14 calls: `ApproveCalcInvDisc → SalesDocTotalsNotUpToDate`, `CalcInvDisc → SalesDocTotalsNotUpToDate`, `CalculateTotals → CalculateSalesSubPageTotals`, …)
- [Page 508 "Blanket Sales Order Subform"](../page/508.md) (13 calls: `ApproveCalcInvDisc → SalesDocTotalsNotUpToDate`, `CalculateTotals → CalculateSalesSubPageTotals`, `CalculateTotals → RefreshSalesLine`, …)
- [Page 510 "Blanket Purchase Order Subform"](../page/510.md) (13 calls: `ApproveCalcInvDisc → PurchaseDocTotalsNotUpToDate`, `CalculateTotals → CalculatePurchaseSubPageTotals`, `CalculateTotals → PurchaseCheckIfDocumentChanged`, …)
- [Page 54 "Purchase Order Subform"](../page/54.md) (13 calls: `ApproveCalcInvDisc → PurchaseDocTotalsNotUpToDate`, `CalculateTotals → CalculatePurchaseSubPageTotals`, `CalculateTotals → PurchaseCheckIfDocumentChanged`, …)
- [Page 97 "Purchase Quote Subform"](../page/97.md) (13 calls: `ApproveCalcInvDisc → PurchaseDocTotalsNotUpToDate`, `CalculateTotals → CalculatePurchaseSubPageTotals`, `CalculateTotals → PurchaseCheckIfDocumentChanged`, …)
- [Codeunit 5477 "Sales Invoice Aggregator"](../codeunit/5477.md) (2 calls: `AssignTotalsFromSalesInvoiceLine → CalculatePostedSalesInvoiceTotals`, `AssignTotalsFromSalesLine → CalculateSalesTotals`)
- [Codeunit 5508 "Graph Mgt - Sal. Cr. Memo Buf."](../codeunit/5508.md) (2 calls: `AssignTotalsFromSalesCreditMemoLine → CalculatePostedSalesCreditMemoTotals`, `AssignTotalsFromSalesLine → CalculateSalesTotals`)
- [Codeunit 5511 "Graph Mgt - Purch. Cr. Memo"](../codeunit/5511.md) (2 calls: `AssignTotalsFromPurchaseCreditMemoLine → CalculatePostedPurchCreditMemoTotals`, `AssignTotalsFromPurchaseLine → CalculatePurchaseTotals`)
- [Codeunit 5529 "Purch. Inv. Aggregator"](../codeunit/5529.md) (2 calls: `AssignTotalsFromPurchaseInvoiceLine → CalculatePostedPurchInvoiceTotals`, `AssignTotalsFromPurchaseLine → CalculatePurchaseTotals`)
- [Codeunit 1218 "Map Incoming Doc to Purch Doc"](../codeunit/1218.md) (1 call: `VerifyTotals → PurchaseCalculateTotalsWithInvoiceRounding`)
- [Codeunit 442 "Sales-Post Prepayments"](../codeunit/442.md) (1 call: `Code → SalesRedistributeInvoiceDiscountAmountsOnDocument`)
- [Codeunit 5341 "CRM Int. Table. Subscriber"](../codeunit/5341.md) (1 call: `UpdateCRMInvoiceAfterInsertRecord → CalculatePostedSalesInvoiceTotals`)
- [Codeunit 5496 "Graph Mgt - Sales Order Buffer"](../codeunit/5496.md) (1 call: `AssignTotalsFromSalesLine → CalculateSalesTotals`)
- [Codeunit 5497 "Graph Mgt - Purch Order Buffer"](../codeunit/5497.md) (1 call: `AssignTotalsFromPurchaseLine → CalculatePurchaseTotals`)
- [Codeunit 5506 "Graph Mgt - Sales Quote Buffer"](../codeunit/5506.md) (1 call: `AssignTotalsFromSalesLine → CalculateSalesTotals`)
- [Page 133 "Posted Sales Invoice Subform"](../page/133.md) (1 call: `OnAfterGetCurrRecord → CalculatePostedSalesInvoiceTotals`)
- [Page 135 "Posted Sales Cr. Memo Subform"](../page/135.md) (1 call: `OnAfterGetCurrRecord → CalculatePostedSalesCreditMemoTotals`)
- [Page 139 "Posted Purch. Invoice Subform"](../page/139.md) (1 call: `OnAfterGetCurrRecord → CalculatePostedPurchInvoiceTotals`)
- [Page 141 "Posted Purch. Cr. Memo Subform"](../page/141.md) (1 call: `OnAfterGetCurrRecord → CalculatePostedPurchCreditMemoTotals`)
- [Page 41 "Sales Quote"](../page/41.md) (1 call: `SaveInvoiceDiscountAmount → SalesRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 42 "Sales Order"](../page/42.md) (1 call: `SaveInvoiceDiscountAmount → SalesRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 43 "Sales Invoice"](../page/43.md) (1 call: `SaveInvoiceDiscountAmount → SalesRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 44 "Sales Credit Memo"](../page/44.md) (1 call: `SaveInvoiceDiscountAmount → SalesRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 49 "Purchase Quote"](../page/49.md) (1 call: `SaveInvoiceDiscountAmount → PurchaseRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 50 "Purchase Order"](../page/50.md) (1 call: `SaveInvoiceDiscountAmount → PurchaseRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 507 "Blanket Sales Order"](../page/507.md) (1 call: `SaveInvoiceDiscountAmount → SalesRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 509 "Blanket Purchase Order"](../page/509.md) (1 call: `SaveInvoiceDiscountAmount → PurchaseRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 51 "Purchase Invoice"](../page/51.md) (1 call: `SaveInvoiceDiscountAmount → PurchaseRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 52 "Purchase Credit Memo"](../page/52.md) (1 call: `SaveInvoiceDiscountAmount → PurchaseRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 6630 "Sales Return Order"](../page/6630.md) (1 call: `SaveInvoiceDiscountAmount → SalesRedistributeInvoiceDiscountAmountsOnDocument`)
- [Page 6640 "Purchase Return Order"](../page/6640.md) (1 call: `SaveInvoiceDiscountAmount → PurchaseRedistributeInvoiceDiscountAmountsOnDocument`)
- [Table 38 "Purchase Header"](../table/38.md) (1 call: `IsTotalValid → PurchaseCalculateTotalsWithInvoiceRounding`)

## Recent changes

- 2026-09-14 [#10798 [29x]-Mismatch between Purchase Invoice Total in Lines and Statistics after VAT adjustment](../../changes/bcapps/10798.md) (releases/29.x, BC29, fix)
- 2026-08-31 [#10736 [Main]- Mismatch between Purchase Invoice Total in Lines and Statistics after VAT adjustment](../../changes/bcapps/10736.md) (main, BC30, fix)
- 2026-07-20 [#9585 [master] Description Field value gets automatically reverted the original value after changing it.](../../changes/bcapps/9585.md) (main, BC30, fix)

## Across versions

- Present in: BC23-30
- Changed (declaration) in: BC24-27, BC29

## Countries that replace it

[BE](../../localizations/be.md), [CA](../../localizations/ca.md), [MX](../../localizations/mx.md), [US](../../localizations/us.md)

Source: AL metadata extracted from the code (names, ids, signatures, properties); no code bodies (D10).

## Ask your agent

Procedure bodies are not stored here (D10). The call sections above are our own, per object, from the BC29 call graph. For a procedure body or the calls of one procedure, ask bc-code-atlas (external, by Stefan Maron, MIT; default corpus w1-28), which the bc-observatory plugin connects: `bcatlas_resolve_node(object_type: "codeunit", object_name: "Document Totals")`, then `bcatlas_get_procedure_body` or `bcatlas_get_neighbors` on the returned id.
