Seafood stall buyer - the pre-dawn order calculator: order-volume ranges under three hard constraints - what sells, what the tanks can hold, what today's price justifies
Build me a single-file HTML order calculator for seafood buying, opened
in a phone browser at the wholesale market before dawn, no network
required.
Background: seafood order volume is pinned by three constraints, and
gut-feel ordering fails one of two ways - tanks overstocked (ordered
too much, can't keep it alive, mortality) or counters empty (sold out
shortly after opening):
1. What sells: yesterday's sales + same weekday last week + a
correction I enter (weather, holiday)
2. What survives: live stock bounded by tank capacity and a density
ceiling; iced/frozen bounded by ice bed and freezer space
3. What's worth it: today's wholesale price - unusually high says buy
less or substitute; unusually low still doesn't mean unlimited
(unsold stock is still mortality)
Input (per item, paste CSV or form entry):
- Item / category (live | iced | shellfish | frozen) / yesterday's
sales / same weekday last week / stock on hand / remaining tank or
freezer capacity (in my own units) / today's wholesale price
- My "days correction" defaults to 1; I bump it to 2-3 myself when a
supply gap is expected (typhoon, etc.)
Computation rules (all visible and editable, no black box):
- Base volume = (yesterday and last-week sales weighted by
[history weight]) x days correction - stock on hand, floored at 0
- The three constraints check in sequence:
* Live stock must not exceed remaining capacity x [density ceiling
coefficient] - when this binds, flag it red "can't hold it" with
the hint "split tanks or cut volume"
* Iced has no overnight logic: base volume is today's volume; if
stock on hand > 0, show "clear the counter before ordering" first
* When today's price exceeds my [alert price] for that item, show
a "cut volume or substitute" notice - notice only, never silently
edits the number
- Output is a range: base x [floor coefficient] to base x
[ceiling coefficient], not a single number
Output:
- Suggestion table: item / suggested range / binding constraint
(won't sell | can't hold | price too high) / notice text,
copyable as plain text to message the market stall
- Data in localStorage, exportable and importable as JSON
Hard requirements:
- Single file, no build step, no external CDN or fonts
- No sales forecasting: no model, the base is just the two historical
days weighted times my correction - the tool invents no numbers
- All coefficients (history weight, density ceiling, alert prices,
floor/ceiling) start empty and compute nothing until I fill them -
no preset "typical seafood density" or "industry reference prices":
filtration, aeration, and customer base differ so much between
stalls that borrowed numbers get executed as truth
- The density ceiling's meaning is stated as "the ceiling my own
equipment keeps alive," calibrated backward from recent mortality;
the tool does not judge "scientific density"
Why it is written this way
The one constraint that separates seafood ordering from ordinary fresh ordering is "what survives": over-order vegetables and they discount out over two days; over-order live fish into an over-dense tank and you are throwing money into the water - mortality bites harder than slow sales, and it dies in tomorrow's tank from a decision made this morning. Queuing the three constraints explicitly splits "ordered too much" into three distinct deaths: won't sell, can't hold, paid too much. Each has a different remedy (cut volume, split tanks or cut, substitute or wait) - blurred together, there is no remedy at all.
The suggestion is a range, never a point, because the market eye before dawn is a human asset: the same suggested range gets taken toward its ceiling when the market is soft and hugged to its floor when it is firm - freshness at the stalls, today's boat volumes, what the next dealer will quote: not one of those signals reaches a tool. The tool's job is to move the arithmetic of "how much" out of the buyer's head; the person's job is to pour the "what's the market today" experience back in. Each side does its own work.
"Coefficients start empty, no industry defaults" is the same bottom line as the other tools: a model will happily supply "grass carp per cubic meter" numbers that sound professional - but those are farm numbers, not retail holding-tank numbers that start killing fish the moment density crosses the line. The only trustworthy calibration is back-solving from this stall's own recent mortality: deaths ran high at some density, so the ceiling comes down. Writing that feedback loop into the tool's semantics keeps the numbers this stall's numbers.
"Iced has no overnight logic" is its own category because iced and live run on different clocks: iced stock is an asset that must clear today. Yesterday's iced fish still on the counter means ordering more iced today is competing with yourself for your own shelf - "clear before ordering" is a notice worth more than any arithmetic in the tool.
Variables
| Variable | Notes |
|---|---|
| History weight | The blend of yesterday vs. same weekday last week; steady-traffic stores lean weekly, volatile ones lean yesterday |
| Density ceiling coefficient | Back-solved from your own equipment: mortality ran high at some density, lower the ceiling - the only calibration that can be trusted |
| Per-item alert price | The market line above which it's "cut volume or substitute"; set by each item's margin structure |