From f2343098d20f5b604f0faf079b64550b547bd1f8 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 23 Mar 2026 11:11:40 +0100 Subject: [PATCH] Refactor political office type references in FalukantService: Update the alias for PoliticalOfficeType from 'officeType' to 'type' in multiple locations to improve clarity and consistency in candidate ranking logic. --- backend/services/falukantService.js | 12 +- docs/FALUKANT_DEBTORS_PRISON_CONCEPT.md | 403 ++++++++++++++++++++++++ 2 files changed, 409 insertions(+), 6 deletions(-) create mode 100644 docs/FALUKANT_DEBTORS_PRISON_CONCEPT.md diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index 4b5fe95..152427c 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -5373,7 +5373,7 @@ class FalukantService extends BaseService { const [politicalOffices, politicalHistories] = await Promise.all([ PoliticalOffice.findAll({ where: { characterId: character.id }, - include: [{ model: PoliticalOfficeType, as: 'officeType', attributes: ['name'] }], + include: [{ model: PoliticalOfficeType, as: 'type', attributes: ['name'] }], attributes: ['officeTypeId'] }), PoliticalOfficeHistory.findAll({ @@ -5385,8 +5385,8 @@ class FalukantService extends BaseService { const candidates = [ ...politicalOffices.map((office) => ({ - rank: POLITICAL_OFFICE_RANKS[office.officeType?.name] || 0, - name: office.officeType?.name || null + rank: POLITICAL_OFFICE_RANKS[office.type?.name] || 0, + name: office.type?.name || null })), ...politicalHistories.map((history) => ({ rank: POLITICAL_OFFICE_RANKS[history.officeTypeHistory?.name] || 0, @@ -5407,7 +5407,7 @@ class FalukantService extends BaseService { const [politicalOffices, politicalHistories, churchOffices] = await Promise.all([ PoliticalOffice.findAll({ where: { characterId: character.id }, - include: [{ model: PoliticalOfficeType, as: 'officeType', attributes: ['name'] }], + include: [{ model: PoliticalOfficeType, as: 'type', attributes: ['name'] }], attributes: ['officeTypeId'] }), PoliticalOfficeHistory.findAll({ @@ -5424,8 +5424,8 @@ class FalukantService extends BaseService { const candidates = [ ...politicalOffices.map((office) => ({ - rank: POLITICAL_OFFICE_RANKS[office.officeType?.name] || 0, - name: office.officeType?.name || null, + rank: POLITICAL_OFFICE_RANKS[office.type?.name] || 0, + name: office.type?.name || null, source: 'political' })), ...politicalHistories.map((history) => ({ diff --git a/docs/FALUKANT_DEBTORS_PRISON_CONCEPT.md b/docs/FALUKANT_DEBTORS_PRISON_CONCEPT.md new file mode 100644 index 0000000..7c040c7 --- /dev/null +++ b/docs/FALUKANT_DEBTORS_PRISON_CONCEPT.md @@ -0,0 +1,403 @@ +# Falukant: Schuldturm, Pfändung und wirtschaftlicher Zusammenbruch + +Dieses Dokument beschreibt das Zielmodell für den **Schuldturm** in Falukant. Ausgangspunkt ist das bestehende Kreditsystem mit `credit` und dem bereits vorhandenen, aber noch ungenutzten Datenmodell `debtors_prism`. + +## 1. Bestandsaufnahme + +Bereits vorhanden: + +- Kredite in `falukant_data.credit` + - `amount` + - `remaining_amount` + - `interest_rate` + - `falukant_user_id` +- Bankübersicht in [BankView.vue](/mnt/share/torsten/Programs/YourPart3/frontend/src/views/falukant/BankView.vue) +- Modell `falukant_data.debtors_prism` über [debtors_prism.js](/mnt/share/torsten/Programs/YourPart3/backend/models/falukant/data/debtors_prism.js) +- Kreditaufnahme und Bankübersicht im Backend in [falukantService.js](/mnt/share/torsten/Programs/YourPart3/backend/services/falukantService.js) + +Noch nicht vorhanden: + +- fällige Kreditraten mit Verzug +- automatische Mahnlogik +- echte Schuldturm-Logik +- Pfändung / Verwertung von Vermögen +- Reputations- und Sozialfolgen +- Beziehungsfolgen für Liebhaber/Mätressen +- UI für Haftstatus / wirtschaftlichen Zusammenbruch + +Wichtig: + +- `debtors_prism` existiert bereits, ist aber funktional bisher nicht eingebunden. +- Ein Teil der eigentlichen Tick-Logik gehört in den externen Daemon. +- Das Backend muss dennoch Datenmodell, APIs und UI-Basis bereitstellen. + +## 2. Kernidee + +Wer seine Kreditverpflichtungen **über 3 Tage** nicht bedient, kommt in den **Schuldturm**. + +Schuldturm bedeutet: + +- Verlust wirtschaftlicher Handlungsfähigkeit +- staatliche / herrschaftliche Pfändung +- Zwangsverwertung veräußerbarer Güter +- sozialer und familiärer Absturz + +Das System soll nicht nur eine Geldstrafe sein, sondern ein spürbarer Statuswechsel im Spiel. + +## 3. Auslöser + +### 3.1 Kreditverzug + +Der Daemon prüft täglich: + +- welche Kreditrate fällig war +- ob sie bedient wurde +- wie viele Verzugstage bestehen + +Regel: + +- `missed_days >= 3` bei mindestens einem aktiven Kredit +- danach Eintritt in den Schuldturm + +### 3.2 Verhältnis zu Bankrott + +Schuldturm ist der **harte Bankrottpfad für private Kreditverschuldung**. + +Das bedeutet: + +- nicht jeder Geldmangel führt sofort in den Schuldturm +- aber anhaltender Kreditverzug schon + +Bankrott und Schuldturm können später getrennt modelliert werden: + +- `wirtschaftlicher Bankrott` +- `privater Kreditverzug / Schuldturm` + +Für die erste Stufe dürfen sie aber gekoppelt sein. + +## 4. Zustand "im Schuldturm" + +Ein Charakter im Schuldturm hat: + +- kein normales wirtschaftliches Standing +- stark eingeschränkten Zugriff auf Vermögen +- massive Reputations- und Standesfolgen + +Empfohlene Effekte: + +- keine neuen Kredite +- keine neuen großen Investitionen +- keine Standeserhöhung +- keine neuen prestigeträchtigen Ämter +- evtl. eingeschränkte politische / kirchliche Karriere + +## 5. Pfändungsreihenfolge + +Beim Eintritt in den Schuldturm oder im Anschluss über mehrere Ticks wird Vermögen verwertet. + +Empfohlene Reihenfolge: + +1. frei verfügbares Geld +2. Transportmittel / Fahrzeuge +3. Lagerbestände / verwertbare Waren +4. Häuser / Hausbesitz +5. Schließung von Standorten / Niederlassungen + +Wichtig: + +- Nicht alles muss in einem Tick geschehen. +- Sinnvoll ist ein mehrstufiger Abbau, damit die UI den Prozess sichtbar machen kann. + +## 6. Verwertbare Güter + +### 6.1 Fahrzeuge + +Transportmittel sollen verkauft werden, sofern sie nicht unpfändbar markiert sind. + +Folgen: + +- geringere Handlungsfähigkeit +- weniger Handelsoptionen + +### 6.2 Lager und Waren + +Lagerbestände und handelbare Waren sollen mit Abschlag verwertet werden. + +Ziel: + +- offene Kreditschuld reduzieren +- laufende Produktion destabilisieren + +### 6.3 Haus + +Das Haus soll gepfändet werden, wenn die Schuld nicht anders gedeckt werden kann. + +Folgen: + +- Rückfall auf ein niedrigeres Haus +- Einbruch bei Hauszustand, Hausstand und Dienerschaft +- negative Effekte auf Ehe, Haushalt und Stand + +### 6.4 Niederlassungen + +Standorte sollen geschlossen werden können, wenn Fahrzeuge/Waren/Haus nicht ausreichen. + +Empfehlung: + +- zuerst unrentable oder niedrigwertige Niederlassungen +- danach teurere / prestigeträchtigere + +## 7. Soziale Folgen + +### 7.1 Reputation + +Beim Eintritt in den Schuldturm: + +- spürbarer einmaliger Reputationsverlust + +Während der Haft: + +- täglicher oder periodischer weiterer Malus + +### 7.2 Kreditwürdigkeit + +Es braucht einen eigenen Zustand oder Wert: + +- `creditworthiness` + oder +- `credit_penalty_level` + +Folgen: + +- geringere `availableCredit` +- höhere Gebühren +- evtl. komplette Kreditsperre für längere Zeit + +### 7.3 Liebhaber / Mätressen + +Liebhaber/Mätressen können abspringen. + +Wirkung: + +- hohe Chance bei geringer Zuneigung oder niedriger Finanzierung +- höhere Chance bei öffentlich gewordenem Schuldturm +- repräsentative Beziehungen brechen eher bei massivem Statusverlust + +Mögliche Folgen: + +- Beziehungsende +- starke Senkung von `affection` +- Sichtbarkeit eines Skandals + +### 7.4 Ehe und Familie + +Der Schuldturm soll auch auf Ehe und Hausfrieden wirken: + +- `marriage_satisfaction` sinkt +- `household_tension_score` steigt +- Kinder-/Erbpfad kann instabiler werden + +## 8. Bezug zu bereits existierenden Systemen + +Der Schuldturm soll sich an bestehende Falukant-Systeme ankoppeln: + +- Kredite +- Haus / Dienerschaft +- Familie / Liebschaften +- Reputation +- Produktionszertifikat +- Sozialstatus + +### 8.1 Produktionszertifikat + +Bankrott / Schuldturm kann ein Sonderfall für Zertifikatsverlust sein. + +Das passt zur bereits dokumentierten Regel: + +- Herabstufung bei `Bankrott` + +### 8.2 Sozialstatus + +Während oder nach schwerem Schuldturm: + +- kein Aufstieg im Stand +- evtl. spätere Herabstufung im Extremfall + +Für die erste Stufe reicht: + +- Aufstieg blockieren + +## 9. Daemon-Aufgaben + +Der externe Daemon soll: + +### 9.1 täglich prüfen + +- fällige Kreditraten +- bezahlte / unbezahlte Beträge +- Verzugstage je Kredit oder Nutzer + +### 9.2 Schuldturm auslösen + +Wenn Verzug >= 3 Tage: + +- Schuldturmstatus setzen +- Reputations- und Kreditwürdigkeits-Malus anwenden +- Socket-Events senden + +### 9.3 Verwertung durchführen + +In geordneter Reihenfolge: + +- Geld abbuchen +- Fahrzeuge verkaufen +- Waren verwerten +- Häuser pfänden +- Niederlassungen schließen + +### 9.4 Familienfolgen anwenden + +- Ehe verschlechtern +- Haushaltsspannung erhöhen +- Liebschaften destabilisieren + +## 10. Event-Kommunikation zwischen Daemon und UI + +Neue Events: + +### 10.1 `falukantUpdateDebt` + +```json +{ + "event": "falukantUpdateDebt", + "user_id": 123, + "reason": "delinquency" +} +``` + +Mögliche `reason`: + +- `delinquency` +- `debtors_prison_entered` +- `asset_seizure` +- `branch_closure` +- `vehicle_liquidation` +- `house_seizure` +- `debtors_prison_released` + +### 10.2 UI-Reaktion + +- Bankansicht neu laden +- Haus neu laden +- Niederlassungen neu laden +- Statusbar / Dashboard neu laden +- Familienansicht ggf. neu laden + +Zusätzlich sinnvoll: + +- Toast für Eintritt in den Schuldturm +- Toast für Pfändung / Zwangsverkauf + +## 11. Backend-Aufgaben außerhalb des Daemons + +Das Backend muss: + +- Schuldturmstatus lesbar machen +- Bankansicht um Verzug / Haftstatus erweitern +- veräußerbare Güter für den Daemon eindeutig bereitstellen +- Endpunkte und UI-Infos für den Schuldturm liefern + +### 11.1 Datenmodell + +Da `debtors_prism` bereits existiert, bietet sich dieses Modell an für: + +- `character_id` +- `entered_at` +- `released_at` +- `status` +- `debt_at_entry` +- `remaining_debt` +- `reason` + +Falls die Tabelle noch nur `character_id` enthält, muss sie erweitert werden. + +### 11.2 Bank-API + +Die Bankübersicht soll später zusätzlich liefern: + +- `inDebtorsPrison` +- `daysOverdue` +- `nextForcedAction` +- `creditworthiness` + +## 12. UI-Anforderungen + +### 12.1 Bank + +In [BankView.vue](/mnt/share/torsten/Programs/YourPart3/frontend/src/views/falukant/BankView.vue): + +- Hinweis auf Zahlungsverzug +- Warnstufe bei 1 / 2 / 3 Tagen +- eigener Block für Schuldturmstatus + +### 12.2 Übersicht / Status + +In Falukant-Overview / StatusBar: + +- sichtbarer Status "Schuldturm" +- evtl. reduzierter Handlungsstatus + +### 12.3 Haus / Niederlassungen + +- Hinweise bei Pfändung / Zwangsverkauf +- Schließungsereignisse sichtbar machen + +### 12.4 Familie + +- Hinweise auf abgesprungene Liebhaber / Mätressen +- Auswirkungen auf Ehe / Haushalt sichtbar + +## 13. Empfohlene Umsetzung in Phasen + +### Phase D1: Basis + +- `debtors_prism` fachlich ausbauen +- Bank-API um Verzug und Haftstatus erweitern +- UI-Warnungen in Bank und Status + +### Phase D2: Verwertung + +- Fahrzeuge, Waren und Häuser als verwertbare Assets modellieren +- Daemon führt Pfändung schrittweise aus + +### Phase D3: Soziale Folgen + +- Reputation +- Kreditwürdigkeit +- Liebhaber / Mätressen +- Ehe / Hausfrieden + +### Phase D4: Langfristige Folgen + +- Produktionszertifikat +- Stand / Karriereblockaden +- eventuelle spätere Herabstufung + +## 14. Offene Punkte + +- genaue Kreditratenlogik im Daemon +- wie stark Häuser und Niederlassungen mit Abschlag verkauft werden +- ob Schuldturm zeitlich begrenzt oder rein schuldgetrieben endet +- ob Kreditwürdigkeit als eigener numerischer Wert gespeichert wird + +## 15. Empfehlung + +Für die erste echte Umsetzung: + +1. `debtors_prism` ausbauen +2. Verzugstage im Daemon sauber pflegen +3. Eintritt in den Schuldturm sichtbar machen +4. zuerst Fahrzeuge/Waren/Haus, erst danach Niederlassungen + +So bleibt der Spielzustand hart, aber nachvollziehbar und technisch gut integrierbar. +