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/Http/Controllers/AcademyUserPaymentController.php
<?php

namespace App\Http\Controllers;

use DB;
use \Excel;
use DataTables;
use App\Module;
use App\AcademyPurchase;
use App\AcademyPeriod;
use App\Core\Payment\Application\PaymentTransactionService;
use App\Core\Payment\PaymentStatusEnum;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\Imports\AcademyUserPaymentImport;
use App\Http\Controllers\Imports\AcademyUserPaymentTemplate;
use App\PaymentMethod;
use App\Repositories\PaymentTransactionRepository;
use Carbon\Carbon;

class AcademyUserPaymentController extends Controller implements PaymentTransactionRepository
{

    public function academyPaymentsTable($academy_user_id)
    {
        DB::statement("SET sql_mode = ''");
        $academy_payments = AcademyPurchase::select('academy_purchases.*', 'payment_methods.name AS payment_method')
            ->where('academy_user_id', $academy_user_id)
            ->with('user', 'academy_user', 'payment_transaction')
            ->leftjoin('payment_transactions', 'academy_purchases.payment_transaction_id', '=', 'payment_transactions.id')
            ->leftjoin('payment_methods', 'payment_methods.id', '=', 'payment_transactions.payment_method_id')
            ->leftjoin('gateway_payments', 'gateway_payments.id', '=', 'payment_transactions.gateway_payments_id')
            ->groupBy('academy_purchases.id')
            ->orderBy('academy_purchases.start_term', 'DESC');
        DB::statement("SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");

        return Datatables::of($academy_payments)
            ->addColumn('actions', function ($obj) {
                if ($this->validateRolePermissions('academy', 'administrator') || $this->validateRolePermissions('academy', 'supervisor')) {
                    $actions = '<i class="fa fa-pencil iconMini" onClick="clickEditPayment(' . $obj->id . ')" data-id="' . $obj->id . '" title="Editar Pago"></i>';
                    $hideDeletePayment = $obj->payment_transaction && $obj->payment_transaction->state == 'CONFIRMED' && $obj->payment_transaction->gateway_transaction_id && Auth::user()->rol_id != $this->__SUPERADMIN_ROL;
                    if (!$hideDeletePayment) {
                        $actions .= '<i class="fa fa-trash iconMini" onClick="clickDelete(' . $obj->id . ')" data-id="' . $obj->id . '" title="Eliminar"></i>';
                    }
                    if (!$obj->payment_transaction || (!$obj->payment_transaction->support && $obj->payment_transaction->state != 'CONFIRMED')) {
                        $actions .= '<i class="fa fa-money iconMini" onClick="clickPay(' . $obj->id . ')" data-id="' . $obj->id . '" title="Cargar Pago"></i>';
                    }
                    if ($obj->payment_transaction && $obj->payment_transaction->support && $obj->payment_transaction->state != 'CONFIRMED') {
                        $actions .= '<i class="fa fa-check iconMini" onClick="clickValidatePay(' . $obj->id . ')" data-id="' . $obj->id . '" title="Validar Pago"></i>';
                    }

                    // if ($obj->payment_transaction && $obj->payment_transaction->state == 'CONFIRMED' && $obj->sync_with_erp) {
                    //     $actions .= '<button type="button" class="btn btn-primary btn-xs" onClick="openCreditNote(' . $obj->id . ')"> <i class="fa fa-dollar"></i> ' . trans('messages.erp.credit_note') . '</button>';
                    // }
                    return $actions;
                } else
                    return '';
            })
            ->addColumn('pending', function ($obj) {
                if ($obj->payment_transaction && $obj->payment_transaction->support && $obj->payment_transaction->state != 'CONFIRMED') {
                    return true;
                }
                return false;
            })
            ->editColumn('state', function ($obj) {
                if ($obj->payment_transaction) {
                    return '<span class="label ' . ($obj->payment_transaction->state == 'CONFIRMED' ? 'label-success' : 'label-danger') . '">' . $obj->payment_transaction->state . '</span>';
                }
                return '';
            })
            ->editColumn('active', function ($obj) {
                $disabled = $obj->payment_transaction && $obj->payment_transaction->state == 'CONFIRMED';
                if ($disabled)
                    return '';
                else {
                    if ($this->validateRolePermissions('academy', 'administrator') || $this->validateRolePermissions('academy', 'supervisor'))
                        if ($obj->active == 0) {
                            return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chk(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" /> <span></span>' . __('messages.yes') . ' </label></div> </label> </div>';
                        } else {
                            return '<div class="switch"><label> <div class="checkbox checbox-switch switch-success"> <label>   ' . __('messages.no') . ' <input type="checkbox" onChange="chk(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" checked="" />
                            <span></span> ' . __('messages.yes') . ' </label> </div>  </label> </div>';
                        }
                    else
                        return $obj->active ? 'SI' : 'NO';
                }
            })
            ->editColumn('payment_date', function ($obj) {
                return $obj->payment_transaction && $obj->payment_transaction->state == 'CONFIRMED' ? Carbon::parse($obj->payment_transaction->payment_date)->format('Y-m-d h:i:s A') : '';
            })
            ->rawColumns(['actions', 'state', 'active', 'payment_date'])
            ->make(true);
    }

    public function indexEditUserPayment($id)
    {
        $academy_payment    = AcademyPurchase::where('id', $id)->with('user', 'academy_user', 'payment_transaction')->first();
        $allPeriodsAcademy  = AcademyPeriod::select('id', 'name')->where('active', true)->get();
        $paymentMethods     = PaymentMethod::select('id', 'name')->where('active', true)->get();
        return view('academy.payments.edit', compact('academy_payment', 'allPeriodsAcademy', 'paymentMethods'));
    }

    public function indexPayUser($id)
    {
        $academy_payment = AcademyPurchase::where('id', $id)->with('user', 'academy_user', 'payment_transaction')->first();
        $paymentMethods     = PaymentMethod::select('id', 'name')->where('active', true)->get();
        return view('academy.payments.pay', compact('academy_payment', 'paymentMethods'));
    }

    public function updatePaymentUser(Request $request)
    {
        $currentDate = Carbon::now();
        $pay = false;
        $academy_user_payment                               = AcademyPurchase::with('academy_user', 'payment_transaction')->find($request["id"]);
        $previousPayment                                    = clone $academy_user_payment;
        $previousPayment                                    = json_encode($previousPayment);
        $academy_user_payment->term_type                    = $request["term_type"];
        if ($academy_user_payment->enrollment_academy_price)
            $academy_user_payment->enrollment_academy_price = $request["price_payment"];
        else
            $academy_user_payment->monthly_academy_price    = $request["price_payment"];

        $academy_user_payment->price_discount               = $request["price_discount"];
        $academy_user_payment->discount                     = $request["discount"];
        $academy_user_payment->subtotal                     = $request["subtotal"];
        $academy_user_payment->service_charge               = $request["service_charge"];
        $academy_user_payment->price                        = $request["price"];
        $academy_user_payment->term                         = $request["term"];
        $academy_user_payment->start_term                   = $request["start_term"];
        $academy_user_payment->end_term                     = $request["end_term"];
        $academy_user_payment->payment_activation           = $request["payment_activation"];
        $academy_user_payment->payment_due_date             = $request["payment_due_date"];
        $academy_user_payment->state                        = $currentDate < Carbon::parse($request["payment_due_date"]) ? 0 : 1;

        if (isset($academy_user_payment->payment_transaction_id)) {
            if ($request["state"] == 'CONFIRMED' && $academy_user_payment->payment_transaction->state != $request["state"]) {
                $pay = true;
            }

            if ($request["state"] == 'PENDING')
                $academy_user_payment->payment_transaction->updated_at = Carbon::now()->subHours(1);
            else if ($request["state"] == 'CONFIRMED' && $academy_user_payment->payment_transaction->state != 'CONFIRMED')
                $academy_user_payment->payment_transaction->payment_date = Carbon::now();

            $academy_user_payment->payment_transaction->pin                 = $request["pin"];
            $academy_user_payment->payment_transaction->reference           = $request["reference"];
            $academy_user_payment->payment_transaction->state               = $request["state"];
            $academy_user_payment->payment_transaction->comment             = $request["comment"];
            $academy_user_payment->payment_transaction->payment_method_id   = $request["payment_method_id"];
            $academy_user_payment->payment_transaction->origin_class        = "App\Http\Controllers\AcademyUserPaymentController";
            $academy_user_payment->payment_transaction->update();
        } else {
            $paymentTransaction = PaymentTransactionService::createPendingTransaction(
                get_class($this),
                null,
                $academy_user_payment->academy_user->identification
            );

            $paymentTransaction->comment            = $request["comment"];
            $paymentTransaction->payment_method_id  = $request["payment_method_id"];

            if ($request["state"] == PaymentStatusEnum::PENDING) {
                $paymentTransaction->updated_at     = Carbon::now()->subHours(1);
            } elseif ($request["state"] == PaymentStatusEnum::CONFIRMED) {
                $paymentTransaction->state = $request["state"];
                $paymentTransaction->payment_date   = Carbon::now();
            }

            $paymentTransaction->save();

            $academy_user_payment->payment_transaction_id = $paymentTransaction->id;
        }
        $academy_user_payment->active = 1;
        $academy_user_payment->update();
        $newPurchase = AcademyPurchase::with('academy_user', 'payment_transaction')->find($request["id"]);

        $logObj = array(
            'previousPurchase'  => json_decode($previousPayment, true),
            'newPurchase'       => $newPurchase
        );
        $module = Module::where('route', 'academy')->first();
        $this->registerLog(Auth::user()->id, ($pay ? 'Aprobar Pago' : 'Editar Pago'), json_encode($logObj), "Update", $module->id);

        if ($request["state"] == 'CONFIRMED') {
            $this->finishPayment($newPurchase->payment_transaction);
        }

        $academyController = new AcademyController;
        // Validar estado de pago
        $academyController->validatePaymentStatus($academy_user_payment->academy_user_id);

        return array('r' => true, 'm' => trans('messages.academy_payments.updated_successfully'), 'data' => $newPurchase);
    }

    public function pay(Request $request)
    {
        try {
            $url = '';
            if ($request->file('support')) {
                $extension = $request->file('support')->getClientOriginalExtension();
                $filenametostore = 'payment_support_' . $request["id"] . '.' . $extension;

                Storage::disk('s3')->put(config('s3.academy') . '/academy_purchases/' . $filenametostore, fopen($request->file('support'), 'r+'), 'public');
                $url = config('filesystems.disks.s3.url') . '/academy/academy_purchases/' . $filenametostore;
            }

            if ($request["payment_date"])
                $request["payment_date"] = Carbon::parse($request["payment_date"]);

            $academy_user_payment = AcademyPurchase::with('academy_user', 'payment_transaction')->find($request["id"]);
            $previousPayment = clone $academy_user_payment;
            $previousPayment = json_encode($previousPayment);

            if (isset($academy_user_payment->payment_transaction_id)) {
                $academy_user_payment->payment_transaction->reference           = $request["reference"];
                $academy_user_payment->payment_transaction->state               = $request["state"];
                $academy_user_payment->payment_transaction->comment             = $request["comment"];
                $academy_user_payment->payment_transaction->payment_method_id   = $request["payment_method_id"];
                $academy_user_payment->payment_transaction->support             = $url;
                $academy_user_payment->payment_transaction->payment_date        = $request["payment_date"] ?? Carbon::now();
                $academy_user_payment->payment_transaction->origin_class        = "App\Http\Controllers\AcademyUserPaymentController";
                $academy_user_payment->payment_transaction->update();
            } else {
                $paymentTransaction = PaymentTransactionService::createPendingTransaction(
                    get_class($this),
                    null,
                    $academy_user_payment->academy_user->identification
                );

                $paymentTransaction->state              = $request["state"];
                $paymentTransaction->comment            = $request["comment"];
                $paymentTransaction->payment_method_id  = $request["payment_method_id"];
                $paymentTransaction->support            = $url;
                $paymentTransaction->payment_date       = $request["payment_date"] ?? Carbon::now();
                $paymentTransaction->save();

                $academy_user_payment->payment_transaction_id = $paymentTransaction->id;
                $academy_user_payment->update();

                // Recargar la relación
                $academy_user_payment->load('payment_transaction');
            }
            $academy_user_payment = AcademyPurchase::with('academy_user', 'payment_transaction')->find($request["id"]);

            $logObj = array(
                'previousPurchase'  => json_decode($previousPayment, true),
                'newPurchase'       => $academy_user_payment
            );
            $module = Module::where('route', 'academy')->first();
            $this->registerLog(Auth::user()->id, (empty($url) ? 'Aprobar Pago' : 'Cargar Pago'), json_encode($logObj), "Update", $module->id);

            if ($request["state"] == 'CONFIRMED') {
                $this->finishPayment($academy_user_payment->payment_transaction);
            }

            return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.academy_payments.updated_successfully'), "data" => $request["id"]));
        } catch (\Throwable $th) {
            return array('r' => false, 'd' => null, 'm' => $th->getMessage());
        }
    }

    public function validatePay(Request $request)
    {
        try {
            $academy_user_payment                                       = AcademyPurchase::with('academy_user', 'payment_transaction')->find($request["id"]);
            $previousPayment                                            = clone $academy_user_payment;
            $previousPayment                                            = json_encode($previousPayment);
            $academy_user_payment->payment_transaction->state           = $request["state"];
            $academy_user_payment->payment_transaction->payment_date    = $request["payment_date"] ?? Carbon::now();
            $academy_user_payment->payment_transaction->update();

            $academy_user_payment = AcademyPurchase::with('academy_user', 'payment_transaction')->find($request["id"]);

            $logObj = array(
                'previousPurchase'  => json_decode($previousPayment, true),
                'newPurchase'       => $academy_user_payment
            );
            $module = Module::where('route', 'academy')->first();
            $this->registerLog(Auth::user()->id, 'Validar Pago', json_encode($logObj), "Update", $module->id);

            if ($request["state"] == 'CONFIRMED') {
                $this->finishPayment($academy_user_payment->payment_transaction);
            }

            return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.academy_payments.updated_successfully'), "data" => $request["id"]));
        } catch (\Throwable $th) {
            return array('r' => false, 'd' => null, 'm' => $th->getMessage());
        }
    }

    public function activate(Request $request)
    {
        try {
            $purchase = AcademyPurchase::find($request['id']);
            $purchase->active = $request['state'];
            $purchase->update();

            $module = Module::where('route', 'academy')->first();
            $this->registerLog(Auth::user()->id, 'Activar Pago', json_encode($purchase), "Update", $module->id);
            return array('r' => true, 'd' => null, 'm' => __('messages.updated_successfully'));
        } catch (\Throwable $th) {
            return array('r' => false, 'd' => null, 'm' => __('messages.error_updating'));
        }
    }

    public function exportTemplate($id)
    {
        return Excel::download(new AcademyUserPaymentTemplate($id), 'PlantillaAcademiaPagos' . $id . '_' . time() . '.xlsx');
    }

    public function import(Request $request)
    {
        try {
            $file = new AcademyUserPaymentImport($request->academyUserId);
            $file->request = $request;
            Excel::import($file, $request->archivo);
            return array('r' => true, 'd' => $file->answer, 'm' => trans('messages.academy_payments.import_successfully') . ' ' . $file->edit['modificados'] . ' modificados');
        } catch (\Exception $e) {
            return array('r' => false, 'd' => null, 'm' => trans('messages.academy_payments.import_error') . $request->name_file . "  " . $e->getMessage());
        }
    }

    public function finishPayment($paymentTransaction)
    {
        $purchase = new AcademyPurchaseController;
        $purchase->finishPayment($paymentTransaction);
    }
}