overcut calculate & item explode in d365fo x++

overcut calculate & item explode in d365fo x++

Code: 

class SLD_CalculateOvercut
{
    SLD_TmpBOMExplode  tmpBOM;
    SLD_RecipeIDEDT    recipeID;
    public static void main(Args _args)
    {
        FormRun formRun         = _args.caller();
        SLD_CalculateOvercut    SLD_CalculateOvercut = new SLD_CalculateOvercut();
        SalesTable              salesTable;
        SalesLine               salesLine, salesLineUpd;
        real                    overcutPercentage, RemainingSalesQty;
        List                    LineList   = new List(Types::Real);
        enumerator              enumerator = LineList.getEnumerator();
        
        
        if(_args.record() && _args.record().TableId == TableNum(SalesTable))
        {
            salesTable =  _args.record();
        }

        while select ItemId, sum(SalesQty)
        from salesLine
        group by salesLine.ItemId
        where salesLine.SalesId == salesTable.SalesId
        {
            
            sld_CalculateOvercut.itemExplode(salesLine.ItemId, salesLine::find(salesTable.SalesId).inventDim().configId, 0);
            overcutPercentage = sld_CalculateOvercut.getOvercutPercentage(salesLine.SalesQty);

            if(overcutPercentage > 0)
            {
                salesLineUpd.clear();
                while select forupdate salesLineUpd
                where salesLineUpd.SalesId == salestable.SalesId
                &&  salesLineUpd.ItemId == salesLine.ItemId
                {
                    ttsbegin;
                    salesLineUpd.bfpSurplusSalesQty   = decRound((salesLineUpd.SalesQty * overcutPercentage)/100, 0);
                    salesLineUpd.RemainInventPhysical = salesLineUpd.SalesQty + salesLineUpd.bfpSurplusSalesQty;
                    salesLineUpd.RemainSalesPhysical  = salesLineUpd.SalesQty + salesLineUpd.bfpSurplusSalesQty;
                    salesLineUpd.update();
                    ttscommit;
                }
            }
            
        }

        while
        select ItemId, sum(SalesQty)
        from salesLine 
        group by salesLine.ItemId
        where salesLine.SalesId == salesTable.SalesId
        {
            real Qtyval = 0;
            Qtyval = SLD_CalculateOvercut.getOvercutQty(salesLine.SalesQty);

            if(Qtyval > 0)
            {
                salesLineUpd.clear();

                while
                select forupdate salesLineUpd
                where salesLineUpd.SalesId == salestable.SalesId
                &&  salesLineUpd.ItemId == salesLine.ItemId
                {
                    ttsbegin;
                    salesLineUpd.bfpSurplusSalesQty = decRound(Qtyval,0);
                    salesLineUpd.RemainInventPhysical = salesLineUpd.SalesQty + salesLineUpd.bfpSurplusSalesQty;
                    salesLineUpd.RemainSalesPhysical = salesLineUpd.SalesQty + salesLineUpd.bfpSurplusSalesQty;
                    salesLineUpd.update();
                    ttscommit;
                }
            }
        }


        //info(strFmt('BomExplode took %1 seconds.', ((endTime - startTime)/1000)));
              
        if(formRun)
        {
            #Task
            formRun.task(#taskRefresh);
        }
    }

    private real getOvercutQty(Qty _qty)
    {   
        CBLOverCutPolicyTable   cblOverCutPolicyTable;
        CBLOverCutPolicyLines   cblOverCutPolicyLines;

        select RecId 
        from  cblOverCutPolicyTable 
        where cblOverCutPolicyTable.Status ==  CBLEnumPolicyStatus::Approved
                
        join  Qty
        from  cblOverCutPolicyLines
        where cblOverCutPolicyTable.PolicyId == cblOverCutPolicyLines.PolicyId
        &&    cblOverCutPolicyLines.FromQty <=  _qty && cblOverCutPolicyLines.ToQty >=  _qty
        &&    cblOverCutPolicyLines.IsQty == NoYes::Yes;

        if(cblOverCutPolicyLines)
        {
            return cblOverCutPolicyLines.Qty;
        }
        else
        {
            return 0;
        }
        
    }

    private real getOvercutPercentage(Qty _qty)
    {   
        SLD_RecipeTable         sld_RecipeTable;
        CBLOverCutPolicyTable   cblOverCutPolicyTable;
        CBLOverCutPolicyLines   cblOverCutPolicyLines;

        select firstonly RecipeID from tmpBOM where  TmpBOM.RecipeID != '';

        if(tmpBOM)
        {
            select RecId 
            from sld_RecipeTable 
            where sld_RecipeTable.SLD_RecipeID == tmpBOM.RecipeID

            join CBLEDTOvercutPer 
            from cblOverCutPolicyLines 
            where cblOverCutPolicyLines.WashGroupID == sld_RecipeTable.WashGroupID
            && cblOverCutPolicyLines.FromQty <=  _qty && cblOverCutPolicyLines.ToQty >=  _qty

            join RecId 
            from cblOverCutPolicyTable 
            where cblOverCutPolicyTable.PolicyId == cblOverCutPolicyLines.PolicyId
            && cblOverCutPolicyTable.Status ==  CBLEnumPolicyStatus::Approved;

            if(cblOverCutPolicyLines)
            {
                return cblOverCutPolicyLines.CBLEDTOvercutPer;
            }
            else
            {
                return 0;
            }
        }
        else
        {
            return 0;
        }
        
    }

    private int InsertParentItem(ItemId _itemId, int _level)
    {
        //Gets the parent information and then insert on TmpBOMExplode Table with level 0.
        tmpBOM.ItemId = _itemId;
        tmpBOM.Level = _level;
        tmpBOM.BOMQty = 1 ;
        tmpBOM.insert();

        return _level+ 1 ;
    }

    boolean hasChild(ItemId _itemId)
    {
        BOMVersion  bomVersion;
        ;
 
        //Check if the item is also a BOM item.
        select firstonly bomVersion
        where bomVersion.ItemId == _itemid
        && bomVersion.Active
        && bomVersion.FromDate <= systemdateget ()
        && (!bomVersion.ToDate || bomVersion.ToDate >= systemdateget ());
 
        if (bomVersion.RecId)
        return true ;
 
        return false ;
    }

    SLD_RecipeIDEDT itemExplode(ItemId _ItemId, str _configid, int _level = 0, BOMQty _bomQty = 1)
    {
        BOM         bomTable;
        BOMVersion  bomVersion;
        InventDim   InventDim;
 
        //Insert parent Item
        if (_level == 0)
        _level = this.InsertParentItem(_ItemId, _level);
 
        //Verifies if the Item exists in BOMVersion Table.
        //The item must be active and not expired.
        select firstonly bomVersion
        where bomVersion.ItemId == _itemid
        && bomVersion.Active == NoYes::Yes
        && bomVersion.FromDate <= systemdateget()
        && (!bomVersion.ToDate || bomVersion.ToDate >= systemdateget())
            
        join InventDim
        where BOMVersion.InventDimId == InventDim.inventDimId
        && InventDim.configId == _configid;
 
        if (bomVersion.RecId)
        {
            //Every item on BOMVersion has a BOMId which is used to show
            //which products belong to a BOM Item.
            While select bomTable
            where bomTable.BOMId == bomVersion.BOMId
            {
                //Insert the items that compose the BOM Item with level 1.
                tmpBOM.ItemId = bomTable.ItemId;
                tmpBOM.RefItemId = bomVersion.ItemId;
                //tmpBOM.BOMQty = bomTable.BOMQty;// bomTable.BOMQtySerie * _bomQty;
                tmpBOM.RecipeID = bfpBOMTemplateLine::find(bomTable.bfpBOMTemplateId,bomTable.bfpRefLineNum).SLD_RecipeID;
                tmpBOM.Level = _level;
                tmpBOM.insert();
 
                //This method is used to check if the BOM Item is composed by
                //another BOM Item, case true it will call the method recursively
                // with level 2.
                if (this.hasChild(bomTable.ItemId))
                this.itemExplode(bomTable.ItemId, _configid, _level+ 1, tmpBOM.BOMQty);
            }
        }
       

        return tmpBOM.RecipeID;
    }

}

Comments

Popular posts from this blog

D365FO – AX – X++ –Refresh, Reread, Research, and ExecuteQuery

Create Inventory Journal through Code in D365FO X++

SalesLine Reservation in D365fo x++