feat(politics): update title eligibility messages and logic in PoliticsView

This commit is contained in:
Torsten Schulz (local)
2026-08-19 15:06:44 +02:00
parent 7a672d2f5c
commit 2c0944ae2c
4 changed files with 18 additions and 32 deletions

View File

@@ -7195,29 +7195,9 @@ class FalukantService extends BaseService {
order: [['hierarchyLevel', 'ASC'], ['id', 'ASC']]
});
const nameToId = new Map(allTypes.map((t) => [t.name, t.id]));
const titleId = character.titleOfNobility ?? character.nobleTitle?.id;
const allowedOfficeNames = await getAllowedOfficeTypeNamesByTitle(titleId);
const [titles, officeEligibilityBenefits] = await Promise.all([
TitleOfNobility.findAll({ attributes: ['id', 'labelTr', 'level'] }),
TitleBenefit.findAll({
where: { benefitType: 'office_eligibility' },
attributes: ['titleId', 'parameters']
})
]);
const titleById = new Map(titles.map((title) => [Number(title.id), title]));
const minimumTitleByOfficeName = new Map();
for (const benefit of officeEligibilityBenefits) {
const officeNames = benefit.parameters?.officeTypeNames;
const title = titleById.get(Number(benefit.titleId));
if (!Array.isArray(officeNames) || !title) continue;
for (const officeName of officeNames) {
const currentMinimum = minimumTitleByOfficeName.get(officeName);
if (!currentMinimum || title.level < currentMinimum.level) {
minimumTitleByOfficeName.set(officeName, title);
}
}
}
const titles = await TitleOfNobility.findAll({ attributes: ['labelTr', 'level'] });
const titleByLabel = new Map(titles.map((title) => [title.labelTr, title]));
const characterTitleLabel = character.nobleTitle?.labelTr;
return allTypes.map((typeRow) => {
const type = typeRow.get({ plain: true });
@@ -7225,6 +7205,9 @@ class FalukantService extends BaseService {
const requiredOfficeNames = [...new Set(
prereqRows.flatMap((pr) => Array.isArray(pr?.prerequisite?.jobs) ? pr.prerequisite.jobs : [])
)];
const requiredTitleLabels = [...new Set(
prereqRows.flatMap((pr) => Array.isArray(pr?.prerequisite?.titles) ? pr.prerequisite.titles : [])
)];
const matchedOfficeNames = requiredOfficeNames.filter((officeName) => {
const reqId = nameToId.get(officeName);
@@ -7232,9 +7215,12 @@ class FalukantService extends BaseService {
});
const prerequisitesMet = requiredOfficeNames.length === 0 || matchedOfficeNames.length > 0;
const titleEligible = allowedOfficeNames.size === 0 || allowedOfficeNames.has(type.name);
const titleEligible = requiredTitleLabels.length === 0 || requiredTitleLabels.includes(characterTitleLabel);
const canApplyNow = canApplyByAge && titleEligible && prerequisitesMet;
const requiredTitle = minimumTitleByOfficeName.get(type.name);
const requiredTitle = requiredTitleLabels
.map((titleLabel) => titleByLabel.get(titleLabel))
.filter(Boolean)
.sort((a, b) => a.level - b.level)[0];
return {
officeTypeId: type.id,