feat: repair-POS integration, receipt formats, manager overrides, price adjustments
- Add thermal/full-page receipt format toggle (per-device, localStorage) - Full-page receipt uses clean invoice layout matching repair PDF style - Settings page reorganized into tabbed sections (Store, Locations, Modules, Receipt, POS Security, Advanced) - Manager override system: configurable PIN prompt for void, refund, discount, cash in/out - Discount threshold setting: require manager approval above X% - Consumable product type: tracked for internal job costing, excluded from POS search, receipts, and customer-facing totals - Repair line item dialog: product picker dropdown for parts/consumables from inventory - Repair → POS checkout: load ready-for-pickup tickets into repair_payment transactions with proper tax categories (labor=service, parts=goods) - Transaction completion auto-updates repair ticket status to picked_up - POS Repairs dialog with Pickup and New Intake tabs, customer account lookup - Inline price adjustment on cart items: % off, $ off, or set price with live preview - Order-level discount button with same three input modes - Backend: migration 0043 (consumable enum + is_consumable flag), createFromRepairTicket service, ready-for-pickup endpoint - Fix: backend dev script uses --env-file for turbo compatibility Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -85,8 +85,9 @@ export function generateRepairPdf({ ticket, lineItems, notes, includeNotes, comp
|
||||
doc.text(dateInfo, 14, y)
|
||||
y += 8
|
||||
|
||||
// Line items table
|
||||
if (lineItems.length > 0) {
|
||||
// Line items table (exclude consumables — internal only)
|
||||
const billableItems = lineItems.filter((i) => i.itemType !== 'consumable')
|
||||
if (billableItems.length > 0) {
|
||||
doc.setDrawColor(200)
|
||||
doc.line(14, y, 196, y)
|
||||
y += 6
|
||||
@@ -109,7 +110,7 @@ export function generateRepairPdf({ ticket, lineItems, notes, includeNotes, comp
|
||||
|
||||
// Table rows
|
||||
doc.setFont('helvetica', 'normal')
|
||||
for (const item of lineItems) {
|
||||
for (const item of billableItems) {
|
||||
if (y > 270) { doc.addPage(); y = 20 }
|
||||
doc.text(item.itemType.replace('_', ' '), 16, y)
|
||||
const descLines = doc.splitTextToSize(item.description, 85)
|
||||
@@ -127,7 +128,7 @@ export function generateRepairPdf({ ticket, lineItems, notes, includeNotes, comp
|
||||
y += 5
|
||||
doc.setFont('helvetica', 'bold')
|
||||
doc.setFontSize(10)
|
||||
const total = lineItems.reduce((sum, i) => sum + parseFloat(i.totalPrice), 0)
|
||||
const total = billableItems.reduce((sum, i) => sum + parseFloat(i.totalPrice), 0)
|
||||
doc.text('Total:', 155, y, { align: 'right' })
|
||||
doc.text(`$${total.toFixed(2)}`, 190, y, { align: 'right' })
|
||||
y += 4
|
||||
|
||||
Reference in New Issue
Block a user