23-01-2026

This commit is contained in:
Kevin Adametz 2026-01-23 17:35:23 +01:00
parent a939cd51ef
commit a8b395e20d
248 changed files with 29342 additions and 4805 deletions

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'abo' => 'Abo',
'payment_for_abo' => 'Zahlungsart für Abo',
'abo_delivery' => 'Abo - regelmäßige Lieferung',
@ -12,11 +12,16 @@ return array (
'every_weeks' => 'alle :num Wochen',
'of_month' => 'des Monat',
'delivery_intervall' => 'Liefertag anpassen',
'abo_order_info' => 'Mit dem Abschluss des Abonnements wird eine regelmäßige Lieferung eingerichtet, die automatisch an dem gewählten Liefertag versendet und abgerechnet wird, beginnend ab dem heutigen Datum. Anpassungen können jederzeit bequem im Kundenkonto vorgenommen werden. Als Zahlungsmethoden stehen PayPal und Kreditkarte zur Verfügung.',
'abo_order_info_check' => 'Mit Abschluss des Abonnements wird eine regelmäßige Lieferung eingerichtet. Diese wird automatisch am gewählten Liefertag versendet und abgerechnet.',
'abo_order_info_check_2' => 'Die erste Lieferung und Abrechnung erfolgt am Tag der Abo-Einrichtung. Danach erfolgt der Versand automatisch am gewählten Liefertag des Folgemonats.',
'abo_order_info_check_3' => 'Als Zahlungsmethoden stehen PayPal und Kreditkarte zur Verfügung. <strong>Das Abo hat eine Mindestlaufzeit von :abo-min-duration Monaten.</strong> Danach kann es jederzeit pausiert, geändert oder gekündigt werden.',
'abo_order_info_checkbox' => 'Ja, ich habe die Abo-Bedingungen verstanden!',
'abo_infos' => 'Abo Infos',
'abo_delivery_infos' => 'Abo Lieferinfos',
'abo_start_date' => 'Beginn des Abos',
'abo_delivery_intervall' => 'Liefertag des Abos',
'abo_first_execution_date' => 'Erste Ausführung',
'abo_next_execution_date' => 'Nächste Ausführung',
'delivery_day' => 'Liefertag anpassen',
'abo_settings' => 'Abo Einstellungen',
'add_new_abo' => 'Neues Abo anlegen',
@ -27,6 +32,7 @@ return array (
'abo_copy_next_date' => 'Der nächste Ausführungstermin kann frühesten auf den Folgetag festgelegt werden.',
'abo_copy_abo_interval' => 'Die Anpassung des Abonnement-Liefertags wirkt sich auf den kommenden Ausführungstermin aus, wenn das Abonnement aktiv ist.',
'error_abo_interval' => 'Das Abo Interval nicht korrekt',
'error_abo_interval_in_the_past' => 'Das Abo wurde diesen Monat noch nicht ausgeführt. Eine Änderung auf einen vergangenen Tag würde den aktuellen Monat überspringen.',
'error_next_date' => 'Das Datum für die nächste Ausführung nicht korrekt',
'checkout_mail_abo_hl' => 'Dein Abo / regelmäßige Lieferung.',
'checkout_mail_abo_start' => 'Dein Abo wurde erfolgreich mit folgenden Einstellungen angelegt:',
@ -38,19 +44,21 @@ return array (
'abo_finish' => 'beendet',
'abo_inactive' => 'inaktiv',
'abo_grace' => 'kulanz',
'abo_info' => 'Abo Informationen',
'info_min_duration_reached' => 'Dein Abo kann frühestens ab dem :date geändert, ergänzt, pausiert oder gekündigt werden.',
'info_min_duration_orders_left' => 'Das Abo kann erst nach weiteren :count Ausführungen geändert, ergänzt, pausiert oder gekündigt werden.',
'pros_hl' => 'Die Vorteile eines Abos',
'pros_list' => ' <li><b>Abo-Abschluss für Berater und Kunden:</b> Jeder Berater oder Kunde kann ein Abo abschließen, das an einem festgelegten Tag im Monat ausgeführt wird, um eine regelmäßige und planbare Lieferung zu gewährleisten.</li>
<li><b>Monatliche Lieferung:</b> Einmal im Monat wird eine neue Lieferung direkt an deine Haustür gesendet.</li>
<li><b>Flexibel anpassbar:</b> Das Abonnement kann jederzeit angepasst werden, z.B. in Bezug auf Produkte, Mengen oder Lieferzeitpunkte.</li>
<li><b>Flexibel anpassbar:</b> Das Abonnement kann individuell angepasst werden, z.B. in Bezug auf Produkte, Mengen oder Lieferzeitpunkte.</li>
<li><b>Vielfältige Produktauswahl:</b> Verschiedene Produkte können im Abo enthalten sein.</li>
<li><b>Einfache Verwaltung:</b> Änderungen und Anpassungen können bequem im Kundenkonto vorgenommen werden.</li>
<li><b>Pausieren oder Beenden:</b> Das Abo kann flexibel pausiert oder beendet werden.</li>
<li><b>Preisvorteil:</b> Die Abo-Produkte erhalten oft spezielle Rabatte oder Angebote.</li>
<li><b>Jetzt starten:</b> Wähle Deine Produkte, passe das Abo an deine Bedürfnisse an, zahle die erste Bestellung und aktiviere damit Dein Abo für die nächsten Lieferungen.</li>',
<li><b>Laufzeit:</b> Das Abo hat eine mindestens Laufzeit von <strong>:abo-min-duration Monaten</strong>, danach kann es pausiert oder gekündigt werden.</li>
<li><b>Preisvorteil:</b> Die Abo-Produkte erhalten oft spezielle Rabatte oder Angebote.</li>
<li><b>Jetzt starten:</b> Wähle Deine Produkte, passe das Abo an deine Bedürfnisse an, zahle die erste Bestellung und aktiviere damit Dein Abo für die nächsten Lieferungen.</li>',
'abo_pros' => 'Abo Vorteile',
'abo_order_hl' => 'Abo Zusammenstellung',
'abo_order_hl' => 'Abo Zusammenstellung',
'abo_order_info_2' => 'Du kannst die Produkte Deines Abos jederzeit anpassen, bei der nächsten Ausführung werden Dir Deine zusammengestellen Produkte zugesendet.',
'abo_order_info_block' => 'Die Zusammenstellung Deines Abos kannst Du nach der Mindestlaufzeit von <strong>:abo-min-duration Monaten</strong> anpassen.',
'add_product' => 'Produkt hinzufügen',
'product_prices_career_level_info' => 'Die Produktpreise werden entsprechend Deinem Karriere-Level <strong>:user_level_name</strong> abzüglich <strong>:user_level_margin %</strong> Marge angezeigt und brechnet.',
'product_prices_career_level_cpay_info' => 'Die Produktpreise werden als Kunden VK-Preise angezeigt, nach Abschluss der Kundenzahlung erhälst du Deine Provision entsprechend Deinem Karriere-Level <strong>:user_level_name</strong> Provision <strong>:user_level_margin %</strong>.',
@ -58,7 +66,7 @@ return array (
'abo_assigned' => 'Abo aktiv',
'base' => 'Basis',
'upgrade' => 'Upgrade',
'abo_type_info' => 'Hinweis:Jedes Abo besteht mindestens aus einem Basis-Produkt :base ! <br>Upgrade-Produkte :upgrade sind optional und können nach belieben hinzugefügt werden.',
'abo_type_info' => 'Hinweis:Jedes Abo besteht mindestens aus einem Basis-Produkt :base ! <br>Upgrade-Produkte :upgrade sind optional und können nach belieben hinzugefügt werden.<br> <strong>Das Abo hat eine mindestens Laufzeit von <strong>:abo-min-duration Monaten</strong>, danach kann es pausiert oder gekündigt werden.</strong>',
'abo_type_info_base' => 'Das Abo benötigt mindestens ein Basis-Produkt :base !',
'need_basis_product' => 'Sie müssen min. ein Basis-Produkt in Ihrem Abo haben, bitte fügen Sie erst ein neues Basis-Produkt hinzu und entfernen Sie dann das alte Basis-Produkt!',
'abo_item_not_found' => 'Abo-Position nicht gefunden',
@ -81,5 +89,9 @@ return array (
'understood_and_next' => 'verstanden und weiter',
'change_my_data_empty' => 'Du hast noch keine Rechnungs- und Lieferadresse hinterlegt, ohne diese kannst du kein Abo erstellen, bitte lege diese an.',
'abo_error_basis_product' => 'Fehler: Bitte wählen Sie mindestens ein Basis-Produkt aus.',
'cancel_abo' => 'Abo kündigen',
'confirm_cancel' => 'Möchten Sie das Abo wirklich kündigen?',
'team_subscriptions' => 'Team Abos',
'every_month_on' => 'monatlich am :day.',
'back' => 'zurück',
);

View file

@ -0,0 +1,36 @@
<?php
return array(
'dashboard_news' => 'Dashboard News',
'add_news' => 'News hinzufügen',
'edit_news' => 'News bearbeiten',
'title' => 'Titel',
'teaser' => 'Teaser',
'content' => 'Inhalt',
'status' => 'Status',
'active' => 'Aktiv',
'inactive' => 'Inaktiv',
'created_at' => 'Erstellt am',
'actions' => 'Aktionen',
'delete' => 'Löschen',
'confirm_delete' => 'Wirklich löschen?',
'no_news_yet' => 'Noch keine News vorhanden',
'cancel' => 'Abbrechen',
'general_settings' => 'Allgemeine Einstellungen',
'news_active' => 'News ist aktiv',
'news_active_hint' => 'Nur eine aktive News wird im Dashboard angezeigt',
'news_active_single' => 'Hinweis: Es kann immer nur eine News aktiv sein. Beim Aktivieren werden alle anderen automatisch deaktiviert.',
'german' => 'Deutsch',
'default_language' => 'Standardsprache',
'teaser_hint' => 'Kurzer Text, der direkt sichtbar ist (max. 2-3 Sätze)',
'content_hint' => 'Längerer Inhalt, der nach "Mehr lesen" angezeigt wird. HTML-Tags sind erlaubt (z.B. <strong>, <ul>, <li>, <br>, <a>).',
'display_date' => 'Anzeige-Datum',
'display_date_hint' => 'Datum, das im Dashboard angezeigt wird (Standard: heutiges Datum)',
// File Links
'file_links' => 'Datei-Links zum Download-Center',
'file_links_hint' => 'Fügen Sie Links zu Dateien aus dem Download-Center hinzu, die in der News prominent angezeigt werden.',
'link_label' => 'Link-Bezeichnung (z.B. "Preisliste herunterladen")',
'select_file' => 'Datei auswählen',
'add_file_link' => 'Datei-Link hinzufügen',
);

View file

@ -1,8 +1,8 @@
<?php
return array (
'months' =>
array (
return array(
'months' =>
array(
'April' => 'April',
'August' => 'August',
'December' => 'Dezember',
@ -16,8 +16,8 @@ return array (
'October' => 'Oktober',
'September' => 'September',
),
'months_short' =>
array (
'months_short' =>
array(
'Apr' => 'Apr',
'Aug' => 'Aug',
'Dec' => 'Dez',
@ -31,8 +31,8 @@ return array (
'Oct' => 'Okt',
'Sep' => 'Sep',
),
'weekdays' =>
array (
'weekdays' =>
array(
'Friday' => 'Freitag',
'Monday' => 'Montag',
'Saturday' => 'Samstag',
@ -41,8 +41,8 @@ return array (
'Tuesday' => 'Dienstag',
'Wednesday' => 'Mittwoch',
),
'weekdays_min' =>
array (
'weekdays_min' =>
array(
'Fr' => 'Fr',
'Mo' => 'Mo',
'Sa' => 'Sa',
@ -51,8 +51,8 @@ return array (
'Tu' => 'Di',
'We' => 'Mi',
),
'weekdays_short' =>
array (
'weekdays_short' =>
array(
'Fri' => 'Fr.',
'Mon' => 'Mo.',
'Sat' => 'Sa.',

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'about_shop' => 'Über Shop',
'add_customer_without_email' => 'Kunde ohne E-Mail hinzufügen',
'add_customer_without_email_info1' => 'Hinweis: Du kannst Deine Kunden auch ohne Email-Adresse anlegen. Das System gleicht dann Nachname und Postleitzahl ab. Sollte es hier mal Übereinstimmungen geben, gleicht der Support von MIVITA die Kundensätze ab und ordnet sie den Beratern entsprechend zu. Daher empfehlen wir im besten Fall immer die Angabe einer Email-Adresse. Diese ist einzigartig und damit eindeutig einem Kunden zuzuordnen.',
@ -23,6 +23,9 @@ return array (
'customer_is_subscribed_to_newsletter' => 'Kunde ist für Newsletter abonniert.',
'customer_sovereignty_info1' => 'Kundenhoheit: Es können nur Kunden hinzugefügt werden, die noch nicht im mivita-Salescenter vorhanden sind. ',
'date' => 'Datum',
'delete_customer' => 'Kunden löschen',
'deleted_successfully' => 'Kunde wurde erfolgreich gelöscht',
'delete_customer_confirm' => 'Sind Sie sicher, dass Sie diesen Kunden löschen möchten?',
'edit' => 'bearbeiten',
'edit_customer_data' => 'Kundendaten bearbeiten',
'enter' => 'eingeben',

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'account_active' => 'Account freigeschaltet',
'account_active_copy1line' => 'Dein Account wurde nach erfolgreicher Prüfung freigeschaltet. Deinen Beratervertag findest Du auf der Startseite im Loginbereich von my.mivita.care. Melde dich mit deinen Benutzerdaten an, um weitere Schritte zu unternehmen.',
'account_incomplete_copy1line' => 'Dein Account wurde nicht freigeschaltet, Deine Daten sind nicht vollständig. Bitte folge dem unten stehenden Link um Deine Daten zu vervollständigen. ',
@ -91,8 +91,10 @@ Dein Team von MIVITA',
'subject' => 'Betreff',
'subject_activate' => 'Account aktivieren',
'subject_reset' => 'Passwort zurücksetzen',
'update_level_copy1line' => 'Herzlichen Glückwunsch, Du hast im letzten Monat Deine Qualifikation (TP :tp) erreicht und hast damit Deinen nächsten Karriere-Level erreicht.<br><br>Ab sofort bist Du: <b>:to</b>',
'update_level_title' => 'Dein Karriere-Level auf mivita.care',
'update_level_copy1line' => '<b>Herzlichen Glückwunsch!</b><br><br>Wir sind unglaublich stolz auf Dich! Du hast im letzten Monat mit Deinen <b>:tp TP</b> nicht nur Deine Qualifikation erreicht Du hast etwas Großartiges geschafft!<br><br>Dein unermüdlicher Einsatz und Dein Engagement haben sich gelohnt. Ab sofort bist Du:<br><br><h2 style="color: #6b7758; margin: 20px 0;"><b> :to </b></h2><br>Das ist ein echter Meilenstein in Deiner Karriere bei MIVITA!',
'update_level_title' => 'Du hast Dein nächstes Karriere-Level erreicht!',
'update_level_copy2line' => 'Dein Erfolg ist auch unser Erfolg, und wir freuen uns riesig, Dich auf dieser spannenden Reise begleiten zu dürfen. Mit diesem neuen Level eröffnen sich Dir jetzt noch mehr Möglichkeiten:<br><br>- Höhere Provisionen und bessere Margen<br>- Erweiterte Möglichkeiten für Dein Business<br>- Mehr Anerkennung und Status im Team',
'update_level_copy3line' => 'Das ist erst der Anfang! <br><br>Dein Erfolg ist der Beweis dafür, dass kontinuierliche Arbeit und Leidenschaft zum Ziel führen. Bleib am Ball, motiviere Dein Team und erreiche gemeinsam mit uns noch größere Ziele.<br><br>Dein nächstes Level wartet bereits auf Dich und wir wissen, dass Du es schaffen wirst!',
'verify_copy1line' => 'Wir haben Daten über Dich in unserem System gespeichert. Bitte folge dem unten stehenden Link um Deine E-Mail-Adresse zu bestätigen. Weitherhin kannst Du Deine Daten ändern oder auch löschen.',
'verify_e_mail' => 'Bestätige Deine Daten und E-Mail-Adresse',
'your_request_from' => 'Deine Anfrage von',
@ -102,5 +104,27 @@ Dein Team von MIVITA',
'subject_custom_abo_payout' => 'Deine individuelle Abo-Bestellung von :name auf mivita.care',
'button_custom_payout' => 'zur Zahlung',
'checkout_custom_payout' => 'Dein Berater hat folgende Produkte für Dich zusammengestellt',
'user_restore_subject' => 'Dein Account wurde wiederhergestellt',
'user_restore_title' => 'Account-Wiederherstellung erfolgreich',
'user_restore_greeting' => 'Hallo :name,',
'user_restore_copy1line' => 'wir freuen uns, Dir mitteilen zu können, dass Dein Account bei mivita.care erfolgreich wiederhergestellt wurde.',
'user_restore_copy2line' => 'Da Dein Passwort aus Sicherheitsgründen beim Löschen zurückgesetzt wurde, musst Du ein neues Passwort vergeben. Bitte klicke auf den folgenden Button, um Dein Passwort zurückzusetzen:',
'user_restore_copy3line' => '• Dein Passwort wurde zurückgesetzt - bitte vergib ein neues Passwort über den obigen Link.<br>• Falls Du einen Shop hattest: Der Shop-Name (Subdomain) wurde beim Löschen freigegeben und muss neu vergeben werden.',
'user_restore_button' => 'Neues Passwort vergeben',
'user_restore_account_valid' => 'Deine Berater-Mitgliedschaft ist gültig bis:',
'user_restore_important' => 'Wichtige Hinweise:',
// DHL Tracking E-Mail
'dhl_tracking_subject' => 'Deine Sendung ist unterwegs - mivita.care',
'dhl_tracking_subject_multiple' => 'Deine :count Sendungen sind unterwegs - mivita.care',
'dhl_tracking_title' => 'Deine Sendung ist unterwegs!',
'dhl_tracking_preview' => 'Sendungsnummer: :number - Verfolge Dein Paket bei DHL',
'dhl_tracking_message' => 'gute Nachrichten! Deine Bestellung wurde versendet und ist auf dem Weg zu Dir.',
'dhl_tracking_message_multiple' => 'gute Nachrichten! Deine Bestellung wurde in :count Paketen versendet und ist auf dem Weg zu Dir.',
'dhl_tracking_package_label' => 'Paket :number',
'dhl_tracking_number_label' => 'Deine Sendungsnummer',
'dhl_tracking_order_ref' => 'Bestellnummer: :order',
'dhl_tracking_button' => 'Sendung bei DHL verfolgen',
'dhl_tracking_info' => 'Du kannst den aktuellen Status Deiner Sendung jederzeit über den obigen Button bei DHL einsehen.',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'' => '',
'MIVITA_Consultancy_agreement' => 'MIVITA_Beratervertrag',
'active_role' => 'Aktive Rolle',
@ -14,8 +14,8 @@ return array (
'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' =>
array (
'create_your_personal_password' =>
array(
'' => 'Erstelle Dein persönlichen Passwort.',
),
'current_points_for' => 'Aktuelle Punkte für',
@ -29,8 +29,11 @@ return array (
'manage_membership' => 'Mitgliedschaft verwalten',
'manage_membership_now_here' => 'Mitgliedschaft jetzt hier verwalten',
'membership' => 'Mitgliedschaft',
'news_updates' => 'Neuigkeiten & Updates',
'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',
@ -39,4 +42,13 @@ return array (
'until' => 'bis zum',
'welcome_back' => 'Willkommen zurück',
'your_shop' => 'Dein Shop',
'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',
'own' => 'Eigene',
'live_calculation_hint' => 'Live-Berechnung (noch nicht abgeschlossen)',
);

View file

@ -35,7 +35,7 @@ return [
'team_provisions_by_lines' => 'Team-Provisionen nach Linien',
// Boni
'growth_bonus' => 'Wachstumsbonus',
'growth_bonus' => 'Tiefenbonus',
// Navigation & Status
'next_level' => 'Nächstes Level:',
@ -101,4 +101,4 @@ return [
'help_provisions' => 'Provisionen sind die Prozentsätze, die Sie von Verkäufen erhalten.',
'help_growth_bonus' => 'Wachstumsboni sind zusätzliche Belohnungen für Ihr Teamwachstum.',
];
];

View file

@ -46,7 +46,7 @@ return array(
'sales_volumes' => 'Absatzmengen',
'settings' => 'Einstellungen',
'shipping_costs' => 'Versandkosten',
'start_site' => 'Startseite',
'start_site' => 'Startseite Shop',
'structure' => 'Struktur',
'system_settings' => 'System-E.',
'translate' => 'Übersetzungen',
@ -71,4 +71,5 @@ return array(
'dhl_cockpit' => 'DHL Cockpit',
'revenue' => 'Umsatz',
'level_reports' => 'Level Reports',
'dashboard_news' => 'Dashboard News',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'' => '',
'BIC' => 'BIC',
'IBAN' => 'IBAN',
@ -59,8 +59,8 @@ return array (
'select_and_save' => 'auswählen und speichern',
'sepa_direct_debit' => 'SEPA Lastschrift',
'sofort_bank_transfer' => 'Sofort -Überweisung',
'status' =>
array (
'status' =>
array(
'checkout_cancel' => ' Zahlungsvorgang Abbruch',
'checkout_error' => 'Zahlungsvorgang Fehler',
'checkout_payment' => 'Checkout',
@ -83,27 +83,27 @@ return array (
'we_have_received_your_order_get_email' => 'Deine Bestellung ist bei uns eingegangen. In Kürze erhälst Du von uns eine Bestellbestätigungsmail.',
'your_mivita_team' => 'Dein Team von mivita.care',
'your_order_number_is' => 'Deine Bestellnummer ist',
'open'=>'offen',
'openly'=>'geöffnet',
'paid'=>'bezahlt',
'check'=>'prüfen',
'cancelled'=>'storniert',
'link_sent'=>'Link gesendet',
'link_openly'=>'Link geöffnet',
'link_check'=>'Zahlung in Ausführung',
'link_pending'=>'Zahlung in Bearbeitung',
'link_failed'=>'Zahlung fehlgeschlagen',
'link_canceled'=>'Zahlung abgebrochen',
'link_appointed'=>'Zahlung genehmigt',
'link_paid'=>'bezahlt',
'alert_link_sent'=>'Zahlungslink gesendet',
'alert_link_openly'=>'Zahlungslink geöffnet',
'alert_link_check'=>'Zahlung in Ausführung',
'alert_link_pending'=>'Zahlung in Bearbeitung',
'alert_link_failed'=>'Zahlung ist fehlgeschlagen',
'alert_link_canceled'=>'Zahlung wurde abgebrochen',
'alert_link_appointed'=>'Zahlung wurde genehmigt',
'alert_link_paid'=>'Zahlung war erfolgreich',
'open' => 'offen',
'openly' => 'geöffnet',
'paid' => 'bezahlt',
'check' => 'prüfen',
'cancelled' => 'storniert',
'link_sent' => 'Link gesendet',
'link_openly' => 'Link geöffnet',
'link_check' => 'Zahlung in Ausführung',
'link_pending' => 'Zahlung in Ausführung',
'link_failed' => 'Zahlung fehlgeschlagen',
'link_canceled' => 'Zahlung abgebrochen',
'link_appointed' => 'Zahlung in Ausführung',
'link_paid' => 'bezahlt',
'alert_link_sent' => 'Zahlungslink gesendet',
'alert_link_openly' => 'Zahlungslink geöffnet',
'alert_link_check' => 'Zahlung in Ausführung',
'alert_link_pending' => 'Zahlung in Ausführung',
'alert_link_failed' => 'Zahlung ist fehlgeschlagen',
'alert_link_canceled' => 'Zahlung wurde abgebrochen',
'alert_link_appointed' => 'Zahlung in Ausführung',
'alert_link_paid' => 'Zahlung war erfolgreich',
'failed' => 'abbruch',
'no_payment' => 'keine Zahlung',
'link_was_paid' => 'Die Zahlung wurde erfolgreich abgeschlossen.',
@ -116,36 +116,57 @@ return array (
'invoice_paid' => 'Rechnung bezahlt',
'invoice_no_payment' => 'Rechnung keine Zahlung',
'to_sales_tax_de'=> 'umsatzsteuerpflichtig / DE',
'not_to_sales_tax_de'=> 'nicht umsatzsteuerpflichtig / DE',
'not_to_sales_tax_foreign'=> 'nicht umsatzsteuerpflichtig / Ausland',
'to_sales_tax_de' => 'umsatzsteuerpflichtig / DE',
'not_to_sales_tax_de' => 'nicht umsatzsteuerpflichtig / DE',
'not_to_sales_tax_foreign' => 'nicht umsatzsteuerpflichtig / Ausland',
'ordered' => 'bestellt',
'paid' => 'bezahlt',
'removed' => 'entfernt',
'registration' => 'Registrierung',
'ordered'=> 'bestellt',
'paid'=> 'bezahlt',
'removed'=> 'entfernt',
'registration'=> 'Registrierung',
'not_assigned' => 'nicht zugewiesen',
'advisor_order' => 'Beraterbestellung',
'credit'=> 'Gutschrift',
'credit' => 'Gutschrift',
'shoporder' => 'Shopbestellung',
'shoporder_pending' => 'Shopbestellung / pending',
'membership'=> 'Mitgliedschaft',
'order'=> 'Bestellung',
'customer_order'=> 'Kundenbestellung',
'homeparty'=> 'Homeparty',
'shop'=> 'Shop',
'external'=> 'extern',
'collective_invoice'=> 'Sammelrechnung',
'in_process'=> 'in Bearbeitung',
'shipped'=> 'versendet',
'completed'=> 'abgeschlossen',
'trade_fair'=> 'Messe',
'commission_shop'=> 'Provision Shop',
'commission_payline'=> 'Provision Payline',
'commission_growth_bonus'=> 'Provision Wachstumsbonus',
'membership' => 'Mitgliedschaft',
'order' => 'Bestellung',
'customer_order' => 'Kundenbestellung',
'homeparty' => 'Homeparty',
'shop' => 'Shop',
'external' => 'extern',
'collective_invoice' => 'Sammelrechnung',
'in_process' => 'in Bearbeitung',
'shipped' => 'versendet',
'completed' => 'abgeschlossen',
'trade_fair' => 'Messe',
'commission_shop' => 'Provision Shop',
'commission_payline' => 'Provision Payline',
'commission_growth_bonus' => 'Provision Tiefenbonus',
'commission_team' => 'Provision Team',
'credit_added' => 'Guthaben hinzugefügt',
'commission' => 'Provision',
'unknown' => 'unbekannt',
// Vorkasse Verwendungszweck Hinweise
'prepayment_important_notice' => 'Wichtiger Hinweis zur Vorkasse-Zahlung',
'prepayment_reference_notice' => 'WICHTIG: Bitte geben Sie als Verwendungszweck ausschließlich folgende Nummer an:',
'prepayment_reference_only' => 'Nur so kann Ihre Zahlung automatisch zugeordnet werden.',
'prepayment_bank_details' => 'Bankverbindung für Vorkasse',
'prepayment_waiting_payment' => 'Wir warten auf Ihren Zahlungseingang. Nach Eingang wird Ihre Bestellung bearbeitet.',
'prepayment_txid' => 'Verwendungszweck',
// DHL Packstation/Paketbox
'packstation_delivery' => 'Lieferung an Packstation/Paketbox',
'packstation_info' => 'Für die Lieferung an eine DHL Packstation oder Paketbox benötigen wir Ihre DHL Postnummer.',
'dhl_postnumber' => 'DHL Postnummer',
'packstation_address_hint' => 'Tragen Sie im Adressfeld (Straße Nr. *) die Packstation-Nummer ein (z.B. "Packstation 145"). PLZ und Ort beziehen sich auf den Standort der Packstation.',
'packstation_alert_title' => 'Wichtig: Packstation-Lieferung',
'packstation_alert_intro' => 'Wenn Sie eine DHL Postnummer angeben, muss die Lieferadresse wie folgt ausgefüllt werden:',
'packstation_alert_street' => 'Packstation [3-stellige Nummer]',
'packstation_alert_street_example' => 'z.B. "Packstation 145" - NICHT "12345"!',
'packstation_alert_location' => 'Standort der Packstation',
'packstation_alert_not_home' => 'nicht Ihre Wohnadresse!',
'packstation_alert_footer' => 'Die Packstation-NUMMER ist 3-stellig (100-999, steht auf dem gelben Schild). Die DHL Postnummer ist 6-10-stellig und kommt ins separate Feld oben.',
);

View file

@ -12,7 +12,7 @@ return array(
'business' => 'Business',
'career_level' => 'Karriere-Level',
'collapse_all' => 'Alles zuklappen',
'commission_WB' => 'Provision Wachstumsbonus',
'commission_WB' => 'Provision Tiefenbonus',
'commission_payline' => 'Provision Payline',
'commission_shop' => 'Provision Shop',
'commission_team' => 'Provision Team',
@ -119,4 +119,33 @@ return array(
'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.',
);

View file

@ -1,59 +1,97 @@
<?php
return array (
return array(
'abo' => 'Subscription',
'abo_are_for_customer_and_shipped' => 'Subscription is for a customer and will be sent to the customer',
'abo_are_for_me_and_shipped' => 'Subscription is for me and will be shipped to my address',
'abo_assigned' => 'Subscription active',
'abo_cancel' => 'canceled',
'abo_copy_abo_interval' => 'The adjustment of the subscription interval does not affect the next execution date, but affects the dates after the next execution',
'abo_copy_active' => 'If the subscription is not active, it will not be executed automatically',
'abo_copy_next_date' => 'The next execution date can be set to the following day at the earliest',
'payment_for_abo' => 'Payment method for subscription',
'abo_delivery' => 'Subscription - regular delivery',
'abo_delivery_infos' => 'Subscription delivery information',
'abo_delivery_interval' => 'Delivery interval of the subscription',
'abo_delivery_intervall' => 'Delivery date of the subscription',
'abo_are_for_me_and_shipped' => 'Subscription is for me and will be shipped to my address',
'abo_are_for_customer_and_shipped' => 'Subscription is for a customer and will be sent to the customer',
'abo_delivery_to_me' => 'Subscription delivery to me',
'abo_delivery_to_the_customer' => 'Subscription delivery to the customer',
'abo_details' => 'Subscription details',
'abo_edit' => 'Edit subscription',
'abo_finish' => 'finished',
'abo_grace' => 'grace',
'abo_hold' => 'stopped',
'abo_inactive' => 'inactive',
'abo_infos' => 'Subscription info',
'abo_is_active' => 'Subscription is active',
'abo_item_not_found' => 'Subscription position not found',
'abo_new' => 'new',
'abo_okay' => 'okay',
'abo_order_hl' => 'Subscription compilation',
'abo_order_info' => 'By completing the subscription, a regular delivery is set up, which is automatically delivered and billed at the specified interval, starting today. Adjustments to the subscription can be made in the customer account. Possible payment methods are PayPal and credit card.',
'abo_pros' => 'Subscription benefits',
'abo_settings' => 'Subscription settings',
'abo_start_date' => 'Start date of the subscription',
'abo_type_info' => 'Note: Each subscription consists of at least one basic product (base ! <br>Upgrade products (upgrade ) are optional and can be added as desired.',
'abo_type_info_base' => 'The subscription requires at least one basic product :base !',
'add_new_abo' => 'Add new subscription',
'add_product' => 'Add product',
'base' => 'base',
'checkout_mail_abo_hl' => 'Your subscription / regular delivery',
'checkout_mail_abo_info' => 'You can find your subscription settings in your account under "My subscriptions" and the settings can also be edited there',
'checkout_mail_abo_start' => 'Your subscription was successfully created with the following settings:',
'delivery_day' => 'Adjust delivery day',
'delivery_interval' => 'customize delivery interval',
'delivery_intervall' => 'Adjust delivery day',
'error_abo_interval' => 'The subscription interval is not correct',
'error_email_has_abo' => 'A subscription already exists for the email address :email.',
'error_next_date' => 'The date for the next execution is not correct',
'every_week' => 'every week',
'every_weeks' => 'every :num weeks',
'need_basis_product' => 'You must have at least one basic product in your subscription. Please first add a new basic product and then remove the old basic product!',
'of_month' => 'of the month',
'payment_for_abo' => 'Payment method for subscription',
'product_not_found' => 'Product not found',
'product_prices_career_level_cpay_info' => 'The product prices are displayed as customer retail prices. After the customer payment is completed, you will receive your commission according to your career level <strong>:user_level_name</strong> commission <strong>:user_level_margin %</strong>.',
'product_prices_career_level_info' => 'Product prices are displayed and calculated according to your career level <strong>:user_level_name</strong> minus <strong>:user_level_margin %</strong> margin.',
'delivery_intervall' => 'Adjust delivery day',
'abo_order_info_check' => 'By completing the subscription, a regular delivery is set up. This is automatically shipped and billed on the selected delivery day.',
'abo_order_info_check_2' => 'The first delivery and billing takes place on the day the subscription is set up. After that, shipping is automatically carried out on the selected delivery day of the following month.',
'abo_order_info_check_3' => 'PayPal and credit card are available as payment methods. <strong>The subscription has a minimum duration of :abo-min-duration months.</strong> After that, it can be paused, changed or canceled at any time.',
'abo_order_info_checkbox' => 'Yes, I have understood the subscription terms!',
'abo_infos' => 'Subscription info',
'abo_delivery_infos' => 'Subscription delivery information',
'abo_start_date' => 'Start date of the subscription',
'abo_delivery_intervall' => 'Delivery day of the subscription',
'abo_first_execution_date' => 'First execution',
'abo_next_execution_date' => 'Next execution',
'delivery_day' => 'Adjust delivery day',
'abo_settings' => 'Subscription settings',
'add_new_abo' => 'Add new subscription',
'abo_edit' => 'Edit subscription',
'abo_details' => 'Subscription details',
'abo_is_active' => 'Subscription is active',
'abo_copy_active' => 'If the subscription is not active, it will not be executed automatically',
'abo_copy_next_date' => 'The next execution date can be set to the following day at the earliest',
'abo_copy_abo_interval' => 'Adjusting the subscription delivery day affects the upcoming execution date when the subscription is active.',
'error_abo_interval' => 'The subscription interval is not correct',
'error_next_date' => 'The date for the next execution is not correct',
'checkout_mail_abo_hl' => 'Your subscription / regular delivery',
'checkout_mail_abo_start' => 'Your subscription was successfully created with the following settings:',
'checkout_mail_abo_info' => 'You can find your subscription settings in your account under "My subscriptions" and the settings can also be edited there',
'abo_new' => 'new',
'abo_okay' => 'okay',
'abo_hold' => 'stopped',
'abo_cancel' => 'canceled',
'abo_finish' => 'finished',
'abo_inactive' => 'inactive',
'abo_grace' => 'grace',
'abo_info' => 'Subscription information',
'info_min_duration_reached' => 'Your subscription can be changed, supplemented, paused or canceled earliest from :date.',
'info_min_duration_orders_left' => 'The subscription can only be changed, supplemented, paused or canceled after another :count executions.',
'pros_hl' => 'The advantages of a subscription',
'pros_list' => '<li><b>Subscription for Consultants and Customers:</b> Each consultant or customer can take out a subscription that runs on a set day of the month to ensure regular and predictable delivery.</li> <li><b>Monthly Delivery:</b> Once a month, a new delivery is sent directly to the door.</li> <li><b>Flexibly Customizable:</b> The subscription can be adjusted at any time, e.g., regarding products, quantities, or delivery times.</li> <li><b>Diverse Product Selection:</b> Various products can be included in the subscription.</li> <li><b>Easy Management:</b> Changes and adjustments can be made conveniently in the Sales Center.</li> <li><b>Pause or Cancel:</b> The subscription can be flexibly paused or canceled.</li> <li><b>Price Advantage:</b> Subscription products often receive special discounts or offers.</li> <li><b>Start Now:</b> Choose your products, Adapt the subscription to your needs, pay for the first order, and activate your subscription for subsequent deliveries.</li>',
'pros_list' => ' <li><b>Subscription for Consultants and Customers:</b> Each consultant or customer can take out a subscription that runs on a set day of the month to ensure regular and predictable delivery.</li>
<li><b>Monthly Delivery:</b> Once a month, a new delivery is sent directly to your door.</li>
<li><b>Flexibly Customizable:</b> The subscription can be individually adjusted, e.g., regarding products, quantities, or delivery times.</li>
<li><b>Diverse Product Selection:</b> Various products can be included in the subscription.</li>
<li><b>Duration:</b> The subscription has a minimum duration of <strong>:abo-min-duration months</strong>, after which it can be paused or canceled.</li>
<li><b>Price Advantage:</b> Subscription products often receive special discounts or offers.</li>
<li><b>Start Now:</b> Choose your products, adapt the subscription to your needs, pay for the first order, and activate your subscription for subsequent deliveries.</li>',
'abo_pros' => 'Subscription benefits',
'abo_order_hl' => 'Subscription compilation',
'abo_order_info_2' => 'You can adjust the products of your subscription at any time, on the next execution your compiled products will be sent to you.',
'abo_order_info_block' => 'You can adjust the compilation of your subscription after the minimum duration of <strong>:abo-min-duration months</strong>.',
'add_product' => 'Add product',
'product_prices_career_level_info' => 'Product prices are displayed and calculated according to your career level <strong>:user_level_name</strong> minus <strong>:user_level_margin %</strong> margin.',
'product_prices_career_level_cpay_info' => 'The product prices are displayed as customer retail prices. After the customer payment is completed, you will receive your commission according to your career level <strong>:user_level_name</strong> commission <strong>:user_level_margin %</strong>.',
'error_email_has_abo' => 'A subscription already exists for the email address :email.',
'abo_assigned' => 'Subscription active',
'base' => 'Base',
'upgrade' => 'Upgrade',
'abo_type_info' => 'Note: Each subscription consists of at least one base product :base ! <br>Upgrade products :upgrade are optional and can be added as desired. <br> <strong>The subscription has a minimum duration of <strong>:abo-min-duration months</strong>, after which it can be paused or canceled.</strong>',
'abo_type_info_base' => 'The subscription requires at least one base product :base !',
'need_basis_product' => 'You must have at least one base product in your subscription. Please first add a new base product and then remove the old base product!',
'abo_item_not_found' => 'Subscription item not found',
'product_not_found' => 'Product not found',
'create_abo' => 'Create subscription',
'info' => 'Info',
'data' => 'Data',
'check' => 'Check',
'choose' => 'Choose',
'order' => 'order',
'basis_product' => 'Base product',
'upgrade_products' => 'Upgrade products',
'base_product' => 'Base product',
'upgrade_product' => 'Upgrade product',
'my_address' => 'My address',
'my_address_check' => 'Check my address',
'my_address_check_info' => 'Please check your address to ensure that the goods are sent to the correct address.',
'edit' => 'edit',
'confirm_and_next' => 'confirm and next',
'understood_and_next' => 'understood and next',
'change_my_data_empty' => 'You have not yet stored a billing and delivery address, without this you cannot create a subscription, please create it.',
'abo_error_basis_product' => 'Error: Please select at least one base product.',
'error_abo_interval_in_the_past' => 'The subscription has not been executed this month yet. Changing to a past day would skip the current month.',
'cancel_abo' => 'Cancel subscription',
'confirm_cancel' => 'Do you really want to cancel the subscription?',
'back' => 'back',
'team_subscriptions' => 'Team subscriptions',
'every_month_on' => 'monthly on :day.',
);

View file

@ -0,0 +1,36 @@
<?php
return array(
'dashboard_news' => 'Dashboard News',
'add_news' => 'Add News',
'edit_news' => 'Edit News',
'title' => 'Title',
'teaser' => 'Teaser',
'content' => 'Content',
'status' => 'Status',
'active' => 'Active',
'inactive' => 'Inactive',
'created_at' => 'Created at',
'actions' => 'Actions',
'delete' => 'Delete',
'confirm_delete' => 'Really delete?',
'no_news_yet' => 'No news available yet',
'cancel' => 'Cancel',
'general_settings' => 'General Settings',
'news_active' => 'News is active',
'news_active_hint' => 'Only one active news will be displayed in the dashboard',
'news_active_single' => 'Note: Only one news can be active at a time. When activating, all others will be automatically deactivated.',
'german' => 'German',
'default_language' => 'Default Language',
'teaser_hint' => 'Short text that is directly visible (max. 2-3 sentences)',
'content_hint' => 'Longer content that is displayed after "Read more". HTML tags are allowed (e.g. <strong>, <ul>, <li>, <br>, <a>).',
'display_date' => 'Display Date',
'display_date_hint' => 'Date displayed in the dashboard (default: today\'s date)',
// File Links
'file_links' => 'File Links to Download Center',
'file_links_hint' => 'Add links to files from the Download Center that will be prominently displayed in the news.',
'link_label' => 'Link Label (e.g. "Download Price List")',
'select_file' => 'Select File',
'add_file_link' => 'Add File Link',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'account_active' => 'account activated',
'account_active_copy1line' => 'Your account has been activated after successful verification. You can find your consultant contract on the homepage in the login area of my.mivita.care. Log in with your user details to take further steps.',
'account_incomplete_copy1line' => 'Your account has not been activated, your data is not complete. Please follow the link below to complete your details.',
@ -88,11 +88,35 @@ return array (
'subject_custom_abo_payout' => 'Your individual subscription order from :name on mivita.care',
'subject_custom_payout' => 'Your individual order from :name on mivita.care',
'subject_reset' => 'reset password',
'update_level_copy1line' => 'Congratulations, you achieved your qualification (TP :tp) last month and have thus reached your next career level.<br><br>From now on you are: <b>:to</b>',
'update_level_title' => 'your career level on mivita.care',
'update_level_copy1line' => '<b>Congratulations!</b><br><br>We are incredibly proud of you! Last month, with your <b>:tp TP</b>, you not only achieved your qualification you accomplished something amazing!<br><br>Your tireless commitment and dedication have paid off. From now on, you are:<br><br><h2 style="color: #6b7758; margin: 20px 0;"><b> :to </b></h2><br>This is a true milestone in your MIVITA career!',
'update_level_title' => 'You\'ve Reached Your Next Career Level!',
'update_level_copy2line' => 'Your success is our success, and we are thrilled to accompany you on this exciting journey. With this new level, even more opportunities are opening up for you:<br><br>- Higher commissions and better margins<br>- Expanded possibilities for your business<br>- More recognition and status in the team',
'update_level_copy3line' => 'This is just the beginning!<br><br>Your success is proof that continuous work and passion lead to your goals. Stay focused, motivate your team, and achieve even greater things together with us.<br><br>Your next level is already waiting for you and we know you will achieve it!',
'verify_copy1line' => 'We have stored data about you in our system. Please follow the link below to confirm your email address. You can also change or delete your data.',
'verify_e_mail' => 'confirm your details and email address',
'your_custom_abo_payout' => 'Your personal mivita consultant - :name has put together a customized subscription order for you. Now all you have to do is pay for your subscription order. Click on the link to proceed to the mivita.care checkout.',
'your_custom_payout' => 'Your personal mivita consultant - :name has put together an individual order for you. Now all you have to do is pay for your order. Click on the link and go to the mivita.care checkout.',
'your_request_from' => 'your request from',
'user_restore_subject' => 'Your account has been restored',
'user_restore_title' => 'Account restoration successful',
'user_restore_greeting' => 'Hello :name,',
'user_restore_copy1line' => 'we are pleased to inform you that your account at mivita.care has been successfully restored.',
'user_restore_copy2line' => 'As your password was reset for security reasons when deleted, you must set a new password. Please click the button below to reset your password:',
'user_restore_copy3line' => '• Your password has been reset - please assign a new password via the link above.<br>• If you had a shop: The shop name (subdomain) was released when deleted and must be reassigned.',
'user_restore_button' => 'Set new password',
'user_restore_account_valid' => 'Your consultant membership is valid until:',
'user_restore_important' => 'Important notes:',
// DHL Tracking E-Mail
'dhl_tracking_subject' => 'Your shipment is on its way - mivita.care',
'dhl_tracking_subject_multiple' => 'Your :count shipments are on their way - mivita.care',
'dhl_tracking_title' => 'Your shipment is on its way!',
'dhl_tracking_preview' => 'Tracking number: :number - Track your package with DHL',
'dhl_tracking_message' => 'great news! Your order has been shipped and is on its way to you.',
'dhl_tracking_message_multiple' => 'great news! Your order has been shipped in :count packages and is on its way to you.',
'dhl_tracking_package_label' => 'Package :number',
'dhl_tracking_number_label' => 'Your tracking number',
'dhl_tracking_order_ref' => 'Order number: :order',
'dhl_tracking_button' => 'Track shipment with DHL',
'dhl_tracking_info' => 'You can check the current status of your shipment at any time via the button above at DHL.',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'MIVITA_Consultancy_agreement' => 'MIVITA_Consultant contract',
'active_role' => 'active role',
'activities' => 'activities',
@ -13,8 +13,8 @@ return array (
'change_your_email_address' => 'Change your email address.',
'change_your_personal_data' => 'Change your personal information.',
'change_your_personal_password' => 'Change your personal password.',
'create_your_personal_password' =>
array (
'create_your_personal_password' =>
array(
'' => 'Create your personal password.',
),
'current_points_for' => 'current points for',
@ -28,8 +28,11 @@ return array (
'manage_membership' => 'manage membership',
'manage_membership_now_here' => 'manage your membership here now',
'membership' => 'membership',
'news_updates' => 'News & Updates',
'open_since' => 'opened since',
'open_your_shop' => 'open your own mivita shop',
'read_less' => 'Show less',
'read_more' => 'Read more',
'privacy_policy_approved' => 'privacy policy agreed',
'security' => 'security',
'settings_your_shop' => 'your shop settings',
@ -38,4 +41,13 @@ return array (
'until' => 'until',
'welcome_back' => 'welcome back',
'your_shop' => 'your shop',
'monthly_statistics' => 'Monthly Statistics',
'customer_turnover_points' => 'Customer Turnover Points',
'team_turnover_points' => 'Team Turnover Points',
'direct_new_partners' => 'Direct New Partners',
'team_new_partners' => 'New Partners in Team',
'customer_subscriptions' => 'Customer Subscriptions',
'team_subscriptions' => 'Team Subscriptions',
'own' => 'Own',
'live_calculation_hint' => 'Live calculation (not yet finalized)',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'abo' => 'Subscription',
'abos' => 'Subscriptions',
'add' => 'add',
@ -64,4 +64,12 @@ return array (
'translation' => 'translation',
'trigger' => 'trigger',
'user_roles' => 'user rights',
'dhl_cockpit' => 'DHL Cockpit',
'revenue' => 'Revenue',
'level_reports' => 'Level Reports',
'marketingplan' => 'Marketing Plan',
'dashboard' => 'Dashboard',
'dashboard_news' => 'Dashboard News',
'shop' => 'Shop',
'to_shop' => 'To Shop',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'BIC' => 'BIC',
'IBAN' => 'IBAN',
'Mastercard' => 'Mastercard',
@ -115,8 +115,8 @@ return array (
'shoporder' => 'Store order',
'shoporder_pending' => 'Store order / pending',
'sofort_bank_transfer' => 'instant bank transfer',
'status' =>
array (
'status' =>
array(
'checkout_cancel' => 'payment process aborted',
'checkout_error' => 'payment process error',
'checkout_payment' => 'check out',
@ -141,4 +141,25 @@ return array (
'we_have_received_your_order_get_email' => 'We have received your order. You will shortly receive an order confirmation email from us.',
'your_mivita_team' => 'Your team from mivita.care',
'your_order_number_is' => 'Your order number is',
// Prepayment reference notices
'prepayment_important_notice' => 'Important notice regarding prepayment',
'prepayment_reference_notice' => 'IMPORTANT: Please use only the following number as payment reference:',
'prepayment_reference_only' => 'Only then can your payment be automatically assigned.',
'prepayment_bank_details' => 'Bank details for prepayment',
'prepayment_waiting_payment' => 'We are waiting for your payment. Once received, your order will be processed.',
'prepayment_txid' => 'Payment reference',
// DHL Packstation/Parcel Box
'packstation_delivery' => 'Delivery to Packstation/Parcel Box',
'packstation_info' => 'For delivery to a DHL Packstation or Parcel Box, we need your DHL post number.',
'dhl_postnumber' => 'DHL Post Number',
'packstation_address_hint' => 'Enter the Packstation number in the address field (e.g. "Packstation 145"). The postal code and city refer to the location of the Packstation.',
'packstation_alert_title' => 'Important: Packstation Delivery',
'packstation_alert_intro' => 'If you provide a DHL post number, the delivery address must be filled in as follows:',
'packstation_alert_street' => 'Packstation [3-digit number]',
'packstation_alert_street_example' => 'e.g. "Packstation 145" - NOT "12345"!',
'packstation_alert_location' => 'Location of the Packstation',
'packstation_alert_not_home' => 'not your home address!',
'packstation_alert_footer' => 'The Packstation NUMBER is 3-digits (100-999, on yellow sign). The DHL post number is 6-10 digits and goes in the separate field above.',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'adviser_id' => 'consultant ID',
'amount' => 'amount',
'amount_paid_out_gross' => 'payout amount (gross)',

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'KU' => 'KU',
'PP' => 'PP',
'TP' => 'TP',
@ -56,4 +56,94 @@ return array (
'volume_KU' => 'volume KU',
'your_sponsor' => 'your sponsor',
'your_team' => 'your team',
// Filter & Status
'filter_active' => 'active',
'filter_not_active' => 'not active',
'filter_all' => 'all',
'all_status' => 'All Status',
'qualified_green' => 'Qualified (green)',
'in_progress_yellow' => 'In Progress (yellow)',
'no_level_red' => 'No Level (red)',
// Performance & Badges
'optimized' => 'OPTIMIZED',
'standard_monitoring' => 'STANDARD + MONITORING',
'fallback' => 'FALLBACK',
'loading_time' => 'Loading time:',
'memory' => 'Memory:',
'memory_usage' => 'Memory usage:',
'team_size' => 'Team size:',
'team_members' => 'Team members:',
'execution_time' => 'Execution time:',
'user_id' => 'User ID:',
// Buttons & Actions
'performance_details' => 'Performance Details',
'team_structure' => 'Team Structure',
'new_member' => 'New Member',
'optimized_action' => 'Optimized',
'standard_action' => 'Standard',
'close' => 'Close',
'show_details' => 'Show Details',
'test_optimized' => 'Test Optimized',
'standard_version' => 'Standard Version',
// Modals & Titles
'performance_metrics_team_overview' => 'Performance Metrics - Team Overview',
'performance_metrics_my_team' => 'Performance Metrics - My Team',
'performance_monitoring' => 'Performance Monitoring',
'fallback_support' => 'Fallback Support',
// Messages & Notifications
'optimized_with_cache' => 'Optimized with Cache',
'datatable_mode_switched' => 'DataTable mode switched to ":mode"',
'error_loading_optimized_overview' => 'Error loading optimized team overview: ',
'live_not_supported_fallback' => 'Live (not supported in fallback)',
'optimized_performance_features' => 'This page uses optimized performance features.',
// Next Level
'next_level' => 'Next Level',
// Additional terms
'calculation_type' => 'Calculation Type',
'version' => 'Version',
'cache' => 'Cache',
'live' => 'Live',
// Missing table headers
'ID' => 'ID',
'Ebene' => 'Level',
'Level' => 'Level',
'KD' => 'KD',
'bis' => 'until',
// Level Reports
'level_reports_title' => 'Level Promotion Reports - My Team',
'level_reports_month' => 'Month',
'level_reports_year' => 'Year',
'level_reports_filter_not_updated' => 'Only not updated users',
'level_reports_filter_button' => 'Filter',
'level_reports_csv_export' => 'CSV Export',
'level_reports_total_promotions' => 'Total Promotions',
'level_reports_by_level' => 'Promotions by Level',
'level_reports_table_date' => 'Date',
'level_reports_table_user' => 'User',
'level_reports_table_from_level' => 'From Level',
'level_reports_table_to_level' => 'To Level',
'level_reports_table_current_level' => 'Current Level',
'level_reports_table_kp_quali' => 'KP Qual',
'level_reports_table_user_kp' => 'User KP',
'level_reports_table_pp_quali' => 'PP Qual',
'level_reports_table_user_pp' => 'User PP',
'level_reports_table_update' => 'Update',
'level_reports_table_active' => 'Active',
'level_reports_by_period' => 'Promotions by Period',
'level_reports_no_data' => 'No Level Promotions Found',
'level_reports_no_data_description' => 'No entries found with the current filters.',
'yes' => 'Yes',
'no' => 'No',
'not_available' => 'N/A',
'growth_bonus_details_description' => 'L1 = Direct Partner (gets the growth bonus always), L2 = Members (from here the growth bonus is divided if the member is qualified), etc. | Shows commission (€) and volume (points) per level.',
);

View file

@ -1,58 +1,97 @@
<?php
return array (
return array(
'abo' => 'Suscripción',
'abo_are_for_customer_and_shipped' => 'La suscripción es para un cliente y será enviada al cliente',
'abo_are_for_me_and_shipped' => 'La suscripción es para mí y se enviará a mi dirección',
'abo_assigned' => 'Suscripción activa',
'abo_cancel' => 'cancelado',
'abo_copy_abo_interval' => 'El ajuste del intervalo de suscripción no afecta a la siguiente fecha de ejecución, pero afecta a las fechas posteriores a la siguiente ejecución',
'abo_copy_active' => 'Si la suscripción no está activa, no se ejecutará automáticamente',
'abo_copy_next_date' => 'La siguiente fecha de ejecución puede establecerse como muy pronto al día siguiente',
'payment_for_abo' => 'Forma de pago para la suscripción',
'abo_delivery' => 'Suscripción - entrega regular',
'abo_delivery_infos' => 'Información de entrega de la suscripción',
'abo_delivery_interval' => 'Intervalo de entrega de la suscripción',
'abo_delivery_intervall' => 'Fecha de entrega de la suscripción',
'abo_delivery_to_me' => 'Envío de la suscripción a mi dirección',
'abo_are_for_me_and_shipped' => 'La suscripción es para mí y se enviará a mi dirección',
'abo_are_for_customer_and_shipped' => 'La suscripción es para un cliente y será enviada al cliente',
'abo_delivery_to_me' => 'Envío de suscripción a mí',
'abo_delivery_to_the_customer' => 'Entrega de suscripción al cliente',
'abo_details' => 'Detalles de suscripción',
'abo_edit' => 'Editar suscripción',
'abo_finish' => 'terminado',
'abo_grace' => 'gracia',
'abo_hold' => 'parado',
'abo_inactive' => 'inactivo',
'abo_infos' => 'Información de suscripción',
'abo_is_active' => 'La suscripción está activa',
'abo_item_not_found' => 'No se encontró la posición de suscripción',
'abo_new' => 'nuevo',
'abo_okay' => 'ok',
'abo_order_hl' => 'Compilación de suscripción',
'abo_order_info' => 'Al completar la suscripción, se establece una entrega regular, que se entrega y factura automáticamente en el intervalo especificado, a partir de hoy. Los ajustes a la suscripción se pueden hacer en la cuenta del cliente. Los métodos de pago posibles son PayPal y tarjeta de crédito.',
'abo_pros' => 'Beneficios de la suscripción',
'abo_settings' => 'Configuración de la suscripción',
'abo_start_date' => 'Fecha de inicio de la suscripción',
'abo_type_info' => 'Nota: Cada suscripción consta de al menos un producto básico :base ! <br>Productos de actualización: las actualizaciones son opcionales y se pueden agregar según se desee.',
'abo_type_info_base' => 'La suscripción requiere al menos un producto básico :base !',
'add_new_abo' => 'Añadir nueva suscripción',
'add_product' => 'Añadir producto',
'base' => 'base',
'checkout_mail_abo_hl' => 'Su suscripción / entrega regular',
'checkout_mail_abo_info' => 'Puede encontrar la configuración de su suscripción en su cuenta en «Mis suscripciones» y la configuración también se puede editar allí',
'checkout_mail_abo_start' => 'Su suscripción se ha creado correctamente con la siguiente configuración:',
'delivery_day' => 'Ajustar el día de entrega',
'delivery_interval' => 'personalizar intervalo de entrega',
'delivery_intervall' => 'Ajustar el día de entrega',
'error_abo_interval' => 'El intervalo de suscripción no es correcto',
'error_email_has_abo' => 'Ya existe una suscripción para la dirección de correo electrónico :email.',
'error_next_date' => 'La fecha de la siguiente ejecución no es correcta',
'every_week' => 'cada semana',
'every_weeks' => 'cada :num semanas',
'need_basis_product' => 'Debes tener al menos un producto básico en tu suscripción. ¡Primero agregue un nuevo producto básico y luego elimine el producto básico anterior!',
'of_month' => 'del mes',
'payment_for_abo' => 'Forma de pago para la suscripción',
'product_not_found' => 'Producto no encontrado',
'product_prices_career_level_cpay_info' => 'Los precios de los productos se muestran como precios minoristas para el cliente, luego del pago del cliente recibirás tu comisión de acuerdo a tu nivel de carrera <strong>:user_level_name</strong> comisión<strong>:user_level_margin %</strong>.',
'product_prices_career_level_info' => 'Los precios de los productos se ajustan según tu nivel profesional. <strong>:user_level_name</strong> menos<strong>:user_level_margin %</strong> Margen mostrado y calculado.',
'delivery_intervall' => 'Ajustar día de entrega',
'abo_order_info_check' => 'Al completar la suscripción, se establece una entrega regular. Esta se envía y factura automáticamente el día de entrega seleccionado.',
'abo_order_info_check_2' => 'La primera entrega y facturación se realiza el día en que se establece la suscripción. Después, el envío se realiza automáticamente el día de entrega seleccionado del mes siguiente.',
'abo_order_info_check_3' => 'PayPal y tarjeta de crédito están disponibles como métodos de pago. <strong>La suscripción tiene una duración mínima de :abo-min-duration meses.</strong> Después, puede pausarse, cambiarse o cancelarse en cualquier momento.',
'abo_order_info_checkbox' => '¡Sí, he entendido los términos de la suscripción!',
'abo_infos' => 'Información de suscripción',
'abo_delivery_infos' => 'Información de entrega de la suscripción',
'abo_start_date' => 'Fecha de inicio de la suscripción',
'abo_delivery_intervall' => 'Día de entrega de la suscripción',
'abo_first_execution_date' => 'Primera ejecución',
'abo_next_execution_date' => 'Próxima ejecución',
'delivery_day' => 'Ajustar día de entrega',
'abo_settings' => 'Configuración de suscripción',
'add_new_abo' => 'Añadir nueva suscripción',
'abo_edit' => 'Editar suscripción',
'abo_details' => 'Detalles de suscripción',
'abo_is_active' => 'La suscripción está activa',
'abo_copy_active' => 'Si la suscripción no está activa, no se ejecutará automáticamente',
'abo_copy_next_date' => 'La siguiente fecha de ejecución puede establecerse como muy pronto al día siguiente',
'abo_copy_abo_interval' => 'El ajuste del día de entrega de la suscripción afecta a la próxima fecha de ejecución cuando la suscripción está activa.',
'error_abo_interval' => 'El intervalo de suscripción no es correcto',
'error_next_date' => 'La fecha de la siguiente ejecución no es correcta',
'checkout_mail_abo_hl' => 'Su suscripción / entrega regular',
'checkout_mail_abo_start' => 'Su suscripción se ha creado correctamente con la siguiente configuración:',
'checkout_mail_abo_info' => 'Puede encontrar la configuración de su suscripción en su cuenta en "Mis suscripciones" y la configuración también se puede editar allí',
'abo_new' => 'nuevo',
'abo_okay' => 'ok',
'abo_hold' => 'parado',
'abo_cancel' => 'cancelado',
'abo_finish' => 'terminado',
'abo_inactive' => 'inactivo',
'abo_grace' => 'gracia',
'abo_info' => 'Información de suscripción',
'info_min_duration_reached' => 'Su suscripción puede ser cambiada, complementada, pausada o cancelada como muy pronto a partir del :date.',
'info_min_duration_orders_left' => 'La suscripción solo puede ser cambiada, complementada, pausada o cancelada después de otras :count ejecuciones.',
'pros_hl' => 'Las ventajas de una suscripción',
'pros_list' => ' <li><b>Suscripción para Consultores y Clientes:</b> Cada consultor o cliente puede contratar una suscripción que se ejecuta en un día establecido del mes para garantizar una entrega regular y predecible.</li>
<li><b>Entrega Mensual:</b> Una vez al mes, se envía una nueva entrega directamente a su puerta.</li>
<li><b>Flexible y Personalizable:</b> La suscripción se puede ajustar individualmente, por ejemplo, en cuanto a productos, cantidades o tiempos de entrega.</li>
<li><b>Selección Diversa de Productos:</b> Se pueden incluir varios productos en la suscripción.</li>
<li><b>Duración:</b> La suscripción tiene una duración mínima de <strong>:abo-min-duration meses</strong>, después de la cual puede pausarse o cancelarse.</li>
<li><b>Ventaja de Precio:</b> Los productos de suscripción a menudo reciben descuentos especiales u ofertas.</li>
<li><b>Comienza Ahora:</b> Elige tus productos, adapta la suscripción a tus necesidades, paga el primer pedido y activa tu suscripción para las entregas posteriores.</li>',
'abo_pros' => 'Beneficios de suscripción',
'abo_order_hl' => 'Compilación de suscripción',
'abo_order_info_2' => 'Puede ajustar los productos de su suscripción en cualquier momento, en la próxima ejecución se le enviarán sus productos compilados.',
'abo_order_info_block' => 'Puede ajustar la compilación de su suscripción después de la duración mínima de <strong>:abo-min-duration meses</strong>.',
'add_product' => 'Añadir producto',
'product_prices_career_level_info' => 'Los precios de los productos se muestran y calculan según su nivel de carrera <strong>:user_level_name</strong> menos <strong>:user_level_margin %</strong> de margen.',
'product_prices_career_level_cpay_info' => 'Los precios de los productos se muestran como precios minoristas para el cliente. Después de completar el pago del cliente, recibirá su comisión según su nivel de carrera <strong>:user_level_name</strong> comisión <strong>:user_level_margin %</strong>.',
'error_email_has_abo' => 'Ya existe una suscripción para la dirección de correo electrónico :email.',
'abo_assigned' => 'Suscripción activa',
'base' => 'Base',
'upgrade' => 'Mejora',
'abo_type_info' => 'Nota: Cada suscripción consta de al menos un producto base :base ! <br>Los productos de mejora :upgrade son opcionales y se pueden agregar según se desee. <br> <strong>La suscripción tiene una duración mínima de <strong>:abo-min-duration meses</strong>, después de la cual puede pausarse o cancelarse.</strong>',
'abo_type_info_base' => 'La suscripción requiere al menos un producto base :base !',
'need_basis_product' => 'Debe tener al menos un producto base en su suscripción. ¡Primero agregue un nuevo producto base y luego elimine el producto base anterior!',
'abo_item_not_found' => 'Artículo de suscripción no encontrado',
'product_not_found' => 'Producto no encontrado',
'create_abo' => 'Crear suscripción',
'info' => 'Info',
'data' => 'Datos',
'check' => 'Verificar',
'choose' => 'Elegir',
'order' => 'ordenar',
'basis_product' => 'Producto base',
'upgrade_products' => 'Productos de mejora',
'base_product' => 'Producto base',
'upgrade_product' => 'Producto de mejora',
'my_address' => 'Mi dirección',
'my_address_check' => 'Verificar mi dirección',
'my_address_check_info' => 'Verifique su dirección para asegurarse de que los productos se envíen a la dirección correcta.',
'edit' => 'editar',
'confirm_and_next' => 'confirmar y siguiente',
'understood_and_next' => 'entendido y siguiente',
'change_my_data_empty' => 'Aún no ha almacenado una dirección de facturación y entrega, sin esta no puede crear una suscripción, por favor créela.',
'abo_error_basis_product' => 'Error: Por favor seleccione al menos un producto base.',
'error_abo_interval_in_the_past' => 'La suscripción no se ha ejecutado este mes aún. Cambiar a un día pasado saltaría el mes actual.',
'cancel_abo' => 'Cancelar suscripción',
'confirm_cancel' => '¿Realmente desea cancelar la suscripción?',
'back' => 'atrás',
'team_subscriptions' => 'Suscripciones de equipo',
'every_month_on' => 'mensualmente el :day.',
);

View file

@ -0,0 +1,36 @@
<?php
return array(
'dashboard_news' => 'Noticias del Panel',
'add_news' => 'Agregar Noticia',
'edit_news' => 'Editar Noticia',
'title' => 'Título',
'teaser' => 'Adelanto',
'content' => 'Contenido',
'status' => 'Estado',
'active' => 'Activo',
'inactive' => 'Inactivo',
'created_at' => 'Creado el',
'actions' => 'Acciones',
'delete' => 'Eliminar',
'confirm_delete' => '¿Realmente eliminar?',
'no_news_yet' => 'Aún no hay noticias disponibles',
'cancel' => 'Cancelar',
'general_settings' => 'Configuración General',
'news_active' => 'La noticia está activa',
'news_active_hint' => 'Solo una noticia activa se mostrará en el panel',
'news_active_single' => 'Nota: Solo una noticia puede estar activa a la vez. Al activar, todas las demás se desactivarán automáticamente.',
'german' => 'Alemán',
'default_language' => 'Idioma Predeterminado',
'teaser_hint' => 'Texto corto que es directamente visible (máx. 2-3 oraciones)',
'content_hint' => 'Contenido más largo que se muestra después de "Leer más". Se permiten etiquetas HTML (p. ej. <strong>, <ul>, <li>, <br>, <a>).',
'display_date' => 'Fecha de Visualización',
'display_date_hint' => 'Fecha mostrada en el panel (predeterminado: fecha de hoy)',
// File Links
'file_links' => 'Enlaces de Archivos al Centro de Descargas',
'file_links_hint' => 'Agregue enlaces a archivos del Centro de Descargas que se mostrarán destacados en las noticias.',
'link_label' => 'Etiqueta del Enlace (ej. "Descargar Lista de Precios")',
'select_file' => 'Seleccionar Archivo',
'add_file_link' => 'Agregar Enlace de Archivo',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'account_active' => 'cuenta activada',
'account_active_copy1line' => 'Su cuenta ha sido activada después de una verificación exitosa. Puede encontrar su contrato de consultor en la página de inicio en el área de inicio de sesión de my.mivita.care. Inicie sesión con sus datos de usuario para realizar más pasos.',
'account_incomplete_copy1line' => 'Tu cuenta no ha sido activada, tus datos no están completos. Siga el siguiente enlace para completar sus datos.',
@ -88,11 +88,35 @@ return array (
'subject_custom_abo_payout' => 'Su pedido de suscripción individual de :nombre en mivita.care',
'subject_custom_payout' => 'Su pedido personalizado de :name at mivita.care',
'subject_reset' => 'restablecer la contraseña',
'update_level_copy1line' => 'Felicitaciones, obtuvo su calificación (TP :tp) el mes pasado y, por lo tanto, ha alcanzado su siguiente nivel profesional.<br><br>A partir de ahora usted es: <b>:to</b>',
'update_level_title' => 'tu nivel profesional en mivita.care',
'update_level_copy1line' => '<b>¡Felicitaciones!</b> <br><br>¡Estamos increíblemente orgullosos de ti! El mes pasado, con tus <b>:tp TP</b>, no solo alcanzaste tu calificación, sino que lograste algo increíble.<br><br>Tu compromiso incansable y dedicación han dado sus frutos. A partir de ahora eres:<br><br><h2 style="color: #6b7758; margin: 20px 0;"><b> :to </b></h2><br>¡Este es un verdadero hito en tu carrera en MIVITA!',
'update_level_title' => '¡Has Alcanzado Tu Siguiente Nivel Profesional!',
'update_level_copy2line' => 'Tu éxito es nuestro éxito, y estamos emocionados de acompañarte en este viaje emocionante. Con este nuevo nivel, se abren aún más oportunidades para ti:<br><br>- Comisiones más altas y mejores márgenes<br>- Posibilidades expandidas para tu negocio<br>- Más reconocimiento y estatus en el equipo',
'update_level_copy3line' => '¡Esto es solo el comienzo! <br><br>Tu éxito es la prueba de que el trabajo continuo y la pasión conducen a tus metas. Mantente enfocado, motiva a tu equipo y logra cosas aún mayores junto con nosotros.<br><br>¡Tu siguiente nivel ya te está esperando y sabemos que lo lograrás!',
'verify_copy1line' => 'Hemos almacenado datos sobre usted en nuestro sistema. Siga el siguiente enlace para confirmar su dirección de correo electrónico. También puedes cambiar o eliminar tus datos.',
'verify_e_mail' => 'confirma tus datos y dirección de correo electrónico',
'your_custom_abo_payout' => 'Su asesor personal de Mivita - :name ha elaborado un pedido de suscripción individual para usted. Ahora todo lo que tienes que hacer es pagar tu pedido de suscripción. Haga clic en el enlace y vaya a la página de pago de mivita.care.',
'your_custom_payout' => 'Su asesor personal mivita - :name ha preparado un pedido personalizado para usted. Ahora sólo tienes que pagar tu pedido. Haz clic en el enlace y ve a la caja de mivita.care.',
'your_request_from' => 'su solicitud de',
'user_restore_subject' => 'Su cuenta ha sido restaurada',
'user_restore_title' => 'Restauración de cuenta exitosa',
'user_restore_greeting' => 'Hola :name,',
'user_restore_copy1line' => 'nos complace informarle que su cuenta en mivita.care ha sido restaurada exitosamente.',
'user_restore_copy2line' => 'Como su contraseña se restableció por razones de seguridad al eliminarse, debe establecer una nueva contraseña. Haga clic en el botón de abajo para restablecer su contraseña:',
'user_restore_copy3line' => '• Su contraseña ha sido restablecida - por favor asigne una nueva contraseña a través del enlace anterior.<br>• Si tenía una tienda: El nombre de la tienda (subdominio) se liberó al eliminar y debe reasignarse.',
'user_restore_button' => 'Establecer nueva contraseña',
'user_restore_account_valid' => 'Su membresía de consultor es válida hasta:',
'user_restore_important' => 'Notas importantes:',
// DHL Tracking E-Mail
'dhl_tracking_subject' => 'Tu envío está en camino - mivita.care',
'dhl_tracking_subject_multiple' => 'Tus :count envíos están en camino - mivita.care',
'dhl_tracking_title' => '¡Tu envío está en camino!',
'dhl_tracking_preview' => 'Número de seguimiento: :number - Rastrea tu paquete con DHL',
'dhl_tracking_message' => '¡buenas noticias! Tu pedido ha sido enviado y está en camino hacia ti.',
'dhl_tracking_message_multiple' => '¡buenas noticias! Tu pedido ha sido enviado en :count paquetes y está en camino hacia ti.',
'dhl_tracking_package_label' => 'Paquete :number',
'dhl_tracking_number_label' => 'Tu número de seguimiento',
'dhl_tracking_order_ref' => 'Número de pedido: :order',
'dhl_tracking_button' => 'Rastrear envío con DHL',
'dhl_tracking_info' => 'Puedes consultar el estado actual de tu envío en cualquier momento a través del botón de arriba en DHL.',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'MIVITA_Consultancy_agreement' => 'MIVITA_Contrato de consultor',
'active_role' => 'rol activo',
'activities' => 'actividades',
@ -13,8 +13,8 @@ return array (
'change_your_email_address' => 'cambia tu direccion de correo electronico.',
'change_your_personal_data' => 'cambie su información personal.',
'change_your_personal_password' => 'cambie su contraseña personal.',
'create_your_personal_password' =>
array (
'create_your_personal_password' =>
array(
'' => 'crea tu contraseña personal.',
),
'current_points_for' => 'puntos actuales para',
@ -28,8 +28,11 @@ return array (
'manage_membership' => 'gestionar la afiliación',
'manage_membership_now_here' => 'gestiona tu membresía aquí ahora',
'membership' => 'afiliación',
'news_updates' => 'Noticias y Actualizaciones',
'open_since' => 'abierto desde',
'open_your_shop' => 'abre tu propia tienda mivita',
'read_less' => 'Mostrar menos',
'read_more' => 'Leer más',
'privacy_policy_approved' => 'política de privacidad acordada',
'security' => 'seguridad',
'settings_your_shop' => 'configuración de tu tienda',

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'abo' => 'Suscripción',
'abos' => 'Suscripciones',
'add' => 'agregar',
@ -64,4 +64,12 @@ return array (
'translation' => 'traducción',
'trigger' => 'desencadenar',
'user_roles' => 'derechos de los usuarios',
'dhl_cockpit' => 'Cabina DHL',
'revenue' => 'Ingresos',
'level_reports' => 'Informes de Nivel',
'marketingplan' => 'Plan de Marketing',
'dashboard' => 'Panel',
'dashboard_news' => 'Noticias del Panel',
'shop' => 'Tienda',
'to_shop' => 'A la Tienda',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'American Express' => 'American Express',
'BIC' => 'BIC',
'IBAN' => 'IBAN',
@ -116,8 +116,8 @@ return array (
'shoporder' => 'pedido de tienda',
'shoporder_pending' => 'pedido de tienda / pendiente',
'sofort_bank_transfer' => 'transferencia bancaria instantánea',
'status' =>
array (
'status' =>
array(
'checkout_cancel' => 'proceso de pago cancelado',
'checkout_error' => 'error en el proceso de pago',
'checkout_payment' => 'verificar',
@ -142,4 +142,25 @@ return array (
'we_have_received_your_order_get_email' => 'Hemos recibido tu pedido. En breve recibirá un correo electrónico de confirmación de su pedido de nuestra parte.',
'your_mivita_team' => 'tu equipo de mivita.care',
'your_order_number_is' => 'tu numero de orden es',
// Avisos de referencia de pago anticipado
'prepayment_important_notice' => 'Aviso importante sobre el pago anticipado',
'prepayment_reference_notice' => 'IMPORTANTE: Por favor utilice únicamente el siguiente número como referencia de pago:',
'prepayment_reference_only' => 'Solo así se puede asignar automáticamente su pago.',
'prepayment_bank_details' => 'Datos bancarios para pago anticipado',
'prepayment_waiting_payment' => 'Estamos esperando su pago. Una vez recibido, se procesará su pedido.',
'prepayment_txid' => 'Referencia de pago',
// DHL Packstation/Paketbox
'packstation_delivery' => 'Entrega a Packstation/Paketbox',
'packstation_info' => 'Para la entrega a una Packstation o Paketbox de DHL, necesitamos su número de correo de DHL.',
'dhl_postnumber' => 'Número de correo DHL',
'packstation_address_hint' => 'Ingrese el número de Packstation en el campo de dirección (ej. "Packstation 145"). El código postal y la ciudad se refieren a la ubicación de la Packstation.',
'packstation_alert_title' => 'Importante: Entrega a Packstation',
'packstation_alert_intro' => 'Si proporciona un número de correo de DHL, la dirección de entrega debe completarse de la siguiente manera:',
'packstation_alert_street' => 'Packstation [número de 3 dígitos]',
'packstation_alert_street_example' => 'ej. "Packstation 145" - ¡NO "12345"!',
'packstation_alert_location' => 'Ubicación de la Packstation',
'packstation_alert_not_home' => '¡no su dirección de casa!',
'packstation_alert_footer' => 'El NÚMERO de Packstation tiene 3 dígitos (100-999, en el letrero amarillo). El número de correo DHL tiene 6-10 dígitos y va en el campo separado arriba.',
);

View file

@ -1,6 +1,6 @@
<?php
return array (
return array(
'KU' => 'KU',
'PP' => 'PP',
'TP' => 'TP',
@ -56,4 +56,94 @@ return array (
'volume_KU' => 'volumen KU',
'your_sponsor' => 'su patrocinador',
'your_team' => 'tu equipo',
// Filter & Status
'filter_active' => 'activo',
'filter_not_active' => 'no activo',
'filter_all' => 'todos',
'all_status' => 'Todo el Estado',
'qualified_green' => 'Calificado (verde)',
'in_progress_yellow' => 'En Progreso (amarillo)',
'no_level_red' => 'Sin Nivel (rojo)',
// Performance & Badges
'optimized' => 'OPTIMIZADO',
'standard_monitoring' => 'ESTÁNDAR + MONITOREO',
'fallback' => 'RESPALDO',
'loading_time' => 'Tiempo de carga:',
'memory' => 'Memoria:',
'memory_usage' => 'Uso de memoria:',
'team_size' => 'Tamaño del equipo:',
'team_members' => 'Miembros del equipo:',
'execution_time' => 'Tiempo de ejecución:',
'user_id' => 'ID de Usuario:',
// Buttons & Actions
'performance_details' => 'Detalles de Rendimiento',
'team_structure' => 'Estructura del Equipo',
'new_member' => 'Nuevo Miembro',
'optimized_action' => 'Optimizado',
'standard_action' => 'Estándar',
'close' => 'Cerrar',
'show_details' => 'Mostrar Detalles',
'test_optimized' => 'Probar Optimizado',
'standard_version' => 'Versión Estándar',
// Modals & Titles
'performance_metrics_team_overview' => 'Métricas de Rendimiento - Resumen del Equipo',
'performance_metrics_my_team' => 'Métricas de Rendimiento - Mi Equipo',
'performance_monitoring' => 'Monitoreo de Rendimiento',
'fallback_support' => 'Soporte de Respaldo',
// Messages & Notifications
'optimized_with_cache' => 'Optimizado con Caché',
'datatable_mode_switched' => 'Modo DataTable cambiado a ":mode"',
'error_loading_optimized_overview' => 'Error al cargar resumen optimizado del equipo: ',
'live_not_supported_fallback' => 'En Vivo (no soportado en respaldo)',
'optimized_performance_features' => 'Esta página utiliza funciones de rendimiento optimizadas.',
// Next Level
'next_level' => 'Siguiente Nivel',
// Additional terms
'calculation_type' => 'Tipo de Cálculo',
'version' => 'Versión',
'cache' => 'Caché',
'live' => 'En Vivo',
// Missing table headers
'ID' => 'ID',
'Ebene' => 'Nivel',
'Level' => 'Nivel',
'KD' => 'KD',
'bis' => 'hasta',
// Level Reports
'level_reports_title' => 'Informes de Ascensos de Nivel - Mi Equipo',
'level_reports_month' => 'Mes',
'level_reports_year' => 'Año',
'level_reports_filter_not_updated' => 'Solo usuarios no actualizados',
'level_reports_filter_button' => 'Filtrar',
'level_reports_csv_export' => 'Exportar CSV',
'level_reports_total_promotions' => 'Total de Ascensos',
'level_reports_by_level' => 'Ascensos por Nivel',
'level_reports_table_date' => 'Fecha',
'level_reports_table_user' => 'Usuario',
'level_reports_table_from_level' => 'Desde Nivel',
'level_reports_table_to_level' => 'A Nivel',
'level_reports_table_current_level' => 'Nivel Actual',
'level_reports_table_kp_quali' => 'Calif. KP',
'level_reports_table_user_kp' => 'KP Usuario',
'level_reports_table_pp_quali' => 'Calif. PP',
'level_reports_table_user_pp' => 'PP Usuario',
'level_reports_table_update' => 'Actualizar',
'level_reports_table_active' => 'Activo',
'level_reports_by_period' => 'Ascensos por Período',
'level_reports_no_data' => 'No se Encontraron Ascensos de Nivel',
'level_reports_no_data_description' => 'No se encontraron entradas con los filtros actuales.',
'yes' => 'Sí',
'no' => 'No',
'not_available' => 'N/A',
'growth_bonus_details_description' => 'L1 = Socio Directo (obtiene el bono de crecimiento siempre), L2 = Miembros (a partir de aquí el bono de crecimiento se divide si el miembro está calificado), etc. | Muestra comisión (€) y volumen (puntos) por nivel.',
);

View file

@ -30,7 +30,7 @@
</div>
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('tables.abo_delivery') }}</div>
{{ $user_abo->getCountOrders() }}
{{ $user_abo->getCountPaidOrders() }} / {{ \App\Models\Setting::getContentBySlug('abo-min-duration') }}
</div>
@ -83,11 +83,13 @@
<div class="card-body pb-1">
<div class="row">
<div class="col-md-6 mb-3">
@if(App\Services\AboHelper::canEditAbo($user_abo, $view))
<button type="button" class="btn btn-sm btn-secondary" data-toggle="modal" data-target="#modals-load-content"
data-id="{{ $user_abo->id }}"
data-action="abo_update_settings"
data-view="{{ $view }}"
data-route="{{ route('modal_load') }}"><span class="fa fa-edit"></span>{{ __('abo.abo_settings') }}</button>
@endif
</div>
<div class="col-md-3 mb-3">

View file

@ -0,0 +1,24 @@
<div class="card-body pb-1">
<h5 class="font-weight-semibold">
{{ __('abo.abo_info') }}
</h5>
<div class="row">
<div class="col-md-12 mb-3">
<div class="">
<h6 class="card-header bg-light text-primary px-2 py-2">
<a href="#" class="" data-toggle="collapse" data-target="#collapseFilter" aria-expanded="false" aria-controls="collapseFilter">
<i class="fa fa-caret-expand"></i> {{ __('abo.pros_hl') }}
</a>
</h6>
<div class="collapse" id="collapseFilter">
<div class="form-row pb-1 pt-1">
<ul class="list-padding-top">
{!! __('abo.pros_list', ['abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}
</ul>
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -31,7 +31,9 @@
<th>{{__('tables.status')}}</th>
<th>{{__('tables.shipping')}}</th>
<th>{{__('tables.art')}}</th>
@if(!isset($only_show_products) || !$only_show_products)
<th>{{__('tables.invoice')}}</th>
@endif
<th>{{__('tables.firstname')}}</th>
<th>{{__('tables.lastname')}}</th>
<th>{{__('tables.email')}}</th>
@ -53,10 +55,19 @@
@endif
@else
@if($user_abo->is_for === 'me')
@if(!isset($only_show_products) || !$only_show_products)
{!! '<a href="' . route('user_order_detail', [$user_abo_order->shopping_order_id]) . '" class="btn btn-xs btn-primary">'.$user_abo_order->shopping_order_id.'</a>' !!}
@else
{{ $user_abo_order->shopping_order_id }}
@endif
@endif
@if($user_abo->is_for === 'ot')
@if(!isset($only_show_products) || !$only_show_products)
{!! '<a href="' . route('user_shop_order_detail', [$user_abo_order->shopping_order_id]) . '" class="btn btn-xs btn-secondary">'.$user_abo_order->shopping_order_id.'</a>' !!}
@else
{{ $user_abo_order->shopping_order_id }}
@endif
@endif
@endif
</td>
@ -78,12 +89,14 @@
<td>
{!! '<span class="badge badge-pill badge-'.$user_abo_order->shopping_order->getPaymentForColor().'">'.$user_abo_order->shopping_order->getPaymentForType().'</span>' !!}
</td>
@if(!isset($only_show_products) || !$only_show_products)
<td>
@if($user_abo_order->shopping_order->isInvoice())
{!! '<span class="no-line-break"><a href="'.route('storage_file', [$user_abo_order->shopping_order->id, 'invoice', 'download']).'" class="btn btn-primary btn-xs"><i class="fa fa-download"></i></a>
<a href="'.route('storage_file', [$user_abo_order->shopping_order->id, 'invoice', 'stream']).'" target="_blank" class="btn btn-warning btn-xs"><i class="fa fa-eye"></i></a></span>' !!}
@endif
</td>
@endif
<td>
{{ $user_abo_order->shopping_order->shopping_user->shipping_firstname }}
</td>

View file

@ -107,17 +107,22 @@
<h5 class=" font-weight-semibold mb-2">
{{ __('abo.abo_order_hl') }}
</h5>
<p>{{ __('abo.abo_order_info_2') }}</p>
@if(isset($only_show_products) && $only_show_products === true)
<p>{!! __('abo.abo_order_info_block', ['abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}</p>
@else
<p>{{ __('abo.abo_order_info_2') }}</p>
@endif
<hr>
@include('user.abo.vat_info')
@if(!isset($only_show_products) || !$only_show_products)
<button type="button" class="btn btn-sm btn-secondary btn-block mt-2" data-toggle="modal" data-target="#modals-load-content"
data-id="{{ $user_abo->id }}"
data-action="abo-add-product"
data-route="{{ route('modal_load') }}"><i class="fa fa-plus-circle"></i> {{ __('abo.add_product') }}</button>
@endif
<div class="" id="insert_show_products_order" data-cart-order-id="{{ $user_abo->id }}">
@include('admin.abo._order_abo_show')
@php $only_show_products = isset($only_show_products) ? $only_show_products : false; @endphp
@include('admin.abo._order_abo_show', ['only_show_products' => $only_show_products])
</div>
</div>

View file

@ -28,11 +28,14 @@
<div>{{ __('order.content') }}: {{ $abo_item->product->contents }}</div>
<div>{{ __('order.art_no') }}: {{ $abo_item->product->number }}</div>
</div>
@if(!isset($only_show_products) || !$only_show_products)
<div class="options">
<a href="#" class="auto-delete-product remove_item_form_cart product-tooltip" data-order-item-id="{{$abo_item->id}}" data-product-id="{{ $abo_item->product->id }}"><i class="fa fa-times"></i> {{ __('order.article_remove') }}</a>
</div>
@endif
</td>
<td>
@if(!isset($only_show_products) || !$only_show_products)
<div class="no-line-break input-group-min-w">
<div class="input-group d-inline-flex w-auto">
<span class="input-group-prepend">
@ -44,6 +47,9 @@
</span>
</div>
</div>
@else
<div class="no-line-break"> {{ $abo_item->qty }}</div>
@endif
</td>
<td class="text-right font-weight-semibold align-top px-3 py-2" style="width: 100px;">
<div class="no-line-break"> {{ $abo_item->getFormattedTotalPrice() }} &euro;</div>

View file

@ -20,6 +20,9 @@
<div class="card">
@include('admin.abo._detail')
</div>
<div class="card mt-3">
@include('admin.abo._detail_abo_info')
</div>
<div class="card mt-3">
@include('admin.customer._customer_detail', ['shopping_user' => $customer_detail])
</div>

View file

@ -10,26 +10,27 @@
<input type="hidden" name="id" value="{{$data['id']}}">
<input type="hidden" name="view" value="{{$data['view']}}">
@if($data['view'] !== 'admin' && ($user_abo->user_id != \Auth::user()->id && $user_abo->member_id != \Auth::user()->id))
@if(!App\Services\AboHelper::canEditAbo($user_abo, $data['view']))
<div class="alert alert-danger">
Unauthorized action. Is not my abo
</div>
@else
<div class="form-row">
<div class="col-sm-6">
<label for="abo_interval" class="form-label">{{ __('tables.abo_delivery_day') }}*</label>
<select class="custom-select" name="abo_interval" id="abo_interval" required>
{!! HTMLHelper::getAboDeliveryOptions($user_abo->abo_interval) !!}
</select>
</div>
<div class="col-sm-12 mt-1">
<i class="text-muted">{{ __('abo.abo_copy_abo_interval') }}</i>
</div>
</div>
{{--
<div class="form-row">
<div class="col-sm-6">
<label for="abo_interval" class="form-label">{{ __('tables.abo_delivery_day') }}*</label>
<select class="custom-select" name="abo_interval" id="abo_interval" required>
{!! HTMLHelper::getAboDeliveryOptions($user_abo->abo_interval) !!}
</select>
</div>
<div class="col-sm-12 mt-1">
<i class="text-muted">{{ __('abo.abo_copy_abo_interval') }}</i>
</div>
</div>
<hr>
{{-- <div class="form-row">
<div class="col-sm-6">
<label for="next_date" class="form-label">{{ __('tables.next_date') }} ({{ $user_abo->next_date }})</label>
{!! Form::text('next_date', $user_abo->next_date, ['class'=>'form-control datepicker-base']) !!}
@ -40,23 +41,44 @@
</div>
<hr>
--}}
@php
$canCancel = App\Services\AboHelper::canCancelAbo($user_abo, $data['view']);
@endphp
<hr>
@if($canCancel || $data['view'] == 'admin')
<div class="form-row">
<div class="col-sm-12">
<label class="switcher switcher-primary">
<input type="checkbox" class="switcher-input" name="abo_is_active" value="true" @if($user_abo->active) checked @endif>
<span class="switcher-indicator">
<span class="switcher-yes"></span>
<span class="switcher-no"></span>
</span>
<span class="switcher-label">{{ __('abo.abo_is_active') }}</span>
</label>
</div>
<div class="col-sm-12 mt-1">
<i class="text-muted">{{ __('abo.abo_copy_active') }}</i>
</div>
<div class="form-row">
<div class="col-sm-12">
<label class="switcher switcher-primary">
<input type="checkbox" class="switcher-input" name="abo_is_active" value="true" @if($user_abo->active) checked @endif>
<span class="switcher-indicator">
<span class="switcher-yes"></span>
<span class="switcher-no"></span>
</span>
<span class="switcher-label">{{ __('abo.abo_is_active') }}</span>
</label>
@if($data['view'] !== 'admin')
<div class="col-sm-12 mt-3">
<button type="submit" name="abo_cancel" value="true" class="btn btn-danger btn-sm" onclick="return confirm('{{ __('abo.confirm_cancel') }}')">
<i class="ion ion-ios-trash"></i> {{ __('abo.cancel_abo') }}
</button>
</div>
@endif
</div>
<div class="col-sm-12 mt-1">
<i class="text-muted">{{ __('abo.abo_copy_active') }}</i>
</div>
</div>
@else
<input type="hidden" name="abo_is_active" value="{{ $user_abo->active }}">
<div class="mt-1">
<div class="alert alert-warning">
{{ __('abo.info_min_duration_orders_left', ['count' => App\Services\AboHelper::getAboMinDuration() - $user_abo->getCountPaidOrders()]) }}
</div>
</div>
@endif
@endif
</div>

View file

@ -32,7 +32,7 @@
<td>{{ __('team.career_level') }}:</td>
<td>
{{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->business_user->user_level_name) }} &nbsp;
<span class="badge badge-outline-success"> {{ __('team.KU') }} {{ $TreeCalcBot->business_user->qual_kp }} / {{ __('team.PP') }} {{ formatNumber($TreeCalcBot->business_user->qual_pp, 0) }}</span>
<span class="badge badge-outline-success"> {{ __('team.KU') }} {{ $TreeCalcBot->business_user->qual_kp }} / {{ __('team.PP') }} {{ formatNumber($TreeCalcBot->business_user->qual_pp) }}</span>
</td>
</tr>
@ -71,8 +71,8 @@
<tr>
<td>{{ __('team.customer_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->business_user->sales_volume_points_KP_sum, 0) }} {{ __('team.KU') }}</strong>
({{ __('team.own') }}: {{ formatNumber($TreeCalcBot->business_user->sales_volume_KP_points, 0) }} | {{ __('team.shop') }}: {{ formatNumber($TreeCalcBot->business_user->sales_volume_points_shop, 0) }})
<strong>{{ formatNumber($TreeCalcBot->business_user->sales_volume_points_KP_sum) }} {{ __('team.KU') }}</strong>
({{ __('team.own') }}: {{ formatNumber($TreeCalcBot->business_user->sales_volume_KP_points) }} | {{ __('team.shop') }}: {{ formatNumber($TreeCalcBot->business_user->sales_volume_points_shop) }})
&nbsp; <span class="badge {{ $TreeCalcBot->business_user->isQualKP() ? 'badge-outline-success' : 'badge-outline-warning-dark' }}"> {{ __('team.KU') }} {{ $TreeCalcBot->business_user->qual_kp }}</span>
</td>
@ -81,7 +81,7 @@
<tr>
<td>{{ __('team.qualification_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->business_user->total_qual_pp, 0) }} {{ __('team.TP') }}</strong> (+ {{ __('team.volume_KU') }}) &nbsp;
<strong>{{ formatNumber($TreeCalcBot->business_user->total_qual_pp) }} {{ __('team.TP') }}</strong> (+ {{ __('team.volume_KU') }}) &nbsp;
</td>
</tr>
<tr>
@ -89,10 +89,10 @@
<td>
@if($TreeCalcBot->business_user->isQualLevel())
<span class="badge {{ $TreeCalcBot->business_user->isQualEqualLevel() ? 'badge-outline-success' : 'badge-outline-info' }}">
{{ __('team.KP') }} {{ formatNumber($TreeCalcBot->business_user->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->business_user->total_qual_pp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level['qual_pp'], 0) }}</strong>
{{ __('team.KP') }} {{ formatNumber($TreeCalcBot->business_user->sales_volume_points_KP_sum) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level['qual_kp']) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->business_user->total_qual_pp) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level['qual_pp']) }}</strong>
| {{ $TreeCalcBot->business_user->qual_user_level['name'] }}</span>
@endif
</td>
@ -103,14 +103,14 @@
<tr>
<td>{{ __('team.payline_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->business_user->payline_points, 0) }} {{ __('team.PP') }}</strong>
<strong>{{ formatNumber($TreeCalcBot->business_user->payline_points) }} {{ __('team.PP') }}</strong>
</td>
</tr>
<tr>
<td>{{ __('team.qualification_points') }} :</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp, 0) }} {{ __('team.PP') }}</strong> (+ {{ __('team.volume_KU') }})
<strong>{{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp) }} {{ __('team.PP') }}</strong> (+ {{ __('team.volume_KU') }})
</td>
</tr>
<tr>
@ -118,10 +118,10 @@
<td>
@if($TreeCalcBot->business_user->isQualLevel())
<span class="badge {{ $TreeCalcBot->business_user->isQualEqualLevel() ? 'badge-outline-success' : 'badge-outline-info' }}">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->business_user->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level['qual_pp'], 0) }}</strong>
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->business_user->calc_qual_kp) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level['qual_kp']) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level['qual_pp']) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->business_user->qual_user_level['name']) }}</span>
@endif
</td>
@ -131,10 +131,10 @@
<td>{{ __('team.next_commission_level') }}:</td>
<td>
<span class="badge badge-outline-warning-dark">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->business_user->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level_next['qual_kp'], 0) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level_next['qual_pp'], 0) }}</strong>
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->business_user->qual_user_level_next['_calculated_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level_next['qual_kp']) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->business_user->qual_user_level_next['_calculated_payline_points_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->qual_user_level_next['qual_pp']) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->business_user->qual_user_level_next['name']) }}</span>
</td>
</tr>
@ -146,17 +146,17 @@
<td>
@if($TreeCalcBot->business_user->next_qual_user_level)
<span class="badge badge-outline-success">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->business_user->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->next_qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->next_qual_user_level['qual_pp'], 0) }}</strong>
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->business_user->next_qual_user_level['_calculated_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->next_qual_user_level['qual_kp']) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->business_user->next_qual_user_level['_calculated_payline_points_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->next_qual_user_level['qual_pp']) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->business_user->next_qual_user_level['name']) }}</span>
@elseif($TreeCalcBot->business_user->next_can_user_level)
<span class="badge badge-outline-warning-dark">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->business_user->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->next_can_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->next_can_user_level['qual_pp'], 0) }}</strong>
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->business_user->next_can_user_level['_calculated_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->next_can_user_level['qual_kp']) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->business_user->next_can_user_level['_calculated_payline_points_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->business_user->next_can_user_level['qual_pp']) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->business_user->next_can_user_level['name']) }}</span>
@else
<span class="badge badge-outline-warning"><i class="fa fa-times"></i></span>
@ -204,13 +204,13 @@
{{-- <tr>
<td>Team Points:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->business_user->total_pp, 0) }} TP</strong>
<strong>{{ formatNumber($TreeCalcBot->business_user->total_pp) }} TP</strong>
</td>
</tr>
<tr>
<td>Qualifikation Team Points:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp, 0) }} TP</strong> (+ Volumen KP)
<strong>{{ formatNumber($TreeCalcBot->business_user->payline_points_qual_kp) }} TP</strong> (+ Volumen KP)
</td>
</tr>
--}}
@ -241,7 +241,7 @@
<div class="font-weight-bolder line-height-1 my-2 text-dark badge badge-outline-dark">{{ $line }}.</div>
@endif
</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'points'), 0) }}</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'points')) }}</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'margin'), 1) }} %</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'commission'), 2) }} &euro;</td>
</tr>
@ -250,7 +250,7 @@
<tfoot>
<tr>
<td>{{__('tables.total')}}</td>
<td>{{ formatNumber($TreeCalcBot->business_user->total_pp, 0) }}</td>
<td>{{ formatNumber($TreeCalcBot->business_user->total_pp) }}</td>
<td></td>
<td><strong>{{ formatNumber($TreeCalcBot->business_user->commission_pp_total, 2) }} &euro;</strong></td>
</tr>

View file

@ -33,7 +33,7 @@
@if($userSalesVolume)
<tr>
<td>{{ $userSalesVolume->date }}</td>
<td>{{ $userSalesVolume->points }}</td>
<td>{{ $userSalesVolume->getFormattedPoints() }}</td>
<td>{{ formatNumber($userSalesVolume->total_net) }} &euro;</td>
<td>{{ $userSalesVolume->getStatusType() }}</td>
<td>@if($userSalesVolume->user)
@ -57,7 +57,7 @@
<div class="form-row">
<div class="form-group col-sm-4">
<label for="points" class="form-label">{{__('Points')}}</label>
{{ Form::text('points', $userSalesVolume->points, array('class'=>'form-control', 'id'=>'points')) }}
{{ Form::text('points', $userSalesVolume->getFormattedPoints(), array('class'=>'form-control', 'id'=>'points')) }}
</div>
</div>

View file

@ -6,12 +6,23 @@
Business Points
<div class="float-right">
<button type="button" class="btn btn-sm btn-primary" data-toggle="modal" data-target="#modals-load-content"
data-id="new"
data-action="add_user_sales_volume"
data-back="{{url()->current()}}"
data-route="{{ route('modal_load') }}"><span class="fa fa-plus-circle"></span> Points hinzufügen
</button>
<div class="d-flex">
<form action="{{ route('admin_business_points_recalculate') }}" method="POST" style="display: none;" id="recalculate-form" onsubmit="return confirmRecalculate();" class="inline-block">
@csrf
<input type="hidden" name="points_filter_member_id" id="recalc_member_id" value="">
<input type="hidden" name="points_filter_month" id="recalc_month" value="">
<input type="hidden" name="points_filter_year" id="recalc_year" value="">
<button type="submit" class="btn btn-sm btn-warning">
<span class="fa fa-refresh"></span> Punkte neu berechnen
</button>
</form> &nbsp;
<button type="button" class="btn btn-sm btn-primary" data-toggle="modal" data-target="#modals-load-content"
data-id="new"
data-action="add_user_sales_volume"
data-back="{{url()->current()}}"
data-route="{{ route('modal_load') }}"><span class="fa fa-plus-circle"></span> Points hinzufügen
</button>
</div>
</div>
</h5>
@ -65,6 +76,25 @@
</div>
{!! Form::close() !!}
<!-- Summen-Anzeige -->
<div id="points-summary" style="display: none;" class="alert alert-info mx-4 mb-3">
<h6 class="mb-3"><strong>Monatssummen für ausgewählten Berater</strong></h6>
<div class="row">
<div class="col-md-4">
<strong>KP-Punkte (Eigene):</strong> <span id="sum-kp-points">0</span><br>
<small class="text-muted">Eigenumsatz: <span id="sum-kp-net">0</span> </small>
</div>
<div class="col-md-4">
<strong>TP-Punkte (Team):</strong> <span id="sum-tp-points">0</span><br>
<small class="text-muted">Shop: <span id="sum-shop-points">0</span> Punkte</small>
</div>
<div class="col-md-4">
<strong>Gesamtumsatz:</strong> <span id="sum-total-net">0</span> <br>
<small class="text-muted">Shop-Umsatz: <span id="sum-shop-net">0</span> </small>
</div>
</div>
</div>
<div class="card-datatable table-responsive pt-0">
<table class="datatables-style table table-striped table-bordered" id="datatable-invoice">
<thead>
@ -94,6 +124,68 @@
</div>
<script>
function toggleRecalculateButton() {
var memberId = $('select[name=points_filter_member_id]').val();
var month = $('select[name=points_filter_month]').val();
var year = $('select[name=points_filter_year]').val();
if (memberId && month && year) {
$('#recalc_member_id').val(memberId);
$('#recalc_month').val(month);
$('#recalc_year').val(year);
$('#recalculate-form').show();
loadSummary();
} else {
$('#recalculate-form').hide();
$('#points-summary').hide();
}
}
function loadSummary() {
var memberId = $('select[name=points_filter_member_id]').val();
var month = $('select[name=points_filter_month]').val();
var year = $('select[name=points_filter_year]').val();
if (!memberId || !month || !year) {
$('#points-summary').hide();
return;
}
$.ajax({
url: '{!! route('admin_business_points_summary') !!}',
type: 'GET',
data: {
points_filter_member_id: memberId,
points_filter_month: month,
points_filter_year: year
},
success: function(response) {
if (response.success && response.data) {
var data = response.data;
$('#sum-kp-points').text(data.total_KP_points.toLocaleString('de-DE'));
$('#sum-tp-points').text(data.total_TP_points.toLocaleString('de-DE'));
$('#sum-shop-points').text(data.month_shop_points.toLocaleString('de-DE'));
$('#sum-kp-net').text(data.month_total_net.toLocaleString('de-DE', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$('#sum-shop-net').text(data.month_shop_total_net.toLocaleString('de-DE', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$('#sum-total-net').text(data.total_net.toLocaleString('de-DE', {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$('#points-summary').show();
} else {
$('#points-summary').hide();
}
},
error: function() {
$('#points-summary').hide();
}
});
}
function confirmRecalculate() {
var month = $('#recalc_month').val();
var year = $('#recalc_year').val();
var monthPadded = month.toString().padStart(2, '0');
return confirm('Möchten Sie die Punkte für den ausgewählten Berater im Monat ' + monthPadded + '/' + year + ' wirklich neu berechnen?');
}
$( document ).ready(function() {
var oTable = $('#datatable-invoice').DataTable({
"processing": true,
@ -132,13 +224,27 @@
"url": "/js/datatables-{{ \App::getLocale() }}.json"
}
});
// Toggle button on filter change
$('select.on_change_select').on('change', function(){
toggleRecalculateButton();
oTable.draw();
});
$('input.on_keyup_input').on('keyup', function(){
oTable.draw();
});
// Initial toggle on page load
toggleRecalculateButton();
// Reload summary after table draw completes
oTable.on('draw', function() {
var memberId = $('select[name=points_filter_member_id]').val();
if (memberId) {
loadSummary();
}
});
});
</script>
@endsection

View file

@ -0,0 +1,277 @@
<table class="table user-view-table m-0">
<tbody>
<tr>
<td>{{ __('team.account') }}:</td>
<td>
@if($TreeCalcBot->__get('business_user')->active_account)
<span class="badge badge-outline-success">{{ __('team.active') }}</span>
@else
<span class="badge badge-outline-danger">{{ __('team.not_active') }}</span>
@endif
@if($TreeCalcBot->__get('business_user')->payment_account_date)
{{ __('team.until') }}: {{ formatDate($TreeCalcBot->__get('business_user')->payment_account_date) }}
@endif
(ID: {{ $TreeCalcBot->__get('business_user')->m_account }}) <span class="badge badge-outline-default">v2</span>
</td>
</tr>
<tr>
<td>{{ __('team.date') }}:</td>
<td>
<strong>{{ HTMLHelper::getMonth($data['month']) }} {{ $data['year'] }}</strong> |
@if($TreeCalcBot->__get('business_user')->isSave())
{{ __('team.completed') }}:
<span class="badge badge-outline-success"><i class="fa fa-check-circle"></i></span>
{{-- @if(Auth::user()->isSySAdmin())
<a target="_blank" class="btn btn-outline-secondary btn-xs" href="{{ route('admin_business_optimized_user_detail', [$user->id, 'force_live' => true]) }}">
<i class="fa fa-redo"></i> {{ __('Live Berechnung') }}
</a>
@endif --}}
@else
{{ __('team.open') }}:
<span class="badge badge-outline-warning-dark"><i class="fa fa-history"></i></span>
@endif
</td>
</tr>
<tr>
<td>{{ __('team.career_level') }}:</td>
<td>
{{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->user_level_name) }} &nbsp;
<span class="badge badge-outline-success"> {{ __('team.KU') }} {{ $TreeCalcBot->__get('business_user')->qual_kp }} / {{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->qual_pp, 0) }}</span>
</td>
</tr>
<tr>
<td>{{ __('team.sponsor') }}:</td>
<td>
@if($TreeCalcBot->__get('business_user')->sponsor && $TreeCalcBot->__get('business_user')->sponsor->is_sponsor)
{{ $TreeCalcBot->__get('business_user')->sponsor->first_name }} {{ $TreeCalcBot->__get('business_user')->sponsor->last_name }} |
{{ $TreeCalcBot->__get('business_user')->sponsor->email }} |
{{ $TreeCalcBot->__get('business_user')->sponsor->m_account }}
@else
-
@endif
</td>
</tr>
<tr>
<td>{{ __('team.consultant_margin') }}:</td>
<td>
{{ $TreeCalcBot->__get('business_user')->margin }} %
</td>
</tr>
<tr>
<td>{{ __('team.shop_commission') }}:</td>
<td>
{{ $TreeCalcBot->__get('business_user')->margin_shop }} %
</td>
</tr>
<tr>
<td>{{ __('team.net_turnover') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_total_sum) }} &euro;</strong>
({{ __('team.own') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_total) }} &euro; | {{ __('team.shop') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_total_shop) }} &euro;)
</td>
</tr>
<tr>
<td>{{ __('team.customer_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum, 0) }} {{ __('team.KU') }}</strong>
({{ __('team.own') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_KP_points, 0) }} | {{ __('team.shop') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_shop, 0) }})
&nbsp; <span class="badge {{ $TreeCalcBot->__get('business_user')->isQualKP() ? 'badge-outline-success' : 'badge-outline-warning-dark' }}"> {{ __('team.KU') }} {{ $TreeCalcBot->__get('business_user')->qual_kp }}</span>
@if($TreeCalcBot->__get('business_user')->getRestQualKP() > 0)
&nbsp; <span class="badge badge-outline-info" title="Überschüssige KU-Punkte werden als Bonus zu den TP hinzugefügt">
Rest-KU: {{ formatNumber($TreeCalcBot->__get('business_user')->getRestQualKP(), 0) }}
</span>
@endif
</td>
</tr>
@if($TreeCalcBot->__get('business_user')->version == 1)
<tr>
<td>{{ __('team.qualification_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->total_qual_pp, 0) }} {{ __('team.TP') }}</strong> (+ {{ __('team.volume_KU') }}) &nbsp;
</td>
</tr>
<tr>
<td>{{ __('team.qualification_commission') }}:</td>
<td>
@if($TreeCalcBot->__get('business_user')->isQualLevel())
<span class="badge {{ $TreeCalcBot->__get('business_user')->isQualEqualLevel() ? 'badge-outline-success' : 'badge-outline-info' }}">
{{ __('team.KP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->total_qual_pp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_pp'], 0) }}</strong>
| {{ $TreeCalcBot->__get('business_user')->qual_user_level['name'] }}</span>
@endif
</td>
</tr>
@endif
@if($TreeCalcBot->__get('business_user')->version == 2)
<tr>
<td>{{ __('team.payline_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points, 0) }} {{ __('team.PP') }}</strong>
</td>
</tr>
<tr>
<td>{{ __('team.qualification_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} {{ __('team.PP') }}</strong>
<small class="text-muted">
({{ formatNumber($TreeCalcBot->__get('business_user')->payline_points ?? 0, 0) }} Payline
@if($TreeCalcBot->__get('business_user')->getRestQualKP() > 0)
+ {{ formatNumber($TreeCalcBot->__get('business_user')->getRestQualKP(), 0) }} Rest-KU
@endif
)
</small>
</td>
</tr>
<tr>
<td>{{ __('team.current_commission_level') }}:</td>
<td>
@if($TreeCalcBot->__get('business_user')->isQualLevel())
<span class="badge {{ $TreeCalcBot->__get('business_user')->isQualEqualLevel() ? 'badge-outline-success' : 'badge-outline-info' }}">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->calc_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_pp'], 0) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->qual_user_level['name']) }}</span>
@endif
</td>
</tr>
@if($TreeCalcBot->__get('business_user')->qual_user_level_next)
<tr>
<td>{{ __('team.next_commission_level') }}:</td>
<td>
<span class="badge badge-outline-warning-dark">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['_calculated_qual_kp'], 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['qual_kp'], 0) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['_calculated_payline_points_qual_kp'], 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['qual_pp'], 0) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->qual_user_level_next['name']) }}</span>
</td>
</tr>
@endif
@endif
<tr>
<td>@if($TreeCalcBot->__get('business_user')->next_qual_user_level) {{ __('team.qualification') }}<br> @endif {{ __('team.next_career_level') }}:</td>
<td>
@if($TreeCalcBot->__get('business_user')->next_qual_user_level)
<span class="badge badge-outline-success">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['_calculated_qual_kp'], 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['_calculated_payline_points_qual_kp'], 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['qual_pp'], 0) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->next_qual_user_level['name']) }}</span>
@elseif($TreeCalcBot->__get('business_user')->next_can_user_level)
<span class="badge badge-outline-warning-dark">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['_calculated_qual_kp'], 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['_calculated_payline_points_qual_kp'], 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['qual_pp'], 0) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->next_can_user_level['name']) }}</span>
@else
<span class="badge badge-outline-warning"><i class="fa fa-times"></i></span>
@endif
</td>
</tr>
<tr>
<td><strong>{{ __('team.commission_shop') }}:</strong></td>
<td>
<span class="badge badge-primary" style="font-size: 1em;"><strong>{{ formatNumber($TreeCalcBot->__get('business_user')->commission_shop_sales) }} &euro;</strong></span>
&nbsp;
({{ __('team.sales_store_net') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_total_shop) }} &euro; / {{ $TreeCalcBot->__get('business_user')->margin_shop }} %)
</td>
</tr>
@if($TreeCalcBot->__get('business_user')->version == 1)
<tr>
<td><strong>{{ __('team.commission_team') }}:</strong></td>
<td>
<span class="badge badge-primary" style="font-size: 1em;"><strong>{{ formatNumber($TreeCalcBot->__get('business_user')->commission_pp_total) }} &euro;</strong></span>
</td>
</tr>
@endif
@if($TreeCalcBot->__get('business_user')->version == 2)
<tr>
<td><strong>{{ __('team.commission_payline') }}:</strong></td>
<td>
<span class="badge badge-primary" style="font-size: 1em;"><strong>{{ formatNumber($TreeCalcBot->__get('business_user')->commission_pp_total) }} &euro;</strong></span>
</td>
</tr>
<tr>
<td><strong>{{ __('team.commission_WB') }}:</strong></td>
<td>
<span class="badge badge-primary" style="font-size: 1em;"><strong>{{ formatNumber($TreeCalcBot->__get('business_user')->commission_growth_total) }} &euro;</strong></span>
</td>
</tr>
@endif
<tr>
<td><strong>{{ __('team.commission_total') }}:</strong></td>
<td>
<span class="badge badge-secondary" style="font-size: 1em;"><strong>{{ formatNumber($TreeCalcBot->__get('business_user')->getCommissionTotal()) }} &euro;</strong></span>
</td>
</tr>
@if($TreeCalcBot->__get('business_user')->version == 2)
{{-- <tr>
<td>Team Points:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->total_pp, 0) }} TP</strong>
</td>
</tr>
<tr>
<td>Qualifikation Team Points:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} TP</strong> (+ Volumen KP)
</td>
</tr>
--}}
@endif
</tbody>
</table>
<hr class="border-light m-0 mb-2">
<div class="table-responsive">
<table class="table card-table m-0">
<tbody>
<tr>
<th>{{__('tables.line')}}</th>
<th>{{__('tables.points')}}</th>
<th>{{__('tables.commission')}} %</th>
<th>{{__('tables.commission')}} &euro;</th>
</tr>
@foreach (array_reverse($TreeCalcBot->__get('business_user')->business_lines->toArray(), true) as $line => $object)
<tr>
<td>
@if($line <= $TreeCalcBot->__get('business_user')->getQualLevelPaylines())
<div class="font-weight-bolder line-height-1 my-2 text-dark badge badge-outline-success">{{ $line }}. {{ __('team.PP') }}</div>
@elseif($TreeCalcBot->__get('business_user')->isQualLevelGrowth($line))
<div class="font-weight-bolder line-height-1 my-2 text-dark badge badge-outline-warning-dark">{{ $line }}. {{ __('team.WB') }}</div>
@else
<div class="font-weight-bolder line-height-1 my-2 text-dark badge badge-outline-dark">{{ $line }}.</div>
@endif
</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'points'), 0) }}</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'margin'), 2) }} %</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'commission'), 2) }} &euro;</td>
</tr>
@endforeach
</tbody>
<tfoot>
<tr>
<td>{{__('tables.total')}}</td>
<td>{{ formatNumber($TreeCalcBot->__get('business_user')->total_pp, 0) }}</td>
<td></td>
<td><strong>{{ formatNumber($TreeCalcBot->__get('business_user')->commission_pp_total, 2) }} &euro;</strong></td>
</tr>
</tfoot>
</table>
</div>

View file

@ -38,7 +38,7 @@
<td>{{ __('team.career_level') }}:</td>
<td>
{{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->user_level_name) }} &nbsp;
<span class="badge badge-outline-success"> {{ __('team.KU') }} {{ $TreeCalcBot->__get('business_user')->qual_kp }} / {{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->qual_pp, 0) }}</span>
<span class="badge badge-outline-success"> {{ __('team.KU') }} {{ $TreeCalcBot->__get('business_user')->qual_kp }} / {{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->qual_pp) }}</span>
</td>
</tr>
@ -77,12 +77,12 @@
<tr>
<td>{{ __('team.customer_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum, 0) }} {{ __('team.KU') }}</strong>
({{ __('team.own') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_KP_points, 0) }} | {{ __('team.shop') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_shop, 0) }})
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum) }} {{ __('team.KU') }}</strong>
({{ __('team.own') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_KP_points) }} | {{ __('team.shop') }}: {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_shop) }})
&nbsp; <span class="badge {{ $TreeCalcBot->__get('business_user')->isQualKP() ? 'badge-outline-success' : 'badge-outline-warning-dark' }}"> {{ __('team.KU') }} {{ $TreeCalcBot->__get('business_user')->qual_kp }}</span>
@if($TreeCalcBot->__get('business_user')->getRestQualKP() > 0)
&nbsp; <span class="badge badge-outline-info" title="Überschüssige KU-Punkte werden als Bonus zu den TP hinzugefügt">
Rest-KU: {{ formatNumber($TreeCalcBot->__get('business_user')->getRestQualKP(), 0) }}
Rest-KU: {{ formatNumber($TreeCalcBot->__get('business_user')->getRestQualKP()) }}
</span>
@endif
</td>
@ -91,7 +91,7 @@
<tr>
<td>{{ __('team.qualification_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->total_qual_pp, 0) }} {{ __('team.TP') }}</strong> (+ {{ __('team.volume_KU') }}) &nbsp;
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->total_qual_pp) }} {{ __('team.TP') }}</strong> (+ {{ __('team.volume_KU') }}) &nbsp;
</td>
</tr>
<tr>
@ -99,10 +99,10 @@
<td>
@if($TreeCalcBot->__get('business_user')->isQualLevel())
<span class="badge {{ $TreeCalcBot->__get('business_user')->isQualEqualLevel() ? 'badge-outline-success' : 'badge-outline-info' }}">
{{ __('team.KP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->total_qual_pp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_pp'], 0) }}</strong>
{{ __('team.KP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_kp']) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->total_qual_pp) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_pp']) }}</strong>
| {{ $TreeCalcBot->__get('business_user')->qual_user_level['name'] }}</span>
@endif
</td>
@ -113,18 +113,18 @@
<tr>
<td>{{ __('team.payline_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points, 0) }} {{ __('team.PP') }}</strong>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points) }} {{ __('team.PP') }}</strong>
</td>
</tr>
<tr>
<td>{{ __('team.qualification_points') }}:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} {{ __('team.PP') }}</strong>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp) }} {{ __('team.PP') }}</strong>
<small class="text-muted">
({{ formatNumber($TreeCalcBot->__get('business_user')->payline_points ?? 0, 0) }} Payline
({{ formatNumber($TreeCalcBot->__get('business_user')->payline_points ?? 0) }} Payline
@if($TreeCalcBot->__get('business_user')->getRestQualKP() > 0)
+ {{ formatNumber($TreeCalcBot->__get('business_user')->getRestQualKP(), 0) }} Rest-KU
+ {{ formatNumber($TreeCalcBot->__get('business_user')->getRestQualKP()) }} Rest-KU
@endif
)
</small>
@ -135,10 +135,10 @@
<td>
@if($TreeCalcBot->__get('business_user')->isQualLevel())
<span class="badge {{ $TreeCalcBot->__get('business_user')->isQualEqualLevel() ? 'badge-outline-success' : 'badge-outline-info' }}">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_pp'], 0) }}</strong>
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->calc_qual_kp) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_kp']) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level['qual_pp']) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->qual_user_level['name']) }}</span>
@endif
</td>
@ -148,32 +148,32 @@
<td>{{ __('team.next_commission_level') }}:</td>
<td>
<span class="badge badge-outline-warning-dark">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['qual_kp'], 0) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['qual_pp'], 0) }}</strong>
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['_calculated_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['qual_kp']) }}</strong> |
{{ __('team.PP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['_calculated_payline_points_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->qual_user_level_next['qual_pp']) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->qual_user_level_next['name']) }}</span>
</td>
</tr>
@endif
@endif
<tr>
<td>@if($TreeCalcBot->__get('business_user')->next_qual_user_level) {{ __('team.qualification') }}<br> @endif {{ __('team.next_career_level') }}:</td>
<td>
@if($TreeCalcBot->__get('business_user')->next_qual_user_level)
<span class="badge badge-outline-success">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['qual_pp'], 0) }}</strong>
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['_calculated_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['qual_kp']) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['_calculated_payline_points_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_qual_user_level['qual_pp']) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->next_qual_user_level['name']) }}</span>
@elseif($TreeCalcBot->__get('business_user')->next_can_user_level)
<span class="badge badge-outline-warning-dark">
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->sales_volume_points_KP_sum, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['qual_kp'], 0) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['qual_pp'], 0) }}</strong>
{{ __('team.KU') }} {{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['_calculated_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['qual_kp']) }}</strong> |
{{ __('team.TP') }} {{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['_calculated_payline_points_qual_kp']) }} /
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->next_can_user_level['qual_pp']) }}</strong>
| {{ \App\Services\TranslationHelper::transUserLevelName($TreeCalcBot->__get('business_user')->next_can_user_level['name']) }}</span>
@else
<span class="badge badge-outline-warning"><i class="fa fa-times"></i></span>
@ -221,13 +221,13 @@
{{-- <tr>
<td>Team Points:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->total_pp, 0) }} TP</strong>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->total_pp) }} TP</strong>
</td>
</tr>
<tr>
<td>Qualifikation Team Points:</td>
<td>
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp, 0) }} TP</strong> (+ Volumen KP)
<strong>{{ formatNumber($TreeCalcBot->__get('business_user')->payline_points_qual_kp) }} TP</strong> (+ Volumen KP)
</td>
</tr>
--}}
@ -258,8 +258,8 @@
<div class="font-weight-bolder line-height-1 my-2 text-dark badge badge-outline-dark">{{ $line }}.</div>
@endif
</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'points'), 0) }}</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'margin'), 1) }} %</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'points')) }}</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'margin'), 2) }} %</td>
<td>{{ formatNumber($TreeCalcBot->getKeybyLine($line, 'commission'), 2) }} &euro;</td>
</tr>
@endforeach
@ -267,11 +267,85 @@
<tfoot>
<tr>
<td>{{__('tables.total')}}</td>
<td>{{ formatNumber($TreeCalcBot->__get('business_user')->total_pp, 0) }}</td>
<td>{{ formatNumber($TreeCalcBot->__get('business_user')->total_pp) }}</td>
<td></td>
<td><strong>{{ formatNumber($TreeCalcBot->__get('business_user')->commission_pp_total, 2) }} &euro;</strong></td>
</tr>
</tfoot>
</table>
</div>
</div>
@if(!empty($matrix = $TreeCalcBot->__get('business_user')->getGrowthBonusMatrix()))
@php
// Maximale Tiefe für Spalten ermitteln (für Matrix-Header)
$maxLevel = 0;
foreach($matrix as $leg) {
if(!empty($leg['levels'])) {
$maxKey = max(array_keys($leg['levels']));
if($maxKey > $maxLevel) $maxLevel = $maxKey;
}
}
// Begrenze Anzeige auf sinnvolle Breite (z.B. 20 Ebenen)
$maxLevel = min($maxLevel, 20);
@endphp
<div class="table-responsive mt-4">
<h5 class="font-weight-bold mb-2">{{ __('team.commission_WB') ?? '(Tiefenbonus)' }}</h5>
<table class="table card-table m-0 table-bordered table-sm text-center">
<thead class="thead-light">
<tr>
<th style="width: 200px" class="text-left align-middle">Partner</th>
@for($i = 1; $i <= $maxLevel; $i++)
<th style="min-width: 80px">L{{ $i }}</th>
@endfor
<th class="text-right align-middle" style="width: 100px; border-left: 2px solid #dee2e6">Total</th>
</tr>
</thead>
<tbody>
@foreach($matrix as $leg)
<tr>
<td class="text-left align-middle">
<div class="font-weight-bold text-truncate" style="max-width: 180px;" title="{{ $leg['user']['name'] }}">
{{ $leg['user']['name'] }}
</div>
<div class="small text-muted">
ID: {{ $leg['user']['id'] }} | {{ $leg['user']['level'] }}
</div>
</td>
@for($i = 1; $i <= $maxLevel; $i++)
@php $levelData = $leg['levels'][$i] ?? null; @endphp
<td class="align-middle position-relative">
@if($levelData)
@if($levelData['commission'] > 0)
<div class="font-weight-bold text-success" style="font-size: 0.9em">
{{ formatNumber($levelData['commission'], 2) }}
</div>
@else
<div class="text-danger" style="font-size: 0.8em">0 </div>
@endif
<div class="small text-muted" style="font-size: 0.75em">
{{ formatNumber($levelData['volume']) }} / <span class="text-danger">{{ $levelData['details'][0]['pct'] ?? 0 }}%</span>
</div>
@if(!empty($levelData['has_blocker']))
<div class="position-absolute" style="top: 0; right: 0; font-size: 0.6em;" title="Blocker: {{ $levelData['blocker_name'] }}">
<i class="fa fa-shield-alt text-warning"></i>
</div>
@endif
@else
<span class="text-muted">-</span>
@endif
</td>
@endfor
<td class="text-right align-middle font-weight-bold" style="border-left: 2px solid #dee2e6">
{{ formatNumber($leg['total_commission'], 2) }}
</td>
</tr>
@endforeach
</tbody>
</table>
<div class="small text-muted mt-1">
{{ __('team.growth_bonus_details_description') }}
</div>
</div>
@endif

View file

@ -27,6 +27,10 @@
</div>
<div class="form-row">
<div class="form-group col-sm-8">
<label class="form-label" for="slug">{{ __('URL') }}</label>
{{ Form::text('slug', $category->slug, array('placeholder'=>__('URL'), 'class'=>'form-control', 'id'=>'slug')) }}
</div>
{{--<div class="form-group col-8">
<label for="parent_id" class="form-label">{{__('Hauptkategorie')}}</label>
<select class="selectpicker" data-style="btn-default" name="">
@ -39,6 +43,9 @@
{{ Form::text('pos', $category->pos, array('placeholder'=>__('pos'), 'class'=>'form-control', 'id'=>'pos')) }}
</div>
</div>
<div class="form-row ml-1">
URL: <a href="https://mivita.shop/produkte/{{ ($category->slug) }}" target="_blank">https://mivita.shop/produkte/{{ ($category->slug) }}</a>
</div>
</div>
</div>

View file

@ -11,9 +11,9 @@
<tr>
<th style="max-width: 60px;">&nbsp;</th>
<th>{{__('Pos')}}</th>
<th>{{__('Name')}}</th>
<th>{{__('Kategorie')}}</th>
{{--<th>{{__('Kategorie')}}</th>--}}
<th>{{__('Headline')}}</th>
<th>{{__('URL')}}</th>
<th>{{__('tables.products')}}</th>
<th>{{ __('activ') }}</th>
@ -34,6 +34,7 @@
<td>@if($value->parent) {{ $value->parent->name }} @else {{ $value->name }} @endif</td>
{{-- <td>@if($value->parent) {{ $value->name }} @else - @endif</td>--}}
<td>{{ $value->headline }}</td>
<td>{{ $value->slug }}</td>
<td>{{ $value->product_categories->count() }}</td>
<td>{{ $value->productCategoriesCountActive() }}</td>

View file

@ -109,6 +109,13 @@
<div class="text-muted small">{{ __('Phone') }}</div>
{{ $shopping_user->shipping_phone }}
</div>
@if($shopping_user->shipping_postnumber)
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.dhl_postnumber') }}</div>
<span class="badge badge-info">{{ $shopping_user->shipping_postnumber }}</span>
<small class="d-block text-muted">{{ __('payment.packstation_info') }}</small>
</div>
@endif
</div>
@endif
</div>

View file

@ -21,6 +21,7 @@
</div>
<div class="col-md-3 mb-3">
<a class="btn btn-sm btn-secondary mt-2" href="{{route('admin_customer_edit', [$shopping_user->id])}}">{{ __('customer.edit_customer_data') }}</a>
<a class="btn btn-sm btn-danger mt-2" href="{{route('admin_customer_delete', [$shopping_user->id])}}" onclick="return confirm('{{ __('customer.delete_customer_confirm') }}')">{{ __('customer.delete_customer') }}</a>
</div>
</div>
@else
@ -201,7 +202,7 @@
<small>
<span class="text-muted">{{ __('order.content') }}: </span> {{ $shopping_order_item->product->contents }}<br>
<span class="text-muted">{{ __('order.weight') }}: </span> {{ $shopping_order_item->product->weight }} g<br>
<span class="text-muted">{{ __('order.points') }}: </span> {{ $shopping_order_item->product->points }}
<span class="text-muted">{{ __('order.points') }}: </span> {{ $shopping_order_item->product->getFormattedPoints() }}
</small>
</div>
</div>
@ -310,10 +311,17 @@
@forelse($shopping_user->getAllOrdersByMember() as $shopping_order)
<tr>
<td>
@if($isAdmin)
<a href="{{ route('admin_sales_customers_detail', $shopping_order->id) }}"
class="btn icon-btn btn-sm btn-primary">
<span class="fa fa-edit"></span>
</a>
@else
<a href="{{ route('user_shop_order_detail', $shopping_order->id) }}"
class="btn icon-btn btn-sm btn-primary">
<span class="fa fa-edit"></span>
</a>
@endif
</td>
<td>{{ $shopping_order->created_at->format('d.m.Y') }}</td>
<td>

View file

@ -219,6 +219,30 @@
{{ Form::text('shipping_phone', $shopping_user->shipping_phone, array('placeholder'=>__('Phone'), 'class'=>'form-control', 'id'=>'shipping_phone', 'tabindex' => 26)) }}
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label class="form-label" for="shipping_postnumber">{{ __('payment.dhl_postnumber') }} <small class="text-muted">({{ __('optional') }})</small></label>
{{ Form::text('shipping_postnumber', $shopping_user->shipping_postnumber, array('placeholder'=>'12345678', 'class'=>'form-control', 'id'=>'shipping_postnumber', 'maxlength'=>'20', 'tabindex' => 27)) }}
<small class="form-text text-muted">{{ __('payment.packstation_info') }}</small>
</div>
</div>
{{-- Alert-Box für Packstation-Hinweis --}}
<div class="alert alert-warning alert-dismissible fade show" id="packstation-alert" style="display: @if($shopping_user->shipping_postnumber) block @else none @endif;">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h6 class="alert-heading"><i class="fa fa-exclamation-triangle"></i> <strong>{{ __('payment.packstation_alert_title') }}</strong></h6>
<hr>
<p class="mb-2"><strong>{{ __('payment.packstation_alert_intro') }}</strong></p>
<ul class="mb-2 pl-3">
<li><strong>{{ __('Street') }} / {{ __('House number') }}:</strong> {{ __('payment.packstation_alert_street') }} <em>({{ __('payment.packstation_alert_street_example') }})</em></li>
<li><strong>{{ __('Postcode') }} / {{ __('City') }}:</strong> {{ __('payment.packstation_alert_location') }} <em>({{ __('payment.packstation_alert_not_home') }})</em></li>
</ul>
<p class="mb-0 small text-muted">
<i class="fa fa-info-circle"></i> {{ __('payment.packstation_alert_footer') }}
</p>
</div>
</div>
<div class="form-group">
<label class="custom-control custom-checkbox m-0">
@ -355,6 +379,24 @@
});
});
// Packstation Alert show|hide
function togglePackstationAlert() {
var postnumber = $('#shipping_postnumber').val();
if (postnumber && postnumber.trim() !== '') {
$('#packstation-alert').slideDown(300);
} else {
$('#packstation-alert').slideUp(300);
}
}
// Bei Eingabe im Postnummer-Feld
$('#shipping_postnumber').on('input', function() {
togglePackstationAlert();
});
// Bei Seitenladen prüfen
togglePackstationAlert();
$.extend( $.validator.messages, {
required: "{{__('account.validator_required')}}",
maxlength: $.validator.format( "{{__('account.validator_maxlength')}}" ),

View file

@ -205,6 +205,16 @@
@endsection
@section('scripts')
<style>
/* Highlight return shipments */
#dhl-shipments-table tbody tr.return-shipment {
background-color: rgba(255, 193, 7, 0.08) !important;
border-left: 3px solid #ffc107;
}
#dhl-shipments-table tbody tr.return-shipment:hover {
background-color: rgba(255, 193, 7, 0.15) !important;
}
</style>
<script>
$(document).ready(function() {
// DataTable initialization
@ -245,6 +255,7 @@ $(document).ready(function() {
// Re-initialize tooltips on each table draw
drawCallback: function () {
$('[data-toggle="tooltip"]').tooltip();
// Row classes are now added automatically by DataTables via DT_RowClass
}
});
@ -414,11 +425,15 @@ $(document).ready(function() {
$('#dhl-shipments-table').on('click', '.create-return-btn', function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
if (!confirm('Möchten Sie ein Retourenlabel für diese Sendung erstellen?')) {
return;
}
// Disable button to prevent double-click
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/return-label`,
method: 'POST',
@ -428,20 +443,25 @@ $(document).ready(function() {
success: function(response) {
if (response.success) {
showAlert('success', response.message);
location.reload();
setTimeout(function() {
location.reload();
}, 1500);
} else {
showAlert('error', response.message);
btn.prop('disabled', false).html('<i class="fas fa-undo"></i>');
}
},
error: function(xhr) {
showAlert('error', 'Fehler beim Erstellen des Retourenlabels.');
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Erstellen des Retourenlabels.';
showAlert('error', errorMsg);
btn.prop('disabled', false).html('<i class="fas fa-undo"></i>');
}
});
});
$('#dhl-shipments-table').on('click', '.update-tracking-btn', function() {
var shipmentId = $(this).data('shipment-id');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/update-tracking`,
method: 'POST',
@ -463,6 +483,114 @@ $(document).ready(function() {
}
});
});
// Send tracking email button
$('#dhl-shipments-table').on('click', '.send-tracking-email-btn', function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
if (!confirm('Möchten Sie die Tracking-E-Mail an den Kunden senden?')) {
return;
}
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/send-tracking-email`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
showAlert('success', response.message);
btn.removeClass('btn-outline-info').addClass('btn-success');
btn.html('<i class="fas fa-envelope"></i>');
btn.attr('title', 'E-Mail gesendet: ' + response.sent_at);
} else {
showAlert('error', response.message);
btn.prop('disabled', false).html('<i class="fas fa-envelope"></i>');
}
},
error: function(xhr) {
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Senden der E-Mail.';
showAlert('error', errorMsg);
btn.prop('disabled', false).html('<i class="fas fa-envelope"></i>');
}
});
});
// Cancel shipment button
$('#dhl-shipments-table').on('click', '.cancel-shipment-btn', function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
if (!confirm('Möchten Sie diese Sendung wirklich stornieren?\n\nDas Label wird bei DHL ungültig und kann nicht mehr verwendet werden.')) {
return;
}
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/cancel`,
method: 'DELETE',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
showAlert('success', response.message || 'Sendung wird storniert...');
setTimeout(function() {
table.ajax.reload();
}, 2000);
} else {
showAlert('error', response.message);
btn.prop('disabled', false).html('<i class="fas fa-ban"></i>');
}
},
error: function(xhr) {
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Stornieren der Sendung.';
showAlert('error', errorMsg);
btn.prop('disabled', false).html('<i class="fas fa-ban"></i>');
}
});
});
// Create return label button
$('#dhl-shipments-table').on('click', '.create-return-btn', function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
if (!confirm('Möchten Sie ein Retourenlabel für diese Sendung erstellen?')) {
return;
}
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/return-label`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
showAlert('success', response.message || 'Retourenlabel wird erstellt...');
setTimeout(function() {
table.ajax.reload();
}, 2000);
} else {
showAlert('error', response.message);
btn.prop('disabled', false).html('<i class="fas fa-undo"></i>');
}
},
error: function(xhr) {
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Erstellen des Retourenlabels.';
showAlert('error', errorMsg);
btn.prop('disabled', false).html('<i class="fas fa-undo"></i>');
}
});
});
// Remove old auto-submit logic
/*
@ -474,6 +602,9 @@ $(document).ready(function() {
// Alert helper function
function showAlert(type, message) {
// Remove any existing alerts first to prevent duplicates
$('.alert.alert-dismissible').remove();
var alertClass = type === 'success' ? 'alert-success' : 'alert-danger';
var alertHtml = `
<div class="alert ${alertClass} alert-dismissible fade show" role="alert">

View file

@ -190,6 +190,41 @@
value="{{ $shippingAddress['phone'] ?? '' }}">
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="shipping_email">E-Mail <span class="text-danger">*</span></label>
<input type="email"
class="form-control {{ empty($shippingAddress['email']) ? 'border-warning' : '' }}"
name="shipping_email"
id="shipping_email"
value="{{ $shippingAddress['email'] ?? $order->shopping_user->email ?? '' }}"
required>
<small class="form-text text-muted">
Wird für DHL Benachrichtigungen und Tracking-E-Mails verwendet.
</small>
</div>
</div>
{{-- DHL Packstation/Paketbox --}}
<div class="col-md-12 mt-2">
<hr>
<h6 class="text-muted mb-2">
<i class="fas fa-cube"></i>
Packstation / Paketbox
<small class="text-muted">(nur wenn zutreffend)</small>
</h6>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="shipping_postnumber">DHL Postnummer <small class="text-muted">(optional)</small></label>
<input type="text" class="form-control" name="shipping_postnumber" id="shipping_postnumber"
value="{{ $shippingAddress['postnumber'] ?? '' }}" maxlength="20"
placeholder="z.B. 12345678">
<small class="form-text text-muted">
Nur bei Lieferung an Packstation/Paketbox. Im Feld "Straße" dann "Packstation XXX" eintragen.
</small>
</div>
</div>
</div>
</div>
</div>

View file

@ -147,6 +147,14 @@
</a>
@endif
@if($shipment['can_send_email'] ?? false)
<button type="button"
class="btn btn-info btn-sm mb-2 send-tracking-email-modal-btn"
data-shipment-id="{{ $shipment['id'] }}">
<i class="fas fa-envelope"></i> Tracking-E-Mail senden
</button>
@endif
<a href="{{ route('admin.dhl.show', $shipment['id']) }}"
class="btn btn-outline-primary btn-sm mb-2" target="_blank">
<i class="fas fa-eye"></i> Details anzeigen
@ -302,5 +310,42 @@ window.showAlert = function(type, message) {
// Initialize modal
$(document).ready(function() {
// Modal is ready for interaction
// Tracking E-Mail senden Button
$(document).on('click', '.send-tracking-email-modal-btn', function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
if (!confirm('Tracking-E-Mail an den Kunden senden?')) {
return;
}
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> Wird gesendet...');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/send-tracking-email`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
showAlert('success', response.message);
btn.removeClass('btn-info').addClass('btn-success')
.html('<i class="fas fa-check"></i> E-Mail gesendet');
} else {
showAlert('error', response.message);
btn.prop('disabled', false).html('<i class="fas fa-envelope"></i> Tracking-E-Mail senden');
}
},
error: function(xhr) {
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Senden der E-Mail.';
showAlert('error', errorMsg);
btn.prop('disabled', false).html('<i class="fas fa-envelope"></i> Tracking-E-Mail senden');
}
});
});
});
</script>

View file

@ -4,11 +4,11 @@
<div class="d-flex justify-content-between align-items-center py-2 mb-4">
<h4 class="font-weight-bold mb-0">
<i class="fas fa-box text-primary"></i>
<i class="fas fa-box {{ $shipment->type == 'return' ? 'text-warning' : 'text-primary' }}"></i>
DHL Sendung #{{ $shipment->id }}
@if($shipment->type == 'return')
<span class="badge badge-info ml-2">
<i class="fas fa-undo"></i> Retoure
<span class="badge badge-warning ml-2" style="font-size: 1rem; font-weight: 700; padding: 0.5rem 1rem;">
<i class="fas fa-undo"></i> RETOURE
</span>
@endif
</h4>
@ -157,17 +157,8 @@
<i class="fas fa-download"></i> Label herunterladen
</a>
@endif
{{-- Todo: Add tracking button
@if($shipment->canCancel())
<button type="button"
class="btn btn-warning mr-2"
id="cancel-shipment-btn"
data-shipment-id="{{ $shipment->id }}">
<i class="fas fa-ban"></i> Sendung stornieren
</button>
@endif
@if($shipment->type == 'outbound' && !$shipment->relatedShipment)
@if($shipment->type == 'outbound' && !$shipment->returns->count())
<button type="button"
class="btn btn-info mr-2"
id="create-return-btn"
@ -175,14 +166,23 @@
<i class="fas fa-undo"></i> Retourenlabel erstellen
</button>
@endif
--}}
@if($shipment->dhl_shipment_no)
<button type="button"
class="btn btn-secondary mr-2"
<button type="button"
class="btn btn-secondary mr-2"
id="update-tracking-btn"
data-shipment-id="{{ $shipment->id }}">
<i class="fas fa-sync"></i> Tracking aktualisieren
</button>
@if($shipment->canSendTrackingEmail())
<button type="button"
class="btn {{ $shipment->wasTrackingEmailSent() ? 'btn-success' : 'btn-info' }} mr-2"
id="send-tracking-email-btn"
data-shipment-id="{{ $shipment->id }}">
<i class="fas fa-envelope"></i>
{{ $shipment->wasTrackingEmailSent() ? 'Tracking-E-Mail erneut senden' : 'Tracking-E-Mail senden' }}
</button>
@endif
@endif
</div>
</div>
@ -345,6 +345,14 @@
</td>
</tr>
@endif
@if($shipment->recipient && isset($shipment->recipient['street']))
<tr>
<td class="font-weight-semibold">Straße:</td>
<td>
{{ $shipment->recipient['street'] }}
</td>
</tr>
@endif
<tr>
<td class="font-weight-semibold">Straße:</td>
<td>
@ -492,6 +500,42 @@
<div class="col-lg-4">
<!-- Email Status -->
@if($shipment->dhl_shipment_no)
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">
<i class="fas fa-envelope text-{{ $shipment->wasTrackingEmailSent() ? 'success' : 'secondary' }}"></i>
Tracking-E-Mail Status
</h5>
</div>
<div class="card-body">
@if($shipment->wasTrackingEmailSent())
<div class="alert alert-success mb-0">
<i class="fas fa-check-circle"></i>
<strong>E-Mail gesendet</strong><br>
<small>
Am {{ $shipment->tracking_email_sent_at->format('d.m.Y \u\m H:i') }} Uhr
({{ $shipment->tracking_email_type === 'auto' ? 'automatisch' : 'manuell' }})
</small>
</div>
@else
<div class="alert alert-secondary mb-0">
<i class="fas fa-clock"></i>
<strong>Noch nicht gesendet</strong><br>
<small>
@if($shipment->canSendTrackingEmail())
Klicken Sie auf "Tracking-E-Mail senden" um den Kunden zu benachrichtigen.
@else
E-Mail kann nicht gesendet werden (keine Empfänger-E-Mail verfügbar).
@endif
</small>
</div>
@endif
</div>
</div>
@endif
<!-- Tracking Information -->
@if($shipment->tracking_status || $shipment->dhl_shipment_no)
<div class="card mb-4">
@ -709,6 +753,42 @@ $(document).ready(function() {
});
});
// Send tracking email
$('#send-tracking-email-btn').click(function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
if (!confirm('Tracking-E-Mail an den Kunden senden?')) {
return;
}
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> Wird gesendet...');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/send-tracking-email`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
showAlert('success', response.message);
setTimeout(function() {
location.reload();
}, 2000);
} else {
showAlert('error', response.message);
resetButton(btn, '<i class="fas fa-envelope"></i> Tracking-E-Mail senden');
}
},
error: function(xhr) {
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Senden der Tracking-E-Mail.';
showAlert('error', errorMsg);
resetButton(btn, '<i class="fas fa-envelope"></i> Tracking-E-Mail senden');
}
});
});
// Helper functions
function resetButton(btn, originalText) {
btn.prop('disabled', false).html(originalText);

View file

@ -44,7 +44,7 @@
@if($value->user_sales_volume)
<tr>
<td>{{ $value->user_sales_volume->date }}</td>
<td>{{ $value->user_sales_volume->points }}</td>
<td>{{ $value->user_sales_volume->getFormattedPoints() }}</td>
<td>{{ formatNumber($value->user_sales_volume->total_net) }} &euro;</td>
<td>{{ $value->user_sales_volume->getStatusType() }}</td>
<td>@if($value->user_sales_volume->user)

View file

@ -67,6 +67,9 @@
@else
<br>
@endif
@if($current->shipping_postnumber)
<strong>DHL {{ __('payment.dhl_postnumber') }}: {{ $current->shipping_postnumber }}</strong><br>
@endif
{{ $current->shipping_zipcode }}
{{ $current->shipping_city }}<br>
{{ $current->shipping_email }}<br>
@ -183,6 +186,9 @@
@else
<br>
@endif
@if($possible->shipping_postnumber)
<strong>DHL {{ __('payment.dhl_postnumber') }}: {{ $possible->shipping_postnumber }}</strong><br>
@endif
{{ $possible->shipping_zipcode }}
{{ $possible->shipping_city }}<br>
{{ $possible->shipping_email }}<br>

View file

@ -27,7 +27,7 @@
<tbody>
<tr>
<td class="border-0 text-muted align-middle" style="width: 110px">{{ __('order.points') }}:</td>
<td class="border-0">{{ $product->points }}</td>
<td class="border-0">{{ $product->getFormattedPoints() }}</td>
</tr>
<tr>
<td class="border-0 text-muted align-middle" style="width: 110px">{{ __('order.content') }}:</td>

View file

@ -51,8 +51,8 @@
</div>
<div class="form-group col-sm-12">
<label for="growth_bonus" class="form-label">{{__('Wachstumsbonus in %')}} </label>
{{ Form::text('growth_bonus', $value->getFormattedGrowthBonus(), array('placeholder'=>__('Wachstumsbonus in %'), 'class'=>'form-control', 'id'=>'growth_bonus')) }}
<label for="growth_bonus" class="form-label">{{__('Tiefenbonus in %')}} </label>
{{ Form::text('growth_bonus', $value->getFormattedGrowthBonus(), array('placeholder'=>__('Tiefenbonus in %'), 'class'=>'form-control', 'id'=>'growth_bonus')) }}
</div>
</div>
<hr>

View file

@ -59,7 +59,7 @@
<div class="td-entry-table-margin">
<i class="fa fa-plus-circle text-secondary"></i>
{!! formatNumber($credit->credit) !!} &euro; |
{!! nl2br($credit->message) !!}
{{ formatTextWithLineBreaks($credit->message, true) }}
/ {{ $credit->created_at->format("d.m.Y") }}
@if($deleteTime = $credit->deleteTime())
/ <span class="no-line-break">

View file

@ -274,7 +274,7 @@
@foreach ($cr->user_sales_volumes as $user_sales_volume)
<tr>
<td>{{ $user_sales_volume->date }}</td>
<td>{{ $user_sales_volume->points }}</td>
<td>{{ $user_sales_volume->getFormattedPoints() }}</td>
<td>{{ $user_sales_volume->info }}</td>
</tr>
@endforeach
@ -294,7 +294,7 @@
--}}
@if (isset($cbot))
{{-- Payline Points / Provision / Wachstumsbonus
{{-- Payline Points / Provision / Tiefenbonus
<div class="card-header">
<table class="table user-view-table m-0">
<tbody>
@ -324,7 +324,7 @@
</div>
--}}
{{-- Payline Points / Provision / Wachstumsbonus
{{-- Payline Points / Provision / Tiefenbonus
<hr>
<div class="card-header">
<table class="table user-view-table m-0">
@ -374,7 +374,7 @@
</div>
--}}
{{-- Table Payline Points / Provision / Wachstumsbonus
{{-- Table Payline Points / Provision / Tiefenbonus
<div class="card-body table-responsive pt-0 pb-0">
<table class="datatables-style table table-striped ">
<thead>

View file

@ -137,7 +137,7 @@
<td>{{ $user_sales_volume->date }}</td>
<td>{{ $user_sales_volume->getStatusType() }}</td>
<td>{{ formatNumber($user_sales_volume->total_net) }} &euro;</td>
<td>{{ $user_sales_volume->points }}</td>
<td>{{ $user_sales_volume->getFormattedPoints() }}</td>
<td>{{ $user_sales_volume->getStatusPointsType() }}</td>
<td>{{ $user_sales_volume->getStatusTurnoverType() }}</td>
<td>
@ -232,7 +232,7 @@
<td>{{ $user_sales_volume->date }}</td>
<td>{{ $user_sales_volume->getStatusType() }}</td>
<td>{{ formatNumber($user_sales_volume->total_net) }} &euro;</td>
<td>{{ $user_sales_volume->points }}</td>
<td>{{ $user_sales_volume->getFormattedPoints() }}</td>
<td>{{ $user_sales_volume->getStatusPointsType() }}</td>
<td>{{ $user_sales_volume->getStatusTurnoverType() }}</td>
<td>
@ -292,7 +292,7 @@
<td>{{ $user_sales_volume->id }}</td>
<td>{{ $user_sales_volume->date }}</td>
<td>{{ $user_sales_volume->getStatusType() }}</td>
<td>{{ $user_sales_volume->points }}</td>
<td>{{ $user_sales_volume->getFormattedPoints() }}</td>
<td>{{ $user_sales_volume->getStatusPointsType() }}</td>
<td>{{ $user_sales_volume->getStatusTurnoverType() }}</td>
<td>{{ $user_sales_volume->info }}</td>

View file

@ -1,7 +1,7 @@
<div class="card mb-2">
<h5 class="card-header">
<h5 class="card-header bg-primary text-white">
{{ __('Product') }}
</h5>
@ -60,7 +60,7 @@
</div>
<div class="card mb-2">
<h5 class="card-header">
<h5 class="card-header bg-primary text-white">
{{ __('Preise in EUR') }}
</h5>
<div class="card-body">
@ -93,7 +93,7 @@
</div>
<div class="form-group col-sm-4">
<label class="form-label" for="points">{{ __('Points pro Produkt') }}</label>
{{ Form::text('points', $product->points, array('placeholder'=>__('Points pro Produkt'), 'class'=>'form-control', 'id'=>'points')) }}
{{ Form::text('points', $product->getFormattedPoints(), array('placeholder'=>__('Points pro Produkt'), 'class'=>'form-control', 'id'=>'points')) }}
</div>
<div class="form-group col-sm-4">
<label class="form-label" for="amount">{{ __('Anzahl/Verfügbarkeit') }}</label>
@ -147,7 +147,7 @@
</div>
<div class="card mb-2">
<h5 class="card-header">
<h5 class="card-header bg-primary text-white">
Landesspezifische Preise
</h5>
@ -239,7 +239,7 @@
<div class="card mb-2">
<h5 class="card-header">
<h5 class="card-header bg-primary text-white">
{{ __('Details') }}
</h5>
<div class="card-body">
@ -299,7 +299,7 @@
</div>
<div class="card mb-2">
<h5 class="card-header">
<h5 class="card-header bg-primary text-white">
{{ __('order.contents') }}
</h5>
<div class="card-body">
@ -340,9 +340,80 @@
</div>
</div>
<div class="card mb-2">
<h5 class="card-header bg-primary text-white">
{{ __('Set/Kit Inhalte') }}
@if($product->bundleItems->count() > 0)
<span class="badge badge-primary ml-2">{{ $product->bundleItems->count() }} Produkt(e)</span>
@endif
</h5>
<div class="card-body">
<p class="text-muted small mb-3">
<i class="fa fa-info-circle"></i>
Hier können Sie Produkte definieren, die in diesem Set/Kit enthalten sind.
Diese werden auf Rechnungen und Lieferscheinen unter dem Hauptprodukt aufgelistet.
</p>
@if($product->bundleItems->count() > 0)
<div class="card-datatable table-responsive pt-0">
<table class="datatables-style table table-striped table-bordered">
<thead>
<tr>
<th style="width: 80px">{{__('Art.-Nr.')}}</th>
<th>{{__('Produktname')}}</th>
<th style="width: 100px" class="text-center">{{__('Menge')}}</th>
<th style="width: 100px" class="text-right">{{__('Preis VK')}}</th>
<th style="width: 80px" class="text-center">{{__('Punkte')}}</th>
<th style="width: 50px"></th>
</tr>
</thead>
<tbody>
@foreach($product->bundleItems as $bundleItem)
<tr>
<td>{{ $bundleItem->number }}</td>
<td>{{ $bundleItem->name }}</td>
<td class="text-center">
<input type="hidden" name="bundle_quantities[{{ $bundleItem->id }}][id]" value="{{ $bundleItem->id }}">
<input type="number" name="bundle_quantities[{{ $bundleItem->id }}][qty]"
value="{{ $bundleItem->pivot->quantity }}"
min="1" max="999"
class="form-control form-control-sm text-center"
style="width: 70px; display: inline-block;">
</td>
<td class="text-right">{{ $bundleItem->getFormattedPrice() }} </td>
<td class="text-center">{{ $bundleItem->getFormattedPoints() }}</td>
<td class="text-center">
<a class="text-danger" href="{{ route('admin_product_delete', [$product->id, 'bundle', $bundleItem->id]) }}" onclick="return confirm('{{__('Produkt aus Set entfernen?')}}');">
<i class="fa fa-trash-alt"></i>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<div class="alert alert-light border mb-3">
<i class="fa fa-box-open text-muted"></i>
Dieses Produkt enthält noch keine Bundle-Produkte.
</div>
@endif
<div class="form-row">
<div class="form-group col-sm-10">
<label class="form-label">{{ __('Produkte zum Set hinzufügen (Mehrfachauswahl)') }}</label>
<select class="selectpicker" name="product_bundles[]" id="product_bundles" data-style="btn-light" data-live-search="true" multiple>
{!! HTMLHelper::getProductBundleOptions($product->bundleItems()->pluck('bundle_product_id')->toArray(), $product->id) !!}
</select>
</div>
<div class="form-group col-sm-2">
<button type="submit" class="btn btn-submit mt-0 mt-sm-4">{{ __('save') }}</button>&nbsp;
</div>
</div>
</div>
</div>
@if(Auth::user()->isSuperAdmin())
<div class="card mb-2">
<h5 class="card-header">
<h5 class="card-header bg-secondary">
{{ __('SuperAdmin Einstellungen') }}
</h5>
<div class="card-body">

View file

@ -4,7 +4,7 @@
<div class="card mb-2">
<h5 class="card-header">
<h5 class="card-header bg-secondary">
{{ __('Bilder') }}
</h5>

View file

@ -58,7 +58,7 @@
</td>
<td>{{ $value->getFormattedPrice() }}</td>
<td>{{ $value->getFormattedTax() }}</td>
<td>{{ $value->points }}</td>
<td>{{ $value->getFormattedPoints() }}</td>
<td>{{ $value->contents_total }}</td>
<td>{{ $value->getUnitType() }}</td>
<td>{{ $value->getBasePriceFormatted() }}</td>

View file

@ -114,7 +114,7 @@
</div>
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('order.points_total') }}</div>
{{ $shopping_order->points }}
{{ $shopping_order->getFormattedPoints() }}
</div>
</div>
</div>
@ -205,6 +205,64 @@
<!-- / Member -->
@endif
{{-- Vorkasse Hinweis mit TXID bei unbezahlten Bestellungen --}}
@php
$vorPayment = $shopping_order->shopping_payments->where('clearingtype', 'vor')->first();
$isVorUnpaid = $vorPayment && !in_array($shopping_order->txaction, ['paid', 'completed']);
@endphp
@if($isVorUnpaid)
@php
$payTrans = $vorPayment->payment_transactions->first();
$txid = $payTrans->txid ?? ($payTrans->transmitted_data['txid'] ?? null);
@endphp
<!-- Billing -->
<div class="card-body">
<div class="alert alert-warning border-warning mb-3" style="border-left: 4px solid #ffc107 !important;">
<h5 class="mb-3"><i class="fa fa-university"></i> {{ __('payment.prepayment_bank_details') }}:</h5>
<div style="background: #fff; border-radius: 8px; padding: 15px;">
@if($payTrans && isset($payTrans->transmitted_data))
<table style="width: 100%;">
<tr>
<td style="padding: 5px 10px 5px 0; width: 140px;"><strong>{{ __('payment.account_holder') }}:</strong></td>
<td style="padding: 5px 0;">{{ $payTrans->transmitted_data['clearing_bankaccountholder'] }}</td>
</tr>
<tr>
<td style="padding: 5px 10px 5px 0;"><strong>{{ __('payment.IBAN') }}:</strong></td>
<td style="padding: 5px 0; font-family: monospace; letter-spacing: 1px;">{{ $payTrans->transmitted_data['clearing_bankiban'] }}</td>
</tr>
<tr>
<td style="padding: 5px 10px 5px 0;"><strong>{{ __('payment.BIC') }}:</strong></td>
<td style="padding: 5px 0; font-family: monospace;">{{ $payTrans->transmitted_data['clearing_bankbic'] }}</td>
</tr>
<tr>
<td style="padding: 5px 10px 5px 0;"><strong>{{ __('payment.bank') }}:</strong></td>
<td style="padding: 5px 0;">{{ $payTrans->transmitted_data['clearing_bankname'] }}</td>
</tr>
<tr style="border-top: 1px solid #ffc107;">
<td style="padding: 10px 10px 5px 0;"><strong>{{ __('payment.total_amount') }}:</strong></td>
<td style="padding: 10px 0 5px 0; font-size: 18px; font-weight: bold; color: #d35400;">{{ number_format( floatval($payTrans->shopping_payment->amount/100), 2, ",", ".") }} EUR</td>
</tr>
</table>
@endif
</div>
<hr style="border-color: #ffc107;">
<p>{{ __('payment.prepayment_reference_notice') }}</p>
@if(isset($payTrans->transmitted_data['txid']))
<div class="text-center p-4 my-3" style="background: #fff; border: 3px dashed #ffc107; border-radius: 8px;">
<strong style="font-size: 16px;">{{ __('payment.prepayment_txid') }}:</strong><br>
<span style="font-size: 32px; font-weight: bold; color: #d35400; letter-spacing: 3px;">{{ $payTrans->transmitted_data['txid'] }}</span>
</div>
@endif
<p><strong>{{ __('payment.prepayment_reference_only') }}</strong></p>
<p class="mt-3 mb-0 text-muted"><em>{{ __('payment.prepayment_waiting_payment') }}</em></p>
</div>
</div>
<hr class="m-0">
@endif
<!-- Billing -->
<div class="card-body">
@ -343,6 +401,13 @@
<div class="text-muted small">{{ __('Phone') }}</div>
{{ $shopping_order->shopping_user->shipping_phone }}
</div>
@if($shopping_order->shopping_user->shipping_postnumber)
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.dhl_postnumber') }}</div>
<span class="badge badge-info">{{ $shopping_order->shopping_user->shipping_postnumber }}</span>
<small class="d-block text-muted">{{ __('payment.packstation_delivery') }}</small>
</div>
@endif
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('Country') }}</div>
{{ $shopping_order->shopping_user->shipping_country->getLocated() }}
@ -354,6 +419,10 @@
<hr class="m-0">
<!-- / Shipping -->
<!-- DHL Sendungen -->
@include('admin.sales._detail_dhl_shipments')
<!-- / DHL Sendungen -->
<!-- Items -->
<div class="card-body">
<h6 class="small font-weight-semibold">
@ -446,6 +515,9 @@
<h6 class="small font-weight-semibold">
{{ __('tables.payment') }}
</h6>
@if ($shopping_order->txaction !== 'extern')
<div class="table-responsive">
<table class="table table-bordered table-striped">

View file

@ -0,0 +1,275 @@
{{-- DHL Sendungen Block für Order Detail --}}
@if($shopping_order->dhlShipments && $shopping_order->dhlShipments->count() > 0)
<div class="card mb-4">
<div class="card-header bg-warning text-dark">
<h5 class="mb-0">
<i class="fas fa-shipping-fast"></i>
DHL Sendungen ({{ $shopping_order->dhlShipments->count() }})
</h5>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-striped table-hover mb-0">
<thead class="thead-light">
<tr>
<th style="width: 80px;">#</th>
<th>Sendungsnummer</th>
<th>Status</th>
<th>Tracking</th>
<th>E-Mail</th>
@if (isset($isAdmin) && $isAdmin)
<th style="width: 150px;">Aktionen</th>
@endif
</tr>
</thead>
<tbody>
@foreach($shopping_order->dhlShipments as $shipment)
<tr class="{{ $shipment->type === 'return' ? 'bg-warning bg-opacity-10' : '' }}" style="{{ $shipment->type === 'return' ? 'background-color: rgba(255, 193, 7, 0.1);' : '' }}">
<td>
<a href="{{ route('admin.dhl.show', $shipment) }}" class="font-weight-bold {{ $shipment->type === 'return' ? 'text-warning' : 'text-primary' }}">
@if($shipment->type === 'return')<i class="fas fa-undo mr-1"></i>@endif#{{ $shipment->id }}
</a>
@if($shipment->type === 'return')
<br><span class="badge badge-warning badge-sm" style="font-weight: 600;">RETOURE</span>
@endif
</td>
<td>
@if($shipment->dhl_shipment_no)
<code class="text-success">{{ $shipment->dhl_shipment_no }}</code>
<br>
<a href="{{ $shipment->getTrackingUrl() }}" target="_blank" class="small text-muted">
<i class="fas fa-external-link-alt"></i> Bei DHL verfolgen
</a>
@else
<span class="text-muted">-</span>
@endif
</td>
<td>
<span class="badge badge-{{ $shipment->getStatusBadgeClass() }}">
{{ $shipment->status }}
</span>
@if($shipment->tracking_status)
<br><small class="text-muted">{{ $shipment->tracking_status }}</small>
@endif
</td>
<td>
@if($shipment->last_tracked_at)
<small class="text-muted">
{{ $shipment->last_tracked_at->format('d.m.Y H:i') }}
</small>
@else
<span class="text-muted">-</span>
@endif
</td>
<td>
@if($shipment->wasTrackingEmailSent())
<span class="badge badge-success" title="Gesendet am {{ $shipment->tracking_email_sent_at->format('d.m.Y H:i') }} ({{ $shipment->tracking_email_type === 'auto' ? 'automatisch' : 'manuell' }})">
<i class="fas fa-check"></i> {{ $shipment->tracking_email_sent_at->format('d.m.Y') }}
</span>
<br>
<small class="text-muted">
@if($shipment->tracking_email_type === 'auto')
<i class="fas fa-robot"></i> Automatisch
@else
<i class="fas fa-user"></i> Manuell
@endif
</small>
@else
<span class="badge badge-secondary">Nicht gesendet</span>
@endif
</td>
@if (isset($isAdmin) && $isAdmin)
<td>
<div class="btn-group btn-group-sm" role="group">
<a href="{{ route('admin.dhl.show', $shipment) }}" class="btn btn-outline-primary" title="Details">
<i class="fas fa-eye"></i>
</a>
@if($shipment->label_path)
<a href="{{ route('admin.dhl.download-label', $shipment) }}" class="btn btn-outline-success" title="Label herunterladen">
<i class="fas fa-download"></i>
</a>
@endif
@if($shipment->dhl_shipment_no)
<button type="button"
class="btn btn-outline-secondary dhl-update-tracking-btn"
data-shipment-id="{{ $shipment->id }}"
title="Tracking aktualisieren">
<i class="fas fa-sync"></i>
</button>
@if($shipment->canSendTrackingEmail())
<button type="button"
class="btn {{ $shipment->wasTrackingEmailSent() ? 'btn-success' : 'btn-outline-info' }} dhl-send-email-btn"
data-shipment-id="{{ $shipment->id }}"
title="{{ $shipment->wasTrackingEmailSent() ? 'E-Mail erneut senden' : 'Tracking-E-Mail senden' }}">
<i class="fas fa-envelope"></i>
</button>
@endif
@endif
@if($shipment->type === 'outbound' && !$shipment->returns->count())
<button type="button"
class="btn btn-outline-info dhl-create-return-btn"
data-shipment-id="{{ $shipment->id }}"
title="Retourenlabel erstellen">
<i class="fas fa-undo"></i>
</button>
@endif
@if($shipment->canCancel())
<button type="button"
class="btn btn-outline-danger dhl-cancel-shipment-btn"
data-shipment-id="{{ $shipment->id }}"
title="Sendung stornieren">
<i class="fas fa-ban"></i>
</button>
@endif
</div>
</td>
@endif
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<script>
$(document).ready(function() {
// Update tracking button
$('.dhl-update-tracking-btn').click(function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/update-tracking`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
location.reload();
} else {
alert('Fehler: ' + response.message);
btn.prop('disabled', false).html('<i class="fas fa-sync"></i>');
}
},
error: function() {
alert('Fehler beim Aktualisieren des Trackings.');
btn.prop('disabled', false).html('<i class="fas fa-sync"></i>');
}
});
});
// Send email button
$('.dhl-send-email-btn').click(function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
if (!confirm('Tracking-E-Mail an den Kunden senden?')) {
return;
}
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/send-tracking-email`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
alert(response.message);
location.reload();
} else {
alert('Fehler: ' + response.message);
btn.prop('disabled', false).html('<i class="fas fa-envelope"></i>');
}
},
error: function(xhr) {
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Senden der E-Mail.';
alert(errorMsg);
btn.prop('disabled', false).html('<i class="fas fa-envelope"></i>');
}
});
});
// Create return label button
$('.dhl-create-return-btn').click(function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
// Check if already processing
if (btn.prop('disabled')) {
return;
}
if (!confirm('Möchten Sie ein Retourenlabel für diese Sendung erstellen?')) {
return;
}
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/return-label`,
method: 'POST',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
alert(response.message || 'Retourenlabel wurde erstellt!');
setTimeout(function() {
location.reload();
}, 1500);
} else {
alert('Fehler: ' + response.message);
btn.prop('disabled', false).html('<i class="fas fa-undo"></i>');
}
},
error: function(xhr) {
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Erstellen des Retourenlabels.';
alert(errorMsg);
btn.prop('disabled', false).html('<i class="fas fa-undo"></i>');
}
});
});
// Cancel shipment button
$('.dhl-cancel-shipment-btn').click(function() {
var shipmentId = $(this).data('shipment-id');
var btn = $(this);
if (!confirm('Möchten Sie diese Sendung wirklich stornieren?\n\nDas Label wird bei DHL ungültig und kann nicht mehr verwendet werden.')) {
return;
}
btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
$.ajax({
url: `/admin/dhl/shipment/${shipmentId}/cancel`,
method: 'DELETE',
data: {
_token: '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
alert(response.message || 'Sendung wird storniert...');
location.reload();
} else {
alert('Fehler: ' + response.message);
btn.prop('disabled', false).html('<i class="fas fa-ban"></i>');
}
},
error: function(xhr) {
var errorMsg = xhr.responseJSON ? xhr.responseJSON.message : 'Fehler beim Stornieren der Sendung.';
alert(errorMsg);
btn.prop('disabled', false).html('<i class="fas fa-ban"></i>');
}
});
});
});
</script>
@endif

View file

@ -232,6 +232,13 @@
<div class="text-muted small">{{ __('Phone') }}</div>
{{ $homeparty_guest->shipping_phone }}
</div>
@if($homeparty_guest->shipping_postnumber)
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.dhl_postnumber') }}</div>
<span class="badge badge-info">{{ $homeparty_guest->shipping_postnumber }}</span>
<small class="d-block text-muted">{{ __('payment.packstation_delivery') }}</small>
</div>
@endif
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('Country') }}</div>
{{ $homeparty_guest->shipping_country->getLocated() }}

View file

@ -36,7 +36,7 @@
<small>
<span class="text-muted">{{ __('order.content') }}: </span> {{ $shopping_order_item->product->contents }}<br>
<span class="text-muted">{{ __('order.weight') }}: </span> {{ $shopping_order_item->product->weight }} g<br>
<span class="text-muted">{{ __('order.points') }}: </span> {{ $shopping_order_item->product->points }}<br>
<span class="text-muted">{{ __('order.points') }}: </span> {{ $shopping_order_item->product->getFormattedPoints() }}<br>
<span class="text-muted">{{ __('order.number') }}: </span> {{ $shopping_order_item->product->number }}
</small>
</div>

View file

@ -51,7 +51,7 @@
</div>--}}
<div class="form-row">
<div class="form-group col-sm-6">
<label class="form-label">{{ __('Tag des Monats für die Fixierung/Auswertungen der Business Marketing Plans') }}*</label>
<label class="form-label">Tag des Monats für die Fixierung/Auswertungen der Business Marketing Plans*</label>
{{ Form::text('settings[day-exectute-business-structur][val]', \App\Models\Setting::getContentBySlug('day-exectute-business-structur'), array('class'=>'form-control')) }}
{{ Form::hidden('settings[day-exectute-business-structur][type]', 'int') }}
</div>
@ -60,6 +60,20 @@
</div>
</div>
<div class="card mb-2">
<div class="card-body">
<h4>Abo Einstellungen</h4>
<div class="form-row">
<div class="form-group col-sm-6">
<label class="form-label">Mindestlaufzeit des Abos in Monaten*</label>
{{ Form::text('settings[abo-min-duration][val]', \App\Models\Setting::getContentBySlug('abo-min-duration'), array('class'=>'form-control')) }}
{{ Form::hidden('settings[abo-min-duration][type]', 'int') }}
</div>
</div>
<button type="submit" name="action" value="save_prepayment" class="btn btn-primary btn-sm mb-2"><i class="ion ion-ios-save"></i> speichern</button>
</div>
</div>
<div class="card mb-2">
<div class="card-body">
<h4>Auszeitparty</h4>

View file

@ -0,0 +1,49 @@
@extends('layouts.layout-2')
@section('content')
@if ($errors->any())
<div class="row">
<div class="col-sm-12">
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
</div>
</div>
@endif
<h4 class="font-weight-bold py-2 mb-2">
<i class="ion ion-md-megaphone mr-2"></i>
{{ $news->id ? __('backend.edit_news') : __('backend.add_news') }}
</h4>
{!! Form::open(['action' => route('admin_dashboard_news_store', [$news->id ?: 'new']), 'class' => 'form-horizontal', 'id'=>'']) !!}
<div class="text-left mt-0 mb-2">
<button type="submit" class="btn btn-submit btn-primary">
<i class="ion ion-md-checkmark"></i> {{ __('save') }}
</button>
<a href="{{ route('admin_dashboard_news') }}" class="btn btn-secondary">
<i class="ion ion-md-close"></i> {{ __('backend.cancel') }}
</a>
</div>
@include('admin.site.news.form')
<div class="text-left mt-0 mb-2">
<button type="submit" class="btn btn-submit btn-primary">
<i class="ion ion-md-checkmark"></i> {{ __('save') }}
</button>
<a href="{{ route('admin_dashboard_news') }}" class="btn btn-secondary">
<i class="ion ion-md-close"></i> {{ __('backend.cancel') }}
</a>
</div>
{!! Form::close() !!}
@endsection

View file

@ -0,0 +1,266 @@
<div class="card mb-4">
<h5 class="card-header">
<i class="ion ion-md-settings mr-2"></i>
{{ __('backend.general_settings') }}
</h5>
<div class="card-body">
<div class="form-row">
<div class="form-group col-md-6">
<label class="custom-control custom-checkbox">
{!! Form::checkbox('active', 1, $news->active ?? true, ['class'=>'custom-control-input']) !!}
<span class="custom-control-label">{{ __('backend.news_active') }}</span>
</label>
<small class="form-text text-muted">
<i class="ion ion-md-information-circle"></i>
{{ __('backend.news_active_hint') }}<br>
<strong>{{ __('backend.news_active_single') }}</strong>
</small>
</div>
<div class="form-group col-md-6">
<label class="form-label" for="display_date">{{ __('backend.display_date') }}</label>
{!! Form::text('display_date', $news->display_date ? $news->display_date->format('d.m.Y') : now()->format('d.m.Y'), ['class'=>'form-control datepicker-base', 'id' => 'display_date']) !!}
<small class="form-text text-muted">{{ __('backend.display_date_hint') }}</small>
</div>
</div>
</div>
</div>
<!-- German (Default Language) -->
<div class="card mb-4">
<h5 class="card-header bg-primary text-white">
<i class="ion ion-md-flag mr-2"></i>
{{ __('backend.german') }} ({{ __('backend.default_language') }})
</h5>
<div class="card-body">
<div class="form-row">
<div class="form-group col">
<label class="form-label" for="title">{{ __('backend.title') }}*</label>
{{ Form::text('title', $news->title, ['placeholder' => __('backend.title'), 'class' => 'form-control', 'id' => 'title', 'required']) }}
</div>
</div>
<div class="form-row">
<div class="form-group col">
<label class="form-label" for="teaser">{{ __('backend.teaser') }}*</label>
{{ Form::textarea('teaser', $news->teaser, ['placeholder' => __('backend.teaser'), 'class' => 'form-control', 'id' => 'teaser', 'rows' => 3, 'required']) }}
<small class="form-text text-muted">{{ __('backend.teaser_hint') }}</small>
</div>
</div>
<div class="form-row">
<div class="form-group col">
<label class="form-label" for="content">{{ __('backend.content') }}</label>
{{ Form::textarea('content', $news->content, ['placeholder' => __('backend.content'), 'class' => 'form-control summernote-small', 'id' => 'content', 'rows' => 8]) }}
<small class="form-text text-muted">{{ __('backend.content_hint') }}</small>
</div>
</div>
<div class="form-row">
<div class="form-group col">
<label class="form-label">
<i class="ion ion-md-attach mr-1"></i>
{{ __('backend.file_links') }}
</label>
<div id="file-links-de" class="border p-3 rounded bg-light">
@php
$existingLinks = $news->file_links['de'] ?? [];
@endphp
@foreach($existingLinks as $index => $link)
<div class="file-link-item mb-2" data-index="{{ $index }}">
<div class="row">
<div class="col-md-8">
<input type="text" name="file_links[de][{{ $index }}][label]"
class="form-control form-control-sm"
placeholder="{{ __('backend.link_label') }}"
value="{{ $link['label'] ?? '' }}">
</div>
<div class="col-md-3">
<select name="file_links[de][{{ $index }}][file_id]"
class="form-control form-control-sm select2-files"
data-placeholder="{{ __('backend.select_file') }}">
<option value="">{{ __('backend.select_file') }}</option>
@foreach(\App\Models\DcFile::where('active', 1)->orderBy('original_name')->get() as $file)
<option value="{{ $file->id }}"
{{ ($link['file_id'] ?? null) == $file->id ? 'selected' : '' }}>
{{ $file->original_name }}
</option>
@endforeach
</select>
</div>
<div class="col-md-1">
<button type="button" class="btn btn-sm btn-danger remove-file-link">
<i class="ion ion-md-trash"></i>
</button>
</div>
</div>
</div>
@endforeach
</div>
<button type="button" class="btn btn-sm btn-outline-primary mt-2" id="add-file-link-de">
<i class="ion ion-md-add-circle"></i> {{ __('backend.add_file_link') }}
</button>
<small class="form-text text-muted">{{ __('backend.file_links_hint') }}</small>
</div>
</div>
</div>
</div>
<!-- Other Languages -->
@foreach($languages as $locale => $localeData)
@if($locale !== 'de')
<div class="card mb-4">
<h5 class="card-header">
<i class="ion ion-md-flag mr-2"></i>
{{ $localeData['native'] }} ({{ strtoupper($locale) }})
</h5>
<div class="card-body">
<div class="form-row">
<div class="form-group col">
<label class="form-label" for="trans_title_{{ $locale }}">{{ __('backend.title') }}</label>
{{ Form::text('trans_title_' . $locale, $news->getTrans('title', $locale), ['placeholder' => __('backend.title'), 'class' => 'form-control ', 'id' => 'trans_title_' . $locale]) }}
</div>
</div>
<div class="form-row">
<div class="form-group col">
<label class="form-label" for="trans_teaser_{{ $locale }}">{{ __('backend.teaser') }}</label>
{{ Form::textarea('trans_teaser_' . $locale, $news->getTrans('teaser', $locale), ['placeholder' => __('backend.teaser'), 'class' => 'form-control', 'id' => 'trans_teaser_' . $locale, 'rows' => 3]) }}
</div>
</div>
<div class="form-row">
<div class="form-group col">
<label class="form-label" for="trans_content_{{ $locale }}">{{ __('backend.content') }}</label>
{{ Form::textarea('trans_content_' . $locale, $news->getTrans('content', $locale), ['placeholder' => __('backend.content'), 'class' => 'form-control summernote-small', 'id' => 'trans_content_' . $locale, 'rows' => 8]) }}
</div>
</div>
<div class="form-row">
<div class="form-group col">
<label class="form-label">
<i class="ion ion-md-attach mr-1"></i>
{{ __('backend.file_links') }}
</label>
<div id="file-links-{{ $locale }}" class="border p-3 rounded bg-light">
@php
$existingLinks = $news->file_links[$locale] ?? [];
@endphp
@foreach($existingLinks as $index => $link)
<div class="file-link-item mb-2" data-index="{{ $index }}">
<div class="row">
<div class="col-md-8">
<input type="text" name="file_links[{{ $locale }}][{{ $index }}][label]"
class="form-control form-control-sm"
placeholder="{{ __('backend.link_label') }}"
value="{{ $link['label'] ?? '' }}">
</div>
<div class="col-md-3">
<select name="file_links[{{ $locale }}][{{ $index }}][file_id]"
class="form-control form-control-sm select2-files"
data-placeholder="{{ __('backend.select_file') }}">
<option value="">{{ __('backend.select_file') }}</option>
@foreach(\App\Models\DcFile::where('active', 1)->orderBy('original_name')->get() as $file)
<option value="{{ $file->id }}"
{{ ($link['file_id'] ?? null) == $file->id ? 'selected' : '' }}>
{{ $file->original_name }}
</option>
@endforeach
</select>
</div>
<div class="col-md-1">
<button type="button" class="btn btn-sm btn-danger remove-file-link">
<i class="ion ion-md-trash"></i>
</button>
</div>
</div>
</div>
@endforeach
</div>
<button type="button" class="btn btn-sm btn-outline-primary mt-2 add-file-link" data-locale="{{ $locale }}">
<i class="ion ion-md-add-circle"></i> {{ __('backend.add_file_link') }}
</button>
<small class="form-text text-muted">{{ __('backend.file_links_hint') }}</small>
</div>
</div>
</div>
</div>
@endif
@endforeach
<script>
document.addEventListener('DOMContentLoaded', function() {
let fileOptions = `@foreach(\App\Models\DcFile::where('active', 1)->orderBy('original_name')->get() as $file)<option value="{{ $file->id }}">{{ $file->original_name }}</option>@endforeach`;
// Add file link for DE (default language)
document.getElementById('add-file-link-de')?.addEventListener('click', function() {
addFileLink('de');
});
// Add file link for other languages
document.querySelectorAll('.add-file-link').forEach(button => {
button.addEventListener('click', function() {
let locale = this.getAttribute('data-locale');
addFileLink(locale);
});
});
// Remove file link
document.addEventListener('click', function(e) {
if (e.target.closest('.remove-file-link')) {
e.target.closest('.file-link-item').remove();
}
});
function addFileLink(locale) {
let container = document.getElementById('file-links-' + locale);
let index = container.querySelectorAll('.file-link-item').length;
let html = `
<div class="file-link-item mb-2" data-index="${index}">
<div class="row">
<div class="col-md-8">
<input type="text" name="file_links[${locale}][${index}][label]"
class="form-control form-control-sm"
placeholder="{{ __('backend.link_label') }}">
</div>
<div class="col-md-3">
<select name="file_links[${locale}][${index}][file_id]"
class="form-control form-control-sm select2-files"
data-placeholder="{{ __('backend.select_file') }}">
<option value="">{{ __('backend.select_file') }}</option>
${fileOptions}
</select>
</div>
<div class="col-md-1">
<button type="button" class="btn btn-sm btn-danger remove-file-link">
<i class="ion ion-md-trash"></i>
</button>
</div>
</div>
</div>
`;
container.insertAdjacentHTML('beforeend', html);
// Initialize Select2 on new element
let newSelect = container.querySelector('.file-link-item:last-child select');
if (typeof $.fn.select2 !== 'undefined') {
$(newSelect).select2({
width: '100%',
placeholder: '{{ __("backend.select_file") }}'
});
}
}
// Initialize Select2 on existing selects
if (typeof $.fn.select2 !== 'undefined') {
$('.select2-files').select2({
width: '100%',
placeholder: '{{ __("backend.select_file") }}'
});
}
});
</script>

View file

@ -0,0 +1,75 @@
@extends('layouts.layout-2')
@section('content')
<h4 class="font-weight-bold py-2 mb-2">
<i class="ion ion-md-megaphone mr-2"></i>
{{ __('backend.dashboard_news') }}
</h4>
<div class="text-left mt-0 mb-4">
<a href="{{ route('admin_dashboard_news_edit', ['new']) }}" class="btn btn-primary">
<i class="ion ion-md-add"></i> {{ __('backend.add_news') }}
</a>
</div>
<div class="card">
<h5 class="card-header">
<i class="ion ion-md-megaphone mr-2"></i>
{{ __('backend.dashboard_news') }}
</h5>
<div class="card-body p-0">
@if($news->count() > 0)
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>ID</th>
<th>{{ __('backend.title') }}</th>
<th>{{ __('backend.status') }}</th>
<th>{{ __('backend.display_date') }}</th>
<th>{{ __('backend.actions') }}</th>
</tr>
</thead>
<tbody>
@foreach($news as $item)
<tr>
<td>{{ $item->id }}</td>
<td>
<strong>{{ $item->title }}</strong>
<br>
<small class="text-muted">{{ \Illuminate\Support\Str::limit($item->teaser, 80) }}</small>
</td>
<td>
@if($item->active)
<span class="badge badge-success">{{ __('backend.active') }}</span>
@else
<span class="badge badge-danger">{{ __('backend.inactive') }}</span>
@endif
</td>
<td>{{ $item->getDisplayDateFormatted() }}</td>
<td>
<a href="{{ route('admin_dashboard_news_edit', [$item->id]) }}" class="btn btn-sm btn-primary">
<i class="ion ion-md-create"></i> {{ __('navigation.edit') }}
</a>
<a href="{{ route('admin_dashboard_news_delete', [$item->id]) }}"
class="btn btn-sm btn-danger"
onclick="return confirm('{{ __('backend.confirm_delete') }}')">
<i class="ion ion-md-trash"></i> {{ __('backend.delete') }}
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<div class="alert alert-info">
<i class="ion ion-md-information-circle"></i> {{ __('backend.no_news_yet') }}
</div>
@endif
</div>
</div>
@endsection

View file

@ -5,6 +5,19 @@
{{ __('User') }}
</h4>
@if ($errors->any())
<div class="alert alert-danger alert-dismissible fade show">
<button type="button" class="close" data-dismiss="alert">×</button>
<ul>
@foreach ($errors->all() as $error)
<li>{!! $error !!}</li>
@endforeach
</ul>
</div>
@endif
<div class="card">
<div class="card-datatable table-responsive">
<table class="datatables-users table table-striped table-bordered">
@ -20,8 +33,8 @@
<th>{{ __('active') }} (seit)</th>
<th>{{ __('tables.account') }} (bis)</th>
<th>{{ __('tables.shop') }} (bis)</th>
<th>{{ __('tables.shop') }} ab</th>
<th>{{ __('Shop URL') }}</th>
<th>{{ __('tables.shop') }} ab</th>
<th>{{ __('Zahlungsarten') }}</th>
<th>{{ __('Land') }}</th>
<th>{{ __('Test Modus') }}</th>
@ -106,7 +119,7 @@
<div class="form-group col">
<label for="confirmation_date" class="form-label">{{ __('Datum') }} seit</label>
<input type="text" name="confirmation_date" class="form-control b-material-datetime-picker"
placeholder="25.10.2020 10:30">
placeholder="Datum">
</div>
</div>
</div>
@ -118,6 +131,71 @@
</form>
</div>
</div>
<!-- Modal restore -->
<div class="modal fade" id="modals-restore">
<div class="modal-dialog">
<form class="modal-content" action="{{ route('admin_user_store') }}" method="post">
@csrf
<input type="hidden" class="form-control" name="id">
<div class="modal-header">
<h5 class="modal-title">{{ __('User') }} <span
class="font-weight-light">{{ __('Account reaktivieren') }}</span></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
</div>
<div class="modal-body">
<div class="form-row">
<div class="form-group col">
<label for="email" class="form-label">{{ __('E-Mail') }}</label>
<input type="text" class="form-control" name="email" placeholder="{{ __('E-Mail') }}"
readonly>
</div>
</div>
<hr>
<div class="form-group">
<label class="custom-control custom-checkbox m-0">
<input type="checkbox" class="custom-control-input" name="restore_account" >
<span class="custom-control-label">Soll der Account des Users wieder aktiviert werden?</span>
</label>
</div>
<div class="form-row">
<div class="form-group col">
<label for="payment_account" class="form-label">Wenn ja, wird der Account bis zum angegebenen Datum aktiviert.</label>
<input type="text" name="payment_account" class="form-control b-material-datetime-picker"
placeholder="Datum">
</div>
</div>
<hr>
<div class="form-group">
<label class="custom-control custom-checkbox m-0">
<input type="checkbox" class="custom-control-input" name="restore_childs" >
<span class="custom-control-label">Sollen die Berater dem User wieder zugewiesen werden?</span>
</label>
<p class="mt-2"><i>Bei der Löschung wurden alle Berater des Users auf dem Sponsor übertragen.</i></p>
</div>
<hr>
<div class="form-group">
<label class="custom-control custom-checkbox m-0">
<input type="checkbox" class="custom-control-input" name="restore_send_email">
<span class="custom-control-label">Dem User eine E-Mail mit den Informationen zum Wiederherstellen senden?</span>
</label>
<div class="alert alert-info mt-4">
Wiederhergestellte User müssen Ihr Passwort zurücksetzen, da das Passwort beim Löschen zurückgesetzt wurde. Auch der Shop-Name (Subdomain) muss neu vergeben werden, da dieser beim Löschen freigegeben wurde.
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ __('close') }}</button>
<button type="submit" class="btn btn-primary" name="save-restore"
value="save-restore">{{ __('save') }}</button>
</div>
</form>
</div>
</div>
<!-- Modal active -->
<div class="modal fade" id="modals-active">
@ -150,7 +228,7 @@
<div class="form-group col">
<label for="active_date" class="form-label">{{ __('Datum') }} seit</label>
<input type="text" name="active_date" class="form-control b-material-datetime-picker"
placeholder="25.10.2020 10:30">
placeholder="Datum">
</div>
</div>
@ -189,7 +267,7 @@
<div class="form-group col">
<label for="payment_account" class="form-label">{{ __('tables.account') }} bis</label>
<input type="text" name="payment_account" class="form-control b-material-datetime-picker"
placeholder="25.10.2020 10:30">
placeholder="Datum">
</div>
</div>
@ -228,7 +306,7 @@
<div class="form-group col">
<label for="payment_shop" class="form-label">{{ __('tables.shop') }} bis</label>
<input type="text" name="payment_shop" class="form-control b-material-datetime-picker"
placeholder="25.10.2020 10:30">
placeholder="Datum">
</div>
</div>
</div>
@ -400,6 +478,14 @@
$(this).find(".modal-body input[name='active_date']").val(button.data('active_date'));
});
$('#modals-restore').on('show.bs.modal', function(event) {
var button = $(event.relatedTarget);
$(this).find(".modal-content input[name='id']").val(button.data('id'));
$(this).find(".modal-body input[name='email']").val(button.data('email'));
$(this).find(".modal-body input[name='active']").prop("checked", button.data('active'));
$(this).find(".modal-body input[name='payment_account']").val(button.data('payment_account'));
});
$('#modals-account').on('show.bs.modal', function(event) {
var button = $(event.relatedTarget);
$(this).find(".modal-content input[name='id']").val(button.data('id'));

View file

@ -0,0 +1,88 @@
@if(isset($dashboardNews) && $dashboardNews)
<div class="d-flex col-xl-12 align-items-stretch">
<div class="card w-100 mb-4 border-primary">
<h5 class="card-header with-elements bg-primary text-white">
<div class="card-header-title">
<i class="ion ion-md-megaphone mr-2"></i>
{{__('home.news_updates') }}
</div>
<div class="card-header-elements ml-auto">
<span class="badge badge-light">{{ $dashboardNews->getDisplayDateFormatted() }}</span>
</div>
</h5>
<div class="card-body">
{{-- Kurzer Teaser Text --}}
<div class="news-preview">
<h6 class="font-weight-bold mb-2">
<i class="ion ion-md-information-circle text-primary mr-1"></i>
{{ $dashboardNews->getLang('title') }}
</h6>
<p class="mb-2">
{{ $dashboardNews->getLang('teaser') }}
</p>
</div>
{{-- Collapse für mehr Inhalt --}}
@if($dashboardNews->getLang('content'))
<div class="collapse" id="newsCollapse">
<hr class="my-3">
<div class="news-full-content">
{!! $dashboardNews->getLang('content') !!}
</div>
{{-- Datei-Links --}}
@if($dashboardNews->hasFileLinks())
<div class="mt-3">
<div class="d-flex flex-wrap gap-2">
@foreach($dashboardNews->getFileLinks() as $linkData)
<a href="{{ route('storage_file', [$linkData['file']->id, 'dc_file', 'download']) }}"
class="btn btn-sm btn-outline-success"
target="_blank"
title="{{ $linkData['file']->original_name }}">
<i class="ion ion-md-download mr-1"></i>
{{ $linkData['label'] }}
</a>
@endforeach
<a href="{{ route('user_downloadcenter') }}"
class="btn btn-sm btn-outline-success"
title="{{ __('navigation.downloadcenter') }}">
<i class="ion ion-ios-download mr-1"></i>
{{ __('navigation.downloadcenter') }}
</a>
</div>
</div>
@endif
</div>
{{-- Mehr lesen Button --}}
<div class="mt-3">
<a class="btn btn-sm btn-outline-primary" data-toggle="collapse" href="#newsCollapse" role="button" aria-expanded="false" aria-controls="newsCollapse">
<span class="when-closed">
<i class="ion ion-md-arrow-dropdown"></i> {{__('home.read_more')}}
</span>
<span class="when-open">
<i class="ion ion-md-arrow-dropup"></i> {{__('home.read_less')}}
</span>
</a>
</div>
@endif
</div>
</div>
</div>
<style>
.when-open { display: none; }
.when-closed { display: inline; }
[aria-expanded="true"] .when-open { display: inline; }
[aria-expanded="true"] .when-closed { display: none; }
.gap-2 > * { margin-right: 0.5rem; margin-bottom: 0.5rem; }
.gap-2 > *:last-child { margin-right: 0; }
</style>
@endif

View file

@ -1,15 +1,31 @@
@php
$selectedMonth = request()->get('points_month', date('n'));
$selectedYear = request()->get('points_year', date('Y'));
@endphp
<div class="d-flex col-xl-12 align-items-stretch">
<div class="card w-100 mb-4">
<h5 class="card-header with-elements">
<div class="card-header-title">{{__('home.current_points_for') }} {{ HTMLHelper::getMonth(date('n')) }} {{ date('Y') }} </div>
<h5 class="card-header with-elements d-flex justify-content-between align-items-center flex-wrap">
<div class="card-header-title">{{__('home.current_points_for') }} {{ HTMLHelper::getMonth($selectedMonth) }} {{ $selectedYear }} </div>
<div class="d-flex align-items-center mt-2 mt-md-0">
<select id="points-month-filter" class="form-control custom-select form-control-sm mr-2" style="width: auto;">
@foreach(HTMLHelper::getTransMonths() as $monthNum => $monthName)
<option value="{{ $monthNum }}" {{ $selectedMonth == $monthNum ? 'selected' : '' }}>{{ $monthName }}</option>
@endforeach
</select>
<select id="points-year-filter" class="form-control custom-select form-control-sm" style="width: auto;">
@foreach(HTMLHelper::getYearRange() as $year)
<option value="{{ $year }}" {{ $selectedYear == $year ? 'selected' : '' }}>{{ $year }}</option>
@endforeach
</select>
</div>
</h5>
<div class="card-body">
@if($user->isActiveAccount())
<h6>
@php($userSalesVolume = $user->getUserSalesVolume(date('n'), date('Y'), 'first'))
@php($userSalesVolume = $user->getUserSalesVolume($selectedMonth, $selectedYear, 'first'))
@if($userSalesVolume)
<div class="mb-2">
<strong>{{ __('team.total_points') }}: {{ $userSalesVolume->getPointsKPSum() }}</strong> | {{ __('team.own') }}: {{ $userSalesVolume->month_points }} | {{ __('team.shop') }}: {{ $userSalesVolume->month_shop_points }}<br>
<strong>{{ __('team.total_points') }}: {{ formatNumber($userSalesVolume->getPointsKPSum()) }}</strong> | {{ __('team.own') }}: {{ $userSalesVolume->getFormattedMonthKPPoints() }} | {{ __('team.shop') }}: {{ $userSalesVolume->getFormattedMonthShopPoints() }}<br>
</div>
<div>
<strong>{{ __('team.total_turnover') }}: {{ formatNumber($userSalesVolume->getTotalNetSum()) }} &euro;</strong> | {{ __('team.own') }}: {{ formatNumber($userSalesVolume->month_total_net) }} &euro; | {{ __('team.shop') }}: {{ formatNumber($userSalesVolume->month_shop_total_net) }} &euro;
@ -25,12 +41,13 @@
<th>{{__('tables.net_sales')}}</th>
<th>{{__('tables.type')}}</th>
<th>{{__('tables.order')}}</th>
<th>{{__('tables.member')}}</th>
<th>{{__('tables.info') }}</th>
<th>{{__('tables.note') }}</th>
</tr>
</thead>
<tbody>
@php($userSalesVolumes = $user->getUserSalesVolume(date('n'), date('Y')))
@php($userSalesVolumes = $user->getUserSalesVolume($selectedMonth, $selectedYear, 'get', ['shopping_order.shopping_user']))
@if($userSalesVolumes)
@foreach ($userSalesVolumes as $userSalesVolume)
<tr>
@ -38,7 +55,7 @@
{{ $userSalesVolume->date }}
</td>
<td class="text-left font-weight-semibold">
{{ $userSalesVolume->points }}
{{ $userSalesVolume->getFormattedPoints() }}
</td>
<td class="text-left font-weight-semibold">
{{ formatNumber($userSalesVolume->total_net) }} &euro;
@ -56,6 +73,13 @@
@endif
@endif
</td>
<td class="text-left font-weight-semibold">
@if($userSalesVolume->shopping_order && $userSalesVolume->shopping_order->shopping_user)
<span class="no-line-break"> {{ $userSalesVolume->shopping_order->shopping_user->billing_firstname }} {{ $userSalesVolume->shopping_order->shopping_user->billing_lastname }}<br>
<small>{{ $userSalesVolume->shopping_order->shopping_user->billing_email }}</small></span>
@endif
</td>
<td class="text-left font-weight-semibold">
<span class="no-line-break"> {{ $userSalesVolume->message }}</span>
</td>
@ -93,5 +117,19 @@
"url": "/js/datatables-{{ \App::getLocale() }}.json"
}
});
// Filter für Monat/Jahr
function updatePointsFilter() {
var month = $('#points-month-filter').val();
var year = $('#points-year-filter').val();
var url = new URL(window.location.href);
url.searchParams.set('points_month', month);
url.searchParams.set('points_year', year);
window.location.href = url.toString();
}
$('#points-month-filter, #points-year-filter').on('change', function() {
updatePointsFilter();
});
});
</script>

View file

@ -0,0 +1,246 @@
@php
$selectedMonth = request()->get('stats_month', date('n'));
$selectedYear = request()->get('stats_year', date('Y'));
// Start- und Enddatum für den Monat
$startDate = \Carbon\Carbon::createFromDate($selectedYear, $selectedMonth, 1)->startOfMonth();
$endDate = \Carbon\Carbon::createFromDate($selectedYear, $selectedMonth, 1)->endOfMonth();
// UserBusiness für den Monat laden (enthält Payline-Punkte)
$userBusiness = \App\Models\UserBusiness::where('user_id', $user->id)
->where('month', $selectedMonth)
->where('year', $selectedYear)
->first();
// UserSalesVolume für KP-Punkte
$userSalesVolume = $user->getUserSalesVolume($selectedMonth, $selectedYear, 'first');
// Kunden-Umsatz Punkte (KP - Eigene Punkte + Shop)
$customerPoints = $userSalesVolume ? $userSalesVolume->getPointsKPSum() : 0;
// Team-Umsatz Punkte (Payline) - Live-Berechnung wenn UserBusiness nicht verfügbar
$teamPaylinePoints = 0;
$isLiveCalculation = false;
if ($userBusiness) {
// Gespeicherte Daten aus UserBusiness verwenden
$teamPaylinePoints = $userBusiness->payline_points ?? 0;
} else {
// Live-Berechnung über TreeCalcBot (für aktuellen Monat)
$isLiveCalculation = true;
try {
$treeCalcBot = new \App\Services\BusinessPlan\TreeCalcBot((int)$selectedMonth, (int)$selectedYear, 'member');
$treeCalcBot->initBusinesslUserDetail($user);
if ($treeCalcBot->business_user) {
$teamPaylinePoints = $treeCalcBot->business_user->payline_points ?? 0;
}
} catch (\Exception $e) {
\Log::warning("Live-Berechnung Payline-Punkte fehlgeschlagen für User {$user->id}: " . $e->getMessage());
$teamPaylinePoints = 0;
}
}
// Direkte Neupartner (Firstlines) in diesem Monat
$directNewPartners = \App\User::where('m_sponsor', $user->id)
->where('active_date', '>=', $startDate)
->where('active_date', '<=', $endDate)
->where('m_level', '!=', null)
->where('payment_account', '!=', null)
->count();
// ===== REKURSIVE TEAM-STRUKTUR =====
// Hilfsfunktion um alle Team-Mitglieder rekursiv zu sammeln (inkl. Sponsor-Kette)
$getAllTeamMemberIds = function($sponsorId, $maxDepth = 20) use (&$getAllTeamMemberIds) {
static $cache = [];
if (isset($cache[$sponsorId])) {
return $cache[$sponsorId];
}
$teamIds = [];
$currentLevel = [$sponsorId];
$depth = 0;
while (!empty($currentLevel) && $depth < $maxDepth) {
$children = \App\User::whereIn('m_sponsor', $currentLevel)
->where('m_level', '!=', null)
->where('payment_account', '!=', null)
->whereNull('deleted_at')
->pluck('id')
->toArray();
$teamIds = array_merge($teamIds, $children);
$currentLevel = $children;
$depth++;
}
$cache[$sponsorId] = $teamIds;
return $teamIds;
};
// Alle Team-Mitglieder rekursiv laden
$allTeamMemberIds = $getAllTeamMemberIds($user->id);
// Neupartner im gesamten Team (rekursiv im Marketingplan)
$teamNewPartners = 0;
if (!empty($allTeamMemberIds)) {
$teamNewPartners = \App\User::whereIn('id', $allTeamMemberIds)
->where('active_date', '>=', $startDate)
->where('active_date', '<=', $endDate)
->count();
}
// Kundenabos (is_for = 'customer' oder shop-bezogen)
$customerAbos = \App\Models\UserAbo::where('member_id', $user->id)
->where('is_for', 'customer')
->whereIn('status', [1, 2]) // aktive Abos
->where('active', true)
->count();
// Eigene Abos
$ownAbos = \App\Models\UserAbo::where('user_id', $user->id)
->where('is_for', 'me')
->whereIn('status', [1, 2])
->where('active', true)
->count();
// Team-Abos (rekursiv über gesamtes Team im Marketingplan)
$teamAbos = 0;
if (!empty($allTeamMemberIds)) {
$teamAbos = \App\Models\UserAbo::whereIn('user_id', $allTeamMemberIds)
->where('is_for', 'me')
->whereIn('status', [1, 2])
->where('active', true)
->count();
}
@endphp
@if($user->isActiveAccount())
<div class="d-flex col-xl-12 align-items-stretch">
<div class="card w-100 mb-4">
<h5 class="card-header with-elements d-flex justify-content-between align-items-center flex-wrap">
<div class="card-header-title">
<i class="ion ion-md-stats mr-2"></i>{{__('home.monthly_statistics') }} - {{ HTMLHelper::getMonth($selectedMonth) }} {{ $selectedYear }}
</div>
<div class="d-flex align-items-center mt-2 mt-md-0">
<select id="stats-month-filter" class="form-control custom-select form-control-sm mr-2" style="width: auto;">
@foreach(HTMLHelper::getTransMonths() as $monthNum => $monthName)
<option value="{{ $monthNum }}" {{ $selectedMonth == $monthNum ? 'selected' : '' }}>{{ $monthName }}</option>
@endforeach
</select>
<select id="stats-year-filter" class="form-control custom-select form-control-sm" style="width: auto;">
@foreach(HTMLHelper::getYearRange() as $year)
<option value="{{ $year }}" {{ $selectedYear == $year ? 'selected' : '' }}>{{ $year }}</option>
@endforeach
</select>
</div>
</h5>
<div class="card-body">
<div class="row">
{{-- Kunden-Umsatz Punkte --}}
<div class="col-md-6 col-lg-4 mb-4">
<div class="d-flex align-items-center">
<div class="bg-primary text-white rounded-circle d-flex align-items-center justify-content-center" style="width: 50px; height: 50px;">
<i class="ion ion-md-cart" style="font-size: 1.5rem;"></i>
</div>
<div class="ml-3">
<div class="text-muted small">{{ __('home.customer_turnover_points') }}</div>
<div class="font-weight-bold text-large">{{ number_format($customerPoints, 0, ',', '.') }}</div>
</div>
</div>
</div>
{{-- Team-Umsatz Punkte (Payline) --}}
<div class="col-md-6 col-lg-4 mb-4">
<div class="d-flex align-items-center">
<div class="bg-success text-white rounded-circle d-flex align-items-center justify-content-center" style="width: 50px; height: 50px;">
<i class="ion ion-md-people" style="font-size: 1.5rem;"></i>
</div>
<div class="ml-3">
<div class="text-muted small">
{{ __('home.team_turnover_points') }} (Payline)
@if($isLiveCalculation)
<span class="badge badge-pill badge-info ml-1" title="{{ __('home.live_calculation_hint') }}">Live</span>
@endif
</div>
<div class="font-weight-bold text-large">{{ number_format($teamPaylinePoints, 0, ',', '.') }}</div>
</div>
</div>
</div>
{{-- Direkte Neupartner --}}
<div class="col-md-6 col-lg-4 mb-4">
<div class="d-flex align-items-center">
<div class="bg-info text-white rounded-circle d-flex align-items-center justify-content-center" style="width: 50px; height: 50px;">
<i class="ion ion-md-person-add" style="font-size: 1.5rem;"></i>
</div>
<div class="ml-3">
<div class="text-muted small">{{ __('home.direct_new_partners') }}</div>
<div class="font-weight-bold text-large">{{ $directNewPartners }}</div>
</div>
</div>
</div>
{{-- Neupartner im Team --}}
<div class="col-md-6 col-lg-4 mb-4">
<div class="d-flex align-items-center">
<div class="bg-warning text-white rounded-circle d-flex align-items-center justify-content-center" style="width: 50px; height: 50px;">
<i class="ion ion-md-contacts" style="font-size: 1.5rem;"></i>
</div>
<div class="ml-3">
<div class="text-muted small">{{ __('home.team_new_partners') }}</div>
<div class="font-weight-bold text-large">{{ $teamNewPartners }}</div>
</div>
</div>
</div>
{{-- Kundenabos --}}
<div class="col-md-6 col-lg-4 mb-4">
<div class="d-flex align-items-center">
<div class="bg-secondary text-white rounded-circle d-flex align-items-center justify-content-center" style="width: 50px; height: 50px;">
<i class="ion ion-md-repeat" style="font-size: 1.5rem;"></i>
</div>
<div class="ml-3">
<div class="text-muted small">{{ __('home.customer_subscriptions') }}</div>
<div class="font-weight-bold text-large">{{ $customerAbos }} + {{ $ownAbos }} {{ __('home.own') }}</div>
</div>
</div>
</div>
{{-- Team-Abos --}}
<div class="col-md-6 col-lg-4 mb-4">
<div class="d-flex align-items-center">
<div class="bg-dark text-white rounded-circle d-flex align-items-center justify-content-center" style="width: 50px; height: 50px;">
<i class="ion ion-md-sync" style="font-size: 1.5rem;"></i>
</div>
<div class="ml-3">
<div class="text-muted small">{{ __('home.team_subscriptions') }}</div>
<div class="font-weight-bold text-large">{{ $teamAbos }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function() {
// Filter für Monat/Jahr - Statistiken
function updateStatsFilter() {
var month = $('#stats-month-filter').val();
var year = $('#stats-year-filter').val();
var url = new URL(window.location.href);
url.searchParams.set('stats_month', month);
url.searchParams.set('stats_year', year);
window.location.href = url.toString();
}
$('#stats-month-filter, #stats-year-filter').on('change', function() {
updateStatsFilter();
});
});
</script>
@endif

View file

@ -337,6 +337,9 @@
@if($shopping_order->shopping_user->shipping_address_2)
{{ $shopping_order->shopping_user->shipping_address_2 }}<br>
@endif
@if($shopping_order->shopping_user->shipping_postnumber)
<strong>DHL {{ __('payment.dhl_postnumber') }}: {{ $shopping_order->shopping_user->shipping_postnumber }}</strong><br>
@endif
{{ $shopping_order->shopping_user->shipping_zipcode }}
{{ $shopping_order->shopping_user->shipping_city }} <br>
{{ $shopping_order->shopping_user->shipping_country->getLocated() }} <br>
@ -455,6 +458,9 @@
@if($shopping_order->shopping_user->shipping_address_2)
{{ $shopping_order->shopping_user->shipping_address_2 }}<br>
@endif
@if($shopping_order->shopping_user->shipping_postnumber)
<strong>DHL {{ __('payment.dhl_postnumber') }}: {{ $shopping_order->shopping_user->shipping_postnumber }}</strong><br>
@endif
{{ $shopping_order->shopping_user->shipping_zipcode }}
{{ $shopping_order->shopping_user->shipping_city }} <br>

View file

@ -158,21 +158,58 @@
@if($txaction === 'failed')
<b>{{__('email.checkout_mail_pay_error')}}</b><br>
@elseif($txaction === 'appointed')
@if($shopping_payment->clearingtype === "vor")
<b>{{__('email.checkout_mail_pay_pre')}}</b><br>
{{__('email.checkout_mail_pay_pre_c1')}} {{ number_format( floatval($shopping_payment->amount/100), 2, ",", ".") }} {{__('email.checkout_mail_pay_pre_c2')}}<br>
<p>
@php($pay_trans = $shopping_payment->payment_transactions->where('request', 'authorization')->last())
@if(isset($pay_trans->transmitted_data) && is_array($pay_trans->transmitted_data))
<b>{{__('email.checkout_mail_bank_holder')}}</b> @if(isset($pay_trans->transmitted_data['clearing_bankaccountholder'])){{ $pay_trans->transmitted_data['clearing_bankaccountholder'] }} @endif <br>
<b>{{__('email.checkout_mail_bank_iban')}}</b> @if(isset($pay_trans->transmitted_data['clearing_bankiban'])) {{ $pay_trans->transmitted_data['clearing_bankiban'] }} @endif<br>
<b>{{__('email.checkout_mail_bank_bic')}}</b> @if(isset($pay_trans->transmitted_data['clearing_bankbic'])) {{ $pay_trans->transmitted_data['clearing_bankbic'] }} @endif<br>
<b>{{__('email.checkout_mail_bank_name')}}</b> @if(isset($pay_trans->transmitted_data['clearing_bankname'])) {{ $pay_trans->transmitted_data['clearing_bankname'] }} @endif<br>
<b>{{__('email.checkout_mail_bank_total')}}</b> @if(isset($pay_trans->shopping_payment->amount)) {{ number_format( (float) ($pay_trans->shopping_payment->amount/100), 2, ",", ".") }} EUR @endif<br>
<b>{{__('email.checkout_mail_bank_code')}}</b> @if(isset($pay_trans->transmitted_data['txid'])) {{ $pay_trans->transmitted_data['txid'] }} @endif
@if(isset($shopping_payment) && $shopping_payment && $shopping_payment->clearingtype === "vor")
@php($pay_trans = $shopping_payment->payment_transactions->where('request', 'authorization')->last())
@php($txid = $pay_trans->transmitted_data['txid'] ?? ($pay_trans->txid ?? null))
{{-- Prominenter Vorkasse-Hinweis mit Bankdaten und TXID --}}
<div style="background: #fff8e1; border: 3px solid #ffc107; padding: 20px; margin: 10px 0;">
<h3 style="color: #856404; margin: 0 0 15px 0; font-size: 18px;">{{ __('payment.prepayment_important_notice') }}</h3>
{{-- Bankdaten zuerst --}}
<h4 style="margin: 0 0 10px 0; font-size: 16px;">{{ __('payment.prepayment_bank_details') }}:</h4>
<div style="background: #fff; border-radius: 8px; padding: 15px; margin-bottom: 15px;">
@if(isset($pay_trans->transmitted_data) && is_array($pay_trans->transmitted_data))
<table style="width: 100%; border-collapse: collapse;">
<tr>
<td style="padding: 5px 10px 5px 0; width: 140px;"><strong>{{ __('payment.account_holder') }}:</strong></td>
<td style="padding: 5px 0;">@if(isset($pay_trans->transmitted_data['clearing_bankaccountholder'])){{ $pay_trans->transmitted_data['clearing_bankaccountholder'] }} @endif</td>
</tr>
<tr>
<td style="padding: 5px 10px 5px 0;"><strong>{{ __('payment.IBAN') }}:</strong></td>
<td style="padding: 5px 0; font-family: monospace; letter-spacing: 1px;">@if(isset($pay_trans->transmitted_data['clearing_bankiban'])){{ $pay_trans->transmitted_data['clearing_bankiban'] }} @endif</td>
</tr>
<tr>
<td style="padding: 5px 10px 5px 0;"><strong>{{ __('payment.BIC') }}:</strong></td>
<td style="padding: 5px 0; font-family: monospace;">@if(isset($pay_trans->transmitted_data['clearing_bankbic'])){{ $pay_trans->transmitted_data['clearing_bankbic'] }} @endif</td>
</tr>
<tr>
<td style="padding: 5px 10px 5px 0;"><strong>{{ __('payment.bank') }}:</strong></td>
<td style="padding: 5px 0;">@if(isset($pay_trans->transmitted_data['clearing_bankname'])){{ $pay_trans->transmitted_data['clearing_bankname'] }} @endif</td>
</tr>
<tr style="border-top: 1px solid #ffc107;">
<td style="padding: 10px 10px 5px 0;"><strong>{{ __('payment.total_amount') }}:</strong></td>
<td style="padding: 10px 0 5px 0; font-size: 18px; font-weight: bold; color: #d35400;">@if(isset($pay_trans->shopping_payment->amount)){{ number_format( (float) ($pay_trans->shopping_payment->amount/100), 2, ",", ".") }} EUR @endif</td>
</tr>
</table>
@endif
</div>
<hr style="border: none; border-top: 1px solid #ffc107; margin: 15px 0;">
{{-- Dann TXID Hinweis --}}
<p style="margin-bottom: 10px;">{{ __('payment.prepayment_reference_notice') }}</p>
@if($txid)
<div style="background: #fff; border: 3px dashed #ffc107; padding: 20px; text-align: center; margin: 15px 0; border-radius: 8px;">
<strong style="font-size: 16px; color: #333;">{{ __('payment.prepayment_txid') }}:</strong><br>
<span style="font-size: 28px; font-weight: bold; color: #d35400; letter-spacing: 3px; display: block; margin-top: 10px;">{{ $txid }}</span>
</div>
@endif
</p>
<p style="margin: 15px 0;"><strong>{{ __('payment.prepayment_reference_only') }}</strong></p>
<p style="margin: 0; color: #666; font-style: italic;">{{ __('payment.prepayment_waiting_payment') }}</p>
</div>
<hr />
@else
<b>{{__('email.checkout_mail_pay_approved')}}</b><br>
@ -339,6 +376,9 @@
@if($shopping_order->shopping_user->shipping_address_2)
{{ $shopping_order->shopping_user->shipping_address_2 }}<br>
@endif
@if($shopping_order->shopping_user->shipping_postnumber)
<strong>DHL {{ __('payment.dhl_postnumber') }}: {{ $shopping_order->shopping_user->shipping_postnumber }}</strong><br>
@endif
{{ $shopping_order->shopping_user->shipping_zipcode }}
{{ $shopping_order->shopping_user->shipping_city }} <br>
{{ $shopping_order->shopping_user->shipping_country->getLocated() }} <br>

View file

@ -261,6 +261,9 @@
@if($shopping_user->shipping_phone)
<br> {{ $shopping_user->shipping_phone }}<br>
@endif
@if($shopping_user->shipping_postnumber)
<strong>DHL {{ __('payment.dhl_postnumber') }}: {{ $shopping_user->shipping_postnumber }}</strong><br>
@endif
@endif
</td>
</tr>

View file

@ -0,0 +1,241 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>{{ __('email.dhl_tracking_subject') }}</title>
<style type="text/css">
img {
max-width: 600px;
outline: none;
text-decoration: none;
-ms-interpolation-mode: bicubic;
}
a {
text-decoration: none;
border: 0;
outline: none;
color: #919f7a;
}
a:hover {
color: #b6b600;
}
a img {
border: none;
}
td, h1, h2, h3 {
font-family: Helvetica, Verdana, Arial, sans-serif;
font-weight: 400;
}
td {
text-align: left;
}
body {
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
width: 100%;
height: 100%;
color: #37302d;
background: #ffffff;
font-size: 15px;
line-height: 26px
}
table {
border-collapse: separate !important;
}
.headline {
color: #37302d;
font-size: 18px;
}
.sub_headline {
color: #788662;
font-size: 15px;
}
.force-full-width {
width: 100% !important;
}
hr {
border: none;
border-top: 1px solid #b7c59e;
}
.tracking-box {
background-color: #f6fdf5;
border: 2px solid #b5c49b;
border-radius: 8px;
padding: 20px;
text-align: center;
margin: 20px 0;
}
.tracking-number {
font-size: 20px;
font-weight: bold;
color: #37302d;
letter-spacing: 2px;
margin: 10px 0;
}
</style>
<style type="text/css" media="screen">
@media screen {
td, h1, h2, h3 {
font-family: Helvetica, Verdana, Arial, sans-serif;
}
}
</style>
<style type="text/css" media="only screen and (max-width: 480px)">
@media only screen and (max-width: 480px) {
table[class="w320"] {
width: 320px !important;
}
}
</style>
</head>
<body class="body" style="padding:0; margin:0; display:block; background:#f8f8f8; -webkit-text-size-adjust:none" bgcolor="#f8f8f8">
<div style="display: none; mso-hide: all; width: 0px; height: 0px; max-width: 0px; max-height: 0px; font-size: 0px; line-height: 0px;">
{{ __('email.dhl_tracking_preview', ['number' => $trackingNumber]) }}
</div>
<table align="left" cellpadding="0" cellspacing="0" width="100%" height="100%">
<tr>
<td align="left" valign="top" bgcolor="#f8f8f8" width="100%">
<br>
<table style="margin: 0 auto;" cellpadding="0" cellspacing="0" width="700" class="w320">
<tr>
<td align="left" valign="top">
<table style="margin: 0 auto;" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td style=" text-align:center;">
<center>
<table width="100%" cellpadding="0" cellspacing="0" border="0" class="">
<tbody class="">
<tr class="">
<td align="center" valign="middle" style="font-size: 0px;" class="">
<center>
<picture style="text-align: center">
<img src="https://my.mivita.care/images/logo_mivita.png" alt="mivita.care" style="border:none" width="230">
</picture>
</center>
</td>
</tr>
<tr>
<td><br></td>
</tr>
</tbody>
</table>
</center>
</td>
</tr>
</table>
<table cellpadding="10" style="padding: 10px;" cellspacing="0" border="0" width="100%" bgcolor="#ffffff">
<tr>
<td class="headline">
<b>{{ __('email.dhl_tracking_title') }}</b>
</td>
</tr>
<tr>
<td style="color:#37302d;line-height:1.6em;">
{{ $salutation }},
<br><br>
@if($shipments->count() > 1)
{{ __('email.dhl_tracking_message_multiple', ['count' => $shipments->count()]) }}
@else
{{ __('email.dhl_tracking_message') }}
@endif
</td>
</tr>
@foreach($shipments as $index => $singleShipment)
<tr>
<td>
<table style="background-color: #f6fdf5; border: 2px solid #b5c49b; border-radius: 8px; padding: 20px; text-align: center; margin: 20px 0;" cellpadding="15" cellspacing="0" width="100%">
@if($shipments->count() > 1)
<tr>
<td style="text-align: center; color: #37302d; font-size: 16px; font-weight: bold;">
{{ __('email.dhl_tracking_package_label', ['number' => $index + 1]) }}
</td>
</tr>
@endif
<tr>
<td style="text-align: center; color: #788662; font-size: 14px;">
{{ __('email.dhl_tracking_number_label') }}
</td>
</tr>
<tr>
<td style="text-align: center; font-size: 20px; font-weight: bold; color: #37302d; letter-spacing: 2px;">
{{ $singleShipment->dhl_shipment_no }}
</td>
</tr>
<tr>
<td style="text-align: center; color: #788662; font-size: 13px;">
{{ __('email.dhl_tracking_order_ref', ['order' => $orderNumber]) }}
</td>
</tr>
<tr>
<td style="text-align: center; padding-top: 10px;">
<a href="{{ $singleShipment->getTrackingUrl() }}" style="display: inline-block; background: #FFCC00; color: #37302d; padding: 10px 20px; text-decoration: none; border-radius: 5px; font-weight: bold; font-size: 13px;">
{{ __('email.dhl_tracking_button') }}
</a>
</td>
</tr>
</table>
</td>
</tr>
@endforeach
<tr>
<td style="color:#37302d;line-height:1.6em;">
<br>
{{ __('email.dhl_tracking_info') }}
<br><br>
{{ $greetings }}<br>
{{ $sender }}
</td>
</tr>
</table>
<center>
<table cellpadding="0" cellspacing="0" class="force-full-width"
bgcolor="#f8f8f8" style="margin: 0 auto; text-align: center;line-height:1.6em;">
<tr>
<td style="color:#7B7B7E; font-size:14px; text-align: center;line-height:1.6em;" align="center">
<p>
{{__('email.footer_copy1')}}
</p>
<br>
<a href="https://www.mivita.care" style="color: #7B7B7E; text-decoration: underline;">www.mivita.care</a>
<br>
</td>
</tr>
<tr>
<td style="color:#bbbbbb; font-size:12px; text-align: center;line-height:1.6em;" align="center">
<p>{{__('email.footer_copy2')}}</p>
<a href="https://www.mivita.care/datenschutz">{{ __('dataprotect.data_protect') }}</a> <br>
<p>{{__('email.footer_copy3')}}</p>
<br>
<br>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

View file

@ -0,0 +1,252 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>mivita.care</title>
<style type="text/css">
img {
max-width: 600px;
outline: none;
text-decoration: none;
-ms-interpolation-mode: bicubic;
}
a {
text-decoration: none;
border: 0;
outline: none;
color: #919f7a;
}
a:hover {
color: #b6b600;
}
a img {
border: none;
}
td, h1, h2, h3 {
font-family: Helvetica, Verdana, Arial, sans-serif;
font-weight: 400;
}
td {
text-align: left;
}
body {
-webkit-font-smoothing: antialiased;
-webkit-text-size-adjust: none;
width: 100%;
height: 100%;
color: #37302d;
background: #ffffff;
font-size: 15px;
line-height: 26px
}
table {
border-collapse: separate !important;
}
.headline {
color: #37302d;
font-size: 18px;
}
.sub_headline {
color: #788662;
font-size: 15px;
}
.force-full-width {
width: 100% !important;
}
hr {
border: none;
border-top: 1px solid #b7c59e;
}
</style>
<style type="text/css" media="screen">
@media screen {
td, h1, h2, h3 {
font-family: Helvetica, Verdana, Arial, sans-serif;
}
}
</style>
<style type="text/css" media="only screen and (max-width: 480px)">
@media only screen and (max-width: 480px) {
table[class="w320"] {
width: 320px !important;
}
}
</style>
</head>
<body class="body" style="padding:0; margin:0; display:block; background:#f8f8f8; -webkit-text-size-adjust:none" bgcolor="#f8f8f8">
@if(isset($copy1line))
<div style="display: none; mso-hide: all; width: 0px; height: 0px; max-width: 0px; max-height: 0px; font-size: 0px; line-height: 0px;">
{{ $copy1line }}
</div>
@endif
<table align="left" cellpadding="0" cellspacing="0" width="100%" height="100%">
<tr>
<td align="left" valign="top" bgcolor="#f8f8f8" width="100%">
<br>
<table style="margin: 0 auto;" cellpadding="0" cellspacing="0" width="700" class="w320">
<tr>
<td align="left" valign="top">
<table style="margin: 0 auto;" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td style=" text-align:center;">
<center>
<table width="100%" cellpadding="0" cellspacing="0" border="0" class="">
<tbody class="">
<tr class="">
<td align="center" valign="middle" style="font-size: 0px;" class="">
<center>
<picture style="text-align: center">
<img src="https://my.mivita.care/images/logo_mivita.png" alt="mivita.care" style="border:none" width="230">
</picture>
</center>
</td>
</tr>
<tr>
<td><br></td>
</tr>
</tbody>
</table>
</center>
</td>
</tr>
</table>
<table cellpadding="10" style="padding: 10px;" cellspacing="0" border="0" width="100%" bgcolor="#ffffff">
@if(isset($title))
<tr>
<td class="headline">
<b>{{ $title }}</b>
</td>
</tr>
@endif
@if(isset($greeting))
<tr>
<td style="color:#37302d;line-height:1.6em;">
{!! $greeting !!}
</td>
</tr>
@endif
@if(isset($copy1line))
<tr>
<td style="color:#37302d;line-height:1.6em;">
{!! nl2br($copy1line) !!}
</td>
</tr>
@endif
@if(isset($payment_account_date))
<tr>
<td>
<table style="padding: 20px; border:1px solid #eee; background-color: #e8f5e9;line-height:1.6em;" cellpadding="2" cellspacing="0" width="100%">
<tr>
<td>
<strong>{{ __('email.user_restore_account_valid') }}</strong><br>
<span style="font-size: 18px; color: #2e7d32;">{{ $payment_account_date }}</span>
</td>
</tr>
</table>
</td>
</tr>
@endif
@if(isset($copy2line))
<tr>
<td style="color:#37302d;line-height:1.6em;">
{!! nl2br($copy2line) !!}
</td>
</tr>
@endif
@if(isset($reset_password_url))
<tr>
<td>
<center>
<table role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">
<tbody>
<tr>
<td style="word-wrap:break-word;background:transparent;font-size:0px;padding:10px 25px;padding-top:15px;padding-bottom:15px;padding-right:40px;padding-left:40px;" align="center" valign="top" background="data:image/gif;base64,">
<table role="presentation" cellpadding="0" cellspacing="0" align="center" border="0">
<tbody>
<tr>
<td style="border:none;border-radius:20px;color:#ffffff;cursor:auto;padding:15px 25px;" align="center" valign="middle" bgcolor="#b5c49b">
<p style="text-decoration:none;background:#b5c49b;color:#ffffff;font-family:Arial, sans-serif;font-size:13px;font-weight:normal;line-height:120%;text-transform:none;margin:0px;text-align: center">
<a href="{{ $reset_password_url }}" style="color:#ffffff;font-size:14px;font-weight:bold;text-align:center;text-decoration:none;-webkit-text-size-adjust:none;">{{ __('email.user_restore_button') }}</a>
</p>
</td>
</tr>
<tr>
<td style="color:#37302d;text-align: center">
<span style="color: #cabda9; font-weight: normal; font-size: 13px; text-decoration: underline; word-wrap: break-word;white-space: pre-line;">{{ $reset_password_url }}</span>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</center>
</td>
<tr>
@endif
@if(isset($copy3line))
<tr>
<td>
<table style="padding: 20px; border:1px solid #eee; background-color: #fff3e0;line-height:1.6em;" cellpadding="2" cellspacing="0" width="100%">
<tr>
<td>
<strong>{{ __('email.user_restore_important') }}</strong><br>
{!! nl2br($copy3line) !!}
</td>
</tr>
</table>
</td>
</tr>
@endif
</table>
<center>
<table cellpadding="0" cellspacing="0" class="force-full-width"
bgcolor="#f8f8f8" style="margin: 0 auto; text-align: center;line-height:1.6em;">
<tr>
<td style="color:#7B7B7E; font-size:14px; text-align: center;line-height:1.6em;" align="center">
<p>
{{__('email.footer_copy1')}}
</p>
<br>
<a href="https://www.mivita.care" style="color: #7B7B7E; text-decoration: underline;">www.mivita.care</a>
<br>
</td>
</tr>
<tr>
<td style="color:#bbbbbb; font-size:12px; text-align: center;line-height:1.6em;" align="center">
<p>{{__('email.footer_copy2')}}</p>
<a href="https://www.mivita.care/datenschutz">{{ __('dataprotect.data_protect') }}</a> <br>
<p>{{__('email.footer_copy3')}}</p>
<br>
<br>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

View file

@ -26,6 +26,8 @@
<hr class="container-m-nx mt-0 mb-4">
<div class="row">
@include('dashboard._news')
@include('dashboard._reminder')
@ -33,6 +35,8 @@
@include('dashboard._shop')
@include('dashboard._statistics')
@include('dashboard._points')
@include('dashboard._activities')

View file

@ -116,13 +116,25 @@
<div>{{ __('navigation.structure') }}</div>
</a>
</li>
<li class="sidenav-item{{ Request::is('user/team/abos') ? ' active' : '' }}">
<a href="{{ route('user_team_abos_show') }}" class="sidenav-link"><i
class="sidenav-icon ion ion-ios-refresh-circle"></i>
<div>{{ __('navigation.abos') }}</div>
</a>
</li>
<li class="sidenav-item{{ Request::is('user/team/level-reports') ? ' active' : '' }}">
<a href="{{ route('user_team_level_reports') }}" class="sidenav-link"><i
class="sidenav-icon ion ion-ios-stats"></i>
<div>{{ __('navigation.level_reports') }}</div>
</a>
</li>
<li class="sidenav-item{{ Request::is('user/team/marketingplan') ? ' active' : '' }}">
<a href="{{ route('user_team_marketingplan') }}" class="sidenav-link"><i
class="sidenav-icon ion ion-ios-trending-up"></i>
<div>{{ __('navigation.marketingplan') }}</div>
</a>
</li>
@if (Auth::user()->isVIP())
<li class="sidenav-item{{ Request::is('user/team/export') ? ' active' : '' }}">
<a href="{{ route('user_team_export') }}" class="sidenav-link"><i
@ -442,18 +454,25 @@
</li>
<li class="sidenav-item @if (Request::is('admin/sites/*')) open @endif">
<li class="sidenav-item @if (Request::is('admin/sites/*', 'admin/dashboard-news*')) open @endif">
<a href="javascript:void(0)" class="sidenav-link sidenav-toggle">
<i class="sidenav-icon ion ion-md-albums"></i>
<div>{{ __('navigation.contents') }}</div>
</a>
<ul class="sidenav-menu">
<li class="sidenav-item{{ Request::is('admin/dashboard-news*') ? ' active' : '' }}">
<a href="{{ route('admin_dashboard_news') }}" class="sidenav-link"><i
class="sidenav-icon ion ion-md-megaphone"></i>
<div>{{ __('navigation.dashboard_news') }}</div>
</a>
</li>
<li class="sidenav-item{{ Request::is('admin/sites/start') ? ' active' : '' }}">
<a href="{{ route('admin_sites', ['start']) }}" class="sidenav-link"><i
class="sidenav-icon ion ion-ios-document"></i>
<div>{{ __('navigation.start_site') }}</div>
</a>
</li>
</ul>
</li>

View file

@ -19,7 +19,7 @@
$( document ).ready(function() {
$.growl.error({
title: "{{__('error')}}",
message: '{{ Session::get('alert-error') }}',
message: '{!! Session::get('alert-error') !!}',
location: 'tr'
});
});
@ -31,7 +31,7 @@
$( document ).ready(function() {
$.growl({
title: "{{__('saved')}}",
message: '{{ Session::get('alert-success') }}',
message: '{!! Session::get('alert-success') !!}',
location: 'tr'
});
});

View file

@ -636,7 +636,7 @@
@foreach ($cr->user_sales_volumes as $user_sales_volume)
<tr>
<td>{{ $user_sales_volume->date }}</td>
<td>{{ $user_sales_volume->points }}</td>
<td>{{ $user_sales_volume->getFormattedPoints() }}</td>
<td>{{ $user_sales_volume->info }}</td>
</tr>
@endforeach
@ -656,7 +656,7 @@
@if (isset($cbot))
{{-- Payline Points / Provision / Wachstumsbonus
{{-- Payline Points / Provision / Tiefenbonus
<div class="card-header">
<table class="table user-view-table m-0">
<tbody>
@ -687,7 +687,7 @@
<hr>
--}}
{{-- Payline Points / Provision / Wachstumsbonus
{{-- Payline Points / Provision / Tiefenbonus
<div class="card-header">
<table class="table user-view-table m-0">
@ -737,7 +737,7 @@
</div>
--}}
{{-- Table Payline Points / Provision / Wachstumsbonus
{{-- Table Payline Points / Provision / Tiefenbonus
<div class="card-body table-responsive pt-0 pb-0">
<table class="datatables-style table table-striped ">
<thead>

View file

@ -507,7 +507,7 @@
<td>{{ $user_sales_volume->date }}</td>
<td>{{ $user_sales_volume->getStatusType() }}</td>
<td>{{ formatNumber($user_sales_volume->total_net) }} &euro;</td>
<td>{{ $user_sales_volume->points }}</td>
<td>{{ $user_sales_volume->getFormattedPoints() }}</td>
<td>{{ $user_sales_volume->getStatusPointsType() }}</td>
<td>{{ $user_sales_volume->getStatusTurnoverType() }}</td>
<td>
@ -581,7 +581,7 @@
<td>{{ $user_sales_volume->date }}</td>
<td>{{ $user_sales_volume->getStatusType() }}</td>
<td>{{ formatNumber($user_sales_volume->total_net) }} &euro;</td>
<td>{{ $user_sales_volume->points }}</td>
<td>{{ $user_sales_volume->getFormattedPoints() }}</td>
<td>{{ $user_sales_volume->getStatusPointsType() }}</td>
<td>{{ $user_sales_volume->getStatusTurnoverType() }}</td>
<td>
@ -663,7 +663,7 @@
<td>{{ $user_sales_volume->id }}</td>
<td>{{ $user_sales_volume->date }}</td>
<td>{{ $user_sales_volume->getStatusType() }}</td>
<td>{{ $user_sales_volume->points }}</td>
<td>{{ $user_sales_volume->getFormattedPoints() }}</td>
<td>{{ $user_sales_volume->getStatusPointsType() }}</td>
<td>{{ $user_sales_volume->getStatusTurnoverType() }}</td>
<td>{{ $user_sales_volume->info }}</td>
@ -718,7 +718,7 @@
</div>
}}
{{-- Payline Points / Provision / Wachstumsbonus
{{-- Payline Points / Provision / Tiefenbonus
<div class="page-break">
<div class="card-header">
<table class="table user-view-table m-0">

View file

@ -22,6 +22,22 @@
{{ cleanIntegerFromString($shopping_order_item->qty) }}
</td>
</tr>
{{-- Bundle-Items: Enthaltene Produkte im Set/Kit auflisten --}}
@if($shopping_order_item->product->bundleItems && $shopping_order_item->product->bundleItems->count() > 0)
@foreach($shopping_order_item->product->bundleItems as $bundleItem)
<tr class="item" style="background-color: #f9f9f9;">
<td class="small text-left" style="padding-left: 5mm; color: #666;">
{{ $bundleItem->number }}
</td>
<td class="small text-left" style="color: #666;">
<span style="font-size: 0.9em;"> {{ $bundleItem->pivot->quantity }}x {{ maxStrLength($bundleItem->getLang('name'), 30) }}</span>
</td>
<td class="text-right small" style="color: #999;">
-
</td>
</tr>
@endforeach
@endif
@endforeach
</tbody>
</table>

View file

@ -300,6 +300,9 @@
@if($shopping_order->shopping_user->shipping_address_2)
{{ $shopping_order->shopping_user->shipping_address_2 }}<br>
@endif
@if($shopping_order->shopping_user->shipping_postnumber)
<strong>{{ __('payment.dhl_postnumber') }}: {{ $shopping_order->shopping_user->shipping_postnumber }}</strong><br>
@endif
{{ $shopping_order->shopping_user->shipping_zipcode }} {{ $shopping_order->shopping_user->shipping_city }}<br>
@if($shopping_order->shopping_user->shipping_country)
{{ $shopping_order->shopping_user->shipping_country->getLocated() }}
@ -314,7 +317,7 @@
<td class="text-right">{{ $invoice_date }}</td>
</tr>
<tr>
<td class="text-left">{{ __('pdf.delivery_note_no.') }}:</td>
<td class="text-left">{{ __('pdf.invoice_nr') }}:</td>
<td class="text-right">{{ $invoice_number }}</td>
</tr>
<tr>

View file

@ -75,7 +75,7 @@
<b>{{ __('order.sums') }}</b>
</td>
<td class="text-right">
<strong>{{ $shopping_order->shopping_collect_order->points }} <strong>
<strong>{{ $shopping_order->shopping_collect_order->getFormattedPoints() }} <strong>
</td>
<td class="text-right">
</td>

View file

@ -54,8 +54,8 @@
<td class="text-right small">
{{ cleanIntegerFromString($shopping_order_item->qty) }}
</td>
<td class="text-right small">
{{ $shopping_order_item->points }}
<td class="text-right small">
{{ $shopping_order_item->getFormattedPoints() }}
</td>
<td class="text-right small">
@if($shopping_order_item->price > 0)
@ -70,6 +70,31 @@
@endif
</tr>
{{-- Bundle-Items: Enthaltene Produkte im Set/Kit auflisten --}}
@if($shopping_order_item->product->bundleItems && $shopping_order_item->product->bundleItems->count() > 0)
@foreach($shopping_order_item->product->bundleItems as $bundleItem)
<tr class="item" style="background-color: #f9f9f9;">
<td class="small text-left" style="padding-left: 5mm; color: #666;">
{{ $bundleItem->number }}
</td>
<td class="small text-left" style="color: #666;">
<span style="font-size: 0.9em;">{{ $bundleItem->pivot->quantity }}x {{ maxStrLength($bundleItem->getLang('name'), 30) }}</span>
</td>
@if($shopping_order->payment_for === 6)
<td class="text-right small" style="color: #999;">-</td>
<td class="text-right small" style="color: #999;">-</td>
<td class="text-right small" style="color: #999;">-</td>
<td class="text-right small" style="color: #999;">-</td>
@else
<td class="text-right small" style="color: #999;">-</td>
<td class="text-right small" style="color: #999;">-</td>
<td class="text-right small" style="color: #999;">-</td>
<td class="text-right small" style="color: #999;">-</td>
<td class="text-right small" style="color: #999;">-</td>
@endif
</tr>
@endforeach
@endif
@endforeach
</tbody>
<tfoot>

View file

@ -72,7 +72,7 @@
<td colspan="4">
<b>Bestellnummer: {{ $order['order_id'] }}</b> |
WP Number: {{ $order['wp_order_number'] }} |
Points: {{ $order['shopping_order']->points }}
Points: {{ $order['shopping_order']->getFormattedPoints() }}
</td>
</tr>
<tr class="bg-grey">

View file

@ -340,15 +340,15 @@
@if(isset($user_sales_volume))
<tr>
<td class="text-left">{{ __('pdf.points_order') }}:</td>
<td class="text-right">{{ $user_sales_volume->points }}</td>
<td class="text-right">{{ $user_sales_volume->getFormattedPoints() }}</td>
</tr>
<tr>
<td class="text-left">{{ __('pdf.points') }} {{ $user_sales_volume->getFormatedMonthYear() }}:</td>
<td class="text-right">{{ $user_sales_volume->month_points }}</td>
<td class="text-right">{{ $user_sales_volume->getFormattedMonthKPPoints() }}</td>
</tr>
<tr>
<td class="text-left">{{ __('pdf.points_shop') }} {{ $user_sales_volume->getFormatedMonthYear() }}:</td>
<td class="text-right">{{ $user_sales_volume->month_shop_points }}</td>
<td class="text-right">{{ $user_sales_volume->getFormattedMonthShopPoints() }}</td>
</tr>
@endif
<tr>

View file

@ -6,7 +6,7 @@
@include('portal.abo.componenten.vat-info')
<div class="alert alert-warning">
<strong>{!! __('abo.abo_type_info', ['base'=>get_abo_type_badge('base'), 'upgrade'=>get_abo_type_badge('upgrade')]) !!}</strong>
<strong>{!! __('abo.abo_type_info', ['base'=>get_abo_type_badge('base'), 'upgrade'=>get_abo_type_badge('upgrade'), 'abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}</strong>
</div>
@if(isset($error))

View file

@ -172,7 +172,11 @@
</select>
</div>
<div class="alert alert-info">
<i class="fa fa-info-circle"></i> {!! __('abo.abo_order_info') !!}
<i class="fa fa-info-circle"></i> {!! __('abo.abo_order_info_check') !!}
<hr>
<i class="fa fa-info-circle"></i> {!! __('abo.abo_order_info_check_2') !!}
<hr>
<i class="fa fa-info-circle"></i> {!! __('abo.abo_order_info_check_3', ['abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}
</div>
</div>
</div>

View file

@ -3,13 +3,17 @@
<h4>{{ __('abo.abo_delivery') }}</h4>
<p>
{{ __('abo.abo_order_info') }}
{{ __('abo.abo_order_info_check') }}
<hr>
{{ __('abo.abo_order_info_check_2') }}
<hr>
{{ __('abo.abo_order_info_check_3', ['abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) }}
</p>
<hr class="container-m-nx mt-0 mb-4">
<h5>{{ __('abo.pros_hl') }}</h5>
<ul>
{!! __('abo.pros_list') !!}
{!! __('abo.pros_list', ['abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}
</ul>
@if(isset($no_shopping_user) && $no_shopping_user)

View file

@ -6,7 +6,7 @@
@include('portal.abo.componenten.vat-info')
<div class="alert alert-warning">
<strong>{!! __('abo.abo_type_info', ['base'=>get_abo_type_badge('base'), 'upgrade'=>get_abo_type_badge('upgrade')]) !!}</strong>
<strong>{!! __('abo.abo_type_info', ['base'=>get_abo_type_badge('base'), 'upgrade'=>get_abo_type_badge('upgrade'), 'abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}</strong>
</div>
@if(isset($error))

View file

@ -219,6 +219,30 @@
{{ Form::text('shipping_phone', $shopping_user->shipping_phone, array('placeholder'=>__('Phone'), 'class'=>'form-control', 'id'=>'shipping_phone', 'tabindex' => 26)) }}
</div>
</div>
<div class="form-row">
<div class="form-group col-md-12">
<label class="form-label" for="shipping_postnumber">{{ __('payment.dhl_postnumber') }} <small class="text-muted">({{ __('optional') }})</small></label>
{{ Form::text('shipping_postnumber', $shopping_user->shipping_postnumber, array('placeholder'=>'12345678', 'class'=>'form-control', 'id'=>'shipping_postnumber', 'maxlength'=>'20', 'tabindex' => 27)) }}
<small class="form-text text-muted">{{ __('payment.packstation_info') }}</small>
</div>
</div>
{{-- Alert-Box für Packstation-Hinweis --}}
<div class="alert alert-warning alert-dismissible fade show" id="packstation-alert" style="display: @if($shopping_user->shipping_postnumber) block @else none @endif;">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h6 class="alert-heading"><i class="fa fa-exclamation-triangle"></i> <strong>{{ __('payment.packstation_alert_title') }}</strong></h6>
<hr>
<p class="mb-2"><strong>{{ __('payment.packstation_alert_intro') }}</strong></p>
<ul class="mb-2 pl-3">
<li><strong>{{ __('Street') }} / {{ __('House number') }}:</strong> {{ __('payment.packstation_alert_street') }} <em>({{ __('payment.packstation_alert_street_example') }})</em></li>
<li><strong>{{ __('Postcode') }} / {{ __('City') }}:</strong> {{ __('payment.packstation_alert_location') }} <em>({{ __('payment.packstation_alert_not_home') }})</em></li>
</ul>
<p class="mb-0 small text-muted">
<i class="fa fa-info-circle"></i> {{ __('payment.packstation_alert_footer') }}
</p>
</div>
</div>
<div class="form-group">
<label class="custom-control custom-checkbox m-0">
@ -246,6 +270,24 @@
});
});
// Packstation Alert show|hide
function togglePackstationAlert() {
var postnumber = $('#shipping_postnumber').val();
if (postnumber && postnumber.trim() !== '') {
$('#packstation-alert').slideDown(300);
} else {
$('#packstation-alert').slideUp(300);
}
}
// Bei Eingabe im Postnummer-Feld
$('#shipping_postnumber').on('input', function() {
togglePackstationAlert();
});
// Bei Seitenladen prüfen
togglePackstationAlert();
$.extend( $.validator.messages, {
required: "{{__('account.validator_required')}}",
maxlength: $.validator.format( "{{__('account.validator_maxlength')}}" ),

View file

@ -189,6 +189,13 @@
<div class="text-muted small">{{ __('Phone') }}</div>
{{ $shopping_order->shopping_user->shipping_phone }}
</div>
@if($shopping_order->shopping_user->shipping_postnumber)
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.dhl_postnumber') }}</div>
<span class="badge badge-info">{{ $shopping_order->shopping_user->shipping_postnumber }}</span>
<small class="d-block text-muted">{{ __('payment.packstation_delivery') }}</small>
</div>
@endif
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('Country') }}</div>
{{ $shopping_order->shopping_user->shipping_country->getLocated() }}

View file

@ -25,25 +25,32 @@
<div class="card">
@include('admin.abo._detail')
</div>
<div class="card mt-3">
@include('admin.abo._detail_abo_info')
</div>
<div class="card mt-3">
@include('admin.customer._customer_detail', ['shopping_user' => $customer_detail])
</div>
{!! Form::open(['action' => route('user_abos_update', [$view, $user_abo->id]), 'class' => 'form-horizontal', 'id'=>'cart-order-form']) !!}
<input type="hidden" name="is_for" value="{{ $user_abo->is_for }}">
<div class="card mt-3">
@include('admin.abo._order_abo')
</div>
@if($comp_products && Yard::instance('shopping')->getNumComp() > 0)
<div id="holder_html_view_comp_product">
@include('user.order.comp_product')
@if(App\Services\AboHelper::canCancelAbo($user_abo, $view))
{!! Form::open(['action' => route('user_abos_update', [$view, $user_abo->id]), 'class' => 'form-horizontal', 'id'=>'cart-order-form']) !!}
<input type="hidden" name="is_for" value="{{ $user_abo->is_for }}">
<div class="card mt-3">
@include('admin.abo._order_abo')
</div>
@endif
{{ Form::close() }}
@if($comp_products && Yard::instance('shopping')->getNumComp() > 0)
<div id="holder_html_view_comp_product">
@include('user.order.comp_product')
</div>
@endif
{{ Form::close() }}
@else
<div class="card mt-3">
@include('admin.abo._order_abo', ['only_show_products' => true])
</div>
@endif
<div class="card mt-3 mb-3">
@include('admin.abo._executions')
</div>

View file

@ -30,6 +30,10 @@
@endif
@if($homeparty_user->billing_phone)
Telefon: {{ $homeparty_user->billing_phone }}
<br>
@endif
@if($homeparty_user->shipping_postnumber)
<strong>DHL {{ __('payment.dhl_postnumber') }}: {{ $homeparty_user->shipping_postnumber }}</strong>
@endif
</p>
@else
@ -62,6 +66,10 @@
@endif
@if($homeparty_user->shipping_phone)
Telefon: {{ $homeparty_user->shipping_phone }}
<br>
@endif
@if($homeparty_user->shipping_postnumber)
<strong>DHL {{ __('payment.dhl_postnumber') }}: {{ $homeparty_user->shipping_postnumber }}</strong>
@endif
</p>
@endif

View file

@ -49,7 +49,7 @@
@endif
@if($is_abo)
<hr>
<div class="alert alert-warning"><strong>{!! __('abo.abo_type_info', ['base'=>get_abo_type_badge('base'), 'upgrade'=>get_abo_type_badge('upgrade')]) !!}</strong></div>
<div class="alert alert-warning"><strong>{!! __('abo.abo_type_info', ['base'=>get_abo_type_badge('base'), 'upgrade'=>get_abo_type_badge('upgrade'), 'abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}</strong></div>
<p><strong><em></em></strong></p>
@endif
</div>

View file

@ -81,15 +81,15 @@
</label>
</div>
<div class="mt-3">
<h6 class="card-header bg-light px-2 py-2">
<h6 class="card-header bg-light text-primary px-2 py-2">
<a href="#" class="" data-toggle="collapse" data-target="#collapseFilter" aria-expanded="false" aria-controls="collapseFilter">
<i class="fa fa-caret-expand"></i> {{ __('abo.pros_hl') }}
</a>
</h6>
<div class="collapse" id="collapseFilter">
<div class="form-row pb-1 pt-1">
<ul class="">
{!! __('abo.pros_list') !!}
<ul class="list-padding-top">
{!! __('abo.pros_list', ['abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}
</ul>
</div>
</div>

View file

@ -134,6 +134,13 @@
<div class="text-muted small">{{ __('Phone') }}</div>
{{ $shopping_user->shipping_phone }}
</div>
@if($shopping_user->shipping_postnumber)
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.dhl_postnumber') }}</div>
<span class="badge badge-info">{{ $shopping_user->shipping_postnumber }}</span>
<small class="d-block text-muted">{{ __('payment.packstation_delivery') }}</small>
</div>
@endif
</div>
@endif
</div>

View file

@ -12,6 +12,7 @@
{{ Form::hidden('shipping_zipcode', $user->account->zipcode) }}
{{ Form::hidden('shipping_city', $user->account->city) }}
{{ Form::hidden('shipping_phone', $user->account->phone) }}
{{ Form::hidden('shipping_postnumber', $user->account->shipping_postnumber) }}
{{ Form::hidden('shipping_state', Yard::instance('shopping')->getShippingCountryId()) }}
@ -40,6 +41,7 @@
{{ Form::hidden('shipping_zipcode', $user->account->shipping_zipcode) }}
{{ Form::hidden('shipping_city', $user->account->shipping_city) }}
{{ Form::hidden('shipping_phone', $user->account->shipping_phone) }}
{{ Form::hidden('shipping_postnumber', $user->account->shipping_postnumber) }}
{{ Form::hidden('shipping_state', Yard::instance('shopping')->getShippingCountryId()) }}

View file

@ -27,6 +27,7 @@
{{ Form::hidden('shipping_city', $shopping_user->billing_city) }}
{{ Form::hidden('shipping_phone', $shopping_user->billing_phone) }}
{{ Form::hidden('shipping_state', Yard::instance('shopping')->getShippingCountryId()) }}
{{ Form::hidden('shipping_postnumber', $shopping_user->shipping_postnumber) }}
@ -57,6 +58,7 @@
{{ Form::hidden('shipping_city', $shopping_user->shipping_city) }}
{{ Form::hidden('shipping_phone', $shopping_user->shipping_phone) }}
{{ Form::hidden('shipping_state', Yard::instance('shopping')->getShippingCountryId()) }}
{{ Form::hidden('shipping_postnumber', $shopping_user->shipping_postnumber) }}
{{-- <div class="">
<div class="form-row">
<div class="form-group col-md-12 {{ $errors->has('shipping_state') ? 'has-error' : '' }}">

View file

@ -129,6 +129,7 @@
<div class="text-body">
<div>{{ __('order.content') }}: {{ $product->contents }}</div>
<div>{{ __('order.art_no') }}: {{ $product->number }}</div>
<div>{{ __('order.points') }}: @if($row->options->comp) 0 @else {{ $product->getFormattedPoints() }} @endif</div>
</div>
</div>
<div class="options">
@ -179,7 +180,7 @@
<div class="d-flex flex-wrap justify-content-between pb-4">
<div class="mt-2">
<p class="small mb-2"> {!! __('order.you_has_article_in_shopping_cart', ['num'=> Yard::instance('shopping')->compCount() ]) !!}</p>
<p>{{ __('order.points_total') }}: {{ Yard::instance('shopping')->points() }}</p>
<p>{{ __('order.points_total') }}: {{ formatNumber(Yard::instance('shopping')->points()) }}</p>
<button type="button" class="btn btn-default btn-sm" id="clear-products-basket"><i class="ion ion-ios-trash"></i> {{ __('order.shopping_cart_delete') }}</button>
</div>
<div class="d-flex">
@ -258,27 +259,49 @@
@if(isset($is_abo) && $is_abo)
<div class="text-right">
<div class="alert alert-info">
<h4>{{ __('abo.abo_settings') }}</h4>
<div class="form-row">
<div class="col-6 col-sm-8 col-md-9 col-lg-9 mb-1">
</div>
<div class="col-6 col-sm-4 col-md-3 col-lg-3 mb-1 text-right">
<div class="col-12 col-sm-4 col-md-3 col-lg-3 mb-1 text-right">
<label class="form-label">{{ __('abo.delivery_day') }}*</label>
<select class="custom-select" name="abo_interval">
{!! HTMLHelper::getAboDeliveryOptions() !!}
</select>
</div>
<div class="col-12 col-sm-4 col-md-6 mb-1">
<div class="col-12 col-sm-12 col-md-4 col-lg-6 mb-1">
</div>
<div class="col-12 col-sm-8 col-md-6 mb-1">
<div class="col-12 col-sm-12 col-md-8 col-lg-6 mb-1">
<div class="text-right">
<em class="small"> <i> {!! __('abo.abo_order_info') !!}</em>
</div>
<em class="small"> <i> {!! __('abo.abo_order_info_check') !!}</em>
<hr style="margin-top: 10px; margin-bottom: 10px; border-color: #b4b4b4; border-width: 1px;">
<em class="font-weight-bold"> <i> {!! __('abo.abo_order_info_check_2') !!}</em>
<hr style="margin-top: 10px; margin-bottom: 10px; border-color: #b4b4b4; border-width: 1px;">
<em class="small"> <i> {!! __('abo.abo_order_info_check_3', ['abo-min-duration' => \App\Models\Setting::getContentBySlug('abo-min-duration')]) !!}</em>
<hr style="margin-top: 10px; margin-bottom: 10px; border-color: #b4b4b4; border-width: 1px;">
<label class="switcher switcher-success">
<input type="checkbox" class="switcher-input" name="abo_order_info_checkbox" value="true" required>
<span class="switcher-indicator">
<span class="switcher-yes">
<span class="ion ion-md-checkmark"></span>
</span>
<span class="switcher-no">
<span class="ion ion-md-close"></span>
</span>
</span>
<span class="switcher-label"><strong>{{ __('abo.abo_order_info_checkbox') }}</strong></span>
</label>
</div>
</div>
</div>
</div>
<hr>
</div>

View file

@ -77,7 +77,7 @@
</div>
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('order.points_total') }}</div>
{{ $order->shopping_order->points }}
{{ $order->shopping_order->getFormattedPoints() }}
</div>
<div class="col-md-12 mb-3">
<div class="text-muted small">{{ __('order.invoice_address') }} </div>

View file

@ -1,7 +1,7 @@
<h6>
@if($userSalesVolume)
<div class="mb-2">
<strong>{{ __('team.total_points') }}: {{ $userSalesVolume->getPointsKPSum() }}</strong> | {{ __('team.own') }}: {{ $userSalesVolume->month_points }} | {{ __('team.shop') }}: {{ $userSalesVolume->month_shop_points }}<br>
<strong>{{ __('team.total_points') }}: {{ formatNumber($userSalesVolume->getPointsKPSum()) }}</strong> | {{ __('team.own') }}: {{ formatNumber($userSalesVolume->month_KP_points) }} | {{ __('team.shop') }}: {{ $userSalesVolume->getFormattedMonthShopPoints() }}<br>
</div>
<div>
<strong>{{ __('team.total_turnover') }}: {{ formatNumber($userSalesVolume->getTotalNetSum()) }} &euro;</strong> | {{ __('team.own') }}: {{ formatNumber($userSalesVolume->month_total_net) }} &euro; | {{ __('team.shop') }}: {{ formatNumber($userSalesVolume->month_shop_total_net) }} &euro;

Some files were not shown because too many files have changed in this diff Show more