fix: require open drawer to complete transactions, fix product price field
Some checks failed
CI / ci (pull_request) Failing after 20s
CI / e2e (pull_request) Has been skipped

- Backend enforces open drawer at location before completing any transaction
- Frontend disables payment buttons when drawer is closed with warning message
- Fix product price field name (price, not sellingPrice) in POS API types
- Fix seed UUIDs to use valid UUID v4 format (version nibble must be 1-8)
- Fix Vite allowedHosts for dev.lunarfront.tech access
- Add e2e test for drawer enforcement (39 POS tests now pass)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
ryan
2026-04-04 19:54:07 +00:00
parent bd3a25aa1c
commit 1673e18fe8
8 changed files with 125 additions and 44 deletions

View File

@@ -5,6 +5,7 @@ import {
transactionLineItems,
discountAudits,
discounts,
drawerSessions,
} from '../db/schema/pos.js'
import { products, inventoryUnits } from '../db/schema/inventory.js'
import { companies, locations } from '../db/schema/stores.js'
@@ -231,6 +232,18 @@ export const TransactionService = {
if (!txn) throw new NotFoundError('Transaction')
if (txn.status !== 'pending') throw new ConflictError('Transaction is not pending')
// Require an open drawer session at the transaction's location
if (txn.locationId) {
const [openDrawer] = await db
.select({ id: drawerSessions.id })
.from(drawerSessions)
.where(and(eq(drawerSessions.locationId, txn.locationId), eq(drawerSessions.status, 'open')))
.limit(1)
if (!openDrawer) {
throw new ValidationError('Cannot complete transaction without an open drawer at this location')
}
}
// Validate cash payment (with optional nickel rounding)
let changeGiven: string | undefined
let roundingAdjustment = 0