PurchFormLetter purchFormLetter;
PurchFormletterParmData purchFormLetterParmData;
PurchParmUpdate purchParmUpdate;
PurchParmTable purchParmTable;
PurchParmLine purchParmLine;
PurchTable purchTable;
PurchLine purchLine;
changecompany(_dataAreaId)
{
// Find purchase order header
purchTable = PurchTable::find("Test001");
if (purchTable.RecId != 0)
{
try
{
ttsbegin;
// Initialize Parm Data for Packing Slip
purchFormLetterParmData = PurchFormletterParmData::newData(DocumentStatus::PackingSlip,
VersioningUpdateType::Initial);
purchFormLetterParmData.parmOnlyCreateParmUpdate(true);
purchFormLetterParmData.createData(false);
purchParmUpdate = purchFormLetterParmData.parmParmUpdate();
// Create ParmTable entry (Header level)
purchParmTable.clear();
purchParmTable.initValue();
purchParmTable.TransDate = 12/08/2025; // Posting date
purchParmTable.Ordering = DocumentStatus::PackingSlip;
purchParmTable.ParmJobStatus = ParmJobStatus::Waiting;
purchParmTable.Num = "TestPR001"; // Product receipt number
purchParmTable.PurchId = purchTable.PurchId; // Link to PO
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();
// Loop through purchase lines and create ParmLine entries
while select * from purchLine
where purchLine.PurchId == purchTable.purchId
&& purchLine.IsDeleted == NoYes::No
{
purchParmLine.clear();
purchParmLine.initValue();
purchParmLine.initFromPurchLine(purchLine);
purchParmLine.ReceiveNow = purchLine.PurchQty; // Receive full line qty
purchParmLine.modifiedReceiveNow();
purchParmLine.ParmId = purchParmTable.ParmId;
purchParmLine.TableRefId = purchParmTable.TableRefId;
// Calculate qty and line amount
purchParmLine.setQty(DocumentStatus::PackingSlip, false, true);
purchParmLine.setLineAmount();
purchParmLine.insert();
}
// Build Form Letter object for Packing Slip Posting
purchFormLetter = PurchFormLetter::construct(DocumentStatus::PackingSlip);
purchFormLetter.transDate(12/08/2025);
purchFormLetter.proforma(false); // Not a proforma posting
purchFormLetter.printFormLetter(false); // Do not print immediately
purchFormLetter.specQty(PurchUpdate::All); // Post all quantities
purchFormLetter.purchTable(purchTable);
purchFormLetter.parmParmTableNum(purchParmTable.ParmId);
purchFormLetter.parmId(purchParmTable.ParmId);
purchFormLetter.purchParmUpdate(purchFormLetterParmData.parmParmUpdate());
// Execute posting
purchFormLetter.run();
ttscommit;
}
catch (Exception::Error)
{
// Rollback in case of posting errors
ttsabort;
error(strFmt("Error posting product receipt %1 for PO %2", _productReceiptId, _purchId));
}
}
}