diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index 4166b35..52a5fc9 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -3793,6 +3793,37 @@ class FalukantService extends BaseService { return Math.round(cfg.min + (cfg.max - cfg.min) * p); } + /** Resolve character id for education: self = user's character, children/director = studentId */ + async _resolveLearningCharacterId(hashedUserId, student, studentId) { + if (student === 'self') { + const user = await getFalukantUserOrFail(hashedUserId); + const char = await FalukantCharacter.findOne({ where: { userId: user.id }, attributes: ['id'] }); + return char?.id ?? null; + } + return studentId ?? null; + } + + async getKnowledgeSingle(hashedUserId, student, studentId, productId) { + const characterId = await this._resolveLearningCharacterId(hashedUserId, student, studentId); + if (!characterId) throw new Error('Character not found'); + const row = await Knowledge.findOne({ + where: { characterId, productId }, + attributes: ['knowledge'] + }); + return { knowledge: row?.knowledge ?? 0 }; + } + + async getKnowledgeForAll(hashedUserId, student, studentId) { + const characterId = await this._resolveLearningCharacterId(hashedUserId, student, studentId); + if (!characterId) throw new Error('Character not found'); + const [products, knowledges] = await Promise.all([ + ProductType.findAll({ attributes: ['id'] }), + Knowledge.findAll({ where: { characterId }, attributes: ['productId', 'knowledge'] }) + ]); + const knowledgeMap = new Map((knowledges || []).map(k => [k.productId, k.knowledge ?? 0])); + return products.map(p => ({ productId: p.id, knowledge: knowledgeMap.get(p.id) ?? 0 })); + } + async sendToSchool(hashedUserId, item, student, studentId) { const falukantUser = await getFalukantUserOrFail(hashedUserId); @@ -3812,11 +3843,14 @@ class FalukantService extends BaseService { let percent; if (item === 'all') { const all = await this.getKnowledgeForAll(hashedUserId, student, studentId); - const sum = all.reduce((s, k) => s + k.knowledge, 0); - percent = sum / all.length; + if (!all.length) percent = 0; + else { + const sum = all.reduce((s, k) => s + (k.knowledge || 0), 0); + percent = sum / all.length; + } } else { const single = await this.getKnowledgeSingle(hashedUserId, student, studentId, item); - percent = single.knowledge; + percent = single.knowledge ?? 0; } // 4) Kosten berechnen