In Microsoft Dynamics 365 Finance & Operations, a Purchase Order can be confirmed programmatically using the standard PurchFormLetter framework.
This is useful when you need to confirm a Purchase Order from custom business logic, batch processes, integrations, or custom forms without manually clicking Confirm from the Purchase Order form.
The following method accepts a PurchTable record and confirms the Purchase Order using the standard D365 F&O framework.
public static PurchTable confirmPurchaseOrder(PurchTable _purchTable)
{
PurchFormLetter purchFormLetter;
PurchFormletterParmData purchFormLetterParmData;
PurchParmUpdate purchParmUpdate;
PurchParmTable purchParmTable;
ttsBegin;
// Create parameter data for Purchase Order confirmation
purchFormLetterParmData = PurchFormletterParmData::newData(
DocumentStatus::PurchaseOrder,
VersioningUpdateType::Initial);
purchFormLetterParmData.parmOnlyCreateParmUpdate(true);
purchFormLetterParmData.createData(false);
purchParmUpdate = purchFormLetterParmData.parmParmUpdate();
// Populate PurchParmTable
purchParmTable.clear();
purchParmTable.TransDate =
DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());
purchParmTable.DocumentDate =
DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());
purchParmTable.Ordering = DocumentStatus::PurchaseOrder;
purchParmTable.ParmJobStatus = ParmJobStatus::Waiting;
purchParmTable.PurchId = _purchTable.PurchId;
purchParmTable.PurchName = _purchTable.PurchName;
purchParmTable.DeliveryName = _purchTable.DeliveryName;
purchParmTable.DeliveryPostalAddress = _purchTable.DeliveryPostalAddress;
purchParmTable.OrderAccount = _purchTable.OrderAccount;
purchParmTable.CurrencyCode = _purchTable.CurrencyCode;
purchParmTable.InvoiceAccount = _purchTable.InvoiceAccount;
purchParmTable.ParmId = purchParmUpdate.ParmId;
purchParmTable.insert();
// Create Purchase Order confirmation
purchFormLetter = PurchFormLetter::construct(
DocumentStatus::PurchaseOrder);
purchFormLetter.transDate(
DateTimeUtil::getSystemDate(
DateTimeUtil::getUserPreferredTimeZone()));
purchFormLetter.proforma(false);
purchFormLetter.specQty(PurchUpdate::All);
purchFormLetter.purchTable(_purchTable);
purchFormLetter.parmParmTableNum(purchParmTable.ParmId);
purchFormLetter.parmId(purchParmTable.ParmId);
purchFormLetter.purchParmUpdate(
purchFormLetterParmData.parmParmUpdate());
// Execute the confirmation
purchFormLetter.run();
ttsCommit;
return _purchTable;
}



