Add planning documents for Forte music store platform

17 domain design docs covering architecture, accounts, inventory,
rentals, lessons, repairs, POS, payments, batch repairs, delivery,
billing, accounting, deployment, licensing, installer, and backend
tech architecture. Plus implementation roadmap (doc 18) and
personnel management (doc 19).

Key design decisions documented:
- company/location model (multi-tenant + multi-location)
- member entity (renamed from student to support multiple adults)
- Stripe vs Global Payments billing ownership differences
- User/location/terminal licensing model
- Valkey 8 instead of Redis
This commit is contained in:
Ryan Moon
2026-03-27 14:51:23 -05:00
commit 5f8726ee4e
36 changed files with 9558 additions and 0 deletions

View File

@@ -0,0 +1,435 @@
Music Store Management Platform
Domain Design: Repairs
Version 1.2 | Updated: Parts inventory, bulk materials, flat-rate billing, tech metrics
# 1. Overview
The Repairs domain manages instrument intake, diagnosis, work tracking, parts, labor billing, and customer pickup. It integrates with the repair parts inventory for materials tracking and supports three billing models: per-unit parts billing, flat-rate service billing (e.g. bow rehairs), and shop supply tracking. Repair tickets support both individual customer repairs and bulk school repairs via batch grouping.
# 2. Repair Ticket Lifecycle
Status
Description
intake
Instrument received, condition documented, intake ticket printed for customer
diagnosing
Technician evaluating — estimate not yet provided
pending_approval
Estimate provided, awaiting customer authorization
approved
Customer approved — work authorized
in_progress
Actively being repaired — parts being logged
pending_parts
Waiting on parts order from supplier
ready
Repair complete — awaiting pickup or delivery
picked_up
Customer collected instrument and paid
delivered
Instrument returned via store delivery event
cancelled
Repair cancelled — instrument returned uncompleted
# 3. Database Schema
## 3.1 repair_ticket
Column
Type
Notes
id
uuid PK
company_id
uuid FK
repair_batch_id
uuid FK
Nullable — null = individual repair
ticket_number
varchar
Human-readable ID
account_id
uuid FK
Nullable — walk-in without account
customer_name
varchar
Denormalized for walk-ins
customer_phone
varchar
Contact for ready notification
inventory_unit_id
uuid FK
Nullable — known instrument
instrument_description
varchar
Free text for unknown instruments
serial_number
varchar
If known
condition_in
enum
excellent|good|fair|poor — at intake
condition_in_notes
text
Detailed condition at intake
problem_description
text
Customer description of issue
technician_notes
text
Internal diagnosis and work notes
status
enum
See lifecycle above
assigned_technician_id
uuid FK
Employee assigned
estimated_cost
numeric(10,2)
Estimate given to customer
actual_cost
numeric(10,2)
Final billed amount
intake_date
date
promised_date
date
Estimated completion date
completed_date
date
When repair work finished
linked_rental_id
uuid FK
If repair from rental return
legacy_id
varchar
AIM service ticket ID
created_at
timestamptz
## 3.2 repair_line_item
Line items on a repair ticket cover three billing types — labor, per-unit parts, and flat-rate services. All three appear on the customer invoice.
Column
Type
Notes
id
uuid PK
repair_ticket_id
uuid FK
item_type
enum
labor | part | flat_rate | misc
description
varchar
Customer-facing description
repair_part_usage_id
uuid FK
Nullable — links to parts usage record
qty
numeric(10,3)
Supports fractional for bulk materials
unit_price
numeric(10,2)
Rate per unit
total_price
numeric(10,2)
qty * unit_price
cost
numeric(10,2)
Internal cost — for margin calculation
technician_id
uuid FK
For labor lines — which tech
created_at
timestamptz
## 3.3 Billing Type Examples
Type
Description
Qty
Price
Notes
labor
Mechanical overhaul
2.5 hrs
$65/hr
Tech rate x hours
part
Trumpet valve guide
3 each
$2.50 ea
Per-unit billable part
flat_rate
Bow Rehair — Full Size
1
$50.00
Labor + hair bundled
flat_rate
Bow Rehair — Cello
1
$70.00
0.67 hank consumed internally
misc
Expedite fee
1
$15.00
Custom charge
# 4. Technician Workflow — Parts Logging
When a technician works a repair ticket they log parts as they use them. The interface is optimized for speed — minimal clicks to record common operations.
Repair Ticket #RT-2024-0042 — Bach Stradivarius TrumpetTechnician: Sarah M. Status: in_progress[+ Add Labor] [+ Add Part] [+ Add Flat Rate Service]Current line items: Labor Full mechanical overhaul 2.5 hrs @ $65 $162.50 Part Trumpet valve guide (x3) 3 @ $2.50 $7.50 Part Valve spring set (x1) 1 @ $8.00 $8.00 [shop] Valve oil (shop supply) recorded, not billed [shop] Cleaning patches (x4) recorded, not billed ───────── Subtotal: $178.00 Est. given to customer: $180.00
# 5. Technician Productivity Reporting
Because parts and labor are tracked per technician per ticket, the system can generate detailed productivity and profitability reports that are unavailable in AIM.
Report
Description
Revenue per technician
Total billed labor and parts per tech per period
Gross margin per ticket
Revenue minus labor cost minus parts cost per ticket
Parts usage by tech
Which parts each technician uses — identifies unusual consumption
Bow rehair analysis
Rehairs completed, hair consumed per size, yield per hank
Shop supply expense
Overhead cost of shop supplies by period and by technician
Average turnaround time
Intake to completion per tech and per repair type
Estimate accuracy
Actual vs estimated cost variance per tech
Flat rate profitability
Margin on flat-rate services — e.g. are rehair rates covering costs
# 6. Business Rules
- Shop supply parts logged for cost tracking but never appear on customer invoice
- Flat-rate services show as single line item on invoice — hair/material consumption tracked internally
- Parts costs recorded at time of use — historical accuracy preserved if costs change
- Technician cannot log more parts than qty_on_hand — system warns and blocks
- Dual-use parts logged in repair decrease sale inventory qty_on_hand automatically
- Estimate approval required before work begins — waivable with manager override
- Actual cost variance from estimate requires reason code logged in audit trail
- Batch repair approval cascades to all child tickets
- Repair complete status triggers customer notification via preferred channel
- Delivered status set by delivery domain completion — not manually