Epic: #171
User Story
As a home developer, I want to record the bulk batches I mix so that I can track how much I have left and when they expire.
Acceptance Criteria
Notes
- Water batch: volume and expiry are unbounded (remaining_volume_ml can be null for system chemicals)
Epic: #171
User Story
As a home developer, I want to record the bulk batches I mix so that I can track how much I have left and when they expire.
Acceptance Criteria
chemical_batchestable:id,chemical_product_id(FK),label,total_volume_ml,remaining_volume_ml,concentration,mixed_date,expiry_date(nullable override),status(ACTIVE/EXHAUSTED/DISPOSED),notesexpiry_datedefaults tomixed_date + product.default_shelf_life_daysif not overridden; null if product has no shelf life (e.g. Water)POST /api/chemistry/batches— create batchGET /api/chemistry/batches— list (optional?status=filter)PUT /api/chemistry/batches/:id— updatePOST /api/chemistry/batches/:id/draw— decrementremaining_volume_mlby specified amount (called when a working solution is created from this batch)PATCH /api/chemistry/batches/:id/status— mark EXHAUSTED or DISPOSEDremainingVolumeMl < requested amountNotes