Monday, 25 February 2019

DMF Links

Main Account Import :
https://www.linkedin.com/pulse/working-data-import-export-framework-example-goran-dobri%C4%8Di%C4%87-pmp

https://kurthatlevik.com/2015/08/21/dax2012r3cu9-dixf-automate-importexport-without-customizations/

Opening Balace Import:

https://stoneridgesoftware.com/automated-data-entity-import-using-dixf-in-dynamics-ax/

Entities Information :
https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/data-import-export-framework-entities-dixf-dmf
Packages In DIXF :
https://docs.microsoft.com/en-us/dynamics365/unified-operations//dev-itpro/data-entities/data-entities-data-packages

Composite Data Entities :
https://sangeethwiki.blogspot.com/2017/09/develop-composite-data-entities-in-dax.html

Import many Tables Info:
https://community.dynamics.com/ax/b/shafeealabadiaxtutorials/archive/2015/09/07/ax-2012-import-released-products-using-dixf


http://ax2012dmfdataimport.blogspot.com/

Address/Contact Information: Export data using View in AX 2012

AX2012 has implemented lot of changes in GAB and the way they function. This would ideally mean we should know the exact relation between tables to export relevant data. In order to validate the customer addresses/contact information it would be a huge task. So the question remains what is the simplest way to export Customer/Vendor address/contact information the same way as in Dynamics AX forms.

Note: Although we have tools like DIXF/AIF for exporting data.

Exporting Customer Address: The form data which is shown in Customer master is got from a view. Similar approach could be followed to export the data.

Under AOT -> Views and find Party postal address view (DirPartyPostalAddressView). If you try to browse through the data you shall find data corresponding to following fields which is similar to customer address section except to which customer it belong to.

Address

In DirPartyPostalAddressView click on Auto-report the following will be visible

PostalAddressView_AutoReport

In order to get the Customer Id, Customer Name, Purpose(method: locationRoles) and Primary add the following code in the view and drag into Auto-Report and Synchronize it as shown in the image.

PostalAddressView_Code

On viewing the Auto-report in the view the following result will be as below

DirPartyPostalAddressView

Note: Since we are finding customer Id based on it Party from CustTable we might have accounts which are blank, so it could be others account as well like Vendors or warehouse address for which you need to handle via code.

You can now export to excel easily. In case similar functionality is needed to get Contact information for customer/vendor, please follow the similar approach on DirPartyContactInfoView and get the required data ASAP.



https://axblog4u.wordpress.com/2014/01/29/addresscontact-information-export-data-using-view-in-ax-2012/

DIXF In AX7

https://gfeaxblog.wordpress.com/2017/10/09/o365-how-to-exportimport-data-through-data-management-framework-dimf/

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();
     
    }

}