Skip to main content

Process of Purchase order in Technical terms in D365Fo

 Purchase Order Technical Flow in D365FO (Step-by-Step)

(From creation → approval workflow → posting → product receipt → invoice → accounting)


1. Purchase Order Creation

Tables involved

  • PurchTable → PO header

  • PurchLine → PO lines

  • VendTable → Vendor master

  • InventDim / InventDimCombination → Item dimensions

  • EcoResProduct / InventTable → Item master

Classes / Framework

  • PurchTableType / PurchLineType

    • Framework that controls creation, validation, defaulting.

Key methods

  • PurchTable.initValue()

  • PurchLine.initFromPurchTable()

  • PurchTable.validateWrite()

  • PurchLine.validateWrite()

Events (Extension points)

  • PurchTableType.createPurchTable()

  • PurchLineType.createPurchLine()


2. Purchase Order Confirmation

Document Status update

  • PurchTable.DocumentStateConfirmation

  • PurchParmBuffer tables used for versioning.

Posting Class

  • PurchFormLetter_Confirm

    • Called internally via PurchFormLetter::construct(DocumentStatus::Confirm)

  • Methods:

    • run()

    • update()

    • initParmPurch()

Tables Updated

  • PurchTable

  • PurchLine

  • PurchTotals

  • PurchParmTable / PurchParmLine (temporary/posting parameters)


3. Purchase Order Workflow (If enabled)

Tables

  • WorkflowTrackingStatusTable

  • WorkflowWorkItemTable

  • WorkflowStepInstanceTable

Classes

  • Workflow classes for PO:

    • PurchReqWorkflow

    • PurchOrderWorkflow

  • Approval/reject logic:

    • WorkflowWorkItemActionManager

    • Event handlers on canSubmitToWorkflow, submitToWorkflow(), approve()

Technical Flow

  1. PO saved

  2. canSubmitToWorkflow() event triggered

  3. PO submitted → Workflow instance created

  4. Workflow step assigned to approver

  5. Approver’s action updates status & triggers events


4. Product Receipt (GRN Posting)

Posting Class

  • PurchFormLetter_Receive

    • Created via: PurchFormLetter::construct(DocumentStatus::PackingSlip)

  • Technical flow of receiving lines:

    • Inventory transactions updated: InventTrans (Status = Received)

    • Ledger not posted (non-financial update)

Tables updated

  • InventTrans → Receipt status update

  • InventTransOrigin

  • InventSettlement (if needed)

  • VendPackingSlipJour (header)

  • VendPackingSlipTrans (lines)

Important methods

  • purchFormLetter.transWrite()

  • purchFormLetter.sumBy()

  • inventMov_Movement.receiptMovement()


5. Vendor Invoice Posting

Posting Class

  • PurchFormLetter_Invoice

    • Called as: PurchFormLetter::construct(DocumentStatus::Invoice)

  • Links product receipt & invoice using Match Framework.

Match Framework

Used to match:

  1. PO → Product Receipt (3-way match)

  2. PO → Invoice (2-way match)

  3. Price match

Classes:

  • PriceDisc

  • PurchPriceToleranceManager

  • VendInvoiceInfoLinePost

  • VendInvoiceInfoTable / VendInvoiceInfoLine

Tables updated

  • VendInvoiceJour (header of invoice)

  • VendInvoiceTrans (lines)

  • InventTrans (status = Purchased / financially updated)

  • Vendor ledger tables

    • VendTrans

    • VendSettlement

  • LedgerTrans / SubledgerJournalAccountEntry → Financial posting

Posting methods

  • purchFormLetter.run()

  • VendInvoicePost.updateInvent()

  • LedgerVoucher.commit()


6. Accounting Entries (Automatically generated)

Depending on item model group:

  • Inventory posting

    • Inventory account (DR)

    • GR/IR (accrual) account (CR)

  • Invoice posting

    • GR/IR reverse

    • Vendor pending invoice

    • Sales tax posting

Tables

  • SubledgerJournalAccountEntry

  • GeneralJournalEntry

  • GeneralJournalAccountEntry

  • GeneralLedger


7. Inventory Impact

During product receipt:

  • InventTransStatus::Received

During invoice:

  • InventTransStatus::Purchased

Inventory valuation handled by:

  • InventCostTrans

  • InventSettlement (for weighted avg/ FIFO settlements)


8. Technical Events & Extension Points

Table Events

  • PurchTable.onModified()

  • PurchLine.onValidatedField()

Class Extensions

  • class PurchFormLetter_Confirm_Extension

  • class PurchFormLetter_Receive_Extension

  • class PurchFormLetter_Invoice_Extension

Workflow Events

  • onCanSubmitToWorkflow()

  • onSubmittingToWorkflow()

  • onApproved()

  • onRejected()

Comments

Popular posts from this blog

Top 200 Q&A in D365FO Technical

  SECTION 1 — X++ BASICS (10 Q&A) 1. What is X++? A proprietary object-oriented language used in Dynamics 365 Finance & Operations for business logic, similar to C# but integrated with D365 runtime. 2. What is a TableBuffer? It is an in-memory object referencing a table. Example: CustTable custTable; 3. What is difference between select and select firstonly ? select → returns all matching rows firstonly → returns only the first matched row 4. What is ttsbegin & ttscommit ? Used to wrap database transactions; ensures atomicity. 5. Can we write SQL queries directly in X++? No. X++ uses a database-abstracted select statement. 6. What is a container? A collection datatype used to store mixed data types. 7. Difference between container and map? Map stores key-value pairs; container is indexed and immutable. 8. What is a temp table? A table that stores data temporarily in memory or database depending on property. 9. What is recursion in X++? A method c...

Process of Sales order in Technical terms in D365Fo

 🔥 Sales Order Technical Flow in D365FO (Creation → Confirmation → Picking → Packing Slip → Invoice → Accounting) 1. Sales Order Creation Tables SalesTable → SO header SalesLine → SO lines CustTable → Customer master InventDim / InventDimCombination → Dimensions InventTable / EcoResProduct → Item master Framework Classes SalesTableType / SalesLineType Responsible for validation, defaulting, creation logic Key Methods SalesTable.initValue() SalesLine.initFromSalesTable() SalesTable.validateWrite() SalesLine.validateWrite() Events (Extensions) SalesTableType.createSalesTable() SalesLineType.createSalesLine() 2. Reservation (Optional) If reservation is done: Tables InventTrans (Reservation status) InventReservation Classes InventUpd_Reservation InventTransReservation Reservations impact picking and inventory availability. 3. Sales Order Confirmation Confirms order and freezes price/quantity. Posti...