Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Lab Info

Lesson: Product Discount Data Management (Standalone Custom Form)

Target Audience: Certified Configuration Engineer

Estimated Time to complete: TBD

Requirements & Solution Author: Petr Rys

Solution Developer & Lab Author: Marcin Ɓuczakuczak

User Story / Requirements

Create a standalone Custom Form to help pricing managers manage discounts per Product Groups and Families.
Product Group is part of Product Master, Product Family is assigned per Product Group.

...

Anchor
Details
Details
isMissingRequiredParameterstrue
Details

Product Discount Data Management Custom Form allows user to perform these tasks:

Change Data - Pick a table, Change values in the table, without adding any rows

Add new Product Group - Add a group, Assign it to the product family, Assign to it all the required discounts for all the required levels

Discount for each additional level has to be >= to the previous level, otherwise validation fails

Add a product family - Re assign product groups to reflect new Product Family,

Add new discount level to existing product family - Create new discount levels. Levels must be continuous.

...

Assign new discounts for new levels. Discount for each additional level has to be >= to the previous level, otherwise validation fails

Learning Outcomes

At the end of the Lab, you should be able to:

  • Create Standalone Custom Form, Custom Form Type

  • Utilize Input Matrix as Custom Form input

  • Understand Custom Forms Workflow

Provided resources

Logics:

sCFO_ProductDiscountLib

...

ProductFamilyMapping, DiscountLevelDefinition, Discount

Acceptance Criteria

  • User can access a standalone Custom Form within the Analytics section to complete tasks listed in the Details section.

...

  • After the user submits the form, changes should be saved in the corresponding company parameter tables. If a workflow has been added to the form, the changes should be saved after approval.

  • Sample solution

...

Step-by-step solution

Develop the logic and test in Studio

  1. Go to the Pricefx Studio and create the following logics.

...

Task

Code samples

Get user inputs from current item assign it to inputs variable

Code Block
api.currentItem()?.inputs?.get(0)?.value

Get individual field values from user inputs:

Code Block
inputs?.get("managementOptionsInput")

Get "Discount" lookup table Id assign it to the discountID variable.

Code Block
def discountID = api.findLookupTable("Discount").id

Create filters:

  • 'ProductGroup' equal oldName

  • 'lookupTable.id' equal discountID

Code Block
def discountFilters = [
        Filter.equal("ProductGroup", oldName),
        Filter.equal('lookupTable.id', discountID)
]

Update "ProductFamilyMapping" lookup table. To obtain accurate data, make use of filters.

Code Block
api.find('LTV', 0, *discountFilters).collect {
    def entry = [
            lookupTableName: "ProductFamilyMapping",
            id             : it.id,
            valueType      : it.valueType,
            typedId        : it.typedId,
            name           : newName,
            value          : it.value
    ]
    api.addOrUpdate("LTV", entry)
}

Use discountEntries and update "Discount" lookup table

Code Block
discountEntries.each {
    api.addOrUpdate("MLTV2", [
            lookupTableName: "Discount",
            key1           : it["Product Group"].value,
            key2           : it["Discount Level"].value,
            attribute1     : it["Target Discount %"].value,
            attribute2     : it["Max Discount %"].value
    ])
}

Get "DiscountLevelDefinitionMatrix" table outputs from current item

Code Block
api.currentItem()?.outputs?.find { it.resultName == "DiscountLevelDefinitionMatrix" }

If output is null get an empty list

Code Block
discountLevelDefinitionTable = discountLevelDefinitionTable ? discountLevelDefinitionTable : []

Filter the rows in their respective tables based on the values of Map.

Code Block
def discountLevelDefinitionEntries = discountLevelDefinitionTable.result.entries.findAll { it['Product Family'] instanceof Map }

Example of a Solution

TODO: embedd solution Zip file.

References

Custom Forms (Reference)

Custom Forms Configuration How-To(s)

Unity Documentation

Custom Forms

Custom Forms General Settings

Custom Forms Header Logics

Company Parameters

Groovy API

setConfigParameter

Other

Pricefx chatbot AI

TODO: review and update articles, we have some Clover Club changes

TODO: add Model Object vs Custom Form vs Configuration Wizard into KB (now just in Product Mngt - non public)

TODO: Petr Rys

Please provide feedback for solution and Lab, partition credentials sent by teams chat