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>
102 lines
6.2 KiB
PHP
102 lines
6.2 KiB
PHP
<?php
|
||
|
||
return [
|
||
'' => '',
|
||
'MIVITA_Consultancy_agreement' => 'Contrat_conseiller_MIVITA',
|
||
'active_role' => 'Rôle actif',
|
||
'activities' => 'Activités',
|
||
'adjust_data' => 'Adapter les données',
|
||
'adviser_membership_active' => 'Adhésion conseiller active',
|
||
'adviser_onlineshop_active' => 'Boutique en ligne conseiller active',
|
||
'adviser_onlineshop_inactive' => 'Boutique conseiller inactive',
|
||
'advisor_account_inactive' => 'Compte conseiller inactif',
|
||
'at' => 'le',
|
||
'change_your_email_address' => 'Modifiez votre adresse e-mail.',
|
||
'change_your_personal_data' => 'Modifiez vos données personnelles.',
|
||
'change_your_personal_password' => 'Modifiez votre mot de passe personnel.',
|
||
'create_your_personal_password' => [
|
||
'' => 'Créez votre mot de passe personnel.',
|
||
],
|
||
'current_points_for' => 'Points actuels pour',
|
||
'data' => 'Données',
|
||
'data_complete_unlocked' => 'Données complètes, activées',
|
||
'declaration_of_consent' => 'Déclaration de consentement',
|
||
'email_verified' => 'E-mail vérifié',
|
||
'expired_on' => 'expiré le',
|
||
'log_out_and_see_you_soon' => 'Se déconnecter et à bientôt.',
|
||
'login' => 'Connexion',
|
||
'manage_membership' => 'Gérer l’adhésion',
|
||
'manage_membership_now_here' => 'Gérer l’adhésion ici maintenant',
|
||
'membership' => 'Adhésion',
|
||
'news_updates' => 'Actualités & mises à jour',
|
||
'news_archive' => 'Archive des actualités',
|
||
'news_archive_title' => 'Toutes les actualités & mises à jour',
|
||
'news_archive_current' => 'Actualités actuelles',
|
||
'news_archive_older' => 'Messages plus anciens',
|
||
'news_archive_empty' => 'Aucun message plus ancien disponible.',
|
||
'news_archive_link' => 'Voir toutes les actualités',
|
||
'news_back_to_dashboard' => 'Retour au tableau de bord',
|
||
'open_since' => 'Ouvert depuis',
|
||
'open_your_shop' => 'Ouvrez votre propre boutique mivita',
|
||
'read_less' => 'Afficher moins',
|
||
'read_more' => 'Lire la suite',
|
||
'privacy_policy_approved' => 'Politique de confidentialité acceptée',
|
||
'security' => 'Sécurité',
|
||
'settings_your_shop' => 'Paramètres de votre boutique',
|
||
'shop_not_booked' => 'Boutique non réservée',
|
||
'today_is' => 'Nous sommes le',
|
||
'until' => 'jusqu’au',
|
||
'welcome_back' => 'Bon retour',
|
||
'your_shop' => 'Votre boutique',
|
||
'commission_today' => 'Commission (à ce jour)',
|
||
'payline_forecast_title' => 'Prévision payline pour le 5 / 10 / 20 / 25',
|
||
'payline_forecast_hint' => 'Base : chiffre d’affaires clients actuel + chiffre d’affaires équipe (payline). S’y ajoutent, de manière cumulée, les points d’abonnement de ta payline encore à venir jusqu’à la date concernée (y compris tes propres abonnements et abonnements clients). Prévision : pauses, résiliations ou paiements échoués peuvent modifier la valeur.',
|
||
'forecast_day' => 'Prévision pour le :date',
|
||
'forecast_upcoming' => 'points d’abonnement à venir',
|
||
'forecast_done' => 'Date déjà incluse dans le chiffre réel',
|
||
'monthly_statistics' => 'Statistique mensuelle',
|
||
'customer_turnover_points' => 'Points chiffre d’affaires clients',
|
||
'team_turnover_points' => 'Points chiffre d’affaires équipe',
|
||
'direct_new_partners' => 'Nouveaux partenaires directs',
|
||
'team_new_partners' => 'Nouveaux partenaires dans l’équipe',
|
||
'customer_subscriptions' => 'Abonnements clients',
|
||
'team_subscriptions' => 'Abonnements équipe',
|
||
'team_customer_subscriptions' => 'Abonnements clients équipe',
|
||
'own_subscriptions' => 'Abonnements propres',
|
||
'own_customer_subscriptions' => 'Abonnements clients propres',
|
||
'stats_group_turnover' => 'Chiffre d\'affaires',
|
||
'stats_group_new_partners' => 'Nouveaux partenaires',
|
||
'stats_group_subscriptions' => 'Abonnements',
|
||
'own' => 'Propres',
|
||
'live_calculation_hint' => 'Calcul en direct (pas encore terminé)',
|
||
'live_calculation_hint_text' => 'Ne sera calculé qu’à la fin du mois.',
|
||
'stats_group_team' => 'Équipe',
|
||
'firstlines_count' => 'Firstlines',
|
||
'team_partner_total' => 'Partenaires au total',
|
||
'payline_partner_count' => 'Partenaires dans la payline',
|
||
'payline_abo_count' => 'Abonnements dans la payline',
|
||
'level_current' => 'Qualification de ce mois',
|
||
'level_career' => 'Niveau de carrière',
|
||
'level_next_missing' => 'Pour te qualifier comme :level ce mois-ci, il te manque encore :points points de payline.',
|
||
'level_next_missing_personal' => 'Il manque en plus :points points de volume personnel.',
|
||
'level_top_reached' => 'Niveau le plus élevé atteint.',
|
||
'level_hint' => 'Niveau de qualification mensuel issu du calcul en direct. Points de payline = points d’équipe de tes niveaux payés, y compris ton excédent de points clients.',
|
||
'forecast_level_title' => 'Niveau et commission selon la prévision (au 25)',
|
||
'forecast_unverbindlich' => 'sans engagement',
|
||
'forecast_level_disclaimer' => 'Estimation basée sur les points actuels plus les livraisons d’abonnement encore ouvertes. Les changements de rang/structure dans l’équipe ne sont pas pris en compte - seule la clôture mensuelle fait foi.',
|
||
'forecast_level_reached' => 'Selon la prévision, tu atteindras le niveau suivant :level - à condition que ton volume personnel de :volume points soit atteint.',
|
||
'forecast_level_missing' => 'Selon la prévision, il manque encore :points points de payline pour le niveau suivant :level.',
|
||
'forecast_level_missing_personal' => 'Il manque en plus :points points de volume personnel.',
|
||
'forecast_commission' => 'Commission prévisionnelle selon la prévision : :amount (sur la base du niveau :level).',
|
||
|
||
// N6 : « Les meilleurs résultats du mois » (interne à l'équipe)
|
||
'top_results_title' => 'Les meilleurs résultats du mois (équipe)',
|
||
'top_results_volume' => 'Top 3 volume personnel',
|
||
'top_results_recruiters' => 'Top 3 nouveaux partenaires',
|
||
'top_results_new_abos' => 'Top 3 nouveaux abonnements',
|
||
'top_results_self' => 'moi',
|
||
'top_results_empty' => 'Pas encore de résultats ce mois-ci.',
|
||
'top_results_unit_points' => 'points',
|
||
'top_results_unit_partners' => 'nouveaux partenaires',
|
||
'top_results_unit_abos' => 'abonnements',
|
||
];
|