Цены и скидки в Dynamics AX 2012

При создании журналов цен/скидок в Dynamics AX 2012 применяется принцип группировки, но в основном этот принцип применим к скидкам, т.е. скидка или цена назначена определенной группе клиентов и/или на определенную группу товаров. Скидки бывают по строке, многострочные и общие. В скидках по строке группы применяются как для контрагентов, так и для продукции. В многострочных скидках принцип тот же что и по строке. В общих скидках применяются только группы по контрагентам, потому что они не зависят от продукции.

Алгоритм поиска цены

Поиск цены осуществляется в следующих разрезах данных:

— Контрагент – Продукт

— Контрагент – Все продукты

— Группа контрагентов – Продукт

— Группа контрагентов – Все продукты

— Все контрагенты – Продукт

— Все контрагенты – Все продукты

Поиск цены начинается с разреза Контрагент – Продукт и выполняется до разреза Все контрагенты – Все продукты. В случае, когда цена будет найдена, поиск будет прекращен. Цены настраиваются каждой валюты и ед. измерения отдельно.

На следующей схеме изображен алгоритм поиска цены:

Блок под цифрой 1 включает в себя 2 разреза, Контрагент – Продукт и Контрагент – Все продукты. Блок 1 разделен на два блока Продукт (1.a) и Все продукты (1.b), эти блоки и представляют собой сами разрезы. По каждому разрезу так же идет проверка количества для цены т.е. количество заказа должно удовлетворять настройкам цены, и проверка даты действия цены т.е. дата заказа входит в диапазон дат в настройках цены. Блок 2 содержит соответственно разрезы Группа контрагентов – Продукт и Группа контрагентов – Все продукты, алгоритм поиска цены аналогичен с алгоритмами блоков 1.a и 1.b соответственно. Блок 3 содержит разрезы Все контрагенты – Продукт и Все контрагенты – Все продукты, алгоритм поиска цены аналогичен с алгоритмами блоков 1.a и 1.b соответственно.

Алгоритм поиска скидки по строке

Поиск скидки по строке выполняется в разрезах данных:

— Контрагент – Продукт

— Контрагент – Группа продуктов

— Контрагент – Все продукты

— Группа контрагентов – Продукт

— Группа контрагентов – Группа продуктов

— Группа контрагентов – Все продукты

— Все контрагенты – Продукт

— Все контрагенты – Группа продуктов

— Все контрагенты – Все товары

Поиск скидки начинается с разреза Контрагент – Продукт и выполняется до разреза Все контрагенты – Все товары. В случае если для одного товара будет найдено несколько скидок, удовлетворяющих условия поиска, то они будут суммироваться, но, если в настройке скидки не проставлена галка «Найти далее», то скидка суммироваться не будет и поиск на этом будет прекращен. Скидки настраиваются отдельно для каждой валюты и единицы измерения.

На следующей схеме изображен алгоритм поиска скидки:

Блок под цифрой 1 включает в себя 3 разреза, Контрагент – Продукт, Контрагент – Группа продуктов и Контрагент – Все продукты. Блок 1 разделен на три блока Продукт (1.a), Группа продуктов (1.b) и Все продукты (1.c), эти блоки и представляют собой сами разрезы. По каждому разрезу так же идет проверка количества для цены т.е. количество заказа должно удовлетворять настройкам цены, и проверка даты действия цены т.е. дата заказа входит в диапазон дат в настройках цены. Блок 2 содержит соответственно разрезы Группа контрагентов – Продукт, Группа контрагентов – Группа продуктов и Группа контрагентов – Все продукты, алгоритм поиска цены аналогичен с алгоритмами блоков 1.a и 1.b соответственно. Блок 3 содержит разрезы Все контрагенты – Продукт, Все контрагенты – Группа продуктов и Все контрагенты – Все продукты, алгоритм поиска цены аналогичен с алгоритмами блоков 1.a и 1.b соответственно.

Алгоритм поиска многострочной скидки

Данный вид скидки зависит от нескольких позиций продуктов в заказе. При поиске таких скидок анализируются данные продуктов, принадлежащих одной группе и находящихся в одном заказе.

Поиск многострочной скидки осуществляется в следующих разрезах данных:

— Контрагент – Группа продуктов

— Контрагент – Все продукты

— Группа контрагентов – Группа продуктов

— Группа контрагентов – Все продукты

— Все контрагенты – Группа продуктов

— Все контрагенты – Группа продуктов

Поиск скидки начинается с разреза Контрагент – Группа продуктов и выполняется до разреза Все контрагенты – Все товары. В случае если для одного товара будет найдено несколько скидок, удовлетворяющих условия поиска, то они будут суммироваться, но, если в настройке скидки не проставлена галка «Найти далее», то скидка суммироваться не будет и поиск на этом будет прекращен. Скидки настраиваются отдельно для каждой валюты и единицы измерения.

Алгоритм поиска многострочной скидки немного отличается от алгоритма поиска скидки по строке. В алгоритме многострочной скидки отсутствуют блоки 1.a, 2.a, 3.a которые представляют собой разрезы Контрагент – Продукт, Группа контрагентов – Продукт и Все контрагенты – Продукт соответственно, потому что поиск многострочной скидки не зависит от одной позиции продукта в заказе.

Алгоритм поиска общей скидки

После того как скидки по строке и многострочные скидки посчитаны, определяется сумма заказа. В зависимости от суммы заказа будет определена общая скидка, т.е. общая скидка не зависит от продуктов в строках.

Поиск общей скидки выполняется в разрезах данных:

— Контрагент

— Группа контрагентов

— Все контрагенты

Поиск скидки начинается с разреза Контрагент после чего переходит к разрезу Группа контрагентов и в последнюю очередь перейдет к разрезу Все контрагенты. В случае если будет найдено несколько скидок, удовлетворяющих условия поиска, то они будут суммироваться, но, если в настройке скидки не проставлена галка «Найти далее», то скидка суммироваться не будет и поиск на этом будет прекращен. Скидки настраиваются отдельно для каждой валюты, и дата заказа должна входить в диапазон дат скидки. Кроме этого сумма общей скидки зависит от суммы заказа. Скидка будет применена к заказу только если поле Сумма в настройке скидки не будет превышать сумму заказа.

Поиск цен и скидок в коде

Класс, в котором реализован поиск цен и скидок называется PriceDisc. У него есть два наследника PriceDisc_LineDisc для работы со скидками по строке, и PriceDisc_Price для работы с ценами. Наследники по сути представляют собой классы обертки для двух методов родительского класса, т.е. класс PriceDisc_LineDisc оборачивает метод findItemLineDiscAgreement класса PriceDisc, а класс PriceDisc_Price метод findItemPriceAgreement.

Для поиска цены можно использовать метод findItemPriceAgreement класса PriceDisc, он является статическим.

static container findItemPriceAgreement(ModuleInventPurchSales      _moduleType, //продажа либо закупка
                                        ItemId                      _itemId, //продукт
                                        InventDim                   _inventDim, //складские аналитики
                                        UnitOfMeasureSymbol         _unitID, //единица измерения
                                        TransDate                   _priceDate, //дата действия цены
                                        Qty                         _qty, //количество
                                        CustVendAC                  _accountId, //контрагент
                                        CurrencyCode                _currency, //валюта
                                        PriceGroupId                _priceGroupId, //группа цен, используется в качестве группу контрагентов
                                        AgreementHeaderExtRecId_RU  _agreementHeaderExtRecId = 0, //договор
                                        CustVendAC                  _agreementPartnerCode = '' //контрагент
                                        )

Результатом выполнения его является контейнер

[
priceDisc.price(), //цена
priceDisc.markup(), //накладные расходы на цену
priceDisc.priceUnit(), //единица измерения
priceDisc.deliveryDays(), //время упреждения
priceDisc.calendarDays(), //указываются ли дни по календарю рабочих дней
priceDisc.agreementExists_RU(), //существует ли договор
priceDisc.inventBaileeFreeDays_RU(), //бесплатные дни
priceAgreementExist, //существует ли цена
priceDisc.parmPDSCalculationId(), //код ценообразования
priceDisc.parmMCRPriceDiscTableList().pack() //набор строк настроек цены
]

Для поиска скидки по строке можно использовать метод findItemLineDiscAgreement класса PriceDisc, он является статическим.

static container findItemLineDiscAgreement(ModuleInventPurchSales       _moduleType, //продажа либо закупка
                                           ItemId                       _itemId, //продукт
                                           InventDim                    _inventDim, //складские аналитики
                                           UnitOfMeasureSymbol          _unitID, //единица измерения
                                           TransDate                    _discDate, //дата действия скидки
                                           Qty                          _qty, //количество
                                           CustVendAC                   _accountId, //контрагент
                                           CurrencyCode                 _currency, //валюта
                                           LineDiscCode                 _accountLineDiscCode, //группа контрагентов
                                           InventLineDiscCode           _itemLineDiscCode, //группа продуктов
                                           AgreementHeaderExtRecId_RU   _agreementHeaderExtRecId = 0, //договор
                                           CustVendAC                   _agreementPartnerCode = '' //контрагент
                                           )

Результатом выполнения его является контейнер

[ 
priceDisc.lineDiscAmount(), //сумма скидки
priceDisc.lineDiscPct(), //сумма скидки процент
priceDisc.percent1(), //процентная скидка 1
priceDisc.percent2(), //процентная скидка 2
discAgreementExist, //существует ли скидка
priceDisc.agreementExists_RU(), //существует ли договор
priceDisc.parmMCRPriceDiscTableList().pack() //набор строк настроек скидки
]

Для поиска многострочной скидки можно использовать метод findMultiLineDiscServer класса PriceDisc, он является статическим.

public server static container findMultiLineDiscServer( ModuleInventPurchSales    _moduleType, //продажа либо закупка
                                                        ItemId                    _itemId, //продукт
                                                        InventDim                 _inventDim, //складские аналитики
                                                        UnitOfMeasureSymbol       _unitID, //единица измерения
                                                        TransDate                 _discDate, //дата действия скидки
                                                        Qty                       _qty, //количество
                                                        CustVendAC                _accountId, //контрагент
                                                        CurrencyCode              _currency, //валюта
                                                        MultiLnDiscCode           _itemMultiLnDisc, //группа продуктов
                                                        MultiLnDiscCode           _accountMultiLnDisc, //группа контрагентов
                                                        AgreementHeaderExtRecId_RU _agreementHeaderExtRecId = 0, //договор
                                                        CustVendAC                 _agreementPartnerCode = '', //контрагент
                                                        MCRPriceHistoryUpdate     _mcrPriceHistoryUpdate = null //обновить журнал цен
                                                        )

Результатом выполнения его является контейнер

[
priceDisc.getDiscAmount(), //сумма скидки
priceDisc.getDiscPercent() //процент скидки
]

Для поиска общей скидки нужно создать экземпляр класса PriceDisc и вызвать у него сначала метод findEndDisc, чтобы скидка рассчиталась, после чего с помощью метода getDiscAmount получить сумму скидки.

NoYes  findEndDisc(EndDiscCode                  endDisc, //группа контрагентов
                   AmountCur                    balanceEndDisc, //сумма для скидки
                   AgreementHeaderExtRecId_RU   _agreementHeaderExtRecId = 0, //договор
                   CustVendAC                   _agreementPartnerCode = '', //контрагент
                   AmountCur                    _totalSalesBalance = 0 //сумма заказа
                   ) 

 

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar