Fixed asset acquisition posted
Fires when a fixed asset acquisition transaction is written in D365FO: an acquisition posted against a book, and also the rows that a transaction reversal or an asset reclassification writes with the acquisition transaction type, which the payload flags with isReversal and isReclassification. The event emits the asset, book, amount, voucher and date so downstream systems can track capital expenditure, update asset registers, or kick off approval and reporting workflows.
| Event class | MGCLatticeFixedAssetAcquisitionPostedBusinessEvent |
| Contract class | MGCLatticeFixedAssetAcquisitionPostedBusinessEventContract |
| Category | Fixed assets |
| Module | ModuleAxapta::FixedAssets |
| Label IDs | FixedAssetAcquisitionPostedBusinessEventName / FixedAssetAcquisitionPostedBusinessEventDescription |
| Trigger | AssetTrans.insert() -> TransType == AssetTransType::Acquisition |
Trigger / Hook
- Extension class
MGCLatticeAssetTrans_Table_Extension,[ExtensionOf(tableStr(AssetTrans))]. - CoC method signature:
void insert()(Chain of Command wrapper over theAssetTranstableinsert). - Firing condition: after
next insert(), the newly insertedAssetTransrecord is checked forthis.TransType == AssetTransType::Acquisition. Only acquisition-type transactions raise this event; acquisition adjustments (AcquisitionAdj) do not. (The sameinsert()method raisesMGCLatticeFixedAssetDisposalPostedBusinessEventforDisposalSale/DisposalScraptransaction types.) - One event per
AssetTransrow: an acquisition posted to several books, including derived books, raises one event per book. - Who writes acquisition rows: asset posting (a fixed asset journal, a vendor invoice or product receipt for an asset, and processes that post through a fixed asset journal, such as an asset split), the transaction reversal function, and asset reclassification. All of them raise the event:
- Posting -
isReversalandisReclassificationare bothfalse. The amount can be negative for an ordinary posting too, for example a vendor credit note for an asset or the source asset of an asset split. - Reversal - the Reverse transaction function (from the asset transactions, or when a vendor or customer transaction that includes the acquisition is reversed) writes a copy of the original row with the amount negated; revoking a reversal writes another copy with the original sign. Both rows have
isReversal=true. They are marked byMGCLatticeTransactionReversal_Asset_Class_Extension, which wrapsTransactionReversal_Asset.createAssetTrans()in anMGCLatticeAssetTransOriginContextreversal scope; nothing on the row itself identifies a reversal when it is inserted. - Reclassification - asset reclassification writes the negated row on the old asset and a copy on the new asset. Both have
isReclassification=true, from D365's ownAssetTrans.Reclassificationflag and from the reclassification scope thatMGCLatticeAssetReclassification_Class_Extensionopens aroundAssetReclassification.run(). A reversal of such a row has both flags set.
- Posting -
- Inserts that bypass the table's
insert()method (doInsert(), or set-based inserts with data methods skipped) do not raise it. - Timing:
AssetTransrows are written inside the posting, reversal or reclassification transaction.send()writes the event to the business events commit log in that transaction and it is delivered after commit, so a posting that rolls back never delivers the event. - Enablement gate:
BusinessEventsConfigurationReader::isBusinessEventEnabled(classStr(MGCLatticeFixedAssetAcquisitionPostedBusinessEvent))must return true before the event is sent.
void insert()
{
next insert();
boolean isAcquisition = this.TransType == AssetTransType::Acquisition;
boolean isDisposal = this.TransType == AssetTransType::DisposalSale || this.TransType == AssetTransType::DisposalScrap;
if (!isAcquisition && !isDisposal)
{
return;
}
// Read the writer's scope now: the reversal link that would identify a reversing row is written after it.
boolean isReversal = MGCLatticeAssetTransOriginContext::isReversalInProgress();
boolean isReclassification = MGCLatticeAssetTransOriginContext::isReclassificationInProgress();
if (isAcquisition)
{
if (BusinessEventsConfigurationReader::isBusinessEventEnabled(classStr(MGCLatticeFixedAssetAcquisitionPostedBusinessEvent)))
{
MGCLatticeFixedAssetAcquisitionPostedBusinessEvent::newFromAssetTrans(this, isReversal, isReclassification).send();
}
}
else
{
if (BusinessEventsConfigurationReader::isBusinessEventEnabled(classStr(MGCLatticeFixedAssetDisposalPostedBusinessEvent)))
{
MGCLatticeFixedAssetDisposalPostedBusinessEvent::newFromAssetTrans(this, isReversal, isReclassification).send();
}
}
}
Payload Contract
One row per [DataMember], in declaration order:
| JSON field | Display label | Type / EDT | Source | Notes |
|---|---|---|---|---|
legalEntity | Legal Entity | DataAreaId | _assetTrans.DataAreaId | Company ID of the asset transaction, in lower case (for example usmf) |
assetId | Asset ID | AssetId | _assetTrans.AssetId | Fixed asset number. For a reclassification, the old asset on the negated row and the new asset on the copy. |
bookId | Book ID | AssetBookId | _assetTrans.BookId | Book the transaction was written to. |
acquisitionAmountMST | Acquisition Amount MST | AmountMST | _assetTrans.AmountMST | Amount in the company's accounting currency (MST), signed as on the asset transaction: negative when the row takes acquisition cost off the asset (a reversal, the old asset's row of a reclassification, a credit note). |
transDate | Transaction Date | TransDate | _assetTrans.TransDate | Date of the asset transaction (the reversal or reclassification date for those rows); "\/Date(ms)\/" form. |
voucher | Voucher | Voucher | _assetTrans.Voucher | Voucher of the asset transaction; a reversal and a reclassification each have their own voucher. |
isReversal | Is Reversal | boolean | Reversal scope when the row was inserted | true when the transaction reversal function wrote the row (a reversal, or the revoke of one); written as true/false. |
isReclassification | Is Reclassification | boolean | Reclassification scope, or _assetTrans.Reclassification | true when the row belongs to an asset reclassification; written as true/false. |
crossReferences | Cross references | List of MGCLatticeCrossReferenceEventContract | MGCLatticeCrossReferenceEventHelper::listForFixedAsset(AssetTrans.AssetId, AssetTrans.DataAreaId) | Keys external systems hold for the fixed asset: one { externalSystem, externalKey } object per external system, ordered by external system, historical keys included; [] when it has none. See Cross-reference keys. |
Every Lattice event also carries the Lattice ordering and correlation envelope, inherited from MGCLatticeBusinessEventContractBase: eventSequence (Int64 - increasing across the whole catalog and all companies, allocated when the event is raised inside the business transaction, not when it commits; it orders the events of one business record, gaps are permanent and normal, and it must not be used to re-sequence the whole stream), correlationId (String, always Scope:Key - groups emissions that belong to one logical run; an event that joins no run carries Event: followed by a lower-case GUID unique to this emission) and schemaVersion (Int - the payload shape version; 1 for this contract). D365 F&O also adds its standard envelope fields to every business event payload: BusinessEventId, BusinessEventLegalEntity, ContextRecordSubject, ControlNumber, EventId, EventTime, EventTimeIso8601, InitiatingUserAADObjectId, MajorVersion, MinorVersion, and ParentContextRecordSubjects. Do not rely on the order of members in the delivered JSON.
This event does not join a run: correlationId is unique to each emission (rows for several books do not share it).
Example Payload
{
"BusinessEventId": "MGCLatticeFixedAssetAcquisitionPostedBusinessEvent",
"ControlNumber": 587213,
"EventId": "A1F3C9E8-7B42-4D11-9E6A-2C8F0D4B7E51",
"EventTime": "\/Date(1790241342000)\/",
"EventTimeIso8601": "2026-09-24T09:15:42.9300393Z",
"MajorVersion": 0,
"MinorVersion": 0,
"BusinessEventLegalEntity": "USMF",
"ContextRecordSubject": "",
"InitiatingUserAADObjectId": "{22B6D1D6-B5F9-0A05-4AA0-B30CAA799E23}",
"ParentContextRecordSubjects": [],
"eventSequence": 48142,
"correlationId": "Event:f4d08b6e-2c91-4a73-be50-8d1a6c3f9e27",
"schemaVersion": 1,
"legalEntity": "usmf",
"assetId": "COMP-000073",
"bookId": "200_SLLR",
"acquisitionAmountMST": 15000.00,
"transDate": "\/Date(1790208000000)\/",
"voucher": "FAAQ000217",
"isReversal": false,
"isReclassification": false,
"crossReferences": [
{
"externalSystem": "LEGACYERP",
"externalKey": "FA-7731"
}
]
}
Reversing that acquisition raises the event again for the same asset and book with "acquisitionAmountMST": -15000.00, the reversal's own voucher and date, and "isReversal": true.
Activation
In the D365FO client, go to System administration > Setup > Business events > Business events catalog. Find the event by name ("Fixed asset acquisition posted") or by filtering the Category column to Fixed assets. Select it and use Activate to bind it to an endpoint (for example an Azure Service Bus queue, Event Grid topic, or Power Automate / HTTPS endpoint).
Related Events
- Fixed asset disposal posted - raised from the same
MGCLatticeAssetTrans_Table_Extension.insert()trigger forDisposalSale/DisposalScraptransaction types.