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