HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/teamdemo.sports-crowd.com/app/Console/Commands/NotifyAcademyPayments.php
<?php

namespace App\Console\Commands;

use Carbon\Carbon;
use App\AcademyPurchase;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\NotificationsController;
use App\Http\Controllers\AcademyParameterController;

class NotifyAcademyPayments extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sportscrowd:notifyAcademyPayments';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Proceso encargado de notificar diariamente el estado de pagos en mora, pendientes por crear o vencer de todos los alumnos de la academia';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $controller = new AcademyParameterController;
        $notificationsController = new NotificationsController;

        // Validar si se envia notificación PUSH pagos vencidos
        $date = Carbon::now()->toDateString();
        if ((str_contains($controller->getParametersValue('notify_payment_due_active_service'), 'push') || str_contains($controller->getParametersValue('notify_payment_due_active_service'), 'all'))
            && $controller->validatePeriodicity($controller->getParametersValue('notify_payment_due_last_notification'), $controller->getParametersValue('notify_payment_due_periodicity'))
        ) {
            $controller->createOrUpdateParamWithValue($date, 'notify_payment_due_last_notification');
            // Listado de pagos vencidos
            $paymentsDue = AcademyPurchase::select('academy_purchases.*')->with('user', 'academy_user')
                ->join('academy_users', 'academy_users.id', '=', 'academy_purchases.academy_user_id')
                ->join('users', 'users.id', '=', 'academy_users.user_id')
                ->leftjoin('academy_states', 'academy_states.id', '=', 'academy_users.academy_state_id')
                ->leftjoin('payment_transactions', 'payment_transactions.id', '=', 'academy_purchases.payment_transaction_id')
                ->whereNull('academy_users.deleted_at')->whereNull('academy_purchases.deleted_at')->whereNull('users.deleted_at')
                ->where('academy_purchases.state', '=', 1)
                ->where('academy_states.app_components', 'LIKE', '%Botón pagos%')
                ->whereNotNull('users.pns_id')
                ->where(function ($q) {
                    $q->whereNotIn('payment_transactions.state', ['CONFIRMED'])->orWhereNull('payment_transactions.id');
                })
                ->get();
            foreach ($paymentsDue as $payment) {
                $message = $controller->replaceWildcardsMessage($controller->getParametersMessage('notify_payment_due_message'), $payment->term_type, $payment->term, $payment->academy_user->student_name . ' ' . $payment->academy_user->student_last_name, config('app.name'));
                $notificationsController->createSystemNotification($message, $payment->user->id);
            }
        }

        // Validar si se envia notificación PUSH pagos proximos a vencer
        if ((str_contains($controller->getParametersValue('notify_payment_soon_due_active_service'), 'push') || str_contains($controller->getParametersValue('notify_payment_soon_due_active_service'), 'all'))
            && $controller->validatePeriodicity($controller->getParametersValue('notify_payment_soon_due_last_notification'), $controller->getParametersValue('notify_payment_soon_due_periodicity'))
        ) {
            $controller->createOrUpdateParamWithValue($date, 'notify_payment_soon_due_last_notification');
            // Listado de pagos proximos a vencer
            $paymentsSoonDueDays = intval($controller->getParametersMessage('notify_payment_soon_due_days'));
            $paymentsSoonDue = AcademyPurchase::select('academy_purchases.*')->with('user', 'academy_user')
                ->join('academy_users', 'academy_users.id', '=', 'academy_purchases.academy_user_id')
                ->join('users', 'users.id', '=', 'academy_users.user_id')
                ->leftjoin('academy_states', 'academy_states.id', '=', 'academy_users.academy_state_id')
                ->leftjoin('payment_transactions', 'payment_transactions.id', '=', 'academy_purchases.payment_transaction_id')
                ->whereNull('academy_users.deleted_at')->whereNull('academy_purchases.deleted_at')->whereNull('users.deleted_at')
                ->where('academy_purchases.payment_due_date', '<', Carbon::now()->subDays($paymentsSoonDueDays)->toDateString())
                ->where('academy_purchases.state', '=', 0)
                ->where('academy_states.app_components', 'LIKE', '%Botón pagos%')
                ->whereNotNull('users.pns_id')
                ->where(function ($q) {
                    $q->whereNotIn('payment_transactions.state', ['CONFIRMED'])->orWhereNull('payment_transactions.id');
                })
                ->get();
            foreach ($paymentsSoonDue as $payment) {
                $message = $controller->replaceWildcardsMessage($controller->getParametersMessage('notify_payment_soon_due_message', true), $payment->term_type, $payment->term, $payment->academy_user->student_name . ' ' . $payment->academy_user->student_last_name, config('app.name'));
                $notificationsController->createSystemNotification($message, $payment->user->id);
            }
        }

        // Validar si se envia notificación PUSH pagos de inscripción pendientes de pago
        if ((str_contains($controller->getParametersValue('notify_payment_pending_enrollment_active_service'), 'push') || str_contains($controller->getParametersValue('notify_payment_pending_enrollment_active_service'), 'all'))
            && $controller->validatePeriodicity($controller->getParametersValue('notify_payment_pending_enrollment_last_notification'), $controller->getParametersValue('notify_payment_pending_enrollment_periodicity'))
        ) {
            $controller->createOrUpdateParamWithValue($date, 'notify_payment_pending_enrollment_last_notification');
            // Listado de pagos de inscripción pendientes de pago
            $paymentsPendingEnrollment = AcademyPurchase::select('academy_purchases.*')->with('user', 'academy_user')
                ->join('academy_users', 'academy_users.id', '=', 'academy_purchases.academy_user_id')
                ->join('users', 'users.id', '=', 'academy_users.user_id')
                ->leftjoin('payment_transactions', 'payment_transactions.id', '=', 'academy_purchases.payment_transaction_id')
                ->whereNull('academy_users.deleted_at')->whereNull('academy_purchases.deleted_at')->whereNull('users.deleted_at')
                ->whereIn('academy_users.academy_state_id', [5, 6, 7])          // 5,6,7 Estados de pagos Inscripción, Mensualidad o Matriculado
                ->whereNotNull('academy_purchases.enrollment_academy_price')
                ->whereNotNull('users.pns_id')
                ->where(function ($q) {
                    $q->whereNotIn('payment_transactions.state', ['CONFIRMED'])->orWhereNull('payment_transactions.id');
                })
                ->get();
            foreach ($paymentsPendingEnrollment as $payment) {
                $message = $controller->replaceWildcardsMessage($controller->getParametersMessage('notify_payment_pending_enrollment_message', true), $payment->term_type, $payment->term, $payment->academy_user->student_name . ' ' . $payment->academy_user->student_last_name, config('app.name'));
                $notificationsController->createSystemNotification($message, $payment->user->id);
            }
        }

        // Validar si se envia notificación PUSH a listado de usuarios sin programación de pagos generada aún
        if ((str_contains($controller->getParametersValue('students_without_payments_active_service'), 'push') || str_contains($controller->getParametersValue('students_without_payments_active_service'), 'all'))
            && $controller->validatePeriodicity($controller->getParametersValue('students_without_payments_last_notification'), $controller->getParametersValue('students_without_payments_periodicity'))
        ) {
            $controller->createOrUpdateParamWithValue($date, 'students_without_payments_last_notification');
            // Listado de usuarios sin programación de pagos generada aún
            $users = DB::table('academy_users as au')
                ->select('u.pns_id', 'au.student_name', 'au.student_last_name')
                ->join('users as u', 'u.id', '=', 'au.user_id')
                ->leftJoin('academy_purchases as ap', function ($join) {
                    $join->on('ap.academy_user_id', '=', 'au.id')
                        ->whereNotNull('ap.monthly_academy_price');
                })
                ->whereNull('au.deleted_at')
                ->whereNull('ap.deleted_at')
                ->whereNull('u.deleted_at')
                ->whereNull('ap.id')
                ->whereIn('au.academy_state_id', [6, 7])
                ->whereNotNull('u.pns_id')
                ->get();

            foreach ($users as $academyUser) {
                $message = $controller->replaceWildcardsMessage($controller->getParametersMessage('students_without_payments_message', true), '', '', $academyUser->student_name . ' ' . $academyUser->student_last_name, config('app.name'));
                $notificationsController->createSystemNotification($message, $payment->user->id);
            }
        }
    }
}