Thursday, 13 June 2019

create Purchase requisition through x++

class INTC_CreatePurchaseRequisition
{
    PurchReqTable                       purchReqTable;
    PurchReqLine                        purchReqLine;
    INTC_MaterialTakeOffTable           materialTakeOffTable;
    Name                                procurementCategoryId;
    INTC_MTKONumber                     mtkoNumber;

    public void createHeader(RecId  _recId)
    {
        select  materialTakeOffTable where materialTakeOffTable.RecId   ==  _recId;
        if(materialTakeOffTable.INTC_MTKONumber   !=  mtkoNumber)
        {
            purchReqTable.clear();
            purchReqTable.initValue();

            purchReqTable.PurchReqId        =   NumberSeq::newGetNum(PurchReqTable::numRefPurchReqId()).num();
            purchReqTable.PurchReqName      =   ProjTable::find(materialTakeOffTable.ProjId).Name;
            purchReqTable.ProjId            =   materialTakeOffTable.ProjId;
            purchReqTable.INTC_MTKONumber   =   materialTakeOffTable.INTC_MTKONumber;

            purchReqTable.insert();
            info(strFmt("Purchase requisition # %1 created", purchReqTable.PurchReqId));
        }
        mtkoNumber   =   materialTakeOffTable.INTC_MTKONumber;
        this.createLines(_recId);
    }

    public void createLines(RecId  _recId)
    {
        INTC_MaterialTakeOffTable           materialTakeOffTableUpdate;
        InventTable                         inventTable;
        InventDim                           inventDim;
        ProjTable                           projTable   =   ProjTable::find(materialTakeOffTable.ProjId);
        ProjInvoiceTable                    projInvoiceTable;

        select projInvoiceTable where projInvoiceTable.ProjInvoiceProjId    ==   projTable.ProjInvoiceProjId;
        inventTable =   InventTable::find(materialTakeOffTable.ItemId);

        purchReqLine.clear();
        purchReqLine.initValue();
       
        purchReqLine.initFromPurchReqTable(purchReqTable);
        purchReqLine.initFromInventTable(inventTable);

        purchReqLine.ItemId                 =   materialTakeOffTable.ItemId;
        purchReqLine.BuyingLegalEntity      =   CompanyInfo::find().RecId;
        purchReqLine.InventDimIdDataArea    =   curext();
        purchReqLine.PurchQty               =   materialTakeOffTable.QtyToOrder;
        inventDim.InventSiteId              =   materialTakeOffTable.InventSiteId;
        inventDim.InventLocationId          =   materialTakeOffTable.InventLocationId;
        purchReqLine.InventDimId            =   inventDim::findOrCreate(inventDim).inventDimId;
        purchReqLine.CurrencyCode           =   Ledger::accountingCurrency(CompanyInfo::current());
        purchReqLine.ProjSalesCurrencyId    =   projInvoiceTable.CurrencyId;
        purchReqLine.ProjCategoryId         =   materialTakeOffTable.ProjCategoryId;
        purchReqLine.ProjId                 =   materialTakeOffTable.ProjId;
        purchReqLine.ProcurementCategory    =   materialTakeOffTable.ProcureCategoryRecId;
        purchReqLine.PurchPrice             =   this.unitCost(materialTakeOffTable.ItemId, materialTakeOffTable.InventSiteId, materialTakeOffTable.InventLocationId);
        purchReqLine.LineAmount             =   purchReqLine.PurchPrice * materialTakeOffTable.QtyToOrder;
 
        purchReqLine.insert();

        select forupdate materialTakeOffTableUpdate where materialTakeOffTableUpdate.RecId  ==  _recId;
        ttsbegin;
        materialTakeOffTableUpdate.PurchReqId   =   purchReqTable.PurchReqId;
        materialTakeOffTableUpdate.update();
        ttscommit;
    }

    private real unitCost(ItemId _itemId, InventSiteId _site, InventlocationId _warehouse)
    {
        InventDim       inventDim;
        InventDimParm   inventDimParm;
        InventOnHand    inventOnHand;
        InventSum       inventSum;

        select firstOnly inventSum where inventSum.ItemId == _itemId;

        inventdim.InventSiteId      = _site;
        inventDim.InventLocationId  = _warehouse;

        inventDimParm.initFromInventDim(inventDim);
        inventOnHand = InventOnHand::newItemDim(inventSum.ItemId, inventDim, inventDimParm);

        return inventOnHand.costPricePcs();
    }

}

No comments:

Post a Comment