Цены и скидки в Dynamics AX 2012
При создании журналов цен/скидок в Dynamics AX 2012 применяется принцип группировки, но в основном этот принцип применим к скидкам, т.е. скидка или цена назначена определенной группе клиентов и/или на определенную группу товаров. Скидки бывают по строке, многострочные и общие. В скидках по строке группы применяются как для контрагентов, так и для продукции. В многострочных скидках принцип тот же что и по строке. В общих скидках применяются только группы по контрагентам, потому что они не зависят от продукции.
Contents
Алгоритм поиска цены
Поиск цены осуществляется в следующих разрезах данных:
— Контрагент – Продукт
— Контрагент – Все продукты
— Группа контрагентов – Продукт
— Группа контрагентов – Все продукты
— Все контрагенты – Продукт
— Все контрагенты – Все продукты
Поиск цены начинается с разреза Контрагент – Продукт и выполняется до разреза Все контрагенты – Все продукты. В случае, когда цена будет найдена, поиск будет прекращен. Цены настраиваются каждой валюты и ед. измерения отдельно.
На следующей схеме изображен алгоритм поиска цены:
Блок под цифрой 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!