Lists are tiers, and each customer sits on one
A price list is a tier rather than a customer record. Twenty accounts on four lists is the normal shape, and Wholesale Handler is built for it - the cap is 20 lists including the Default, against 50 customers.
Assignment is not optional. Every customer has a list, and a Default list is there whether or not you make others, so no account is left without prices. Looking up what somebody pays is a question about which list they are on.
Prices derive from the Default list
Each list other than the Default carries a percentage of it - 90 for 10% off, 110 for 10% above - and its prices are worked out from that. The Default holds the real numbers and the tiers follow.
Update a price on the Default and Wholesale Handler shows what the change does to every percentage-based list before it writes anything. Keeping the existing prices on those lists is one of the options.
A typed price stops deriving
Enter a price directly onto a derived list and that row stops tracking the Default. It stays where you put it, and later recalculations skip it.
Each row on a list shows where its number came from - derived rows carry the percentage, overridden rows are marked custom and show what the price works out at against the Default. So the overrides are visible on the page rather than held in memory.
Changing a list's percentage
Changing the percentage on an existing list records the new figure but does not move the prices already derived from the old one. The number is worth getting right when the list is created.
Moving a customer to another list
Customers are reassigned in bulk, in one action. The list is a property of the account rather than a copy of the prices, so a move applies from the customer's next order and there is nothing to rebuild.
Orders already placed are unaffected. An order line records both the price paid and the list it came from at the moment it was placed.
Wholesale Handler



