Tuesday, 1 February 2022

PO Partial packingslip, Invoice x++ D365

class TEST_POPackingSlip

{


    public static void main(Args _args)

    {

        PurchFormLetter             purchFormLetter, purchFormLetterInvoice;

        PurchFormletterParmData     purchFormLetterParmData;

        PurchParmUpdate             purchParmUpdate;

        PurchParmTable              purchParmTable;

        PurchParmLine               purchParmLine;

        TEST_POPartialLinesTmp      poPartialLinesTmp;

        PurchId                     purchId = 'purchaseOrderNum';

        PurchTable                  purchTable = PurchTable::find(purchId);

        PurchLine                   purchLine;

        Num                         packingSlipId = purchTable.PurchId;

        boolean                     isPackingslip = false;


        ttsBegin;

        if(purchTable.DocumentState != VersioningDocumentState::Confirmed)

        {

            purchFormLetter = PurchFormLetter::construct(DocumentStatus::PurchaseOrder);

            purchFormLetter.update(purchTable, strFmt("%1", purchTable.PurchId));

            Info(strFmt('Purchase order confirmed %1 ', purchTable.PurchId));

        }


        //partial quantity packingslip

        try

        {

            purchFormLetterParmData = PurchFormletterParmData::newData(DocumentStatus::PackingSlip,VersioningUpdateType::Initial);

            purchFormLetterParmData.parmOnlyCreateParmUpdate(true);

            purchFormLetterParmData.createData(false);

            purchParmUpdate = purchFormLetterParmData.parmParmUpdate();


            purchParmTable.clear();

            purchParmTable.TransDate                = SystemDateGet();

            purchParmTable.Ordering                 = DocumentStatus::PackingSlip;

            purchParmTable.ParmJobStatus            = ParmJobStatus::Waiting;

            purchParmTable.Num                      = packingSlipId;

            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();


            while select purchLine where purchLine.PurchId == purchId//purchTable.PurchId

            {

                select poPartialLinesTmp where poPartialLinesTmp.PurchId == purchLine.purchId && poPartialLinesTmp.ItemId == purchLine.ItemId;

                if(poPartialLinesTmp)

                {

                    purchParmLine.InitFromPurchLine(purchLine);


                    purchParmLine.ReceiveNow    = poPartialLinesTmp.Qty;

                    purchParmLine.ParmId        = purchParmTable.ParmId;

                    purchParmLine.TableRefId    = purchParmTable.TableRefId;

                    purchParmLine.setQty(DocumentStatus::PackingSlip, false, true);

                    purchParmLine.setLineAmount();

                    purchParmLine.insert();

                    isPackingslip = true;

                }

                else

                {

                    continue;

                }

                

            }

            if(isPackingslip == true)

            {

                purchFormLetter = PurchFormLetter::construct(DocumentStatus::PackingSlip);

                purchFormLetter.transDate(systemDateGet());

                purchFormLetter.proforma(false);

                purchFormLetter.specQty(PurchUpdate::All);

                purchFormLetter.purchTable(purchTable);

    

                purchFormLetter.parmParmTableNum(purchParmTable.ParmId);

                purchFormLetter.parmId(purchParmTable.ParmId);

                purchFormLetter.purchParmUpdate(purchFormLetterParmData.parmParmUpdate());

                purchFormLetter.run();

                

                Info(strFmt('Packingslip crated for purchase order %1', purchTable.PurchId));


                //for Invoice

                TEST_PurchInvoice purchInvoice = new TEST_PurchInvoice();

                purchInvoice.poInvoice(purchTable.PurchId);

            }

            ttsCommit;

        }

        catch

        {

            info(infolog.text());

        }


    }


}


---For Invoice


class TEST_PurchInvoice

{

    public static void main(Args _args)

    {

        TEST_PurchInvoice purchInvoice = new TEST_PurchInvoice();

        purchInvoice.poInvoice("purchId");

    }


    public void poInvoice(PurchId _purchId)

    {

        PurchFormLetter             purchFormLetter;

        PurchTable                  purchTable = PurchTable::find(_purchId);

        PurchLine                   purchLine;

        VendPackingSlipJour         vendPackingSlipJour;

        VendPackingSlipTrans        vendPackingSlipTrans;

        VendInvoiceInfoTable        vendInvoiceInfoTable;

        VendInvoiceInfoLine         vendInvoiceInfoLine;

        VendInvoiceInfoSubTable     vendInvoiceInfoSubTable;

        VendInvoiceInfoSubLine      vendInvoiceInfoSubLine;

        InvoiceId                   invoiceId;

        TransDate                   invoiceDate;

        VendInvoiceJour             vendInvoiceJour;

        InventTrans                 inventTransQty;

        str errorLog;

        boolean isInvoiced;

        InvoiceId                   invoiceIdLocal;

        

        select vendPackingSlipJour where vendPackingSlipJour.PurchId == purchTable.PurchId;

        ttsBegin;

        if(vendPackingSlipJour.PackingSlipId)

        {

            invoiceId = strFmt("INV_%1", vendPackingSlipJour.PackingSlipId);

            invoiceDate = DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());


            purchTable = vendPackingSlipJour.purchTable();

            vendInvoiceInfoTable.clear();

            vendInvoiceInfoTable.initValue();

            vendInvoiceInfoTable.initFromPurchTable(purchTable);


            vendInvoiceInfoTable.DocumentOrigin         = DocumentOrigin::Manual;

            vendInvoiceInfoTable.CurrencyCode           = purchTable.CurrencyCode;

            vendInvoiceInfoTable.DeliveryName           = purchTable.DeliveryName;

            vendInvoiceInfoTable.Num                    = invoiceId;

            vendInvoiceInfoTable.PurchName              = purchTable.PurchName;

            vendInvoiceInfoTable.VendInvoiceSaveStatus  = VendInvoiceSaveStatus::Pending;

            vendInvoiceInfoTable.TransDate              = invoiceDate;

            vendInvoiceInfoTable.DocumentDate           = invoiceDate;

            vendInvoiceInfoTable.LastMatchVariance      = LastMatchVarianceOptions::OK;

            vendInvoiceInfoTable.ParmJobStatus          = ParmJobStatus::Waiting;

            vendInvoiceInfoTable.DefaultDimension       = vendInvoiceInfoTable.copyDimension(purchTable.DefaultDimension);

            vendInvoiceInfoTable.defaultRow(purchTable);

            vendInvoiceInfoTable.insert();


            if(vendInvoiceInfoTable)

            {

                vendInvoiceInfoSubTable.clear();

                vendInvoiceInfoSubTable.initValue();

                vendInvoiceInfoSubTable.defaultRow();

                vendInvoiceInfoSubTable.ParmId      = vendInvoiceInfoTable.ParmId;

                vendInvoiceInfoSubTable.OrigPurchId = vendInvoiceInfoTable.PurchId;

                vendInvoiceInfoSubTable.PurchName   = vendInvoiceInfoTable.PurchName;

                vendInvoiceInfoSubTable.TableRefId  = vendInvoiceInfoTable.TableRefId;


                vendInvoiceInfoSubTable.insert();

            }


            while select vendPackingSlipTrans

                where vendPackingSlipTrans.PackingSlipId == vendPackingSlipJour.PackingSlipId

                && vendPackingSlipTrans.VendPackingSlipJour == vendPackingSlipJour.RecId

            {

                purchLine = vendPackingSlipTrans.purchLine();

                vendInvoiceInfoLine.clear();

                vendInvoiceInfoLine.initValue();

                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     = vendPackingSlipTrans.InventDimId;

                vendInvoiceInfoLine.OrderAccount    = vendInvoiceInfoTable.OrderAccount;

                vendInvoiceInfoLine.ItemId          = vendPackingSlipTrans.ItemId;

                vendInvoiceInfoLine.InventTransId   = vendPackingSlipTrans.InventTransId;

                vendInvoiceInfoLine.PurchPrice      = purchLine.PurchPrice;

                vendInvoiceInfoLine.InventNow       = vendInvoiceInfoLine.ReceiveNow;

                vendInvoiceInfoLine.DocumentOrigin  = DocumentOrigin::Manual;

                vendInvoiceInfoLine.ReceiveNow      = vendPackingSlipTrans.Qty;

                vendInvoiceInfoLine.modifiedReceiveNow();

                if(purchLine.PurchQty != 0)

                {

                    vendInvoiceInfoLine.LineAmount = (purchLine.LineAmount / purchLine.PurchQty) * vendInvoiceInfoLine.ReceiveNow;

                }

                vendInvoiceInfoLine.DefaultDimension = purchLine.DefaultDimension;

                vendInvoiceInfoLine.insert();


                if(vendInvoiceInfoLine.RecId)

                {

                    vendInvoiceInfoSubLine.clear();

                    vendInvoiceInfoSubLine.initValue();

                    vendInvoiceInfoSubLine.defaultRow();

                    vendInvoiceInfoSubLine.ParmId               = vendInvoiceInfoTable.ParmId;

                    vendInvoiceInfoSubLine.LineRefRecId         = vendInvoiceInfoLine.RecId;

                    vendInvoiceInfoSubLine.ReceiveNow           = vendInvoiceInfoLine.ReceiveNow;

                    vendInvoiceInfoSubLine.InventNow            = vendInvoiceInfoLine.InventNow ;

                    vendInvoiceInfoSubLine.JournalRefRecId      = vendPackingSlipTrans.RecId;

                    vendInvoiceInfoSubLine.JournalRefTableId    = vendPackingSlipTrans.TableId;

                    vendInvoiceInfoSubLine.DocumentId           = vendPackingSlipTrans.PackingSlipId;

                    vendInvoiceInfoSubLine.insert();

                }

            }

            purchFormLetter = PurchFormLetter_Invoice::newFromSavedInvoice(vendInvoiceInfoTable);

            purchFormLetter.update(vendInvoiceInfoTable.purchTable(),vendInvoiceInfoTable.Num);

        }

        ttsCommit;

        PurchTable  purchTableLocal = PurchTable::find(purchTable.PurchId);

        PurchTable  purchTableUpdate;


        if (purchTableLocal.DocumentStatus == DocumentStatus::Invoice)

        {

            info(strFmt("Purchase order invoiced %1 ",purchTableLocal.PurchId));

            isInvoiced = true;

        }

        if(isInvoiced == true)

        {

            while select vendInvoiceJour where vendInvoiceJour.PurchId == purchTable.PurchId

            {

                invoiceIdLocal += vendInvoiceJour.InvoiceId+', ';

            }

            select forupdate purchTableUpdate where purchTableUpdate.PurchId == purchTableLocal.PurchId;

            if(purchTableUpdate)

            {

                ttsbegin;

                purchTableUpdate.Invoiced = invoiceIdLocal;

                purchTableUpdate.doUpdate();

                ttscommit;

            }

        }

    }


}

No comments:

Post a Comment