Mitgliedschaft: Erinnerungen und eigenes Verlaengerungs-Produkt

Die Erinnerungsmails vor Ablauf der Mitgliedschaft beschrieben noch den
abgeschafften SEPA-Einzug und verlinkten auf die Hauptdomain, wo
/user/membership nicht existiert. Das Produkt fuer die Verlaengerung war
zudem dasselbe wie bei der Registrierung und sprach deshalb vom
Neuabschluss.

- Erinnerungen: nur noch Stufen 31/33/34/35, SEPA-Stufen 32/36/37 samt
  :price und :pay_date entfallen; Button verlinkt auf my.mivita.care;
  fehlt ein Text zum Status, wird die Mail geloggt statt roh versendet.
- Alle Erinnerungstexte (de/en/es/fr) erklaeren jetzt, dass ohne Zahlung
  der Account pausiert und offene Provisionen ausgezahlt werden.
- Eigenes Produkt fuer die Verlaengerung (identifier show_renewal) als
  Kopie des Mitgliedschafts-Produkts inkl. Preisen, Kategorien und
  Uebersetzungen fuer en/es/fr; die Mitgliedschaftsseite faellt ohne
  dieses Produkt auf das bisherige zurueck.
- Mitgliedschaftsseite auf ein Paket reduziert: Upgrade-, Wechsel- und
  Abo-Optionen entfernt, Texte auf die manuelle Verlaengerung umgestellt.
- Alte Cron-Weboberflaeche entfernt, der Versand laeuft ueber den
  Scheduler (payments:check-accounts).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kevin 2026-08-26 08:24:32 +00:00
parent 0bdb6eabc6
commit 30fb031d12
30 changed files with 810 additions and 1223 deletions

View file

@ -2,16 +2,16 @@
namespace App\Console\Commands;
use Carbon\Carbon;
use App\User;
use App\Services\Util;
use App\Mail\MailCustomMessage;
use App\Models\UserHistory;
use App\Models\UserMessage;
use App\Mail\MailCustomMessage;
use App\Services\Util;
use App\User;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Lang;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
class CheckPaymentsAccount extends Command
{
@ -38,71 +38,74 @@ class CheckPaymentsAccount extends Command
$this->info('COMMAND [payments:check-accounts] started.');
// Die Logik wurde 1:1 aus der checkPaymentsAccounts-Methode übernommen
$renewalDate = Carbon::now()->modify('+' . (config('mivita.remind_first_days') + 1) . ' days');
Log::channel('cron')->info('Erneuerungsdatum für Zahlungen: ' . $renewalDate->format('Y-m-d H:i:s'));
$renewalDate = Carbon::now()->modify('+'.(config('mivita.remind_first_days') + 1).' days');
Log::channel('cron')->info('Erneuerungsdatum für Zahlungen: '.$renewalDate->format('Y-m-d H:i:s'));
$users = User::where('payment_account', '!=', NULL)
$users = User::where('payment_account', '!=', null)
->where('active', '=', 1)
->where('blocked', '!=', 1)
->where('payment_account', '<', $renewalDate)
->get();
Log::channel('cron')->info('Found ' . $users->count() . ' users for payment reminders.');
$this->info('Found ' . $users->count() . ' users for payment reminders.');
Log::channel('cron')->info('Found '.$users->count().' users for payment reminders.');
$this->info('Found '.$users->count().' users for payment reminders.');
foreach ($users as $user) {
Log::channel('cron')->info('Prüfe Zahlungserinnerungen für Benutzer: ' . $user->email);
Log::channel('cron')->info('Prüfe Zahlungserinnerungen für Benutzer: '.$user->email);
$this->checkReminderPayments($user);
}
Log::channel('cron')->info('COMMAND [payments:check-accounts] finished.');
$this->info('COMMAND [payments:check-accounts] finished.');
return 0; // Success
}
/**
* Überprüft und sendet Zahlungserinnerungen basierend auf Benutzerkontostand
*
* RULES:
* > 21 remind_first_days = 31 reminder_first
* > 21 remind_first_days + sepa = 32 reminder_first_sepa
* > 14 remind_sec_days = 33 reminder_sec
* > 2 remind_last_days = 34 reminder_last
* > 0 deaktiv = 35 reminder_deaktiv
* > 0 deaktiv + sepa = 36 reminder_deaktiv_sepa
* == 7 abo_booking_days + sepa + cron = 37 reminder_collect_sepa
*
* @param User $user Benutzer
* RULES:
* > 14 remind_sec_days = 31 reminder_first
* <= 14 remind_sec_days = 33 reminder_sec
* <= 2 remind_last_days = 34 reminder_last
* Mitgliedschaft abgelaufen = 35 reminder_deaktiv
*
* Die SEPA-Stati 32/36/37 sind entfallen, den Lastschrifteinzug gibt es nicht mehr.
*
* @param User $user Benutzer
* @return void
*/
private function checkReminderPayments(User $user)
{
//35 reminder_deaktiv, 36 reminder_deaktiv_sepa
if (!$user->isActiveAccount()) {
Log::channel('cron')->info('Inaktives Konto für Benutzer: ' . $user->email);
// 35 reminder_deaktiv, 36 reminder_deaktiv_sepa
if (! $user->isActiveAccount()) {
Log::channel('cron')->info('Inaktives Konto für Benutzer: '.$user->email);
$this->checkIsReminderSend($user, 35);
return;
}
//34 reminder_last
// 34 reminder_last
if ($user->daysActiveAccount() <= config('mivita.remind_last_days')) {
Log::channel('cron')->info('Letzte Erinnerung für Benutzer: ' . $user->email . ' (Tage aktiv: ' . $user->daysActiveAccount() . ')');
Log::channel('cron')->info('Letzte Erinnerung für Benutzer: '.$user->email.' (Tage aktiv: '.$user->daysActiveAccount().')');
$this->checkIsReminderSend($user, 34);
return;
}
//33 reminder_sec
// 33 reminder_sec
if ($user->daysActiveAccount() <= config('mivita.remind_sec_days')) {
Log::channel('cron')->info('Zweite Erinnerung für Benutzer: ' . $user->email . ' (Tage aktiv: ' . $user->daysActiveAccount() . ')');
Log::channel('cron')->info('Zweite Erinnerung für Benutzer: '.$user->email.' (Tage aktiv: '.$user->daysActiveAccount().')');
$this->checkIsReminderSend($user, 33);
return;
}
//31 reminder_first
// 31 reminder_first
if ($user->daysActiveAccount() > config('mivita.remind_sec_days')) {
Log::channel('cron')->info('Erste Erinnerung für Benutzer: ' . $user->email . ' (Tage aktiv: ' . $user->daysActiveAccount() . ')');
Log::channel('cron')->info('Erste Erinnerung für Benutzer: '.$user->email.' (Tage aktiv: '.$user->daysActiveAccount().')');
$this->checkIsReminderSend($user, 31);
return;
}
}
@ -110,8 +113,8 @@ class CheckPaymentsAccount extends Command
/**
* Überprüft, ob eine Erinnerung bereits gesendet wurde
*
* @param User $user Benutzer
* @param int $status Status-Code der Erinnerung
* @param User $user Benutzer
* @param int $status Status-Code der Erinnerung
* @return bool
*/
private function checkIsReminderSend(User $user, $status)
@ -124,11 +127,12 @@ class CheckPaymentsAccount extends Command
->first();
if ($isSend) {
Log::channel('cron')->info('Erinnerung bereits gesendet für Benutzer: ' . $user->email . ' (Status: ' . $status . ')');
Log::channel('cron')->info('Erinnerung bereits gesendet für Benutzer: '.$user->email.' (Status: '.$status.')');
return true;
}
Log::channel('cron')->info('Sende neue Erinnerung für Benutzer: ' . $user->email . ' (Status: ' . $status . ')');
Log::channel('cron')->info('Sende neue Erinnerung für Benutzer: '.$user->email.' (Status: '.$status.')');
$referenz = $this->sendReminderMail($user, $status);
UserHistory::create([
@ -136,7 +140,7 @@ class CheckPaymentsAccount extends Command
'action' => 'reminder_payments',
'referenz' => $referenz,
'identifier' => $user->payment_account,
'status' => $status
'status' => $status,
]);
return false;
@ -145,61 +149,62 @@ class CheckPaymentsAccount extends Command
/**
* Sendet eine Erinnerungs-E-Mail an den Benutzer
*
* @param User $user Benutzer
* @param int $status Status-Code der Erinnerung
* @param User $user Benutzer
* @param int $status Status-Code der Erinnerung
* @return int
*/
private function sendReminderMail(User $user, $status)
{
$days = abs($user->daysActiveAccount());
$pay_date = Carbon::parse($user->payment_account)->modify('- ' . config('mivita.abo_booking_days') . ' days')->format('d.m.Y');
$datetime = $user->getPaymentAccountDateFormat();
$price = "";
if (! Lang::has('reminder.copy_first_'.$status)) {
Log::channel('cron')->error('Kein Erinnerungstext für Status '.$status.' vorhanden, Mail an '.$user->email.' wird übersprungen.');
if ($user->payment_order_id && isset($user->payment_order_product->price)) {
$price = 'von ' . $user->payment_order_product->getFormattedPrice() . ' EUR';
return 0;
}
$message = __('reminder.copy_first_' . $status, ['days' => $days, 'datetime' => $datetime, 'price' => $price, 'pay_date' => $pay_date]);
$message_last = __('reminder.copy_last_' . $status, ['days' => $days, 'datetime' => $datetime, 'price' => $price, 'pay_date' => $pay_date]);
$button = __('reminder.button_' . $status);
$days = abs($user->daysActiveAccount());
$datetime = $user->getPaymentAccountDateFormat();
$message = preg_replace("/[\n\r]/", "", $message);
$message_last = preg_replace("/[\n\r]/", "", $message_last);
$message = __('reminder.copy_first_'.$status, ['days' => $days, 'datetime' => $datetime]);
$message_last = __('reminder.copy_last_'.$status, ['days' => $days, 'datetime' => $datetime]);
$button = __('reminder.button_'.$status);
$message = preg_replace("/[\n\r]/", '', $message);
$message_last = preg_replace("/[\n\r]/", '', $message_last);
$data = [
'subject' => __('reminder.subject') . " | ID: " . $status,
'subject' => __('reminder.subject').' | ID: '.$status,
'message' => $message,
'message_last' => $message_last,
'url' => config('app.url') . '/user/membership',
'url' => rtrim(Util::getMyMivitaUrl(), '/').'/user/membership',
'button' => $button,
];
$sender = User::find(1);
$customer_mail = UserMessage::create(['user_id' => $user->id, 'send_user_id' => $sender->id, 'email' => $user->email, 'subject' => $data['subject'], 'message' => $data['message'] . " " . $data['message_last']]);
$customer_mail = UserMessage::create(['user_id' => $user->id, 'send_user_id' => $sender->id, 'email' => $user->email, 'subject' => $data['subject'], 'message' => $data['message'].' '.$data['message_last']]);
try {
if (!Util::isTestSystem()) {
if (! Util::isTestSystem()) {
if ($status >= 34) {
Log::channel('cron')->info('Sende kritische Erinnerung mit BCC an: ' . $user->email);
Log::channel('cron')->info('Sende kritische Erinnerung mit BCC an: '.$user->email);
Mail::to($user->email)
->locale($user->getLocale())
->bcc(config('app.default_mail'))
->send(new MailCustomMessage($user, $data, $sender, false));
} else {
Log::channel('cron')->info('Sende normale Erinnerung an: ' . $user->email);
Log::channel('cron')->info('Sende normale Erinnerung an: '.$user->email);
Mail::to($user->email)
->locale($user->getLocale())
->send(new MailCustomMessage($user, $data, $sender, false));
}
} else {
Log::channel('cron')->info('Testsystem: E-Mail-Versand simuliert für: ' . $user->email);
Log::channel('cron')->info('Testsystem: E-Mail-Versand simuliert für: '.$user->email);
}
} catch (\Exception $e) {
Log::channel('cron')->error('Mail-Fehler für Benutzer ' . $user->email . ': ' . $e->getMessage());
Log::channel('cron')->error('Mail-Fehler für Benutzer '.$user->email.': '.$e->getMessage());
$customer_mail->fail = true;
$customer_mail->error = $e->getMessage();
$customer_mail->save();
return 0;
}
@ -207,7 +212,8 @@ class CheckPaymentsAccount extends Command
$customer_mail->sent_at = now();
$customer_mail->save();
Log::channel('cron')->info('Erinnerungsmail erfolgreich gesendet an: ' . $user->email);
Log::channel('cron')->info('Erinnerungsmail erfolgreich gesendet an: '.$user->email);
return 1;
}
}

View file

@ -1,420 +0,0 @@
<?php
namespace App\Http\Controllers;
use Carbon;
use App\User;
use App\Services\Util;
use App\Models\UserHistory;
use App\Models\UserMessage;
use App\Mail\MailCustomMessage;
use App\Mail\MailVerifyAccount;
use App\Services\PaymentHelper;
use App\Repositories\UserRepository;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Log;
class CronController extends Controller
{
protected $userRepo;
// Konstanten für bessere Lesbarkeit
private const CRON_KEY = 'CqZHL79FwUCcy9pjvi';
private const RUN_CRON_KEY = 'G8ZvEbnP8fEPfnWX4L';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct(UserRepository $userRepo)
{
$this->userRepo = $userRepo;
Log::channel('cron')->info('CronController initialisiert');
}
/**
* Hauptindex-Methode für Cron-Jobs
*
* @return string
*/
public function index()
{
Log::channel('cron')->info('Cron-Index aufgerufen');
//$this->checkConfirmation();
//TODO
//SEPA Booking
//Mail reminder
return "Cron-Index ausgeführt";
}
/**
* Führt eine bestimmte Cron-Aktion aus
*
* @param string|bool $action Die auszuführende Aktion
* @param string|bool $key Sicherheitsschlüssel
* @return mixed
*/
public function action($action = false, $key = false)
{
Log::channel('cron')->info('Cron-Aktion aufgerufen: ' . $action);
if($key !== self::CRON_KEY){
Log::channel('cron')->warning('Ungültiger Cron-Key verwendet: ' . $key);
abort(404);
}
if($action === 'check_payments_account'){
Log::channel('cron')->info('Starte Überprüfung der Zahlungskonten');
return $this->checkPaymentsAccounts();
}
Log::channel('cron')->warning('Unbekannte Aktion angefordert: ' . $action);
return response('Keine gültige Aktion angegeben', 400);
}
/**
* Überprüft Benutzerbestätigungen und sendet Erinnerungen
*
* @return string
*/
public function checkConfirmation()
{
Log::channel('cron')->info('Starte Überprüfung der Benutzerbestätigungen');
$now = date('Y-m-d H:i:s');
$next = date('Y-m-d H:i:s', strtotime('+3 week'));
$users = User::where('confirmed', '=', 0)->where('confirmation_code_to', '<', $now)->get();
Log::channel('cron')->info('Gefundene unbestätigte Benutzer: ' . $users->count());
foreach ($users as $user) {
//delete user
if ($user->confirmation_code_remider == 1) {
Log::channel('cron')->warning('Lösche unbestätigten Benutzer: ' . $user->email);
$this->userRepo->deleteUser($user);
}
//send new remider
if ($user->confirmation_code_remider == 0) {
if(!Util::isTestSystem()){
Log::channel('cron')->info('Sende Bestätigungserinnerung an: ' . $user->email);
Mail::to($user->email)->locale($user->getLocale())->send(new MailVerifyAccount($user->confirmation_code, $user));
$user->confirmation_code_to = $next;
$user->confirmation_code_remider = 1;
$user->save();
} else {
Log::channel('cron')->info('Testsystem: Bestätigungserinnerung an: ' . $user->email);
}
}
}
return "TOSK";
}
/**
* Überprüft Zahlungskonten und sendet Erinnerungen
*
* @return string
*/
public function checkPaymentsAccounts()
{
Log::channel('cron')->info('Starte Überprüfung der Zahlungskonten');
/*RULES
reminders
> 21 remind_first_days = 31 reminder_first
> 21 remind_first_days + sepa = 32 reminder_first_sepa
> 14 remind_sec_days = 33 reminder_sec
> 2 remind_last_days = 34 reminder_last
> 0 deaktiv = 35 reminder_deaktiv
> 0 deaktiv + sepa = 36 reminder_deaktiv_sepa
== 7 abo_booking_days + sepa + cron = 37 reminder_collect_sepa
*/
//max Date for reminder
$renewalDate = Carbon::now()->modify('+'.(config('mivita.remind_first_days')+1).' days');
Log::channel('cron')->info('Erneuerungsdatum für Zahlungen: ' . $renewalDate->format('Y-m-d H:i:s'));
$users = User::where('payment_account', '!=', NULL)
->where('active', '=', 1)
->where('blocked', '!=', 1)
->where('payment_account', '<', $renewalDate)
->get();
Log::channel('cron')->info('Gefundene Benutzer für Zahlungserinnerungen: ' . $users->count());
foreach ($users as $user){
Log::channel('cron')->info('Prüfe Zahlungserinnerungen für Benutzer: ' . $user->email);
$this->checkReminderPayments($user);
}
return "TOSK";
}
/**
* Initiiert Abo-Zahlungen für einen Benutzer
* hier geht es um die Mitglieschaft Abos - die sind derzeit deaktiviert
*
* @param User $user Benutzer
* @return bool
*/
private function userInitAboPayment(User $user)
{
if(!$user->isAcountAboPayDate()){
Log::channel('cron')->info('Kein Abo-Zahlungsdatum für Benutzer: ' . $user->email);
return false;
}
//user has a open Abo Payment
if($this->checkIsAboPaymentOpen($user)){
Log::channel('cron')->info('Offene Abo-Zahlung für Benutzer: ' . $user->email);
return false;
}
if($user->payment_order_product){
Log::channel('cron')->info('Starte Abo-Zahlung für Benutzer: ' . $user->email);
$this->buyProductAboPayment($user, $user->payment_order_product);
}
return true;
}
/**
* Prüft, ob eine offene Abo-Zahlung existiert
*
* @param User $user Benutzer
* @return bool
*/
private function checkIsAboPaymentOpen(User $user)
{
$isOpen = UserHistory::whereUserId($user->id)
->whereAction('abo_open_payment')
->whereIdentifier($user->payment_account)
->where('status', '>=', 1) //open //error // payment
->get()->last();
if($isOpen){
Log::channel('cron')->info('Offene Abo-Zahlung gefunden für: ' . $user->email);
return true;
}
return false;
}
/**
* Prüft und sendet Zahlungserinnerungen basierend auf Benutzerkontostand
*
* @param User $user Benutzer
* @return bool
*/
private function checkReminderPayments(User $user)
{
//35 reminder_deaktiv, 36 reminder_deaktiv_sepa
if(!$user->isActiveAccount()){
Log::channel('cron')->info('Inaktives Konto für Benutzer: ' . $user->email);
$isSend = $this->checkIsReminderSend($user, 35);
return $isSend;
}
//34 reminder_last
if($user->daysActiveAccount() <= config('mivita.remind_last_days')){
Log::channel('cron')->info('Letzte Erinnerung für Benutzer: ' . $user->email . ' (Tage aktiv: ' . $user->daysActiveAccount() . ')');
$isSend = $this->checkIsReminderSend($user, 34);
return $isSend;
}
//33 reminder_sec
if($user->daysActiveAccount() <= config('mivita.remind_sec_days')){
Log::channel('cron')->info('Zweite Erinnerung für Benutzer: ' . $user->email . ' (Tage aktiv: ' . $user->daysActiveAccount() . ')');
$isSend = $this->checkIsReminderSend($user, 33);
return $isSend;
}
//31 reminder_first
if($user->daysActiveAccount() > config('mivita.remind_sec_days')){
Log::channel('cron')->info('Erste Erinnerung für Benutzer: ' . $user->email . ' (Tage aktiv: ' . $user->daysActiveAccount() . ')');
$isSend = $this->checkIsReminderSend($user, 31);
return $isSend;
}
return false;
}
/**
* Überprüft, ob eine Erinnerung bereits gesendet wurde
*
* @param User $user Benutzer
* @param int $status Status-Code der Erinnerung
* @return bool
*/
private function checkIsReminderSend(User $user, $status)
{
$isSend = UserHistory::whereUserId($user->id)
->whereAction('reminder_payments')
->whereIdentifier($user->payment_account)
->whereStatus($status)
->latest()
->first();
if($isSend){
Log::channel('cron')->info('Erinnerung bereits gesendet für Benutzer: ' . $user->email . ' (Status: ' . $status . ')');
return true;
}
Log::channel('cron')->info('Sende neue Erinnerung für Benutzer: ' . $user->email . ' (Status: ' . $status . ')');
$referenz = $this->sendReminderMail($user, $status);
//is not sent create
UserHistory::create([
'user_id' => $user->id,
'action' => 'reminder_payments',
'referenz' => $referenz,
'identifier' => $user->payment_account,
'status' => $status
]);
return false;
}
/**
* Sendet eine Erinnerungs-E-Mail an den Benutzer
*
* @param User $user Benutzer
* @param int $status Status-Code der Erinnerung
* @return int
*/
private function sendReminderMail(User $user, $status)
{
$days = abs($user->daysActiveAccount());
$pay_date = Carbon::parse($user->payment_account)
->modify('- ' . config('mivita.abo_booking_days') . ' days')
->format('d.m.Y');
$datetime = $user->getPaymentAccountDateFormat();
$price = "";
if($user->payment_order_id && isset($user->payment_order_product->price)){
$price = 'von ' . $user->payment_order_product->getFormattedPrice() . ' EUR';
}
$message = __('reminder.copy_first_' . $status, [
'days' => $days,
'datetime' => $datetime,
'price' => $price,
'pay_date' => $pay_date
]);
$message_last = __('reminder.copy_last_' . $status, [
'days' => $days,
'datetime' => $datetime,
'price' => $price,
'pay_date' => $pay_date
]);
$button = __('reminder.button_' . $status);
$message = preg_replace("/[\n\r]/", "", $message);
$message_last = preg_replace("/[\n\r]/", "", $message_last);
$data = [
'subject' => __('reminder.subject') . " | ID: " . $status,
'message' => $message,
'message_last' => $message_last,
'url' => route('user_membership'),
'button' => $button,
];
$sender = User::find(1);
$customer_mail = UserMessage::create([
'user_id' => $user->id,
'send_user_id' => $sender->id,
'email' => $user->email,
'subject' => $data['subject'],
'message' => $data['message'] . " " . $data['message_last'],
]);
try {
if(!Util::isTestSystem()){
if($status >= 34){
Log::channel('cron')->info('Sende kritische Erinnerung mit BCC an: ' . $user->email);
Mail::to($user->email)
->locale($user->getLocale())
->bcc(config('app.default_mail'))
->send(new MailCustomMessage($user, $data, $sender, false));
} else {
Log::channel('cron')->info('Sende normale Erinnerung an: ' . $user->email);
Mail::to($user->email)
->locale($user->getLocale())
->send(new MailCustomMessage($user, $data, $sender, false));
}
} else {
Log::channel('cron')->info('Testsystem: E-Mail-Versand simuliert für: ' . $user->email);
}
} catch(\Exception $e) {
Log::channel('cron')->error('Mail-Fehler für Benutzer ' . $user->email . ': ' . $e->getMessage());
$customer_mail->fail = true;
$customer_mail->error = $e->getMessage();
$customer_mail->save();
return 0;
}
$customer_mail->send = true;
$customer_mail->sent_at = now();
$customer_mail->save();
Log::channel('cron')->info('Erinnerungsmail erfolgreich gesendet an: ' . $user->email);
return 1;
}
/**
* Kauft ein Produkt mit Abo-Zahlung
*
* @param User $user Benutzer
* @param object $product Produkt
* @return void
*/
private function buyProductAboPayment($user, $product)
{
Log::channel('cron')->info('Starte Abo-Produktkauf für Benutzer: ' . $user->email);
$paymentHelper = new PaymentHelper();
$paymentHelper->setProduct($product);
$paymentHelper->initELVPayment($user);
Log::channel('cron')->info('Abo-Produktkauf abgeschlossen für: ' . $user->email);
}
/**
* Führt das Cron-Script aus
*
* @param string $key Sicherheitsschlüssel
* @return \Illuminate\Http\Response
*/
public function runCron($key)
{
Log::channel('cron')->info('Cron-Script-Ausführung angefordert');
if($key !== self::RUN_CRON_KEY){
Log::channel('cron')->warning('Ungültiger Cron-Script-Key verwendet: ' . $key);
abort(404);
}
$scriptPath = Util::isTestSystem() ? '../cron_script_local.sh' : '../cron_script_server.sh';
Log::channel('cron')->info('Führe Script aus: ' . $scriptPath);
exec("/bin/bash {$scriptPath} 2>&1", $out, $result);
Log::channel('cron')->info('Cron-Script-Ausführung abgeschlossen mit Code: ' . $result);
echo "Returncode: " . $result . "<br>";
echo "Ausgabe des Scripts: " . "<br>";
echo "<pre>"; print_r($out);
exit;
/*return response()->view('cron.result', [
'result' => $result,
'output' => $out
]);*/
}
}

View file

@ -9,7 +9,6 @@ use App\Services\SyS\BuyingsProducts;
use App\Services\SyS\ChangeUserBusinesses;
use App\Services\SyS\CleanHTMLProductDescription;
use App\Services\SyS\Correction;
use App\Services\SyS\Cronjobs;
use App\Services\SyS\Customers;
use App\Services\SyS\Import;
use App\Services\SyS\ImportDbipCountry;
@ -53,9 +52,6 @@ class SysController extends Controller
case 'customers':
return Customers::show();
break;
case 'cronjobs':
return Cronjobs::show();
break;
case 'shopping_orders':
return ShoppingOrders::show();
break;
@ -108,9 +104,6 @@ class SysController extends Controller
case 'customers':
return Customers::store();
break;
case 'cronjobs':
return Cronjobs::store();
break;
case 'shopping_orders':
return ShoppingOrders::store();
break;

View file

@ -9,11 +9,11 @@ use App\Models\ShippingCountry;
use App\Models\ShoppingInstance;
use App\Models\ShoppingOrder;
use App\Models\UserHistory;
use App\Services\Payment;
use App\Services\UserService;
use App\User;
use Auth;
use Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Mail;
use Request;
use Util;
@ -34,11 +34,6 @@ class MembershipController extends Controller
public function index()
{
$user = User::find(Auth::user()->id);
$diff_months = 0;
if ($user->payment_account) {
$diff_months = Carbon::now()->diffInMonths(Carbon::parse($user->payment_account)) + 1;
}
$userShoppingOrders = ShoppingOrder::with('shopping_user', 'shopping_payments')->select('shopping_orders.*')
->where('auth_user_id', '=', $user->id)
@ -48,10 +43,9 @@ class MembershipController extends Controller
->get();
$userHistoryPaymentOrder = null;
$userHistoryUpgradeOrder = null;
/* Bezhalung ist nur 29 Tage vor ablauf möglich */
/* isRenewalAccount payment_account date - config('mivita.renewal_days') Vertragsverlängerung */
/* Die Zahlung ist erst ab config('mivita.renewal_days') Tagen vor Ablauf möglich.
Geht sie ein, verlängert sich die Mitgliedschaft um ein Jahr, sonst läuft sie aus. */
if ($user->isRenewalAccount()) {
// Acount ist noch nicht verlängert / bezahlt
if ($user->payment_account) {
@ -60,10 +54,6 @@ class MembershipController extends Controller
$userHistoryPaymentOrder = UserHistory::whereUserId($user->id)->whereAction('payment_order')->where('created_at', '>=', $payment_greaterThan)->get()->last();
}
}
if ($user->isActiveAccount() && ! $user->isActiveShop()) {
$payment_greaterThan = Carbon::parse($user->payment_account)->modify('-'.(config('mivita.renewal_days') + 1).' days');
$userHistoryUpgradeOrder = UserHistory::whereUserId($user->id)->whereAction('upgrade_order')->where('created_at', '>=', $payment_greaterThan)->get()->last();
}
$userHistoryDeleteMembership = UserHistory::whereUserId($user->id)->whereAction('delete_membership')->whereStatus(50)->get()->last();
$shipping_country_id = $this->checkShoppingCountry($user);
@ -75,11 +65,8 @@ class MembershipController extends Controller
$data = [
'user' => $user,
'products' => Product::where('active', true)->whereJsonContains('show_on', ['7', '8'])->orderBy('pos', 'ASC')->get(),
'upgrade' => Product::where('active', true)->whereJsonContains('show_on', '8')->where('identifier', 'upgrade')->get(),
'diff_months' => $diff_months,
'products' => $this->renewalProducts(),
'userHistoryPaymentOrder' => $userHistoryPaymentOrder,
'userHistoryUpgradeOrder' => $userHistoryUpgradeOrder,
'userHistoryDeleteMembership' => $userHistoryDeleteMembership,
'yard_info' => UserService::getYardInfo(),
'userShoppingOrders' => $userShoppingOrders,
@ -88,6 +75,34 @@ class MembershipController extends Controller
return view('user.membership.index', $data);
}
/**
* Produkte, die bei der Mitgliedschafts-Verlängerung zur Auswahl stehen.
*
* Die Registrierung (show_on 7) nutzt ein eigenes Produkt mit Registrierungs-Text.
* Für die Verlängerung gibt es eine Kopie mit passendem Inhalt (identifier show_renewal).
* Solange keine angelegt ist, greift das bisherige Mitgliedschafts-Produkt.
*
* @return Collection<int, Product>
*/
private function renewalProducts(): Collection
{
$renewalProducts = Product::where('active', true)
->where('identifier', 'show_renewal')
->whereJsonContains('show_on', '8')
->orderBy('pos', 'ASC')
->get();
if ($renewalProducts->isNotEmpty()) {
return $renewalProducts;
}
return Product::where('active', true)
->whereJsonContains('show_on', '7')
->whereJsonContains('show_on', '8')
->orderBy('pos', 'ASC')
->get();
}
private function checkShoppingCountry($user)
{
@ -108,26 +123,6 @@ class MembershipController extends Controller
public function storePayment($action)
{
$data = Request::all();
// #### remove_abo
if ($action === 'remove_abo') {
if (Request::get('abo_options_remove')) {
$user = User::find(Auth::user()->id);
$user->abo_options = false;
$user->save();
$user->account->payment_data = null;
$user->account->save();
UserHistory::create(['user_id' => $user->id, 'action' => 'abo_options_remove', 'status' => 10]);
\Session()->flash('alert-success', __('msg.abo_deaktivert'));
return back();
}
\Session()->flash('alert-error', __('msg.error_checkbox_not_confirm'));
return back();
}
// #### payment order
// #### shop upgrade
if ($action === 'upgrade_order' || $action === 'payment_order') {
@ -135,12 +130,6 @@ class MembershipController extends Controller
$user = User::find(Auth::user()->id);
Yard::instance('shopping')->destroy();
$product = Product::find(Request::get('switchers-package-wizard'));
$showAboOptions = false;
if (Request::get('abo_options')) {
$showAboOptions = false; // true Abo Option deaktivert
$user->abo_options = false; // true Abo Option deaktivert
$user->save();
}
$shipping_country_id = $this->checkShoppingCountry($user);
if (! $shipping_country_id) {
@ -157,14 +146,14 @@ class MembershipController extends Controller
$image = $product->images->first()->slug;
}
$qty = $product->is_membership_only ? 1 : (Request::get('qty') ? Request::get('qty') : 1);
$cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), $qty, $product->getPriceWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country), false, false, ['image' => $image, 'slug' => $product->slug, 'weight' => $product->weight, 'points' => $product->points, 'no_commission' => $product->no_commission, 'no_free_shipping' => $product->no_free_shipping, 'show_on' => $product->show_on]);
$cartItem = Yard::instance('shopping')->add($product->id, $product->getLang('name'), $qty, $product->getPriceWith(UserService::getTaxFree(), false, UserService::$user_country), false, false, ['image' => $image, 'slug' => $product->slug, 'weight' => $product->weight, 'points' => $product->points, 'no_commission' => $product->no_commission, 'no_free_shipping' => $product->no_free_shipping, 'show_on' => $product->show_on]);
if ($cartItem->qty > 1) {
Yard::instance('shopping')->update($cartItem->rowId, 1);
}
if (\App\Services\UserService::getTaxFree()) {
if (UserService::getTaxFree()) {
Yard::setTax($cartItem->rowId, 0);
} else {
Yard::setTax($cartItem->rowId, $product->getTaxWith(\App\Services\UserService::$user_country));
Yard::setTax($cartItem->rowId, $product->getTaxWith(UserService::$user_country));
}
do {
@ -174,7 +163,7 @@ class MembershipController extends Controller
$data = [];
$data['is_from'] = 'membership';
$data['is_for'] = 'me';
$data['user_price_infos'] = \App\Services\UserService::getUserPriceInfos();
$data['user_price_infos'] = UserService::getUserPriceInfos();
ShoppingInstance::create([
'identifier' => $identifier,
@ -191,7 +180,7 @@ class MembershipController extends Controller
Yard::instance('shopping')->store($identifier);
// add to DB
$path = route('checkout.checkout_card', ['identifier' => $identifier]);
UserHistory::create(['user_id' => $user->id, 'action' => $action, 'status' => 1, 'product_id' => $product->id, 'identifier' => $identifier, 'abo_options' => $showAboOptions]);
UserHistory::create(['user_id' => $user->id, 'action' => $action, 'status' => 1, 'product_id' => $product->id, 'identifier' => $identifier]);
// $path = str_replace('http', 'https', $path);
return redirect()->secure($path);

View file

@ -4,8 +4,10 @@ namespace App\Models;
use App\Services\Util;
use Cviebrock\EloquentSluggable\Sluggable;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Carbon;
/**
* App\Models\Product
@ -33,12 +35,12 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property int|null $pos
* @property int $active
* @property int|null $amount
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property \Illuminate\Support\Carbon|null $deleted_at
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductAttribute[] $attributes
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductCategory[] $categories
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductImage[] $images
* @property Carbon|null $created_at
* @property Carbon|null $updated_at
* @property Carbon|null $deleted_at
* @property-read Collection|ProductAttribute[] $attributes
* @property-read Collection|ProductCategory[] $categories
* @property-read Collection|ProductImage[] $images
* @property-write mixed $price_vk
*
* @method static bool|null forceDelete()
@ -93,7 +95,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereWeight($value)
*
* @property int|null $points
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductImage[] $imagesActive
* @property-read Collection|ProductImage[] $imagesActive
* @property-read int|null $images_active_count
*
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product wherePoints($value)
@ -112,7 +114,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereContentsTotal($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereUnit($value)
*
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\CountryPrice[] $country_prices
* @property-read Collection|CountryPrice[] $country_prices
* @property-read int|null $country_prices_count
* @property int|null $wp_number
*
@ -123,11 +125,11 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Product whereShippingAddon($value)
*
* @property-read int|null $ingredients_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProductIngredient[] $product_ingredients
* @property-read Collection|ProductIngredient[] $product_ingredients
* @property-read int|null $product_ingredients_count
* @property bool|null $no_commission
* @property array|null $show_on
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Ingredient[] $p_ingredients
* @property-read Collection|Ingredient[] $p_ingredients
* @property-read int|null $p_ingredients_count
*
* @method static \Illuminate\Database\Eloquent\Builder|Product whereNoCommission($value)
@ -146,20 +148,20 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @method static \Illuminate\Database\Eloquent\Builder|Product whereBuyingRestrictionAmount($value)
* @method static \Illuminate\Database\Eloquent\Builder|Product whereNoFreeShipping($value)
*
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ProductBuying> $product_buyings
* @property-read Collection<int, ProductBuying> $product_buyings
* @property-read int|null $product_buyings_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ProductBuying> $product_buyings
* @property-read Collection<int, ProductBuying> $product_buyings
* @property bool|null $sponsor_buying_points
* @property int|null $sponsor_buying_points_amount
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ProductBuying> $product_buyings
* @property-read Collection<int, ProductBuying> $product_buyings
*
* @method static \Illuminate\Database\Eloquent\Builder|Product whereSponsorBuyingPoints($value)
* @method static \Illuminate\Database\Eloquent\Builder|Product whereSponsorBuyingPointsAmount($value)
*
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ProductBuying> $product_buyings
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\TransProduct> $translations
* @property-read Collection<int, ProductBuying> $product_buyings
* @property-read Collection<int, TransProduct> $translations
* @property-read int|null $translations_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ProductCategory> $product_categories
* @property-read Collection<int, ProductCategory> $product_categories
* @property-read int|null $product_categories_count
*
* @mixin \Eloquent
@ -169,6 +171,7 @@ class Product extends Model
/*identifiers
show_upgrade # in membership payment can upgrade this package to show order
show_order # in membership payment show always
show_renewal # eigenes Produkt fuer die Mitgliedschafts-Verlaengerung (Inhalt/Text statt Registrierung)
upgrade # need upgrade_to_id set user->payment_order_id to the package in the payment api
*/
@ -245,6 +248,7 @@ class Product extends Model
'' => '-',
'show_upgrade' => 'Kann geupdatet werden',
'show_order' => 'Wird immer als Option angezeigt',
'show_renewal' => 'Wird bei der Mitgliedschafts-Verlängerung angezeigt',
'upgrade_product' => 'Produkt upgrade zur Produkt ID',
'upgrade_member' => 'Berater upgrade zur Karriere ID',
'proportional_voucher' => 'Anteiliger Gutschein Berater',

View file

@ -1,32 +0,0 @@
<?php
namespace App\Services\SyS;
use Request;
class CronJobs
{
public static function show()
{
//$user_shops = UserShop::all();
$text = "";
$values = [
'Prüft die Dauer der Mitgliedschaft und sendet Erinnerungsmails' => route('cron_jobs_action', ['check_payments_account', 'key'])
];
$data = [
'values' => $values,
'text' => $text,
];
return view('sys.tools.cronjobs', $data);
}
public static function store()
{
$data = Request::all();
\Session()->flash('alert-save', true);
return back();
}
}

View file

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Gleicht Schema-Drift der products-Tabelle aus.
*
* slug (Sluggable-Trait) und die trans_*-Übersetzungsspalten existieren in der
* Produktivdatenbank und werden vom Product-Model genutzt, fehlten aber in den
* Migrationen. Frisch aufgebaute Datenbanken – unter anderem die Testdatenbank –
* hatten sie deshalb nicht.
*/
return new class extends Migration
{
public function up(): void
{
Schema::table('products', function (Blueprint $table): void {
if (! Schema::hasColumn('products', 'slug')) {
$table->string('slug', 191)->nullable()->index();
}
foreach (['trans_name', 'trans_title'] as $column) {
if (! Schema::hasColumn('products', $column)) {
$table->text($column)->nullable();
}
}
foreach (['trans_copy', 'trans_description', 'trans_usage', 'trans_ingredients'] as $column) {
if (! Schema::hasColumn('products', $column)) {
$table->mediumText($column)->nullable();
}
}
});
}
public function down(): void
{
// Spalten bleiben bestehen: sie werden produktiv genutzt.
}
};

View file

@ -0,0 +1,103 @@
<?php
use App\Models\CountryPrice;
use App\Models\Product;
use App\Models\ProductCategory;
use Illuminate\Database\Migrations\Migration;
/**
* Eigenes Produkt für die Mitgliedschafts-Verlängerung.
*
* Das bisherige Mitgliedschafts-Produkt (identifier show_order) wird bei der
* Registrierung angezeigt und beschreibt entsprechend den Neuabschluss
* ("Du kannst Dich jetzt mit der Jahresgebühr registrieren ..."). Für die
* Verlängerung passt dieser Text nicht, deshalb bekommt sie eine Kopie mit
* eigenem Inhalt.
*/
return new class extends Migration
{
private const RENEWAL_IDENTIFIER = 'show_renewal';
private const RENEWAL_SLUG = 'mivita-business-paket-verlaengerung';
private const RENEWAL_TITLE = 'Verlängerung – 12 Monate Laufzeit';
private const RENEWAL_COPY = '<p>Du verlängerst Deine MIVITA Mitgliedschaft um weitere 12 Monate.</p>'
.'<p>Damit bleiben Dir erhalten:</p>'
.'<ul>'
.'<li>Dein persönlicher Berater-Rabatt auf alle Einkäufe</li>'
.'<li>Dein personalisierter mivita Webshop</li>'
.'<li>Die Gutschrift von Punkten und Provisionen gemäß Marketingplan</li>'
.'</ul>'
.'<p>Die Verlängerung schließt direkt an Deine aktuelle Laufzeit an und wird aktiv, sobald Deine Zahlung bei uns eingegangen ist. Eine automatische Verlängerung gibt es nicht.</p>'
.'<p><b>Bitte beachte:</b> Ohne Zahlung läuft Deine Mitgliedschaft aus und Dein Berater-Account wird pausiert. Es werden Dir dann keine Punkte und keine Provisionen mehr gutgeschrieben. Bereits erarbeitete, noch offene Provisionen zahlen wir Dir selbstverständlich im nächsten Zahlungslauf aus.</p>';
public function up(): void
{
if (Product::withTrashed()->where('identifier', self::RENEWAL_IDENTIFIER)->exists()) {
return;
}
$membershipProduct = Product::where('identifier', 'show_order')
->whereJsonContains('show_on', '7')
->whereJsonContains('show_on', '8')
->orderBy('pos', 'ASC')
->first();
if (! $membershipProduct) {
return;
}
$renewalProduct = $membershipProduct->replicate();
$renewalProduct->identifier = self::RENEWAL_IDENTIFIER;
$renewalProduct->show_on = ['8']; // nur Mitgliedschaft, nicht Registrierung
$renewalProduct->slug = self::RENEWAL_SLUG;
$renewalProduct->title = self::RENEWAL_TITLE;
$renewalProduct->copy = self::RENEWAL_COPY;
$renewalProduct->pos = (int) $membershipProduct->pos + 1;
$renewalProduct->active = true;
// Eigene Artikelnummern: wp_number ist unique, ean darf sich nicht doppeln.
$renewalProduct->wp_number = null;
$renewalProduct->ean = null;
$renewalProduct->number = $membershipProduct->number ? $membershipProduct->number.'-V' : null;
// Uebersetzungen des Registrierungs-Textes passen inhaltlich nicht.
foreach (['trans_title', 'trans_copy'] as $attribute) {
if (array_key_exists($attribute, $renewalProduct->getAttributes())) {
$renewalProduct->{$attribute} = null;
}
}
$renewalProduct->save();
foreach ($membershipProduct->country_prices as $countryPrice) {
CountryPrice::create([
'product_id' => $renewalProduct->id,
'country_id' => $countryPrice->country_id,
'c_price' => $countryPrice->c_price,
'c_tax' => $countryPrice->c_tax,
'c_price_old' => $countryPrice->c_price_old,
'c_currency' => $countryPrice->c_currency,
]);
}
foreach ($membershipProduct->product_categories as $productCategory) {
ProductCategory::create([
'product_id' => $renewalProduct->id,
'category_id' => $productCategory->category_id,
]);
}
}
public function down(): void
{
Product::where('identifier', self::RENEWAL_IDENTIFIER)
->get()
->each(function (Product $product): void {
$product->active = false;
$product->save();
$product->delete();
});
}
};

View file

@ -0,0 +1,105 @@
<?php
use App\Models\Product;
use App\Models\TransProduct;
use Illuminate\Database\Migrations\Migration;
/**
* Übersetzungen für das Verlängerungs-Produkt (identifier show_renewal).
*
* Product::getLang() liest die Texte aus trans_products und fällt sonst auf den
* deutschen Wert zurück. Die Produkt-Kopie aus 2026_08_25_120000 bringt keine
* eigenen Zeilen mit, deshalb sahen en/es/fr den deutschen Verlängerungstext.
* Der Produktname bleibt identisch zum Mitgliedschafts-Produkt und wird von dort
* übernommen; die Beschreibung beschreibt die Verlängerung statt der Registrierung.
*/
return new class extends Migration
{
private const RENEWAL_IDENTIFIER = 'show_renewal';
/**
* @var array<string, string>
*/
private const RENEWAL_COPY = [
'en' => '<p>You are renewing your MIVITA membership for another 12 months.</p>'
.'<p>This keeps in place:</p>'
.'<ul>'
.'<li>Your personal consultant discount on all purchases</li>'
.'<li>Your personalised mivita web shop</li>'
.'<li>Points and commissions credited in accordance with the marketing plan</li>'
.'</ul>'
.'<p>The renewal follows on directly from your current term and becomes active as soon as we have received your payment. There is no automatic renewal.</p>'
.'<p><b>Please note:</b> Without payment your membership expires and your consultant account will be paused. From then on you will no longer be credited with any points or commissions. Commissions you have already earned and that are still outstanding will of course be paid out to you in the next payment run.</p>',
'es' => '<p>Amplías tu afiliación MIVITA por otros 12 meses.</p>'
.'<p>Así conservas:</p>'
.'<ul>'
.'<li>Tu descuento personal de asesor en todas las compras</li>'
.'<li>Tu tienda online mivita personalizada</li>'
.'<li>El abono de puntos y comisiones según el plan de marketing</li>'
.'</ul>'
.'<p>La ampliación enlaza directamente con tu plazo actual y se activa en cuanto recibamos tu pago. No existe una renovación automática.</p>'
.'<p><b>Ten en cuenta:</b> Sin pago tu afiliación caduca y tu cuenta de asesor queda en pausa. A partir de ese momento ya no se te abonarán puntos ni comisiones. Las comisiones ya generadas y aún pendientes se te pagarán, por supuesto, en la siguiente ejecución de pago.</p>',
'fr' => '<p>Vous renouvelez votre adhésion MIVITA pour 12 mois supplémentaires.</p>'
.'<p>Vous conservez ainsi :</p>'
.'<ul>'
.'<li>Votre remise personnelle de conseiller sur tous vos achats</li>'
.'<li>Votre boutique en ligne mivita personnalisée</li>'
.'<li>Le crédit de points et de commissions conformément au plan marketing</li>'
.'</ul>'
.'<p>Le renouvellement fait directement suite à votre durée actuelle et devient actif dès que nous avons reçu votre paiement. Il n’y a pas de renouvellement automatique.</p>'
.'<p><b>Veuillez noter :</b> Sans paiement, votre adhésion expire et votre compte conseiller est mis en pause. Aucun point ni aucune commission ne vous seront alors plus crédités. Les commissions déjà acquises et encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement.</p>',
];
public function up(): void
{
$renewalProduct = Product::where('identifier', self::RENEWAL_IDENTIFIER)->first();
if (! $renewalProduct) {
return;
}
$membershipProduct = Product::where('identifier', 'show_order')
->whereJsonContains('show_on', '7')
->whereJsonContains('show_on', '8')
->orderBy('pos', 'ASC')
->first();
foreach (self::RENEWAL_COPY as $language => $copy) {
$name = $membershipProduct ? $membershipProduct->getTrans('name', $language) : '';
if ($name !== '') {
$this->addTranslation($renewalProduct, $language, 'name', $name);
}
$this->addTranslation($renewalProduct, $language, 'copy', $copy);
}
}
public function down(): void
{
$renewalProduct = Product::where('identifier', self::RENEWAL_IDENTIFIER)->first();
if (! $renewalProduct) {
return;
}
TransProduct::where('product_id', $renewalProduct->id)
->whereIn('language', array_keys(self::RENEWAL_COPY))
->whereIn('key', ['name', 'copy'])
->delete();
}
/**
* Bestehende Übersetzungen bleiben unangetastet: sie können im Backend
* nachträglich angepasst worden sein.
*/
private function addTranslation(Product $product, string $language, string $key, string $value): void
{
TransProduct::firstOrCreate(
['language' => $language, 'product_id' => $product->id, 'key' => $key],
['value' => $value],
);
}
};

View file

@ -1,60 +1,41 @@
<?php
return array (
'' => '',
'MIVITA_BUSINESS_Paket' => 'MIVITA BUSINESS Paket',
'abo_copy_1' => 'Automatische Verlängerung dekativeren und SEPA Mandat zurückziehen.',
'abo_copy_2' => 'Die nächste Buchung ist am: <strong> :date </strong>',
'abo_copy_3' => 'Hiermit bestätige ich, mein SEPA zu löschen und die automatische Verlängerung dekativeren.',
'active' => 'aktiv',
'active_package' => 'aktives Paket',
'booked_package' => 'gebuchtes Paket',
'change' => 'anpassen',
'change_copy_1' => 'Du kannst Deine Mitglidschaft bis zur nächsten Vertragsverlängerung, am :date, ändern.',
'change_copy_2' => 'Die restlichen Laufzeiten bleiben erhalten, erst mit der Verlängerung wird das geänderte Paket aktiv.',
'consultant_membership' => 'Berater-Mitgliedschaft',
'consultant_online_shop' => 'Berater-Online-Shop',
'contract_renewal' => 'Vertragsverlängerung',
'deactivate' => 'deaktivieren',
'details' => 'Details',
'downgrade_membership_is_not_possible' => 'Eine Rückstufung Deiner Berater-Mitgliedschaft ist nicht mehr möglich.',
'end' => 'beenden',
'end_button' => 'Mitgliedschaft hiermit beenden',
'end_checkbox' => 'Ja, ich möchte die MIVITA Mitgliedschaft beenden, ich verzichte auf jeglichen Anspruch gegenüber MIVITA und möchte, dass mein Account gelöscht wird!',
'end_copy_1' => 'Du möchtest kein MIVITA Berater mehr sein und Deine Mitgliedschaft beenden?',
'end_copy_2' => 'Damit gibst du alle möglichen Provisionen, Vergünstigungen, Zugang zum Sales-Center und noch viel mehr auf. Mit absenden dieser Option erhalten wir ein Nachricht und kümmern uns um die Löschung Deines Accounts. Dieser Vorgang kann ein paar Tage dauern.',
'end_copy_3' => 'Die Beendigung und Löschung Deiner MIVITA Mitgliedschaft ist beantragt.',
'expired_on' => 'abgelaufen am',
'home_copy_SEPA_32' => 'Da Du uns ein SEPA-Lastschrift-Mandat erteilt hast, brauchst Du nicht weiter aktiv zu werden. Entsprechend dieses Mandates werden wir den Rechnungsbetrag :price am :pay_date von Deinem Konto abbuchen.',
'home_copy_SEPA_33' => 'Von Deinem SEPA-Lastschrift-Mandat, das du uns erteilt hast, konnten wir bisher den Rechnungsbetrag :price am :pay_date nicht abbuchen.',
'home_copy_SEPA_36' => 'Leider war es uns nicht möglich, den fälligen Betrag per SEPA-Lastschrift-Mandat für die Mitgliedsgebühr von Deinem angegebenen Konto einzuziehen.',
'home_copy_alert_31' => 'Deine Mitgliedschaft läuft zum :datetime aus',
'home_copy_alert_35' => 'Deine Mitgliedschaft läuft heute aus!',
'home_copy_alert_36' => 'Dein Mitgliedschaft ist vor :days Tagen am :datetime ausgelaufen!',
'home_copy_alert_36_today' => 'Dein Mitgliedschaft ist heute am :datetime ausgelaufen!',
'home_copy_last_31' => 'Es bleiben Dir jetzt noch entspannte :days Tage Zeit, Deine Mitgliedschaft zu verlängern. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.',
'home_copy_last_33' => 'Es bleiben Dir jetzt noch :days Tage Zeit, Deine Mitgliedschaft zu verlängern. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.',
'home_copy_last_34' => 'huiii... jetzt wird es aber Zeit! Deine Mitgliedschaft läuft bereits in :days Tagen aus, und zwar exakt am :datetime. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.',
'home_copy_last_35' => 'huiii... jetzt wird es aber Zeit! Deine Mitgliedschaft läuft bereits heute aus, und zwar exakt am :datetime. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.',
'home_copy_last_36' => 'wie angekündigt, haben wir Deinen Berater-Account pausiert, da Du Deine Mitgliedschaft nicht rechtzeitig verlängert hast. Wenn Du wieder von den Vorteilen und Features bei MIVITA profitieren möchtest, kannst Du Deinen Account jederzeit reaktivieren.',
'home_hl' => 'Mitgliedschaft / Jahresbeitrag',
'inactive' => 'inaktiv',
'is_no_longer_possible_to_change_package' => 'Eine Änderung Deines Berater-Paketes ist nicht mehr möglich.',
'membership' => 'Mitgliedschaft',
'membership_was_renewed' => 'Dein Vertrag wurde am :date verlängert. ',
'open_payment_options' => 'Zahlungsoptionen öffnen',
'payment_copy_1' => 'Alternativ hast Du die Möglichkeit jetzt direkt Deine Mitgliedschaft mit anderen Zahlungsmöglichkeiten zu bezahlen.',
'payment_copy_2' => 'Ist die Mitgliedschaft vor dem :date bezahlt, wird das SEPA Mandart nicht ausgeführt!',
'payment_has_been_made' => 'Eine Zahlung wurde ausgeführt.',
'renewal_is_active_membership_fee_automatic' => ' Deine automatische Verlängerung ist aktiv, wir werden am <strong>:date</strong> Deine Mitgliedschaftsgebühr automatisch per SEPA Mandat einziehen.',
'status' => 'Status',
'until' => 'bis zum',
'upgrade' => 'Upgrade',
'upgrade_copy_1' => 'Erweitere jetzt Deine Mitglidschaft auf MIVITA BUSINESS Paket!',
'upgrade_copy_2' => 'Berechnet werden die restlichen Monate bis zur Berater-Mitgliedschaft Verlängerung. Danach wird jährlich der MIVITA BUSINESS Paketpreis berechnet.',
'upgrade_package_and_proceed_payment' => 'Du hast die Möglichkeit Dein Paket zu upgraden, wähle einfach das erweiterte Paket aus und gehe weiter zur Zahlung.',
'we_do_not_collect_membership_fee' => 'Wir konnten am <strong>:date</strong> Deine Mitgliedschaftsgebühr <strong>nicht</strong> automatisch per SEPA Mandat einziehen.',
'your_booked_package' => 'Dein gebuchtes Paket',
'info_contract_renewal' => 'Dein Vertrag wird :days Tage vor Ablauf Deiner Berater-Mitgliedschaft automatisch verlängert. Nach der Vertragsverlängerung ist eine Änderung des Berater-Pakets nicht mehr möglich und du musst die Zahlung für Deine Mitgliedschaft vornehmen.',
'alert_contract_renewal' => 'Um Deine Berater-Mitgliedschaft zu verlängern, führe bitte die Zahlung für Dein gebuchtes MIVITA-Paket durch.'
);
return [
'' => '',
'active' => 'aktiv',
'booked_package' => 'gebuchtes Paket',
'consultant_membership' => 'Berater-Mitgliedschaft',
'consultant_online_shop' => 'Berater-Online-Shop',
'details' => 'Details',
'end' => 'beenden',
'end_button' => 'Mitgliedschaft hiermit beenden',
'end_checkbox' => 'Ja, ich möchte die MIVITA Mitgliedschaft beenden, ich verzichte auf jeglichen Anspruch gegenüber MIVITA und möchte, dass mein Account gelöscht wird!',
'end_copy_1' => 'Du möchtest kein MIVITA Berater mehr sein und Deine Mitgliedschaft beenden?',
'end_copy_2' => 'Damit gibst du alle möglichen Provisionen, Vergünstigungen, Zugang zum Sales-Center und noch viel mehr auf. Mit absenden dieser Option erhalten wir ein Nachricht und kümmern uns um die Löschung Deines Accounts. Dieser Vorgang kann ein paar Tage dauern.',
'end_copy_3' => 'Die Beendigung und Löschung Deiner MIVITA Mitgliedschaft ist beantragt.',
'expired_on' => 'abgelaufen am',
'home_copy_alert_31' => 'Deine Mitgliedschaft läuft zum :datetime aus',
'home_copy_alert_35' => 'Deine Mitgliedschaft läuft heute aus!',
'home_copy_alert_36' => 'Dein Mitgliedschaft ist vor :days Tagen am :datetime ausgelaufen!',
'home_copy_alert_36_today' => 'Dein Mitgliedschaft ist heute am :datetime ausgelaufen!',
'home_copy_last_31' => 'Es bleiben Dir jetzt noch entspannte :days Tage Zeit, Deine Mitgliedschaft zu verlängern. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.',
'home_copy_last_33' => 'Es bleiben Dir jetzt noch :days Tage Zeit, Deine Mitgliedschaft zu verlängern. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.',
'home_copy_last_34' => 'huiii... jetzt wird es aber Zeit! Deine Mitgliedschaft läuft bereits in :days Tagen aus, und zwar exakt am :datetime. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.',
'home_copy_last_35' => 'huiii... jetzt wird es aber Zeit! Deine Mitgliedschaft läuft bereits heute aus, und zwar exakt am :datetime. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.',
'home_copy_last_36' => 'wie angekündigt, haben wir Deinen Berater-Account pausiert, da Du Deine Mitgliedschaft nicht rechtzeitig verlängert hast. Wenn Du wieder von den Vorteilen und Features bei MIVITA profitieren möchtest, kannst Du Deinen Account jederzeit reaktivieren.',
'home_hl' => 'Mitgliedschaft / Jahresbeitrag',
'inactive' => 'inaktiv',
'membership' => 'Mitgliedschaft',
'open_payment_options' => 'Zahlungsoptionen öffnen',
'payment_has_been_made' => 'Eine Zahlung wurde ausgeführt.',
'status' => 'Status',
'until' => 'bis zum',
'your_booked_package' => 'Dein gebuchtes Paket',
'alert_contract_renewal' => 'Um Deine Mitgliedschaft um ein weiteres Jahr zu verlängern, führe bitte jetzt die Zahlung für Dein MIVITA-Paket durch.',
'renewal_hl' => 'Mitgliedschaft verlängern',
'renewal_info' => 'Deine Mitgliedschaft läuft am :datetime aus. Sobald Deine Zahlung bei uns eingegangen ist, verlängert sie sich um ein weiteres Jahr. Eine automatische Verlängerung gibt es nicht.',
'renewal_expired_info' => 'Deine Mitgliedschaft ist am :datetime abgelaufen und Dein Berater-Account ist pausiert. Sobald Deine Zahlung bei uns eingegangen ist, schalten wir ihn sofort wieder für ein Jahr frei.',
'renewal_consequence' => 'Ohne Zahlung läuft Deine Mitgliedschaft einfach aus: Es werden Dir dann keine Punkte und keine Provisionen mehr gutgeschrieben. Bereits erarbeitete, noch offene Provisionen zahlen wir Dir selbstverständlich im nächsten Zahlungslauf aus.',
'active_info' => 'Deine Mitgliedschaft ist bis zum :datetime aktiv. Ab dem :renewal_date kannst Du sie hier für ein weiteres Jahr verlängern.',
'renewal_possible_from' => 'Verlängerung möglich ab',
];

View file

@ -1,14 +1,11 @@
<?php
return array (
'button_31' => 'MITGLIEDSCHAFT VERLÄNGERN',
'button_32' => 'MITGLIEDSCHAFT VERWALTEN',
'button_33' => 'MITGLIEDSCHAFT VERLÄNGERN',
'button_34' => 'MITGLIEDSCHAFT VERLÄNGERN',
'button_35' => 'MITGLIEDSCHAFT VERWALTEN',
'button_36' => 'MITGLIEDSCHAFT VERWALTEN',
'button_37' => 'MITGLIEDSCHAFT VERWALTEN',
'copy_first_31' => '<p>wir wollten Dir jetzt schon mal rechtzeitig Bescheid geben, dass Deine Mitgliedschaft zum :datetime ausläuft. Daher solltest Du jetzt aktiv werden und rechtzeitig verlängern, damit Du weiterhin</p>
return [
'button_31' => 'MITGLIEDSCHAFT VERLÄNGERN',
'button_33' => 'MITGLIEDSCHAFT VERLÄNGERN',
'button_34' => 'MITGLIEDSCHAFT VERLÄNGERN',
'button_35' => 'MITGLIEDSCHAFT VERWALTEN',
'copy_first_31' => '<p>wir wollten Dir jetzt schon mal rechtzeitig Bescheid geben, dass Deine Mitgliedschaft zum :datetime ausläuft. Daher solltest Du jetzt aktiv werden und rechtzeitig verlängern, damit Du weiterhin</p>
<ul>
<li>Produkte von MIVITA beziehen kannst</li>
<li>Kunden über Deinen Onlineshop einkaufen können (optional)</li>
@ -16,16 +13,7 @@ return array (
</ul>
<p>Aber alles gut - es bleiben Dir jetzt noch entspannte :days Tage Zeit, Deine Mitgliedschaft zu verlängern. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.</p>
<p>Wir senden Dir schon ganz bald eine weitere Erinnerung zu, aber dann hast Du es jetzt schon mal im Hinterkopf. Falls Du jetzt schon für den Anschluss um 1 Jahr verlängern möchtest, kannst Du das mit Klick auf den Button unten tun. Was weg ist, ist weg :) ...</p>',
'copy_first_32' => '<p>wir wollten Dir jetzt schon mal rechtzeitig Bescheid geben, dass Deine Mitgliedschaft zum :datetime automatisch verlängert wird. Da Du uns ein SEPA-Lastschrift-Mandat erteilt hast, brauchst Du nicht weiter aktiv zu werden. Entsprechend dieses Mandates werden wir den Rechnungsbetrag :price am :pay_date von Deinem Konto abbuchen.</p>
<p>Deine Mitgliedschaft verlängert sich im Anschluss um ein weiteres Jahr, damit Du weiterhin</p>
<ul>
<li>Produkte von MIVITA beziehen kannst</li>
<li>Kunden über Deinen Onlineshop einkaufen können (optional)</li>
<li>Du von Vertriebspartnerumsätzen partizipieren kannst</li>
</ul>
<p>Soweit so gut. Solltest Du allerdings die Mitgliedschaft beenden bzw. erstmal pausieren wollen, dann kannst Du das in Deinem Mitgliederbereich selber einstellen. Folge dazu einfach dem grünen Button unten.</p>
<p>Für den Fall, dass Du erstmal nicht verlängern möchtest, wird Dein Account solange pausiert bis Du Deine Mitgliedschaft erneuerst. Beachte aber bitte, dass alle Vorteile und Funktionen, vom vergünstigten Einkaufen bis hin zur Provisionsabrechnung ebenfalls pausieren.</p>',
'copy_first_33' => '<p>hier nochmal eine kurze Erinnerung, dass Deine Mitgliedschaft zum :datetime ausläuft. Daher solltest Du jetzt aktiv werden und rechtzeitig verlängern, damit Du weiterhin</p>
'copy_first_33' => '<p>hier nochmal eine kurze Erinnerung, dass Deine Mitgliedschaft zum :datetime ausläuft. Daher solltest Du jetzt aktiv werden und rechtzeitig verlängern, damit Du weiterhin</p>
<ul>
<li>Produkte von MIVITA beziehen kannst</li>
<li>Kunden über Deinen Onlineshop einkaufen können (optional)</li>
@ -33,7 +21,7 @@ return array (
</ul>
<p>Aber alles gut - es bleiben Dir jetzt noch entspannte :days Tage Zeit, Deine Mitgliedschaft zu verlängern. Solltest Du allerdings die Frist verstreichen lassen, wird Dein Account solange automatisch pausiert bis Du Deine Mitgliedschaft erneuerst.</p>
<p>Wir senden Dir schon ganz bald eine weitere Erinnerung zu, aber dann hast Du es jetzt schon mal im Hinterkopf. Falls Du jetzt schon für den Anschluss um 1 Jahr verlängern möchtest, kannst Du das mit Klick auf den Button unten tun. Was weg ist, ist weg :) ...</p>',
'copy_first_34' => '<p>huiii... jetzt wird es aber Zeit! Deine Mitgliedschaft läuft bereits in :days Tagen aus, und zwar exakt am :datetime. Daher solltest Du jetzt aktiv werden und Deine Mitgliedschaft verlängern, da Dein Account sonst pausiert.</p>
'copy_first_34' => '<p>huiii... jetzt wird es aber Zeit! Deine Mitgliedschaft läuft bereits in :days Tagen aus, und zwar exakt am :datetime. Daher solltest Du jetzt aktiv werden und Deine Mitgliedschaft verlängern, da Dein Account sonst pausiert.</p>
<p>Wenn Du weiterhin</p>
<ul>
<li>Produkte von MIVITA beziehen</li>
@ -41,22 +29,12 @@ return array (
<li>und von Vertriebspartnerumsätzen partizipieren möchtest</li>
</ul>
<p>solltest Du jetzt schnell handeln und Deine Mitgliedschaft verlängern:</p>',
'copy_first_35' => '<p>wie angekündigt, haben wir Deinen Berater-Account pausiert, da Du Deine Mitgliedschaft nicht rechtzeitig verlängert hast. Wenn Du wieder von den Vorteilen und Features bei MIVITA profitieren möchtest, kannst Du Deinen Account jederzeit reaktivieren.</p>
'copy_first_35' => '<p>wie angekündigt, haben wir Deinen Berater-Account pausiert, da Du Deine Mitgliedschaft nicht rechtzeitig verlängert hast. Wenn Du wieder von den Vorteilen und Features bei MIVITA profitieren möchtest, kannst Du Deinen Account jederzeit reaktivieren.</p>
<p>Klick auf den Button, falls Du Änderungen an Deiner Mitgliedschaft vornehmen möchtest:</p>',
'copy_first_36' => '<p>leider war es uns nicht möglich, den fälligen Betrag für die Mitgliedsgebühr von Deinem angegebenen Konto einzuziehen.</p>
<p>Wie angekündigt, haben wir daher heute Deinen Berater-Account pausiert, da Du Deine Mitgliedschaft damit nicht rechtzeitig verlängern konntest. Wenn Du wieder von den Vorteilen und Features bei MIVITA profitieren möchtest, kannst Du Deinen Account jederzeit auch über eine andere Zahlungsweise reaktivieren (z. B. Paypal, Kreditkarte, SOFORT Überweisung oder Vorauskasse).</p>
<p>Klick dazu einfach auf folgenden Button und nimm entsprechende Einstellungen in Deinem Berater-Account vor:</p>',
'copy_first_37' => '<p>wie angekündigt, haben wir heute gemäß Deines SEPA-Lastschriftmandates den Einzug von :price für ein weiteres Jahr der Mitgliedschaft bei MIVITA veranlasst. Dieser Rechnungsbetrag wird in den nächsten Tagen von Deinem Konto abgebucht. Bitte beachte, dass die Verlängerung erst nach Zahlungseingang aktiv ist.</p>
<p>Falls Du in Zukunft Änderungen vornehmen möchtest, kannst Du alle Funktionen sowie die Mitgliedschaft in Deinem Berater-Account einstellen.</p>
<p>Folge dazu einfach dem unten stehenden Button:</p>',
'copy_last_31' => '',
'copy_last_32' => '',
'copy_last_33' => '',
'copy_last_34' => '',
'copy_last_35' => '<p><b>Hinweis:</b><br>Auch wenn Dein Account pausiert, werden Dir vergangene bzw. noch offene Provisionen selbstverständlich im nächsten Zahlungslauf ausgezahlt.Solltest Du Deinen Account vollständig löschen wollen, dann schreibe bitte eine Email an info@mivita.care. Unser Berater-Service wird sich dann umgehend darum kümmern.</p>
'copy_last_31' => '<p><b>Wichtig:</b><br>Läuft Deine Mitgliedschaft aus, wird Dein Berater-Account pausiert. Es werden Dir dann keine Punkte und keine Provisionen mehr gutgeschrieben. Bereits erarbeitete, noch offene Provisionen zahlen wir Dir selbstverständlich im nächsten Zahlungslauf aus.</p>',
'copy_last_33' => '<p><b>Wichtig:</b><br>Läuft Deine Mitgliedschaft aus, wird Dein Berater-Account pausiert. Es werden Dir dann keine Punkte und keine Provisionen mehr gutgeschrieben. Bereits erarbeitete, noch offene Provisionen zahlen wir Dir selbstverständlich im nächsten Zahlungslauf aus.</p>',
'copy_last_34' => '<p><b>Wichtig:</b><br>Läuft Deine Mitgliedschaft aus, wird Dein Berater-Account pausiert. Es werden Dir dann keine Punkte und keine Provisionen mehr gutgeschrieben. Bereits erarbeitete, noch offene Provisionen zahlen wir Dir selbstverständlich im nächsten Zahlungslauf aus.</p>',
'copy_last_35' => '<p><b>Hinweis:</b><br>Auch wenn Dein Account pausiert, werden Dir vergangene bzw. noch offene Provisionen selbstverständlich im nächsten Zahlungslauf ausgezahlt.Solltest Du Deinen Account vollständig löschen wollen, dann schreibe bitte eine Email an info@mivita.care. Unser Berater-Service wird sich dann umgehend darum kümmern.</p>
<p>Wir hoffen, Dich ganz bald wieder als aktives Mitglied der MIVITA Family begrüßen zu dürfen.</p>',
'copy_last_36' => '<p><b>Hinweis:</b><br>Auch wenn Dein Account pausiert, werden Dir vergangene bzw. noch offene Provisionen selbstverständlich im nächsten Zahlungslauf ausgezahlt.Solltest Du Deinen Account vollständig löschen wollen, dann schreibe bitte eine Email an info@mivita.care. Unser Berater-Service wird sich dann umgehend darum kümmern.</p>
<p>Wir hoffen, Dich ganz bald wieder als aktives Mitglied der MIVITA Family begrüßen zu dürfen.</p>',
'copy_last_37' => '',
'subject' => 'Deine Mitgliedschaft bei mivita.care',
);
'subject' => 'Deine Mitgliedschaft bei mivita.care',
];

View file

@ -1,23 +1,12 @@
<?php
return [
'MIVITA_BUSINESS_Paket' => 'MIVITA BUSINESS package',
'abo_copy_1' => 'Decrease automatic extension and withdraw SEPA mandate.',
'abo_copy_2' => 'The next booking is on: <strong>:date </strong>',
'abo_copy_3' => 'I hereby confirm that I will delete my SEPA and deactivate the automatic extension.',
'active' => 'active',
'active_package' => 'active package',
'alert_contract_renewal' => 'To extend your consultant membership, please complete the payment for your booked MIVITA package.',
'alert_contract_renewal' => 'To extend your membership by another year, please complete the payment for your MIVITA package now.',
'booked_package' => 'booked package',
'change' => 'adjust',
'change_copy_1' => 'You can change your membership until the next contract extension, on :date.',
'change_copy_2' => 'The remaining terms remain the same; the changed package only becomes active when it is extended.',
'consultant_membership' => 'Consultant Membership',
'consultant_online_shop' => 'consultant online shop',
'contract_renewal' => 'contract extension',
'deactivate' => 'deactivate',
'details' => 'details',
'downgrade_membership_is_not_possible' => 'It is no longer possible to downgrade your advisor membership.',
'end' => 'finish',
'end_button' => 'terminate your membership here',
'end_checkbox' => 'Yes, I would like to terminate my MIVITA membership, I waive any claims against MIVITA and would like my account to be deleted!',
@ -25,9 +14,6 @@ return [
'end_copy_2' => 'By doing so, you are giving up all sorts of commissions, perks, access to the sales center, and much more. By submitting this option we will receive a message and will take care of deleting your account. This process may take a few days.',
'end_copy_3' => 'The termination and deletion of your MIVITA membership has been requested.',
'expired_on' => 'expired on',
'home_copy_SEPA_32' => 'Since you have given us a SEPA direct debit mandate, you do not need to take any further action. In accordance with this mandate, we will debit the invoice amount :price from your account on :pay_date.',
'home_copy_SEPA_33' => 'We have not yet been able to debit the invoice amount :price on :pay_date from the SEPA direct debit mandate that you gave us.',
'home_copy_SEPA_36' => 'Unfortunately, we were unable to collect the amount due for the membership fee from your specified account using a SEPA direct debit mandate.',
'home_copy_alert_31' => 'Your membership expires on :datetime',
'home_copy_alert_35' => 'Your membership expires today!',
'home_copy_alert_36' => 'Your membership expired :days days ago on :datetime!',
@ -39,22 +25,17 @@ return [
'home_copy_last_36' => 'As announced, we have paused your advisor account because you did not renew your membership in time. If you would like to benefit from the advantages and features of MIVITA again, you can reactivate your account at any time.',
'home_hl' => 'membership / annual fee',
'inactive' => 'inactive',
'info_contract_renewal' => 'Your contract will be automatically extended :days before your consultant membership expires. Once the contract has been extended, it is no longer possible to change the consultant package and you must make the payment for your membership.',
'is_no_longer_possible_to_change_package' => 'It is no longer possible to change your advisor package.',
'membership' => 'membership',
'membership_was_renewed' => 'Your contract was renewed on :date.',
'open_payment_options' => 'open payment options',
'payment_copy_1' => 'Alternatively, you now have the option of paying for your membership directly using other payment options.',
'payment_copy_2' => 'If the membership is paid before the :date, the SEPA mandate will not be executed!',
'payment_has_been_made' => 'A payment has been made.',
'renewal_is_active_membership_fee_automatic' => 'Your automatic extension is active, we will automatically collect your membership fee via SEPA mandate on <strong>:date</strong>.',
'status' => 'status',
'until' => 'until',
'upgrade' => 'upgrade',
'upgrade_copy_1' => 'Expand your membership to the MIVITA BUSINESS package now!',
'upgrade_copy_2' => 'The remaining months until the consultant membership extension are calculated. The MIVITA BUSINESS package price will then be calculated annually.',
'upgrade_package_and_proceed_payment' => 'You have the option to upgrade your package, simply select the upgraded package and proceed to payment.',
'we_do_not_collect_membership_fee' => 'We were unable to automatically collect your membership fee via SEPA mandate on <strong>:date</strong>.',
'your_booked_package' => 'your booked package',
'' => '',
'renewal_hl' => 'Extend membership',
'renewal_info' => 'Your membership expires on :datetime. As soon as we have received your payment, it will be extended by another year. There is no automatic extension.',
'renewal_expired_info' => 'Your membership expired on :datetime and your consultant account is paused. As soon as we have received your payment, we will reactivate it for another year straight away.',
'renewal_consequence' => 'Without payment your membership simply expires: from then on you will no longer be credited with any points or commissions. Commissions you have already earned and that are still outstanding will of course be paid out to you in the next payment run.',
'active_info' => 'Your membership is active until :datetime. From :renewal_date you can extend it here for another year.',
'renewal_possible_from' => 'Extension possible from',
];

View file

@ -2,25 +2,16 @@
return [
'button_31' => 'RENEW MEMBERSHIP',
'button_32' => 'MANAGE MEMBERSHIP',
'button_33' => 'RENEW MEMBERSHIP',
'button_34' => 'RENEW MEMBERSHIP',
'button_35' => 'MANAGE MEMBERSHIP',
'button_36' => 'MANAGE MEMBERSHIP',
'button_37' => 'MANAGE MEMBERSHIP',
'copy_first_31' => '<p>We wanted to let you know in good time that your membership will expire at :datetime. Therefore, you should take action now and extend it in good time so that you can continue to</p> <ul> <li>purchase products from MIVITA</li> <li>Customers can purchase via your online shop (optional)</li> <li >You can participate in sales partner sales</li> </ul> <p>But all is well - you still have a few relaxing :days days left to extend your membership. However, if you let the deadline pass, your account will be automatically paused until you renew your membership.</p> <p>We\'ll send you another reminder very soon, but you\'ll have it in the back of your mind for now. If you would like to extend your connection by 1 year now, you can do so by clicking on the button below. What\'s gone is gone :) ...</p>',
'copy_first_32' => '<p>We wanted to let you know in good time that your membership will be automatically extended at :datetime. Since you have given us a SEPA direct debit mandate, you do not need to take any further action. In accordance with this mandate, we will debit the invoice amount :price from your account on :pay_date.</p> <p>Your membership will then be extended for another year so that you can continue to use</p> <ul> <li>products from You can get MIVITA</li> <li>Customers can shop through your online shop (optional)</li> <li>You can participate in sales partner sales</li> </ul> <p>So far so good. However, if you want to end your membership or take a break for the time being, you can do this yourself in your member area. Simply follow the green button below.</p> <p>If you do not want to renew for the time being, your account will be paused until you renew your membership. Please note, however, that all benefits and functions, from discounted shopping to commission billing, are also paused.</p>',
'copy_first_33' => '<p>Here\'s a quick reminder that your membership expires at :datetime. Therefore, you should take action now and extend it in good time so that you can continue to </p> <ul> <li>purchase products from MIVITA</li> <li>Customers can purchase via your online shop (optional)</li> <li >You can participate in sales partner sales</li> </ul> <p>But all is well - you still have a few relaxing :days days left to extend your membership. However, if you let the deadline pass, your account will be automatically paused until you renew your membership.</p> <p>We\'ll send you another reminder very soon, but you\'ll have it in the back of your mind for now. If you would like to extend your connection by 1 year now, you can do so by clicking on the button below. What\'s gone is gone :) ...</p>',
'copy_first_34' => '<p>huiii... now it\'s time! Your membership expires in :days days, exactly on :datetime. Therefore, you should take action now and extend your membership, otherwise your account will be paused.</p> <p>If you continue to</p> <ul> <li>purchase products from MIVITA</li> <li>an online shop (optional)</li> <li>and want to participate in sales partner sales</li> </ul> <p>you should act quickly now and extend your membership:</p>',
'copy_first_35' => '<p>As announced, we have paused your advisor account because you did not renew your membership on time. If you would like to benefit from the advantages and features of MIVITA again, you can reactivate your account at any time.</p> <p>Click on the button if you would like to make changes to your membership:</p>',
'copy_first_36' => '<p>Unfortunately, we were unable to collect the amount due for the membership fee from your specified account.</p> <p>As announced, we have therefore paused your advisor account today because you are not extending your membership in time could. If you would like to benefit from the advantages and features of MIVITA again, you can reactivate your account at any time using another payment method (e.g. Paypal, credit card, SOFORT transfer or advance payment).</p> <p>To do this, simply click on the following button and make the appropriate settings in your advisor account:</p>',
'copy_first_37' => '<p>As announced, we have today arranged for :price to be collected for another year of MIVITA membership in accordance with your SEPA direct debit mandate. This invoice amount will be debited from your account in the next few days. Please note that the extension is only active after payment has been received.</p> <p>If you would like to make changes in the future, you can discontinue all functions and membership in your advisor account.</p> <p>Follow here simply click the button below:</p>',
'copy_last_35' => '<p><b>Note:</b><br>Even if your account is paused, past or outstanding commissions will of course be paid out to you in the next payment run. If you want to delete your account completely, please write an email to info @mivita.care. Our advisor service will then take care of this immediately.</p> <p>We hope to welcome you again very soon as an active member of the MIVITA Family.</p>',
'copy_last_36' => '<p><b>Note:</b><br>Even if your account is paused, past or still outstanding commissions will of course be paid out to you in the next payment run. If you want to delete your account completely, please write an email to info @mivita.care. Our advisor service will then take care of this immediately.</p> <p>We hope to welcome you again very soon as an active member of the MIVITA Family.</p>',
'subject' => 'Your membership at mivita.care',
'copy_last_31' => '',
'copy_last_32' => '',
'copy_last_33' => '',
'copy_last_34' => '',
'copy_last_37' => '',
'copy_last_31' => '<p><b>Important:</b><br>If your membership expires, your consultant account will be paused. From then on you will no longer be credited with any points or commissions. Commissions you have already earned and that are still outstanding will of course be paid out to you in the next payment run.</p>',
'copy_last_33' => '<p><b>Important:</b><br>If your membership expires, your consultant account will be paused. From then on you will no longer be credited with any points or commissions. Commissions you have already earned and that are still outstanding will of course be paid out to you in the next payment run.</p>',
'copy_last_34' => '<p><b>Important:</b><br>If your membership expires, your consultant account will be paused. From then on you will no longer be credited with any points or commissions. Commissions you have already earned and that are still outstanding will of course be paid out to you in the next payment run.</p>',
];

View file

@ -1,23 +1,12 @@
<?php
return [
'MIVITA_BUSINESS_Paket' => 'paquete MIVITA EMPRESARIAL',
'abo_copy_1' => 'Disminuir la prórroga automática y retirar el mandato SEPA.',
'abo_copy_2' => 'La próxima reserva es el: <strong>:fecha </strong>',
'abo_copy_3' => 'Por la presente confirmo que eliminaré mi SEPA y desactivaré la extensión automática.',
'active' => 'activo',
'active_package' => 'paquete activo',
'alert_contract_renewal' => 'Para ampliar su afiliación como consultor, complete el pago de su paquete MIVITA reservado.',
'alert_contract_renewal' => 'Para ampliar tu afiliación un año más, realiza ahora el pago de tu paquete MIVITA.',
'booked_package' => 'paquete reservado',
'change' => 'ajustar',
'change_copy_1' => 'Puedes cambiar tu membresía hasta la próxima extensión de contrato, el :date.',
'change_copy_2' => 'Los términos restantes siguen siendo los mismos; el paquete modificado sólo se activa cuando se amplía.',
'consultant_membership' => 'membresía consultora',
'consultant_online_shop' => 'tienda online de consultores.',
'contract_renewal' => 'extension de contrato',
'deactivate' => 'desactivar',
'details' => 'detalles',
'downgrade_membership_is_not_possible' => 'Ya no es posible bajar de categoría su membresía de asesor.',
'end' => 'finalizar',
'end_button' => 'cancele su membresía aquí',
'end_checkbox' => 'Sí, me gustaría cancelar mi membresía de MIVITA, renuncio a cualquier reclamo contra MIVITA y me gustaría que se elimine mi cuenta.',
@ -25,9 +14,6 @@ return [
'end_copy_2' => 'Al hacerlo, estás renunciando a todo tipo de comisiones, beneficios, acceso al centro de ventas y mucho más. Al enviar esta opción recibiremos un mensaje y nos encargaremos de eliminar tu cuenta. Este proceso puede tardar unos días.',
'end_copy_3' => 'Se ha solicitado la terminación y eliminación de su membresía MIVITA.',
'expired_on' => 'expirado el',
'home_copy_SEPA_32' => 'Dado que nos ha otorgado un mandato de domiciliación bancaria SEPA, no necesita realizar ninguna acción adicional. De acuerdo con este mandato, debitaremos el importe de la factura :price de su cuenta el :pay_date.',
'home_copy_SEPA_33' => 'Von Deinem SEPA-Lastschrift-Mandat, das du uns erteilt hast, konnten wir bisher den Rechnungsbetrag :price am :pay_date nicht abbuchen.',
'home_copy_SEPA_36' => 'Lamentablemente, no pudimos cobrar el importe adeudado por la cuota de membresía de su cuenta especificada mediante un mandato de débito directo SEPA.',
'home_copy_alert_31' => 'Su membresía vence el :datetime',
'home_copy_alert_35' => '¡Tu membresía vence hoy!',
'home_copy_alert_36' => '¡Su membresía expiró hace :días días el :datetime!',
@ -39,22 +25,17 @@ return [
'home_copy_last_36' => 'Como lo anunciamos, hemos pausado su cuenta de asesor porque no renovó su membresía a tiempo. Si deseas volver a beneficiarte de las ventajas y características de MIVITA, puedes reactivar tu cuenta en cualquier momento.',
'home_hl' => 'membresía / cuota anual',
'inactive' => 'inactivo',
'info_contract_renewal' => 'Su contrato se renovará automáticamente :días antes de que expire su afiliación como consultor. Una vez prorrogado el contrato, ya no será posible cambiar el paquete de consultor y deberá abonar su afiliación.',
'is_no_longer_possible_to_change_package' => 'Ya no es posible cambiar su paquete de asesor.',
'membership' => 'membresía',
'membership_was_renewed' => 'Su contrato se prorrogó en :date.',
'open_payment_options' => 'abrir opciones de pago',
'payment_copy_1' => 'Alternativamente, ahora tiene la opción de pagar su membresía directamente utilizando otras opciones de pago.',
'payment_copy_2' => 'Si la membresía se paga antes de la :date, ¡el mandato SEPA no se ejecutará!',
'payment_has_been_made' => 'Se ha realizado un pago.',
'renewal_is_active_membership_fee_automatic' => 'Su extensión automática está activa, cobraremos automáticamente su cuota de membresía a través del mandato SEPA el <strong>:fecha</strong>.',
'status' => 'estado',
'until' => 'hasta',
'upgrade' => 'mejora',
'upgrade_copy_1' => '¡Amplía tu membresía al paquete MIVITA BUSINESS ahora!',
'upgrade_copy_2' => 'Se calculan los meses restantes hasta la prórroga de la membresía del consultor. El precio del paquete MIVITA BUSINESS se calculará anualmente.',
'upgrade_package_and_proceed_payment' => 'Tiene la opción de actualizar su paquete, simplemente seleccione el paquete actualizado y proceda al pago.',
'we_do_not_collect_membership_fee' => 'No pudimos cobrar automáticamente su cuota de membresía a través del mandato SEPA el <strong>: fecha</strong>.',
'your_booked_package' => 'tu paquete reservado',
'' => '',
'renewal_hl' => 'Ampliar la afiliación',
'renewal_info' => 'Tu afiliación caduca el :datetime. En cuanto recibamos tu pago, se ampliará un año más. No existe una renovación automática.',
'renewal_expired_info' => 'Tu afiliación caducó el :datetime y tu cuenta de asesor está en pausa. En cuanto recibamos tu pago, la reactivaremos de inmediato por un año más.',
'renewal_consequence' => 'Sin pago tu afiliación simplemente caduca: a partir de ese momento ya no se te abonarán puntos ni comisiones. Las comisiones ya generadas y aún pendientes se te pagarán, por supuesto, en la siguiente ejecución de pago.',
'active_info' => 'Tu afiliación está activa hasta el :datetime. A partir del :renewal_date puedes ampliarla aquí por un año más.',
'renewal_possible_from' => 'Ampliación posible a partir del',
];

View file

@ -2,25 +2,16 @@
return [
'button_31' => 'RENOVAR MEMBRESIA',
'button_32' => 'GESTIONAR MEMBRESÍA',
'button_33' => 'RENOVAR MEMBRESIA',
'button_34' => 'RENOVAR MEMBRESIA',
'button_35' => 'GESTIONAR MEMBRESÍA',
'button_36' => 'GESTIONAR MEMBRESÍA',
'button_37' => 'GESTIONAR MEMBRESÍA',
'copy_first_31' => '<p>Queríamos informarle a tiempo que su membresía caducará en :datetime. Por lo tanto, debes tomar medidas ahora y ampliarlo a su debido tiempo para que puedas seguir</p> <ul> <li>comprando productos de MIVITA</li> productos de MIVITA</li> <li>Los clientes pueden comprar a través de tu tienda online (opcional)</li> <li >Puedes participar en ventas de socios de ventas</li> </ul> <p>Pero todo está bien: todavía te quedan algunos días relajantes para ampliar tu membresía. Sin embargo, si deja pasar la fecha límite, su cuenta se pausará automáticamente hasta que renueve su membresía.</p> <p>Le enviaremos otro recordatorio muy pronto, pero lo tendrá en mente. por ahora. Si desea extender su conexión por 1 año ahora, puede hacerlo haciendo clic en el botón a continuación. Lo que se fue, se fue :) ...</p>',
'copy_first_32' => '<p>Queríamos informarle a tiempo que su membresía se extenderá automáticamente a las :datetime. Dado que nos ha otorgado un mandato de domiciliación bancaria SEPA, no necesita realizar ninguna acción adicional. De acuerdo con este mandato, debitaremos el monto de la factura :price de su cuenta el :pay_date.</p> <p>Su membresía se extenderá por otro año para que pueda continuar usándola</p> <ul > <li>productos de Puedes conseguir MIVITA</li> <li>Los clientes pueden comprar a través de tu tienda online (opcional)</li> <li>Puedes participar en las ventas de socios comerciales</li> </ul> < p>Hasta ahora todo bien. Sin embargo, si desea cancelar su membresía o tomar un descanso por el momento, puede hacerlo usted mismo en su área de miembros. Simplemente siga el botón verde a continuación.</p> <p>Si no desea renovar por el momento, su cuenta se pausará hasta que renueve su membresía. Sin embargo, tenga en cuenta que todos los beneficios y funciones, desde compras con descuento hasta facturación de comisiones, también están pausados.</p>',
'copy_first_33' => '<p>Aquí le recordamos rápidamente que su membresía vence en :datetime. Por lo tanto, debes tomar medidas ahora y ampliarlo a su debido tiempo para que puedas seguir </p> <ul> <li>comprando productos de MIVITA</li> <li>Los clientes pueden comprar a través de tu tienda online (opcional)</li> <li >Puedes participar en ventas de socios de ventas</li> </ul> <p>Pero todo está bien: todavía te quedan algunos días relajantes para ampliar tu membresía. Sin embargo, si deja pasar la fecha límite, su cuenta se pausará automáticamente hasta que renueve su membresía.</p> <p>Le enviaremos otro recordatorio muy pronto, pero lo tendrá en mente. por ahora. Si desea extender su conexión por 1 año ahora, puede hacerlo haciendo clic en el botón a continuación. Lo que se fue, se fue :) ...</p>',
'copy_first_34' => '<p>huiii... ¡ahora es el momento! Su membresía vence en :days días, exactamente el :datetime. Por lo tanto, debe tomar medidas ahora y ampliar su membresía; de lo contrario, su cuenta se pausará.</p> <p>Si continúa</p> <ul> <li>comprando productos de MIVITA</li> <li >una tienda en línea (opcional)</li> <li>y desea participar en las ventas de socios de ventas</li> </ul> <p>debe actuar rápidamente ahora y ampliar su membresía:</p>',
'copy_first_35' => '<p>Como lo anunciamos, hemos pausado su cuenta de asesor porque no renovó su membresía a tiempo. Si deseas volver a beneficiarte de las ventajas y características de MIVITA, puedes reactivar tu cuenta en cualquier momento.</p> <p>Haz clic en el botón si deseas realizar cambios en tu membresía:</p>',
'copy_first_36' => '<p>Desafortunadamente, no pudimos cobrar el monto adeudado por la cuota de membresía de su cuenta especificada.</p> <p>Como anunciamos, hoy hemos pausado su cuenta de asesor porque no va a extender su membresía a tiempo. . Si deseas volver a beneficiarte de las ventajas y características de MIVITA, puedes reactivar tu cuenta en cualquier momento utilizando otro método de pago (por ejemplo, Paypal, tarjeta de crédito, transferencia SOFORT o pago anticipado).</p> <p>Para hacer Para ello, simplemente haga clic en el siguiente botón y realice las configuraciones apropiadas en su cuenta de asesor:</p>',
'copy_first_37' => '<p>Como anunciamos, hoy hemos acordado que se cobre el precio por otro año de membresía en MIVITA de acuerdo con su mandato de débito directo SEPA. El importe de esta factura se debitará de su cuenta en los próximos días. Tenga en cuenta que la extensión solo está activa después de que se haya recibido el pago.</p> <p>Si desea realizar cambios en el futuro, puede suspender todas las funciones y la membresía en su cuenta de asesor.</p> <p >Sigue aquí simplemente haz clic en el botón de abajo:</p>',
'copy_last_35' => '<p><b>Nota:</b><br>Incluso si su cuenta está pausada, las comisiones pasadas o pendientes, por supuesto, se le pagarán en la siguiente ejecución de pago. Si desea eliminar su cuenta por completo, por favor escribe un correo electrónico a info@mivita.care. Nuestro servicio de asesoría se encargará de esto inmediatamente.</p> <p>Esperamos darle la bienvenida nuevamente muy pronto como miembro activo de la Familia MIVITA.</p>',
'copy_last_36' => '<p><b>Nota:</b><br>Incluso si su cuenta está pausada, las comisiones pasadas o pendientes, por supuesto, se le pagarán en la siguiente ejecución de pago. Si desea eliminar su cuenta por completo, por favor escribe un correo electrónico a info@mivita.care. Nuestro servicio de asesoría se encargará de esto inmediatamente.</p> <p>Esperamos darle la bienvenida nuevamente muy pronto como miembro activo de la Familia MIVITA.</p>',
'subject' => 'Tu membresía en mivita.care',
'copy_last_31' => '',
'copy_last_32' => '',
'copy_last_33' => '',
'copy_last_34' => '',
'copy_last_37' => '',
'copy_last_31' => '<p><b>Importante:</b><br>Si tu afiliación caduca, tu cuenta de asesor quedará en pausa. A partir de ese momento ya no se te abonarán puntos ni comisiones. Las comisiones ya generadas y aún pendientes se te pagarán, por supuesto, en la siguiente ejecución de pago.</p>',
'copy_last_33' => '<p><b>Importante:</b><br>Si tu afiliación caduca, tu cuenta de asesor quedará en pausa. A partir de ese momento ya no se te abonarán puntos ni comisiones. Las comisiones ya generadas y aún pendientes se te pagarán, por supuesto, en la siguiente ejecución de pago.</p>',
'copy_last_34' => '<p><b>Importante:</b><br>Si tu afiliación caduca, tu cuenta de asesor quedará en pausa. A partir de ese momento ya no se te abonarán puntos ni comisiones. Las comisiones ya generadas y aún pendientes se te pagarán, por supuesto, en la siguiente ejecución de pago.</p>',
];

View file

@ -2,22 +2,11 @@
return [
'' => '',
'MIVITA_BUSINESS_Paket' => 'Package MIVITA BUSINESS',
'abo_copy_1' => 'Désactiver le renouvellement automatique et révoquer le mandat SEPA.',
'abo_copy_2' => 'Le prochain prélèvement aura lieu le : <strong> :date </strong>',
'abo_copy_3' => 'Je confirme la suppression de mon SEPA et la désactivation du renouvellement automatique.',
'active' => 'actif',
'active_package' => 'package actif',
'booked_package' => 'package réservé',
'change' => 'adapter',
'change_copy_1' => 'Vous pouvez modifier votre adhésion jusqu’au prochain renouvellement du contrat, le :date.',
'change_copy_2' => 'Les durées restantes sont conservées ; le package modifié ne devient actif qu’au renouvellement.',
'consultant_membership' => 'Adhésion conseiller',
'consultant_online_shop' => 'Boutique en ligne conseiller',
'contract_renewal' => 'Renouvellement du contrat',
'deactivate' => 'désactiver',
'details' => 'Détails',
'downgrade_membership_is_not_possible' => 'Un déclassement de votre adhésion conseiller n’est plus possible.',
'end' => 'terminer',
'end_button' => 'Terminer l’adhésion ici',
'end_checkbox' => 'Oui, je souhaite mettre fin à l’adhésion MIVITA, je renonce à toute réclamation envers MIVITA et souhaite que mon compte soit supprimé !',
@ -25,9 +14,6 @@ return [
'end_copy_2' => 'Vous renoncez ainsi à toutes les commissions possibles, avantages, accès au Salescenter et bien plus encore. En envoyant cette option, nous recevons un message et nous occupons de la suppression de votre compte. Cette opération peut prendre quelques jours.',
'end_copy_3' => 'La résiliation et suppression de votre adhésion MIVITA a été demandée.',
'expired_on' => 'expiré le',
'home_copy_SEPA_32' => 'Comme vous nous avez accordé un mandat de prélèvement SEPA, vous n’avez rien d’autre à faire. Conformément à ce mandat, nous prélèverons le montant de la facture :price le :pay_date sur votre compte.',
'home_copy_SEPA_33' => 'Le montant de facture :price du :pay_date n’a pas encore pu être prélevé sur votre compte via le mandat SEPA que vous nous avez accordé.',
'home_copy_SEPA_36' => 'Malheureusement, nous n’avons pas pu prélever le montant dû de la cotisation par mandat SEPA sur le compte indiqué.',
'home_copy_alert_31' => 'Votre adhésion expire le :datetime',
'home_copy_alert_35' => 'Votre adhésion expire aujourd’hui !',
'home_copy_alert_36' => 'Votre adhésion a expiré il y a :days jours, le :datetime !',
@ -39,22 +25,17 @@ return [
'home_copy_last_36' => 'Comme annoncé, nous avons mis votre compte conseiller en pause car vous n’avez pas renouvelé votre adhésion à temps. Si vous souhaitez profiter à nouveau des avantages et fonctionnalités de MIVITA, vous pouvez réactiver votre compte à tout moment.',
'home_hl' => 'Adhésion / cotisation annuelle',
'inactive' => 'inactif',
'is_no_longer_possible_to_change_package' => 'Il n’est plus possible de modifier votre package conseiller.',
'membership' => 'Adhésion',
'membership_was_renewed' => 'Votre contrat a été renouvelé le :date.',
'open_payment_options' => 'Ouvrir les options de paiement',
'payment_copy_1' => 'Vous avez également la possibilité de payer maintenant directement votre adhésion avec d’autres modes de paiement.',
'payment_copy_2' => 'Si l’adhésion est payée avant le :date, le mandat SEPA ne sera pas exécuté !',
'payment_has_been_made' => 'Un paiement a été effectué.',
'renewal_is_active_membership_fee_automatic' => 'Votre renouvellement automatique est actif ; nous prélèverons automatiquement votre cotisation par mandat SEPA le <strong>:date</strong>.',
'status' => 'Statut',
'until' => 'jusqu’au',
'upgrade' => 'Upgrade',
'upgrade_copy_1' => 'Passez maintenant votre adhésion au package MIVITA BUSINESS !',
'upgrade_copy_2' => 'Les mois restants jusqu’au renouvellement de l’adhésion conseiller sont calculés. Ensuite, le prix du package MIVITA BUSINESS sera facturé annuellement.',
'upgrade_package_and_proceed_payment' => 'Vous pouvez upgrader votre package : sélectionnez simplement le package étendu et passez au paiement.',
'we_do_not_collect_membership_fee' => 'Nous n’avons <strong>pas</strong> pu prélever automatiquement votre cotisation le <strong>:date</strong> par mandat SEPA.',
'your_booked_package' => 'Votre package réservé',
'info_contract_renewal' => 'Votre contrat est automatiquement renouvelé :days jours avant l’expiration de votre adhésion conseiller. Après le renouvellement, il n’est plus possible de modifier le package conseiller et vous devez effectuer le paiement de votre adhésion.',
'alert_contract_renewal' => 'Pour renouveler votre adhésion conseiller, veuillez effectuer le paiement de votre package MIVITA réservé.',
'alert_contract_renewal' => 'Pour renouveler votre adhésion d’une année supplémentaire, veuillez effectuer dès maintenant le paiement de votre package MIVITA.',
'renewal_hl' => 'Renouveler l’adhésion',
'renewal_info' => 'Votre adhésion expire le :datetime. Dès que nous aurons reçu votre paiement, elle sera prolongée d’une année supplémentaire. Il n’y a pas de renouvellement automatique.',
'renewal_expired_info' => 'Votre adhésion a expiré le :datetime et votre compte conseiller est en pause. Dès que nous aurons reçu votre paiement, nous le réactiverons immédiatement pour une année.',
'renewal_consequence' => 'Sans paiement, votre adhésion expire tout simplement : aucun point ni aucune commission ne vous seront alors plus crédités. Les commissions déjà acquises et encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement.',
'active_info' => 'Votre adhésion est active jusqu’au :datetime. À partir du :renewal_date, vous pouvez la renouveler ici pour une année supplémentaire.',
'renewal_possible_from' => 'Renouvellement possible à partir du',
];

View file

@ -2,12 +2,9 @@
return [
'button_31' => 'RENOUVELER L’ADHÉSION',
'button_32' => 'GÉRER L’ADHÉSION',
'button_33' => 'RENOUVELER L’ADHÉSION',
'button_34' => 'RENOUVELER L’ADHÉSION',
'button_35' => 'GÉRER L’ADHÉSION',
'button_36' => 'GÉRER L’ADHÉSION',
'button_37' => 'GÉRER L’ADHÉSION',
'copy_first_31' => '<p>nous voulions vous informer à temps que votre adhésion expire le :datetime. Vous devriez donc agir maintenant et la renouveler à temps afin de continuer à</p>
<ul>
<li>commander des produits MIVITA</li>
@ -16,15 +13,6 @@ return [
</ul>
<p>Pas d’inquiétude : il vous reste encore :days jours pour renouveler votre adhésion. Si vous laissez toutefois passer ce délai, votre compte sera automatiquement mis en pause jusqu’à ce que vous renouveliez votre adhésion.</p>
<p>Nous vous enverrons bientôt un autre rappel, mais vous l’avez déjà en tête. Si vous souhaitez prolonger dès maintenant pour une année supplémentaire, cliquez sur le bouton ci-dessous.</p>',
'copy_first_32' => '<p>nous voulions vous informer à temps que votre adhésion sera automatiquement renouvelée le :datetime. Comme vous nous avez accordé un mandat de prélèvement SEPA, vous n’avez rien d’autre à faire. Conformément à ce mandat, nous prélèverons le montant de la facture :price le :pay_date sur votre compte.</p>
<p>Votre adhésion sera ensuite prolongée d’une année supplémentaire afin que vous puissiez continuer à</p>
<ul>
<li>commander des produits MIVITA</li>
<li>permettre à vos clients d’acheter via votre boutique en ligne (optionnel)</li>
<li>participer aux chiffres d’affaires des partenaires commerciaux</li>
</ul>
<p>Si vous souhaitez toutefois mettre fin à l’adhésion ou la suspendre pour l’instant, vous pouvez le régler vous-même dans votre espace membre. Suivez simplement le bouton vert ci-dessous.</p>
<p>Si vous ne souhaitez pas renouveler pour le moment, votre compte sera mis en pause jusqu’à ce que vous renouveliez votre adhésion. Veuillez noter que tous les avantages et fonctions, de l’achat à prix réduit jusqu’au décompte des commissions, seront également mis en pause.</p>',
'copy_first_33' => '<p>voici un bref rappel : votre adhésion expire le :datetime. Vous devriez donc agir maintenant et la renouveler à temps afin de continuer à</p>
<ul>
<li>commander des produits MIVITA</li>
@ -43,20 +31,10 @@ return [
<p>vous devriez agir rapidement et renouveler votre adhésion :</p>',
'copy_first_35' => '<p>comme annoncé, nous avons mis votre compte conseiller en pause car vous n’avez pas renouvelé votre adhésion à temps. Si vous souhaitez profiter à nouveau des avantages et fonctionnalités de MIVITA, vous pouvez réactiver votre compte à tout moment.</p>
<p>Cliquez sur le bouton si vous souhaitez modifier votre adhésion :</p>',
'copy_first_36' => '<p>malheureusement, nous n’avons pas pu prélever le montant dû de la cotisation sur le compte indiqué.</p>
<p>Comme annoncé, nous avons donc mis aujourd’hui votre compte conseiller en pause, car votre adhésion n’a pas pu être renouvelée à temps. Si vous souhaitez profiter à nouveau des avantages et fonctionnalités de MIVITA, vous pouvez réactiver votre compte à tout moment via un autre mode de paiement (p. ex. PayPal, carte de crédit, virement SOFORT ou paiement anticipé).</p>
<p>Cliquez simplement sur le bouton suivant et effectuez les réglages correspondants dans votre compte conseiller :</p>',
'copy_first_37' => '<p>comme annoncé, nous avons lancé aujourd’hui, conformément à votre mandat de prélèvement SEPA, le prélèvement de :price pour une année supplémentaire d’adhésion chez MIVITA. Ce montant sera débité de votre compte dans les prochains jours. Veuillez noter que le renouvellement ne devient actif qu’après réception du paiement.</p>
<p>Si vous souhaitez effectuer des modifications à l’avenir, vous pouvez régler toutes les fonctions ainsi que l’adhésion dans votre compte conseiller.</p>
<p>Suivez simplement le bouton ci-dessous :</p>',
'copy_last_31' => '',
'copy_last_32' => '',
'copy_last_33' => '',
'copy_last_34' => '',
'copy_last_31' => '<p><b>Important :</b><br>Si votre adhésion expire, votre compte conseiller sera mis en pause. Aucun point ni aucune commission ne vous seront alors plus crédités. Les commissions déjà acquises et encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement.</p>',
'copy_last_33' => '<p><b>Important :</b><br>Si votre adhésion expire, votre compte conseiller sera mis en pause. Aucun point ni aucune commission ne vous seront alors plus crédités. Les commissions déjà acquises et encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement.</p>',
'copy_last_34' => '<p><b>Important :</b><br>Si votre adhésion expire, votre compte conseiller sera mis en pause. Aucun point ni aucune commission ne vous seront alors plus crédités. Les commissions déjà acquises et encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement.</p>',
'copy_last_35' => '<p><b>Remarque :</b><br>Même si votre compte est mis en pause, les commissions passées ou encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement. Si vous souhaitez supprimer complètement votre compte, veuillez écrire un e-mail à info@mivita.care. Notre service conseiller s’en occupera rapidement.</p>
<p>Nous espérons vous revoir très bientôt comme membre actif de la famille MIVITA.</p>',
'copy_last_36' => '<p><b>Remarque :</b><br>Même si votre compte est mis en pause, les commissions passées ou encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement. Si vous souhaitez supprimer complètement votre compte, veuillez écrire un e-mail à info@mivita.care. Notre service conseiller s’en occupera rapidement.</p>
<p>Nous espérons vous revoir très bientôt comme membre actif de la famille MIVITA.</p>',
'copy_last_37' => '',
'subject' => 'Votre adhésion chez mivita.care',
];

View file

@ -17,45 +17,26 @@
@else
<h5 class="alert badge-danger">{{__('membership.home_copy_alert_36', ['days'=>$user->daysActiveAccount()*-1, 'datetime'=>$user->getPaymentAccountDateFormat()])}}</h5>
@endif
{{--
Abo Option deaktiviert @if($user->payment_account && $user->isAboOption())
{{ __('membership.home_copy_SEPA_36', ['price'=> 'von '.$user->payment_order_product->getFormattedPrice().' EUR', 'pay_date'=>Carbon::parse($user->payment_account)->modify('- '.config('mivita.abo_booking_days').' days')->format('d.m.Y')]) }}
<hr>
@endif
--}}
<p>{{__('membership.home_copy_last_36', ['days'=>$user->daysActiveAccount(), 'datetime'=>$user->getPaymentAccountDateFormat()])}}</p>
@endif
@elseif($user->daysActiveAccount() < config('mivita.remind_last_days') )
{{-- 33 --}}
{{-- 34 --}}
<h5 class="alert badge-warning">{{ __('membership.home_copy_alert_31', ['datetime'=>$user->getPaymentAccountDateFormat()]) }}</h5>
<p>{{__('membership.home_copy_last_34', ['days'=>$user->daysActiveAccount(), 'datetime'=>$user->getPaymentAccountDateFormat()])}}</p>
@elseif($user->daysActiveAccount() < config('mivita.remind_sec_days'))
{{-- 33 --}}
<h5 class="alert badge-warning">{{ __('membership.home_copy_alert_31', ['datetime'=>$user->getPaymentAccountDateFormat()]) }}</h5>
{{-- Abo Option deaktiviert
@if($user->payment_account && $user->isAboOption())
@if($user->daysActiveAccount() < config('mivita.abo_booking_days') )
<p>{{ __('membership.home_copy_SEPA_33', ['price'=> 'von '.$user->payment_order_product->getFormattedPrice().' EUR', 'pay_date'=>Carbon::parse($user->payment_account)->modify('- '.config('mivita.abo_booking_days').' days')->format('d.m.Y')]) }}</p>
@else
<p>{{ __('membership.home_copy_SEPA_32', ['price'=> 'von '.$user->payment_order_product->getFormattedPrice().' EUR', 'pay_date'=>Carbon::parse($user->payment_account)->modify('- '.config('mivita.abo_booking_days').' days')->format('d.m.Y')]) }}</p>
@endif
<hr>
@endif
--}}
<p>{{__('membership.home_copy_last_33', ['days'=>$user->daysActiveAccount()])}}</p>
@else
{{-- 32 / 31 --}}
{{-- 31 --}}
<h5 class="alert badge-default">{{ __('membership.home_copy_alert_31', ['datetime'=>$user->getPaymentAccountDateFormat()]) }}</h5>
{{-- Abo Option deaktiviert
@if($user->payment_account && $user->isAboOption())
{{ __('membership.home_copy_SEPA_32', ['price'=> 'von '.$user->payment_order_product->getFormattedPrice().' EUR', 'pay_date'=>Carbon::parse($user->payment_account)->modify('- '.config('mivita.abo_booking_days').' days')->format('d.m.Y')]) }}
<hr>
@endif
--}}
<p>{{__('membership.home_copy_last_31', ['days'=>$user->daysActiveAccount()])}}</p>
@endif
@if($user->isActiveAccount())
<p>{{ __('membership.renewal_consequence') }}</p>
@endif
</div>
<div class="card-footer py-3">
<a href="{{route('user_membership')}}" class="btn btn-info mb-3"><i class="ion ion-ios-refresh text-default mr-1"></i> {{ __('home.manage_membership_now_here') }}</a>

View file

@ -21,8 +21,6 @@
class="ion ion-ios-arrow-forward"></i>&nbsp; Buchnungen Pakete Berater nach Jahren</a>
<a href="{{ route('sysadmin_tool', ['customers']) }}" class="d-block mb-3"><i
class="ion ion-ios-arrow-forward"></i>&nbsp; Kundenhoheit prüfen</a>
<a href="{{ route('sysadmin_tool', ['cronjobs']) }}" class="d-block mb-3"><i
class="ion ion-ios-arrow-forward"></i>&nbsp; Cron Jobs</a>
<a href="{{ route('sysadmin_tool', ['shopping_orders']) }}" class="d-block mb-3"><i
class="ion ion-ios-arrow-forward"></i>&nbsp; Shopping Orders Käufe</a>
<a href="{{ route('sysadmin_tool', ['import']) }}" class="d-block mb-3"><i

View file

@ -1,39 +0,0 @@
@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 mb-4">
SysAdmin Cron Jobs
</h4>
<div class="card mb-4">
@if(count($values)>0)
<div class="card-body">
<!-- Controls -->
@foreach($values as $name=>$link)
<p>{{ $name }}</p>
<a href="{{$link}}" target="_blank">{{$link}}</a><hr><br><br>
@endforeach
</div>
@endif
</div>
@endsection

View file

@ -1,13 +0,0 @@
{{--
Abo Option deaktiviert
<hr>
<label class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" name="abo_options" @if($user && $user->isAboOption()) checked="checked" @endif>
<span class="custom-control-label secondary"><strong>{{__('payment.auto_renewal_hl')}}:</strong> {{__('payment.auto_renewal_line_1')}}</span>
<p class="text-muted">{{__('payment.auto_renewal_line_2')}}</p>
</label>
<hr>
--}}

View file

@ -1,54 +0,0 @@
<!-- Description -->
<div class="card mb-4">
<div class="card-body">
{!! Form::open(['action' => route('user_membership_store', ['change_order']), 'class' => 'form-horizontal']) !!}
<div class="table-responsive">
<table class="table table- m-0">
<tbody class="switchers-stacked">
@foreach($products as $product)
<tr>
<td class="text-center align-middle px-0">
<label class="switcher switcher-secondary">
<input type="radio" class="switcher-input" value="{{$product->id}}" name="switchers-package-wizard" @if($product->id == $user->payment_order_id) checked @endif >
<span class="switcher-indicator">
<span class="switcher-yes"></span>
<span class="switcher-no"></span>
</span>
<span class="switcher-label"></span>
</label>
</td>
<td class="p-4">
<div class="media align-items-center">
@if(count($product->images))
<img src="{{ route('product_image', [$product->images->first()->slug]) }}" class="d-block ui-w-60 ui-bordered mr-4" alt="">
@endif
<div class="media-body">
<h5 class="d-block text-dark">{{$product->getLang('name')}} @if($product->id == $user->payment_order_id) ({{ __('membership.active_package') }}) @endif</h5>
{!! $product->getLang('copy') !!}
</div>
</div>
</td>
<td class="text-right font-weight-semibold align-middle p-4">
<span class="no-line-break">{{ $product->getFormattedPriceWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country) }} €</span> /p.a.
@if(\App\Services\UserService::$user_country->currency)
<span class="no-line-break">{!! $product->getFormattedPriceCurrencyWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country) !!}</span>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="text-left mt-3">
<hr>
<button type="submit" class="btn btn-secondary">{{ __('payment.select_and_save') }}</button>&nbsp;
</div>
{!! Form::close() !!}
</div>
</div>
<!-- / Description -->

View file

@ -1,59 +0,0 @@
<!-- Description -->
<div class="card mb-4">
<div class="card-body">
{!! Form::open(['action' => route('user_membership_store', ['payment']), 'class' => 'form-horizontal']) !!}
<div class="table-responsive">
<table class="table table- m-0">
<tbody class="switchers-stacked">
@foreach($products as $product)
<tr>
<td class="text-center align-middle px-0">
<label class="switcher switcher-secondary">
<input type="radio" class="switcher-input" value="{{$product->id}}" name="switchers-package-wizard" @if($product->id == $user->payment_order_id) checked @endif >
<span class="switcher-indicator">
<span class="switcher-yes"></span>
<span class="switcher-no"></span>
</span>
<span class="switcher-label"></span>
</label>
</td>
<td class="p-4">
<div class="media align-items-center">
@if(count($product->images))
<img src="{{ route('product_image', [$product->images->first()->slug]) }}" class="d-block ui-w-60 ui-bordered mr-4" alt="">
@endif
<div class="media-body">
<h5 class="d-block text-dark">{{$product->getLang('name')}}</h5>
{!! $product->getLang('copy') !!}
</div>
</div>
</td>
<td class="text-right font-weight-semibold align-middle p-4">{{$product->getFormattedPrice()}} EUR / p.a.</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="text-left mt-3">
{{-- Abo Option deaktiviert
<hr>
<label class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" name="abo_options">
<span class="custom-control-label secondary"><strong>{{__('payment.auto_renewal_hl')}}:</strong> {{__('payment.auto_renewal_line_1')}}</span>
<p class="text-muted">{{__('payment.auto_renewal_line_2')}}</p>
</label>
<hr>
--}}
<button type="submit" class="btn btn-secondary">{{ __('payment.select_and_proceed_to_checkout') }}</button>&nbsp;
<br><br>
<em class="small text-center"> <i class="fa fa-lock"></i> {{ __('payment.checkout_ssl_server') }}</em>
</div>
{!! Form::close() !!}
</div>
</div>
<!-- / Description -->

View file

@ -29,7 +29,7 @@
<table class="table table- m-0">
<tbody class="switchers-stacked">
@foreach($products as $product)
@if($product->id === $user->payment_order_id || $product->identifier === 'show_order')
@if($product->identifier === 'show_renewal' || $product->identifier === 'show_order' || $product->id == $user->payment_order_id)
<tr>
<td class="text-center align-middle px-0">
<label class="switcher switcher-secondary">
@ -66,23 +66,6 @@
</table>
</div>
<div class="text-left mt-3">
{{-- Abo Option deaktiviert
@if(!$user->isAboOption())
<hr>
<label class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" name="abo_options">
<span class="custom-control-label secondary"><strong>{{__('payment.auto_renewal_hl')}}:</strong> {{__('payment.auto_renewal_line_1')}}</span>
<p class="text-muted">{{__('payment.auto_renewal_line_2')}}</p>
</label>
<hr>
@else
<p><strong>{{__('membership.payment_copy_1')}}</strong><br>
{!! __('membership.payment_copy_2', ['date'=> Carbon::parse($user->payment_account)->modify('-'.config('mivita.abo_booking_days').' days')->format('d.m.Y')]) !!}</p>
<hr>
@endif
--}}
<button type="submit" class="btn btn-secondary">{{ __('payment.select_and_proceed_to_checkout') }}</button>&nbsp;
<br><br>
<em class="small text-center"> <i class="fa fa-lock"></i> {{ __('payment.checkout_ssl_server') }}</em>

View file

@ -1,80 +0,0 @@
{!! Form::open(['action' => route('user_membership_store', ['upgrade_order']), 'class' => 'form-horizontal']) !!}
<div class="card mb-4">
<div class="card-body">
{!! Form::open(['action' => route('user_membership_store', ['change_order']), 'class' => 'form-horizontal']) !!}
<div class="row">
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.ordering_country') }}</div>
{{ App\Services\UserService::getOrderInfo('billing_state') }}
</div>
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.country_of_delivery') }}</div>
{{ App\Services\UserService::getOrderInfo('shipping_state') }}
</div>
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.VAT') }}</div>
{{ App\Services\UserService::getOrderInfo('tax_free') }}
</div>
<div class="col-md-3 mb-3">
<div class="text-muted small">{{ __('payment.reverse_charge_procedure') }}</div>
{{ App\Services\UserService::getOrderInfo('user_reverse_charge') }}
</div>
</div>
<input type="hidden" name="qty" value="{{$diff_months}}">
<div class="table-responsive">
<table class="table table- m-0">
<tbody class="switchers-stacked">
@foreach($upgrade as $product)
<tr>
<td class="text-center align-middle px-0">
<label class="switcher switcher-secondary">
<input type="radio" class="switcher-input" value="{{$product->id}}" name="switchers-package-wizard" checked="checked">
<span class="switcher-indicator">
<span class="switcher-yes"></span>
<span class="switcher-no"></span>
</span>
<span class="switcher-label"></span>
</label>
</td>
<td class="p-4">
<div class="media align-items-center">
@if(count($product->images))
<img src="{{ route('product_image', [$product->images->first()->slug]) }}" class="d-block ui-w-60 ui-bordered mr-4" alt="">
@endif
<div class="media-body">
<h5 class="d-block text-dark">{{$product->getLang('name')}}</h5>
{!! $product->getLang('copy') !!}
</div>
</div>
</td>
<td class="text-right font-weight-semibold align-middle p-4">
<span class="no-line-break">{{ $product->getFormattedPriceWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country) }} €</span> {{ __('payment.month') }}
@if(\App\Services\UserService::$user_country->currency)
<span class="no-line-break">{!! $product->getFormattedPriceCurrencyWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country) !!}</span>
@endif
</td>
</tr>
<tr>
<td colspan="2" class="text-right">{{ __('payment.remaining_time') }}: {{$diff_months}} @if($diff_months==1) {{ __('payment.month') }} @else {{ __('payment.Monate') }} @endif</td>
<td class="text-right font-weight-semibold"> {!! Util::formatNumber($diff_months * $product->getPriceWith(\App\Services\UserService::getTaxFree(), false, \App\Services\UserService::$user_country)) !!} EUR</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="text-left mt-3">
{{-- Abo Option deaktiviert
@include('user.membership._abo_options')
--}}
<button type="submit" class="btn btn-secondary"> {{ __('payment.select_and_proceed_to_checkout') }}</button>&nbsp;
<br><br>
<em class="small text-center"> <i class="fa fa-lock"></i> {{ __('payment.checkout_ssl_server') }}</em>
</div>
</div>
</div>
{!! Form::close() !!}

View file

@ -20,110 +20,43 @@
</h4>
<div class="row">
<div class="col order-2 order-md-1">
{{-- isRenewalAccount payment_account date - config('mivita.renewal_days') Vertragsverlängerung --}}
{{-- Verlaengerungsfenster: ab config('mivita.renewal_days') Tagen vor Ablauf ist die Zahlung moeglich.
Es gibt nur noch eine Mitgliedschaft: Zahlung eingegangen => +1 Jahr, sonst laeuft sie aus. --}}
@if($user->isRenewalAccount())
<div class="card w-100 mb-4">
<h5 class="card-header">
{!! __('membership.membership_was_renewed', ['date'=>$user->nextRenewalAccount()]) !!}
</h5>
<h5 class="card-header">{{ __('membership.renewal_hl') }}</h5>
<div class="card-body">
<p>{{ __('membership.info_contract_renewal', ['days'=>config('mivita.renewal_days')]) }}</p>
@if($user->isActiveAccount())
<p>{{ __('membership.renewal_info', ['datetime' => $user->getPaymentAccountDateFormat()]) }}</p>
@else
<p>{{ __('membership.renewal_expired_info', ['datetime' => $user->getPaymentAccountDateFormat()]) }}</p>
@endif
<p>{{ __('membership.renewal_consequence') }}</p>
@if($userHistoryPaymentOrder && $userHistoryPaymentOrder->status > 2)
<h6 class="alert badge-{{$userHistoryPaymentOrder->getStatusColor()}}">{{__('membership.payment_has_been_made') }} {{__('membership.status') }}: {{ trans('payment.status.'.$userHistoryPaymentOrder->getStatusType())}}</h6>
@else
<h6 class="alert badge-warning">{{ __('membership.alert_contract_renewal') }}</h6>
@endif
{{--
Abo Option deaktiviert
@if($user->payment_account && $user->isAboOption())
@if($user->payment_account && $user->isAboOption())
@if($user->daysActiveAccount() < config('mivita.abo_booking_days') )
<p class="alert py-2 px-2 badge-secondary">
{!! __('membership.we_do_not_collect_membership_fee', ['date'=>Carbon::parse($user->payment_account)->modify('-'.config('mivita.abo_booking_days').' days')->format('d.m.Y')]) !!}
<br>
@else
<p class="alert py-2 px-2 badge-secondary">
{!! __('membership.renewal_is_active_membership_fee_automatic', ['date'=>Carbon::parse($user->payment_account)->modify('-'.config('mivita.abo_booking_days').' days')->format('d.m.Y')]) !!}
<br>
@endif
<hr>
@endif
@else
@if($user->payment_order_id && $user->payment_order_product->identifier === 'show_upgrade')
<p></p>
@endif
@endif
--}}
@if($userHistoryPaymentOrder && $userHistoryPaymentOrder->status > 2)
<h5 class="card-header bg-light">
<a href="#" class="" data-toggle="collapse" data-target="#collapsePaymentForm" aria-expanded="false" aria-controls="collapsePaymentForm">
<a href="#" data-toggle="collapse" data-target="#collapsePaymentForm" aria-expanded="false" aria-controls="collapsePaymentForm">
<i class="fa fa-caret-expand"></i> {{ __('membership.open_payment_options') }}
</a>
</h5>
<div class="collapse" id="collapsePaymentForm">
@include('user.membership._payment_order')
</div>
@else
@include('user.membership._payment_order')
@endif
@if($user->payment_order_id)
@if($user->payment_order_product->identifier === 'show_upgrade')
<p><strong><i>{{ __('membership.downgrade_membership_is_not_possible') }}</i></strong></p>
<p><strong><i>{{ __('membership.upgrade_package_and_proceed_payment') }}</i></strong></p>
@endif
@if($user->payment_order_product->identifier === 'show_order')
<p><strong><i>{{ __('membership.is_no_longer_possible_to_change_package') }}</i></strong></p>
@endif
@else
<h6 class="alert badge-warning">{{ __('membership.alert_contract_renewal') }}</h6>
@include('user.membership._payment_order')
@endif
</div>
</div>
@else
{{-- no Shop - Upgrade --}}
@if($user->isActiveAccount() && !$user->isActiveShop())
<div class="card w-100 mb-4">
<h5 class="card-header">{{__('membership.MIVITA_BUSINESS_Paket')}} {{__('membership.upgrade')}}</h5>
<div class="card-body">
@if($userHistoryUpgradeOrder && $userHistoryUpgradeOrder->status > 2)
<h6 class="alert badge-{{$userHistoryUpgradeOrder->getStatusColor()}}">
{{__('membership.payment_has_been_made') }} {{__('membership.status') }}: {{ trans('payment.status.'.$userHistoryUpgradeOrder->getStatusType())}}</h6>
@endif
<h5 class="d-block text-dark">>{{ __('membership.upgrade_copy_1') }}</h5>
<p>{{ __('membership.upgrade_copy_2') }}</p>
@if($userHistoryUpgradeOrder && $userHistoryUpgradeOrder->status > 2)
<h5 class="card-header bg-light">
<a href="#" class="" data-toggle="collapse" data-target="#collapsePaymentForm" aria-expanded="false" aria-controls="collapsePaymentForm">
<i class="fa fa-caret-expand"></i> {{ __('Zahlungsoptionen öffnen') }}
</a>
</h5>
<div class="collapse" id="collapsePaymentForm">
@include('user.membership._upgrade')
</div>
@else
@include('user.membership._upgrade')
@endif
</div>
</div>
@endif
{{-- upgrade downgrade next booking --}}
@if($user->payment_account)
@elseif($user->payment_account && $user->isActiveAccount())
<div class="card w-100 mb-4">
<h5 class="card-header">{{__('membership.membership')}} {{__('membership.change')}}</h5>
<h5 class="card-header">{{ __('membership.renewal_hl') }}</h5>
<div class="card-body">
<h6 class="d-block text-dark">
{!! __('membership.change_copy_1', ['date'=> $user->nextRenewalAccount()]) !!}
</h6>
<p>{{__('membership.change_copy_2')}}</p>
@include('user.membership._change')
<p>{{ __('membership.active_info', ['datetime' => $user->getPaymentAccountDateFormat(), 'renewal_date' => $user->nextRenewalAccount()]) }}</p>
<p>{{ __('membership.renewal_consequence') }}</p>
</div>
</div>
@endif
@endif
@ -169,30 +102,6 @@
</div>
</div>
{{-- remove ABO Options --}}
{{--
Abo Option deaktiviert
@if($user->payment_account && $user->is())
<div class="card w-100 mb-4">
{!! Form::open(['action' => route('user_membership_store', ['remove_abo']), 'class' => 'form-horizontal']) !!}
<h5 class="card-header">{{__('payment.auto_renewal_hl')}} {{__('membership.deactivate')}}</h5>
<div class="card-body">
<p>{{__('membership.abo_copy_1')}}<br>
{!! __('membership.abo_copy_2', ['date'=> Carbon::parse($user->payment_account)->modify('-'.config('mivita.abo_booking_days').' days')->format('d.m.Y')]) !!}
</p>
<label class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" name="abo_options_remove">
<span class="custom-control-label secondary">{{__('membership.abo_copy_3')}}</span>
</label>
<button type="submit" class="btn btn-secondary btn-sm">{{__('payment.auto_renewal_hl')}} {{__('membership.deactivate')}}</button>&nbsp;
</div>
{!! Form::close() !!}
</div>
@endif
--}}
@if($user->payment_account)
<div class="card w-100 mb-4">
{!! Form::open(['action' => route('user_membership_store', ['delete_membership']), 'class' => 'form-horizontal']) !!}
@ -232,14 +141,14 @@
@endif
</div>
</li>
@if($user->payment_account && ! $user->isRenewalAccount())
<li class="list-group-item d-flex justify-content-between align-items-center">
<div class="text-muted">{{__('membership.contract_renewal')}}</div>
<div class="text-muted">{{__('membership.renewal_possible_from')}}</div>
<div class="text-right">
@if($user->payment_account)
{{ $user->nextRenewalAccount() }}
@endif
{{ $user->nextRenewalAccount() }}
</div>
</li>
@endif
<li class="list-group-item d-flex justify-content-between align-items-center">
<div class="text-muted">{{ __('membership.consultant_membership') }}</div>
<div class="text-right">
@ -294,19 +203,6 @@
</li>
@endif
@endif
{{--
Abo Option deaktiviert
<li class="list-group-item d-flex justify-content-between align-items-center">
<div class="text-muted">{{__('payment.auto_renewal_hl')}}</div>
<div class="text-right">
@if($user->isAboOption())
<span class="badge badge-pill badge-success"><i class="fa fa-check"></i> {{ __('membership.active') }}</span>
@else
<span class="badge badge-pill badge-danger"><i class="fa fa-times"></i> {{ __('membership.inactive') }}</span>
@endif
</div>
</li>
--}}
</ul>
</div>
</div>

View file

@ -10,9 +10,6 @@
/* ROUTING FOR CRM my.mivita / CMS */
Route::domain(config('app.pre_url_crm').config('app.domain').config('app.tld_care'))->group(function () {
// Route::get('/cron/jobs/action/{action}/{key}', 'CronController@action')->name('cron_jobs_action');
// Route::get('/cron/jobs/run/{key}', 'CronController@runCron')->name('cron_jobs_run');
Auth::routes();
Route::get('/logout', function () {
Auth::logout();

View file

@ -0,0 +1,83 @@
<?php
use App\Mail\MailCustomMessage;
use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Mail;
use Tests\TestCase;
uses(TestCase::class, RefreshDatabase::class);
/**
* Der Verlängerungs-Link aus der Mitgliedschafts-Erinnerung muss auf das CRM
* (my.mivita.care) zeigen. Die Route /user/membership existiert nur dort –
* auf der Hauptdomain lief der Link in einen 404.
*/
beforeEach(function () {
// Produktivähnliche Domains, sonst greift Util::isTestSystem() und es wird nichts versendet.
config([
'app.tld_care' => '.care',
'app.tld_shop' => '.shop',
'app.domain' => 'mivita',
'app.pre_url_crm' => 'my.',
'app.protocol' => 'https://',
'app.url' => 'https://mivita.care/',
]);
Mail::fake();
});
function makeReminderUser(int $daysLeft): User
{
if (! User::find(1)) {
User::forceCreate([
'id' => 1,
'email' => 'system@example.com',
'password' => bcrypt('secret'),
'lang' => 'de',
]);
}
return User::forceCreate([
'email' => 'berater-'.uniqid('', true).'@example.com',
'password' => bcrypt('secret'),
'lang' => 'de',
'active' => 1,
'blocked' => 0,
'payment_account' => now()->addDays($daysLeft),
]);
}
it('verlinkt die Mitgliedschafts-Verlängerung auf die CRM-Domain', function () {
makeReminderUser(10);
$this->artisan('payments:check-accounts')->assertSuccessful();
Mail::assertSent(MailCustomMessage::class, function (MailCustomMessage $mail) {
return str_contains($mail->render(), 'https://my.mivita.care/user/membership');
});
});
it('verlinkt nicht mehr auf die Hauptdomain', function () {
makeReminderUser(10);
$this->artisan('payments:check-accounts')->assertSuccessful();
Mail::assertSent(MailCustomMessage::class, function (MailCustomMessage $mail) {
return ! str_contains($mail->render(), 'https://mivita.care//user/membership')
&& ! str_contains($mail->render(), 'https://mivita.care/user/membership');
});
});
it('erklaert in der Erinnerung, was beim Ablauf der Mitgliedschaft passiert', function () {
makeReminderUser(10);
$this->artisan('payments:check-accounts')->assertSuccessful();
Mail::assertSent(MailCustomMessage::class, function (MailCustomMessage $mail) {
$body = $mail->render();
return str_contains($body, 'keine Punkte und keine Provisionen mehr gutgeschrieben')
&& str_contains($body, 'im nächsten Zahlungslauf aus');
});
});

View file

@ -0,0 +1,186 @@
<?php
use App\Http\Controllers\User\MembershipController;
use App\Models\Product;
use App\Models\TransProduct;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Tests\TestCase;
uses(TestCase::class, RefreshDatabase::class);
/**
* Die Verlängerung braucht ein eigenes Produkt: das Registrierungs-Produkt
* (show_order) beschreibt den Neuabschluss und passt inhaltlich nicht.
*/
function makeMembershipProduct(string $identifier, array $showOn, string $name, int $pos = 20): Product
{
$now = now();
$id = (int) DB::table('products')->insertGetId([
'name' => $name,
'title' => '12 Monate Laufzeit',
'copy' => '<p>Du kannst Dich jetzt mit der Jahresgebühr registrieren.</p>',
'identifier' => $identifier,
'active' => true,
'price' => 69.90,
'tax' => 19,
'weight' => 0,
'points' => 0,
'pos' => $pos,
'is_membership_only' => 1,
'action' => json_encode(['0', '1']),
'show_on' => json_encode($showOn),
'created_at' => $now,
'updated_at' => $now,
]);
return Product::findOrFail($id);
}
function runRenewalProductMigration(): void
{
(require base_path('database/migrations/2026_08_25_120000_create_membership_renewal_product.php'))->up();
}
function renewalProductsOfController(): Collection
{
$method = new ReflectionMethod(MembershipController::class, 'renewalProducts');
$method->setAccessible(true);
return collect($method->invoke(new MembershipController));
}
it('legt das Verlängerungs-Produkt als Kopie des Registrierungs-Produkts an', function () {
$registration = makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
$renewal = Product::where('identifier', 'show_renewal')->firstOrFail();
expect($renewal->id)->not->toBe($registration->id)
->and($renewal->name)->toBe($registration->name)
->and((float) $renewal->price)->toBe((float) $registration->price)
->and($renewal->action)->toBe($registration->action)
->and((bool) $renewal->is_membership_only)->toBeTrue()
->and($renewal->show_on)->toBe(['8'])
->and($renewal->slug)->not->toBe($registration->slug);
});
it('spricht im Verlängerungs-Text von der Verlängerung statt von der Registrierung', function () {
makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
$renewal = Product::where('identifier', 'show_renewal')->firstOrFail();
expect($renewal->copy)->toContain('verlängerst Deine MIVITA Mitgliedschaft')
->and($renewal->copy)->not->toContain('registrieren');
});
it('laesst das Registrierungs-Produkt unveraendert', function () {
$registration = makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
expect($registration->fresh()->show_on)->toBe(['7', '8'])
->and($registration->fresh()->identifier)->toBe('show_order');
});
it('legt kein zweites Verlängerungs-Produkt an', function () {
makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
runRenewalProductMigration();
expect(Product::where('identifier', 'show_renewal')->count())->toBe(1);
});
it('zeigt bei der Verlängerung nur noch das Verlängerungs-Produkt', function () {
makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
$products = renewalProductsOfController();
expect($products)->toHaveCount(1)
->and($products->first()->identifier)->toBe('show_renewal');
});
it('faellt ohne Verlängerungs-Produkt auf das Mitgliedschafts-Produkt zurueck', function () {
makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
$products = renewalProductsOfController();
expect($products)->toHaveCount(1)
->and($products->first()->identifier)->toBe('show_order');
});
it('ignoriert ein inaktives Verlängerungs-Produkt', function () {
makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
Product::where('identifier', 'show_renewal')->update(['active' => false]);
$products = renewalProductsOfController();
expect($products)->toHaveCount(1)
->and($products->first()->identifier)->toBe('show_order');
});
function runRenewalTranslationMigration(): void
{
(require base_path('database/migrations/2026_08_25_130000_translate_membership_renewal_product.php'))->up();
}
function renewalCopyIn(string $locale): string
{
app()->setLocale($locale);
return Product::where('identifier', 'show_renewal')->firstOrFail()->getLang('copy');
}
it('uebersetzt die Verlängerungs-Beschreibung in alle Sprachen', function (string $locale, string $needle) {
makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
runRenewalTranslationMigration();
expect(renewalCopyIn($locale))->toContain($needle)
->and(renewalCopyIn($locale))->not->toContain('verlängerst Deine MIVITA Mitgliedschaft');
})->with([
'en' => ['en', 'renewing your MIVITA membership'],
'es' => ['es', 'Amplías tu afiliación MIVITA'],
'fr' => ['fr', 'Vous renouvelez votre adhésion MIVITA'],
]);
it('behaelt den deutschen Text als Standard', function () {
makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
runRenewalTranslationMigration();
expect(renewalCopyIn('de'))->toContain('verlängerst Deine MIVITA Mitgliedschaft');
});
it('uebernimmt den uebersetzten Produktnamen aus dem Mitgliedschafts-Produkt', function () {
$registration = makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
TransProduct::create(['language' => 'en', 'product_id' => $registration->id, 'key' => 'name', 'value' => 'MIVITA BUSINESS package']);
runRenewalProductMigration();
runRenewalTranslationMigration();
app()->setLocale('en');
expect(Product::where('identifier', 'show_renewal')->firstOrFail()->getLang('name'))->toBe('MIVITA BUSINESS package');
});
it('ueberschreibt nachtraeglich angepasste Uebersetzungen nicht', function () {
makeMembershipProduct('show_order', ['7', '8'], 'MIVITA BUSINESS Paket');
runRenewalProductMigration();
$renewal = Product::where('identifier', 'show_renewal')->firstOrFail();
TransProduct::create(['language' => 'en', 'product_id' => $renewal->id, 'key' => 'copy', 'value' => '<p>Handmade</p>']);
runRenewalTranslationMigration();
runRenewalTranslationMigration();
expect(renewalCopyIn('en'))->toBe('<p>Handmade</p>')
->and(TransProduct::where('product_id', $renewal->id)->where('key', 'copy')->count())->toBe(3);
});

View file

@ -0,0 +1,58 @@
<?php
use Illuminate\Support\Facades\Blade;
use Tests\TestCase;
uses(TestCase::class);
/**
* Absicherung der Mitgliedschafts-Ansichten nach der Zusammenlegung auf ein Paket:
* die Templates müssen kompilieren und jeder verwendete Sprachschlüssel muss in
* allen vier Sprachen existieren.
*/
$membershipViews = [
'resources/views/user/membership/index.blade.php',
'resources/views/user/membership/_payment_order.blade.php',
'resources/views/dashboard/_reminder.blade.php',
'resources/views/dashboard/_membership.blade.php',
];
it('kompiliert die Mitgliedschafts-Templates zu gültigem PHP', function (string $view) {
$compiled = Blade::compileString(file_get_contents(base_path($view)));
$tmp = tempnam(sys_get_temp_dir(), 'blade').'.php';
file_put_contents($tmp, $compiled);
exec('php -l '.escapeshellarg($tmp).' 2>&1', $output, $exitCode);
unlink($tmp);
expect($exitCode)->toBe(0, implode("\n", $output));
})->with($membershipViews);
it('kennt jeden verwendeten Sprachschlüssel in allen Sprachen', function (string $view) {
preg_match_all(
"/__\('(membership|reminder)\.([a-zA-Z0-9_]+)'/",
file_get_contents(base_path($view)),
$matches,
PREG_SET_ORDER
);
expect($matches)->not->toBeEmpty();
foreach (['de', 'en', 'es', 'fr'] as $locale) {
foreach ($matches as [$_, $file, $key]) {
$translations = include base_path("resources/lang/$locale/$file.php");
expect(array_key_exists($key, $translations))
->toBeTrue("$locale/$file.php fehlt '$key' (aus $view)");
}
}
})->with(array_diff($membershipViews, ['resources/views/dashboard/_membership.blade.php']));
it('beschreibt nirgends mehr die abgeschaffte automatische Vertragsverlängerung', function (string $locale) {
$membership = include base_path("resources/lang/$locale/membership.php");
foreach (['info_contract_renewal', 'membership_was_renewed', 'contract_renewal', 'change_copy_1', 'change_copy_2'] as $obsolete) {
expect($membership)->not->toHaveKey($obsolete);
}
expect($membership)->toHaveKeys(['renewal_hl', 'renewal_info', 'renewal_expired_info', 'renewal_consequence', 'active_info', 'renewal_possible_from']);
})->with(['de', 'en', 'es', 'fr']);