Statistiken/Abo: Kundenfeedback 2026-07-24 komplett umgesetzt + Steuern: DATEV-Fixes 08+09/2025 (Sammel-Commit Branch-WIP)

Feedback-Umsetzung (dev/2026-07-22/feedback-analyse-2026-07-24.md, alle 10 Punkte):
- VIP-Statistik: eigener Berater ('ich', Linie 0) in Neue-Kundenabos- und beiden Top-10-Listen; Top-10-Umsatz sortiert nach abgerechneten Ist-Punkten + Abo-Anzahl-Spalte; Fußnote nicht-payline-wirksame Punkte (SalesVolumePoints::nonPaylinePoints)
- Führungskräfte-Liste: beide Sichten 'direkt' (an nächster FK abgeschnitten, additiv) und 'gesamt' (komplette Downline), Gesamt-Spalte nach Kundenzählweise
- Team-Abos: je Ebene 'abgerechnet (Monat)' und 'bis zum 25. erwartet'; Payline-Karte mit Teamabo-/Kundenabo-Zählern
- Incentive-Live-Ranking: Qualifizierte zuerst nummeriert (fixt auch isWinner rank<=max_winners)
- Porto: Netto-/Brutto-Kennzeichnung (Berater netto, Endkunden inkl. MwSt., portal_view-Flag; auch CRM-/Shop-Warenkorb + Checkout), Yard::shipping_tax-Fix
- Struktur-Ansicht: Abo-Badges 'A' (eigenes Abo) und '(n)' (Kundenabos) je Teampartner, gebatcht
- Abo-Löschung: Softdelete setzt active=0 (UserAbo deleting-Hook) + Bereinigungs-Migration für gelöschte-aber-aktive Abos
- Doku: technische Analyse + Kundinnen-Feedback-Dokument unter dev/2026-07-22/
- Tests: IncentiveRankingTest, TeamStructureAboBadgesTest, YardShippingTaxTest (neu); BackofficeStatisticsListsTest, TeamAboOverviewTest, PaylineForecastServiceTest, AboAdminDeleteTest, AboOneTimeViewTest erweitert

Außerdem enthalten (Branch-WIP vor dem Feedback): DATEV-Abgleich-Fixes 08+09/2025, USt-ID-Live-Validierung sowie restliche unkommittete Stände (u. a. Abo-Pause-Sprachkeys).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-07-24 13:51:16 +00:00
parent 657d4bd5b7
commit ac3bd6e8ea
136 changed files with 7610 additions and 2688 deletions

View file

@ -43,6 +43,24 @@ return [
'error_change_locked' => 'Änderungen sind nicht mehr möglich. Die nächste Ausführung ist in :days Tagen. Änderungen müssen mindestens :lock Tage vorher erfolgen.',
'error_abo_interval_too_soon' => 'Der gewählte Liefertag liegt nur :days Tage entfernt. Bitte wähle einen Liefertag, der mindestens :lock Tage in der Zukunft liegt.',
'error_cancel_locked' => 'Eine Kündigung ist nicht mehr möglich. Die nächste Ausführung ist in :days Tagen. Kündigungen müssen mindestens :lock Tage vorher erfolgen.',
'abo_copy_pause' => 'Verschiebt die nächste Ausführung um einen Monat nach hinten. Maximal 1x alle :months Monate möglich.',
'payline_abo_turnover' => 'Abo-Umsatz in der Payline',
'payline_abo_turnover_hint' => 'Soll = Abo-Punkte pro Zyklus aller aktiven Abos deiner Payline (Berater- und Kundenabos). Ist = im laufenden Monat bereits abgerechnete Abo-Punkte der Payline.',
'payline_target_label' => 'Soll (Punkte pro Zyklus)',
'payline_actual_label' => 'Ist (im Monat abgerechnet)',
'payline_hint' => 'Payline = :lines Ebenen · :members Berater',
'payline_abo_counts' => ':team_abos Teamabos + :customer_abos Kundenabos in der Payline',
'payline_none' => 'Noch keine Payline vorhanden (kein Provisionslevel erreicht).',
'abo_points_per_cycle' => 'Punkte pro Lieferung (Bestand)',
'abo_points_billed' => 'abgerechnet (:month)',
'abo_points_expected' => 'bis zum :day. erwartet',
'abo_points_expected_hint' => 'Bereits abgerechnete Abo-Punkte plus die Punkte aller Abos dieser Ebene, deren Lieferung bis zum :day. des Monats noch ansteht.',
'pause_abo' => '1 Monat pausieren',
'confirm_pause' => 'Möchtest du das Abo wirklich um einen Monat pausieren? Die nächste Lieferung verschiebt sich auf den Folgemonat.',
'pause_success' => 'Dein Abo wurde um einen Monat pausiert. Die nächste Ausführung ist am :date.',
'error_pause_interval' => 'Das Abo kann maximal 1x alle :months Monate pausiert werden. Die nächste Pause ist ab dem :date möglich.',
'error_pause_not_active' => 'Nur aktive Abos können pausiert werden.',
'info_pause_available_from' => 'Eine Pause ist maximal 1x alle :months Monate möglich — wieder ab dem :date.',
'error_pause_locked' => 'Das Abo kann nicht mehr pausiert werden. Die nächste Ausführung ist in :days Tagen. Pausieren muss mindestens :lock Tage vorher erfolgen.',
'error_next_date' => 'Das Datum für die nächste Ausführung nicht korrekt',
'checkout_mail_abo_hl' => 'Dein Abo / regelmäßige Lieferung.',

View file

@ -36,6 +36,12 @@ return [
'desc_rollback' => 'Auf Ursprung zurückgesetzt',
// Channels
'status_history_title' => 'Status-Änderungen (Pause & Kündigung)',
'status_paused' => 'Pausiert',
'status_cancelled' => 'Gekündigt',
'status_deactivated' => 'Deaktiviert',
'status_reactivated' => 'Reaktiviert',
'status_shift' => 'Ausführung von :from auf :to verschoben',
'channel_admin' => 'Admin',
'channel_user_me' => 'Berater',
'channel_user_ot' => 'Berater (Kunde)',

View file

@ -48,6 +48,12 @@ return [
'until' => 'bis zum',
'welcome_back' => 'Willkommen zurück',
'your_shop' => 'Dein Shop',
'commission_today' => 'Provision (Stand heute)',
'payline_forecast_title' => 'Payline-Prognose zum 5. / 10. / 20. / 25.',
'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',

View file

@ -25,6 +25,8 @@ return [
'homeparty_delete' => 'Auszeitparty gelöscht',
'VATID_could_not_be_validated' => 'Die UST-ID konnte nicht validiert werden, Eingabe bitte prüfen',
'VATID_successfully_entered' => 'UST-ID erfolgreich eingetragen',
'VATID_german_not_allowed' => 'Deutsche USt-IDs können hier nicht verwendet werden. Das Reverse-Charge-Verfahren gilt nur für ausländische EU-USt-IDs.',
'VATID_no_longer_valid_taxes_applied' => 'Deine USt-ID ist nicht mehr gültig. Die Bestellung wird daher mit Umsatzsteuer berechnet.',
'reverse_charge_procedure_and_VATID_deleted' => 'Reverse Charge Verfahren und UST-ID gelöscht',
'no_id_card_deposited_please_upload_first' => 'Kein Ausweis hinterlegt, bitte erst hochladen',
'no_trade_licence_deposited_please_upload_first' => 'Kein Gewerbeschein hinterlegt, bitte erst hochladen',
@ -38,6 +40,13 @@ return [
'account_released' => 'Account freigeschaltet',
'cart_product_not_allowed_for_order_type' => 'Der Warenkorb enthält Artikel, die für diese Bestellart nicht vorgesehen sind. Bitte leere den Warenkorb und wähle nur Produkte, die zu dieser Bestellung passen.',
'cart_max_weight_reached' => 'Das maximale Versandgewicht ist erreicht. Es können keine weiteren Produkte hinzugefügt werden.',
'gdpr_delete_success' => 'DSGVO-Löschung ausgeführt: Alle personenbezogenen Daten wurden unwiderruflich anonymisiert.',
'gdpr_delete_customer_success' => 'DSGVO-Löschung ausgeführt: Alle personenbezogenen Daten des Kunden wurden unwiderruflich anonymisiert.',
'gdpr_delete_customer_button' => 'Kunde DSGVO-löschen',
'gdpr_confirm_checkbox_missing' => 'Bitte bestätige die DSGVO-Löschung über die Checkbox.',
'gdpr_error_is_admin' => 'DSGVO-Löschung nicht möglich: Der Account hat Admin-Rechte. Bitte entziehe zuerst die Admin-Rechte.',
'gdpr_error_active_abo' => 'DSGVO-Löschung nicht möglich: Es besteht noch ein aktives Abo. Bitte kündige das Abo zuerst.',
'gdpr_error_customer_is_member' => 'DSGVO-Löschung nicht möglich: Dieser Kundendatensatz gehört zu einem Berater-Account. Bitte nutze die DSGVO-Löschung in der User-Verwaltung.',
];
/*
{{ __('msg.') }}

View file

@ -44,6 +44,7 @@ return [
'gross' => 'brutto',
'gross_price' => 'Preis brutto',
'incentives' => 'Incentives',
'incl_VAT' => 'inkl. MwSt.',
'included_VAT' => 'Enthaltene MwSt',
'invoice' => 'Rechnung',
'invoice_address' => 'Rechnungsadresse',

View file

@ -70,6 +70,10 @@ return [
'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',