mivita/resources/lang/de/home.php
Kevin 5a38f4ac3e Statistik: uebrige Audit-Korrekturen (Abo-Regeln, Prognose, Sortierung)
A01 — Abo-Regeln waren ueber das Aktiv-Feld umgehbar. Das
Selbstbedienungsformular hat gar keinen Aktiv-Schalter, es spiegelt den Zustand
nur in einem versteckten Feld zurueck; `updateStatus()` hat den Wert trotzdem
uebernommen. Wer den Request manipulierte, konnte sein eigenes Abo dauerhaft
deaktivieren und so die Mindestlaufzeit umgehen, am Pausenpfad mit seinen
Sperren vorbei. Das Feld wirkt jetzt nur noch im Admin-Pfad.

A16 — Statuswechsel wurden nur aus dem Formular protokolliert. Recovery-Zahlung,
Retry, externe Erledigung und die DSGVO-Anonymisierung schreiben `active` direkt
auf das Modell. Das ist heikel, weil die historische Bestandsrueckrechnung ein
Abo verwirft, solange eine protokollierte Deaktivierung nicht durch eine
spaetere protokollierte Reaktivierung aufgehoben ist — ein stiller
`active = true` nimmt es dauerhaft aus allen Folgemonaten.

Der Eintrag liegt deshalb jetzt am Model (`UserAbo::logStatusTransition()`) und
nicht in den einzelnen Diensten: so kann ihn ein kuenftiger Schreibpfad nicht
vergessen, und er entsteht in derselben Transaktion wie die Statusaenderung.
Nebeneffekt: Die DSGVO-Anonymisierung setzt `active = false` ohne `cancel_date`
— bisher fiel ein so abgeschaltetes Abo rueckwirkend aus allen vergangenen
Monaten, jetzt bleibt die Historie korrekt.

A13 — Ein heute faelliges Abo galt ab Mitternacht als erledigt, der
Ausfuehrungsjob laeuft aber erst um 04:00. In diesem Fenster fehlten die Punkte
in der Prognose UND im Ist. Der neue Scope `UserAbo::scopeOpenExecutionUntil()`
zaehlt den heutigen Liefertag mit, solange keine Ausfuehrung angelegt ist —
genau diese Bedingung verhindert die Doppelzaehlung. Alle drei Prognosen nutzen
jetzt denselben Scope statt je einer eigenen Kopie der Datumsregel.

A11 — Der Namens-Tiebreak der Top 3 lief nach dem Abschneiden auf 25
Kandidaten, bei Gleichstand entschied also die Reihenfolge der Abfrage. Die
Auswahlgrenze wird jetzt um alle Gleichstaende an dieser Grenze erweitert, und
Kandidaten ohne Account fallen vorher weg statt die Plaetze zu blockieren. Als
letzte Regel entscheidet die user_id, damit eine gecachte Rangliste
reproduzierbar bleibt.

A14 — Sortiert wurde ueber den angezeigten Zellentext. Unter `en` liefert die
Anwendung `Y-m-d` und `1,000.00`, damit ergab jedes Datum 0 und `1,000.00` wurde
zur 1. Die Zellen tragen jetzt `data-sort-value` mit dem unformatierten Wert;
ohne Attribut gilt weiter der Textweg. Dabei mitgenommen: Umlaute landeten hinter
dem Z (jetzt localeCompare), leere Werte lagen als 0 zwischen den negativen
Stornowerten, und `next_date` wurde doppelt formatiert.

Ausserdem A08 (Prognose auch ohne erreichte Qualifikationsstufe), A09
(Summenzeile im Neupartner-CSV), A10 (Lieferungszahl vorgeladen), A17
(Faelligkeitsgruppen ohne Monatsueberlauf), A18 (Formelinhalte im CSV als Text)
und A19 (fehlgeschlagene Provisionsberechnung ist als solche erkennbar statt
0,00 EUR).

Audit-Befunde A01, A08, A09, A10, A11, A13, A14, A16, A17, A18, A19.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-10 11:19:38 +00:00

109 lines
6.7 KiB
PHP

<?php
return [
'' => '',
'MIVITA_Consultancy_agreement' => 'MIVITA_Beratervertrag',
'active_role' => 'Aktive Rolle',
'activities' => 'Aktivitäten',
'adjust_data' => 'Daten anpassen',
'adviser_membership_active' => 'Berater-Mitgliedschaft aktiv',
'adviser_onlineshop_active' => 'Berater-Online-Shop aktiv',
'adviser_onlineshop_inactive' => 'Berater-Shop inaktiv',
'advisor_account_inactive' => 'Berater-Account inaktiv',
'at' => 'am',
'change_your_email_address' => 'Ändere Deine E-Mail Adresse.',
'change_your_personal_data' => 'Ändere Deine persönlichen Daten.',
'change_your_personal_password' => 'Ändere Dein persönliches Passwort.',
'create_your_personal_password' => [
'' => 'Erstelle Dein persönlichen Passwort.',
],
'current_points_for' => 'Aktuelle Punkte für',
'data' => 'Daten',
'data_complete_unlocked' => 'Daten vollständig, freigeschaltet',
'declaration_of_consent' => 'Einverständniserklärung',
'email_verified' => 'E-Mail verifizier',
'expired_on' => 'abgelaufen am',
'log_out_and_see_you_soon' => 'Abmelden und bis bald.',
'login' => 'Anmeldung',
'manage_membership' => 'Mitgliedschaft verwalten',
'manage_membership_now_here' => 'Mitgliedschaft jetzt hier verwalten',
'membership' => 'Mitgliedschaft',
'news_updates' => 'Neuigkeiten & Updates',
'news_archive' => 'News-Archiv',
'news_archive_title' => 'Alle Neuigkeiten & Updates',
'news_archive_current' => 'Aktuelle News',
'news_archive_older' => 'Ältere Meldungen',
'news_archive_empty' => 'Keine älteren Meldungen vorhanden.',
'news_archive_link' => 'Alle News ansehen',
'news_back_to_dashboard' => 'Zurück zum Dashboard',
'open_since' => 'Eröffnet seit',
'open_your_shop' => 'Eröffne Deinen eigenen mivita-Shop',
'read_less' => 'Weniger anzeigen',
'read_more' => 'Mehr lesen',
'privacy_policy_approved' => 'Datenschutzerklärung zugestimmt',
'security' => 'Sicherheit',
'settings_your_shop' => 'Deine Shop-Einstellungen',
'shop_not_booked' => 'Shop nicht gebucht',
'today_is' => 'Heute ist',
'until' => 'bis zum',
'welcome_back' => 'Willkommen zurück',
'your_shop' => 'Dein Shop',
'commission_today' => 'Provision (Stand heute)',
'commission_unavailable' => 'Die Provisionsberechnung ist gerade nicht verfuegbar. Der Wert wird nachgetragen, sobald sie wieder laeuft.',
'payline_forecast_title' => 'Payline-Prognose zum 5. / 10. / 20. / 25.',
'payline_forecast_basis' => 'Basis: Paylinepunkte + persönliches Volumen',
'payline_forecast_hint' => 'Basis: aktueller Kundenumsatz + Teamumsatz (Payline). Dazu kommen kumuliert die bis zum jeweiligen Termin noch anstehenden Abo-Punkte deiner Payline (inkl. deiner eigenen Abos und Kundenabos). Prognose: Pausen, Kündigungen oder fehlgeschlagene Zahlungen können den Wert verändern.',
'forecast_day' => 'Prognose zum :date',
'forecast_upcoming' => 'Abo-Punkte offen',
'forecast_done' => 'Termin liegt bereits im Ist-Umsatz',
'monthly_statistics' => 'Monatsstatistik',
'customer_turnover_points' => 'Kunden-Umsatz Punkte',
'team_turnover_points' => 'Team-Umsatz Punkte',
'direct_new_partners' => 'Direkte Neupartner',
'team_new_partners' => 'Neupartner im Team',
'customer_subscriptions' => 'Kundenabos',
'team_subscriptions' => 'Teamabos',
'team_customer_subscriptions' => 'Team-Kundenabos',
'own_subscriptions' => 'Eigene Abos',
'own_customer_subscriptions' => 'Eigene Kundenabos',
'stats_group_turnover' => 'Umsatz',
'stats_group_new_partners' => 'Neupartner',
'stats_group_subscriptions' => 'Abos',
'own' => 'Eigene',
'live_calculation_hint' => 'Live-Berechnung (noch nicht abgeschlossen)',
'live_calculation_hint_text' => 'Wird erst zum Monatsende berechnet.',
'stats_group_team' => 'Team',
'firstlines_count' => 'Firstlines',
'team_partner_total' => 'Teampartner gesamt',
'payline_partner_count' => 'Teampartner in der Payline',
'payline_abo_count' => 'Abos in der Payline',
'payline_career_fallback_hint' => 'Gezählt nach den Ebenen deines Karriere-Levels: deine Qualifikation für diesen Monat steht noch aus. Sobald sie feststeht, zählt die Kachel nach den Ebenen der Qualifikationsstufe.',
'level_current' => 'Qualifikation in diesem Monat',
'level_career' => 'Karriere-Level',
'level_next_missing' => 'Für die Qualifikation als :level in diesem Monat fehlen dir noch :points Payline-Punkte.',
'level_next_missing_personal' => 'Zusätzlich fehlen :points Punkte persönliches Volumen.',
'level_not_qualified_yet' => 'Noch nicht qualifiziert',
'level_next_missing_personal_only' => 'Für die Qualifikation als :level in diesem Monat fehlen dir noch :points Punkte persönliches Volumen.',
'level_top_reached' => 'Höchstes Level erreicht.',
'level_hint' => 'Monatliche Qualifikationsstufe aus dem Live-Lauf. Payline-Punkte = Teampunkte deiner bezahlten Ebenen inkl. deines Kundenpunkte-Überschusses.',
'forecast_level_title' => 'Level & Provision laut Prognose (Stand 25.)',
'forecast_unverbindlich' => 'unverbindlich',
'forecast_level_disclaimer' => 'Schätzung auf Basis der heutigen Punkte plus der noch offenen Abo-Lieferungen. Rang-/Strukturänderungen im Team sind nicht berücksichtigt - verbindlich ist erst der Monatsabschluss.',
'forecast_level_needs_qualification' => 'Level- und Provisions-Prognose erscheint, sobald deine Qualifikation für diesen Monat feststeht — die Provisionssätze hängen an der Qualifikationsstufe.',
'forecast_level_reached' => 'Laut Prognose erreichst du das nächste Level :level - sofern dein persönliches Volumen von :volume Punkten erreicht wird.',
'forecast_level_missing' => 'Laut Prognose fehlen zum nächsten Level :level noch :points Payline-Punkte.',
'forecast_level_missing_personal' => 'Zusätzlich fehlen :points Punkte persönliches Volumen.',
'forecast_commission' => 'Voraussichtliche Provision laut Prognose: :amount (auf Basis Level :level).',
'forecast_commission_no_level' => 'Voraussichtliche Provision laut Prognose: :amount. Team-Provision kommt hinzu, sobald die erste Qualifikationsstufe erreicht ist.',
// N6: "Die besten Ergebnisse des Monats" (teamintern)
'top_results_title' => 'Die besten Ergebnisse des Monats (Team)',
'top_results_volume' => 'Top 3 persönliches Volumen',
'top_results_recruiters' => 'Top 3 Neupartner',
'top_results_new_abos' => 'Top 3 neue Abos',
'top_results_self' => 'ich',
'top_results_empty' => 'Noch keine Ergebnisse in diesem Monat.',
'top_results_unit_points' => 'Punkte',
'top_results_unit_partners' => 'Neupartner',
'top_results_unit_abos' => 'Abos',
];