The rule that decides which cost-flow method the engine uses for a transaction, per accounting book. Resolution is most-specific-scope-wins: candidates are filtered to the book, to active rows and to the effective window, then a non-null scope key (business unit, branch, storage location, item group, item) must equal the transaction's value while a null key is a wildcard, with Priority and then a later EffectiveFrom breaking ties; when nothing matches the engine falls back to MovingAverage. CostingLevel is a separate axis setting the cost-pool boundary and takes no part in the scope match. Two traps: the seeded picklist stores Weighted Average and Moving Average with a space while the engine compares against unspaced constants, and the resolver's own validation (LIFO gating by GAAP framework, method-versus-level coherence, overlapping scopes) has no save-time caller, so contradictory or unusable policies can be saved.
Fields
| Field | Label | Type | Required | What it does |
AccountingBookId | Accounting Book | Lookup → AccountingBook | | Resolution is filtered to this book before anything else, so a policy on a different book is never considered. Because only the primary book persists cost layers, policies attached to a secondary book influence only the replay-driven overlay and the reporting paths, never the posted general ledger. |
BranchId | Branch | Lookup → Branch | | A scope key matched against the transaction's branch; leaving it empty makes the policy apply across branches. Together with the item it is one of only two location-or-item keys the live posting path actually supplies. |
BusinessUnitId | Business Unit | Lookup → BusinessUnit | | A scope key that matches only when the caller supplies a business unit. The live cost-posting path never does, so a policy scoped to a business unit does not participate in posting-time resolution. |
CostingLevel | Costing Level | Text | | The boundary of a single cost pool - one FIFO queue or one average pool per this key - and it is a separate axis from the policy's scope, so it does not affect which transactions the policy matches. |
CreatedById | Created By | Lookup → UserAccount | Yes | |
CreatedDateTime | Created Date | DateAndTime | Yes | |
EffectiveFrom | Effective From | Date | | The policy is ignored for transactions dated before this, which is how a method change is applied prospectively rather than restating history. It is also the second tie-breaker at equal specificity and equal priority, where the later date wins. |
EffectiveTo | Effective To | Date | | The policy is ignored for transactions dated after this. The only validation on the window is that it must not precede EffectiveFrom, and even that check has no save-time caller, so an inverted or overlapping window will not be rejected. |
Id | Id | Guid | Yes | |
IsActive | Is Active | Boolean | | Only an explicit false excludes the policy from resolution; an empty value is treated as active. Deactivating is the safe way to retire a rule, since deleting one changes which policy wins for historical replays too. |
IsDefault | Is Default | Boolean | | Setting it does not make a scoped policy behave as a default. |
ItemGroupId | Item Group | Lookup → ItemGroup | | A scope key that matches only when the caller supplies an item group in the resolution context. |
ItemId | Item | Lookup → Item | | A scope key rather than a filter on which items the policy covers: leaving it empty makes the policy apply to every item, and setting it makes the policy the most specific match available, outranking an item-group-scoped rule and every location-level rule. |
ModifiedById | Modified By | Lookup → UserAccount | Yes | |
Name | Name | Text | Yes | |
OwnerId | Owner | Lookup → UserAccount | Yes | |
PartnerAccountId | Partner Account | Lookup → Account | | The owning company or legal entity, and also matched as a scope key - a policy left empty here applies to any company within the book. It contributes nothing to the specificity score. |
Priority | Priority | Number | | Tie-breaker between policies of equal specificity, where the lower number wins; an empty value is treated as the weakest possible precedence. It cannot promote a broadly scoped policy over a more specific one - specificity is decided first. |
RecordTypeId | Record Type | Guid, hidden | | |
StorageLocationId | Storage Location | Lookup → StorageLocation | | A scope key that matches only when the caller supplies a storage location. |
UIProps | UI Props | Text | | |
UpdatedDateTime | Modified Date | DateAndTime | Yes | |
ValuationMethod | Valuation Method | PickList | | The cost-flow algorithm the engine runs for transactions this policy wins. FIFO, LIFO, MovingAverage, WeightedAverage (periodic) and SpecificIdentification are implemented; StandardCost is named in the taxonomy but the strategy factory refuses it outright as a later phase. The picklist also omits Specific Identification and Standard Cost. Values: FIFO, LIFO, Weighted Average, Moving Average. |
Actions
| Action | Label | Type | What it does |
BulkDelete | Delete | Delete | Delete the selected records |
Clone | Clone | ServerAction (Clone) | Create a copy of this record |
Delete | Delete | Delete | Delete record |
DeleteInList | Delete | Delete | Delete record from the list |
Edit | Edit | Edit | Edit record |
EditInLine | Edit | EditInline | Edit record inline |
EditListRow | Edit | Edit | Edit record from the list |
New | New | New | Create a new record |