Share purchase agreement to franchise company. - The Strategic ERP Advisor

The Strategic ERP Advisor

Strategic ERP Solutions and Consulting

Breaking

Tuesday, May 12, 2020

Share purchase agreement to franchise company.

Share purchase agreement to franchise company.


Song Nghia - Technical consulant

Idea: Franchise company want to get price from source company, so we can understand that franchise company have default vendor is source company.

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

        dialog.caption("Select company to share");

        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;

        _currentCompanyId = curExt();
        try
        {
            ttsbegin;

            changecompany(_companyId)
            {
                destinationDiscAdmTable = this.createPurchTradeAgreementTable(_currentPriceDiscAdmTable);
            }
        
            if(destinationDiscAdmTable)
            {
                //Get smallest price???

                while select ItemRelation from priceDiscAdmTransGroup
                    group by  priceDiscAdmTransGroup.ItemRelation
                     where priceDiscAdmTransGroup.JournalNum == _currentPriceDiscAdmTable.JournalNum
                {
                    select firstonly priceDiscAdmTransOrder
                        order by priceDiscAdmTransOrder.Amount asc
                        where priceDiscAdmTransOrder.JournalNum == _currentPriceDiscAdmTable.JournalNum
                        && priceDiscAdmTransOrder.ItemRelation == priceDiscAdmTransGroup.ItemRelation;

                    contRecId += priceDiscAdmTransOrder.RecId;
                }
                
                for(i = 1; i <= conLen(contRecId); i++)
                {
                    select firstonly priceDiscAdmTrans
                        where priceDiscAdmTrans.RecId == conPeek(contRecId, i);
                    if(priceDiscAdmTrans.PriceDiscTableRef)
                    {
                        //quay ve
                        select firstonly  priceDiscTable
                        where priceDiscTable.RecId == priceDiscAdmTrans.PriceDiscTableRef;
                    }
                    changecompany(_companyId)
                    {
                        destinationPriceDiscAdmTrans = this.createPurchTradeAgreementTrans(destinationDiscAdmTable, priceDiscAdmTrans, priceDiscTable);
                        this.insertTradeAdmTransMap(priceDiscAdmTrans, destinationPriceDiscAdmTrans);
                    }
                }

                /*while select priceDiscAdmTrans
                where priceDiscAdmTrans.JournalNum == _currentPriceDiscAdmTable.JournalNum
                {
                    if(priceDiscAdmTrans.PriceDiscTableRef)
                    {
                        //quay ve
                        select firstonly  priceDiscTable
                        where priceDiscTable.RecId == priceDiscAdmTrans.PriceDiscTableRef;
                    }
                    changecompany(_companyId)
                    {
                        destinationPriceDiscAdmTrans = this.createPurchTradeAgreementTrans(destinationDiscAdmTable, priceDiscAdmTrans, priceDiscTable);
                        this.insertTradeAdmTransMap(priceDiscAdmTrans, destinationPriceDiscAdmTrans);
                    }
                }*/
                changecompany(_companyId)
                {
                    this.priceDiscAdmCheckPost(destinationDiscAdmTable);
                }
            }

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

    public PriceDiscAdmTrans createPurchTradeAgreementTrans(PriceDiscAdmTable newPriceDiscAdmTable, PriceDiscAdmTrans _priceDiscAdmTrans, PriceDiscTable _sourcePriceDiscTable)
    {
        PriceDiscAdmTrans           priceDiscAdmTrans, originalPriceDiscAdmTrans;
        PriceDiscTable              priceDiscTable;
        LAW_PriceDiscADmTransMap    priceDiscTransShare;
        MapEnumerator       mapEnumerator;
        int i = 1;
        //container contGroup = this.findGroupOfDefaultVendor(_priceDiscAdmTrans.relation);
        //container contDefault = this.findAllDefaultVendor();
        priceDiscAdmTrans.clear();
        priceDiscAdmTrans.JournalNum    = newPriceDiscAdmTable.JournalNum;

        //Relation same source company
        priceDiscAdmTrans.relation      = _priceDiscAdmTrans.relation;
        
        priceDiscAdmTrans.ItemCode      = _priceDiscAdmTrans.ItemCode;
        priceDiscAdmTrans.ItemRelation  = _priceDiscAdmTrans.ItemRelation;
        priceDiscAdmTrans.Amount        = _priceDiscAdmTrans.Amount;
        priceDiscAdmTrans.FromDate      = _priceDiscAdmTrans.FromDate;
        priceDiscAdmTrans.Currency      = _priceDiscAdmTrans.Currency;
        priceDiscAdmTrans.UnitId        = _priceDiscAdmTrans.UnitId;
        priceDiscAdmTrans.PriceUnit     = _priceDiscAdmTrans.PriceUnit;
        priceDiscAdmTrans.InventDimId   = _priceDiscAdmTrans.InventDimId;
        priceDiscAdmTrans.Agreement   = _priceDiscAdmTrans.Agreement;
        priceDiscAdmTrans.AgreementHeaderExt_RU   = _priceDiscAdmTrans.AgreementHeaderExt_RU;
        priceDiscAdmTrans.AllocateMarkup   = _priceDiscAdmTrans.AllocateMarkup;
        priceDiscAdmTrans.CalendarDays   = _priceDiscAdmTrans.CalendarDays;
        priceDiscAdmTrans.DeliveryTime   = _priceDiscAdmTrans.DeliveryTime;
        priceDiscAdmTrans.DifferentFromPosted   = _priceDiscAdmTrans.DifferentFromPosted;
        priceDiscAdmTrans.DisregardLeadTime   = _priceDiscAdmTrans.DisregardLeadTime;
        priceDiscAdmTrans.GenericCurrency   = _priceDiscAdmTrans.GenericCurrency;
        priceDiscAdmTrans.InventBaileeFreeDays_RU   = _priceDiscAdmTrans.InventBaileeFreeDays_RU;
        //priceDiscAdmTrans.LineNum   = _priceDiscAdmTrans.LineNum;
        priceDiscAdmTrans.Log   = _priceDiscAdmTrans.Log;
        priceDiscAdmTrans.Markup   = _priceDiscAdmTrans.Markup;
        priceDiscAdmTrans.MaximumRetailPrice_IN   = _priceDiscAdmTrans.MaximumRetailPrice_IN;
        priceDiscAdmTrans.MustBeDeleted   = _priceDiscAdmTrans.MustBeDeleted;
        priceDiscAdmTrans.PDSCalculationId   = _priceDiscAdmTrans.PDSCalculationId;
        priceDiscAdmTrans.Percent1   = _priceDiscAdmTrans.Percent1;
        priceDiscAdmTrans.Percent2   = _priceDiscAdmTrans.Percent2;
        priceDiscAdmTrans.QuantityAmountFrom   = _priceDiscAdmTrans.QuantityAmountFrom;
        priceDiscAdmTrans.QuantityAmountTo   = _priceDiscAdmTrans.QuantityAmountTo;
        priceDiscAdmTrans.ToDate   = _priceDiscAdmTrans.ToDate;


        //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_ShareFailBecauseShared");
            }
            //find PriceDisTable

        }
        //case all => share price to all party
        //if(_priceDiscAdmTrans.AccountCode == PriceDiscPartyCodeType::All)
        //{
        //    priceDiscAdmTrans.AccountCode       = _priceDiscAdmTrans.AccountCode;
        //    priceDiscAdmTrans.AccountRelation   = _priceDiscAdmTrans.AccountRelation;
        //}
        //if(_priceDiscAdmTrans.AccountCode == PriceDiscPartyCodeType::GroupId)
        //{
        //    priceDiscAdmTrans.AccountCode       = _priceDiscAdmTrans.AccountCode;
        //    priceDiscAdmTrans.AccountRelation   = _priceDiscAdmTrans.AccountRelation;
        //}

        //Auto group all default vendor of store to group
        //If only default customer for all destination store
        /*if(conLen(contDefault) == 1 && contDefault)
        {
            priceDiscAdmTrans.AccountCode       = PriceDiscPartyCodeType::Table;
            priceDiscAdmTrans.AccountRelation   = conPeek(contDefault, 1);
            priceDiscAdmTrans.insert();
        }
        else
        {
            if(conLen(contGroup) >= 1)
            {
                for(i = 1 ; i< conLen(contGroup); i++)
                {
                    priceDiscAdmTrans.AccountCode       = PriceDiscPartyCodeType::GroupId;
                    priceDiscAdmTrans.AccountRelation   = conPeek(contGroup, i);
                    priceDiscAdmTrans.insert();
                }
            }
            else
            {
                for( i = 0; i < conLen(contDefault); i++)
                {
                    //priceDiscAdmTrans.AccountCode == PriceDiscPartyCodeType::Table;
                }
            }
        }*/

        this.findTableGroupOfDefaultVendor(_priceDiscAdmTrans.relation);
        mapEnumerator = mapTableGroupVendor.getEnumerator();

        while (mapEnumerator.moveNext())
        {
            if(mapEnumerator.currentValue() == "Table")
            {
                priceDiscAdmTrans.AccountCode       = PriceDiscPartyCodeType::Table;
                priceDiscAdmTrans.AccountRelation   = mapEnumerator.currentKey();
                priceDiscAdmTrans.insert();
            }
            
            if(mapEnumerator.currentValue() == "Group")
            {
                priceDiscAdmTrans.AccountCode       = PriceDiscPartyCodeType::GroupId;
                priceDiscAdmTrans.AccountRelation   = mapEnumerator.currentKey();
                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 createPurchTradeAgreementTable(PriceDiscAdmTable _currentDiscAdmTable)
    {
        PriceDiscTable              priceDiscTable;
        
        PriceDiscAdmTable           priceDiscAdmTable;

        priceDiscAdmTable.clear();
        priceDiscAdmTable.JournalName     = _currentDiscAdmTable.JournalName;
        priceDiscAdmTable.Name            = "@LAW:LAW_InsertTradeDescription";
        priceDiscAdmTable.DefaultRelation = _currentDiscAdmTable.DefaultRelation;
        priceDiscAdmTable.LAW_SourceCompany = _currentCompanyId;
        priceDiscAdmTable.LAW_Shared      = NoYes::Yes;
        priceDiscAdmTable.insert();

        return priceDiscAdmTable;
    }

    public void updateSourceTradeAgreement(PriceDiscAdmTable _currentDiscAdmTable)
    {
        _currentDiscAdmTable.selectForUpdate(true);
        _currentDiscAdmTable.LAW_Shared      =  NoYes::Yes;
        _currentDiscAdmTable.LAW_SourceCompany = curExt();
        _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 findAllDefaultVendor()
    {
        VendTable venTable;
        RetailStoreTable retailStoreTable;
        
        container   contVendor = conNull();
        //Step 1. get all vendor in all store, check duplicate vendor
        changecompany(_companyId)
        {
            while select retailStoreTable
                where retailStoreTable.LAW_IsFranchise
                    && retailStoreTable.LAW_DefaultVendor
            {
                if(!conFind(contVendor, retailStoreTable.LAW_DefaultVendor))
                {
                    contVendor += retailStoreTable.LAW_DefaultVendor;
                }
            }
        }
        return contVendor;
    }

    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_PurchaseTradeAgreementJournalShare tradeAgreementShare = new LAW_PurchaseTradeAgreementJournalShare();
        if(_args && _args.dataset() == tableNum(PriceDiscAdmTable))
        {
            tradeAgreementShare.parmPriceDiscAdmTable(_args.record());

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

}