Skip to content

Commit 4973c20

Browse files
committed
feat: add internalCode (article code) to menu entries
- DB migration: ALTER TABLE menu_entries ADD COLUMN internal_code TEXT - Schema: internalCode in CatalogEntrySchema, CreateEntryBody, UpdateEntryBody - Backend: catalog builder maps internalCode; admin routes handle create/update - Store: catalogToStore maps internalCode to MenuEntry - List view: shows code in gray monospace top-right of item name - Detail view: shows code alongside title (both image/no-image layouts) - MenuItemDetail (bottom sheet): passes internalCode through - Chat bubble (ItemCard): shows code next to item name in Tony cards - Admin EditEntryPage: internalCode form field + live preview - i18n: internalCodeLabel + internalCodePlaceholder in all 10 locales - Fix pre-existing test TS errors (as never -> as unknown as Type)
1 parent 5806558 commit 4973c20

25 files changed

Lines changed: 97 additions & 19 deletions
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- Add internal article code to menu entries (optional, kitchen/POS use)
2+
ALTER TABLE menu_entries ADD COLUMN internal_code TEXT;

backend/src/db/schema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export const menuEntries = sqliteTable(
111111
.references(() => menuCategories.id, { onDelete: 'cascade' }),
112112
name: text('name').notNull(),
113113
description: text('description'),
114+
internalCode: text('internal_code'),
114115
// Prices stored as integer cents (€12.50 → 1250) to avoid IEEE 754 float drift.
115116
// Divide by 100 when returning to API clients.
116117
price: integer('price').notNull(),

backend/src/routes/admin.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ admin.post('/categories/:categoryId/entries', ...base, async (c) => {
459459
hidden: body.hidden ?? false,
460460
allergens: body.allergens || null,
461461
i18n: body.i18n || null,
462+
internalCode: body.internalCode ?? null,
462463
});
463464

464465
if (body.menuIds && body.menuIds.length > 0) {
@@ -488,6 +489,7 @@ admin.put('/entries/:entryId', ...base, async (c) => {
488489
if (body.priceUnit !== undefined) updates.priceUnit = body.priceUnit;
489490
if (body.i18n !== undefined) updates.i18n = body.i18n;
490491
if (body.hidden !== undefined) updates.hidden = body.hidden;
492+
if (body.internalCode !== undefined) updates.internalCode = body.internalCode ?? null;
491493

492494
const db = c.get('db');
493495
await db

backend/src/routes/catalog.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ export async function buildCatalogFromDb(
404404
id: e.id,
405405
name: e.name,
406406
description: e.description,
407+
internalCode: e.internalCode ?? null,
407408
price: e.price / 100,
408409
priceUnit: e.priceUnit,
409410
imageUrl: e.imageUrl,

packages/schemas/src/admin.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export const CreateEntryBodySchema = z.object({
5959
menuIds: z.array(z.string()).optional(),
6060
labelIds: z.array(z.string()).optional(),
6161
hidden: z.boolean().optional(),
62+
internalCode: z.string().nullable().optional(),
6263
});
6364
export type CreateEntryBody = z.infer<typeof CreateEntryBodySchema>;
6465

@@ -74,6 +75,7 @@ export const UpdateEntryBodySchema = z.object({
7475
menuIds: z.array(z.string()).optional(),
7576
labelIds: z.array(z.string()).optional(),
7677
hidden: z.boolean().optional(),
78+
internalCode: z.string().nullable().optional(),
7779
});
7880
export type UpdateEntryBody = z.infer<typeof UpdateEntryBodySchema>;
7981

packages/schemas/src/catalog.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const CatalogEntrySchema = z.object({
2020
id: z.string(),
2121
name: z.string(),
2222
description: z.string().nullable(),
23+
internalCode: z.string().nullable().optional(),
2324
price: z.number(),
2425
priceUnit: z.string().nullable(),
2526
imageUrl: z.string().nullable(),

web/messages/de.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@
234234
"entries.modal.descPrimary": "Beschreibung ({locale} - Hauptsprache)",
235235
"entries.modal.descPlaceholder": "Item description...",
236236
"entries.modal.priceLabel": "Price (€)",
237+
"entries.modal.internalCodeLabel": "Article code",
238+
"entries.modal.internalCodePlaceholder": "e.g. 042",
237239
"entries.modal.unitLabel": "Unit",
238240
"entries.modal.unitPlaceholder": "kg, l...",
239241
"entries.modal.outOfStock": "Out of stock",

web/messages/en.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@
234234
"entries.modal.descPrimary": "Description ({locale} - primary)",
235235
"entries.modal.descPlaceholder": "Item description...",
236236
"entries.modal.priceLabel": "Price (€)",
237+
"entries.modal.internalCodeLabel": "Article code",
238+
"entries.modal.internalCodePlaceholder": "e.g. 042",
237239
"entries.modal.unitLabel": "Unit",
238240
"entries.modal.unitPlaceholder": "kg, l...",
239241
"entries.modal.outOfStock": "Out of stock",

web/messages/es.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@
234234
"entries.modal.descPrimary": "Descripción ({locale} - principal)",
235235
"entries.modal.descPlaceholder": "Item description...",
236236
"entries.modal.priceLabel": "Price (€)",
237+
"entries.modal.internalCodeLabel": "Article code",
238+
"entries.modal.internalCodePlaceholder": "e.g. 042",
237239
"entries.modal.unitLabel": "Unit",
238240
"entries.modal.unitPlaceholder": "kg, l...",
239241
"entries.modal.outOfStock": "Out of stock",

web/messages/fr.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@
234234
"entries.modal.descPrimary": "Description ({locale} - principal)",
235235
"entries.modal.descPlaceholder": "Item description...",
236236
"entries.modal.priceLabel": "Price (€)",
237+
"entries.modal.internalCodeLabel": "Article code",
238+
"entries.modal.internalCodePlaceholder": "e.g. 042",
237239
"entries.modal.unitLabel": "Unit",
238240
"entries.modal.unitPlaceholder": "kg, l...",
239241
"entries.modal.outOfStock": "Out of stock",

0 commit comments

Comments
 (0)