info('COMMAND [payments:check-accounts] started.'); $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')); $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.'); foreach ($users as $user){ 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 * @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); $this->checkIsReminderSend($user, 35); return; } //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() . ')'); $this->checkIsReminderSend($user, 34); return; } //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() . ')'); $this->checkIsReminderSend($user, 33); return; } //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() . ')'); $this->checkIsReminderSend($user, 31); return; } } /** * Ü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); 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; } }