File: /var/www/vhost/disk-apps/demo.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);
}
}
}
}