Fulfillment
Finished vials on hand at each site. Every number here is the sum of recorded movements, never a typed-in total.
On hand
| Preparation | Texas · Elite Care | SF · Striker | Total | Paid fills | Shipped 30d | Counted | Cover |
|---|---|---|---|---|---|---|---|
| Semaglutide / B12 |
4 | 5 | 9 | 14 | 42 | 5 days ago | 6 days |
| NAD+ |
2 | 9 | 11 | 9 | 21 | 5 days ago | 16 days |
| GHK-Cu |
0 | 10 | 10 | 5 | 6 | 5 days ago | 50 days |
| Tirzepatide / B6 |
3 | 3 | 6 | 12 | 36 | 5 days ago | 5 days |
| BPC-157 |
0 | 1 | 1 | 11 | 28 | 5 days ago | 1 day |
| 10 more preparations, all zero at both sites | |||||||
Sites are the two the code already knows about. Every count is the total of the movements recorded against it, so a number can always be traced to the events that produced it. There is no editable on-hand field to disagree with the ledger.
Days of cover is on hand divided by how fast the preparation actually left the shelf over the last 30 days. It is derived from our own shipping history, not from anything the supplier told us. It deliberately stops there: turning cover into a reorder date would need a supplier lead time, and we do not have one on record.
What is actually moving
last 30 days, from the ledger-
BPC-157 — fastest-moving and nearly out
Order BPC-157 -
Tirzepatide / B6 — second-fastest and nearly out
Order Tirzepatide -
GHK-Cu — slow-moving with the deepest cover
Deliberately not here yet: a reorder point, a suggested quantity, or a "you should order every N days". Those decisions need a buffer policy that nobody has set. What the ledger can honestly say today is how fast something moves and how long the shelf will last. How much to over-order stays a human judgement until that policy exists.
Change what is on hand
Add stock — vials arrived that are not against an order
Record a count — you counted the shelf and the number disagrees
Move stock between sites — same vials, different shelf
Movements
| When | Site | Preparation | Change | Reason | Because of | Who |
|---|---|---|---|---|---|---|
| 2 days ago | SF · Striker | Semaglutide / B12 | +5 | Received | Order #12 | Casey Review |
| 2 days ago | SF · Striker | NAD+ 100 mg/mL | +2 | Received | Order #12 | Casey Review |
| 2 days ago | SF · Striker | BPC-157 | +1 | Received | Order #12 | Casey Review |
| 4 days ago | SF · Striker | GHK-Cu 50 mg/mL | −1 | Filled from stock | Rx #311 · Devon Review | Avery Review |
| 6 days ago | Texas · Elite Care | NAD+ 100 mg/mL | −2 | Transfer out | Paired with the entry below | Avery Review |
| 6 days ago | SF · Striker | NAD+ 100 mg/mL | +2 | Transfer in | Paired with the entry above | Avery Review |
| 9 days ago | Texas · Elite Care | Tirzepatide / B6 | −1 | Adjustment | Vial damaged in handling | Casey Review |
| 5 days ago | Both sites | All 15 preparations | set | Opening count | First count on record | Casey Review |
What this page assumes
- Stock is a balance, not a stage of work, so it sits after To ship rather than inside the pipeline. Shipping is what draws it down, so the causal order reads left to right.
- On hand is derived, never typed. Every number is the sum of signed movements, matching the ledger PR #926 already implements. An on-hand column you can edit is a number that can disagree with its own history. "Opening count" is a movement like any other, and only one is permitted per preparation per site.
- Where a received vial lands is still unsettled. 04-act records arrivals against individual patient fills while this page records the same arrivals as site stock. Both cannot be true for the same vial. PR #926 carries both a per-fill location and a stock ledger with a fill-from-stock path, so the model can express either; the choice is still open.
- "Paid fills" is on this page on purpose. It is the only column that turns a reference table into a decision: 1 BPC-157 on hand against 11 waiting means order 10; 10 GHK-Cu against 5 waiting means order none. The same pairing appears on the To order tab, which is where the decision is actually made.
- Transfers are two paired entries, not one move. Out from the sending site, in to the receiving one, sharing a note, so neither site's balance is ever briefly wrong and the pairing stays visible in the ledger.
- Site names are the two the code knows about. The stored values are tx and sf; the labels here are the operator-facing names. Worth confirming the SF site's real name before it hardens — it has been called both "SF / Striker" and "CA / RonanRX HQ".
- This whole tab needs PR #926's data model. PR #1059 has no stock model at all. The only quantity mutation in its codebase is a decrement on the internal-compounding branch, and inventory_lots has no site column. Nothing on this page can be built without PR #926's ledger.
- Adding stock is a first-class action, not an edit. When the supplier ships extras we keep, that is a real event with a reason and a note, recorded like any other movement. There is still no editable on-hand field — the number moves because something happened to it.
- Velocity comes free with the ledger. "Shipped 30d" is a sum over movements we already record, so knowing what is hot needs no new data. Days of cover follows from it. A reorder date or quantity does not follow until somebody sets a buffer policy.
- Ordering starts from here too. Looking at what is low is the moment you decide to order, so the page offers it rather than making you navigate back to demand and remember what you just read.
- All counts here are synthetic and consistent with data.md. They are not a report of real stock.