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