HEX
Server: LiteSpeed
System: Linux my-kul-web2054.main-hosting.eu 5.14.0-611.13.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 11 04:57:59 EST 2025 x86_64
User: u665686179 (665686179)
PHP: 8.2.30
Disabled: system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
Upload Files
File: /home/u665686179/domains/dealkr.com/public_html/app/Http/Controllers/Web/UserLoyaltyController.php
<?php

namespace App\Http\Controllers\Web;

use App\Contracts\Repositories\LoyaltyPointTransactionRepositoryInterface;
use App\Http\Controllers\Controller;
use App\Http\Requests\Web\LoyaltyExchangeCurrencyRequest;
use App\Mail\AddFundToWallet;
use App\Models\LoyaltyPointTransaction;
use App\Traits\CustomerTrait;
use Brian2694\Toastr\Facades\Toastr;
use Carbon\Carbon;
use Exception;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class UserLoyaltyController extends Controller
{
    use CustomerTrait;

    public function __construct(private readonly LoyaltyPointTransactionRepositoryInterface $loyaltyPointTransactionRepo)
    {
    }

    public function index(Request $request): View|RedirectResponse
    {
        $loyaltyPointStatus = getWebConfig(name: 'loyalty_point_status');
        if ($loyaltyPointStatus == 1) {
            $walletStatus = getWebConfig(name: 'wallet_status');
            $totalLoyaltyPoint = auth('customer')->user()->loyalty_point;
            $loyaltyPointMinimumPoint = getWebConfig(name: 'loyalty_point_minimum_point');
            $loyaltyPointExchangeRate = getWebConfig(name: 'loyalty_point_exchange_rate');
            $transactionTypes = $this->getSelectTransactionTypes(types: $request->get('types', []));
            $loyaltyPointList = $this->getLoyaltyPointTransactionList(request: $request, types: $transactionTypes);
            $filterCount = count($transactionTypes) + (int)!empty($request['transaction_range']) + (int)!empty($request['filter_by']);

            return view(VIEW_FILE_NAMES['user_loyalty'], [
                'totalLoyaltyPoint' => $totalLoyaltyPoint,
                'loyaltyPointMinimumPoint' => $loyaltyPointMinimumPoint,
                'loyaltyPointExchangeRate' => $loyaltyPointExchangeRate,
                'loyaltyPointList' => $loyaltyPointList,
                'loyaltyPointStatus' => $loyaltyPointStatus,
                'walletStatus' => $walletStatus,
                'transactionTypes' => $transactionTypes,
                'filterCount' => $filterCount,
                'filterBy' => $request['filter_by'] ?? '',
                'transactionRange' => $request['transaction_range'] ?? '',
            ]);
        } else {
            Toastr::warning(translate('access_denied'));
            return redirect()->route('home');
        }
    }

    private function getLoyaltyPointTransactionList(object|array $request, array $types)
    {
        $startDate = '';
        $endDate = '';
        if (isset($request['transaction_range']) && !empty($request['transaction_range'])) {
            $dates = explode(' - ', $request['transaction_range']);
            if (count($dates) !== 2 || !checkDateFormatInMDY($dates[0]) || !checkDateFormatInMDY($dates[1])) {
                Toastr::error(translate('Invalid_date_range_format'));
                return back();
            }
            $startDate = Carbon::createFromFormat('d/m/Y', $dates[0])->format('Y-m-d') . ' 00:00:00';
            $endDate = Carbon::createFromFormat('d/m/Y', $dates[1])->format('Y-m-d') . ' 23:59:59';
        }
        return LoyaltyPointTransaction::where('user_id', auth('customer')->id())
            ->when($request->has('filter_by') && in_array($request['filter_by'], ['debit', 'credit']), function ($query) use ($request) {
                $query->when($request['filter_by'] == 'debit', function ($query) {
                    $query->where('debit', '!=', 0);
                })->when($request['filter_by'] == 'credit', function ($query) {
                    $query->where('debit', '=', 0);
                });
            })
            ->when(!empty($startDate) && !empty($endDate), function ($query) use ($startDate, $endDate) {
                return $query->whereBetween('created_at', [$startDate, $endDate]);
            })
            ->when(!empty($types) && !in_array('all', $types), function ($query) use ($types) {
                return $query->whereIn('transaction_type', $types);
            })
            ->latest()
            ->paginate(10)->appends(request()->query());
    }

    public function getSelectTransactionTypes($types): array
    {
        $typeMapping = [
            'all' => 'all',
            'order_place' => 'order_place',
            'point_to_wallet' => 'point_to_wallet',
            'refund_order' => 'refund_order',
        ];

        foreach ($typeMapping as $key => $value) {
            if (in_array($key, $types)) {
                $transactionTypes[] = $value;
            }
        }

        return $transactionTypes ?? [];
    }

    public function getLoyaltyExchangeCurrency(LoyaltyExchangeCurrencyRequest $request): RedirectResponse
    {
        $loyaltyPointMinimumPoint = getWebConfig(name: 'loyalty_point_minimum_point');
        if (getWebConfig(name: 'wallet_status') != 1 || getWebConfig(name: 'loyalty_point_status') != 1) {
            Toastr::warning(translate('transfer_loyalty_point_to_currency_is_not_possible_at_this_moment!'));
            return redirect()->route('home');
        }

        $user = auth('customer')->user();
        if ( $request['point'] > $user['loyalty_point'] ) {
            Toastr::warning(translate('conversion_is_limited_to_current_points_only'));
            return back();
        }

        if ( $request['point'] < (int)getWebConfig(name: 'loyalty_point_minimum_point') ) {
            Toastr::warning(translate('Oops!_You_need_more_points_to_convert_to_your_wallet_balance'));
            return back();
        }

        $walletTransaction = $this->createWalletTransaction(user_id: $user['id'], amount: $request['point'], transaction_type: 'loyalty_point', reference: 'point_to_wallet');
        $this->loyaltyPointTransactionRepo->addLoyaltyPointTransaction(userId: $user['id'], reference: $walletTransaction['transaction_id'], amount: $request['point'], transactionType: 'point_to_wallet');

        try {
            Mail::to($user['email'])->send(new AddFundToWallet($walletTransaction));
        } catch (Exception $ex) {
        }

        Toastr::success(translate('point_to_wallet_transfer_successfully'));
        return back();
    }

    public function getLoyaltyCurrencyAmount(Request $request): JsonResponse
    {
        $loyaltyPointExchangeRate = getWebConfig(name: 'loyalty_point_exchange_rate');
        $value = ((session('currency_exchange_rate') * 1) / $loyaltyPointExchangeRate) * $request['amount'];
        $amount = setCurrencySymbol(amount: $value, currencyCode: session('currency_code'), type: 'web');
        return response()->json($amount);
    }
}