The annual flip. Once per year on July 1 (cron 0 5 1 7 *) or by manual trigger, the Bid Center converts an entire year of accumulated bid work into next year's NetSuite named price lists. The prepare_next_school_year Workflow enumerates 69 active customers, picks each customer's latest SY-version, applies the HPS MAP GPO allowance program where applicable, and builds 69 proposed NS named price list payloads. All 69 land in a single batch proposed_actions row with shared batch_id='jul1-2026'. On approval, NS_PUSH_QUEUE drains 69 writes (one per customer, gated by PushMutexDO). Partial failures loop back. Customer service sees the new named list on the next NS customer open. First live deploy is July 1, 2026.
jul1-2026)| kind | name | purpose |
|---|---|---|
| Cron | 0 5 1 7 * | Jul 1 05:00 UTC |
| Workflow class | src/annual_roll_workflow.ts | prepare_next_school_year |
| D1 table | cron_locks | prevents double-run |
| D1 table | bid_customers | 69 active cohort |
| D1 table | bid_quote_versions | is_latest=1 per customer |
| D1 table | bid_programs | HPS MAP GPO allowance |
| D1 table | proposed_actions | batch_id='jul1-2026' |
| D1 table | ns_pending_pushes | NS_PUSH_QUEUE |
| Durable Object | PushMutexDO | per-customer mutex |
| Endpoint | POST /api/bid/rollover/start | manual trigger |
| Endpoint | POST /api/ns/push/named-price-list | per-customer NS write |
| Endpoint | POST /api/proposed-actions/bulk-decide | cohort approve / subset / reject |
| NS RESTlet | customscript_gfs_platform_push_pricelist | writes NS PriceList |
| Event | bid.namedlist_pushed | per customer success |
| Event | bid.rollover_completed | cohort done |