X++ Code to Create Purchase order automatically when physical inventory of a item

 Requirement:


Class1: In this we will create PO If the Physical Inventory of a item numbers is zero (0) then we have to create Purchase Order for the items whose physical inventory is zero.

class BASVendorMasterDialogBox extends RunBase

{

    DialogField fieldAccount;

    DialogFIeld fieldName;

    VendAccount vendAccount;

    VendTable vendTable;

    SalesTable salestableSelected,salestable;

    Object Dialog()

    {

        Dialog dialog;

        dialog = super();

        // Set a title fordialog

        dialog.caption( 'Vendor Account Form');

        // Add a new field to Dialog

        fieldAccount = dialog.addField(extendedTypeStr(vendAccount), 'Vendor Account' );

        return dialog;

    }

    public boolean getFromDialog()

    {

        // Retrieve values from Dialog

        vendAccount =fieldAccount.value();

        return super();

    }

    public void run(SalesTable _salesTable = salestable)

    {

        salestable = _salesTable;

        SalesLine salesLine;

        PurchPurchaseOrderHeaderV2Entity purchPurchaseOrder;

        PurchPurchaseOrderLineV2Entity purchPurchaseOrderLine;

        container itemNumbers;

        InventSum inventSum;

        InventDim inventDim;

        //Set Dialog field value to find CustTable

        vendTable = VendTable::find(vendAccount);

        while select ItemId from salesLine where salesLine.SalesId==salestable.SalesId

        {

            itemNumbers+=salesLine.ItemId;

        }

        str purchid;

        //Header creation

        for(int i=1;i<=conLen(itemNumbers);i++)

        {

            while select * from inventDim join salesLine  where salesLine.INVENTDIMID==inventDim.INVENTDIMID

            join PHYSICALINVENT ,INVENTLOCATIONID,INVENTSITEID from inventSum  where inventSum.INVENTDIMID==inventDim.INVENTDIMID

            && inventSum.ItemId==salesLine.ItemId

            && salesLine.SALESID==salesTable.SalesId && salesLine.ITEMID==conPeek(itemNumbers,i)

            && inventSum.PhysicalInvent <= 0

            {

                purchPurchaseOrder.initValue();

                purchPurchaseOrder.OrderVendorAccountNumber=vendTable.AccountNum;

                purchPurchaseOrder.insert();

                purchid = purchPurchaseOrder.PurchaseOrderNumber;   

            }

        }

        for(int i=1;i<=conLen(itemNumbers);i++)

        {

            while select * from inventDim join salesLine  where salesLine.INVENTDIMID==inventDim.INVENTDIMID

            join PHYSICALINVENT ,INVENTLOCATIONID,INVENTSITEID from inventSum  where inventSum.INVENTDIMID==inventDim.INVENTDIMID 

            && inventSum.ItemId==salesLine.ItemId

            && salesLine.SALESID==salesTable.SalesId && salesLine.ITEMID==conPeek(itemNumbers,i)

            && inventSum.PhysicalInvent <= 0

            {

                //Line creation

                purchPurchaseOrderLine.initValue();

                purchPurchaseOrderLine.PurchaseOrderNumber=purchid;

                purchPurchaseOrderLine.ItemNumber=conPeek(itemNumbers,i);

                purchPurchaseOrderLine.ReceivingSiteId=inventSum.InventSiteId;

                purchPurchaseOrderLine.ReceivingWarehouseId=inventSum.inventLocationId;

                purchPurchaseOrderLine.OrderedPurchaseQuantity=salesLine.SalesQty;

                purchPurchaseOrderLine.insert();

                purchPurchaseOrderLine.clear();

            }  

        }

            info(strFmt("Purchase Order number is %1",purchPurchaseOrder.PurchaseOrderNumber));   

    }

    public static void main(Args _args)

    {

        BASVendorMasterDialogBox vendorAccountDialog = new BASVendorMasterDialogBox();

        SalesTable salestableSelected =_args.record();

        if(vendorAccountDialog.prompt())

        {

            vendorAccountDialog.run(salestableSelected);

        }

    }

}


Second Class : In this we will confirm the purchase order and post the product receipt and invoice Number.

class BASProductReceiptDialogBox extends RunBase

{

    DialogField fieldAccount;

    DialogFIeld productReceiptField, invoiceNumberField;

    DlvDate divDate;

    ProductReceiptId productReceipt;

    VendInvoiceId vendInvoiceId;

    PurchTable purchtable;

    Object Dialog()

    {

        Dialog dialog;

        dialog = super();

        // Set a title fordialog

        dialog.caption( 'Product Receipt and Invoice Box');

        // Add a new field to Dialog

        fieldAccount = dialog.addField(extendedTypeStr(DlvDate), 'Invoice Date' );

        productReceiptField = dialog.addField(extendedTypeStr(ProductReceiptId), 'ProductReceiptId' );

        invoiceNumberField = dialog.addField(extendedTypeStr(VendInvoiceId), 'InvoiceReceiptId' );

        return dialog;

    }

    public boolean getFromDialog()

    {

        // Retrieve values from Dialog

        divDate =fieldAccount.value();

        productReceipt=productReceiptField.value();

        vendInvoiceId=invoiceNumberField.value();

        return super();

    }

    public void run(PurchTable _purchtable=purchtable)

    {

        purchtable = _purchtable; // get the selected purchid from purchtable

        PurchFormLetter             purchFormLetter; // It is a class which is used to update the purchase order

        PurchId                     purchId = purchtable.PurchId;

        purchTable    = PurchTable::find(purchId);

        //confirm the PO

        purchFormLetter = purchFormLetter::construct(DocumentStatus::PurchaseOrder); // constructing the PO of documentstatus PO


//PurchFormLetter class is used to confirm the purchase order and for posting the product receipt and for invoicing the purchase order.

        purchFormLetter.update(purchtable , strFmt(purchtable.PurchId)); // confirming the purchid 

        // Post product receipt

        purchFormLetter = PurchFormLetter::construct(DocumentStatus::PackingSlip); // constructing the PO of documentstatus of packingslip

        purchFormLetter.update(purchTable, strFmt(productReceipt)); 

        info("Product Receipt Posted Successfully");

        ;

        // posting invoice

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

        purchFormLetter.update(purchTable, strFmt(vendInvoiceId),

            DateTimeUtil::date(divDate));

        info("Invoice Posted Successfully");

        info(strFmt("%1,%2,%3",divDate,productReceipt,vendInvoiceId));

    }

    public static void main(Args _args)

    {

        BASProductReceiptDialogBox productReceiptDialog = new BASProductReceiptDialogBox();

        PurchTable purchTable=_args.record();

        if(productReceiptDialog.prompt())

        {

        productReceiptDialog.run(purchTable);

        }

    }

}

Comments

Popular posts from this blog

How to Create a wizard in x++ d365

how to post trade agreement journals automatically using x++ code

X++ code to CREATE AND POST A TRADE AGREEMENT IN MICROSOFT DYNAMICS 365 in D365 F & O