Monday, 4 February 2019

AX7 Req 3

class CustParameterEventhandler
{   
    //Enable and Disable field "Extra Calculationday" based on Enum value for the field "CreditCheckType".
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormControlEventHandler(formControlStr(CustParameters, FormGroupControl1_FINCustCreditCheckType), FormControlEventType::Modified)]
    public static void FormGroupControl1_FINCustCreditCheckType_OnModified(FormControl sender, FormControlEventArgs e)
    {
        FormRun             formRun          = sender.formRun();
        FormComboBoxControl    finCreditCheckType = formRun.design(0).controlName("FormGroupControl1_FINCustCreditCheckType");
        FormIntControl    extraCalculationDays = formRun.design(0).controlName("FormGroupControl1_EQNExtraCalculationDays");
     
        if(finCreditCheckType.valueStr() == enum2str(FINCustCreditCheckType::BasedonExposure))
        {
            extraCalculationDays.enabled(true);
        }
        else
        {
            extraCalculationDays.enabled(false);
        }
    }

    //Lookup for the Sales PoolId
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormControlEventHandler(formControlStr(CustParameters, FormGroupControl1_EQNExcludeFromExposure), FormControlEventType::Lookup)]
    public static void FormGroupControl1_EQNExcludeFromExposure_OnLookup(FormControl sender, FormControlEventArgs e)
    {
        FormRun             formRun          = sender.formRun();
        FormStringControl    excludeFromExposure = formRun.design(0).controlName("FormGroupControl1_EQNExcludeFromExposure");
        Query query = new Query();
        QueryBuildDataSource qbds;
        SysTableLookup sysTableLookup;
        sysTableLookup = SysTableLookup::newParameters(tableNum(SalesPool), sender);
        sysTableLookup.addLookupfield(fieldNum(SalesPool,SalesPoolId));
        sysTableLookup.addLookupfield(fieldNum(SalesPool, Name));
        qbds = query.addDataSource(tableNum(SalesPool));
        sysTableLookup.parmQuery(query);
        sysTableLookup.performFormLookup();
    }

    //Lookup created for standardDayRateCode using existing Table reference lookup method
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormControlEventHandler(formControlStr(CustParameters, FormGroupControl1_EQNStandardDayRateCodeint), FormControlEventType::Lookup)]
    public static void FormGroupControl1_EQNStandardDayRateCodeint_OnLookup(FormControl sender, FormControlEventArgs e)
    {     
        CustParameterEventhandler::createLookup(sender);   
    }

    private static void createLookup(FormReferenceGroupControl _ctrl)
    {
        SysReferenceTableLookup sysTableLookup = SysReferenceTableLookup::newParameters(tablenum(UnitOfMeasure), _ctrl);
        Query                   query = new Query();
        QueryBuildDataSource    unitMeasureDS;
        unitMeasureDS   =   query.addDataSource(tableNum(UnitOfMeasure));
        unitMeasureDS.addRange(fieldNum(UnitOfMeasure,UnitOfMeasureClass)).value(SysQuery::value(UnitOfMeasureClass::Time));
        sysTableLookup.addLookupfield(fieldNum(UnitOfMeasure,Symbol));
        sysTableLookup.parmQuery(query);
        sysTableLookup.performFormLookup();
    }

}
======================================================================
class EQNCreditExposureCalculations
{
    Amount openbalance,orderedAmt,totExposure,TotPercentExposure; 
     

    static Amount calculateMarkupTrans(SalesId _salesId)
    {
        AmountCur               markupAmount,headermarkupamt,linemarkupamt,totTaxAmountCur,lineamount;     
        MarkupTrans             markupTrans;
        CurrencyExchangeHelper  curCurrencyExchangeHelper;
        SalesTable              salesTable = SalesTable::find(_salesId);
        SalesLine               salesLine;
        SalesTotals             salestotals;
        container               cont;

        // Code to calculate total tax for sales order inlucing charges tax-->
        salesTotals = SalesTotals::construct(salesTable, SalesUpdate::All);
        salesTotals.calc();
        cont         = salesTotals.displayFieldsCurrency(salesTotals.currencyCode());
        totTaxAmountCur = conpeek(cont, TradeTotals::posTaxTotal());
        // Code to calculate total tax for sales order inlucing charges tax<--

        // Code to calculate total Charge  for sales order header-->
        while select markupTrans
            where markupTrans.TransTableId  == salesTable.TableId
                &&markupTrans.TransRecId    == salesTable.RecId
        {
            markupAmount = markupTrans.Value;
            if (markupTrans.CurrencyCode != salesTable.CurrencyCode)
            {
                // To automatically conver amount Markup::calcMarkupAmount can be used
                curCurrencyExchangeHelper = CurrencyExchangeHelper::newExchangeDate(Ledger::primaryLedger(CompanyInfo::findDataArea(markupTrans.company()).RecId), systemDateGet());
                markupAmount = curCurrencyExchangeHelper.calculateAccountingToTransaction(salesTable.CurrencyCode, markupAmount, true); 
             
            }
            headermarkupamt =headermarkupamt+markupAmount;
        }
        // Code to calculate total Charge  for sales order header <--

        // Code to calculate total Charge  for sales order lines-->
        while select salesLine
        where salesLine.SalesId == salesTable.SalesId
        {
            while select markupTrans
            where markupTrans.TransTableId  == salesLine.TableId
                &&markupTrans.TransRecId    == salesLine.RecId
            {
                markupAmount = Markup::calcTrans(markupTrans, salesLine.SalesQty, salesLine.LineAmount);
                if (markupTrans.CurrencyCode != salesTable.CurrencyCode)
                {
                    // To automatically conver amount Markup::calcMarkupAmount can be used
                    curCurrencyExchangeHelper = CurrencyExchangeHelper::newExchangeDate(Ledger::primaryLedger(CompanyInfo::findDataArea(markupTrans.company()).RecId), systemDateGet());
                    markupAmount = curCurrencyExchangeHelper.calculateAccountingToTransaction(salesTable.CurrencyCode, markupAmount, true);                 
                }
                linemarkupamt   =   linemarkupamt+markupAmount;
            }
        }
        // Code to calculate total Charge  for sales order lines<--
     
        markupAmount    =   linemarkupamt+headermarkupamt;//Sum both line and Header Charges for Sales order

        // Calculate Charge lines tax if we get tax > 0 for sales order-->
        if(salesTable.InclTax == noyes::No && totTaxAmountCur >0)// Calculate Charge lines tax if we get tax > 0 for sales order
        {
            TaxGroupHeading     taxgroup;
            TaxGroupData        taxgroupdata;
            select * from taxgroupdata
                where taxgroupdata.TaxGroup == salesTable.TaxGroup;
            real taxpercent =taxgroupdata.ShowTaxValue();

            markupAmount =markupAmount+(markupAmount*taxgroupdata.ShowTaxValue())/100;//Add tax amount to Charge lines when Salestable Includetax field is set to no.
        }
        // Calculate Charge lines tax if we get tax > 0 for sales order-->
        return markupAmount;

    }

    public Amount   custorderedbal(CustTable   _custTbl)
    {
        CustCreditLimit custCreditLimit;
        SalesTable      salesTable;
        SalesTotals     salesTotals;
        salesTable.CustAccount  = _custTbl.AccountNum;
        salesTable.initFromCustTable();
        salesTotals = SalesTotals::construct(salesTable);
        salesTotals.calc();
        custCreditLimit = CustCreditLimit::construct(salesTable);
        if( CustParameters::find().FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure)
        {
            orderedAmt  =   EQNFINCustExposureTrans::CustomerExposure(_custTbl.AccountNum);
        }
        else
            orderedAmt  =   custCreditLimit.balanceEstimate();
     
        return orderedAmt;
    }

    //Calculates Financial Exposure for the Current Order.
    public static client server Amount financalExposurePerOrder(EQNOrderTypes   _orderTypes,SalesTable   _salesTable)
    {
        Amount financialriskperorder,financialriskperline;
     
        Query           query;
        QueryRun        qr;
        SalesTable      salesTable;
        SalesLine       salesLine;     
        EQNCreditExposureCalculations    fincheckcreditlimit = new EQNCreditExposureCalculations();
   
        while select salesLine
            where salesLine.SalesId ==_salesTable.SalesId
        {
            Amount              lineamount=0,TaxAmountCur=0;
            financialriskperline    =0;
            if(salesline.SalesQty-salesline.invoicedInTotal()== 0)
            {
                financialriskperline    =0;
               continue;
            }
            if(salesLine.RORTradeType    ==  RORTradeType::Rental || salesLine.RORTradeType    ==  RORTradeType::SubRental)
            {
                if(salesLine.INVInvoiceProfileId != CustParameters::find().EQNINVInvoiceProfileSetRate)
                    financialriskperline = fincheckcreditlimit.rentalTypeCreditExposure(salesLine,_salesTable.CustAccount);//(salesline.SalesQty-salesline.invoicedInTotal()) * fincheckcreditlimit.rentalTypeCreditExposure(salesLine,_salesTable.CustAccount);
                else
                {                 
                    lineamount  =   salesLine.RORRentalLine::editLineAmount(false,salesLine.LineAmount);
                    if(SalesTable::find(salesLine.SalesId).InclTax == noyes::No)
                    {                     
                        TaxAmountCur=Tax::calcTaxAmount(salesLine.TaxGroup, salesLine.TaxItemGroup, Systemdateget(), salesLine.CurrencyCode, lineamount, TaxModuleType::Sales);
                        lineamount  =   lineamount+TaxAmountCur;
                    }
                    financialriskperline    =   lineamount;
                }
            }
            else if (salesLine.RORTradeType    ==  RORTradeType::SalesPurch)
            {
                if(_salesTable.SalesType    ==SalesType::RORRental)
                {                 
                    lineamount  =   salesLine.RORRentalLine::editLineAmount(false,salesLine.LineAmount);
                    if(salesline.invoicedInTotal()>0)
                    {
                        qty invoicedqty = salesline.invoicedInTotal();
                        lineamount = (lineamount/salesline.SalesQty)*(salesline.SalesQty-invoicedqty);//Get line amount for only uninvoiced lines
                    }
                    TaxAmountCur=Tax::calcTaxAmount(salesLine.TaxGroup, salesLine.TaxItemGroup, Systemdateget(), salesLine.CurrencyCode, lineamount, TaxModuleType::Sales);
                    lineamount  =   lineamount+TaxAmountCur;
                    financialriskperline    =   lineamount;
                }
                else
                {
                    qty invoicedqty = salesline.invoicedInTotal();
                    if(salesline.SalesQty-salesline.invoicedInTotal()>0)
                    {
                        if(salesline.lineDisc > 0)
                            lineamount  =   salesLine.SalesPrice-salesline.lineDisc;
                        if(salesLine.LinePercent >0)
                            lineamount  =   salesLine.SalesPrice - ((salesLine.SalesPrice*salesLine.LinePercent)/100);
                        if(salesline.lineDisc == 0 && salesLine.LinePercent == 0)
                        lineamount  =   salesLine.SalesPrice;//salesLine.LineAmount;
                        if(SalesTable::find(salesLine.SalesId).InclTax == noyes::No)
                        {
                            //TaxAmountCur=Tax::calcTaxAmount(salesLine.TaxGroup, salesLine.TaxItemGroup, Systemdateget(), salesLine.CurrencyCode, salesLine.LineAmount, TaxModuleType::Sales);
                            TaxAmountCur=Tax::calcTaxAmount(salesLine.TaxGroup, salesLine.TaxItemGroup, Systemdateget(), salesLine.CurrencyCode, lineamount, TaxModuleType::Sales);
                            lineamount  =   lineamount+TaxAmountCur;
                        }
                        financialriskperline    =   (salesline.SalesQty-salesline.invoicedInTotal()) * lineamount;
                    }
                    //financialriskperline    =   financialriskperline +TaxAmountCur;
                }
            }
            financialriskperorder   =  financialriskperorder + financialriskperline;
        }

        //fincheckcreditlimit.insertEQNFINCustExposureTrans(_salesTable,financialExposurePerOrder);
        return financialriskperorder;

    }

    public static void delEqnCustExposureTrans(SalesTable _salesTable)
    {
        SalesLine  salesline;
        EQNFINCustExposureTrans     finCustExposureTrans = null;
        select  sum(REMAINSALESPHYSICAL) from salesline where salesline.SALESID == _salesTable.SalesId;
        if(salesline.RemainSalesPhysical == 0)
        {
            delete_from finCustExposureTrans where finCustExposureTrans.EQNSalesId ==  _salesTable.SalesId;
        }
    }

    //Insert Financial Exposure for the Current Order in to EQNFINCustExposureTrans.
    public static client server void insertEQNFINCustExposureTrans(SalesTable _salesTable,Amount financialriskAmt)
    {
        EQNFINCustExposureTrans finCustExposureTrans =null;
        finCustExposureTrans = EQNFINCustExposureTrans::find(_salesTable.SalesId,true);
        if(finCustExposureTrans)
        {
            ttsbegin;
            finCustExposureTrans.EQNExposureValue   =   financialriskAmt;
            finCustExposureTrans.update();
            ttscommit;
        }
        else
        {
            finCustExposureTrans.EQNCurrency        =   _salesTable.CurrencyCode;
            finCustExposureTrans.EQNExposureValue   =   financialriskAmt;
            finCustExposureTrans.EQNProspectAccount =   _salesTable.CustAccount;
            finCustExposureTrans.EQNSalesId         =   _salesTable.SalesId;
            if(_salesTable.SalesType    ==  SalesType::Sales)
                finCustExposureTrans.EQNSalesType       =   Eqnordertypes::SalesOrder;
            if(_salesTable.SalesType    ==  SalesType::RORRental)
                finCustExposureTrans.EQNSalesType       =   Eqnordertypes::RentalOrder;
            finCustExposureTrans.insert();
        }
     
    }

    public int workingdaysIncalendar(CalendarId  _calendarId,int days)
    {
        WorkCalendarSched workCalendarSched;
        date start;
        date end;
        counter workingdays;
        counter totaldays;
        CalendarId primCalendar=_calendarId;
     

        start=today();
        end= today()+days;

        workCalendarSched = new workCalendarSched();

        while(start<end)
        {
            if(workCalendarSched.isdateopen(primCalendar,start)==true)
            {
                workingdays++;
            }
            start++;
        }
        return workingdays;
    }

    //Calculation of financial exposure for Rental order type
    public Amount rentalTypeCreditExposure(SalesLine   _salesline, accountNum _custacc)
    {
        Days                creditExposurePeriod,paymentdays,expectedRentalPeriod,rentaldayInExposure;
        TransDate           estimatedoffrentdate,calDate;
        CustParameters      custParameters;
        Amount              rentalLineFinancialRisk=0,ratePerRentalDay=0;
        PaymTerm            PaymTerm;
        RORRentalDateTimes  rentalDateTimes;
        INVInvoicePeriod    invInvoicePeriod;
        real                chargeableDays=0,unitconversion=0,unitconversionfinal=0,workingdays=0,unitval;
        Amount              lineamount=0,TaxAmountCur=0;
        custParameters  =   CustParameters::find(false);
        rentalDateTimes     =   RORRentalDateTimes::findReference(_salesline.TableId,_salesline.RecId,false);
        paymentdays         =   PaymTerm::find(SalesTable::find(_salesline.SalesId).payment).NumOfDays;
        select * from invInvoicePeriod
            where invInvoicePeriod.PeriodStatus ==  INVPeriodStatus::Uninvoiced
            && invInvoicePeriod.RefRecId == _salesline.RecId
                && invInvoicePeriod.RefTableId == _salesline.TableId;
        if(!invInvoicePeriod.RecId)
            return 0;
        if(DateTimeUtil::date(rentalDateTimes.OffRentDateTime)!= dateNull())
            estimatedoffrentdate    =  DateTimeUtil::date(rentalDateTimes.OffRentDateTime);
        else
            estimatedoffrentdate    =   DateTimeUtil::date(rentalDateTimes.ExpectedOffRentDateTime);
        select firstonly invInvoicePeriod
            order by RecId desc
            where invInvoicePeriod.RefRecId == _salesline.RecId
                && invInvoicePeriod.RefTableId == _salesline.TableId
                && (invInvoicePeriod.PeriodStatus ==  INVPeriodStatus::FullyInvoiced) || (invInvoicePeriod.PeriodStatus ==  INVPeriodStatus::PartiallyInvoiced);
        if(invInvoicePeriod)
        {
            if(DateTimeUtil::date(invInvoicePeriod.PeriodEndDateTime) > today())
                calDate =  DateTimeUtil::date(invInvoicePeriod.PeriodEndDateTime);
            else
                calDate    =   today();
            if(DateTimeUtil::date(rentalDateTimes.OnRentDateTime) > calDate)
                calDate    =   DateTimeUtil::date(rentalDateTimes.OnRentDateTime);         
        }
        else
        {
            if(DateTimeUtil::date(rentalDateTimes.OnRentDateTime) > today())
                calDate    =   DateTimeUtil::date(rentalDateTimes.OnRentDateTime);
            else
                calDate    =   today();
        }
        expectedRentalPeriod    =   estimatedoffrentdate-calDate+1;
        if(paymentdays+custParameters.EQNExtraCalculationDays > expectedRentalPeriod)
            rentaldayInExposure = expectedRentalPeriod;
        else
            rentaldayInExposure =   paymentdays+custParameters.EQNExtraCalculationDays;
     
        UnitOfMeasure   unitofmeasure,unitofmeasure1;
        select unitofmeasure
        where unitofmeasure.RecId   ==  _salesline.RORPriceTimeUnit;
        select unitofmeasure1
        where unitofmeasure1.RecId   ==  custParameters.EQNStandardDayRateCodeint;
     
        unitconversion = UnitOfMeasureConverter::convert(rentaldayInExposure,
        UnitOfMeasure::unitOfMeasureIdBySymbol(unitofmeasure.Symbol),
        UnitOfMeasure::unitOfMeasureIdBySymbol(unitofmeasure1.Symbol),
        NoYes::No,
        NoYes::No);
        unitval = UnitOfMeasureConverter::convert(1.0,
        UnitOfMeasure::unitOfMeasureIdBySymbol(unitofmeasure.Symbol),
        UnitOfMeasure::unitOfMeasureIdBySymbol(unitofmeasure1.Symbol),
        NoYes::No,
        NoYes::No);
        workingdays = this.workingdaysIncalendar(_salesline.RORCalendarId,unitconversion);
        unitconversionfinal =   UnitOfMeasureConverter::convert(workingdays,
        UnitOfMeasure::unitOfMeasureIdBySymbol(unitofmeasure1.Symbol),
        UnitOfMeasure::unitOfMeasureIdBySymbol(unitofmeasure.Symbol),
        NoYes::No,
        NoYes::No);
        chargeableDays = unitconversionfinal;
     
        if(SalesTable::find(_salesline.SalesId).InclTax == noyes::No)
        {
            RORRentalLine   rorRentalline;
            select rorRentalline
                where rorRentalline.InventTransId == _salesline.InventTransId;

            lineamount  =   _salesline.RORRentalLine::editLineAmount(false,_salesline.LineAmount);//_salesline.RORRentalGrossAmount;//RORRentalLine::editLineAmount(false,_salesline.LineAmount);
            //lineamount  =   _salesline.RORRentalLine::ROREditNetAmount(false,_salesline.LineAmount);
            TaxAmountCur=Tax::calcTaxAmount(_salesline.TaxGroup, _salesline.TaxItemGroup, Systemdateget(), _salesline.CurrencyCode, lineamount, TaxModuleType::Sales);
            lineamount  =   lineamount+TaxAmountCur;
        }
        Qty  invoiced = _salesline.invoicedInTotal();
        //lineamount  =   lineamount*(_salesline.SalesQty-_salesline.invoicedInTotal());//Value will not differ for rental line as salesline
         
        ratePerRentalDay = lineamount/unitval;
        rentalLineFinancialRisk =   chargeableDays * ratePerRentalDay;
        return rentalLineFinancialRisk;


    }

    //Build Query to calculate

    public Query buildQuery(EQNOrderTypes type,SalesId _salesId, SalesId _rentalId, accountNum _custacc)
    {
        QueryBuildDataSource    qdbsSO;
        QueryBuildRange qbrsalesType,qbrsalesStatus,qbrsalesId,qbrrentalId,qbrcustAcc,qbrdocumentstatus;
        Query  query = new Query(queryStr (EQNRecalculateExposureQry));

        qdbsSO      =       query.dataSourceTable(tablenum(SalesTable));
        //Apply parameter ranges on query
        qbrsalesType        =   query.dataSourceTable( tablenum (SalesTable)).addRange( fieldNum (SalesTable, SalesType));
        qbrsalesStatus      =   query.dataSourceTable( tablenum (SalesTable)).findRange( fieldNum (SalesTable, SalesStatus));
        if(!qbrsalesStatus)
            query.dataSourceTable( tablenum (SalesTable)).addRange( fieldNum (SalesTable, SalesStatus));
        qbrdocumentstatus   =   query.dataSourceTable( tablenum (SalesTable)).addRange( fieldNum (SalesTable, DocumentStatus));
        //qdbsSO.findRange( fieldNum (SalesTable, SalesStatus))
        qbrdocumentstatus.value(strfmt('!%1,%2,%3,%4',enum2str(DocumentStatus::None),enum2str(DocumentStatus::Confirmation),enum2str(DocumentStatus::Invoice),enum2str(DocumentStatus::PackingSlip)));
        if(type ==EQNOrderTypes ::Both)
            qbrsalesType.value(strfmt('%1,%2',enum2str(SalesType::Sales),enum2str(SalesType::RORRental)));
        else if(type  ==  EQNOrderTypes::SalesOrder)
        {
            qbrsalesType.value(strfmt('%1',enum2str(SalesType::Sales)));
        }
        else if(type  ==  EQNOrderTypes::RentalOrder)
        {
            qbrsalesType.value(strfmt('%1',enum2str(SalesType::RORRental)));
        }
        if(_salesId)
        {
            qbrsalesId      =   query.dataSourceTable( tablenum (SalesTable)).addRange( fieldNum (SalesTable, salesId));
            qbrsalesId.value(_salesId);
            //qbrsalesStatus.value(strfmt('!%1,%2,%3',enum2str(SalesStatus::Invoiced),enum2str(SalesStatus::Canceled),enum2str(SalesStatus::None)));
            //qdbsSO.addRange( fieldNum (SalesTable, SalesStatus)).value(enum2str(SalesStatus::Invoiced));
            qdbsSO.addRange( fieldNum (SalesTable, SalesStatus)).value(enum2str(SalesStatus::Canceled));
            qdbsSO.addRange( fieldNum (SalesTable, SalesStatus)).value(SysQuery::valueNot(enum2str(SalesStatus::None)));
        }
     
        if(_rentalId)
        {
            qbrrentalId      =   query.dataSourceTable( tablenum (SalesTable)).addRange( fieldNum (SalesTable, salesId));
            qdbsSO.addRange( fieldNum (SalesTable, SalesStatus)).value(SysQuery::valueNot(enum2str(SalesStatus::Invoiced)));
            qdbsSO.addRange( fieldNum (SalesTable, SalesStatus)).value(SysQuery::valueNot(enum2str(SalesStatus::Canceled)));
            //qbrsalesStatus.value(strfmt('!%1,!%2',enum2str(SalesStatus::Invoiced),enum2str(SalesStatus::Canceled)));
            qbrrentalId.value(_rentalId);
        }
        if(_custacc)
        {
            qbrcustAcc  =   query.dataSourceTable( tablenum (SalesTable)).addRange( fieldNum (SalesTable, custAccount));
            qbrcustAcc.value(_custacc);
        }
     
        return query;
    }

    public static AmountCur openBalanceCur(CustTable _custTable,
                                    TransDate _fromDate = dateNull(),
                                    TransDate _toDate = dateMax(),
                                    TransDate _assessmentDate = dateNull(),
                                    CurrencyCode _currency = CompanyInfoHelper::standardCurrency())
    {
        CustTrans custTrans;
        CustTransOpen custTransOpen;
        CustSettlement custSettlement;
        AmountCur openBalanceCur;
        CustInvoiceJour     custInvoiceJour;
        PaymTerm            paymTerm;
        if (_assessmentDate)
        {
            //custSettlement = this.settlementBuffer();

            select sum(SettleAmountCur)
                from custSettlement
                group by AccountNum
                where custSettlement.AccountNum == _custTable.AccountNum
                   && custSettlement.TransDate > _assessmentDate
            join custTrans
                where custTrans.RecId == custSettlement.TransRecId
                   && custTrans.TransDate >= _fromDate
                   && custTrans.TransDate <= _toDate
                   && custTrans.CurrencyCode == _currency
                join LedgerVoucher,InvoiceId,InvoiceDate,InvoiceAccount,Payment from custInvoiceJour
                    where custInvoiceJour.LedgerVoucher == custTrans.Voucher
                        && custInvoiceJour.InvoiceId  ==  custTrans.Invoice
                        &&  custInvoiceJour.InvoiceDate   ==  custTrans.TransDate
                        &&  custInvoiceJour.InvoiceAccount   ==  custTrans.AccountNum
                    join paymTerm
                        where paymTerm.PaymTermId == custInvoiceJour.Payment
                            &&  paymTerm.EQNExcludefromexposurecalculations !=NoYes::Yes;

            openBalanceCur = custSettlement.SettleAmountCur;
            openBalanceCur += EQNCreditExposureCalculations::openBalanceCur(_custTable,_fromDate, _toDate, dateNull(), _currency);
        }
        else
        {
            select custTrans
                where custTrans.AccountNum == _custTable.AccountNum
                   && custTrans.CurrencyCode == _currency
            join sum(AmountCur) from custTransOpen
                group by AccountNum
                where custTransOpen.RefRecId == custTrans.RecId
                   && custTransOpen.TransDate >= _fromDate
                   && custTransOpen.TransDate <= _toDate
                join LedgerVoucher,InvoiceId,InvoiceDate,InvoiceAccount,Payment from custInvoiceJour
                    where custInvoiceJour.LedgerVoucher == custTrans.Voucher
                        && custInvoiceJour.InvoiceId  ==  custTrans.Invoice
                        &&  custInvoiceJour.InvoiceDate   ==  custTrans.TransDate
                        &&  custInvoiceJour.InvoiceAccount   ==  custTrans.AccountNum
                    join paymTerm
                        where paymTerm.PaymTermId == custInvoiceJour.Payment
                            &&  paymTerm.EQNExcludefromexposurecalculations !=NoYes::Yes;

            openBalanceCur = custTransOpen.AmountCur;
        }

        return openBalanceCur;
    }

    public static AmountMST openBalanceMST(CustTable _custTable,
                             FromDate _fromDate = dateNull(),
                             ToDate _toDate = dateMax(),
                             TransDate _assessmentDate = dateNull())
    {
        CustTrans custVendTrans;
        CustTransOpen custVendTransOpen;
        CustSettlement custVendSettlement;
        AmountMST openBalanceMST;
        boolean hasAccess;
        CustInvoiceJour     custInvoiceJour;
        PaymTerm            paymTerm;

        if (_assessmentDate)
        {

            switch (custVendTrans.TableId)
            {
                case tableNum(CustTrans) :
                    hasAccess = hasFieldAccess(tableNum(CustSettlement), fieldNum(CustSettlement, SettleAmountMST));
                    hasAccess = hasAccess && hasFieldAccess(tableNum(CustSettlement), fieldNum(CustSettlement, ExchAdjustment));
                    break;

                case tableNum(VendTrans) :
                    hasAccess = true;
                    break;

                default :
                    hasAccess = false;
            }

            if (!hasAccess)
                    throw error("@SYS57330");

            select sum(SettleAmountMST),sum(ExchAdjustment) from custVendSettlement
                    group by AccountNum
                    where custVendSettlement.AccountNum == _custTable.AccountNum &&
                          custVendSettlement.TransDate > _assessmentDate
                join custVendTrans
                    where custVendTrans.RecId == custVendSettlement.TransRecId &&
                          custVendTrans.TransDate >= _fromDate &&
                          custVendTrans.TransDate <= _toDate
                join LedgerVoucher,InvoiceId,InvoiceDate,InvoiceAccount,Payment from custInvoiceJour
                        where custInvoiceJour.LedgerVoucher == custVendTrans.Voucher
                            && custInvoiceJour.InvoiceId  ==  custVendTrans.Invoice
                            &&  custInvoiceJour.InvoiceDate   ==  custVendTrans.TransDate
                            &&  custInvoiceJour.InvoiceAccount   ==  custVendTrans.AccountNum
                        join paymTerm
                            where paymTerm.PaymTermId == custInvoiceJour.Payment
                                &&  paymTerm.EQNExcludefromexposurecalculations !=NoYes::Yes;

            openBalanceMST = custVendSettlement.SettleAmountMST + custVendSettlement.ExchAdjustment;

            openBalanceMST += EQNCreditExposureCalculations::openBalanceMST(_custTable,_fromDate, _toDate);
        }
        else
        {

            select sum(AmountMST) from custVendTransOpen
                    where custVendTransOpen.AccountNum == _custTable.AccountNum &&
                          custVendTransOpen.TransDate >= _fromDate &&
                          custVendTransOpen.TransDate <= _toDate
                join LedgerVoucher,InvoiceId,InvoiceDate,InvoiceAccount,Payment from custInvoiceJour
                        where custInvoiceJour.LedgerVoucher == custVendTrans.Voucher
                            && custInvoiceJour.InvoiceId  ==  custVendTrans.Invoice
                            &&  custInvoiceJour.InvoiceDate   ==  custVendTrans.TransDate
                            &&  custInvoiceJour.InvoiceAccount   ==  custVendTrans.AccountNum
                        join paymTerm
                            where paymTerm.PaymTermId == custInvoiceJour.Payment
                                &&  paymTerm.EQNExcludefromexposurecalculations !=NoYes::Yes;

            openBalanceMST = custVendTransOpen.AmountMST;
        }
 
        return openBalanceMST;
    }

}
===================================================================


class EQNCustBalanceListUIBuilder extends SrsReportDataContractUIBuilder
{
    DialogField     dialogexceededLimit;
    DialogField     dialogzeroBalance;
    DialogField     dialogasOfDate;
    DialogField     dialogpercent;
    boolean enable;
    EQNCustBalanceListContract contract;

 

    public void build()
    {
        Dialog                  dialogLocal;

        dialogLocal = this.dialog();
        contract =   this.dataContractObject();   
        utcDateTime         myDateTime;
        dialogasOfDate = this.addDialogField(methodStr(EQNCustBalanceListContract, parmAsOfDate),contract);
        myDateTime = DateTimeUtil::applyTimeZoneOffset(myDateTime,DateTimeUtil::getUserPreferredTimeZone());
        //contract.parmAsOfDate(today());
        contract.parmAsOfDate(systemDateGet());
        dialogasOfDate.value(today());
        dialogasOfDate.enabled(False);
        dialogpercent = this.addDialogField(methodStr(EQNCustBalanceListContract, parmPercent),contract);
        dialogpercent.value(100);
        dialogexceededLimit = this.addDialogField(methodStr(EQNCustBalanceListContract, parmExceededLimit),contract);
        dialogzeroBalance = this.addDialogField(methodStr(EQNCustBalanceListContract, parmZeroBalance),contract);
        controller.parmDialogCaption('@EQN:CustbalancelistbasedonCreditExposure');
    }

    public void getFromDialog()
    {
        contract = this.dataContractObject();
        super();
    }

    /*public void initializeFields()
    {
        utcDateTime         myDateTime;
        contract = this.dataContractObject();
        myDateTime = DateTimeUtil::applyTimeZoneOffset(myDateTime,DateTimeUtil::getUserPreferredTimeZone());
        //contract.parmAsOfDate(today());
        contract.parmAsOfDate(myDateTime);
    }*/

}
==================================================================
[ExtensionOf(classStr(CustCreditLimit))]
Final class EQNCustCreditLimit_Extension
{
    AmountMST EQNbalanceEstimate()
    {
        AmountMST   balanceEstimate=0;
     
        SalesTable localSalesTable;
        QueryRun queryRun;
        queryRun = new QueryRun(this.initQuery());
        queryRun.query().dataSourceTable(tablenum(SalesTable)).fields().addField(fieldnum(SalesTable,Estimate),SelectionField::Sum);
        // queryRun.query().dataSourceTable(tablenum(SalesTable)).addRange(fieldNum(SalesTable,SalesPoolId)).value(SYSQuery::valueNot(queryvalue(CustParameters::find().EQNExcludeFromExposure)));
        while (queryRun.next())
        {
            if (queryRun.changed(tablenum(SalesTable)))
            {
                localSalesTable = queryRun.get(tablenum(SalesTable));
                if(!PaymTerm::find(localSalesTable.Payment,false).EQNExcludefromexposurecalculations)
                    balanceEstimate += localSalesTable.Estimate;
             
            }
        }
        return balanceEstimate;
    }

    public boolean check()
    {
        boolean ret = true;
        //  ret = next check();
        CustCreditLimit thisclass = new CustCreditLimit(custtable);
        TypeOfCreditmaxCheck typeOfCreditmaxCheck1;
        if( CustParameters::find().FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure)
        {
            typeOfCreditmaxCheck1   =   typeOfCreditmaxCheck;
            typeOfCreditmaxCheck    =   typeOfCreditmaxCheck::None;
        }
        ret = next check();
        if(CustParameters::find().FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure)
            ret = true;
     
        //FINCheckCreditLimit::checkCreditLimit_Sales(SalesTable, true, CustParameters::find().FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure);*/
        return ret;
    }

    public boolean EQNuseEstimated()
    {
        return (FINCheckCreditLimit::maxCreditLimit(custTable.AccountNum));
    }

}
===================================================================
class EQNCustomerCreditExposurePerOrderUIBuilder extends SrsReportDataContractUIBuilder
{
    DialogField     dialogexceededLimit;
    DialogField     dialogOrderType;
    DialogField     dialogpercent;
    boolean enable;
    EQNCustomerCreditExposurePerOrderContract contract;

 

 
    public void build()
    {
        Dialog                  dialogLocal;

        dialogLocal = this.dialog();
        contract =   this.dataContractObject();
        dialogOrderType = this.addDialogField(methodStr(EQNCustomerCreditExposurePerOrderContract, parmOrderTypes),contract);
        dialogpercent = this.addDialogField(methodStr(EQNCustomerCreditExposurePerOrderContract, parmPercent),contract);
        dialogpercent.value(100);
        dialogexceededLimit = this.addDialogField(methodStr(EQNCustomerCreditExposurePerOrderContract, parmExceededLimit),contract);
        controller.parmDialogCaption('@EQN:CustomerCreditExposurePerOrder');
    }

    public void getFromDialog()
    {
        contract = this.dataContractObject();
        super();
    }

}
====================================================================
class EQNFINCustExposureTransDel
{
    [FormControlEventHandler(formControlStr(SalesTable, buttonUpdateInvoice), FormControlEventType::Clicked)]
    public static void buttonUpdateInvoice_OnClicked(FormControl sender, FormControlEventArgs e)
    {
        EQNFINCustExposureTrans     finCustExposureTrans = null;
        SalesTable  ST;
        FormRun formRun = sender.formRun() as FormRun;
        FormDataSource      ST_ds;
        SALESLINE   SL;

        ST_ds = sender.formRun().dataSource(1);
        ST = ST_ds.cursor();

        select  sum(REMAINSALESPHYSICAL) from SL where SL.SALESID == ST.SalesId;
        if(SL.RemainSalesPhysical == 0)
        {
            delete_from finCustExposureTrans where finCustExposureTrans.EQNSalesId ==  ST.SalesId;
        }
    }

    [FormControlEventHandler(formControlStr(SalesTableListPage, buttonUpdateInvoice), FormControlEventType::Clicked)]
    public static void buttonUpdateInvoiceLiatPage_OnClicked(FormControl sender, FormControlEventArgs e)
    {
        EQNFINCustExposureTrans     finCustExposureTrans = null;
        SalesTable  ST;
        FormRun formRun = sender.formRun() as FormRun;
        FormDataSource      ST_ds;
        SALESLINE   SL;

        ST_ds = sender.formRun().dataSource(1);
        ST = ST_ds.cursor();

        select  sum(REMAINSALESPHYSICAL) from SL where SL.SALESID == ST.SalesId;
        if(SL.RemainSalesPhysical == 0)
        {
            delete_from finCustExposureTrans where finCustExposureTrans.EQNSalesId ==  ST.SalesId;
        }
    }

}
=======================================================================
[
DataContractAttribute
    //,SysOperationContractProcessingAttribute(classStr(EQNRecalculateExposureUIBuilder))
]
class EQNRecalculateExposureContract implements SysOperationValidatable
{
    CustAccount     custAccount;
    Salesid         salesId,rentalId;
    EQNOrderTypes      orderTypes;
    [
        //DataMemberAttribute(identifierStr(CustAccount))
        DataMemberAttribute('EQNOrderTypes'),
        SysOperationLabelAttribute('@EQN:OrderTypes'),
        SysOperationDisplayOrderAttribute('1'),
        SysOperationHelpTextAttribute(literalStr("Select an Order Type"))
    ] 
    Public EQNOrderTypes parmOrderTypes(EQNOrderTypes _orderTypes = orderTypes)
    {
        orderTypes = _orderTypes;
        Return orderTypes;
    }

    [
        //DataMemberAttribute(identifierStr(CustAccount))
        DataMemberAttribute('CustAccount'),
        SysOperationLabelAttribute('@EQN:CustomerAccount'),
        SysOperationDisplayOrderAttribute('2'),
        SysOperationHelpTextAttribute(literalStr("Customer Account no."))
    ]
    public CustAccount parmCustAccount(CustAccount _custAccount = custAccount)
    {
        custAccount = _custAccount;
        return custAccount;
    }

    [
        //DataMemberAttribute(identifierStr(CustAccount))
        DataMemberAttribute('SalesId'),
        SysOperationLabelAttribute('@EQN:Salesorder'),
        SysOperationDisplayOrderAttribute('3'),
        SysOperationHelpTextAttribute(literalStr("@EQN:Salesorder"))
    ]
    public SalesId parmSalesId(SalesId _salesId = salesId)
    {
        salesId = _salesId;
        return salesId;
    }

    [
        //DataMemberAttribute(identifierStr(CustAccount))
        DataMemberAttribute('@DNR6238'),
        SysOperationLabelAttribute('@DNR6238'),
        SysOperationDisplayOrderAttribute('4'),
        SysOperationHelpTextAttribute(literalStr("@DNR6238"))
    ]
    public SalesId parmRentalOrder(SalesId _rentalId = rentalId)
    {
        rentalId = _rentalId;
        return rentalId;
    }

    public boolean validate()
    {
        boolean isValid = true;
       /* if (!custAccount)
        {
            isValid = checkFailed(strFmt("@SYS84753", custAccount));
        }*/
     
        return isValid;
    }

}
==============================================================

class EQNRecalculateExposureController extends SysOperationServiceController
{
    Common  callerRecord;
 

    void new()
    {
        super();

        this.parmClassName(classStr(EQNRecalculateExposureService));
        this.parmMethodName(methodStr(EQNRecalculateExposureService, process));
        this.parmDialogCaption('@EQN:RecalculateExposure');
    }

   protected object initializeserviceParameter(DictMethod dictMethod, int parameterIndex)
    {
        object                          ret;
        EQNRecalculateExposureContract  dc;
        ret = super(dictMethod,parameterIndex);
        if(ret is EQNRecalculateExposureContract)
        {
            dc = ret;
            dc.parmOrderTypes(EQNOrderTypes::Both);
        }
        return ret;
    }

    public static void main(Args _args)
    {
        EQNRecalculateExposureController controller;
        controller = new EQNRecalculateExposureController();
   
        controller.parmShowDialog(true);
        EQNRecalculateExposureContract contract;
        controller.startOperation();
    }

    public LabelType parmDialogCaption(LabelType _dialogCaption = "")
    {
        LabelType caption;
        caption = "@EQN:RecalculateExposure";
        return caption;
    }

    public boolean canGoBatch()
    {
        return true;
    }

    public Common parmCallerRecord(Common _callerRecord = callerRecord)
    {
        callerRecord = _callerRecord;
        return callerRecord;
    }

    ///    Refreshes the calling form data source.
    protected void refreshCallerRecord()
    {
        FormDataSource callerDataSource;
        if (this.parmCallerRecord() && this.parmCallerRecord().dataSource())
        {
            callerDataSource = this.parmCallerRecord().dataSource();
            callerDataSource.research(true);
        }
    }

}
========================================================================
class EQNRecalculateExposureService  extends SysOperationServiceBase
{
    CustAccount     custAccount;
    Salesid         salesId,rentalId;
    EQNOrderTypes      orderTypes;
        public void process(EQNRecalculateExposureContract _contract)
    {     
        orderTypes      =   _contract.parmOrderTypes();
        custAccount     =   _contract.parmCustAccount();
        salesId         =   _contract.parmSalesId();
        rentalId        =   _contract.parmRentalOrder(); 
        if( CustParameters::find().FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure)
        {
            EQNRecalculateExposureService::recalculation(orderTypes,salesId,rentalId,custAccount);
            //EQNRecalculateExposureService::createInvoiceJournal();
        }
     
    }

   /* public static void createInvoiceJournal()
    {
        LedgerJournalName ledgerJournalName;
        LedgerJournalTable ledgerJournalTable;
        LedgerJournalTrans ledgerJournalTrans;
        LedgerJournalTrans_Project ledgerJournalTrans_Project;
        NumberSequenceTable numberSequenceTable;
        ledgerJournalCheckPost ledgerJournalCheckPost;
        ProjLinePropertySetup projLinePropertySetup;
        DirPersonUser personUser;
        HcmWorker worker;
        boolean priceFound = false;

        CostPrice costPriceMST;
        ProjPostCostJournal projPostCostJournal;
        ResourceView resourceView;

        NumberSeq numberseq;

        Amount amount = 100;

        boolean result = false;

        TransDate invoiceDate = _date;

        ttsbegin;

        ledgerJournalName = LedgerJournalName::find("APInvoice");
        if(ledgerJournalName)
        {
            ledgerJournalTable.JournalName = ledgerJournalName.JournalName;
            ledgerJournalTable.initFromLedgerJournalName();
            ledgerJournalTable.JournalNum = JournalTableData::newTable(ledgerJournalTable).nextJournalId();
            ledgerJournalTable.Name = ledgerJournalName.Name;
            ledgerJournalTable.JournalType = LedgerJournalType::VendInvoiceRegister;
            ledgerJournalTable.insert();

            if(ledgerJournalTable)
            {
                select NumberSequence from numberSequenceTable
                    where NumberSequenceTable.RecId == ledgerJournalName.NumberSequenceTable;

                numberseq = NumberSeq::NewGetVoucherFromCode(numberSequenceTable.NumberSequence);
                ledgerJournalTrans.initValue();
                ledgerJournalTrans.JournalNum = ledgerJournalTable.JournalNum;
                ledgerJournalTrans.Voucher = numberseq.voucher();
                ledgerJournalTrans.TransDate = today();
                ledgerJournalTrans.Qty = 1;
                ledgerJournalTrans.AccountType = LedgerJournalACType::Vend;
                ledgerJournalTrans.OffsetAccountType = LedgerJournalACType::Ledger;
                container account = ["401200-DEMF-000000079------"];
                //ledgerJournalTrans.parmLedgerDimension(AxdDimensionUtil::getla(account));
                LedgerDimensionAccount              ledgerDim   = DimensionStorage::get getDynamicAccount("401200-DEMF-000000079------", LedgerJournalACType::Cust);
                //LedgerJournalTrans.LedgerDimension       = DimensionAttributeValueCombination::find(ledgerDim).Recid;
                //  LedgerJournalTrans.DefaultDimension      = Default Dimension;
       
                // ledgerJournalTrans.parmOffsetAccount(con2Str(account, '-'),ledgerJournalTrans.OffsetAccountType);//(_facility);
                ledgerJournalTrans.parmOffsetAccount("1010",ledgerJournalTrans.OffsetAccountType);//(_facility);
                //ledgerJournalTrans.parmOffsetDefaultDimension(
                //ledgerJournalTrans.LedgerDimension  = 5637145350;
                ledgerJournalTrans.TransactionType = 14;// LedgerTransType::Payment;
                ledgerJournalTrans.CurrencyCode = "USD";
                ledgerJournalTrans.Invoice = ledgerJournalTrans.JournalNum;
                ledgerJournalTrans.Txt = strFmt("AP Invoice");
                ledgerJournalTrans.Approved = NoYes::Yes;
                if(amount> 0)
                {
                    ledgerJournalTrans.AmountCurDebit = amount;
                }
                else
                {
                    ledgerJournalTrans.AmountCurCredit = abs(amount);
                }
                ledgerJournalTrans.Company = strUpr(curExt());
                ledgerJournalTrans.OffsetCompany = strUpr(curExt());

                select firstonly personUser where personUser.User == curUserId()
                    join worker
                    where worker.Person == personUser.PersonParty;

                ledgerJournalTrans.Approver =  worker.RecId ?  worker.RecId : 5637145326;// worker.RecId;

                //ledgerJournalTrans.PostingProfile = 'GEN';
                ledgerJournalTrans.parmAccount(_Account,ledgerJournalTrans.AccountType);
                ledgerJournalTrans.insert();
                result = true;
            }
        }
        ttscommit;

    }*/

    public static void recalculation(EQNOrderTypes _orderTypes,SalesId _salesId, SalesId _rentalId,accountNum _custacc)
    {
        Query           query;
        QueryRun        qr;
        SalesTable      salesTable;
        SalesLine       salesline;
        SalesId         tmpSalesId;
        Amount          financialriskperorder,financialriskperline = 0,misccharges =0;
        boolean         recalculationstarted = false;
   
        EQNCreditExposureCalculations   eqncreditExposureCalculations = new EQNCreditExposureCalculations();
        query = eqncreditExposureCalculations.buildQuery(_orderTypes,_salesId,_rentalId,_custacc);
        qr = new QueryRun(query);
        while (qr.next())
        {
            recalculationstarted    =   true;
            salesTable = qr.get(tableNum(SalesTable));
            boolean execute = true;
            if(PaymTerm::find(salesTable.Payment,false).EQNExcludefromexposurecalculations)
            {
                execute = false;
            }
            if( salesTable.SalesPoolId == CustParameters::find().EQNExcludeFromExposure) // If sales table pool id is also equal we need to skip it.
            {
                execute = false;
            }
            if(execute)
            {
                financialriskperorder = EQNCreditExposureCalculations::financalExposurePerOrder(_orderTypes,salesTable);
                misccharges =   EQNCreditExposureCalculations::calculateMarkupTrans(salesTable.SalesId);
                financialriskperorder   =   financialriskperorder+misccharges;
                if(financialriskperorder>0)
                    EQNCreditExposureCalculations::insertEQNFINCustExposureTrans(salesTable,financialriskperorder);
            }
            else
            {
                EQNCreditExposureCalculations::delEqnCustExposureTrans(salesTable);
            }
         
        }
        if(!recalculationstarted)
            info("Batch has no records to execute with given criteria");
        else
            info("Financial risk for queried orders is Calculated in batch");
    }

}
==============================================================

class EQNRecalculateExposureUIBuilder extends SysOperationAutomaticUIBuilder
{
    Dialog      dlg;
    DialogField     dialogCustAcc;
    DialogField     dialogSalesId;
    DialogField     dialogRentalId;
    DialogField     dialogOrderTypes;


    EQNRecalculateExposureContract   contract;
 
 
    public void build()
    {
        DialogGroup dlgGrp;
        contract = this.dataContractObject();
     

        //get the current dialog
        dlg = this.dialog();

        dialogCustAcc = this.addDialogField(methodStr(EQNRecalculateExposureContract, parmCustAccount),contract);
        dialogCustAcc.value('');
        dialogSalesId = this.addDialogField(methodStr(EQNRecalculateExposureContract,parmSalesId),contract);
        dialogSalesId.value('');
        dialogRentalId = this.addDialogField(methodStr(EQNRecalculateExposureContract, parmRentalOrder),contract);
        dialogRentalId.value('');
        dialogOrderTypes = this.addDialogField(methodStr(EQNRecalculateExposureContract, parmOrderTypes),contract);
     
    }

    public void run()
    {
     
        try
        {
         
        }
        catch (Exception::Deadlock)
        {
            retry;
        }
    }

    public void enableBasedOnOrderTypes(FormComboBoxControl _orderTypes)
    {
        EQNOrderTypes   orderTypes;
        switch(dialogOrderTypes.value())
        {
            case (EQNOrderTypes::Both) :
                {
                    dialogSalesId.enabled(true);
                    dialogRentalId.enabled(true);
                    break;
                }

            case (EQNOrderTypes::SalesOrder):
                {

                    dialogSalesId.enabled(true);
                    dialogRentalId.enabled(false);
                    break;
                }
            case (EQNOrderTypes::RentalOrder):
                {

                    dialogSalesId.enabled(false);
                    dialogRentalId.enabled(true);
                    break;
                }
        }     
     
    }

    public void postBuild()
    {
        contract            =   this.dataContractObject();
        dialogCustAcc = this.bindInfo().getDialogField(
        this.dataContractObject(), methodStr(EQNRecalculateExposureContract, parmCustAccount));
        dialogSalesId = this.bindInfo().getDialogField(
        this.dataContractObject(), methodStr(EQNRecalculateExposureContract, parmSalesId));
        dialogRentalId = this.bindInfo().getDialogField(
        this.dataContractObject(), methodStr(EQNRecalculateExposureContract, parmRentalOrder));
        dialogOrderTypes = this.bindInfo().getDialogField(
        this.dataContractObject(), methodStr(EQNRecalculateExposureContract, parmOrderTypes));
        //dialogOrderTypes.registerOverrideMethod(methodstr(FormComboBoxControl,modified), methodStr(EQNRecalculateExposureUIBuilder,enableBasedOnOrderTypes),this);
        dialogOrderTypes.registerOverrideMethod(methodstr(FormComboBoxControl,selectionChange), methodStr(EQNRecalculateExposureUIBuilder,enableBasedOnOrderTypes),this);
    }

    public void postRun()
    {
        super();

        //Register overrides for form control events
        dialogCustAcc.registerOverrideMethod(
        methodstr(FormStringControl, lookup),
        methodstr(EQNRecalculateExposureUIBuilder, custAccLookup),
        this);
        dialogSalesId.registerOverrideMethod(
        methodstr(FormStringControl, lookup),
        methodstr(EQNRecalculateExposureUIBuilder, salesIdLookup),
        this);
        dialogRentalId.registerOverrideMethod(
        methodstr(FormStringControl, lookup),
        methodstr(EQNRecalculateExposureUIBuilder, rentalIdLookup),
        this);
       /* dialogOrderTypes.registerOverrideMethod(
        methodstr(FormComboBoxControl,modified),
        methodStr(EQNRecalculateExposureUIBuilder,enableBasedOnOrderTypes),this);*/
    }

    public void SalesIdLookup(FormStringControl salesIdLookup)
    {
        Query query = new Query();
        QueryBuildDataSource qbds_SalesTable;
        SysTableLookup sysTableLookup;
        // Create an instance of SysTableLookup with the current calling form control.
        sysTableLookup = SysTableLookup::newParameters(tableNum(SalesTable), salesIdLookup);
        // Add fields to be shown in the lookup form.
        sysTableLookup.addLookupfield(fieldNum(SalesTable,SalesId));
        qbds_SalesTable = query.addDataSource(tableNum(SalesTable));
        //qbds_SalesTable.addRange(fieldnum(SalesTable, SalesStatus)).value(strfmt('!%1,!%2',enum2str(SalesStatus::Canceled),enum2str(SalesStatus::None)));
        qbds_SalesTable.addRange(fieldNum(SalesTable,SalesType)).value(enum2str(SalesType::Sales));
        sysTableLookup.parmQuery(query);
        // Perform the lookup
        sysTableLookup.performFormLookup();
    }

    public void RentalIdLookup(FormStringControl rentalIdLookup)
    {
        Query query = new Query();
        QueryBuildDataSource qbds_SalesTable;
        QueryBuildRange         qbrSalesType;
        SysTableLookup sysTableLookup;
        // Create an instance of SysTableLookup with the current calling form control.
        sysTableLookup = SysTableLookup::newParameters(tableNum(SalesTable), rentalIdLookup);
        // Add fields to be shown in the lookup form.
        sysTableLookup.addLookupfield(fieldNum(SalesTable,SalesId));
        qbds_SalesTable = query.addDataSource(tableNum(SalesTable));
        //qbds_SalesTable.addRange(fieldnum(SalesTable, SalesStatus)).value(strfmt('!%1,!%2',enum2str(SalesStatus::Canceled),enum2str(SalesStatus::None)));
        qbds_SalesTable.addRange(fieldNum(SalesTable,SalesType)).value(enum2str(SalesType::RORRental));
        sysTableLookup.parmQuery(query);
        // Perform the lookup
        sysTableLookup.performFormLookup();
    }

    public void custAccLookup(FormStringControl custAcclookup)
    {
        Query query = new Query();
        QueryBuildDataSource qbds_CustTable;
        SysTableLookup sysTableLookup;
        sysTableLookup = SysTableLookup::newParameters(tableNum(CustTable), custAcclookup);
        sysTableLookup.addLookupfield(fieldNum(CustTable,AccountNum));
        sysTableLookup.addLookupMethod(tableMethodStr(CustTable,Name));
        qbds_CustTable = query.addDataSource(tableNum(CustTable));
     
        sysTableLookup.parmQuery(query);
        // Perform the lookup
        sysTableLookup.performFormLookup();
        //CustTable::lookupCustomer(custAcclookup, curExt());
    }

}
=======================================================================

[ExtensionOf(classStr(SalesFormLetterProvider))]
Final class EQNSalesFormLetterProvider_Extension
{
    protected boolean creditMaxOk(SalesTotals  _salesTotals)
    {
        CustCreditLimit     custCreditLimit;
        boolean ret = next creditMaxOk(_salesTotals);
        if(_salesTotals is SalesTotals_ParmTransInvoice)
        {
            EQNCreditExposureCalculations::delEqnCustExposureTrans(SalesTable);
        }
        return ret;
    }

    public boolean checkJournal()
    {

        boolean ret = next checkJournal();
        if( CustParameters::find().FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure)
            ret = FINCheckCreditLimit::checkCreditLimit_Sales(SalesTable, true, true);
        return ret;
    }

}
===================================================================

[ExtensionOf(tableStr(TmpCustVendTrans))]
Final class EQNTmpCustVendTrans_Extension
{

    static container custCalcSalesTotals(CustAccount          _custAccount,
                                         CurrencyCode         _currencyCode,
                                         AgreementHeaderExtRecId_RU _agreementHeaderExtRecId
                                         )
    {
        container   con;
        CustCreditLimit custCreditLimit;
        SalesTotals     salesTotals;
        SalesTable      salesTable;
        // <GEERU>
        SalesTable_RU   salesTableRU;
        // </GEERU>
        AmountMST       mcrCreditCardBalance = 0;
        con = next custCalcSalesTotals(_custAccount,_currencyCode ,_agreementHeaderExtRecId);
        if( CustParameters::find().FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure)
        {
            Amount  custexposureamt;
            salesTable.CustAccount  = _custAccount;
            salesTable.initFromCustTable();

            // <GEERU>
            salesTableRU.AgreementHeaderExt_RU = _agreementHeaderExtRecId;
            salesTable.packSalesTable_RU(salesTableRU);
            // </GEERU>

            salesTotals = SalesTotals::construct(salesTable);

            // <GEERU>
            salesTotals.parmCheckAgreementLimit_RU(_agreementHeaderExtRecId != 0);
            // </GEERU>

            salesTotals.calc();

            custCreditLimit = CustCreditLimit::construct(salesTable);

            // <GEERU>
            custCreditLimit.parmCheckAgreementLimit_RU(_agreementHeaderExtRecId != 0);
            // </GEERU>

            //Return credit card balance as well.
            if (isConfigurationkeyEnabled(configurationKeyNum(MCRCallCenter)))
            {
                mcrCreditCardBalance = custCreditLimit.MCRBalanceCreditCard();
            }
            custexposureamt =   EQNFINCustExposureTrans::CustomerExposure(_custAccount);
            return [salesTotals.displayFieldsCurrency(_currencyCode)]   +
               [custexposureamt]                  +
               [custCreditLimit.EQNuseEstimated()]   +
               [mcrCreditCardBalance];
        }
        else
            return con;
     
    }

    static TmpCustVendTrans custTransBalanceCurrency(
        CustAccount         _accountNum,
        boolean             _addTotalAndCredit,
        CurrencyCode        _currencyCode,
        BankLCBankDocument  _bankLCBankDocument)
    {
        TmpCustVendTrans    tmpCustVendTrans = null;
        CustTrans           custTrans;
        CustTransOpen       custTransOpen;
        BankLCCustTrans     bankLCCustTrans;

        AmountMST           sumAmountMST;
        AmountMST           creditRemain;
        AmountMST           creditLimit;

        container           displayFields;
        AmountMST           balanceEstimate;
        AmountMST           balanceCreditCard;
        boolean             useEstimated;

     
        tmpCustVendTrans = next custTransBalanceCurrency(_accountNum,_addTotalAndCredit ,_currencyCode,_bankLCBankDocument);
     
        if(CustParameters::find(false).FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure)
        {
            tmpCustVendTrans    =   null;
            sumAmountMST        = 0;
            creditRemain        = 0;
            CustInvoiceJour     custInvoiceJour;
            PaymTerm            paymTerm;
            container           conRecIds;
         
            if (_bankLCBankDocument == BankLCBankDocumentType::All)
            {             
                while   select  CurrencyCode
                    from    custTrans
                    group by CurrencyCode
                    where   custTrans.AccountNum == _accountNum
                    join    sum(AmountCur), sum(AmountMST)
                    from    custTransOpen
                    where   custTransOpen.RefRecId == custTrans.RecId
                    /*join LedgerVoucher,InvoiceId,InvoiceDate,InvoiceAccount,Payment from custInvoiceJour
                    where custInvoiceJour.LedgerVoucher == custTrans.Voucher
                        && custInvoiceJour.InvoiceId  ==  custTrans.Invoice
                        &&  custInvoiceJour.InvoiceDate   ==  custTrans.TransDate
                        &&  custInvoiceJour.InvoiceAccount   ==  custTrans.AccountNum
                    join paymTerm
                        where paymTerm.PaymTermId == custInvoiceJour.Payment
                            &&  paymTerm.EQNExcludefromexposurecalculations !=NoYes::Yes*/
                {
                        tmpCustVendTrans = TmpCustVendTrans::insertTmpCustVendTransForCustBalance(
                        tmpCustVendTrans,
                        _accountNum,
                        custTrans,
                        custTransOpen);

                        sumAmountMST                   += tmpCustVendTrans.AmountMst;
                }
            }
            else
            {
                while
                    select CurrencyCode
                        from custTrans
                            group by CurrencyCode
                            where custTrans.AccountNum == _accountNum
                        join BankLCExportLine from bankLCCustTrans
                            where custTrans.BankLCExportLine ==  bankLCCustTrans.BankLCExportLine
                                && bankLCCustTrans.BankDocumentType == BankLCCustVendTransHelper::convertDocumentType(_bankLCBankDocument)
                        join sum(AmountCur), sum(AmountMST)
                            from custTransOpen
                            where custTransOpen.RefRecId == custTrans.RecId
                {
                 
                        tmpCustVendTrans = TmpCustVendTrans::insertTmpCustVendTransForCustBalance(
                            tmpCustVendTrans,
                            _accountNum,
                            custTrans,
                            custTransOpen);

                        sumAmountMST                   += tmpCustVendTrans.AmountMst;
                 
                }
            }

            if (_addTotalAndCredit)
            {
                tmpCustVendTrans.data(TmpCustVendTrans::populateLineTotal(sumAmountMST));
                tmpCustVendTrans.insert();

                // Add line with packing slip or orderd amount
                if  (CustParameters::find().CreditMaxCheck != TypeOfCreditmaxCheck::None)
                {
                    //Return back the credit card balance.
                    [displayFields, balanceEstimate, useEstimated, balanceCreditCard] = TmpCustVendTrans::custCalcSalesTotals(_accountNum, _currencyCode);

                    TmpCustVendTrans::insertTmpCustVendTransBasedOnTypeOfCreditmaxCheck(tmpCustVendTrans, balanceEstimate, useEstimated);

                    creditRemain -= TmpCustVendTrans::getAmountToDecreaseCreditRemaining(balanceEstimate, useEstimated);

                    //Display any unposted credit card amount
                    if (useEstimated && balanceCreditCard
                        && isConfigurationkeyEnabled(configurationKeyNum(MCRCallCenter)))
                    {                 
                        tmpCustVendTrans.Txt = "@MCR20754";                 
                        tmpCustVendTrans.AmountMst      = balanceCreditCard;
                        tmpCustVendTrans.insert();
                        //Add the credit card unposted back to the balance.
                        creditRemain += balanceCreditCard;
                    }
                    creditLimit    = FINCheckCreditLimit::maxCreditLimit(_accountNum);
                    if (creditLimit)
                    {
                        creditRemain += conpeek(displayFields, TradeTotals::posFreeValue());
                    }
                    else
                    {
                        creditRemain = 0;
                    }
                    Amount balanceMST,custexposureamt;
                    CustTable   custTbl;
                    creditRemain = 0;
                    custTbl = (CustTable::find(_accountNum,false));

                    EQNCreditExposureCalculations   creditExposureCalculations =new EQNCreditExposureCalculations();
                    balanceMST = custTbl.openBalanceMST()+creditExposureCalculations.custorderedbal(custTbl);
                    //balanceMST = EQNCreditExposureCalculations::openBalanceMST(custTbl)+creditExposureCalculations.custorderedbal(custTbl);
                        creditRemain    =   creditLimit - custexposureamt -balanceMST;
                 
                   
                    tmpCustVendTrans.data(TmpCustVendTrans::populateLineCreditLimit(creditLimit, false));
                    tmpCustVendTrans.insert();

                    tmpCustVendTrans.data(TmpCustVendTrans::populateLineCreditRemain(creditRemain, false));
                    tmpCustVendTrans.insert();
                }
            }
        }
            return tmpCustVendTrans;
        }

}
======================================================================
[ExtensionOf(classStr(FINCheckCreditLimit))]
Final class FINCheckCreditLimitEQN_Extension
{
    public static client server void checkCreditLimit_Cust(CustAccount _custacc)
    {
        boolean ret = true;
        CustTable   custtable;
        AmountMST   openBalanceMST;
        Amount      creditLimit,custexposureamt=0,excessamt;
        custTable   =   CustTable::find(_custacc,false);
        EQNCreditExposureCalculations   creditExposureCalculations =new EQNCreditExposureCalculations();
        //openBalanceMST = custTable.openBalanceCur()+creditExposureCalculations.custorderedbal(custTable);
     
        openBalanceMST = custTable.openBalanceMST()+creditExposureCalculations.custorderedbal(custTable);
     
        creditLimit    = FINCheckCreditLimit::maxCreditLimit(custTable.AccountNum);
        //custexposureamt =   EQNFINCustExposureTrans::CustomerExposure(_custacc);
        excessamt   =   openBalanceMST+custexposureamt+-creditLimit;
        if (openBalanceMST+custexposureamt >= creditLimit)
        {
                info(strfmt("@EQN:CustCreditlimitError",openBalanceMST,creditLimit,excessamt));        } 
        else
        {         
            Percent percent;
            if(creditLimit >0)
                percent=((openBalanceMST)/creditLimit)* 100;
            else
                percent = 100;
            if(percent> CustParameters::find().EQNPctOfCreditLimit)
    info(strfmt("@EQN:CustCreditlimitPercentWarning",openBalanceMST,CustParameters::find(false).EQNPctOfCreditLimit,creditLimit,excessamt));
        }
    }

    public static client server boolean checkCreditLimit_Sales(SalesTable _salesTable,
                                                               boolean    _onlyWarning,
                                                               boolean    _showMsg)
    {
        CustTable   custTable;
        AmountMST   openBalanceMST;
        Amount      creditLimit,financialriskperorder,custexposureamt=0,excessamt,misccharges;
        EQNFINCustExposureTrans eqncustExposuretransold;
        EQNOrderTypes   ordertypes;
        FINCreditLimitException finCreditLimitException;
        FINModule   finModule;
        boolean ret = next checkCreditLimit_Sales(_salesTable,_onlyWarning,_showMsg);
        boolean execute = true;
        if(PaymTerm::find(_salesTable.Payment,false).EQNExcludefromexposurecalculations)
        {
            execute = false;
        }
        if( _salesTable.SalesPoolId == CustParameters::find().EQNExcludeFromExposure) // If sales table pool id is also equal we need to skip it.
        {
            execute = false;
        }
        if (CustParameters::find().FINCustCreditCheckType != FINCustCreditCheckType::BasedonExposure)//basedonexposure need to be added
        {
            execute  = false;
        }
        if (execute)//basedonexposure need to be added
        {
               ret         = true;
                String10    salestype;
                custTable      = _salesTable.custTable_InvoiceAccount();
                EQNCreditExposureCalculations   creditExposureCalculations =new EQNCreditExposureCalculations();
                select eqncustExposuretransold
                    where eqncustExposuretransold.EQNSalesId    ==  _salesTable.SalesId;

                //openBalanceMST = custTable.openBalanceCur()+creditExposureCalculations.custorderedbal(custTable);
                openBalanceMST = custTable.openBalanceMST()+creditExposureCalculations.custorderedbal(custTable);
               if(eqncustExposuretransold.EQNExposureValue)
                openBalanceMST   = openBalanceMST-eqncustExposuretransold.EQNExposureValue;
                creditLimit    = FINCheckCreditLimit::maxCreditLimit(custTable.AccountNum);
                if(_salesTable.SalesType    ==  SalesType::Sales)
                {
                    ordertypes = EQNOrderTypes::SalesOrder;
                    salestype =  "@EQN:Sales";
                    finModule   =   FINModule::SalesOrder;
                }
                else if(_salesTable.SalesType    ==  SalesType::RORRental)
                {
                    ordertypes = EQNOrderTypes::RentalOrder;
                    SalesType   =   "@EQN:Rental";
                    finModule   =   FINModule::RentalOrder;
                }
                financialriskperorder   =   EQNCreditExposureCalculations::financalExposurePerOrder(ordertypes,_salesTable);
                misccharges =   EQNCreditExposureCalculations::calculateMarkupTrans(_salesTable.SalesId);
                financialriskperorder   =   financialriskperorder+misccharges;
                //custexposureamt =   EQNFINCustExposureTrans::CustomerExposure(_salesTable.CustAccount);
                excessamt   =   openBalanceMST+custexposureamt+financialriskperorder-creditLimit;
         
                if (openBalanceMST+financialriskperorder >= creditLimit)
                {
                    if (FINCheckCreditLimit::hasCreditLimitException(_salesTable.CustAccount, finModule, _salesTable.SalesId))
                    {
                        info(strfmt("@EQN:salesconfirmerror",_salesTable.SalesId,openBalanceMST,_salesTable.CurrencyCode,financialriskperorder,financialriskperorder+openBalanceMST,creditLimit,excessamt,salestype));
                    }
                    else
                    {
                        error(strfmt("@EQN:salesconfirmerror",_salesTable.SalesId,openBalanceMST,_salesTable.CurrencyCode,financialriskperorder,financialriskperorder+openBalanceMST,creditLimit,excessamt,salestype));
                        ret = false;
                    }
                }
                if(ret == true)
                {                             
                    if(CustParameters::find().EQNPctOfCreditLimit > 0 &&CustParameters::find().EQNPctOfCreditLimit != 100 )
                    {
                        Percent percent;
                        if(creditLimit>0)
                            percent=((openBalanceMST+financialriskperorder)/creditLimit)* 100;
                        else
                            percent = 100;
                        if(percent> CustParameters::find().EQNPctOfCreditLimit)
                            info(strfmt("@EQN:salesconfirmwarning",_salesTable.SalesId,openBalanceMST,_salesTable.CurrencyCode,financialriskperorder,financialriskperorder+openBalanceMST,creditLimit,excessamt,CustParameters::find().EQNPctOfCreditLimit,salestype));
                    }
                }
            //}
            if(ret)
            {
                EQNCreditExposureCalculations::insertEQNFINCustExposureTrans( _salesTable,financialriskperorder);
            }
     
        }
        return ret;
    }

    public static client server boolean checkCreditLimit_WPPline(WPPWorkOrderLine  _workOrderLine)
    {
        boolean             ret = true;
        WPPParameters       wppParameters;
        CustTable           custTable;
        AmountMST           openBalanceMST;
        Amount              creditLimit,custexposureamt,excessamt;
        WPPWorkOrderTable   wppWorkorderTable;
        if(ProjGroup::find((ProjTable::find(_workOrderLine.ProjId,false).ProjGroupId),FALSE).FINCustCreditCheckType == FINCustCreditCheckType::BasedonExposure)
        {
            if(WPPParameters::find(false).EQNWPPMessagewhenexceedingcreditlimit != EQNWPPMessagewhenexceedingcreditlimit::Review)
            {
                wppWorkorderTable    = WPPWorkOrderTable::find(_workOrderLine.WorkOrderId,false);
                custTable      = CustTable::find(wppWorkorderTable.CustVendAccount);
                EQNCreditExposureCalculations   creditExposureCalculations =new EQNCreditExposureCalculations();
                //openBalanceMST = custTable.openBalanceCur()+creditExposureCalculations.custorderedbal(custTable);
                openBalanceMST = custTable.openBalanceMST()+creditExposureCalculations.custorderedbal(custTable);
                creditLimit    = FINCheckCreditLimit::maxCreditLimit(wppWorkorderTable.CustVendAccount);
                excessamt   =   openBalanceMST+custexposureamt-creditLimit; 
                wppParameters   =   WPPParameters::find(false);
             
                if(WPPParameters::find(false).EQNWPPMessagewhenexceedingcreditlimit == EQNWPPMessagewhenexceedingcreditlimit::Error)
                    {
                        if (openBalanceMST >= creditLimit)
                        {
                            if (FINCheckCreditLimit::hasCreditLimitException(custTable.AccountNum,
                                                                  FINModule::WPPWorkOrder,
                                                                  _workOrderLine.WorkOrderId))
                            {
                                info(strFmt("@EQN:Workorderexcesscrediterror", openBalanceMST,creditLimit,custTable.currency,excessamt));
                            }
                            else
                            {
                                throw error(strFmt("@EQN:Workorderexcesscrediterror", openBalanceMST,creditLimit,custTable.currency,excessamt));
                                ret = false;
                            }
                        }
                        if(ret == true)
                        {
                            if(CustParameters::find().EQNPctOfCreditLimit > 0 &&CustParameters::find().EQNPctOfCreditLimit != 100 )
                            {
                                Percent percent;
                                if(creditLimit > 0)
                                    percent=((openBalanceMST)/creditLimit)* 100;
                                else
                                    percent=100;
                                if(percent> CustParameters::find().EQNPctOfCreditLimit)
                                        return warning(strfmt("@EQN:WorkOrderexcesscreditwarning",openBalanceMST+custexposureamt,creditLimit,custTable.currency,excessamt,CustParameters::find().EQNPctOfCreditLimit));
                            }
                        }

                    }
                    else if(WPPParameters::find(false).EQNWPPMessagewhenexceedingcreditlimit == EQNWPPMessagewhenexceedingcreditlimit::Warning)
                    {
                        if (openBalanceMST >= creditLimit)
                        {
                            info(strFmt("@EQN:Workorderexcesscrediterror", openBalanceMST,creditLimit,custTable.currency,excessamt));
                            ret = false;
                        } 
                        if(ret == true)
                        {
                            if(CustParameters::find().EQNPctOfCreditLimit > 0 &&CustParameters::find().EQNPctOfCreditLimit != 100 )
                            {
                                Percent percent;
                                if(creditLimit >0)
                                    percent=((openBalanceMST)/creditLimit)* 100;
                                else
                                    percent = 100;
                                if(percent> CustParameters::find().EQNPctOfCreditLimit)
                                    return warning(strfmt("@EQN:WorkOrderexcesscreditwarning",openBalanceMST+custexposureamt,creditLimit,custTable.currency,excessamt,CustParameters::find().EQNPctOfCreditLimit));
                            }
                        }
                    }
             
                }
            }
         
            return ret;
        }

}
======================================================================
class SalesCreateOrderEventhandler
{
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormControlEventHandler(formControlStr(SalesCreateOrder, SalesTable_CustAccount), FormControlEventType::Modified)]
    public static void SalesTable_CustAccount_OnModified(FormControl sender, FormControlEventArgs e)
    {
        FormRun             formRun          = sender.formRun();
        FormStringControl    custacc = formRun.design(0).controlName("SalesTable_CustAccount");
        if(custacc.valueStr() != "")
        FINCheckCreditLimit::checkCreditLimit_Cust(custacc.valueStr());
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormControlEventHandler(formControlStr(RORSalesCreateOrder, SalesTable_CustAccount), FormControlEventType::Modified)]
    public static void RORSalesTable_CustAccount_OnModified(FormControl sender, FormControlEventArgs e)
    {
        FormRun             formRun          = sender.formRun();
        FormStringControl    custacc = formRun.design(0).controlName("SalesTable_CustAccount");
        if(custacc.valueStr() != "")
        FINCheckCreditLimit::checkCreditLimit_Cust(custacc.valueStr());
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="args"></param>
    [PostHandlerFor(formStr(SalesTable), formMethodStr(SalesTable, init))]
    public static void SalesTable_Post_init(XppPrePostArgs args)
    {
        FormRun             initialFormRun;
        Common              initialFormRunRecord;
        CustTable           custTable;
        initialFormRun= args.getThis();
        if (TradeFormHelper::isCalledFromForm(initialFormRun.args(), formStr(CustTable))
                && initialFormRun.args().record().TableId == tableNum(CustTable))
        {
            //initialFormRun = initialFormRun.args().caller() as FormRun;
            initialFormRunRecord = initialFormRun.args().record();
         
            //custTable = initialFormRun.args().record() as CustTable;
            initialFormRunRecord = initialFormRun.args().record();
            custTable   =   initialFormRunRecord;
            if(custTable)
            FINCheckCreditLimit::checkCreditLimit_Cust(custTable.AccountNum);
        }
    }

}
=================================================================

[ExtensionOf(classStr(WPPWorkOrderStatusUpdate))]
Final class WPPWorkOrderStatusUpdateEQN_Extension
{
    protected boolean checkcreditlimitonWorkOrderline()
    {
        boolean ret;
        ret = FINCheckCreditLimit::checkCreditLimit_WPPline(this.workOrderLine);
        return ret;
    }

    protected void updateWorkOrderLine()
    {
        this.checkcreditlimitonWorkOrderline();
        next updateWorkOrderLine();
     
    }

}


No comments:

Post a Comment