ticket: site metadata header + scannable Albanian ticket; widen barcode
- site_config gains optional park identity (park_name, operator_name, nius, address, phone, email); additive Drizzle migration 0001. GET/PUT /api/site-config read/write the full config (PUT partial patch, admin only); SiteSettings + SetupWizard expose the fields. - renderTicket() prints an Albanian header sourced from site_config, the all-numeric 13-digit ticket id (12 random + Luhn) as Code128, large digits, and a lost-ticket footer. CP852 codepage so ë/ç render. - Widen the Code128 module width 2->3 and height 80->100 dots so the short-range "Simple" QR/barcode reader decodes reliably (was barely reading at module width 2 on the 80mm head). See wiki/concepts/site-metadata.md and ticket-encoding.md.
This commit is contained in:
@@ -131,9 +131,26 @@ export const setupState = sqliteTable("setup_state", {
|
||||
// Single-row site settings (admin-configurable). The home for site-wide knobs;
|
||||
// `capacity` is the nominal space count the FULL gate refuses transient entry at
|
||||
// (null = no cap). See wiki/concepts/capacity-occupancy.md.
|
||||
// Park identity/metadata (all optional) lives here too — display name, the legal
|
||||
// operator, the NIUS tax id, address and contact. These feed the ticket/receipt
|
||||
// header (park name + NIUS are commonly required on an Albanian parking receipt)
|
||||
// and admin display. All nullable: the lot runs fine with none set.
|
||||
// See wiki/concepts/site-metadata.md.
|
||||
export const siteConfig = sqliteTable("site_config", {
|
||||
id: integer("id").primaryKey(), // always 1
|
||||
capacity: integer("capacity"), // null = no capacity limit
|
||||
/** Park display name shown on the ticket header / UI (e.g. "Acme Parking"). */
|
||||
parkName: text("park_name"),
|
||||
/** Legal entity operating the lot, for receipts (may differ from parkName). */
|
||||
operatorName: text("operator_name"),
|
||||
/** NIUS — Albanian tax/identification number, printed on the receipt when set. */
|
||||
nius: text("nius"),
|
||||
/** Free-text postal address (multi-line allowed). */
|
||||
address: text("address"),
|
||||
/** Contact phone — also used for the ticket "lost ticket? call …" footer. */
|
||||
phone: text("phone"),
|
||||
/** Contact email. */
|
||||
email: text("email"),
|
||||
updatedAt: text("updated_at")
|
||||
.notNull()
|
||||
.default(sql`(current_timestamp)`),
|
||||
|
||||
Reference in New Issue
Block a user