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