mivita/resources/lang/de/team.php
Kevin 640a05945b Statistiken: Review-Fixes vor Livegang (Fehldarstellungen + Test-Regression)
Ergebnis des Senior-Reviews über dev/2026-07-22 (Konzept 22.07., Feedback 24.07.,
Plan 19.08.). Rechnerisch war nichts zu korrigieren: Payline-Punkte und Provision
des Prognose-Blocks (N4) stimmen exakt mit der Provisions-Engine überein
(54.718,5 P. bzw. 3.772,88 EUR gegengerechnet an User 454). Behoben sind
Darstellungs- und Konsistenzfehler, die der Beraterin als falsche Zahlen
aufgefallen wären:

- "+N neu" schrumpfte rückwirkend, der Bestand daneben nicht: newAboCount() nutzte
  weiter activeAbo(), während aboStockCount() auf das Monatsende zurückrechnet.
  Beide teilen sich jetzt aboStockQuery(); die Jahres-Wachstumstabelle ebenso.
- Level-Kachel widersprach sich ("Zum nächsten Level Diamant fehlen X" über
  "Karriere-Level: Diamant"): Text auf die Monats-Qualifikation umformuliert
  (de/en/es/fr), Überschrift "Qualifikation in diesem Monat", Karriere-Level nur
  noch bei Abweichung.
- Firstlines-Kachel zählte alle direkten Partner, "Teampartner gesamt" daneben nur
  aktive (F1): Kachel nutzt jetzt isActiveConsultant(), die Detailseite listet
  weiter alle und weist beide Zahlen aus.
- Neupartnerzahlen vergangener Monate sanken auf dem Home-Dashboard, sobald
  Jahresgebühren ausliefen: neue User::newPartnerReferenceDate() (laufender Monat =
  heute, abgeschlossener Monat = Monatsende). Dabei die drei Inline-Kopien der
  Neupartner-Regel auf scopeNewPartnerIn()/isNewPartnerIn() zusammengeführt.
- Top-3-Karte ließ den Betrachter aus, obwohl "ich gehört in die Liste" in der
  Juli-Runde für alle anderen Ranglisten umgesetzt wurde: zählt jetzt mit, inkl.
  is_self und "ich"-Badge.
- Neues Profilfoto zeigte bis zu 6 h ein totes Bild: die URL steckt nicht mehr im
  Cache, sondern entsteht beim Lesen (withProfileImages()).
- Test-Regression seit der Juli-Runde: Unit/Services/BackofficeDashboardServiceTest
  fiel über die fehlende Spalte status_points (kam mit nonPaylinePoints() dazu).
- Kleinigkeiten: ProfileImageController gab die komplette Exception als
  Flash-Message aus (jetzt Log + Sprachkey), BackofficeDrilldownService formatierte
  Datumsangaben hart auf d.m.Y statt über Util::formatDateDB().

Tests: neuer HomeMonthlyStatsTest (buildMonthlyStats war ungetestet) plus Tests für
Stichtags-Zählung und Foto-Cache. Fünf Tests kodierten das alte Verhalten
(Betrachter zählt nicht mit, abgelaufener Account zählt nie) und wurden auf die
neue Semantik umgestellt, jeweils mit Gegenprobe. Suite: 861 grün (vorher 855),
89 rot — ausschließlich die in docs/2026-06-11-test-suite-vorbestehende-fehler.md
dokumentierten Altlasten.

Offen und bewusst nicht enthalten:
- Deploy-Schritt: backoffice:store-statistics-snapshots --force (vorher dumpen).
  Kein vorhandener Snapshot enthält recruiter_ranking, Mai/Juni zusätzlich weder
  non_payline_points noch die Führungskräfte-"gesamt"-Spalten; der Cron überspringt
  vorhandene Snapshots ohne --force. Achtung: die Neuberechnung ist nicht
  verlustfrei.
- TreeHtmlRendererTest/TreeCalcBotIntegrationTest: die Abo-Badges machten den
  Renderer datenbankabhängig; die Dateien waren schon vorher rot und gehören in die
  separate Test-Aufräumaufgabe.
- deleteImage bleibt ein GET-Route (gleiches Muster wie das Shop-Bild).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-25 09:41:53 +00:00

173 lines
7.7 KiB
PHP

<?php
return [
'' => '',
'KU' => 'KU',
'PP' => 'PP',
'TP' => 'TP',
'WB' => 'WB',
'account' => 'Account',
'account_to' => 'Account bis',
'active' => 'aktiv',
'business' => 'Business',
'career_level' => 'Karriere-Level',
'collapse_all' => 'Alles zuklappen',
'commission_WB' => 'Provision Tiefenbonus',
'commission_payline' => 'Provision Payline',
'commission_shop' => 'Provision Shop',
'commission_team' => 'Provision Team',
'commission_total' => 'Provision Gesamt',
'completed' => 'Abgeschlossen',
'open' => 'Offen',
'create_new_consultant' => 'Neuen Berater erstellen',
'current_commission_level' => 'aktuelle Provisions-Stufe',
'customer_commission' => 'Kundenprovision',
'consultant_margin' => 'Beratermarge',
'consultant_margin_info' => 'Hinweis: Die Marge wurde bei der Bestellung bereits abgezogen und somit schon ausbezahlt.',
'customer_points' => 'Kunden Points',
'date' => 'Datum',
'e' => 'E',
'expand_all' => 'Alles aufklappen',
'export' => 'Export',
'export_as_xls' => 'Export als xls',
'link_for_consultant_registration' => 'Link für Beraterregistrierung',
'net_turnover' => 'Umsatz netto',
'new_consultant_copy1' => 'Du möchtest einen neuen Berater registrieren? Super, das freut uns. Sende ihm einfach nachfolgenden Link per Mail, WhatsApp oder SMS zu. Er gelangt damit auf die Registrierungsseite von www.mivita.care. Wichtig ist, dass Du diesen Link nicht veränderst, denn die angehängte Berater-ID identifiziert Dich als Sponsor von dem neuen Berater. Nur so können Dir künftige Provisionen durch Umsätze von ihm zugeordnet werden. Nutze das „Kopier-Symbol“, um den Link gleich in Deine Zwischenablage zu kopieren.',
'next_career_level' => 'nächster Karriere-Level',
'next_commission_level' => 'nächste Provisions-Stufe',
'no_sponsor_assigned' => 'Keinen Sponsor zugewiesen',
'not_active' => 'nicht aktiv',
'last_login' => 'Letzter Login',
'registered_at' => 'Registriert am',
'own' => 'Eigene',
'payline_points' => 'Payline Points',
'points' => 'Points',
'qualification' => 'Qualifikation',
'qualification_commission' => 'Qualifikation Provision',
'qualification_points' => 'Qualifikation Points',
'register_new_consultant' => 'Neuen Berater registrieren',
's' => 'S',
'shop' => 'Shop',
'shop_commission' => 'Shop Provision',
'sponsor' => 'Sponsor',
'structure' => 'Struktur',
'total_points' => 'Gesamte Points',
'total_turnover' => 'Gesamter Umsatz',
'until' => 'bis',
'volume_KU' => 'Volumen KU',
'your_sponsor' => 'Dein Sponsor',
'your_team' => 'Dein Team',
'sales_store_net' => 'Umsatz Shop netto',
'filename_export' => 'mivita-mein-team-export-',
'payout_details' => 'Auszahlungen Details',
// Filter & Status
'filter_active' => 'aktiv',
'filter_not_active' => 'nicht aktiv',
'filter_all' => 'alle',
'all_status' => 'Alle Status',
'qualified_green' => 'Qualifiziert (grün)',
'in_progress_yellow' => 'In Arbeit (gelb)',
'no_level_red' => 'Kein Level (rot)',
// Abo-Kennzeichen (Struktur-Ansicht)
'badge_own_abo' => 'hat ein eigenes Abo',
'badge_customer_abos' => '{1} 1 eigenes Kundenabo|[2,*] :count eigene Kundenabos',
// Performance & Badges
'optimized' => 'OPTIMIERT',
'standard_monitoring' => 'STANDARD + MONITORING',
'fallback' => 'FALLBACK',
'loading_time' => 'Ladezeit:',
'memory' => 'Speicher:',
'memory_usage' => 'Speicherverbrauch:',
'team_size' => 'Team-Größe:',
'team_members' => 'Team-Mitglieder:',
'execution_time' => 'Ausführungszeit:',
'user_id' => 'User ID:',
// Buttons & Actions
'performance_details' => 'Performance Details',
'team_structure' => 'Team-Struktur',
'new_member' => 'Neues Mitglied',
'optimized_action' => 'Optimiert',
'standard_action' => 'Standard',
'close' => 'Schließen',
'show_details' => 'Details anzeigen',
'test_optimized' => 'Optimiert testen',
'standard_version' => 'Standard Version',
// Modals & Titles
'performance_metrics_team_overview' => 'Performance Metrics - Team Übersicht',
'performance_metrics_my_team' => 'Performance Metrics - Mein Team',
'performance_monitoring' => 'Performance Monitoring',
'fallback_support' => 'Fallback Support',
// Messages & Notifications
'optimized_with_cache' => 'Optimiert mit Cache',
'datatable_mode_switched' => 'DataTable-Modus auf ":mode" umgestellt',
'error_loading_optimized_overview' => 'Fehler beim Laden der optimierten Team-Übersicht: ',
'live_not_supported_fallback' => 'Live (nicht unterstützt in Fallback)',
'optimized_performance_features' => 'Diese Seite nutzt optimierte Performance-Features.',
// Next Level
'next_level' => 'Nächster Level',
// Additional terms
'calculation_type' => 'Berechnungstyp',
'version' => 'Version',
'cache' => 'Cache',
'live' => 'Live',
// Missing table headers
'ID' => 'ID',
'Ebene' => 'Ebene',
'Level' => 'Level',
'KD' => 'KD',
'bis' => 'bis',
// Level Reports
'level_reports_title' => 'Level-Aufstieg Reports - Mein Team',
'level_reports_month' => 'Monat',
'level_reports_year' => 'Jahr',
'level_reports_filter_not_updated' => 'Nur nicht umgestellte User',
'level_reports_filter_button' => 'Filter',
'level_reports_csv_export' => 'CSV Export',
'level_reports_total_promotions' => 'Gesamt Aufstiege',
'level_reports_by_level' => 'Aufstiege nach Level',
'level_reports_table_date' => 'Datum',
'level_reports_table_user' => 'User',
'level_reports_table_from_level' => 'Von Level',
'level_reports_table_to_level' => 'Zu Level',
'level_reports_table_current_level' => 'Aktueller Level',
'level_reports_table_kp_quali' => 'KP Quali',
'level_reports_table_user_kp' => 'User KP',
'level_reports_table_pp_quali' => 'PP Quali',
'level_reports_table_user_pp' => 'User PP',
'level_reports_table_update' => 'Update',
'level_reports_table_active' => 'Aktiv',
'level_reports_by_period' => 'Aufstiege nach Zeitraum',
'level_reports_no_data' => 'Keine Level-Aufstiege gefunden',
'level_reports_no_data_description' => 'Mit den aktuellen Filtern wurden keine Einträge gefunden.',
'yes' => 'Ja',
'no' => 'Nein',
'not_available' => 'N/A',
'growth_bonus_details_description' => 'L1 = Direkte Partner (bekommt immer den Tiefenbonus), L2 = Members (ab hier wird der Tiefenbonus geteilt, wenn der Member qualifiziert ist), etc. | Zeigt Provision (€) und Volumen (Pkt) pro Ebene.',
// Jahresgebühr-Nachfassliste (N8)
'annual_fee_title' => 'Jahresgebühr ausstehend',
'annual_fee_hint' => 'Hinweis: Teampartner mit abgelaufenem Account werden ca. 2 Wochen nach Ablauf automatisch deaktiviert und nach 2 Monaten aus dem System entfernt. Überfällige Einträge siehst du hier daher nur für begrenzte Zeit — fasse am besten frühzeitig nach.',
'annual_fee_no_data' => 'Aktuell läuft bei keinem deiner Teampartner die Account-Gültigkeit in den nächsten 3 Monaten ab.',
'annual_fee_group_overdue' => 'Überfällig',
'annual_fee_group_due_1_month' => 'Fällig in ≤ 1 Monat',
'annual_fee_group_due_2_months' => 'Fällig in ≤ 2 Monaten',
'annual_fee_group_due_3_months' => 'Fällig in ≤ 3 Monaten',
'firstlines' => 'Firstlines',
'firstlines_count_split' => ':active aktiv von :total gesamt',
'firstlines_copy' => 'Deine direkten Teampartner mit Umsatz und Kontaktdaten - sortiert nach Punkten des gewählten Monats.',
'firstlines_none' => 'Du hast noch keine direkten Teampartner.',
'firstlines_points' => 'Umsatz (Punkte)',
'active_since' => 'Aktiv seit',
'account_inactive' => 'Account inaktiv',
];