Volume Pricing
Copyright © 2001, William Weiland
Overview
Discount your product prices based on the number of items ordered of identical products, eg 1-3 = standard price, 4-6 = lower, etc.
Initial Setup
You will install four modules (cim_vol.mvc, cim_log.mvc, prodvol.mvc, volexp.mvc). If this is an upgrade, see the note at the bottom of the master install document index

Install cim_vol.mvc
1) In admin, click Add Modules link (fig 2)
2) Click the file upload button
3) Browse to find the cim_vol.mvc file on your hard drive and upload (fig 3)
4) Click Add to add it to the domain
5) Then in admin click on the plus to the left of Stores
6) Click the plus to the left of your store name
7) Click on System Extension Configuration link (fig 9)
8) Check the box next to the Volume Pricing
9) Click Update
10) Click Pages link to get to the User Interface (fig 4)
11) Click Items link at the top of the User Interface page (fig 5)
12) Click the Add Item button (fig 6)
13) Enter cim_vol for the code (fig 8)
14) Look up and scroll to the last page of items and Volume Pricing should be at the end of the list of items
15) Select Volume Pricing
16) Click the Add button to assign the module
17) The CIM Activity Log (cim_log.mvc) may already be in your store as it is used by many of our modules. Check under the Modules link to see if it is already there. If it is there, skip to 26. If not, then go to 18.

Install cim_log.mvc
18) Again, click Add Modules link
19) Click the file upload button
20) Browse to find the cim_log.mvc file on your hard drive and upload
21) Click Add to add it to the domain
22) Click on the Logging Configuration Link
23) Check the box next to the CIM Activity Log
24) Click Update
25) Skip to 31

Update cim_log.mvc
26) Click Modules link
27) Scroll down to CIM Activity Log and click the link
28) Click the file upload button
29) Browse to find the cim_log.mvc file on your hard drive and upload
30) Click Update to update the module

Configure the module
31) Return to the System Extension Configuration screen (fig 9) and click the link for Volume Pricing to enter the configuration settings. Enter the order number and where you purchased the license from. Beginning with version 5.025 of the module you will also need to supply a license key before configuring the module. This is not the license key you may have received when you purchased the license, as some vendors have their own license system. This license key is obtained directly from Emporium Plus by clicking the link to "Request License Key" in the module's admin screen. 1) enter your order number and where you got it, 2) click Update, 3) request the key. Make sure the order number, domain, and store code are correctly inserted in the request form. The license key is based on these three elements. If you provided that info, the key will be sent back to you. After entering the key and saving, the module will be available for use in your store. The license info is stored in the cim_lic.dbf and cim_lic.mvx which are in your data "export" directory. Do not delete those files or you will have to re-enter your order number and license key in the module's admin.

Add volume pricing to specific products
32) Once installed to the store, you can add volume pricing inputs in the individual product edit screen (fig 10).

Modules for importing/exporting volume prices from flat files
33) Again, click Add Modules link
34) Click the file upload button
35) Browse to find the prodvol.mvc file on your hard drive and upload
36) Click Add to add it to the domain
37) Again, click Add Modules link
38) Click the file upload button
39) Browse to find the volexp.mvc file on your hard drive and upload
40) Click Add to add it to the domain

Upgrading from 4.x to 5.x
This section applies only if you are upgrading from Merchant 4.x to 5.x. In your Merchant 4.x you need to be running the most current version of volume pricing as it includes an export module so that you can create a flat file of your products' volume prices.
1) Export the Merchant 4.x volume prices to a flat file
2) Use the 5.x import module to import those volume prices into your Merchant 5.x store

Editing Option
You will need to edit the product page template where you want the discount table to display. The module can be linked within specific template screens with render tokens. They are in the format of
<mvt:item name="itemcode" param="xxxx" />
The templates are listed at the Pages link. You will edit the template by inserting the token and clicking the Update (fig 7). Important: After adding the render token to a template page, you must click the Items link for that page, scroll down to the item name and assign it to the page (fig 8). These two steps are repeated for every page that a module's render token is used on.
1) On page 'prod' (product display), click the tab at the top labeled Product Display Layout. Insert <mvt:item name="cim_vol" param="table" /> on the page.
2) You can also use tokens to change the displayed price if the product is setup with volume pricing. The <mvt:item name="cim_vol" param="checkprice" /> is inserted before the regular price line. Then a conditional is built around the regular price so that if the product is volume priced, you can have a line like Reg. $9.95 as low as $7.50. Use token <mvt:item name="cim_vol" param="lowestprice" /> to display the lowest price when applicable. The two tokens will look like:
<mvt:item name="cim_vol" param="checkprice" />
<mvt:if expr="volprice_aslowas_on EQ 0">
Price: <b>&mvt:product:formatted_price;</b><br>
<mvt:else>
<mvt:item name="cim_vol" param="lowestprice" /><br>
</mvt:if>
See figure 7 below which shows these particular tokens inserted amongst other code.
3) You can also use the token <mvt:item name="cim_vol" param="currentprice" /> to show the current price (based on quantity in the basket) on the product screen. However, you MUST set every volume price to amalgamate to use this token.

Super Amalgamation
Beginning with version 5.033 you can amalgamate the product quantity with other items in the basket from amalgamated categories or other amalgamated products. Separate each category or product code with the | character (no spaces) in the product's edit screen volume pricing tab. Do not put the current product code in the Amalgamate by Multiple Products input. You amalgamate that product by checking the box Amalgamate Individual Product Quantity. Also, make certain there are no products within any listed categories which are also in the Amalgamate by Multiple Products input. Otherwise you will get double counting. Test this feature thoroughly so you understand how it works. (fig 11)
Applying the Discount to Inventory Variants
Beginning with version 5.035 you can use volume pricing on products where you use inventory variants and the price of the product is determined by the inventory variant price that you put in the inactive inventory variant products. When the product is added to the basket, the discount is applied. However, it does not use the attribute machine to show changes in the volume price table when options are clicked. Hence, you will not display the volume price break table that is normally displayed. Instead you can use a table that just shows the tier levels with the percent discount for each tier (see below). When the products are inventory variants, the "as low as" price will be disabled. Here's an example of volume pricing of inventory variants.
Applying the Discount to Regular Attributes and Options Charges
Beginning with version 5.036 you can optionally apply a volume price discount to the sum of the attribute - option charges for each eligible product. It sums the negative and positive attribute charges for a product and then applies percent discounts to that amount. It displays the discount as an additional attribute. It does not discount if the sum is a negative amount to begin with. It only applies a discount if the volume discount is a percentage. Here's an example of volume pricing of attribute - option charges. Check the box to include EZ Batch with the main product. That is a positive charge so it can be discounted if you buy the quantity needed for volume pricing to kick in. Add it to the basket and view the attribute charges.
Store Morph Price Break Tables
In lieu of the token <mvt:item name="cim_vol" param="table" /> you can design the table layout using store morph code if you have volume pricing module version 5.013 or newer. This line <mvt:if expr="NOT l.settings:volprice_variants"> makes sure the product does not use inventory variants.

Vertical Layout
<mvt:item name="cim_vol" param="tablearray" />
<mvt:if expr="l.settings:volprice_rows GT 0">
<mvt:if expr="NOT l.settings:volprice_variants">
<table border="1" cellpadding="2" cellspacing="0" width="230">
<tr>
<th colspan="3" bgcolor="#00d3ff" align="center" valign="middle">
<span style="font-family:Verdana; size:16pt; color:#000000;">
Volume Price
</span>
</th>
</tr>
<tr>
<th align="left">
<span style="font-family:Verdana; size:14pt; color:#000000;">
Quantity
</span>
</th>
<th align="right">
<span style="font-family:Verdana; size:14pt; color:#000000;">
Price Each
</span>
</th>
<th align="right">
<span style="font-family:Verdana; size:14pt; color:#000000;">
Discount
</span>
</th>
</tr>
<mvt:foreach iterator="volume" array="volprice">
<tr>
<mvt:if expr="l.settings:volume:current">
<td align="left" bgcolor="#ffff00">
<mvt:else>
<td align="left">
</mvt:if>
<span style="font-family:Verdana; size:12pt; color:#000000;">
&mvt:volume:range;
</span>
</td>
<mvt:if expr="l.settings:volume:current">
<td align="right" bgcolor="#ffff00">
<mvt:else>
<td align="right">
</mvt:if>
<span style="font-family:Verdana; size:12pt; color:#000000;">
&mvt:volume:price;
</span>
</td>
<mvt:if expr="l.settings:volume:current">
<td align="right" bgcolor="#ffff00">
<mvt:else>
<td align="right">
</mvt:if>
<span style="font-family:Verdana; size:12pt; color:#000000;">
&mvt:volume:discount;
</span>
</td>
</tr>
</mvt:foreach>
</table>
</mvt:if>
</mvt:if>
The third column in the above example shows the discount, which will be either a percentage or the actual fixed amount deducted. This "volume:discount" variable was added in version 5.5.035 of the module.

Horizontal Layout
<mvt:item name="cim_vol" param="tablearray" />
<mvt:if expr="l.settings:volprice_rows GT 0">
<mvt:if expr="NOT l.settings:volprice_variants">
<table border="1" cellpadding="2" cellspacing="0">
<tr>
<th colspan="&mvt:volprice_rows;" bgcolor="#00d3ff">
<font size="+1">
Volume Price
</font>
</th>
</tr>
<tr>
<mvt:foreach iterator="volume" array="volprice">
<mvt:if expr="l.settings:volume:current">
<td align="center" bgcolor="#ffff00">
<mvt:else>
<td align="center">
</mvt:if>
<font size="-2">
&mvt:volume:range;
</font>
</td>
</mvt:foreach>
</tr>
<tr>
<mvt:foreach iterator="volume" array="volprice">
<mvt:if expr="l.settings:volume:current">
<td align="center" bgcolor="#ffff00">
<mvt:else>
<td align="center">
</mvt:if>
<font size="-2">
&mvt:volume:price;
</font>
</td>
</mvt:foreach>
</tr>
</table>
</mvt:if>
</mvt:if>

Table for inventory variants which override the base price when set at the inactive variant product level. This line <mvt:if expr="l.settings:volprice_variants"> limits display only when using inventory variants. So you can stack the table code if your store has both inventory variant and no inventory variant products. The line <mvt:if expr="l.settings:volprice_calc EQ 'P'"> in this table limits table display to only if the variants are used and the volume pricing calculation is a percentage of the product pricing rather than fixed amounts.
<mvt:item name="cim_vol" param="tablearray" />
<mvt:if expr="l.settings:volprice_rows GT 0">
<mvt:if expr="l.settings:volprice_variants">
<mvt:if expr="l.settings:volprice_calc EQ 'P'">
<table border="1" cellpadding="4" cellspacing="0" width="150">
<tr>
<th colspan="2" bgcolor="#00d3ff" align="center" valign="middle">
<span style="font-family:Verdana; size:16pt; color:#000000;">
Volume Price
</span>
</th>
</tr>
<tr>
<th align="left">
<span style="font-family:Verdana; size:14pt; color:#000000;">
Quantity
</span>
</th>
<th align="right">
<span style="font-family:Verdana; size:14pt; color:#000000;">
Discount
</span>
</th>
</tr>
<mvt:foreach iterator="volume" array="volprice">
<tr>
<mvt:if expr="l.settings:volume:current">
<td align="left" bgcolor="#ffff00">
<mvt:else>
<td align="left" bgcolor="#ffffff">
</mvt:if>
<span style="font-family:Verdana; size:12pt; color:#000000;">
&mvt:volume:range;
</span>
</td>
<mvt:if expr="l.settings:volume:current">
<td align="right" bgcolor="#ffff00">
<mvt:else>
<td align="right" bgcolor="#ffffff">
</mvt:if>
<span style="font-family:Verdana; size:12pt; color:#000000;">
&mvte:volume:discount;
</span>
</td>
</tr>
</mvt:foreach>
</table>
</mvt:if>
</mvt:if>
</mvt:if>

Limitations
1) This module ignores price groups if you use the fixed amount. It applies the price in your low, high, cost groupings. If you do not include a grouping at the single item level, it will use the method for pricing in your store. It only activates if you include a low, high, cost grouping. So if you want price group customers to get their percent off on a single item, then don't include the 1 in your grouping; ie start with 2 or higher number. Or if you use the % (percent off), then price group prices are used. So they would get an additional discount in addition to their price group discount. In the compiled version there is an option to use the price group price, then discount or use the regular price and then discount. For example:
6|10|12%^
11|20|14%^
21|999|16%^

2) The percentage discounting method subtracts the percent discount from the price. To apply the percentage, simply include the percent symbol (%) in the line.

3) If you are using another third party module which overrides prices in the basket and recomputes them using the price in the product record, you will not be able to use this module. Other third party modules will not recognize that it needs to apply the calculations in this module.


Import Volume Prices From Flat File (compiled version)
If you want to do flat file import, install the prodvol.mvc file as an import module. The flat file containing product codes and the volume pricing string can be created and then imported. Name the flat file prodvol.txt. It contains the product code and volume pricing groupings of each product separated by a # delimiter, for example:
1AA00001#3|5|4.00^6|10|3.50^11|20|3.00^21|999|2.75^
1AA00002#3|5|5.00^6|10|4.50^11|20|4.00^21|999|3.75^#0#20031201#20031224
1AA00003#3|5|10%^6|20|25%^21|999|40%^#1#

Leave the last line of prodvol.txt blank.

The first line in this example shows for product code 1AA00001 if the customer buys from 3 to 5 items, the cost is $4 each. If they buy from 6 to 10 items, the cost goes down to $3.50. Likewise, each grouping has a slightly lower price. The second line is a different product and with slightly different prices. It has an additional 3 parameters, amalgamation 1/0 (on/off), a start date, and an ending date. The third line is an even different product. Additionally, its volume pricing discount is measured as a percentage subtracted from the single item price. The more that are ordered, the more of a percent discount is applied. It also shows the amalgamation parameter, in this case it is turned on.

Beginning with volume pricing version 5.033 you can have super amalgamation with categories and products. To import that you would first include the category column, then the product column. Within those columns use the | delimiter.
1AA00005#3|5|5.00^6|10|4.50^11|20|4.00^21|999|3.75^#0#20031201#20031224#ABC|XYZ#1AA00222|1AA00223
In this example product 1AA00005 quantity would be determine by itself plus the number of items from categories ABC and XYZ in the basket. It would also be boosted if any 1AA00222 and/or 1AA00223 items were in the basket.

If every product in your store is going to have the same discount, you can use ONE line in the flat file. The * at the beginning of the line signals the module that it is a global assignment, for example:
*#1|+|10%#0#20031201:-5#20031224:-5

The above example would apply a 10% discount to all active products in the store. The discount would start on Dec 1, 2003 and end on Dec 24, 2003. The use of the :-5 would mean that midnight would be considered 5 hours less than GMT, e.g. EST in the USA.

Included in the zip is an optional volume price export module (volexp.mvc). You only need to install this module if you going to export the volume prices to a flat file.
Frequently Asked Questions
Q: I installed the module but the discount is not being applied when the item is added to the basket.
A: You probably did not install AND assign the CIM Activity Log to the store in the Logging Configuration screen. See steps 18-24 in the initial setup above.

Q: I inserted the token for the as low as price (lowest), but it does not seem to be working.
A: In the module's admin screen there is an input called
Text to replace "Price:" when applicable
e.g. As low as: (html fonts allowed)
Available token: %product_price_f%
Be sure you have filled that in. If it is blank, the as low as replacement is ignored. An example might be Reg: <strike>%product_price_f%</strike> <font color="#ff0000">as low as </font>
Fig 1: Main admin screen


Fig 2: Add a new module


Fig 3: Upload the module to the server


Fig 4: Template page selection


Fig 5: Items list


Fig 6: Add a new item


Fig 7: Editing a template page


Fig 8: Assign a page item to the template


Fig 9: Assigning a module to the store


Fig 10: Admin individual product settings


Fig 11: Admin individual product amalgamation settings