Wholety User Manual
Website

Chapter 6 Product Management

Product is the foundation of the system. No SKU and price, no purchase or sale order. This chapter is how to list goods into the system.

Entry: left menu Product (Category mgmt / Product mgmt / Product detail) and Brand (Brand board / Brand mgmt / Brand category mgmt).

The build order for product master data — category and brand first, then SKU, then prices, before any order can be placed:

st=>start: Product master data
a=>operation: 1. Category mgmt (tree / drag-sort)
b=>operation: 2. Brand mgmt (brand category -> brand -> logo -> annual target)
c=>operation: 3. Create SKU (code / spec / volume / tax / barcode)
d=>inputoutput: 4. Maintain prices (purchase / sale / discount)
e=>end: Purchase / Sale / Merchant browse
st->a->b->c->d->e

6.1 Maintain Product Categories

  1. Product → Category mgmt: the page is a category tree with Expand all / Collapse all.
  2. Top New category; tree-node inline actions: Add subcategory / Edit / Delete.
  3. Category form fields: name, English name, code, parent category, sort order.
  4. Support drag to reorder and re-level categories.

Category is one of the SKU's belonging dimensions; have a category before creating an SKU. Before deleting a category, confirm no product under it is in use.


6.2 Maintain Brands, Brand Categories, Annual Target

  1. Brand → Brand category mgmt: first build sub-categories under a brand (brand categories); support add/edit/delete.
  2. Brand → Brand mgmt → New brand: two steps — first fill brand name, then upload brand logo.
  3. Brand cards support inline Edit / Delete; search by name.
  4. Editing a brand lets you maintain the annual purchase target sub-table: add/edit/delete target rows, each row fills annual target and Q1–Q4 quarterly targets.
  5. Brand board auto-summarizes each brand's annual sales, return rate, profit, quarterly completion.

Brand annual target feeds the brand board's completion-rate analysis; set it early in the year.


6.3 Create Product (SKU) & Spec

Note: this system manages product at the SKU (spec) level as the smallest unit — there is no separate SPU parent. Creating a product = creating an SKU.

Common actions on the product list page:

Create/edit product:

  1. Product → Product mgmt → Add product (drawer form).
  2. Fill fields (key fields from the data model):
Field Meaning Note
SKU code (sku_code) Business-unique code; join key for stock/order/finance Don't change after use
Product code (code) Internal unique code Auto/manual, unique
Brand (brand_id) Belonging brand Build brand first
Spec name (spec_name) Product name; zh/trad/en Fill each language
Country code (country_code) Country of origin Required for cross-border
Customs code (custom_code) Customs code Required for cross-border
Custom category 1/2/3 Customs grouping As needed
UPC / barcode (upc, barcodes) For scanning Multiple allowed
Unit / UOM Sell unit —
Unit count (unit_count) Min sellable units per spec Default 1
Volume (size_value, m³) Per-unit volume, m³ Required & accurate; freight & loading depend on it
L/W/H (cm) The volume calculator in the form; fill dimensions to auto-compute volume Fill one precisely
Has tax (has_tax) Whether taxed by merchant tax zone 0 no / 1 yes
Default supplier (default_supplier_id) Suggested supplier when purchasing Optional
Status (status) 1 listed / 0 unlisted List to be sellable
  1. Save and list (status = 1); only then does the product appear in browse/order options.

New SKU form

⚠️ Volume is the easiest to get wrong with the worst consequences. Freight is allocated by each SKU's volume ratio, and loading is computed by volume. Wrong volume → distorted freight allocation and wrong loading. Always fill the real per-unit volume (m³).


6.4 Maintain Prices

Three price layers, maintained in different places:

Price Where Note
Purchase price Entered when creating supply-chain order Follows order; settlement uses it as cost
Sale price Product list row → Price (drawer) Standard price, can tier by customer level/merchant
Discount price Product list row → Discount (drawer) Promo price, by level/merchant

Price decision flow — check cost before setting the sale price, then decide whether to tier by customer:

st=>start: Set sale price
a=>operation: Open "Price" drawer
b=>inputoutput: View purchase cost (batch / avg cost)
c=>condition: Tier by customer level/merchant?
d1=>operation: Set general price
d2=>operation: Set per level/merchant
e=>operation: Optional: set discount in Discount drawer
f=>end: Auto-applied at merchant checkout
st->a->b->c
c(yes)->d2->e->f
c(no)->d1->e

Price drawer (product list row → "Price"):

  1. Add sale price: fill price, optional customer level, optional merchant (blank = general price). Same SKU can have different prices per merchant/level.
  2. Inline Edit / Delete existing prices.
  3. View purchase cost: open nested drawer listing warehouse / created time / expiry / purchase price / stock per batch, with an average cost summary at the bottom — check cost before setting price.

Discount drawer (product list row → "Discount"):

  1. Add discount: pick customer level/merchant, set direct discount or custom amount, add note.
  2. Inline Edit / Delete existing discounts.

Customer level & price rule:

Historical prices are auto-recorded by the system; compare past prices. Price fields are permission-controlled: no purchase-price read → see * (see 4.4).


6.5 Product Image & Batch Import

Image import is a go-live/migration operation; template details in Appendix G.


6.6 Unlist / Delete & Recycle-bin Recovery

Delete is soft and recoverable; but don't delete an SKU with linked orders — it hurts historical traceability.


6.7 Query Stock Distribution

Stock distribution query


Chapter Summary

Next: Supply Chain (Purchasing).