ADR-002: Pricing Category Support
Status
Accepted
Context
We needed to support different container types (skip bin, hook bin, trash bag) in our pricing system. Before this change, everything was treated as "skip bin" implicitly.
Goals:
- Filter pricing by container type
- Keep existing data working
- Update all pricing APIs to use category
Decision: Add Category to Pricing Records
Added a category column to the pricings table. Existing records were filled with the category from their waste type.
Trade-offs
Good:
- Simple change - just one new column
- Existing data automatically updated
- Can filter pricing by container type
Bad:
- Category can be empty (null) if not set
- Could have duplicate pricing rows for same supplier/area/type/container with different categories
Decision: Optional Category Filtering
Pricing queries filter by category only when one is provided. If no category is given, the query returns all pricing records.
Trade-offs
Good:
- Old code still works without changes
- Can get pricing for specific container types or all types
Bad:
- If you forget to pass the category, you might get wrong pricing
- No requirement that every query must include a category
Decision: Category Parameter Through All APIs
Every API endpoint that gets pricing now accepts a category parameter. This includes admin, vendor, and public APIs.
Trade-offs
Good:
- All pricing requests can specify the container type
- Consistent approach across the whole system
Bad:
- Had to update 20+ files
- If the request doesn't include category, we fall back to the waste container's category
- All API consumers need to send the category now
Decision: Category Dropdown in UI
Admin and Dashboard pages now have a dropdown to filter pricing by container type (skip bin, hook bin, etc). Changing the dropdown reloads the page with the selected category.
Trade-offs
Good:
- Users can view pricing for specific container types
- URL includes the filter so you can bookmark it
Bad:
- Page reloads when changing category (not instant)
- Have to preserve the category in all navigation links (Next/Prev dates, reset pricing buttons)
Decision: Category Falls Back to Waste Container
If an API request doesn't specify a category, we use the category from the waste container (bin size) being requested.
Trade-offs
Good:
- Old API calls still work without changes
- Each bin size knows its own category
Bad:
- Assumes every waste container has a category set
- Creates hidden dependency - pricing queries rely on waste container data
Decision: New Pricing Inherits Container Category
When creating a new bin size, the pricing records automatically get the same category as the bin size.
Trade-offs
Good:
- New pricing has correct category automatically
- No manual steps needed
Bad:
- Uses fixed values internally (waste type 19, service areas 2-6)
Decision: One-Way Data Migration
The migration that fills in categories for existing pricing records doesn't have a rollback. Once populated, we don't try to undo it.
Trade-offs
Good:
- Acknowledges this is a one-time data fix
Bad:
- Can't fully roll back to before this change
Date
April 24, 2026
Author
Cascade AI Assistant (based on commits by Aryan Jaya)