Price disc agreement

PriceGroupType

PriceType

Class

GOPPriceDiscAdmTransTable_Extension

GOPPriceDiscTableDSForm_Extension

GOPPriceTypeConverter_Extension

GOPPriceGroupTypeTradeAgreementMappingSalesQtyPromo

GOPPriceTypeTradeAgreementMappingSalesQtyPromoDisc

GopPriceDiscTableCopyFromPriceDiscAdmTrans_Extension

Table

CustTable - PriceDiscGroup_LineDisc

InventTableModule - InventLineDiscountGroup

PriceDiscAdmTrans - CustLineGroup

PriceDiscTable - CustLineGroup

SalesLine - 

Relation


dataEntity

SalesOpenSalesLineDiscountJournalLineEntity


/// <summary>

/// Extension class for table : PriceDiscAdmTrans

/// </summary>

[ExtensionOf(tableStr(PriceDiscAdmTrans))]

internal final class GOPPriceDiscAdmTransTable_Extension

{

    /// <summary>

    /// Validate weite extension before writng to DB

    /// </summary>

    /// <returns>Return true if pass</returns>

    public boolean validateWrite()

    {

        boolean ret;


        ret = next validateWrite();

        if (this.relation == PriceType::GOPPromotionalItemSales)

        {

            if (this.GOPQuantity <= 0)

            {

                warning(strFmt("@GOP:ValidateNegativeParenetItemQuantity", this.GOPQuantity));

                ret = 0 * ret;

            }


            if (this.GOPPromotionalItemCode == '')

            {

                warning("@GOP:ValidateBlankPromotionalItemCode");

                ret = 0 * ret;

            }


            if (this.GOPPromotionalItemQuantity <= 0)

            {

                warning(strFmt("@GOP:ValidateNegativePromotionalItemQuantity", this.GOPPromotionalItemQuantity));

                ret = 0 * ret;

            }

        }

        return ret;

    }


}



*./// <summary>

/// Form EventHandler for trade agreement Journal lines(PriceDiscTable - Datasource)

/// </summary>

[ExtensionOf(formDataSourceStr(PriceDiscTable, PriceDiscTable))]

final class GOPPriceDiscTableDSForm_Extension

{

    /// <summary>

    /// COC to enable & hide the controls based on the Trade agrement PriceType(Promotional item (Sales))

    /// </summary>

    /// <returns>boolean true or fasle</returns>

    public int active()

    {

        PriceDiscAdmTable   priceDiscAdmTableLoc;

        priceDiscAdmTrans   priceDiscAdmTransLoc;

        PriceDiscTable      PriceDiscTableLoc;

        //FormDataSource      priceDiscAdmTrans_ds    = this;

        //PriceDiscTable      PriceDiscTableBuff      = this.cursor();

        FormRun             formrun                 = this.formRun();

        FalseTrue           fasleTrue               = FalseTrue::False;


        select firstonly JournalNum, DefaultRelation from priceDiscAdmTableLoc

            join recid, JournalNum from priceDiscAdmTransLoc

                where priceDiscAdmTableLoc.JournalNum == priceDiscAdmTransLoc.JournalNum

            join OriginalPriceDiscAdmTransRecId from PriceDiscTableLoc

                where  PriceDiscTableLoc.OriginalPriceDiscAdmTransRecId == priceDiscAdmTransLoc.recid

                && priceDiscAdmTableLoc.DefaultRelation == PriceType::GOPPromotionalItemSales;

        if (priceDiscAdmTableLoc.JournalNum && PriceDiscTableLoc.OriginalPriceDiscAdmTransRecId)

        {

            fasleTrue = FalseTrue::True;

            formRun.control(FormRun.controlId(formControlStr(PriceDiscTable, GOPQuantity))).visible(fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscTable, GOPPromotionalItemCode))).visible(fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscTable, GOPPromotionalItemQuantity))).visible(fasleTrue);


            formRun.control(FormRun.controlId(formControlStr(PriceDiscTable, PriceDiscTable_QuantityAmountFrom))).visible(!fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscTable, PriceDiscTable_QuantityAmountTo))).visible(!fasleTrue);

            //formRun.control(FormRun.controlId(formControlStr(PriceDiscTable, PriceDiscTable_GOPTransferCost))).visible(!fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscTable, PriceDiscTable_Amount))).visible(!fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscTable, PriceDiscTable_Currency))).visible(!fasleTrue);

        }

        return next active();

    }


}




/// <summary>

/// The <c>GOPPriceGroupTypeTradeAgreementMappingSalesQtyPromo</c> class is handling the mapping of fields, module and other types for <c>PriceGroupType</c> line discount.

/// </summary>

[PriceGroupTypeFactory(PriceGroupType::GOPPromotionalItemSalesLineDisc)]

class GOPPriceGroupTypeTradeAgreementMappingSalesQtyPromo extends PriceGroupTypeTradeAgreementMapping

{

    public PriceType priceDiscType(ModuleInventCustVend _module)

    {

        PriceType PriceType;

        switch (_module)

        {

            case ModuleInventCustVend::Cust:

                PriceType = PriceType::GOPPromotionalItemSales;

        }

        return PriceType;

    }


}


/// <summary>

/// The <c>PriceTypeConverter</c> class provides method for conversion price type to price group type.

/// </summary>

[ExtensionOf(classStr(PriceTypeConverter))]

final class MMMPriceTypeConverter_Extension

{

    /// <summary>

    /// Converts a price type value to its corresponding price group type value.

    /// </summary>

    /// <param name = "_priceType">A price type.</param>

    /// <returns>Price group type which corresponds to price type.</returns>

    public static PriceGroupType priceTypeToPriceGroupType(PriceType _priceType)

    {

        PriceGroupType priceGroupType;

        priceGroupType = next priceTypeToPriceGroupType(_priceType);

        switch (_priceType)

        {

            case PriceType::MMMPromotionalItemSales:

                priceGroupType = PriceGroupType::MMMPromotionalItemSalesLineDisc;

        }

        return priceGroupType;

        

    }


    /// <summary>

    /// Repalced to avoid the error

    /// Performs the default conversion from a price type value to its corresponding price group type value.

    /// </summary>

    /// <param name = "_priceType">A price type.</param>

    /// <returns>Price group type which corresponds to price type.</returns>

    protected static PriceGroupType defaultPriceTypeToPriceGroupTypeConversion(PriceType _priceType)

    {

        PriceGroupType PriceGroupType;

        if (_priceType != PriceType::MMMPromotionalItemSales)

        {

            next defaultPriceTypeToPriceGroupTypeConversion(_priceType);

        }

        return PriceGroupType;

            

    }


}

/// <summary>

/// The <c>GOPPriceTypeTradeAgreementMappingSalesQtyPromoDisc</c> class is responsible for handling mapping of the price type <c>GOPPromotionalItemSalesLineDisc</c>.

/// </summary>

[PriceTypeFactory(PriceType::GOPPromotionalItemSales)]

final class GOPPriceTypeTradeAgreementMappingSalesQtyPromoDisc extends PriceTypeTradeAgreementMappingSales

{

    /// <summary>

    /// Retrun table group

    /// </summary>

    /// <returns>TableGroupAll</returns>

    public TableGroupAll tableGroupAll()

    {

        return TableGroupAll::Table;

    }


    /// <summary>

    /// Retrun table group

    /// </summary>

    /// <returns>TableGroupAll</returns>

    public PriceDiscProductCodeType priceDiscProductCodeType()

    {

        return PriceDiscProductCodeType::Table;

    }


    /// <summary>

    /// CustTable Promotional Item Sales Line Disc

    /// </summary>

    /// <returns>Promotional Item Sales Line </returns>

    public FieldId custVendTableField()

    {

        return fieldNum(CustTable, GOPPromotionalItemSalesLineDisc);

    }


    /// <summary>

    /// InventTableModule Promotional Item Sales Line Disc

    /// </summary>

    /// <returns>Promotional Item Sales Line </returns>

   public FieldId inventTableModuleField()

    {

        return fieldNum(InventTableModule, GOPPromotionalItemSalesLineDisc);

    }


    /// <summary>

    /// Promotional Item Sales Line Disc

    /// </summary>

    /// <returns>Promotional Item Sales Line Disc</returns>

    public PriceGroupType priceGroupType()

    {

        return PriceGroupType::GOPPromotionalItemSalesLineDisc;

    }


    /// <summary>

    /// MCR LineDisc

    /// </summary>

    /// <returns>MCR LineDisc</returns>

    public MCRPriceHistoryType mcrPriceHistoryType()

    {

        return MCRPriceHistoryType::LineDisc;

    }


    /// <summary>

    /// Retrun table Disc group Applicable

    /// </summary>

    /// <returns>boolean</returns>

    public boolean isDiscGroupApplicable()

    {

        return true;

    }


    /// <summary>

    /// check for active table group

    /// </summary>

    /// <param name = "_accountCode">TableGroupAll Account relation</param>

    /// <param name = "_itemCode">TableGroupAll Item relation</param>

    /// <param name = "_priceParameters">Price Parameters</param>

    /// <returns>Yes If active</returns>

    public NoYes isActivated(

        TableGroupAll       _accountCode,

        TableGroupAll       _itemCode,

        PriceParameters     _priceParameters = PriceParameters::find())

    {

        return this.isPartyCodeProductCodeActivated(

            PriceDiscPartyCodeTypeTableGroupAllMapping::tableGroupAllToPriceDiscPartyCodeType(_accountCode),

            PriceDiscProductCodeTypeTableGroupAllMapping::tableGroupAllToPriceDiscProductCodeType(_itemCode),

            _priceParameters);

    }


    /// <summary>

    /// check for active account relation table group

    /// </summary>

    /// <param name = "_partyCode">TableGroupAll Account relation</param>

    /// <param name = "_productCode">TableGroupAll Item relation</param>

    /// <param name = "_priceParameters">Price Parameters</param>

    /// <returns>Yes If active</returns>

    

    public NoYes isPartyCodeProductCodeActivated(

        PriceDiscPartyCodeType      _partyCode,

        PriceDiscProductCodeType    _productCode,

        PriceParameters             _priceParameters = PriceParameters::find())

    {

        switch (_partyCode)

        {

            case PriceDiscPartyCodeType::Table:

                switch (_productCode)

                {

                    case PriceDiscProductCodeType::Table:

                        return _priceParameters.SalesLineAccountItem;

                    case PriceDiscProductCodeType::GroupId:

                        return _priceParameters.SalesLineAccountGroup;

                    case PriceDiscProductCodeType::All:

                        return _priceParameters.SalesLineAccountAll;

                }

                break;

            case PriceDiscPartyCodeType::GroupId:

                switch (_productCode)

                {

                    case PriceDiscProductCodeType::Table:

                        return _priceParameters.SalesLineGroupItem;

                    case PriceDiscProductCodeType::GroupId:

                        return _priceParameters.SalesLineGroupGroup;

                    case PriceDiscProductCodeType::All:

                        return _priceParameters.SalesLineGroupAll;

                }

                break;

            case PriceDiscPartyCodeType::All:

                switch (_productCode)

                {

                    case PriceDiscProductCodeType::Table:

                        return _priceParameters.SalesLineAllItem;

                    case PriceDiscProductCodeType::GroupId:

                        return _priceParameters.SalesLineAllGroup;

                    case PriceDiscProductCodeType::All:

                        return _priceParameters.SalesLineAllAll;

                }

                break;

        }


        return NoYes::No;

    }


    /// <summary>

    /// is Relation Activation Possible

    /// </summary>

    /// <param name = "_accountCode">accountCode</param>

    /// <param name = "_itemCode">itemCode</param>

    /// <returns>Yes or No</returns>

    public NoYes isActivationPossible(TableGroupAll _accountCode, TableGroupAll _itemCode)

    {

        return this.isActivationPossibleForPartyCodeProductCode(

            PriceDiscPartyCodeTypeTableGroupAllMapping::tableGroupAllToPriceDiscPartyCodeType(_accountCode),

            PriceDiscProductCodeTypeTableGroupAllMapping::tableGroupAllToPriceDiscProductCodeType(_itemCode));

    }


    /// <summary>

    /// Activation possible for Item and Account code

    /// </summary>

    /// <param name = "_partyCode">Account code</param>

    /// <param name = "_productCode">Item Code</param>

    /// <returns>No Yes based on activation </returns>

    public NoYes isActivationPossibleForPartyCodeProductCode(PriceDiscPartyCodeType _partyCode, PriceDiscProductCodeType _productCode)

    {

        return NoYes::Yes;

    }


}


form

<?xml version="1.0" encoding="utf-8"?>

<AxForm xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="Microsoft.Dynamics.AX.Metadata.V6">

<Name>GOPPromotionItemPartyCodeTypeCombination</Name>

<SourceCode>

<Methods xmlns="">

<Method>

<Name>classDeclaration</Name>

<Source><![CDATA[

    [Form]

    public class GOPPromotionItemPartyCodeTypeCombination extends FormRun

    {

}


]]></Source>

</Method>

</Methods>

<DataSources xmlns="" />

<DataControls xmlns="" />

<Members xmlns="" />

</SourceCode>

<DataSources>

<AxFormDataSource xmlns="">

<Name>GOPPromotionItemPartyCodeTypeCombination</Name>

<Table>GOPPromotionItemPartyCodeTypeCombination</Table>

<Fields>

<AxFormDataSourceField>

<DataField>DataAreaId</DataField>

</AxFormDataSourceField>

<AxFormDataSourceField>

<DataField>LineNum</DataField>

</AxFormDataSourceField>

<AxFormDataSourceField>

<DataField>Partition</DataField>

</AxFormDataSourceField>

<AxFormDataSourceField>

<DataField>PriceDiscPartyCodeType</DataField>

</AxFormDataSourceField>

<AxFormDataSourceField>

<DataField>PriceDiscProductCodeType</DataField>

</AxFormDataSourceField>

<AxFormDataSourceField>

<DataField>RecId</DataField>

</AxFormDataSourceField>

<AxFormDataSourceField>

<DataField>SysRowVersionNumber</DataField>

</AxFormDataSourceField>

<AxFormDataSourceField>

<DataField>TableId</DataField>

</AxFormDataSourceField>

</Fields>

<ReferencedDataSources />

<InsertIfEmpty>No</InsertIfEmpty>

<DataSourceLinks />

<DerivedDataSources />

</AxFormDataSource>

</DataSources>

<Design>

<Caption xmlns="">@GOP:GOPPromotionItemPartyCodeTypeCombinationSetup</Caption>

<HideIfEmpty xmlns="">No</HideIfEmpty>

<Pattern xmlns="">SimpleList</Pattern>

<PatternVersion xmlns="">1.1</PatternVersion>

<StatusBarStyle xmlns="">Simple</StatusBarStyle>

<Style xmlns="">SimpleList</Style>

<TitleDataSource xmlns="">GOPPromotionItemPartyCodeTypeCombination</TitleDataSource>

<Controls xmlns="">

<AxFormControl xmlns=""

i:type="AxFormActionPaneControl">

<Name>ActionPane</Name>

<ElementPosition>715827882</ElementPosition>

<FilterExpression>%1</FilterExpression>

<Type>ActionPane</Type>

<VerticalSpacing>-1</VerticalSpacing>

<FormControlExtension

i:nil="true" />

<Controls />

<AlignChild>No</AlignChild>

<AlignChildren>No</AlignChildren>

<ArrangeMethod>Vertical</ArrangeMethod>

</AxFormControl>

<AxFormControl xmlns=""

i:type="AxFormGroupControl">

<Name>FilterGroup</Name>

<Pattern>CustomAndQuickFilters</Pattern>

<PatternVersion>1.1</PatternVersion>

<Type>Group</Type>

<WidthMode>SizeToAvailable</WidthMode>

<FormControlExtension

i:nil="true" />

<Controls>

<AxFormControl>

<Name>QuickFilterControl</Name>

<FormControlExtension>

<Name>QuickFilterControl</Name>

<ExtensionComponents />

<ExtensionProperties>

<AxFormControlExtensionProperty>

<Name>targetControlName</Name>

<Type>String</Type>

<Value>Grid</Value>

</AxFormControlExtensionProperty>

<AxFormControlExtensionProperty>

<Name>defaultColumnName</Name>

<Type>String</Type>

</AxFormControlExtensionProperty>

<AxFormControlExtensionProperty>

<Name>placeholderText</Name>

<Type>String</Type>

</AxFormControlExtensionProperty>

</ExtensionProperties>

</FormControlExtension>

</AxFormControl>

</Controls>

<ArrangeMethod>HorizontalLeft</ArrangeMethod>

<FrameType>None</FrameType>

<Style>CustomFilter</Style>

<ViewEditMode>Edit</ViewEditMode>

</AxFormControl>

<AxFormControl xmlns=""

i:type="AxFormGridControl">

<Name>Grid</Name>

<ElementPosition>1431655764</ElementPosition>

<FilterExpression>%1</FilterExpression>

<Type>Grid</Type>

<VerticalSpacing>-1</VerticalSpacing>

<FormControlExtension

i:nil="true" />

<Controls>

<AxFormControl xmlns=""

i:type="AxFormComboBoxControl">

<Name>GOPPromotionItemPartyCodeTypeCombination_PriceDiscPartyCodeType</Name>

<Type>ComboBox</Type>

<FormControlExtension

i:nil="true" />

<DataField>PriceDiscPartyCodeType</DataField>

<DataSource>GOPPromotionItemPartyCodeTypeCombination</DataSource>

<Items />

</AxFormControl>

<AxFormControl xmlns=""

i:type="AxFormComboBoxControl">

<Name>GOPPromotionItemPartyCodeTypeCombination_PriceDiscProductCodeType</Name>

<Type>ComboBox</Type>

<FormControlExtension

i:nil="true" />

<DataField>PriceDiscProductCodeType</DataField>

<DataSource>GOPPromotionItemPartyCodeTypeCombination</DataSource>

<Items />

</AxFormControl>

<AxFormControl xmlns=""

i:type="AxFormIntegerControl">

<Name>GOPPromotionItemPartyCodeTypeCombination_LineNum</Name>

<Type>Integer</Type>

<FormControlExtension

i:nil="true" />

<DataField>LineNum</DataField>

<DataSource>GOPPromotionItemPartyCodeTypeCombination</DataSource>

</AxFormControl>

</Controls>

<AlternateRowShading>No</AlternateRowShading>

<DataSource>GOPPromotionItemPartyCodeTypeCombination</DataSource>

<MultiSelect>No</MultiSelect>

<ShowRowLabels>No</ShowRowLabels>

<Style>Tabular</Style>

</AxFormControl>

</Controls>

</Design>

<Parts />

</AxForm>


<?xml version="1.0" encoding="utf-8"?>

<AxTable xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

<Name>GOPPromotionItemPartyCodeTypeCombination</Name>

<SourceCode>

<Declaration><![CDATA[

public class GOPPromotionItemPartyCodeTypeCombination extends common

{

}

]]></Declaration>

<Methods>

<Method>

<Name>find</Name>

<Source><![CDATA[

    /// <summary>

    /// Find method to

    /// </summary>

    /// <param name = "_PriceDiscProductCodeType"></param>

    /// <param name = "_PriceDiscPartyCodeType"></param>

    /// <returns>return GOPPromotionItemPartyCodeTypeCombinationtable buffer</returns>

    static GOPPromotionItemPartyCodeTypeCombination find(PriceDiscProductCodeType _PriceDiscProductCodeType, PriceDiscPartyCodeType _PriceDiscPartyCodeType)

    {

        GOPPromotionItemPartyCodeTypeCombination promotionItemPratyCodeTypeCombination;

        select firstonly promotionItemPratyCodeTypeCombination

            index hint AccountIAndItemPratyCodeTypeCombinationIdx

            where promotionItemPratyCodeTypeCombination.PriceDiscPartyCodeType == _PriceDiscPartyCodeType

            && promotionItemPratyCodeTypeCombination.PriceDiscProductCodeType == _PriceDiscProductCodeType;


        return promotionItemPratyCodeTypeCombination;

    }


]]></Source>

</Method>

<Method>

<Name>incrementLineNumber</Name>

<Source><![CDATA[

    /// <summary>

    /// to increment the number and to maintain the product & party code sequency

    /// </summary>

    private void incrementLineNumber()

    {

        GOPPromotionItemPartyCodeTypeCombination    incrementLineNum;


        select firstonly LineNum from incrementLineNum

            order by incrementLineNum.lineNum desc;

        this.LineNum = incrementLineNum.LineNum+1;

    }


]]></Source>

</Method>

<Method>

<Name>initValue</Name>

<Source><![CDATA[

    /// <summary>

    /// to increment the number and to maintain the product & party code sequency

    /// </summary>

    public void initValue()

    {

        super();

        this.incrementLineNumber();

    }


]]></Source>

</Method>

</Methods>

</SourceCode>

<DeveloperDocumentation>@GOP:GOPPromotionItemPartyCodeTypeCombinationSetup</DeveloperDocumentation>

<FormRef>GOPPromotionItemPartyCodeTypeCombination</FormRef>

<Label>@GOP:GOPPromotionItemPartyCodeTypeCombinationSetup</Label>

<TableGroup>Group</TableGroup>

<TitleField1>PriceDiscPartyCodeType</TitleField1>

<TitleField2>PriceDiscProductCodeType</TitleField2>

<CacheLookup>EntireTable</CacheLookup>

<ClusteredIndex></ClusteredIndex>

<CreateRecIdIndex>No</CreateRecIdIndex>

<Modules>SalesAndMarketing</Modules>

<PrimaryIndex>AccountIAndItemPratyCodeTypeCombinationIdx</PrimaryIndex>

<DeleteActions>

<AxTableDeleteAction>

<Name>PriceDiscAdmTable</Name>

<DeleteAction>Restricted</DeleteAction>

<Relation></Relation>

<Table>PriceDiscAdmTable</Table>

</AxTableDeleteAction>

</DeleteActions>

<FieldGroups>

<AxTableFieldGroup>

<Name>AutoReport</Name>

<Fields>

<AxTableFieldGroupField>

<DataField>PriceDiscPartyCodeType</DataField>

</AxTableFieldGroupField>

<AxTableFieldGroupField>

<DataField>PriceDiscProductCodeType</DataField>

</AxTableFieldGroupField>

<AxTableFieldGroupField>

<DataField>LineNum</DataField>

</AxTableFieldGroupField>

</Fields>

</AxTableFieldGroup>

<AxTableFieldGroup>

<Name>AutoLookup</Name>

<Fields />

</AxTableFieldGroup>

<AxTableFieldGroup>

<Name>AutoIdentification</Name>

<AutoPopulate>Yes</AutoPopulate>

<Fields />

</AxTableFieldGroup>

<AxTableFieldGroup>

<Name>AutoSummary</Name>

<Fields />

</AxTableFieldGroup>

<AxTableFieldGroup>

<Name>AutoBrowse</Name>

<Fields />

</AxTableFieldGroup>

<AxTableFieldGroup>

<Name>Defaults</Name>

<Label>@SYS334126</Label>

<Fields />

</AxTableFieldGroup>

<AxTableFieldGroup>

<Name>Identification</Name>

<Label>@SYS5711</Label>

<Fields>

<AxTableFieldGroupField>

<DataField>PriceDiscPartyCodeType</DataField>

</AxTableFieldGroupField>

<AxTableFieldGroupField>

<DataField>PriceDiscProductCodeType</DataField>

</AxTableFieldGroupField>

</Fields>

</AxTableFieldGroup>

</FieldGroups>

<Fields>

<AxTableField xmlns=""

i:type="AxTableFieldEnum">

<Name>PriceDiscPartyCodeType</Name>

<AllowEdit>No</AllowEdit>

<Mandatory>Yes</Mandatory>

<EnumType>PriceDiscPartyCodeType</EnumType>

</AxTableField>

<AxTableField xmlns=""

i:type="AxTableFieldEnum">

<Name>PriceDiscProductCodeType</Name>

<AllowEdit>No</AllowEdit>

<Mandatory>Yes</Mandatory>

<EnumType>PriceDiscProductCodeType</EnumType>

</AxTableField>

<AxTableField xmlns=""

i:type="AxTableFieldInt">

<Name>LineNum</Name>

<AllowEdit>No</AllowEdit>

<AllowEditOnCreate>No</AllowEditOnCreate>

<ExtendedDataType>Integer</ExtendedDataType>

<IgnoreEDTRelation>Yes</IgnoreEDTRelation>

<Label>@SYS101704</Label>

</AxTableField>

</Fields>

<FullTextIndexes />

<Indexes>

<AxTableIndex>

<Name>AccountIAndItemPratyCodeTypeCombinationIdx</Name>

<AlternateKey>Yes</AlternateKey>

<Fields>

<AxTableIndexField>

<DataField>PriceDiscPartyCodeType</DataField>

</AxTableIndexField>

<AxTableIndexField>

<DataField>PriceDiscProductCodeType</DataField>

</AxTableIndexField>

</Fields>

</AxTableIndex>

</Indexes>

<Mappings />

<Relations />

<StateMachines />

</AxTable>


/// <summary>

/// Form EventHandler for trade agreement Journal lines(PriceDiscAdmTrans - Datasource)

/// </summary>

[ExtensionOf(formDataSourceStr(PriceDiscAdm, PriceDiscAdmTrans))]

final class MMMPriceDiscAdmTransDSForm_Extension

{

    /// <summary>

    /// COC to enable & hide the controls based on the Trade agrement PriceType(Promotional item (Sales))

    /// </summary>

    /// <returns>boolean true or fasle</returns>

    public int active()

    {

        PriceDiscAdmTable   priceDiscAdmTableLoc;

        //FormDataSource      priceDiscAdmTrans_ds    = this;

        PriceDiscAdmTrans   priceDiscAdmTransLoc    = this.cursor();

        FormRun             formrun                 = this.formRun();

        FalseTrue           fasleTrue               = FalseTrue::False;


        select firstonly JournalNum, DefaultRelation from priceDiscAdmTableLoc

            where priceDiscAdmTableLoc.JournalNum == priceDiscAdmTransLoc.JournalNum

                && priceDiscAdmTableLoc.DefaultRelation == PriceType::MMMPromotionalItemSales;

        if (priceDiscAdmTableLoc.JournalNum)

        {

            fasleTrue = FalseTrue::True;

            formRun.control(FormRun.controlId(formControlStr(PriceDiscAdm, MMMQuantity))).visible(fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscAdm, MMMPromotionalItemCode))).visible(fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscAdm, MMMPromotionalItemQuantity))).visible(fasleTrue);


            formRun.control(FormRun.controlId(formControlStr(PriceDiscAdm, PriceDiscAdmTrans_QuantityAmountFrom))).visible(!fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscAdm, PriceDiscAdmTrans_QuantityAmountTo))).visible(!fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscAdm, PriceDiscAdmTrans_MMMTransferCost))).visible(!fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscAdm, Amount))).visible(!fasleTrue);

            formRun.control(FormRun.controlId(formControlStr(PriceDiscAdm, PriceDiscAdmTrans_Currency))).visible(!fasleTrue);

        }

        return next active();

    }


}


/// <summary>

/// Extended class for mapping customized field

/// </summary>

[ExtensionOf(classStr(PriceDiscTableCopyFromPriceDiscAdmTrans))]

final class MMMPriceDiscTableCopyFromPriceDiscAdmTrans_Extension

{

    /// <summary>

    /// Extended initFieldMapping() method to map MMMTransferCost from PriceDiscAdmTrans to PriceDiscTable 

    /// </summary>

    protected void initFieldMapping()

    {


        next initFieldMapping();


        this.insertFieldMap(this.priceDiscAdmTransDatasourceId(), tableNum(PriceDiscAdmTrans), fieldNum(PriceDiscAdmTrans, SolvMUF), tableNum(PriceDiscTable), fieldNum(PriceDiscTable, SolvMUF));

        this.insertFieldMap(this.priceDiscAdmTransDatasourceId(), tableNum(PriceDiscAdmTrans), fieldNum(PriceDiscAdmTrans, MMMTransferCost), tableNum(PriceDiscTable), fieldNum(PriceDiscTable, MMMTransferCost));

        this.insertFieldMap(this.priceDiscAdmTransDatasourceId(), tableNum(PriceDiscAdmTrans), fieldNum(PriceDiscAdmTrans, MMMPromotionalItemQuantity), tableNum(PriceDiscTable), fieldNum(PriceDiscTable, MMMPromotionalItemQuantity));

        this.insertFieldMap(this.priceDiscAdmTransDatasourceId(), tableNum(PriceDiscAdmTrans), fieldNum(PriceDiscAdmTrans, MMMPromotionalItemCode), tableNum(PriceDiscTable), fieldNum(PriceDiscTable, MMMPromotionalItemCode));

        this.insertFieldMap(this.priceDiscAdmTransDatasourceId(), tableNum(PriceDiscAdmTrans), fieldNum(PriceDiscAdmTrans, MMMQuantity), tableNum(PriceDiscTable), fieldNum(PriceDiscTable, MMMQuantity));

    }


}


/// <summary>

/// Event handler for sales line

/// </summary>

internal final class MMMSalesLineTableEventHandler

{

    AmountQty               Quantity = 0.00, PromotionalItemQuantity = 0.00;

    ItemId                  PromotionalItemCode = '';

    RefRecId                salesOrderLineRecId;

    FalseTrue               isMatchingPriceDiscTableFound;

    UnitOfMeasureSymbol     unitId;

    

    


    /// <summary>

    /// To create a new Sales order line based on the Item qty & Price type(Promotional item (Sales))

    /// </summary>

    /// <param name="sender">table buffer</param>

    /// <param name="e">Event that occure on this moment(insert)</param>

    [DataEventHandler(tableStr(SalesLine), DataEventType::Inserted)]

    public static void SalesLine_onInserted(Common sender, DataEventArgs e)

    {

        MMMPromotionItemPartyCodeTypeCombination    promotionItemPartyCodeTypeCombination;

        MMMSalesLineTableEventHandler   mmmSalesLineTable = new MMMSalesLineTableEventHandler();

        SalesLine                       salesLine                       = sender as SalesLine;

        FalseTrue                       isMatchingPriceDiscTableFound   = FalseTrue::False;


        if (salesLine.MMMIsPromotionalItemSales == NoYes::No)

        {

            while select promotionItemPartyCodeTypeCombination

            {

                if (isMatchingPriceDiscTableFound == FalseTrue::False )

                {

                    isMatchingPriceDiscTableFound 

                        = mmmSalesLineTable.creatPromoSLFrom_PartyAndProductCodeType(salesLine,

                                                                                    promotionItemPartyCodeTypeCombination.PriceDiscProductCodeType, 

                                                                                    promotionItemPartyCodeTypeCombination.PriceDiscPartyCodeType);

                }

            }

            if (isMatchingPriceDiscTableFound == FalseTrue::True)

            {

                salesLine.MMMIsPromotionalItemExistforSalesLine = NoYes::Yes;

            }

        }


        if(InventTable::find(salesLine.ItemId).MMMDlvMode)

        {

            salesLine.MMMDlvMode    = InventTable::find(salesLine.ItemId).MMMDlvMode;

        }

        else

        {

            if(VendGroup::find(VendTable::find(InventTable::find(salesLine.ItemId).PrimaryVendorId).VendGroup).MMMDlvMode)

            {

                salesLine.MMMDlvMode    = VendGroup::find(VendTable::find(InventTable::find(salesLine.ItemId).PrimaryVendorId).VendGroup).MMMDlvMode;

            }

        }


       /// #ISOCountryRegionCodes

       /// if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoCO,#isoCL]))

       /// {

       ///     salesLine.SolvCOC = InventTable::find(salesLine.ItemId).SolvCOC;

       /// }

    }


    /// <summary>

    /// To create a new Sales order line based on the Item qty & Price type(Promotional item (Sales)) 

    /// </summary>

    /// <param name="sender">Table buffer</param>

    /// <param name="e">Event that occure on this moment(Update)</param>

    [DataEventHandler(tableStr(SalesLine), DataEventType::Updated)]

    public static void SalesLine_onUpdated(Common sender, DataEventArgs e)

    {

        SalesLine                       SalesLineLoc;

        

        MMMPromotionItemPartyCodeTypeCombination    promotionItemPartyCodeTypeCombination;

        MMMSalesLineTableEventHandler   mmmSalesLineTable = new MMMSalesLineTableEventHandler();;

        SalesLine                       salesLine                       = sender as SalesLine;

        FalseTrue                       isMatchingPriceDiscTableFound   = FalseTrue::False;

        if (salesLine.MMMIsPromotionalItemSales == NoYes::No && salesLine.orig().salesQty != salesLine.SalesQty)

        {

            while select promotionItemPartyCodeTypeCombination

            {

                if (isMatchingPriceDiscTableFound == FalseTrue::False )

                {

                    ttsbegin;

                    select firstonly forupdate salesLineLoc

                        where salesLineLoc.MMMParentSLItemRecIDForPromotional == salesLine.RecId;

                    if (salesLineLoc)

                    {

                        salesLineLoc.MMMIsPromotionalItemSales = NoYes::No;

                        salesLineLoc.update();

                        salesLineLoc.delete();

                    }

                    ttscommit;


                    isMatchingPriceDiscTableFound 

                        = mmmSalesLineTable.creatPromoSLFrom_PartyAndProductCodeType(salesLine,

                                                                                    promotionItemPartyCodeTypeCombination.PriceDiscProductCodeType,

                                                                                    promotionItemPartyCodeTypeCombination.PriceDiscPartyCodeType);

                }

            }


            if (isMatchingPriceDiscTableFound == FalseTrue::True)

            {

                salesLine.MMMIsPromotionalItemExistforSalesLine = NoYes::Yes;

            }

        }


        if(InventTable::find(salesLine.ItemId).MMMDlvMode)

        {

            salesLine.MMMDlvMode    = InventTable::find(salesLine.ItemId).MMMDlvMode;

        }

        else

        {

            if(VendGroup::find(VendTable::find(InventTable::find(salesLine.ItemId).PrimaryVendorId).VendGroup).MMMDlvMode)

            {

                salesLine.MMMDlvMode    = VendGroup::find(VendTable::find(InventTable::find(salesLine.ItemId).PrimaryVendorId).VendGroup).MMMDlvMode;

            }

        }


       /// #ISOCountryRegionCodes

      ///  if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoCO,#isoCL]))

      ///  {

      ///      salesLine.SolvCOC = InventTable::find(salesLine.ItemId).SolvCOC;

      ///  }

    }


    /// <summary>

    /// TO create Sales line based on promotional tradeagrement

    /// </summary>

    /// <param name = "_salesLine">Sales Line buffer</param>

    /// <param name = "_PriceDiscProductCodeType">Item relation</param>

    /// <param name = "_PriceDiscPartyCodeType">Account relation</param>

    /// <returns>Returns true if Sales order line is created</returns>

    public FalseTrue creatPromoSLFrom_PartyAndProductCodeType(SalesLine _salesLine,

                                                                PriceDiscProductCodeType _PriceDiscProductCodeType, 

                                                                PriceDiscPartyCodeType _PriceDiscPartyCodeType)

    {

        PriceDiscTable                  PriceDiscTableLoc;

        isMatchingPriceDiscTableFound   = FalseTrue::False;

        

        PriceDiscTableLoc= this.getPricDiscTablebuffer(_salesLine,

                                                        _PriceDiscProductCodeType,

                                                        _PriceDiscPartyCodeType);

        if (PriceDiscTableLoc.MMMQuantity && PriceDiscTableLoc.MMMPromotionalItemQuantity && PriceDiscTableLoc.MMMPromotionalItemCode)

        {

            salesOrderLineRecId = this.creatSalesLineForMMMPromotionalItem(_salesLine, PriceDiscTableLoc.MMMQuantity,

                                                                            PriceDiscTableLoc.MMMPromotionalItemQuantity,

                                                                            PriceDiscTableLoc.MMMPromotionalItemCode);

            if (salesOrderLineRecId)

            {

                isMatchingPriceDiscTableFound = FalseTrue::True;

            }

        }

        return isMatchingPriceDiscTableFound;

    }


    /// <summary>

    /// to crete a promotional sales line Item

    /// </summary>

    /// <param name = "_salesLine">Sales Line buffer</param>

    /// <param name = "_MMMQuantity">Sales line Parent Item Qty</param>

    /// <param name = "_MMMPromotionalItemQuantity">Sales line Promotional Item Qty </param>

    /// <param name = "_MMMPromotionalItemCode">Sales line Promotional Item</param>

    /// <returns>Returns true if Sales order line is created</returns>

    public RefRecId creatSalesLineForMMMPromotionalItem(salesLine _salesLine, AmountQty _MMMQuantity, AmountQty _MMMPromotionalItemQuantity, ItemId _MMMPromotionalItemCode)

    {

        salesLine                           salesLineLoc;

        SalesTable                          salesTableloc;

        

        ttsbegin;

        salesLineLoc.clear();

        salesLineLoc.SalesId = _salesLine.SalesId;

        salesTableloc = salesTable::find(_salesLine.SalesId);


        salesLineLoc.initValue(salesTableloc.SalesType);

        salesLineLoc.initFromSalesTable(salesTableloc);

        salesLineLoc.initFromInventTable(InventTable::find(_mmmPromotionalItemCode));

        salesLineLoc.ItemId             = _mmmPromotionalItemCode;

        salesLineLoc.SalesQty           = (_MMMPromotionalItemQuantity * (trunc(_salesLine.SalesQty / _MMMQuantity)));

        salesLineLoc.salesQtyModified();

        salesLineLoc.SalesPrice         = 0.00;

        salesLineLoc.LineAmount         = 0.00;

        SalesLineloc.MMMIsPromotionalItemSales = NoYes::Yes; 

        salesLineLoc.MMMParentPromotionalItemCode = _salesLine.ItemId;

        salesLineLoc.MMMParentPromotionalItemLineNum = _salesLine.LineNum;

        salesLineLoc.MMMParentQuantity = _salesLine.SalesQty;

        salesLineLoc.MMMParentSLItemRecIDForPromotional = _salesLine.RecId;

        

        salesLineLoc.createLine(true, true, true, true, true, true, true, true, false, false, false);

        

        ttsCommit;

        return salesLineLoc.RecId;

    }


    /// <summary>

    /// to delete the Promotional sales line

    /// </summary>

    /// <param name="sender">Table buffer</param>

    /// <param name="e">Delete event</param>

    [DataEventHandler(tableStr(SalesLine), DataEventType::Deleting)]

    public static void SalesLine_onDeleted(Common sender, DataEventArgs e)

    {

        SalesLine   salesLineLoc;   

        SalesLine   salesLine       = sender as SalesLine;


        if (salesLine.MMMIsPromotionalItemExistforSalesLine == NoYes::Yes) 

        {

            ttsbegin;

            select firstonly forupdate salesLineLoc

                where salesLineLoc.MMMParentSLItemRecIDForPromotional == salesLine.RecId;

            if (salesLineLoc)

            {

                salesLineLoc.MMMIsPromotionalItemSales = NoYes::No;

                salesLineLoc.update();

                salesLineLoc.delete();

            }

            ttscommit;

        }

        if (salesLine.MMMIsPromotionalItemSales == NoYes::Yes)

        {

            select firstonly * from salesLineLoc

                where salesLineLoc.MMMParentSLItemRecIDForPromotional == salesLine.RecId;

            throw Error(strFmt("@MMM:DeletePromotionalItemQuantityError",salesLineLoc.MMMParentPromotionalItemCode, salesLineLoc.ItemId));

        }

    }


    /// <summary>

    /// To get Item Relation

    /// </summary>

    /// <param name = "_itemId">itemId</param>

    /// <param name = "_unitId">unitId</param>

    /// <param name = "_PriceDiscProductCodeType">Item Code Type</param>

    /// <returns>Return type of relation </returns>

    public PriceDiscItemRelation getItemRelation(ItemId _itemId,UnitOfMeasureSymbol _unitId, PriceDiscProductCodeType _PriceDiscProductCodeType)

    {   

        PriceDiscItemRelation itemRelation;

        if (PriceDiscProductCodeType::Table == _PriceDiscProductCodeType)

        {

            itemRelation = _ItemId;

            unitId = _unitId;

        }

        else if (PriceDiscProductCodeType::GroupId == _PriceDiscProductCodeType)

        {

            itemRelation = InventTableModule::find(_ItemId, ModuleInventPurchSales::Sales).MMMPromotionalItemSalesLineDisc;

            unitId = '';

        }

        else if (PriceDiscProductCodeType::All == _PriceDiscProductCodeType)

        {

            itemRelation = '';

            unitId = '';

        }

        return itemRelation;

    }


    /// <summary>

    /// To get Account Relation

    /// </summary>

    /// <param name = "_CustAccount">Account</param>

    /// <param name = "_PriceDiscPartyCodeType">Account Code Type</param>

    /// <returns></returns>

    public PriceDiscAccountRelation getAccountRelation(AccountNum _CustAccount, PriceDiscPartyCodeType _PriceDiscPartyCodeType)

    {

        PriceDiscAccountRelation accountRelation;

        if (PriceDiscPartyCodeType::Table == _PriceDiscPartyCodeType)

        {

            accountRelation = _CustAccount;

        }

        else if (PriceDiscPartyCodeType::GroupId == _PriceDiscPartyCodeType)

        {

            accountRelation = CustTable::find(_CustAccount).CustGroup;

        }

        else if (PriceDiscPartyCodeType::All == _PriceDiscPartyCodeType)

        {

            accountRelation = '';

        }

        return accountRelation;

    }


    /// <summary>

    /// to find record in Pric discount table

    /// </summary>

    /// <param name = "_salesLine">Buffer</param>

    /// <param name = "_PriceDiscProductCodeType">Item Code Type</param>

    /// <param name = "_PriceDiscPartyCodeType">Account Code Type</param>

    /// <returns>return Price discount table buffer</returns>

    public PriceDiscTable getPricDiscTablebuffer(SalesLine _salesLine,

                                                    PriceDiscProductCodeType _PriceDiscProductCodeType,

                                                    PriceDiscPartyCodeType _PriceDiscPartyCodeType)

    {

        PriceDiscAdmTrans           priceDiscAdmTransloc;

        PriceDiscAdmTable           priceDiscAdmTableLoc;

        PriceDiscTable              PriceDiscTableLoc;

        FromDate                    salesLineCreatedDate;

        PriceDiscItemRelation       itemRelation;

        PriceDiscAccountRelation    accountRelation;

        InventDim                   inventDim;

        

        //isMatchingPriceDiscTableFound   = FalseTrue::False;

        Quantity                        = 0.00;

        PromotionalItemQuantity         = 0.00;

        PromotionalItemCode             = '';

        salesLineCreatedDate            = DateTimeUtil::date(_salesLine.CreatedDateTime);



        itemRelation    = this.getItemRelation(_salesLine.ItemId, _salesLine.SalesUnit, _PriceDiscProductCodeType);

        accountRelation = this.getAccountRelation(_salesLine.CustAccount, _PriceDiscPartyCodeType);


        select FromDate, TODATE, AccountRelation, AccountCode, ItemCode, ItemRelation, MMMQuantity, MMMPromotionalItemCode, MMMPromotionalItemQuantity,

                    relation, UnitId, InventDimId, RecId from  PriceDiscTableLoc

                order by MMMQuantity desc, ToDate asc, fromDate asc

            join priceDiscAdmTransloc

                where priceDiscAdmTransloc.RECID == PriceDiscTableLoc.OriginalPriceDiscAdmTransRecId

            join JournalNum from priceDiscAdmTableLoc

                where priceDiscAdmTableLoc.JournalNum == priceDiscAdmTransloc.JournalNum

            join InventLocationId, InventSiteId, inventDimId from inventDim

                where inventDim.InventDimId == PriceDiscTableLoc.InventDimId

                    &&  PriceDiscTableLoc.relation == PriceType::MMMPromotionalItemSales

                    && PriceDiscTableLoc.ItemCode == _PriceDiscProductCodeType

                    && PriceDiscTableLoc.ItemRelation == itemRelation

                    && PriceDiscTableLoc.AccountCode == _PriceDiscPartyCodeType

                    && PriceDiscTableLoc.AccountRelation == accountRelation

                    && PriceDiscTableLoc.UnitId == unitId

                    //&& PriceDiscTableLoc.InventDimId == _salesLine.InventDimId

                    && ( PriceDiscTableLoc.FromDate <= salesLineCreatedDate

                            && PriceDiscTableLoc.ToDate >= salesLineCreatedDate)

                    && PriceDiscTableLoc.MMMQuantity <= _salesLine.SalesQty

                    && PriceDiscTableLoc.MMMQuantity != 0.00

                    && PriceDiscTableLoc.MMMPromotionalItemQuantity != 0.00

                    && PriceDiscTableLoc.MMMPromotionalItemCode != '';

        if (inventDim.inventDimId == 'AllBlank')

        {

            return PriceDiscTableLoc;

        }

        else if (inventDim.inventDimId == _salesLine.InventDimId)

        {

            priceDiscAdmTransloc.clear();

            priceDiscAdmTableLoc.clear();

            PriceDiscTableLoc.clear();

            inventDim.clear();


            select FromDate, TODATE, AccountRelation, AccountCode, ItemCode, ItemRelation, MMMQuantity, MMMPromotionalItemCode, MMMPromotionalItemQuantity,

                    relation, UnitId, InventDimId, RecId from  PriceDiscTableLoc

                order by MMMQuantity desc, ToDate asc, fromDate asc

            join priceDiscAdmTransloc

                where priceDiscAdmTransloc.RECID == PriceDiscTableLoc.OriginalPriceDiscAdmTransRecId

            join JournalNum from priceDiscAdmTableLoc

                where priceDiscAdmTableLoc.JournalNum == priceDiscAdmTransloc.JournalNum

            join InventLocationId, InventSiteId, inventDimId from inventDim

                where inventDim.InventDimId == PriceDiscTableLoc.InventDimId

                    &&  PriceDiscTableLoc.relation == PriceType::MMMPromotionalItemSales

                    && PriceDiscTableLoc.ItemCode == _PriceDiscProductCodeType

                    && PriceDiscTableLoc.ItemRelation == itemRelation

                    && PriceDiscTableLoc.AccountCode == _PriceDiscPartyCodeType

                    && PriceDiscTableLoc.AccountRelation == accountRelation

                    && PriceDiscTableLoc.UnitId == unitId

                    //&& PriceDiscTableLoc.InventDimId == _salesLine.InventDimId

                    && ( PriceDiscTableLoc.FromDate <= salesLineCreatedDate

                            && PriceDiscTableLoc.ToDate >= salesLineCreatedDate)

                    && PriceDiscTableLoc.MMMQuantity <= _salesLine.SalesQty

                    && PriceDiscTableLoc.MMMQuantity != 0.00

                    && PriceDiscTableLoc.MMMPromotionalItemQuantity != 0.00

                    && PriceDiscTableLoc.MMMPromotionalItemCode != ''

                    && PriceDiscTableLoc.MMMPromotionalItemCode != ''

                    && inventDim.InventDimId == _salesLine.InventDimId;

        }

        return PriceDiscTableLoc;

    }


}

Comments

Popular posts from this blog

Sample integration

Create ledger journals in D365FO using X++ + LedgerDimensionACType