Skip to main content

Notifications

Announcements

No record found.

Microsoft Dynamics AX forum
Suggested answer

create pending vendor invoice for multiple PO for same vendor

Posted on by 425

hi  I am trying to single pending vendor invoice by x++ for multiple PO for same vendor  but while invocing it says error 

public void CreateVendinvoiceForPosting(SON_SummaryInvoice   _poHeaderSummaryInvIB)
{
    Name                        son_EANCode;
    PurchTable                  purchTable;
    PurchLine                   purchLine;
    VendPackingSlipJour         vendPackingSlipJour,vendPackingSlipJourloc;
    VendPackingSlipTrans        vendPackingSlipTrans,vendPackingSlipTransloc;
    VendInvoiceInfoTable        vendInvoiceInfoTable;
    VendInvoiceInfoLine         vendInvoiceInfoLine;
    VendInvoiceInfoSubTable     vendInvoiceInfoSubTable;
    VendInvoiceInfoSubLine      vendInvoiceInfoSubLine;
    PurchId                   purchId;
    PackingSlipId               packingSlipId;
    rAXItemEANCode              rAXItemEANCode;
    PurchParmUpdate             activePurchParmUpdate;
    VendInvoiceInfoTable        activeVendInvoiceInfoTable;
    VendInvoiceInfoTable        savedVendInvoiceInfoTable; 
    SON_AttachmentInvoice     attachmentDDInvoice;
    SON_AttachmentInvoice     SON_AttachmentDDInvoiceloc;
    int64                       LineNumber;
    VendBankAccount             VendBankAccount;
    str invoicenumber;
    MarkupTrans                 markupTrans,markupTransloc;

    ;

    select DeliveryNote,AXPONumber from  attachmentDDInvoice
        where attachmentDDInvoice.IsInvoicedCreated == NoYes::No
        && attachmentDDInvoice.SummaryInvoiceNumber == _poHeaderSummaryInvIB.InvoiceNumber;

    purchId = attachmentDDInvoice.AXPONumber;
    packingSlipId = attachmentDDInvoice.DeliveryNote;
    invoicenumber = poHeaderSummaryInvIB.InvoiceNumber;


    ttsBegin;


    purchTable = PurchTable::find(purchId);
    packingSlipId = packingSlipId;

    while select vendPackingSlipJour
       where vendPackingSlipJour.PurchId == purchTable.PurchId
        && vendPackingSlipJour.PackingSlipId == packingSlipId
    {

        //Generate Pending Invoice Header
        vendInvoiceInfoTable.clear();
        vendInvoiceInfoTable.initValue();
        vendInvoiceInfoTable.initFromPurchTable(purchTable);

        vendInvoiceInfoTable.DocumentOrigin  = DocumentOrigin::Manual;
        vendInvoiceInfoTable.CurrencyCode = purchTable.CurrencyCode;
        vendInvoiceInfoTable.DeliveryName = purchTable.DeliveryName;
        vendInvoiceInfoTable.Num = _poHeaderSummaryInvIB.InvoiceNumber; //add invoice number in here
        vendInvoiceInfoTable.PurchName = purchTable.PurchName;
        vendInvoiceInfoTable.VendInvoiceSaveStatus = VendInvoiceSaveStatus::Pending;
        vendInvoiceInfoTable.DocumentDate =_poHeaderSummaryInvIB.InvoiceDate;
        vendInvoiceInfoTable.TransDate = _poHeaderSummaryInvIB.InvoiceDate;
        vendInvoiceInfoTable.LastMatchVariance = LastMatchVarianceOptions::OK;
        vendInvoiceInfoTable.ParmJobStatus = ParmJobStatus::Waiting;

        vendInvoiceInfoTable.PaymMode=VendTable::find(purchTable.OrderAccount).PaymMode;
        vendInvoiceInfoTable.Payment=VendTable::find(purchTable.OrderAccount).PaymTermId;

        vendInvoiceInfoTable.TaxGroup = VendTable::find(purchTable.OrderAccount).TaxGroup;
        vendInvoiceInfoTable.PostingProfile =purchTable.PostingProfile;
        vendInvoiceInfoTable.VATNum = purchTable.VATNum;

        select AccountID from  VendBankAccount  where VendBankAccount.VendAccount == purchTable.OrderAccount;
        vendInvoiceInfoTable.VendBankAccountID = VendBankAccount.AccountID;

        vendInvoiceInfoTable.Approved = NoYes::Yes;
        vendInvoiceInfoTable.Approver = DirPersonUser::currentWorker();
       // vendInvoiceInfoTable.DefaultDimension = vendInvoiceInfoTable.copyDimension(purchTable.DefaultDimension);

        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,RemittanceLocation),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,FixedDueDate),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,ExchRate),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,TransDate),null,purchTable);
        vendInvoiceInfoTable.defaultField(fieldNum(VendInvoiceInfoTable,PaymMode),null,purchTable);

        vendInvoiceInfoTable.insert();
        attachmentDDInvoice.clear();

        while select  attachmentDDInvoice group by  AXPONumber
            where attachmentDDInvoice.SummaryInvoiceNumber == poHeaderSummaryInvIB.InvoiceNumber

        //Generate Vend Invoice Info reference
        if(vendInvoiceInfoTable)
        {
            vendInvoiceInfoSubTable.clear();
            vendInvoiceInfoSubTable.initValue();
            vendInvoiceInfoSubTable.defaultRow();

            vendInvoiceInfoSubTable.ParmId = vendInvoiceInfoTable.ParmId;
            vendInvoiceInfoSubTable.OrigPurchId = attachmentDDInvoice.AXPONumber;//vendInvoiceInfoTable.PurchId;
            vendInvoiceInfoSubTable.PurchName = vendInvoiceInfoTable.PurchName;
            vendInvoiceInfoSubTable.TableRefId = vendInvoiceInfoTable.TableRefId;

            vendInvoiceInfoSubTable.insert();
        }

        attachmentDDInvoice.clear();

        while select  attachmentDDInvoice  where attachmentDDInvoice.IsInvoicedCreated ==NoYes::No
            && attachmentDDInvoice.SummaryInvoiceNumber == _poHeaderSummaryInvIB.InvoiceNumber
        {
            if(attachmentDDInvoice.AXPOLineNumber != 0)
            {
                select vendPackingSlipTrans where vendPackingSlipTrans.PackingSlipId == attachmentDDInvoice.DeliveryNote;
                LineNumber = (attachmentDDInvoice.AxPoLineNumber);
                select purchLine  where purchLine.PurchId == attachmentDDInvoice.AXPONumber
                && purchLine.LineNumber == LineNumber;
            }
            else
            {
                select vendPackingSlipTrans where vendPackingSlipTrans.PackingSlipId == attachmentDDInvoice.DeliveryNote;
               // LineNumber = (attachmentDDInvoice.AxPoLineNumber);
                select purchLine  where purchLine.PurchId == attachmentDDInvoice.AXPONumber
                && purchLine.LineNumber == this.getpurchaseline(attachmentDDInvoice).LineNumber;
                LineNumber = purchLine.LineNumber;

            }




            vendInvoiceInfoLine.clear();
            vendInvoiceInfoLine.initValue();
            vendInvoiceInfoLine.defaultRow(null,purchLine);
            vendInvoiceInfoLine.initFromPurchLine(purchLine);
            vendInvoiceInfoLine.DeliveryName = vendInvoiceInfoTable.DeliveryName;
            vendInvoiceInfoLine.ParmId = vendInvoiceInfoTable.ParmId;
            vendInvoiceInfoLine.TableRefId = vendInvoiceInfoTable.TableRefId;
            vendInvoiceInfoLine.currencyCode = vendInvoiceInfoTable.CurrencyCode;
            vendInvoiceInfoLine.LineNum = any2int(purchLine.LineNumber);

            vendInvoiceInfoLine.InvoiceAccount = vendInvoiceInfoTable.InvoiceAccount;
            vendInvoiceInfoLine.InventDimId = purchLine.InventDimId;
            vendInvoiceInfoLine.OrderAccount  = vendInvoiceInfoTable.OrderAccount;
            vendInvoiceInfoLine.ItemId = purchLine.ItemId;
            vendInvoiceInfoLine.InventTransId = purchLine.InventTransId;
            vendInvoiceInfoLine.OrigPurchId = attachmentDDInvoice.AXPONumber;

            vendInvoiceInfoLine.DocumentOrigin = DocumentOrigin::Manual;

           
            select firstonly ItemId, EanCode, SON_PurchaseEAN from rAXItemEANCode
                where rAXItemEANCode.ItemId == vendPackingSlipTrans.ItemId
                &&    rAXItemEANCode.SON_PurchaseEAN == noyes::Yes;

            if(rAXItemEANCode)
            {
                SON_EANCode = rAXItemEANCode.EANCode;
            }
           


            {
                vendInvoiceInfoLine.ReceiveNow =  attachmentDDInvoice.InvoicedQty;
                vendInvoiceInfoLine.RemainBefore = attachmentDDInvoice.InvoicedQty;
                vendInvoiceInfoLine.RemainBeforeInvent =attachmentDDInvoice.InvoicedQty;
                vendInvoiceInfoLine.PurchPrice = purchLine.PurchPrice;
                vendInvoiceInfoLine.InventNow = attachmentDDInvoice.InvoicedQty;
                vendInvoiceInfoLine.LineAmount =  attachmentDDInvoice.VendorInvoiceAmt;
            }

            vendInvoiceInfoLine.DefaultDimension = purchLine.DefaultDimension;

            vendInvoiceInfoLine.insert();

            //
            //insert maisc charges

            while select markupTrans where markupTrans.TransRecId == attachmentDDInvoice.RecId
                && markupTrans.TransTableId == attachmentDDInvoice.TableId
            {
                markupTransloc.clear();
                markupTransloc.initFromVendInvoiceInfoLine(vendInvoiceInfoLine);
                markupTransloc.Value      = markupTrans.Value;
                markupTransloc.MarkupCode = markupTrans.MarkupCode;
                markupTransloc.Txt        = markupTrans.Txt;
                markupTransloc.insert();

            }
            markupTrans = null;

            while select markupTrans where markupTrans.TransRecId == purchLine.RecId
                && markupTrans.TransTableId == purchLine.TableId
            {

                markupTransloc.clear();
                markupTransloc.initFromVendInvoiceInfoLine(vendInvoiceInfoLine);
                markupTransloc.Value      = markupTrans.Value;
                markupTransloc.MarkupCode = markupTrans.MarkupCode;
                markupTransloc.Txt        = markupTrans.Txt;
                markupTransloc.insert();

            }

            //Generate Vend Invoice Info reference from packing slip
            if(vendInvoiceInfoLine.RecId)
            {
                vendInvoiceInfoSubLine.clear();
                vendInvoiceInfoSubLine.initValue();
                vendInvoiceInfoSubLine.defaultRow();
                vendInvoiceInfoSubLine.ParmId = vendInvoiceInfoTable.ParmId;
                vendInvoiceInfoSubLine.LineRefRecId = vendInvoiceInfoLine.RecId;
                vendInvoiceInfoSubLine.ReceiveNow = purchLine.PurchQty;
                vendInvoiceInfoSubLine.InventNow = purchLine.PurchQty;
                vendInvoiceInfoSubLine.JournalRefRecId = vendPackingSlipTrans.RecId;
                vendInvoiceInfoSubLine.JournalRefTableId = vendPackingSlipTrans.TableId;
                vendInvoiceInfoSubLine.DocumentId = vendPackingSlipTrans.PackingSlipId;
                vendInvoiceInfoSubLine.insert();
            }

        }


    }

         ttsCommit;
   info(strFmt("Vendor invoice is created for %1 ",vendInvoiceInfoTable.Num));
}


above is my code  while invoving some times it throws error like "

 insufficient inventory transaction with status purchased""

how ever manually when i create a pending vendor invoice with multiple PO for same vendor it has no issue it gets invoiced also, how ever when i do it from my code it is throwing error while invoicing.

"

The purchase order or product receipt was corrected after the vendor invoice was created. All accounting distributions must be re-created to reflect any changes to the purchase order's or product receipt's accounting distr"

  • Suggested answer
    Sangeeth R Profile Picture
    Sangeeth R 86 on at
    RE: create pending vendor invoice for multiple PO for same vendor

    Hi,

    Might be AccountingEvent was not set proper data on VendInvoiceInfoSubTable.

    AccountingEvent accountingEvent;

           select firstonly accountingEvent

               order by CreatedDateTime desc

               where accountingEvent.SourceDocumentHeader == PurchTable::find(_purchId).SourceDocumentHeader

                   && accountingEvent.Type != AccountingEventType::PeriodClose;

           vendInvoiceInfoSubTable.SourceAccountingEvent   = accountingEvent.RecId;

    Try this.

    Thanks,

    Sangeeth

  • Ludwig Reinhard Profile Picture
    Ludwig Reinhard Microsoft Employee on at
    RE: create pending vendor invoice for multiple PO for same vendor

    Hello Manoj,

    Did you use the same X++ code that is shown above?

    If this is not the case then please open a new thread and post your question there ideally supported by some illustrative screenprints.

    Many thanks and best regards,

    Ludwig

  • Community Member Profile Picture
    Community Member Microsoft Employee on at
    RE: create pending vendor invoice for multiple PO for same vendor

    Hi,

    Did you resolve the issue? I am also getting the same error while posting the invoice for multiple PO in a single invoice with the same vendor account.

    Let me know if you found any solution?

    Regards,

    Manoj

Helpful resources

Quick Links

Dynamics 365 Community Update – Sep 16th

Welcome to the next edition of the Community Platform Update. This is a weekly…

Announcing Our 2024 Season 2 Super Users!

A new season of Super Users has arrived, and we are so grateful for the daily…

Leaderboard

#1
André Arnaud de Calavon Profile Picture

André Arnaud de Cal... 290,353 Super User 2024 Season 2

#2
Martin Dráb Profile Picture

Martin Dráb 228,251 Most Valuable Professional

#3
nmaenpaa Profile Picture

nmaenpaa 101,148

Leaderboard

Featured topics

Product updates

Dynamics 365 release plans