Ordering & weighing
A catch-weight line is ordered in boxes and billed on weight. When it's ordered, the weight is either an estimate (boxes × the product's standard weight) or blank. When the supplier packs the order, they enter the real weights. The order can't be marked Ready for Delivery (or Delivered) until every catch-weight line has a weight. A blank line bills $0.00.
Who uses it
- Supplier staff add catch-weight lines in the new order dialog, weigh boxes at packing, and type the weights on the order.
- Restaurants order in boxes in the restaurant app and see an estimated total until the supplier weighs the order.
How it works
1. Ordering
The quantity is a number of whole boxes.
| Rule | Message |
|---|---|
| Whole boxes only | "Quantity must be a full number (e.g. 1, 2, 3), not a fraction" |
| At most 50 boxes per line, in the order forms | "Max: 50" |
When a supplier adds a catch-weight product in the new order dialog:
| Product has a standard weight? | Each box starts at | Line weight | Line total |
|---|---|---|---|
| Yes, 10 LB | 10 LB | boxes × 10 LB | Priced on that estimate. 2 cases at $9.00/LB → $180.00 |
| No | blank | blank | $0.00 |
The supplier can change any box's weight before submitting. A line whose boxes are only partly filled is saved unweighed.
When a restaurant orders in the restaurant app, every catch-weight line is placed unweighed. The app shows the restaurant an estimate:
| Line | Restaurant app shows |
|---|---|
| Product has a standard weight | An estimated price (boxes × standard weight × price) |
| No standard weight | "TBD" for the line, and "+TBD" after the subtotal |
| Cart | "Estimated Subtotal" |
| Checkout | "Estimated subtotal" and "Totals are estimates. You'll pay once your supplier processes the order and confirms the final amount." |
| Order details | "Estimated Price:" and "Prices are not final until the status is confirmed." |
| Size | e.g. "Size: 3 Bags (33.00 KG)", the real weight once weighed, otherwise boxes × standard weight |
The supplier sees these lines as unweighed ($0.00) until they enter weights.
2. Weighing
On the order, each catch-weight line has a WEIGHT cell and a per-box editor. Open it with "Enter per box weights" ("Collapse per box weight fields" closes it). It's labelled "Enter the individual weight per unit:".
| You do | The app does |
|---|---|
| Type a box's weight | Adds up the boxes into the line weight |
| Type the line weight | Splits it evenly across the boxes |
| Type a line weight on a line that had no boxes yet | Creates one box per unit first, then splits the weight |
| Change the quantity | Adds or removes boxes to match |
| Leave any box blank | The whole line is saved unweighed, $0.00 |
Validation: a weight must be blank or more than 0. "Must be > 0". Weights take up to 2 decimals.
3. The delivery gate
Marking the order Ready for Delivery (or Delivered directly) is blocked while any catch-weight line on it has no weight.
| Where | Message |
|---|---|
| Order page (toast), each missing field marked "Required" | "Enter weights for all catch-weight items before marking out for delivery" |
| Server | "1 catch-weight line(s) have no weight recorded." |
The order stays where it was (usually Packing). In a restaurant cart that went to several suppliers, each supplier's order is checked on its own. One supplier's unweighed fish never blocks another supplier.
4. The packing slip
The Packing Slip PDF prints a blank grid, one cell per box, under each catch-weight line that is unweighed, or whose boxes all carry the same weight (such as a standard-weight estimate). Warehouse staff write the weights there by hand, then type them into the order.
Calculations
Line total = line weight × price per weight unit, rounded to the cent. Line weight = sum of the box weights. See Pricing & documents.
Worked examples
Whole Fish: $6.00 / LB, no standard weight. Salmon Fillet: $9.00 / LB, standard weight 10 LB. Canned Tomatoes: $2.00 each, not catch-weight.
| Situation | Weight | Line total |
|---|---|---|
| 3 Whole Fish ordered, weight blank | blank | $0.00 |
| 2 Salmon Fillet ordered | 20 LB (estimate) | $180.00 |
| 5 Canned Tomatoes | no weight fields | $10.00 |
| Whole Fish weighed: total typed as 12 LB | 4 + 4 + 4 LB | 12 × 6.00 = $72.00 |
| Whole Fish weighed box by box: 4, 5, 3 LB | 12 LB | $72.00 |
| Whole Fish: total typed as 10 LB on 3 boxes | 3.333… each | Box weights are kept to 3 decimals, so this saves as 9.999 LB → 9.999 × 6.00 = $59.99 (verify) |
Knock-on effects: weighing an order
Order for Harbor Bistro: 3 Whole Fish (unweighed) and 4 Canned Tomatoes. The supplier weighs the fish at 12 LB and marks the order Ready for Delivery.
| Before | After weighing | After Ready for Delivery | |
|---|---|---|---|
| Whole Fish line | 3 EA, — , $0.00 | 3 EA, 12.00 LB, $72.00 | same |
| Subtotal | $8.00 | $80.00 | $80.00 |
| Ready for Delivery button | Blocked: "Enter weights for all catch-weight items before marking out for delivery" | Allowed | Done |
| Invoice | (not yet) | (not yet) | Issued with Invoice Date today (New York); Balance Due $80.00 |
| Stock (the order is already Packing, so its boxes are off the shelf) | 3 boxes out, 0 LB | 3 boxes out, 12 LB out (weight on hand drops by 12 LB) | Unchanged (see Returns & stock) |
| Restaurant app | "TBD" / "+TBD" | Real price | Invoice and messages as for any order |
Where it shows up
New order dialog · Order detail (WEIGHT column, per-box editor, Ready for Delivery button) · Packing slip (write-in grid) · Restaurant app cart, checkout and order details (estimates).
Permissions
Anyone who can edit the order can enter weights and mark it Ready for Delivery. Weights can't be changed once the order is Delivered or Canceled (verify).
Decisions
- Weights are optional when ordering, required before delivery. Restaurants order "3 whole fish" before anyone knows the weight. Shipping an unweighed line would invoice $0.00. (#2115)
- No standard weight means $0.00, never a guess, and never a price by box count. (#2109, #2160)
- Weights must be more than 0. A 0 LB box isn't a measured weight. (#2117)
- Restaurants see an estimate, with "TBD" where there is none. (#2439)
- The gate is checked per supplier. Each supplier ships its own part of a multi-supplier cart.
Known limitations
- The 50-box limit is only in the order forms. It shows "Max: 50" with no further wording, and other ways of creating an order don't enforce it.
- Splitting a total evenly can lose a fraction. 10 LB over 3 boxes is 3.333… LB each, kept to 3 decimals (verify).
- A refused status change shows a generic error. The order page's own check shows the weight message, but if the server refuses (for example a weight was cleared elsewhere) the toast reads "Error reverting order status."
- The order page only checks the weights on the Packing to Ready for Delivery step. The server also checks them on Delivered.
- The spec's messages don't match the app's wording. For example, the spec says "weight must be greater than zero"; the app says "Must be > 0".
FAQ
Why can't I mark this order Ready for Delivery? A catch-weight line on it has no weight. Enter the weight for every catch-weight line (the empty ones are marked "Required"), then try again.
The restaurant's order shows $0.00 for the fish. Will they be charged $0? Only if it's shipped unweighed, which the app doesn't allow. Weigh it before Ready for Delivery and the line re-prices.
Can a restaurant order half a case of a catch-weight product? No. Catch-weight products are ordered in whole boxes.
I typed the total weight. Why did every box change? Typing the total splits it evenly across the boxes. Type each box's weight instead if they differ. The total follows.
Does the customer see the per-box weights? On the invoice, per-box weights are printed only when the boxes weigh different amounts. See Pricing & documents.
Specs
# prefix: CWO
Feature: Optional weight for catch-weight order items
Catch-weight products are billed by weight (e.g. fish sold per pound), but the
actual weight is often unknown when the order is placed — a restaurant orders
"3 whole fish" and the yield is only known once the supplier weighs them at
packing. Orders may therefore be placed with the weight left blank; such lines
are billed at $0 until a real weight is recorded. From "Ready for Delivery"
onward, weights are required.
Background:
Given supplier "NYC Fisher Hub" sells to restaurant "Harbor Bistro"
And the supplier's catalog contains:
| Product | Catch-weight | Standard weight | Unit price |
| Whole Fish | Yes | (none) | $6.00 per LB |
| Salmon Fillet | Yes | 10 LB | $9.00 per LB |
| Canned Tomatoes| No | (n/a) | $2.00 each |
Rule: A catch-weight product with no standard weight can be ordered without a weight
Scenario: CWO-001 Placing an order for a catch-weight product whose weight is unknown
Given the supplier starts a new order for "Harbor Bistro"
And the supplier adds 3 units of "Whole Fish"
When the supplier leaves the weight blank
Then the Submit button is enabled
And the order is placed successfully
And the "Whole Fish" line shows a total of $0.00
Scenario: CWO-002 A catch-weight product with a standard weight pre-fills an estimated weight
Given the supplier starts a new order for "Harbor Bistro"
When the supplier adds 2 units of "Salmon Fillet"
Then the weight is pre-filled with the estimated 20 LB
And the "Salmon Fillet" line shows a total of $180.00
And the supplier can adjust the weight to the actual measured value
Scenario: CWO-003 Standard (non-catch-weight) products are unaffected
Given the supplier starts a new order for "Harbor Bistro"
When the supplier adds 5 units of "Canned Tomatoes"
Then no weight fields are shown for that line
And the "Canned Tomatoes" line shows a total of $10.00
Rule: Unweighed catch-weight lines are billed at $0 until a weight is recorded
Scenario: CWO-004 Order total and invoice exclude an unweighed line
Given an order for "Harbor Bistro" with:
| Line | Quantity | Weight |
| Whole Fish | 3 | (blank) |
| Canned Tomatoes| 4 | (n/a) |
Then the "Whole Fish" line is billed at $0.00
And the order total is $8.00
And the invoice shows $0.00 for the "Whole Fish" line
Rule: Actual weights are recorded before delivery (weigh at packing)
Scenario: CWO-005 Supplier enters the measured weight on a previously-blank line
Given a placed order with a "Whole Fish" line of 3 units and no weight
When the supplier edits the order and enters a total weight of 12 LB
Then the weight is spread across the 3 units
And the "Whole Fish" line re-prices to $72.00
And saving the order persists the recorded weight
Scenario: CWO-006 Supplier enters each unit's weight individually
Given a placed order with a "Whole Fish" line of 3 units and no weight
When the supplier enters unit weights of 4 LB, 5 LB and 3 LB
Then the line total weight becomes 12 LB
And the "Whole Fish" line re-prices to $72.00
Rule: When a weight is provided it must be valid
Scenario Outline: CWO-007 Invalid weights are rejected
Given a placed order with a "Whole Fish" line of <quantity> units
When the supplier enters <entry>
Then the order cannot be saved with an error "<reason>"
Examples:
| quantity | entry | reason |
| 2 | a total weight of 0 LB | weight must be greater than zero |
| 2 | a negative weight | weight must be greater than zero |
Rule: All catch-weight items must be weighed before "Ready for Delivery"
Scenario: CWO-008 Marking Ready for Delivery is blocked while a weight is missing
Given an order in "Packing" for "Harbor Bistro" with a "Whole Fish" line that has no weight
When the supplier clicks "Ready for Delivery"
Then the transition is blocked
And an error is shown: "Enter weights for all catch-weight items before marking out for delivery"
And the order stays in "Packing"
Scenario: CWO-009 Marking Ready for Delivery succeeds once every catch-weight line is weighed
Given an order in "Packing" for "Harbor Bistro" with a "Whole Fish" line
And the supplier has recorded a weight of 12 LB for that line
When the supplier clicks "Ready for Delivery"
Then the order moves to "Ready for Delivery"
Scenario: CWO-010 One supplier's missing weight does not block another supplier on the same cart
Given a restaurant cart sent to "NYC Fisher Hub" and to a different supplier
And "NYC Fisher Hub"'s order has a fully-weighed line
And the other supplier's order has an unweighed catch-weight line
When "NYC Fisher Hub" marks its order "Ready for Delivery"
Then "NYC Fisher Hub"'s order moves to "Ready for Delivery"
And the other supplier's order is unaffected
Rule: A return needs a weight only when the original line was actually weighed
Scenario: CWO-011 Returning a line that was never weighed does not require a weight
Given a delivered order with a "Whole Fish" line that was billed at $0.00 (never weighed)
When the supplier creates a return for that line
Then the return can be submitted without entering a weight
Scenario: CWO-012 Returning a weighed line requires a return weight
Given a delivered order with a "Whole Fish" line weighed at 12 LB
When the supplier creates a return for that line without a weight
Then the return is rejected asking for the catch-weight of the returned goods
Scenario: CWO-013 Returned weight cannot exceed the original line weight
Given a delivered order with a "Whole Fish" line weighed at 12 LB
When the supplier returns more than 12 LB of that line
Then the return is rejected for exceeding the original line weight
Rule: Purchase orders follow the same weight lifecycle as sales orders
Scenario: CWO-014 A purchase order can be created with a blank catch-weight weight
Given the buyer creates a purchase order with a "Whole Fish" line
When the weight is left blank
Then the purchase order is created successfully
And the "Whole Fish" line is priced at $0.00 until it is weighed
Scenario: CWO-015 Marking a purchase order Delivered is blocked while a weight is missing
Given a placed purchase order with a "Whole Fish" line that has no weight
When the buyer marks the purchase order Delivered
Then the transition is blocked, naming the unweighed product(s)
And the purchase order stays in the "Placed" state
Scenario: CWO-016 Marking a purchase order Delivered succeeds once every line is weighed
Given a placed purchase order with a "Whole Fish" line
And the buyer has recorded the received weight for that line
When the buyer marks the purchase order Delivered
Then the purchase order moves to "Delivered"
Scenario: CWO-017 A purchase order return needs a weight only if the original line was weighed
Given a purchase order with a "Whole Fish" line that was never weighed
When the buyer returns that line
Then the return can be submitted without entering a weight
# And a return against a weighed line still requires the returned weight,
# capped at the original line weight.