From b0379052d6566ca6dec6a2e08ff0dcae3b4a4ce4 Mon Sep 17 00:00:00 2001 From: Ryan Moon Date: Sun, 29 Mar 2026 11:45:41 -0500 Subject: [PATCH] Add 'new' status as default, in_transit becomes branch state New tickets start as 'new' (just created, not yet examined). In Transit is now a branch status off New for school pickups and shipped instruments. Intake means the instrument has been physically received and documented. Status progress bar, labels, filters, and default status all updated. Removed debug logging from file upload endpoint. --- .../admin/src/components/repairs/repair-filters.tsx | 3 ++- .../admin/src/components/repairs/status-progress.tsx | 5 +++-- packages/admin/src/components/repairs/ticket-notes.tsx | 2 +- .../src/routes/_authenticated/repairs/$ticketId.tsx | 10 ++++++++-- .../admin/src/routes/_authenticated/repairs/index.tsx | 2 ++ packages/admin/src/types/repair.ts | 2 +- .../src/db/migrations/0019_repair_new_status.sql | 1 + packages/backend/src/db/migrations/meta/_journal.json | 7 +++++++ packages/backend/src/db/schema/repairs.ts | 3 ++- packages/shared/src/schemas/repairs.schema.ts | 2 +- 10 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 packages/backend/src/db/migrations/0019_repair_new_status.sql diff --git a/packages/admin/src/components/repairs/repair-filters.tsx b/packages/admin/src/components/repairs/repair-filters.tsx index e5a22a1..abd83ca 100644 --- a/packages/admin/src/components/repairs/repair-filters.tsx +++ b/packages/admin/src/components/repairs/repair-filters.tsx @@ -6,6 +6,7 @@ import { Label } from '@/components/ui/label' import { Filter, X } from 'lucide-react' const ALL_STATUSES = [ + { value: 'new', label: 'New' }, { value: 'in_transit', label: 'In Transit' }, { value: 'intake', label: 'Intake' }, { value: 'diagnosing', label: 'Diagnosing' }, @@ -19,7 +20,7 @@ const ALL_STATUSES = [ { value: 'cancelled', label: 'Cancelled' }, ] -const ACTIVE_STATUSES = ['in_transit', 'intake', 'diagnosing', 'pending_approval', 'approved', 'in_progress', 'pending_parts', 'ready'] +const ACTIVE_STATUSES = ['new', 'in_transit', 'intake', 'diagnosing', 'pending_approval', 'approved', 'in_progress', 'pending_parts', 'ready'] const CONDITIONS = [ { value: 'excellent', label: 'Excellent' }, diff --git a/packages/admin/src/components/repairs/status-progress.tsx b/packages/admin/src/components/repairs/status-progress.tsx index 63bcade..85da7a2 100644 --- a/packages/admin/src/components/repairs/status-progress.tsx +++ b/packages/admin/src/components/repairs/status-progress.tsx @@ -1,7 +1,7 @@ -import { Check, Truck, ClipboardList, Search, Clock, ThumbsUp, Wrench, Package, HandMetal, Ban } from 'lucide-react' +import { Check, Truck, ClipboardList, Search, Clock, ThumbsUp, Wrench, Package, HandMetal, Ban, FilePlus } from 'lucide-react' const STEPS = [ - { key: 'in_transit', label: 'In Transit', icon: Truck }, + { key: 'new', label: 'New', icon: FilePlus }, { key: 'intake', label: 'Intake', icon: ClipboardList }, { key: 'diagnosing', label: 'Diagnosing', icon: Search }, { key: 'pending_approval', label: 'Pending Approval', icon: Clock }, @@ -12,6 +12,7 @@ const STEPS = [ ] as const const BRANCH_STATUSES: Record = { + in_transit: { label: 'In Transit', parentStep: 'new' }, pending_parts: { label: 'Pending Parts', parentStep: 'in_progress' }, delivered: { label: 'Delivered', parentStep: 'picked_up' }, } diff --git a/packages/admin/src/components/repairs/ticket-notes.tsx b/packages/admin/src/components/repairs/ticket-notes.tsx index b53f25b..ec22c33 100644 --- a/packages/admin/src/components/repairs/ticket-notes.tsx +++ b/packages/admin/src/components/repairs/ticket-notes.tsx @@ -112,10 +112,10 @@ export function TicketNotes({ ticketId }: TicketNotesProps) { // Upload attached photos to the note for (const photo of photos) { const formData = new FormData() - formData.append('file', photo) formData.append('entityType', 'repair_note') formData.append('entityId', note.id) formData.append('category', 'attachment') + formData.append('file', photo) const uploadRes = await fetch('/v1/files', { method: 'POST', headers: { Authorization: `Bearer ${token}` }, diff --git a/packages/admin/src/routes/_authenticated/repairs/$ticketId.tsx b/packages/admin/src/routes/_authenticated/repairs/$ticketId.tsx index 641aefb..4afb009 100644 --- a/packages/admin/src/routes/_authenticated/repairs/$ticketId.tsx +++ b/packages/admin/src/routes/_authenticated/repairs/$ticketId.tsx @@ -39,6 +39,7 @@ export const Route = createFileRoute('/_authenticated/repairs/$ticketId')({ }) const STATUS_LABELS: Record = { + new: 'New', in_transit: 'In Transit', intake: 'Intake', diagnosing: 'Diagnosing', @@ -52,7 +53,7 @@ const STATUS_LABELS: Record = { cancelled: 'Cancelled', } -const STATUS_FLOW = ['in_transit', 'intake', 'diagnosing', 'pending_approval', 'approved', 'in_progress', 'ready', 'picked_up'] +const STATUS_FLOW = ['new', 'intake', 'diagnosing', 'pending_approval', 'approved', 'in_progress', 'ready', 'picked_up'] const TABS = [ { key: 'details', label: 'Details' }, @@ -217,6 +218,11 @@ function RepairTicketDetailPage() { Move to {STATUS_LABELS[nextStatus]} )} + {ticket.status === 'new' && ( + + )} {ticket.status === 'in_progress' && ( )} diff --git a/packages/admin/src/routes/_authenticated/repairs/index.tsx b/packages/admin/src/routes/_authenticated/repairs/index.tsx index ce243b1..e077bb3 100644 --- a/packages/admin/src/routes/_authenticated/repairs/index.tsx +++ b/packages/admin/src/routes/_authenticated/repairs/index.tsx @@ -26,6 +26,7 @@ export const Route = createFileRoute('/_authenticated/repairs/')({ function statusBadge(status: string) { const variants: Record = { + new: 'outline', in_transit: 'secondary', intake: 'outline', diagnosing: 'secondary', @@ -39,6 +40,7 @@ function statusBadge(status: string) { cancelled: 'destructive', } const labels: Record = { + new: 'New', in_transit: 'In Transit', intake: 'Intake', diagnosing: 'Diagnosing', diff --git a/packages/admin/src/types/repair.ts b/packages/admin/src/types/repair.ts index 483e6f2..cde869b 100644 --- a/packages/admin/src/types/repair.ts +++ b/packages/admin/src/types/repair.ts @@ -14,7 +14,7 @@ export interface RepairTicket { conditionInNotes: string | null problemDescription: string technicianNotes: string | null - status: 'in_transit' | 'intake' | 'diagnosing' | 'pending_approval' | 'approved' | 'in_progress' | 'pending_parts' | 'ready' | 'picked_up' | 'delivered' | 'cancelled' + status: 'new' | 'in_transit' | 'intake' | 'diagnosing' | 'pending_approval' | 'approved' | 'in_progress' | 'pending_parts' | 'ready' | 'picked_up' | 'delivered' | 'cancelled' assignedTechnicianId: string | null estimatedCost: string | null actualCost: string | null diff --git a/packages/backend/src/db/migrations/0019_repair_new_status.sql b/packages/backend/src/db/migrations/0019_repair_new_status.sql new file mode 100644 index 0000000..150af8d --- /dev/null +++ b/packages/backend/src/db/migrations/0019_repair_new_status.sql @@ -0,0 +1 @@ +ALTER TYPE "repair_ticket_status" ADD VALUE 'new' BEFORE 'in_transit'; diff --git a/packages/backend/src/db/migrations/meta/_journal.json b/packages/backend/src/db/migrations/meta/_journal.json index 5b8b79f..b7233f2 100644 --- a/packages/backend/src/db/migrations/meta/_journal.json +++ b/packages/backend/src/db/migrations/meta/_journal.json @@ -134,6 +134,13 @@ "when": 1774780000000, "tag": "0018_repair_notes", "breakpoints": true + }, + { + "idx": 19, + "version": "7", + "when": 1774790000000, + "tag": "0019_repair_new_status", + "breakpoints": true } ] } \ No newline at end of file diff --git a/packages/backend/src/db/schema/repairs.ts b/packages/backend/src/db/schema/repairs.ts index 1cda409..2257b1f 100644 --- a/packages/backend/src/db/schema/repairs.ts +++ b/packages/backend/src/db/schema/repairs.ts @@ -17,6 +17,7 @@ import { users } from './users.js' // --- Enums --- export const repairTicketStatusEnum = pgEnum('repair_ticket_status', [ + 'new', 'in_transit', 'intake', 'diagnosing', @@ -112,7 +113,7 @@ export const repairTickets = pgTable('repair_ticket', { conditionInNotes: text('condition_in_notes'), problemDescription: text('problem_description').notNull(), technicianNotes: text('technician_notes'), - status: repairTicketStatusEnum('status').notNull().default('intake'), + status: repairTicketStatusEnum('status').notNull().default('new'), assignedTechnicianId: uuid('assigned_technician_id').references(() => users.id), estimatedCost: numeric('estimated_cost', { precision: 10, scale: 2 }), actualCost: numeric('actual_cost', { precision: 10, scale: 2 }), diff --git a/packages/shared/src/schemas/repairs.schema.ts b/packages/shared/src/schemas/repairs.schema.ts index 82ae6d2..bce2766 100644 --- a/packages/shared/src/schemas/repairs.schema.ts +++ b/packages/shared/src/schemas/repairs.schema.ts @@ -8,7 +8,7 @@ function opt(schema: T) { // --- Status / Type enums --- export const RepairTicketStatus = z.enum([ - 'in_transit', 'intake', 'diagnosing', 'pending_approval', 'approved', + 'new', 'in_transit', 'intake', 'diagnosing', 'pending_approval', 'approved', 'in_progress', 'pending_parts', 'ready', 'picked_up', 'delivered', 'cancelled', ]) export type RepairTicketStatus = z.infer