feat(backend, frontend): Erweiterung der Falukant-Benutzerverwaltung um Branch- und Lageraktualisierungsfunktionen

- Hinzufügen von Routen und Methoden zur Verwaltung von Niederlassungen und Lagerbeständen im AdminController und AdminService.
- Implementierung der Logik zum Abrufen von Niederlassungen und Aktualisieren von Lagerbeständen.
- Anpassung der Benutzeroberfläche zur Unterstützung der neuen Funktionen, einschließlich eines Tab-Systems zur Anzeige von Benutzerdaten und Niederlassungen.
- Aktualisierung der Übersetzungen für die neuen Funktionen in den Sprachdateien.
This commit is contained in:
Torsten Schulz (local)
2025-08-31 15:29:39 +02:00
parent dc8ded578a
commit 8a03c04668
8 changed files with 457 additions and 24 deletions

View File

@@ -15,6 +15,11 @@ import FalukantUser from "../models/falukant/data/user.js";
import FalukantCharacter from "../models/falukant/data/character.js";
import FalukantPredefineFirstname from "../models/falukant/predefine/firstname.js";
import FalukantPredefineLastname from "../models/falukant/predefine/lastname.js";
import Branch from "../models/falukant/data/branch.js";
import FalukantStock from "../models/falukant/data/stock.js";
import FalukantStockType from "../models/falukant/type/stock.js";
import RegionData from "../models/falukant/data/region.js";
import BranchType from "../models/falukant/type/branch.js";
import Room from '../models/chat/room.js';
class AdminService {
@@ -251,6 +256,63 @@ class AdminService {
return user;
}
async getFalukantUserBranches(userId, falukantUserId) {
if (!(await this.hasUserAccess(userId, 'falukantusers'))) {
throw new Error('noaccess');
}
try {
// Zuerst die Branches laden
const branches = await Branch.findAll({
where: {
falukantUserId: falukantUserId
}
});
// Dann für jede Branch die zusätzlichen Daten laden
const branchesWithData = await Promise.all(branches.map(async (branch) => {
const region = await RegionData.findByPk(branch.regionId);
const branchType = await BranchType.findByPk(branch.branchTypeId);
const stocks = await FalukantStock.findAll({
where: { branchId: branch.id },
include: [{
model: FalukantStockType,
as: 'stockType',
attributes: ['labelTr']
}]
});
return {
...branch.toJSON(),
region: region ? { name: region.name } : null,
branchType: branchType ? { labelTr: branchType.labelTr } : null,
stocks: stocks
};
}));
return branchesWithData;
} catch (error) {
console.error('Error in getFalukantUserBranches:', error);
throw error;
}
}
async updateFalukantStock(userId, stockId, quantity) {
if (!(await this.hasUserAccess(userId, 'falukantusers'))) {
throw new Error('noaccess');
}
const stock = await FalukantStock.findByPk(stockId);
if (!stock) {
throw new Error('Stock not found');
}
stock.quantity = quantity;
await stock.save();
return stock;
}
async changeFalukantUser(userId, falukantUserId, falukantData) {
if (!(await this.hasUserAccess(userId, 'falukantusers'))) {
throw new Error('noaccess');