feat(political-benefits): implement political powers and benefits system

- Added new political powers and benefits functionalities, including reputation ticks, tax jurisdiction management, and appointment capabilities.
- Introduced a new job for periodic reputation updates and created necessary database tables for tracking political benefits.
- Enhanced the FalukantController and services to support new endpoints for managing political powers and appointments.
- Updated localization files to reflect new features and improve user experience across multiple languages.
- Modified the UI to display new political powers and benefits, ensuring accurate representation in the PoliticsView.
This commit is contained in:
Torsten Schulz (local)
2026-04-02 16:00:29 +02:00
parent 2c9efdc0c0
commit 8147a50845
19 changed files with 1572 additions and 2 deletions

View File

@@ -342,6 +342,9 @@
<!-- Liebhaber / Geliebte -->
<div class="lovers-section">
<h3>{{ $t('falukant.family.lovers.title') }}</h3>
<p v-if="politicalFreeLoverSlots > 0" class="lovers-political-hint">
{{ $t('falukant.family.lovers.politicalFreeSlotsHint', { count: politicalFreeLoverSlots }) }}
</p>
<div v-if="lovers && lovers.length > 0" class="lovers-grid">
<article v-for="lover in lovers" :key="lover.relationshipId" class="lover-card surface-card">
<div class="lover-card__header">
@@ -377,7 +380,12 @@
</div>
<div>
<dt>{{ $t('falukant.family.lovers.monthlyCost') }}</dt>
<dd>{{ formatCost(lover.monthlyCost || 0) }}</dd>
<dd>
{{ formatCost(lover.monthlyCost || 0) }}
<span v-if="lover.politicalFreeMaintenance" class="lover-political-free">
{{ $t('falukant.family.lovers.politicalFreeMaintenance') }}
</span>
</dd>
</div>
<div>
<dt>{{ $t('falukant.family.lovers.statusFit') }}</dt>
@@ -476,6 +484,7 @@ export default {
relationships: [],
children: [],
lovers: [],
politicalFreeLoverSlots: 0,
possibleLovers: [],
candidateRoles: {},
deathPartners: [],
@@ -655,6 +664,7 @@ export default {
this.relationships = response.data.relationships;
this.children = response.data.children;
this.lovers = response.data.lovers;
this.politicalFreeLoverSlots = Number(response.data.politicalFreeLoverSlots) || 0;
this.possibleLovers = response.data.possibleLovers || [];
this.syncCandidateRoles();
this.proposals = response.data.possiblePartners;
@@ -1525,6 +1535,18 @@ export default {
background-color: #f9f9f9;
}
.lovers-political-hint {
font-size: 0.92rem;
color: var(--color-text-secondary);
margin: 0 0 12px 0;
}
.lover-political-free {
display: block;
font-size: 0.85rem;
color: var(--color-text-secondary);
margin-top: 4px;
}
.lovers-section {
ul {
list-style: none;