Share sales trade agreement journal - Microsoft Dynamics 365 Vietnam

Microsoft Dynamics 365 Vietnam

Song Nghia - Microsoft Dynamics 365 Vietnam

Breaking

Tuesday, May 12, 2020

Share sales trade agreement journal

Share sales trade agreement journal 


Song Nghia - Technical Consultant

Share sales trade agreement journal 

class LAW_SalesTradeAgreementJournalShare extends RunBaseBatch
{
    DialogField fieldCompany;
    companyId   _companyId, _currentCompany;
    PriceDiscAdmTable   _currentPriceDiscAdmTable;
    Map mapTableGroupVendor = new Map(Types::String, Types::String);
    public Object dialog()
    {
        Dialog dialog;
        ;
        dialog = super();

        dialog.caption("@LAW:LAW_SelectCompany");

        fieldCompany   =  dialog.addField(extendedTypeStr(companyId), "Company Id");

        return dialog;
    }

    public boolean getFromDialog()
    {
        // Retrieve values from Dialog
        _companyId = fieldCompany.value();
        return super();
    }

    public PriceDiscAdmTable parmPriceDiscAdmTable(PriceDiscAdmTable priceDiscAdmTable)
    {
        _currentPriceDiscAdmTable = priceDiscAdmTable;
        return _currentPriceDiscAdmTable;
    }

    public void run()
    {
        PriceDiscAdmTable   destinationDiscAdmTable;
        PriceDiscAdmTrans   priceDiscAdmTrans, priceDiscAdmTransGroup, priceDiscAdmTransOrder, destinationPriceDiscAdmTrans;
        PriceDiscTable      priceDiscTable;
        container           contRecId;
        int i;

        _currentCompany = curExt();
        try
        {
            ttsbegin;

            changecompany(_companyId)
            {
                destinationDiscAdmTable = this.createSalesTradeAgreementTable(_currentPriceDiscAdmTable);
            }
     
            if(destinationDiscAdmTable)
            {
                while select priceDiscAdmTrans
                where priceDiscAdmTrans.JournalNum == _currentPriceDiscAdmTable.JournalNum
                {
                    if(priceDiscAdmTrans.PriceDiscTableRef)
                    {
                        select firstonly  priceDiscTable
                        where priceDiscTable.RecId == priceDiscAdmTrans.PriceDiscTableRef;
                    }
                    changecompany(_companyId)
                    {
                        destinationPriceDiscAdmTrans = this.createSalesTradeAgreementTrans(destinationDiscAdmTable, priceDiscAdmTrans, priceDiscTable);
                        this.insertTradeAdmTransMap(priceDiscAdmTrans, destinationPriceDiscAdmTrans);
                    }
                }
                changecompany(_companyId)
                {
                    this.priceDiscAdmCheckPost(destinationDiscAdmTable);
                }
            }

            this.updateSourceTradeAgreement(_currentPriceDiscAdmTable);
         
            ttscommit;
        }
        catch
        {
            throw error("@LAW:LAW_CanNotShare");
        }
    }

    public PriceDiscAdmTrans createSalesTradeAgreementTrans(PriceDiscAdmTable newPriceDiscAdmTable, PriceDiscAdmTrans _priceDiscAdmTrans, PriceDiscTable _sourcePriceDiscTable)
    {
        PriceDiscAdmTrans           priceDiscAdmTrans, originalPriceDiscAdmTrans;
        PriceDiscTable              priceDiscTable;
        LAW_PriceDiscADmTransMap    priceDiscTransShare;
        MapEnumerator       mapEnumerator;
        int i = 1;
        priceDiscAdmTrans.clear();
        priceDiscAdmTrans.initFromPriceDiscAdmTrans(_priceDiscAdmTrans);
        priceDiscAdmTrans.JournalNum = newPriceDiscAdmTable.JournalNum;
        //Check if case edit from another trade.
        if(_priceDiscAdmTrans.PriceDiscTableRef)
        {
            select firstonly priceDiscTransShare
                where priceDiscTransShare.SourceRecId == _sourcePriceDiscTable.OriginalPriceDiscAdmTransRecId;

            if(priceDiscTransShare)
            {
                select firstonly originalPriceDiscAdmTrans
                    where originalPriceDiscAdmTrans.RecId == priceDiscTransShare.DestinationRecId;

                if(originalPriceDiscAdmTrans)
                {
                    select firstonly   priceDiscTable
                        where priceDiscTable.OriginalPriceDiscAdmTransRecId == originalPriceDiscAdmTrans.RecId;

                    if(priceDiscTable)
                    {
                        priceDiscAdmTrans.PriceDiscTableRef = priceDiscTable.RecId;
                    }
                }
            }
            else
            {
                throw error("@LAW:LAW_OriginalNotShare");
            }
        }

        priceDiscAdmTrans.insert();
        return priceDiscAdmTrans;
    }

    public void insertTradeAdmTransMap(PriceDiscAdmTrans _sourceCompany, PriceDiscAdmTrans _destinationCompany)
    {
        LAW_PriceDiscAdmTransMap    priceDiscAdmsMap;
        //After insert data in destination company, need to map data 2 trade agreement line
        priceDiscAdmsMap.SourceRecId = _sourceCompany.RecId;
        priceDiscAdmsMap.DestinationRecId = _destinationCompany.RecId;
        priceDiscAdmsMap.insert();
        //--end
    }

    public PriceDiscAdmTable createSalesTradeAgreementTable(PriceDiscAdmTable _currentDiscAdmTable)
    {
        PriceDiscTable              priceDiscTable;
     
        PriceDiscAdmTable           priceDiscAdmTable;

        priceDiscAdmTable.clear();
        priceDiscAdmTable.JournalName     = _currentDiscAdmTable.JournalName;
        priceDiscAdmTable.Name            = "@LAW:LAW_InsertTradeDescription";
        priceDiscAdmTable.DefaultRelation = _currentDiscAdmTable.DefaultRelation;
        priceDiscAdmTable.LAW_SourceCompany = _currentCompany;
        priceDiscAdmTable.LAW_Shared     =  NoYes::Yes;
        priceDiscAdmTable.LAW_SharedCompany = strFmt("%1,%2",_currentDiscAdmTable.LAW_SharedCompany, _companyId);
        priceDiscAdmTable.insert();

        return priceDiscAdmTable;
    }

    public void updateSourceTradeAgreement(PriceDiscAdmTable _currentDiscAdmTable)
    {
        _currentDiscAdmTable.selectForUpdate(true);
        _currentDiscAdmTable.LAW_Shared      =  NoYes::Yes;
        _currentDiscAdmTable.LAW_SourceCompany = _currentCompany;
        _currentDiscAdmTable.LAW_SharedCompany = strFmt("%1,%2",  _currentDiscAdmTable.LAW_SharedCompany, _companyId);
        _currentDiscAdmTable.update();
    }

    public void priceDiscAdmCheckPost(PriceDiscAdmTable priceDiscAdmTable)
    {
        PriceDiscAdmCheckPost   priceDiscAdmCheckPost = new PriceDiscAdmCheckPost(false);
        priceDiscAdmCheckPost.initJournalNum(priceDiscAdmTable.JournalNum);
        priceDiscAdmCheckPost.run();
     
    }

    public container findTableGroupOfDefaultVendor(PriceType _priceType)
    {
        VendTable venTable;
        RetailStoreTable retailStoreTable;
        container   contVendor = conNull();
        //Step 1. get all vendor in all store, check duplicate vendor
        //mapTableGroupVendor
        changecompany(_companyId)
        {
            while select retailStoreTable
                where retailStoreTable.LAW_IsFranchise
                    && retailStoreTable.LAW_DefaultVendor
            {
                if(_priceType == PriceType::EndDiscPurch)
                {
                    if(VendTable::find(retailStoreTable.LAW_DefaultVendor).EndDisc)
                        mapTableGroupVendor.insert(VendTable::find(retailStoreTable.LAW_DefaultVendor).EndDisc, "Group");
                    else
                        mapTableGroupVendor.insert(retailStoreTable.LAW_DefaultVendor, "Table");
                }
                if(_priceType == PriceType::LineDiscPurch)
                {
                    if(VendTable::find(retailStoreTable.LAW_DefaultVendor).LineDisc)
                        mapTableGroupVendor.insert(VendTable::find(retailStoreTable.LAW_DefaultVendor).LineDisc ,  "Group");
                    else
                        mapTableGroupVendor.insert(retailStoreTable.LAW_DefaultVendor, "Table");
                }
                if(_priceType == PriceType::MultiLineDiscPurch)
                {
                    if(VendTable::find(retailStoreTable.LAW_DefaultVendor).MultiLineDisc)
                        mapTableGroupVendor.insert( VendTable::find(retailStoreTable.LAW_DefaultVendor).MultiLineDisc, "Group");
                    else
                        mapTableGroupVendor.insert( retailStoreTable.LAW_DefaultVendor, "Table");
                }
                if(_priceType == PriceType::PricePurch)
                {
                    if(VendTable::find(retailStoreTable.LAW_DefaultVendor).PriceGroup)
                        mapTableGroupVendor.insert(VendTable::find(retailStoreTable.LAW_DefaultVendor).PriceGroup, "Group");
                    else
                        mapTableGroupVendor.insert(retailStoreTable.LAW_DefaultVendor, "Table");
                }

             
            }
        }
        return contVendor;
    }

    //public PriceDiscGroup createGroupAndSetPurchaseOrderDetail(PriceType _priceType, ItemId _itemid)
    //{
    //    PriceDiscGroup  priceDiscGroup;

    //    if(_priceType == PriceType::EndDiscPurch)
    //    {
    //        priceDiscGroup = this.insertPriceDiscGroup(PriceGroupType::EndDiscGroup, _itemid);
    //    }
    //    if(_priceType == PriceType::LineDiscPurch)
    //    {
    //        priceDiscGroup = this.insertPriceDiscGroup(PriceGroupType::LineDiscGroup, _itemid);
    //    }
    //    if(_priceType == PriceType::MultiLineDiscPurch)
    //    {
    //        priceDiscGroup = this.insertPriceDiscGroup(PriceGroupType::MultiLineDiscGroup, _itemid);
    //    }
    //    if(_priceType == PriceType::PricePurch)
    //    {
    //        priceDiscGroup = this.insertPriceDiscGroup(PriceGroupType::PriceGroup, _itemid);
    //    }

    //    return priceDiscGroup;
    //}

    //public PriceDiscGroup insertPriceDiscGroup(PriceGroupType _PriceGroupType, ItemId _itemId)
    //{
    //    PriceDiscGroup priceDiscGroup;
    //    container contVendorDestnation = this.findAndCreateGroupVendor();
    //    VendTable   vendTable;
    //    int i = 1;
    //    //Step 1: Create price disc group

    //    changecompany(_companyId)
    //    {
    //        try
    //        {
    //            priceDiscGroup.clear();
    //            priceDiscGroup.Module = ModuleInventCustVend::Vend;
    //            priceDiscGroup.Name = strFmt("Share_%1_%2_%3", _companyId, _itemId, guid2Str(newGuid()));
    //            priceDiscGroup.Type = _PriceGroupType;
    //            priceDiscGroup.GroupId = strFmt("Share_%1_%2_%3", _companyId, _itemId, guid2Str(newGuid()));
    //            priceDiscGroup.MCRPriceDiscGroupType = MCRPriceDiscGroupType::Standard;
    //            priceDiscGroup.doInsert();

    //            //Step 2: set puchase order default for vendor
    //            if(priceDiscGroup)
    //            {
    //                for(i = 1; i <= conLen( contVendorDestnation); i++)
    //                {
    //                    while select vendTable
    //                    where vendTable.AccountNum == conPeek(contVendorDestnation, i)
    //                    {
    //                        vendTable.selectForUpdate(true);
    //                        if(_PriceGroupType == PriceGroupType::EndDiscGroup)
    //                        vendTable.EndDisc = priceDiscGroup.GroupId;
    //                        if(_PriceGroupType == PriceGroupType::LineDiscGroup)
    //                        vendTable.LineDisc = priceDiscGroup.GroupId;
    //                        if(_PriceGroupType == PriceGroupType::MultiLineDiscGroup)
    //                        vendTable.MultiLineDisc = priceDiscGroup.GroupId;
    //                        if(_PriceGroupType == PriceGroupType::PriceGroup)
    //                        vendTable.PriceGroup = priceDiscGroup.GroupId;
    //                        vendTable.update();
    //                    }
    //                }
    //            }

    //        }
    //        catch
    //        {
    //            throw error("Can not create proce disc group");
    //        }
    //    }
    //    return priceDiscGroup;
    //}

    public boolean ValidateDataDestinationCompany()
    {
        PriceDiscAdmName   destinationDiscAdmName;
        PriceDiscAdmTrans   priceDiscAdmTrans;
        boolean ret = true;

        changeCompany(_companyId)
        {
            select firstonly destinationDiscAdmName
                where destinationDiscAdmName.JournalName == _currentPriceDiscAdmTable.JournalName;

            if(!destinationDiscAdmName)
                ret = checkFailed("@LAW:LAW_TradeAgreementNotExist");
        }

        while select priceDiscAdmTrans
            where priceDiscAdmTrans.JournalNum == _currentPriceDiscAdmTable.JournalNum
            && priceDiscAdmTrans.ItemRelation
        {
            //Check data in destination company
            changeCompany(_companyId)
            {
                if(//TH1. Table check item still exist in inventtable destination company
                    (!InventTable::find(priceDiscAdmTrans.ItemRelation) && priceDiscAdmTrans.ItemCode == PriceDiscProductCodeType::Table)
                    //TH2. Check Group item relation still exist in destination company
                    || ((!PriceDiscGroup::find(ModuleInventCustVend::Vend, PriceGroupType::EndDiscGroup, priceDiscAdmTrans.ItemRelation)
                         || !PriceDiscGroup::find(ModuleInventCustVend::Vend, PriceGroupType::LineDiscGroup, priceDiscAdmTrans.ItemRelation)
                         || !PriceDiscGroup::find(ModuleInventCustVend::Vend, PriceGroupType::MCRPostageDisc, priceDiscAdmTrans.ItemRelation)
                         || !PriceDiscGroup::find(ModuleInventCustVend::Vend, PriceGroupType::MultiLineDiscGroup, priceDiscAdmTrans.ItemRelation)
                         || !PriceDiscGroup::find(ModuleInventCustVend::Vend, PriceGroupType::PriceGroup, priceDiscAdmTrans.ItemRelation))
                         && priceDiscAdmTrans.ItemCode == PriceDiscProductCodeType::GroupId))
                    //&& (priceDiscAdmTrans.relation == PriceType::PricePurch || priceDiscAdmTrans.relation == PriceType::LineDiscPurch
                    //|| priceDiscAdmTrans.relation == PriceType::MultiLineDiscPurch||priceDiscAdmTrans.relation == PriceType::EndDiscPurch)))
                {
                    ret = checkFailed(strFmt("@LAW:LAW_ItemShareNotExist", priceDiscAdmTrans.ItemRelation));
                }
            }
        }


        //retrict share current company
        if(_companyId == curExt())
        {
            ret = checkFailed("@LAW:LAW_CannotShareCurrentCom");
        }

        //Only share data if journal had posted

        if(_currentPriceDiscAdmTable.Posted == NoYes::No)
        {
            ret = checkFailed("@LAW:LAW_TradeAgreeNotPost");
        }

        //Can not share data if data shared

        if(_currentPriceDiscAdmTable.LAW_Shared == NoYes::Yes)
        {
            ret = checkFailed("@LAW:LAW_BeenShared");
        }
        return ret;
    }

    public boolean validate(Object calledFrom = null)
    {
        boolean ret;
 
        ret = super(calledFrom);
        if(!_companyId)
            ret = ret && checkFailed('@LAW:LAW_SelectCompany');

        ret = this.ValidateDataDestinationCompany();

        return ret;
    }

    public static void main(Args _args)
    {
        LAW_SalesTradeAgreementJournalShare tradeAgreementShare = new LAW_SalesTradeAgreementJournalShare();
        if(_args && _args.dataset() == tableNum(PriceDiscAdmTable))
        {
            tradeAgreementShare.parmPriceDiscAdmTable(_args.record());

            if(tradeAgreementShare.prompt())
            {
                tradeAgreementShare.run();
            }
        }
     
    }

}