From 02d24eccd8bae0415a95089e37f75bfc20355764 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 14 Jan 2026 15:29:53 +0100 Subject: [PATCH] Add 'sleep' status to Production model and update related components - Introduced a new 'sleep' boolean field in the Production model to indicate if production is suspended. - Updated FalukantService to include 'sleep' in the production attributes. - Enhanced MessagesDialog and ProductionSection components to display the production status and handle branch names. - Added corresponding translations for 'status', 'sleep', and 'active' in both German and English locale files. --- backend/models/falukant/data/production.js | 7 ++++- backend/services/falukantService.js | 2 +- .../components/falukant/MessagesDialog.vue | 27 ++++++++++++++++--- .../components/falukant/ProductionSection.vue | 7 ++++- frontend/src/i18n/locales/de/falukant.json | 5 +++- frontend/src/i18n/locales/en/falukant.json | 27 +++++++++++++++++-- 6 files changed, 65 insertions(+), 10 deletions(-) diff --git a/backend/models/falukant/data/production.js b/backend/models/falukant/data/production.js index 8785ee7..d991755 100644 --- a/backend/models/falukant/data/production.js +++ b/backend/models/falukant/data/production.js @@ -22,7 +22,12 @@ Production.init({ startTimestamp: { type: DataTypes.DATE, allowNull: false, - defaultValue: sequelize.literal('CURRENT_TIMESTAMP')} + defaultValue: sequelize.literal('CURRENT_TIMESTAMP')}, + sleep: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + comment: 'Produktion ist zurückgestellt'} }, { sequelize, modelName: 'Production', diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index ce22f86..cd90b6a 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -838,7 +838,7 @@ class FalukantService extends BaseService { { model: Production, as: 'productions', - attributes: ['quantity', 'startTimestamp'], + attributes: ['quantity', 'startTimestamp', 'sleep'], include: [{ model: ProductType, as: 'productType', attributes: ['id', 'category', 'labelTr', 'sellCost', 'productionTime'] }] } ], diff --git a/frontend/src/components/falukant/MessagesDialog.vue b/frontend/src/components/falukant/MessagesDialog.vue index 2d973bc..6db2b64 100644 --- a/frontend/src/components/falukant/MessagesDialog.vue +++ b/frontend/src/components/falukant/MessagesDialog.vue @@ -50,18 +50,32 @@ export default { page: 1, size: 10, total: 0, - pageInput: 1, + pageInput: 1, + branches: [], // Cache für Branch-Namen }; }, methods: { async open() { this.page = 1; - this.pageInput = 1; + this.pageInput = 1; + await this.loadBranches(); // Branches laden für Branch-Namen await this.load(); this.$refs.dlg.open(); // mark unread as shown try { await apiClient.post('/api/falukant/notifications/mark-shown'); } catch {} }, + async loadBranches() { + try { + const result = await apiClient.get('/api/falukant/branches'); + this.branches = result.data.map(branch => ({ + id: branch.id, + cityName: branch.region.name, + })); + } catch (error) { + console.error('Error loading branches:', error); + this.branches = []; + } + }, async markAll() { try { await apiClient.post('/api/falukant/notifications/mark-shown'); @@ -268,9 +282,14 @@ export default { formatted.value = Number(params.value); } - // Filiale-Information + // Filiale-Information mit Branch-Namen if (params.branch_id !== undefined && params.branch_id !== null) { - formatted.branch_info = ` (Filiale #${params.branch_id})`; + const branch = this.branches.find(b => b.id === params.branch_id); + if (branch && branch.cityName) { + formatted.branch_info = ` (${branch.cityName})`; + } else { + formatted.branch_info = ` (Filiale #${params.branch_id})`; + } } else { formatted.branch_info = ''; } diff --git a/frontend/src/components/falukant/ProductionSection.vue b/frontend/src/components/falukant/ProductionSection.vue index 5d159c0..6c4ca68 100644 --- a/frontend/src/components/falukant/ProductionSection.vue +++ b/frontend/src/components/falukant/ProductionSection.vue @@ -9,6 +9,7 @@ {{ $t('falukant.branch.production.quantity') }} {{ $t('falukant.branch.production.ending') }} {{ $t('falukant.branch.production.remainingTime') }} + {{ $t('falukant.branch.production.status') }} @@ -16,7 +17,11 @@ {{ $t(`falukant.product.${production.productType.labelTr}`) }} {{ production.quantity }} {{ calculateEndDateTime(production.startTimestamp, production.productType.productionTime) }} - {{ calculateRemainingTime(production.startTimestamp, production.productType.productionTime) }} s + {{ production.sleep ? '-' : calculateRemainingTime(production.startTimestamp, production.productType.productionTime) + ' s' }} + + {{ $t('falukant.branch.production.sleep') }} + {{ $t('falukant.branch.production.active') }} + diff --git a/frontend/src/i18n/locales/de/falukant.json b/frontend/src/i18n/locales/de/falukant.json index cdcffe8..b2634ce 100644 --- a/frontend/src/i18n/locales/de/falukant.json +++ b/frontend/src/i18n/locales/de/falukant.json @@ -320,7 +320,10 @@ "current": "Laufende Produktionen", "product": "Produkt", "remainingTime": "Verbleibende Zeit (Sekunden)", - "noProductions": "Keine laufenden Produktionen." + "noProductions": "Keine laufenden Produktionen.", + "status": "Status", + "sleep": "Zurückgestellt", + "active": "Aktiv" }, "columns": { "city": "Stadt", diff --git a/frontend/src/i18n/locales/en/falukant.json b/frontend/src/i18n/locales/en/falukant.json index 5b09c50..92caa9b 100644 --- a/frontend/src/i18n/locales/en/falukant.json +++ b/frontend/src/i18n/locales/en/falukant.json @@ -192,8 +192,31 @@ "storage": "Storage", "transport": "Transport", "taxes": "Taxes" - } - ,"taxes": { + }, + "production": { + "title": "Production", + "info": "Details about production in the branch.", + "selectProduct": "Select product", + "quantity": "Quantity", + "storageAvailable": "Free storage", + "cost": "Cost", + "duration": "Duration", + "revenue": "Revenue", + "start": "Start production", + "success": "Production started successfully!", + "error": "Error starting production.", + "minutes": "Minutes", + "ending": "Completed:", + "time": "Time", + "current": "Running productions", + "product": "Product", + "remainingTime": "Remaining time (seconds)", + "noProductions": "No running productions.", + "status": "Status", + "sleep": "Suspended", + "active": "Active" + }, + "taxes": { "title": "Taxes", "loading": "Loading tax data...", "loadingError": "Failed to load tax data: {error}",