Concept B · order-first
Fulfillment
One row per parcel, across every order. Select what you are shipping today, take the JSON, then bring the tracking numbers back.
Today's parcels
3 selected
| ✓ | Patient | Contents | Order | Carrier | Tracking |
|---|---|---|---|---|---|
| Frankie Review |
Semaglutide / B12 5 / 1 mg/mL |
#12 | |||
| Noa Review |
NAD+ 100 mg/mL |
#12 | |||
| Tenley Review |
GHK-Cu 50 mg/mL |
#13 |
Paste each tracking number on the row that already names the patient, so the match is something you can see rather than something a format has to get right. A number pasted on the wrong row is visible; a number mismatched inside a pasted list is not.
Shipping JSON — for whoever is booking the labels
2 fills cannot ship yet. One is waiting for a pharmacist to approve the label proof, and one is approved and waiting to be printed; find both in Labels. Shipping is hard-gated on an approved and printed label proof, and today's three parcels meet that rule.
Shipped recently
All orders| Patient | Contents | Carrier | Tracking | Shipped | Delivered |
|---|---|---|---|---|---|
| Frankie Review | BPC-157 3 mg/mL | UPS | 1Z999AA10123456770 | 2 days ago · Avery Review | Yesterday |
| Marlow Review | NAD+ 100 mg/mL | UPS | 1Z999AA10123456763 | 3 days ago · Avery Review | Not confirmed |
What this page assumes
- The unit is a parcel, and parcels cross orders. You order vials in bulk from one supplier; you ship boxes to individual people. Once vials have arrived, which order they came from is provenance, not workflow — so today's shipping run is a selection across orders, not a walk through them one at a time.
- The JSON pull lives here, not on the order page. On an order it was one export per order with no way to combine them, which is backwards for a person doing a shipping run. It is collapsed because it is a means to an end, not the thing you came for.
- The existing manifest does not cross orders yet. The endpoint from PR #1059 is per order and returns 409 for a draft, so it must be widened before a cross-order run can use it.
- Tracking goes on the row, not into a format. An earlier version took a pasted list of id, carrier, tracking. It saved a little typing and risked the worst error this screen can make: a tracking number silently attached to the wrong patient. Pasting next to a name you can read makes a wrong match visible.
- Rows without a number stay put. Mark shipped acts only on rows that have tracking, so a half-finished run is normal rather than an error state. A parcel stays here until its number exists.
- Marking shipped has three consequences, all shown rather than hidden: it stores the carrier and tracking against the fill, decrements stock at the shipping site, and notifies the patient.
- Still unsolved: a parcel whose tracking is never pasted back stays in this list forever with nothing chasing it, and delivery is a human tick rather than a carrier signal.
- This whole tab needs the internal-compounding branch. PR #1059 has no receiving and no labelled state, so none of it is buildable until that data model lands.