Saturday, 26 May 2018

Layers in Ax 2012



              Layers In AX 2012


There are 8 Layers in Ax. Every layer have one patch layer.
SysàSystem Layer:
The standard application is implemented at the lowest level, the SYS layer. The application objects in the standard application can never be deleted.
GLSàGlobalization Layer:
When the application is modified to match country or region specific legal demands, these modifications are saved in the GLS layer.
FPKàFuture Pack Layer:
The FPK layer is an application object patch layer reserved by Microsoft for future patching or other updates.
SLNà


Using Composite Entity functional flow in Ax 2012



                                                Create Composite Entity


1.       Create two tables and give index and relation



2.Create a form with above tables



3.Create menuitem for above form

4.Go to DataImportExportFramework Module
5.Click on source format
6.Set source format as following



7.Go to common>create Entity for import/Export
8.Run wizard
9.Give parent table
10.Give menuitem name
11.Is composite entity ==yes(tick)>next>finish
12.A project is  created

13.Again Go to common>create Entity for import/Export
14.Run wizard
15.Give child table
16.Give menuitem name
17.Is composite entity ==yes(tick)>next>finish

18.A project is  created
19.Drag two projects from private to shared.

20.Go to setup>target entity
21.Create new composite entity

22.Click on child entities
23.Create two entities as below


24.Click on validate


25.Go to processing group
26.Create new processing group


27.Click on entities
28.Give entity name and save automatically 2 child entities will be created


29.select on first child  entity and Click on generate source file

30.Click on generate sample file give data and save it> finish.

31.select on second child  entity and Click on generate source file

32.Click on generate sample file give data and save it> finish.

33.Merge two files as below


34. Go to 28 screenshot and select file which we have merged.
35.Go to 28 screenshot and in that select sequence no.1
36.Click on generatesource mapping




37.Go to 28 screenshot and select  sequence no.2 and click on validate.
38. . Go to 28 screenshot and select sequence no.3 and click on validate.
39. click on preview source file

40. go to processing group
41. click on get staging data




Click OK

Click on run


Click OK



Go to processing group
Click on copy data to target




Click OK
Select Execute Sequentially

Click on run



Click OK


Go to form and check whether data is imported or not.





Entity Methods in AX7


Entity Methods
public class CGLSalesOrderHeaderEntity extends common
{
    public void initValue()
    {
        NumberSeqRecordFieldHandler::enableNumberSequenceControlForField(
            this, fieldNum(CGLSalesOrderHeaderEntity, SalesOrderNumber), SalesParameters::numRefSalesId());

        super();
    }

    /// <summary>
    /// Returns the table extension used for defaulting.
    /// </summary>
    /// <returns>An instance of the <c>SysTableExtension</c> class.</returns>
    public TableExtension getExtension()
    {
        return SysTableExtension::construct();
    }

    private void defaultDlvMode()
    {
        this.DeliveryModeCode = TMSCarrierService::findDlvModeId(this.ShippingCarrierId, this.ShippingCarrierServiceId);
    }

    /// <summary>
    /// Retrieves the defaulting dependencies.
    /// </summary>
    /// <returns>A container with the defaulting dependencies.</returns>
    public container getDefaultingDependencies()
    {
        return [
            [fieldNum(CGLSalesOrderHeaderEntity, DeliveryModeCode),
                [fieldNum(CGLSalesOrderHeaderEntity, ShippingCarrierServiceId),
                fieldNum(CGLSalesOrderHeaderEntity, ShippingCarrierId)]]
        ];
    }

    /// <summary>
    /// Populates default values in a field.
    /// </summary>
    /// <param name = "_fieldId">The Id of the field that gets defaulted.</param>
    public void defaultField(FieldId _fieldId)
    {
        super (_fieldId);

        switch (_fieldId)
        {
            case fieldNum(CGLSalesOrderHeaderEntity, DeliveryModeCode):
                this.defaultDlvMode();
                break;
        }
    }

    public void initializeEntityDataSource(DataEntityRuntimeContext _entityCtx, DataEntityDataSourceRuntimeContext _dataSourceCtx)
    {
        super(_entityCtx, _dataSourceCtx);

        switch (_dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, SalesTable):
                // clear out 'isFieldSet' so the defaulting logic does not consider fields that were set by initValue as specified by the user
                _dataSourceCtx.setAllFieldStatesToNotSet();
                break;
        }
    }

    public Common findEntityDataSource(DataEntityRuntimeContext _entityCtx, DataEntityDataSourceRuntimeContext _dataSourceCtx)
    {
        Common ret;

        switch (_dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, LogisticsPostalAddressBaseEntity):
                ret = TradeEntitySpecificDeliveryAddress::findLogisticsPostalAddressBaseEntityDataSource();
                break;

            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, SalesTable_W):
                ret = SalesTable_W::findBySalesTable(this.RecId, true);
                break;

            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, TMSSalesTable):
                ret = TMSSalesTable::find(this.SalesOrderNumber, true);
                break;

            default:
                ret = super(_entityCtx, _dataSourceCtx);
        }
   
        return ret;
    }

    public boolean insertEntityDataSource(DataEntityRuntimeContext _entityCtx, DataEntityDataSourceRuntimeContext _dataSourceCtx)
    {
        CustTable custTable,custTableReturn, custTableDim;
        LogisticsPostalAddress address;
        SalesTable salesTable,salesTableReturn;

        switch (_dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, SalesTable):
                {
                    this.validateWriteSalesTableDataSource(_dataSourceCtx);
                    salesTable = _dataSourceCtx.getBuffer();

                    select firstonly1 DefaultDimension from custTableDim
                        where custTableDim.AccountNum == salesTable.CustAccount;

                    str businessPartnerValue = CGLDimensionsHelper::getDimensionValue(custTableDim.DefaultDimension,"BusinessPartner");

                    if(businessPartnerValue)
                    {
                        salesTable.DefaultDimension = CGLDimensionsHelper::setDefaultDimension(salesTable.DefaultDimension,"BusinessPartner", businessPartnerValue);
                    }

                    LogisticsLocationRecId locationRecId = LogisticsPostalAddressBaseEntity::saveAddress(_entityCtx,
                    dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, LogisticsPostalAddressBaseEntityInvoice));
                    this.MotoristDescription = salesTable.CGLMotoristName;
                    LogisticsLocationRecId locationRecId1 = LogisticsPostalAddressBaseEntity::saveAddress(_entityCtx,
                    dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, LogisticsPostalAddressBaseEntityMotorist));
                    select firstonly address where address.Location == locationRecId;
                    salesTable.CGLInvoiceAddress = address.RecId;
                    select firstonly address where address.Location == locationRecId1;
                    salesTable.CGLMotoristAddress = address.RecId;
                  
                    //CS CR_2371_STC-COLL : Motorist customer invoice with BP name added n=on 5th May 2017
                    DirPartyTable   partyName;
                    select party from custTable
                        where custTable.AccountNum == salesTable.CustAccount
                        join Name from partyName where partyName.RecId == custTable.Party;

                    salesTable.SalesName = partyName.Name;
                    //CE CR_2371_STC-COLL : Motorist customer invoice with BP name added n=on 5th May 2017
                   
                    if(!CustParameters::find().DefaultCust)
                        throw error("@CGL:CGL003100");

                    if(salesTable.CGLScenarioType == CGLScenarioType::FMT)
                    {
                        CustTable           defaultCustTable;
                        CustParameters      custParameters;

                        select firstonly1 DefaultDimension from defaultCustTable
                            exists join custParameters
                                where custParameters.DefaultCust == defaultCustTable.AccountNum;

                        if(defaultCustTable.DefaultDimension)
                        {
                            businessPartnerValue = CGLDimensionsHelper::getDimensionValue(defaultCustTable.DefaultDimension,"BusinessPartner");
                        }

                        if(businessPartnerValue)
                        {
                            salesTable.DefaultDimension = CGLDimensionsHelper::setDefaultDimension(salesTable.DefaultDimension,"BusinessPartner", businessPartnerValue);
                        }
                        else
                        {
                            salesTable.DefaultDimension = CGLDimensionsHelper::removeDimension(salesTable.DefaultDimension,"BusinessPartner");
                        }

                        if(salesTable.CGLIsReturnOrder)
                        {
                            select firstonly salesTableReturn
                                join custTableReturn
                            where salesTableReturn.CGLFSXInvoiceNum == salesTable.CGLCreditNoteOrigFSXNum && custTableReturn.AccountNum == salesTableReturn.CustAccount
                            && custTableReturn.CGLCustomerType == CGLCustomerType::Motorist;
                        }

                        if (salesTableReturn.CustAccount)
                        {
                            salesTable.CustAccount = salesTableReturn.CustAccount;
                            salesTable.InvoiceAccount = salesTable.CustAccount;
                            //CS CR_2371_STC-COLL : Motorist customer invoice with BP name added n=on 5th May 2017
                            //salesTable.SalesName = salesTable.CGLMotoristName;
                            DirPartyTable   party;
                            select party from custTable
                                 where custTable.AccountNum == salesTable.CustAccount
                                join Name from party where party.RecId == custTable.Party;
                            salesTable.SalesName = party.Name;
                            //CE CR_2371_STC-COLL : Motorist customer invoice with BP name added n=on 5th May 2017
                        }
                        else
                        {  
                            salesTable.DeliveryName = salesTable.CGLMotoristName;
                            salesTable.CustAccount = CustTable::createOneTimeAccount(salesTable, true);
                            salesTable.InvoiceAccount = salesTable.CustAccount;
                            salesTable.SalesName = salesTable.CGLMotoristName;
                            select custTable where custTable.AccountNum == salesTable.CustAccount;
                            ttsbegin;
                           
                            DirPerson dirPerson;
                           
                            select forupdate dirPerson where dirPerson.RecId == custTable.Party;
                            dirPerson.Name = salesTable.CGLMotoristName;
                            dirPerson.PersonalTitle = DirNameAffix::find(DirNameAffixType::PersonalPrefix, this.CGLCustomerTitle).RecId;
                            dirPerson.doUpdate();

                            custTable.selectForUpdate(true);
                            custTable.CGLCustomerType = CGLCustomerType::Motorist;
                            if(custTable.Party && locationRecId1)
                            DirPartyLocation::create(custTable.Party,locationRecId1,true,true);
                            if(custTable.Party && salesTable.CGLMotoristEmail)
                            LogisticsElectronicAddress::createElectronicAddressFromUnsolicited(custTable.Party, LogisticsElectronicAddressMethodType::Email, salesTable.CGLMotoristEmail, NoYes::Yes);
                            //Start - santosp CR#2188
                            if(custTable.Party && salesTable.CGLMotoristPhone)
                                LogisticsElectronicAddress::createElectronicAddressFromUnsolicited(custTable.Party, LogisticsElectronicAddressMethodType::Phone, salesTable.CGLMotoristPhone, NoYes::Yes);
                            //End - santosp CR#2188
                            custTable.doupdate();
                            ttscommit;
                        }
                    }
                   

                    select custTable where custTable.AccountNum == salesTable.CustAccount;
                    if(custTable.CGLCustomerType == CGLCustomerType::BusinessPartner)
                    {
                        if(strLen( salesTable.CGLFSXInvoiceNum) > 7)
                        {
                            System.String invoiceNum = salesTable.CGLFSXInvoiceNum;
                            salesTable.CGLFSXInvoiceNumCalculated = invoiceNum.Substring(strLen( salesTable.CGLFSXInvoiceNum) -8)+ '-1';
                        }
                        else
                        {
                            salesTable.CGLFSXInvoiceNumCalculated = salesTable.CGLFSXInvoiceNum + '-1';
                        }
                    }
                    else if(custTable.CGLCustomerType == CGLCustomerType::Motorist)
                    {
                        if(strLen(salesTable.CGLFSXInvoiceNum) > 7)
                        {
                            System.String invoiceNum = salesTable.CGLFSXInvoiceNum;
                            salesTable.CGLFSXInvoiceNumCalculated = invoiceNum.Substring(strLen( salesTable.CGLFSXInvoiceNum) -8)+ '-2';
                        }
                        else
                        {
                            salesTable.CGLFSXInvoiceNumCalculated = salesTable.CGLFSXInvoiceNum + '-2';
                        }
                    }
                    DirPartyTable dirPartyTable;
                    select forupdate dirPartyTable where dirPartyTable.RecId == custTable.Party;
                    salesTable.LanguageId = dirPartyTable.LanguageId;
                }
                break;

            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, TMSSalesTable):
                _entityCtx.detectConflictForDatasource(_dataSourceCtx);
                break;

            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, SalesTable_W):
                // SalesTable_W was created during SalesTable.insert(), so need to resolve the conflict:
                _entityCtx.detectConflictForDatasource(_dataSourceCtx);
                this.validateWriteDataSourceSalesTable_W(_dataSourceCtx);
                break;
        }
       
        boolean ret = super(_entityCtx, _dataSourceCtx);

        switch (_dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(PurchPurchaseOrderHeaderEntity, LogisticsPostalAddressBaseEntity):
                this.TradeEntitySpecificDeliveryAddress::postInsertLogisticsPostalAddressBaseEntityDataSource(_dataSourceCtx);
                break;
        }

        return ret;
    }

    public boolean updateEntityDataSource(DataEntityRuntimeContext _entityCtx, DataEntityDataSourceRuntimeContext _dataSourceCtx)
    {
        switch (_dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, SalesTable):
                if (this.CurrencyCode != this.orig().CurrencyCode)
                {
                    SalesTable salesTable = _dataSourceCtx.getBuffer();
                    salesTable.convertCurrencyCode(this.CurrencyCode, TradeCurencyConversion::TradeAgreements);
                }
                this.validateWriteSalesTableDataSource(_dataSourceCtx);
                LogisticsLocationRecId locationRecId = LogisticsPostalAddressBaseEntity::saveAddress(_entityCtx,
                dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, LogisticsPostalAddressBaseEntityInvoice));
               
                SalesTable salesTable = _dataSourceCtx.getBuffer();
                salesTable.CGLInvoiceAddress = locationRecId;

                locationRecId = LogisticsPostalAddressBaseEntity::saveAddress(_entityCtx,
                dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, LogisticsPostalAddressBaseEntityMotorist));
               
                salesTable = _dataSourceCtx.getBuffer();
                salesTable.CGLMotoristAddress = locationRecId;
                break;

            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, SalesTable_W):
                this.validateWriteDataSourceSalesTable_W(_dataSourceCtx);
                break;

            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, TMSSalesTable):
                _entityCtx.detectConflictForDatasource(_dataSourceCtx);
                break;
        }
       
        return super(_entityCtx, _dataSourceCtx);
    }

    private void validateWriteSalesTableDataSource(DataEntityDataSourceRuntimeContext _dataSourceCtx)
    {
        SalesTable salesTable = _dataSourceCtx.getBuffer() as SalesTable;
        SalesTableType salesTableType = salesTable.type();

        boolean isValid = true;

        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, OrderingCustomerAccountNumber)) && !salesTableType.editCustAccount())
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, OrderingCustomerAccountNumber));
        }

        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, InvoiceCustomerAccountNumber)) && !salesTableType.editInvoiceAccount())
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, InvoiceCustomerAccountNumber));
        }

        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, TaxExemptNumber)) && !salesTableType.editVATNum())
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, TaxExemptNumber));
        }

        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, ArePricesIncludingSalesTax)) && !salesTableType.editInclTax())
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, ArePricesIncludingSalesTax));
        }

        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, CurrencyCode)) && !salesTableType.editCurrencyCode())
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, CurrencyCode));
        }

        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, DirectDebitMandateId)) && !CustPaymModeTable::find(salesTable.PaymMode).IsSEPA)
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, DirectDebitMandateId));
        }

        if (salesTable.isMarkedForBankLC())
        {
            List fields = new List(Types::Integer);
            fields.addEnd(fieldNum(CGLSalesOrderHeaderEntity, PaymentTermsName));
            fields.addEnd(fieldNum(CGLSalesOrderHeaderEntity, FixedDueDate));
            fields.addEnd(fieldNum(CGLSalesOrderHeaderEntity, CustomerPaymentMethodName));
            fields.addEnd(fieldNum(CGLSalesOrderHeaderEntity, CustomerPaymentMethodSpecificationName));
            fields.addEnd(fieldNum(CGLSalesOrderHeaderEntity, PaymentScheduleName));
            fields.addEnd(fieldNum(CGLSalesOrderHeaderEntity, CashDiscountCode));
            fields.addEnd(fieldNum(CGLSalesOrderHeaderEntity, CustomerTransactionSettlementType));
            isValid = isValid & this.checkFieldsAreNotModified(fields);
        }
       
        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, WillAutomaticInventoryReservationConsiderBatchAttributes)) && !salesTable.canEditPdsBatchAttribAutoRes())
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, WillAutomaticInventoryReservationConsiderBatchAttributes));
        }

        if (!isValid)
        {
            _dataSourceCtx.throwValidateWriteFailed();
        }
    }

    private void validateWriteDataSourceSalesTable_W(DataEntityDataSourceRuntimeContext _dataSourceCtx)
    {
        CustParameters custParameters = CustParameters::find();
        SalesTable_W salesTable_w = _dataSourceCtx.getBuffer() as SalesTable_W;

        boolean isValid = true;

        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, IsEntryCertificateRequired))
            && !custParameters.EntryCertificateManagementEnabled_W)
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, IsEntryCertificateRequired));
        }

        if (this.isFieldModified(fieldNum(CGLSalesOrderHeaderEntity, IsOwnEntryCertificateIssued))
            && !salesTable_w.EntryCertificateRequired_W
            && !custParameters.EntryCertificateIssuingEnabled_W)
        {
            isValid = this.allowEditCheckFailed(fieldPName(CGLSalesOrderHeaderEntity, IsOwnEntryCertificateIssued));
        }

        if (!isValid)
        {
            _dataSourceCtx.throwValidateWriteFailed();
        }
    }

    public void mapEntityToDataSource(DataEntityRuntimeContext _entityCtx, DataEntityDataSourceRuntimeContext _dataSourceCtx)
    {
        switch (_dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, LogisticsPostalAddressBaseEntity):
                this.TradeEntitySpecificDeliveryAddress::mapLogisticsPostalAddressBaseEntityDataSourceToEntity(_dataSourceCtx);
                break;
        }

        super(_entityCtx, _dataSourceCtx);

        switch (_dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, SalesTable):
                SalesTable salesTable = _dataSourceCtx.getBuffer();
                // Setting the values here so the defaulting in the <c>initValue_Server</c> method in <c>SalesTable</c> is not used.
                // Table extension defaulting on SalesTable ensures that values set are not overridden if they are marked as set, so if the below 2 fields
                // are set on the entity (even if they have no value), then the corresponding SFKs on the sales table should also be marked as set, and the
                // entity framework is not doing this today (Dynamics: Bug 3667212).
                salesTable.fieldState(fieldNum(SalesTable, WorkerSalesTaker), this.fieldState(fieldNum(CGLSalesOrderHeaderEntity, OrderTakerPersonnelNumber)));
                salesTable.fieldState(fieldNum(SalesTable, WorkerSalesResponsible), this.fieldState(fieldNum(CGLSalesOrderHeaderEntity, OrderResponsiblePersonnelNumber)));

                if(!salesTable.InvoiceAccount)
                    salesTable.InvoiceAccount = salesTable.CustAccount;

                salesTable.SalesType        = SalesType::Sales;
                this.MotoristDescription    = salesTable.CGLMotoristName;
                //this.CGLCustomerTitle       = If this is required in future get title from customer dirperson, dirnameaffix

                if (this.isFieldSet(fieldNum(CGLSalesOrderHeaderEntity, CreditNoteReasonCode)))
                {
                    DataEntityDataSourceRuntimeContext dataSourceCtx = _entityCtx.getRuntimeContextByName(dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, CreditNoteReasonTableRef));

                    if (this.CreditNoteReasonCode)
                    {
                        salesTable.editReasonCode(true, this.CreditNoteReasonCode);

                        ReasonTableRef reasonTableRef = ReasonTableRef::find(salesTable.CreditNoteReasonCode);

                        if(!reasonTableRef.validateField(fieldNum(ReasonTableRef,Reason)))
                        {
                            throw error(strfmt("@ApplicationFoundation:DataEntitiesDataSourceValidateFieldFailed", fieldStr(CGLSalesOrderHeaderEntity, CreditNoteReasonCode)));
                        }

                        if (reasonTableRef)
                        {
                            dataSourceCtx.setBuffer(reasonTableRef);
                        }
                    }

                    dataSourceCtx.setDatabaseOperation(DataEntityDatabaseOperation::None);
                }

                if (this.scopeIdentifier())
                {
                    // Skip creation of markup when doing data migration
                    salesTable.SkipCreateMarkup = NoYes::Yes;
                }
                break;
        }
    }

    public void mapDataSourceToEntity(DataEntityRuntimeContext _entityCtx, DataEntityDataSourceRuntimeContext _dataSourceCtx)
    {
        super(_entityCtx, _dataSourceCtx);

        switch (_dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(CGLSalesOrderHeaderEntity, SalesTable):
                SalesTable salesTable = _dataSourceCtx.getBuffer();
                this.TradeEntitySpecificDeliveryAddress::mapSavedPostalAddressToEntity(_entityCtx,  salesTable.DeliveryPostalAddress);

                TMSSalesTable tmsSalesTable = TMSSalesTable::find(this.SalesOrderNumber);
                this.ShippingCarrierId = tmsSalesTable.CarrierCode;
                this.ShippingCarrierServiceId = tmsSalesTable.CarrierServiceCode;
                this.TransportationModeId = tmsSalesTable.ModeCode;
                break;
        }
    }

    public boolean validateWrite()
    {
        if (this.RecId)
        {
            if (ReverseChargeParameters_W::find().Enabled)
            {
                return checkFailed("@SCM:SalesOrderHeaderEntityDoesNotSupportUpdatesWhenReverseChargesAreEnabled");
            }

            if (RetailParameters::isRetailEnabledAndInUse()
                && RetailSalesTable::find(this.SalesOrderNumber).RetailChannel)
            {
                return checkFailed("@SCM:SalesOrderHeaderEntityDoesNotSupportUpdatesOfRetailOrders");
            }

            if (!SalesTable::find(this.SalesOrderNumber).checkUpdate(true, true, true))
            {
                return false;
            }
        }

        SalesTable salesTableLocal;

        if (this.CGLCustomerTitle != '')
        {
            DirNameAffix    cglNameAffix =        DirNameAffix::find(DirNameAffixType::PersonalPrefix, this.CGLCustomerTitle);

            if (cglNameAffix.RecId == 0)
            {
                return checkFailed(strFmt("@SYP4986038", fieldStr(DirPerson, PersonalTitle), this.CGLCustomerTitle, fieldStr(DirNameAffix, Affix)));
            }
        }

        // NS Devlpoed by Ram for Bug IDD6 - FSX Invoice Number coming Twice
        select count(RecId) from salesTableLocal
            where salesTableLocal.CGLFSXInvoiceNum == this.CGLFSXInvoiceNum
            &&    salesTableLocal.SalesStatus == SalesStatus::Invoiced; //Aman Kedia IDD 6 bug

        if(salesTableLocal.RecId)
        {
            return checkFailed("@CGL:CGL003076");
        }
        // NE Devlpoed by Ram for Bug IDD6 - FSX Invoice Number coming Twice
        return super();
    }

    public boolean validateDelete()
    {
        if (!SalesTable::find(this.SalesOrderNumber).type().checkDelete(true, true))
        {
            return false;
        }

        return super();
    }

    public void insert()
    {
        LogisticsPostalAddress postalAddress;
        CustTable custTable,custTableReturn;
        LogisticsLocationParty logisticsLocationParty;
        SalesTable salesTableReturn;
        super();
        if(this.CGLScenarioType == CGLScenarioType::SPTI)
        {
            ttsbegin;
            SalesTable salesTable;
            select salesTable where salesTable.SalesId == this.SalesOrderNumber;
            salesTable salesTableLocal ;
            salesTableLocal.data(salesTable);
            salesTableLocal.SalesId = NumberSeq::newGetNum(SalesParameters::numRefSalesId() , true).num();
            salesTableLocal.OneTimeCustomer = true;
            salesTableLocal.DeliveryPostalAddress = salesTable.CGLMotoristAddress;

            if(salesTable.CGLIsReturnOrder)
            {
                select firstonly salesTableReturn
                    join custTableReturn
                where salesTableReturn.CGLFSXInvoiceNum == salesTable.CGLCreditNoteOrigFSXNum && custTableReturn.AccountNum == salesTableReturn.CustAccount
                && custTableReturn.CGLCustomerType == CGLCustomerType::Motorist;
            }

            if (salesTableReturn.CustAccount)
            {
                salesTableLocal.CustAccount = salesTableReturn.CustAccount;
                salesTableLocal.InvoiceAccount = salesTableLocal.CustAccount;
                //CS CR_2371_STC-COLL : Motorist customer invoice with BP name added n=on 5th May 2017
                //salesTable.SalesName = salesTable.CGLMotoristName;
                DirPartyTable   party;
                select party from custTable
                                 where custTable.AccountNum == salesTable.CustAccount
                                join Name from party where party.RecId == custTable.Party;
                salesTableLocal.SalesName = party.Name;
                //CE CR_2371_STC-COLL : Motorist customer invoice with BP name added n=on 5th May 2017
            }
            else
            {
                salesTableLocal.DeliveryName = salesTable.CGLMotoristName;
                salesTableLocal.CustAccount = CustTable::createOneTimeAccount(salesTableLocal, true);

               

                salesTableLocal.InvoiceAccount = salesTableLocal.CustAccount;
                salesTableLocal.SalesName = salesTable.CGLMotoristName;
                select custTable where custTable.AccountNum == salesTableLocal.CustAccount;
                DirPartyLocation dirPartyLocation;
                select forupdate dirPartyLocation where dirPartyLocation.Party == custTable.Party;
                select postalAddress where postalAddress.RecId == salesTableLocal.CGLMotoristAddress;
                dirPartyLocation.Location = postalAddress.Location;
                dirPartyLocation.doUpdate();

                DirPerson dirPerson;
                           
                select forupdate dirPerson where dirPerson.RecId == custTable.Party;
                dirPerson.Name = salesTable.CGLMotoristName;
                dirPerson.PersonalTitle = DirNameAffix::find(DirNameAffixType::PersonalPrefix, this.CGLCustomerTitle).RecId;
                dirPerson.doUpdate();


                custTable.selectForUpdate(true);
                custTable.CGLCustomerType = CGLCustomerType::Motorist;
                if(custTable.Party && salesTableLocal.CGLMotoristEmail)
                    LogisticsElectronicAddress::createElectronicAddressFromUnsolicited(custTable.Party, LogisticsElectronicAddressMethodType::Email, salesTableLocal.CGLMotoristEmail, NoYes::Yes);
                //Start - santosp CR#2188
                if(custTable.Party && salesTableLocal.CGLMotoristPhone)
                    LogisticsElectronicAddress::createElectronicAddressFromUnsolicited(custTable.Party, LogisticsElectronicAddressMethodType::Phone, salesTableLocal.CGLMotoristPhone, NoYes::Yes);
                //End - santosp CR#2188
                custTable.doupdate();
            }
          
            if(strLen( salesTableLocal.CGLFSXInvoiceNum) > 7)
            {
                System.String invoiceNum = salesTableLocal.CGLFSXInvoiceNum;
                salesTableLocal.CGLFSXInvoiceNumCalculated = invoiceNum.Substring(strLen( salesTableLocal.CGLFSXInvoiceNum) -8)+ '-2';
            }
            else
            {
                salesTableLocal.CGLFSXInvoiceNumCalculated = salesTableLocal.CGLFSXInvoiceNum + '-2';
            }

            CustTable           defaultCustTable;
            CustParameters      custParameters;
            str                 businessPartnerValue;

            select firstonly1 DefaultDimension from defaultCustTable
                exists join custParameters
                    where custParameters.DefaultCust == defaultCustTable.AccountNum;

            if(defaultCustTable.DefaultDimension)
            {
                businessPartnerValue = CGLDimensionsHelper::getDimensionValue(defaultCustTable.DefaultDimension,"BusinessPartner");
            }

            if(businessPartnerValue)
            {
                salesTableLocal.DefaultDimension = CGLDimensionsHelper::setDefaultDimension(salesTableLocal.DefaultDimension,"BusinessPartner", businessPartnerValue);
            }
            else
            {
                salesTableLocal.DefaultDimension = CGLDimensionsHelper::removeDimension(salesTableLocal.DefaultDimension,"BusinessPartner");
            }

            salesTableLocal.insert();
            if(!salesTable.CGLIsReturnOrder)
            {
                DirPartyTable dirPartyTable;
                select forupdate dirPartyTable where dirPartyTable.RecId == custTable.Party;
                dirPartyTable.Name = salesTable.CGLMotoristName;
                dirPartyTable.NameAlias = salesTable.CGLMotoristName;
                dirPartyTable.doUpdate();
            }
            ttscommit;
        }
    }

    // This method implements the interface defined by <c>TradeEntitySpecificDeliveryAddress</c>
    public RecId deliveryAddressPartyRecId()
    {
        return CustTable::find(this.OrderingCustomerAccountNumber).Party;
    }

    private static str isDeliveryAddressOrderSpecificComputedColumnDefinition()
    {
        // The <c>IsDeliveryAddressOrderSpecific</c> field is only designed for import scenarios
        // so we will always return 'No' for export scnearios to save performance.
        return SysComputedColumn::returnLiteral(NoYes::No);
    }

    private boolean allowEditCheckFailed(FieldLabel _fieldLabel)
    {
        return checkFailed(strFmt("@ApplicationFoundation:DataEntitiesNoAllowEdit", _fieldLabel));
    }

    private boolean isFieldModified(FieldId _fieldId)
    {
        return DataEntityDataSourceRuntimeContextAppSuite_Extension::isFieldModified(this, _fieldId);
    }

    private boolean checkFieldsAreNotModified(List _fieldIds)
    {
        var enumerator = _fieldIds.getEnumerator();
        boolean result = true;

        while (enumerator.moveNext())
        {
            FieldId fieldId = enumerator.current();
            if (this.isFieldModified(fieldId))
            {
                result = this.allowEditCheckFailed(fieldId2PName(tableNum(CGLSalesOrderHeaderEntity), fieldId));
            }
        }

        return result;
    }

    /// <summary>
    /// Updates Sales table for scenario types
    /// </summary>
    /// <param name = "_dmfDefinitionGroupExecution">A data management framework definition group being executed.</param>
    /// <remark>This method is called automatically by the data management framework.</remark>
    public static void postGetStagingData(DMFDefinitionGroupExecution _dmfDefinitionGroupExecution)
    {
        CGLSalesOrderHeaderStaging staging,stagingLocal;
        CustTable custTable;
        CustParameters custParameters;

        while select staging where staging.DefinitionGroup == _dmfDefinitionGroupExecution.DefinitionGroup
                && staging.ExecutionId == _dmfDefinitionGroupExecution.ExecutionId
                && staging.TransferStatus == DMFTransferStatus::NotStarted
        {
           
            switch(staging.CGLScenarioType)
            {
                case CGLScenarioType::FMT:
                    {
                        ttsbegin;
                        staging.selectForUpdate(true);
                        staging.IsOneTimeCustomer = NoYes::Yes;
                        staging.doupdate();
                        ttscommit;
                    }
                    break;
                 //Aman Kedia IDD 6 bug
                //case CGLScenarioType::SPTI:
                    //ttsbegin;
                    //staging.selectForUpdate(true);
                    //staging.CGLVATAmount = 0;
                    //staging.doupdate();
                    //ttscommit;
                    //break;
                case CGLScenarioType::WASO:
                    {
                      
                        custParameters = CustParameters::find();
                        if(!custParameters.CGLDefaultWarrantyCustomer)
                        {
                            throw error("@CGL:CGL003075");
                        }
                        ttsbegin;
                        staging.selectForUpdate(true);
                        staging.OrderingCustomerAccountNumber = custParameters.CGLDefaultWarrantyCustomer;
                        staging.CGLVATAmount = 0;
                        staging.doupdate();
                        ttscommit;
                    }
                    break;
            }
        }
    }

}