Skip to main content

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 classMGCLatticeFixedAssetAcquisitionPostedBusinessEvent
Contract classMGCLatticeFixedAssetAcquisitionPostedBusinessEventContract
CategoryFixed assets
ModuleModuleAxapta::FixedAssets
Label IDsFixedAssetAcquisitionPostedBusinessEventName / FixedAssetAcquisitionPostedBusinessEventDescription
TriggerAssetTrans.insert() -> TransType == AssetTransType::Acquisition

Trigger / Hook​

  • Extension class MGCLatticeAssetTrans_Table_Extension, [ExtensionOf(tableStr(AssetTrans))].
  • CoC method signature: void insert() (Chain of Command wrapper over the AssetTrans table insert).
  • Firing condition: after next insert(), the newly inserted AssetTrans record is checked for this.TransType == AssetTransType::Acquisition. Only acquisition-type transactions raise this event; acquisition adjustments (AcquisitionAdj) do not. (The same insert() method raises MGCLatticeFixedAssetDisposalPostedBusinessEvent for DisposalSale/DisposalScrap transaction types.)
  • One event per AssetTrans row: 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 - isReversal and isReclassification are both false. 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 by MGCLatticeTransactionReversal_Asset_Class_Extension, which wraps TransactionReversal_Asset.createAssetTrans() in an MGCLatticeAssetTransOriginContext reversal 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 own AssetTrans.Reclassification flag and from the reclassification scope that MGCLatticeAssetReclassification_Class_Extension opens around AssetReclassification.run(). A reversal of such a row has both flags set.
  • Inserts that bypass the table's insert() method (doInsert(), or set-based inserts with data methods skipped) do not raise it.
  • Timing: AssetTrans rows 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 fieldDisplay labelType / EDTSourceNotes
legalEntityLegal EntityDataAreaId_assetTrans.DataAreaIdCompany ID of the asset transaction, in lower case (for example usmf)
assetIdAsset IDAssetId_assetTrans.AssetIdFixed asset number. For a reclassification, the old asset on the negated row and the new asset on the copy.
bookIdBook IDAssetBookId_assetTrans.BookIdBook the transaction was written to.
acquisitionAmountMSTAcquisition Amount MSTAmountMST_assetTrans.AmountMSTAmount 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).
transDateTransaction DateTransDate_assetTrans.TransDateDate of the asset transaction (the reversal or reclassification date for those rows); "\/Date(ms)\/" form.
voucherVoucherVoucher_assetTrans.VoucherVoucher of the asset transaction; a reversal and a reclassification each have their own voucher.
isReversalIs ReversalbooleanReversal scope when the row was insertedtrue when the transaction reversal function wrote the row (a reversal, or the revoke of one); written as true/false.
isReclassificationIs ReclassificationbooleanReclassification scope, or _assetTrans.Reclassificationtrue when the row belongs to an asset reclassification; written as true/false.
crossReferencesCross referencesList of MGCLatticeCrossReferenceEventContractMGCLatticeCrossReferenceEventHelper::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).

  • Fixed asset disposal posted - raised from the same MGCLatticeAssetTrans_Table_Extension.insert() trigger for DisposalSale / DisposalScrap transaction types.