Addresses microsoft/BCQuality#175 review feedback: - Extend al-data-modeling-review's entry gate/relevance scope and token list to recognize document actions, Navigate subscribers, Report Selection registration, price-calculation/price-source extensibility, TransferFields posting-cascade mirroring, and barcode font-provider usage - previously excluded before any worklist cue could run. - Fix document-print-and-email-actions-call-report-selections-directly: permit the legitimate stateless DocumentSendingProfile.TrySendToPrinter/ TrySendToEMail path; rework the bad fixture to load a configured profile instead of demonstrating a trivial blank-record no-op. - Fix extend-report-selection-usage-for-new-document-types: scope to the applicable single counterparty (ReportSelectionHandlerCZZ partitions strictly; only genuinely two-sided usages like Compensation need both), and add the page-facing usage-enum map/validate events alongside the filter-event subscription for full Document Layouts support. - Fix a stale field-citation in custom-document-dispatch-must-not-bypass- report-selections (Custom Report Layout Code is field 7, not part of the 19-26 email-configuration range). - Add deterministic positive/clean evaluation coverage (review-fixtures.json additionalArticles + Test-ReviewFixtures.ps1 support) so all 9 new good/bad pairs are actually exercised, not just present. - Add 4 new patterns: activate-new-price-calculation-handler-via- onfindsupportedsetup, extend-price-source-type-must-sync-document- subset-enum, new-price-source-must-add-candidate-and-trigger- recalculation, report-barcodes-must-use-barcode-module-and-production- font-name. All claims verified against live microsoft/BCApps source and Microsoft Learn. Validators: frontmatter 0/0, review-fixtures 52 cases/17 domains PASSED, knowledge-index 309 articles PASSED. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
4.2 KiB
| bc-version | domain | keywords | technologies | countries | application-area | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
data-modeling |
|
|
|
|
Activate a new Price Calculation Handler through OnFindSupportedSetup, not just by implementing it
Description
enum 7011 "Price Calculation Handler" (implements "Price Calculation") is how a new pricing engine plugs into Business Central —
extend the enum with a value pointing at a codeunit that implements the
Price Calculation interface. That alone does not make the new handler
usable on any document. codeunit 7001 "Price Calculation Mgt." decides
which handler applies to a given line by looking up table 7006 "Price Calculation Setup", a table of (Code, Method, Type, Asset Type, Implementation, Enabled, Default) rows populated at startup by its own
OnFindSupportedSetup event — every implementation codeunit is expected
to subscribe to that event and insert its own setup row(s). A handler
enum value with no matching setup row is real and selectable in the enum
itself, but never chosen for any actual sale, purchase, or job line,
because Price Calculation Mgt. has no setup row that names it. A setup
row that exists but doesn't match is just as invisible: FindSetup
filters candidates with SetRange(Default, true) and SetRange(Method, DtldPriceCalcSetup.Method) (a document's blank Method is normalized to
"Lowest Price" before that filter runs), so a row inserted without
Default := true, or with a Method that doesn't match, is never
selected either — same symptom, different cause.
Best Practice
Ship a new Price Calculation Handler value together with an
OnFindSupportedSetup subscriber that inserts at least one Price Calculation Setup record naming it as the Implementation, for the
relevant Method (e.g. "Lowest Price"), Type (Sale/Purchase), and
Asset Type — with Default := true, since FindSetup only considers
rows where Default is set when resolving a handler for a line.
See sample: activate-new-price-calculation-handler-via-onfindsupportedsetup.good.al.
Anti Pattern
Extending Price Calculation Handler and implementing the Price Calculation interface, without subscribing to OnFindSupportedSetup to
insert a setup record. The new handler exists, compiles, and can even be
selected manually if a user creates their own Price Calculation Setup
row through the UI — but ships with no default row, so it's never active
for anyone until someone notices it's missing and configures it by hand.
See sample: activate-new-price-calculation-handler-via-onfindsupportedsetup.bad.al.
Source
BCApps (src/Layers/W1/BaseApp/Pricing/Calculation/):
PriceCalculationHandler.Enum.al (enum 7011 "Price Calculation Handler" implements "Price Calculation"); PriceCalculationMgt.Codeunit.al
(local procedure OnFindSupportedSetup(var TempPriceCalculationSetup: Record "Price Calculation Setup" temporary), called during setup
resolution, and procedure FindSetup(...), which requires
SetRange(Default, true) and a matching SetRange(Method, DtldPriceCalcSetup.Method) before a row can be selected);
PriceCalculationSetup.Table.al (table 7006 "Price Calculation Setup":
Code (Code[100]), Method (Enum "Price Calculation Method"), Type
(Enum "Price Type"), "Asset Type" (Enum "Price Asset Type"),
Implementation (Enum "Price Calculation Handler"), Enabled (Boolean),
Default (Boolean)).
BCApps (src/Layers/W1/BaseApp/Pricing/PriceList/): PriceType.Enum.al
(enum 7009 "Price Type": Any(0)/Sale(1)/Purchase(2)).
Microsoft Learn, "Extending Price Calculations": "For the new codeunit, you must extend the Price Calculation Handler enum that implements Price Calculation interface... Afterwards you can insert a record in the Price Calculation Setup table... Each codeunit that implements the Price Calculation interface must subscribe to the OnFindSupportedSetup() event of the Price Calculation Mgt codeunit to fill the price calculation setup table with new options." (https://learn.microsoft.com/dynamics365/business-central/dev-itpro/developer/devenv-extending-best-price-calculations)