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'
);
}
}
}
}