Create sales invoice and post in d365fo x++
Create sales invoice and post in d365fo x++
Code:
public void postSOInvoice()
{
salesFormLetter salesFormLetter;
salesFormletterParmData salesFormLetterParmData;
salesParmUpdate salesParmUpdate;
salesParmTable salesParmTable;
salesParmLine salesParmLine;
SalesLine salesLine;
DSASalesAdvanceInvoice salesAdvanceInvoice;
CustInvoiceJour custInvoiceJour;
DSASalesAdvanceTable salesAdvanceTable;
SalesTable saleTablePPUpdate;
InvoiceId invoiceId;
custParameters = CustParameters::find();
try
{
saleTablePPUpdate.clear();
select forupdate PostingProfile from saleTablePPUpdate
where saleTablePPUpdate.SalesId == salesTable.SalesId;
ttsbegin;
saleTablePPUpdate.PostingProfile = custParameters.DSASalesAdvancePostingProfile;
saleTablePPUpdate.update();
ttscommit;
ttsbegin;
salesLine.initValue();
salesLine.SalesId = salesTable.SalesId;
salesLine.initFromSalesTable(salesTable);
salesLine.SalesCategory = DSASalesAdvanceTable.AdvanceCategory;
salesLine.SalesQty = 1;
salesLine.TaxGroup = DSASalesAdvanceTable.TaxGroup;
salesLine.TaxItemGroup = DSASalesAdvanceTable.TaxItemGroup;
salesLine.Name = DSASalesAdvanceTable.Description;
salesLine.DSAIsSalesAdvance = NoYes::Yes;
//salesLine.SalesUnit = custParameters.DSASalesAdvancePostingUnit;
//salesLine.SalesPrice
real round = Currency::find(DSASalesAdvanceTable.Currency).RoundOffSales == 0 ? 0.01 : Currency::find(DSASalesAdvanceTable.Currency).RoundOffSales;
salesLine.LineAmount = round(DSASalesAdvanceTable.AdvanceLimit, round);
salesLine.createLine(NoYes::No, // Validate
NoYes::Yes, // initFromSalesTable
NoYes::No, // initFromInventTable
NoYes::No, // calcInventQty
NoYes::No, // searchMarkup
NoYes::No); // searchPrice -- Enable this for any Trade Aggrement Prices to bring
// Confirmation
//salesFormLetter= SalesFormLetter::construct(DocumentStatus::Confirmation);
//salesFormLetter.update(salesTable);
salesLine.selectForUpdate(true);
salesLine.TaxGroup = DSASalesAdvanceTable.TaxGroup;
salesLine.TaxItemGroup = DSASalesAdvanceTable.TaxItemGroup;
salesLine.update();
ttscommit;
//posting invoice
ttsbegin;
salesFormLetterParmData = salesFormletterParmData::newData(DocumentStatus::Invoice, VersioningUpdateType::Initial);
salesFormLetterParmData.parmOnlyCreateParmUpdate(true);
salesFormLetterParmData.createData(false);
salesParmUpdate = salesFormLetterParmData.parmParmUpdate();
salesParmTable.clear();
salesParmTable.TransDate = systemDateGet();
salesParmTable.Ordering = DocumentStatus::Invoice;
salesParmTable.ParmJobStatus = ParmJobStatus::Waiting;
salesParmTable.salesId = salesTable.salesId;
salesParmTable.salesName = salesTable.salesName;
salesParmTable.DeliveryName = salesTable.DeliveryName;
salesParmTable.DeliveryPostalAddress = salesTable.DeliveryPostalAddress;
salesParmTable.CustAccount = salesTable.CustAccount;
salesParmTable.CurrencyCode = salesTable.CurrencyCode;
salesParmTable.InvoiceAccount = salesTable.InvoiceAccount;
salesParmTable.ParmId = salesParmUpdate.ParmId;
salesParmTable.insert();
if (salesLine)
{
salesParmLine.InitFromsalesLine(salesline);
salesParmLine.SalesCategory = salesLine.SalesCategory;
salesParmLine.DeliverNow = salesline.SalesQty;
salesParmLine.ParmId = salesParmTable.ParmId;
salesParmLine.TableRefId = salesParmTable.TableRefId;
salesParmLine.DSAIsSalesAdvance = NoYes::Yes;
salesParmLine.setQty(DocumentStatus::Invoice, false, true);
//salesParmLine.setLineAmount(salesline);
salesParmLine.LineAmount = salesline.LineAmount;
salesParmLine.insert();
}
salesFormLetter = salesFormLetter::construct(DocumentStatus::Invoice);
salesFormLetter.transDate(salesline.ReceiptDateRequested);
salesFormLetter.proforma(false);
salesFormLetter.specQty(salesUpdate::All);
salesFormLetter.salesTable(salesTable);
salesFormLetter.parmId(salesParmTable.ParmId);
salesFormLetter.salesParmUpdate(salesFormLetterParmData.parmParmUpdate());
salesFormLetter.run();
saleTablePPUpdate.clear();
select forupdate PostingProfile from saleTablePPUpdate
where saleTablePPUpdate.SalesId == salesTable.SalesId;
saleTablePPUpdate.PostingProfile = custParameters.PostingProfile;
saleTablePPUpdate.update();
element.revertSOLinechanges();
ttscommit;
if(salesFormLetter.parmJournalRecord().TableId == tableNum(CustInvoiceJour))
{
custInvoiceJour = salesFormLetter.parmJournalRecord();
invoiceId = custInvoiceJour.InvoiceId;
if(custInvoiceJour.InvoiceId)
{
Info(strFmt("@DSALabel:DSA000991",custInvoiceJour.InvoiceId));
salesAdvanceInvoice.clear();
salesAdvanceInvoice.Invoice = custInvoiceJour.InvoiceId;
salesAdvanceInvoice.SalesId = DSASalesAdvanceTable.SalesId;
salesAdvanceInvoice.CustAccount = DSASalesAdvanceTable.CustAccount;
salesAdvanceInvoice.Currency = DSASalesAdvanceTable.Currency;
salesAdvanceInvoice.AdvanceLimit = round(DSASalesAdvanceTable.AdvanceLimit, round);
salesAdvanceInvoice.AdvanceCategory = DSASalesAdvanceTable.AdvanceCategory;
salesAdvanceInvoice.LimitRemain = round(DSASalesAdvanceTable.AdvanceLimit, round);
salesAdvanceInvoice.SettleAmount = 0;
salesAdvanceInvoice.SettledAmount = 0;
salesAdvanceInvoice.Value = DSASalesAdvanceTable.Value;
salesAdvanceInvoice.Type = DSASalesAdvanceTable.Type;
salesAdvanceInvoice.Description = DSASalesAdvanceTable.Description;
salesAdvanceInvoice.TaxAmount = DSASalesAdvanceTable.TaxAmount;
salesAdvanceInvoice.AmountAfterTax = DSASalesAdvanceTable.AmountAfterTax;
salesAdvanceInvoice.OrigInvoice = DSASalesAdvanceTable.OrigInvoice;
salesAdvanceInvoice.ReasonCode = DSASalesAdvanceTable.ReasonCode;
salesAdvanceInvoice.ReasonDescription = DSASalesAdvanceTable.ReasonDescription;
salesAdvanceInvoice.TaxGroup = DSASalesAdvanceTable.TaxGroup;
salesAdvanceInvoice.TaxItemGroup = DSASalesAdvanceTable.TaxItemGroup;
salesAdvanceInvoice.SOBillingRuleRefRecId = DSASalesAdvanceTable.SOBillingRuleRefRecId;
salesAdvanceInvoice.TaxReasonCode = DSASalesAdvanceTable.TaxReasonCode;
salesAdvanceInvoice.TaxReasonDescription = DSASalesAdvanceTable.TaxReasonDescription;
salesAdvanceInvoice.SettledAmtAfterTax = 0;
salesAdvanceInvoice.LimitRemainAfterTax = DSASalesAdvanceTable.AmountAfterTax;
salesAdvanceInvoice.insert();
//reversal invoice reference set
if(DSASalesAdvanceTable.AdvanceLimit < 0)
{
custInvoiceJour.selectForUpdate(true);
custInvoiceJour.DSAReasonDescription = DSASalesAdvanceTable.ReasonDescription;
custInvoiceJour.DSAReasonCode = DSASalesAdvanceTable.ReasonCode;
custInvoiceJour.DSAOrigInvoice = DSASalesAdvanceTable.OrigInvoice;
ttsbegin;
custInvoiceJour.update();
ttscommit;
}
if(DSASalesAdvanceTable.TaxReasonCode != '')
{
custInvoiceJour.selectForUpdate(true);
custInvoiceJour.DSATaxReasonCode = DSASalesAdvanceTable.TaxReasonCode;
custInvoiceJour.DSATaxReasonDescription = DSASalesAdvanceTable.TaxReasonDescription;
ttsbegin;
custInvoiceJour.update();
ttscommit;
}
//invoice post set
select forupdate
salesAdvanceTable
where salesAdvanceTable.SalesId == salesTable.SalesId
&& salesAdvanceTable.IsPosteda == NoYes::No;
if(salesAdvanceTable)
{
salesAdvanceTable.IsPosteda = NoYes::Yes;
ttsbegin;
salesAdvanceTable.update();
ttscommit;
}
//MA Code
//if(salesAdvanceInvoice)
if(salesAdvanceInvoice.SOBillingRuleRefRecId)
{
DSAOrderAdvancePaymTerm advanceBillingRuleLocal = DSAOrderAdvancePaymTerm::find(salesAdvanceInvoice.SOBillingRuleRefRecId);
if(advanceBillingRuleLocal)
{
ttsbegin;
advanceBillingRuleLocal.selectForUpdate(true);
advanceBillingRuleLocal.InvoiceId = salesAdvanceInvoice.Invoice;
advanceBillingRuleLocal.update();
ttscommit;
}
}
if(DSASalesAdvanceTable.AdvanceLimit < 0)
{
DSACustJournalCreationAndSettlement::settleInvoices(salesTable, salesAdvanceInvoice.OrigInvoice, salesAdvanceInvoice.Invoice, NoYes::Yes);
}
}//invoice
}
}
catch
{
if(invoiceId)
{
delete_from custInvoiceJour
where custInvoiceJour.InvoiceId == invoiceId;
}
element.revertSOLinechanges();
saleTablePPUpdate.clear();
select forupdate PostingProfile from saleTablePPUpdate
where saleTablePPUpdate.SalesId == salesTable.SalesId;
saleTablePPUpdate.PostingProfile = custParameters.PostingProfile;
ttsbegin;
saleTablePPUpdate.update();
ttscommit;
error(infolog.text(infologLine()));
error("@DSALabel:DSA000992");
}
}
Comments
Post a Comment