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/qas.sports-crowd.com/app/Console/Commands/CreateNextAcademyPayments.php
<?php

namespace App\Console\Commands;

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

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Proceso encargado de crear los pagos del siguiente mes vencido de mensualidad de academia a los responsables.';

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

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        // Proceso encargado de notificar a los responsables que ya se encuentra habilitado los pagos en el APP
        $academyController          = new AcademyController;
        $academyParameterController = new AcademyParameterController;
        $academyPurchaseController  = new AcademyPurchaseController;

        // Actualizar estado de pagos vencidos que ya han sido pagados        
        AcademyPurchase::where('academy_purchases.state', '=', 1)
            ->whereNull('academy_users.deleted_at')
            ->leftjoin('academy_users', 'academy_users.id', '=', 'academy_purchases.academy_user_id')
            ->leftjoin('payment_transactions', 'payment_transactions.id', '=', 'academy_purchases.payment_transaction_id')
            ->where(function ($q) {
                $q->whereIn('payment_transactions.state', ['CONFIRMED']);
            })->update(['academy_purchases.state' => 0]);

        // Validar si se envia notificación PUSH
        $date = Carbon::now()->toDateString();
        if ((str_contains($academyParameterController->getParametersValue('notify_payment_enable_active_service'), 'push') || str_contains($academyParameterController->getParametersValue('notify_payment_enable_active_service'), 'all'))
            && $academyParameterController->validatePeriodicity($academyParameterController->getParametersValue('notify_payment_enable_last_notification'), $academyParameterController->getParametersValue('notify_payment_enable_periodicity'))
        ) {
            $academyParameterController->createOrUpdateParamWithValue($date, 'notify_payment_enable_last_notification');
        }

        // Validar pagos vencidos para generar siguiente pago
        $paymentsToNotify = AcademyPurchase::select('academy_purchases.*')->with('user', 'academy_user', 'payment_transaction')
            ->where('academy_states.app_components', 'LIKE', '%Botón pagos%')
            ->whereDate('academy_purchases.payment_due_date', '<=', $date)
            ->whereDate('academy_purchases.payment_due_date', '>=', Carbon::now()->subMonths(3))
            ->whereNull('academy_users.deleted_at')->whereNull('academy_purchases.deleted_at')
            ->join('academy_users', 'academy_users.id', '=', 'academy_purchases.academy_user_id')
            ->leftjoin('academy_states', 'academy_states.id', '=', 'academy_users.academy_state_id')
            ->leftjoin('payment_transactions', 'payment_transactions.id', '=', 'academy_purchases.payment_transaction_id')
            ->where(function ($q) {
                $q->whereNotIn('payment_transactions.state', ['CONFIRMED'])->orWhereNull('payment_transactions.id');
            })
            ->get();
        foreach ($paymentsToNotify as $payment) {
            $academyPurchaseController->createNextPayment($payment, 'notify_payment_enable_message');

            // Se fija bandera para saber que el pago ya esta vencido
            $payment->update(['state' => 1]);
            $academyController->validatePaymentStatus($payment->academy_user_id);
        }

        // Validar usuarios sin pago de inscripción generado
        $academyPurchaseController->validateStudentsWithoutRegistrationPaymentGenerated();

        // Validar usuarios sin programación de pagos generada hasta la fecha
        $users = DB::table('academy_users as au')
            ->select(
                'u.pns_id',
                'au.id',
                'au.academy_period_id',
                'au.user_id',
                'au.student_name',
                'au.student_last_name',
                DB::raw('IFNULL(pt.payment_date, pt.updated_at) as registrationPaymentDate')
            )
            ->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');
            })
            ->leftJoin('academy_purchases as ap1', function ($join) {
                $join->on('ap1.academy_user_id', '=', 'au.id')
                    ->whereNotNull('ap1.enrollment_academy_price');
            })
            ->leftJoin('payment_transactions as pt', function ($join) {
                $join->on('pt.id', '=', 'ap1.payment_transaction_id')
                    ->where('pt.state', 'CONFIRMED');
            })
            ->whereNull('au.deleted_at')
            ->whereNull('ap.deleted_at')
            ->whereNull('ap.id')
            ->whereIn('au.academy_state_id', [6, 7])
            ->get();
        foreach ($users as $academyUser) {
            $date = Carbon::parse($academyUser->registrationPaymentDate);
            $dateValid = Carbon::now()->subDays(3);
            if ($date < $dateValid) {
                $academyPurchaseController->createPaymentSchedule(
                    $academyUser->id,
                    null,
                    $academyUser->user_id,
                    null,
                    1,
                    null,
                    false,
                    'notify_payment_enable_message'
                );
            }
        }
    }
}