HEX
Server: nginx/1.24.0
System: Linux DGT-WORDPRESS-VM-SERVER 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 8.4.12
Disabled: NONE
Upload Files
File: /mnt/data/ghayatcom/ghayatcom-api/app/Http/Controllers/Api/CouponController.php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Coupon;
use Auth;
use Exception;
use Throwable;
use Illuminate\Database\QueryException;
use App\Library\CouponLibrary;
use App\Http\Requests\CouponStoreRequest;
use App\Http\Requests\CouponUpdateRequest;
use App\Http\Requests\CouponDeleteRequest;

class CouponController extends Controller
{
    public function index(Request $request) {
        try {
            $paginate = $request->count_per_page ? $request->count_per_page : 10;
            $pageNumber = $request->page ? $request->page : 1;
            $search_key = $request->search ? $request->search : '';
            $status = $request->status ? $request->status : '1';
            $area_specialisation = $request->area_specialisation ? $request->area_specialisation : '';
            $date = $request->date ? $request->date : '';

            $sort_by_col = (isset($request->sort_by)) ? $request->sort_by : 'id';
            $data_order_by = $request->order_by;
            /** @var string $data_order_by */
            $orderBy = $data_order_by ? strtoupper($data_order_by) : strtoupper('asc');

            $list = Coupon::with('areaSpecialisation');
            if(!empty($search_key)) {
                $list = $list->where(function($q) use($search_key) {
                    $q->where('code', 'LIKE', "%{$search_key}%");
                    $q->orWhere('name', 'LIKE', "%{$search_key}%");
                    $q->orWhere('description', 'LIKE', "%{$search_key}%");
                    $q->orWhereHas('areaSpecialisation', function($r) use($search_key) {
                        $r->where('area_specialisation_name',  'LIKE', "%{$search_key}%");
                    });
                });
            }
            if(!empty($status)) {
                $list = $list->where(function($q) use($status) {
                    $status = explode(',',$status);
                    $q->whereIn('status', $status);
                });
            }
            if(!empty($area_specialisation)) {
                $list = $list->where(function($q) use($area_specialisation) {
                    $area_specialisation = explode(',',$area_specialisation);
                    $q->whereIn('area_specialisation_id', $area_specialisation);
                });
            }
            if(!empty($date)) {
                $list = $list->where(function($q) use($date) {
                    $date = Carbon::parse($date)->format('Y-m-d');
                    $q->whereDate('valid_from', '>=', $date);
                });
            }
            if($sort_by_col) {
                /**0
                 * @var string $sort_by_col
                 * @var string $orderBy
                 */
                $list = $list->orderBy($sort_by_col, $orderBy);
            }
            return self::sentResponse(200, $list->paginate($paginate), __('digimed_validation.success_response.data_fetch_success'));
        } catch(Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function store(CouponStoreRequest $request, CouponLibrary $couponLibrary) {
        try {
            /** @var \App\User $user */
            $user = Auth::user();
            $auth_id = auth()->user()->id;

            $coupon_code = !empty($request->code) ? $request->code : '';
            $code = $couponLibrary->generateRandomCodes($coupon_code,8,'insert','');
            if($code == 'coupon_code_exceed') {
                return self::sentResponse(409, [], __('digimed_validation.error_response.coupon_code_exceed'));
            }

            $coupon = Coupon::firstOrNew(['code' => $code]);
            $coupon->area_specialisation_id = $request->area_specialisation_id;
            $coupon->value = $request->value;
            $coupon->type = $request->type;
            $coupon->name = $request->name;
            $coupon->description = $request->description;
            $coupon->valid_from = $request->valid_from;
            $coupon->valid_to = $request->valid_to;
            $coupon->status = '1';
            $coupon->created_by = $auth_id;
            $coupon->save();
            
            return self::sentResponse(200, [], __('digimed_validation.success_response.data_store_success'));
        } catch(Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function update(CouponUpdateRequest $request, CouponLibrary $couponLibrary) {
        try {
            /** @var \App\User $user */
            $user = Auth::user();
            $auth_id = auth()->user()->id;

            $coupon_code = !empty($request->code) ? $request->code : '';
            $id = $request->id;
            $code = $couponLibrary->generateRandomCodes($coupon_code,8,'update',$id);
            if($code == 'coupon_code_exceed') {
                return self::sentResponse(409, [], __('digimed_validation.error_response.coupon_code_exceed'));
            }

            $coupon = Coupon::find($id);
            $coupon->area_specialisation_id = $request->area_specialisation_id;
            $coupon->code = $code;
            $coupon->value = $request->value;
            $coupon->type = $request->type;
            $coupon->name = $request->name;
            $coupon->description = $request->description;
            $coupon->valid_from = $request->valid_from;
            $coupon->valid_to = $request->valid_to;
            $coupon->status = '1';
            $coupon->updated_by = $auth_id;
            $coupon->save();
            
            return self::sentResponse(200, [], __('digimed_validation.success_response.data_update_success'));
        } catch(Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function destroy(CouponDeleteRequest $request) {
        try {
            /** @var \App\User $user */
            $user = Auth::user();
            $auth_id = auth()->user()->id;
            $coupon = Coupon::find($request->id);
            $coupon->deleted_by = $auth_id;
            $coupon->save();
            $coupon->delete();
            return self::sentResponse(200, [], __('digimed_validation.success_response.data_delete_success'));
        } catch(Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }
}