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/RatingController.php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\RatingRequest;
use App\Http\Requests\LabRatingRequest;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\RatingCollection;
use App\Rating;
use App\Lab;
use App\WebSetting;
use Auth;
use DB;
use Config;
use Exception;
use Illuminate\Database\QueryException;
use Illuminate\Support\Carbon;
use Throwable;
use App\Exports\AdminRatingExport;
use Maatwebsite\Excel\Facades\Excel;
use Storage;
use PDF;
use App\Library\S3Library;
use App\LabReview;
use App\LabReviews;

class RatingController extends Controller
{
    public function index(Request $request)
    {
        try {

            /** @var object $authRole */
            $authRole = Auth::user();
            $auth_id = $authRole->id;

            $paginate = $request->count_per_page ? $request->count_per_page : 10;
            $pageNumber = $request->page ? $request->page : 1;
            $search_key = $request->search ? $request->search : '';

            $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 = Rating::with(['doctor','patient','appointment']);

            if(!empty($search_key)) {
                $list = $list->where(function($q) use($search_key) {
                    $q->whereHas('doctor',function($r) use($search_key) {
                        $r->where('first_name', 'LIKE', "%{$search_key}%");
                        $r->orWhere('last_name', 'LIKE', "%{$search_key}%");
                        $r->orWhere('passport_number', 'LIKE', "%{$search_key}%");
                    });
                    $q->orWhereHas('patient',function($r) use($search_key) {
                        $r->where('first_name', 'LIKE', "%{$search_key}%");
                        $r->orWhere('last_name', 'LIKE', "%{$search_key}%");
                        $r->orWhere('passport_number', 'LIKE', "%{$search_key}%");
                        $r->orWhere('unique_id', 'LIKE', "%{$search_key}%");
                    });
                });
            }

            if($authRole->hasRole(['clinic_admin'])) {
                $clinic_id = $authRole->clinicDetail->id;
                $list = $list->whereHas('doctor.userDetail.UserClinic', function($q) use($clinic_id) {
                    $q->where('clinic_id', $clinic_id);
                });
            }

            if($sort_by_col) {
                /**
                 * @var string $sort_by_col
                 * @var string $orderBy
                 */
                $list = $list->orderBy($sort_by_col, $orderBy);
            }

            $paginateData = $list->paginate($paginate, ['*'], 'page', $pageNumber);
            return new RatingCollection($paginateData, 200);
        } catch (Exception | Throwable | QueryException $e) {
            return self::sentResponse(200, [], $e->getMessage());
        }
    }

    public function createRating(RatingRequest $request)
    {
        $validated = $request->validated();
        try {
            //Variable declaration
            $patient_id = auth()->user()->id;
            $doctor_rating = $request->doctor_rating;
            $digimed_rating = $request->digimed_rating;
            $comment = $request->comment;
            /**
             * @var int|null $doctor_rating
             * @var int|null $digimed_rating
             * @var string|null $comment
             */
            $rating = new Rating();
            $rating->appointment_id = $request->appointment_id;
            $rating->doctor_id = $request->doctor_id;
            $rating->patient_id = $patient_id;
            $rating->doctor_rating = $doctor_rating;
            $rating->digimed_rating = $digimed_rating;
            if (! empty($comment)) {
                $rating->comment = $comment;
            }
            $rating->created_by = $patient_id;
            $rating->save();

            return self::sentResponse(200, [], __('digimed_validation.success_response.rating_updated'));
        } catch (Exception | Throwable | QueryException $e) {

            return self::sentResponse(200, [], $e->getMessage());
        }
    }

    public function adminRatingListExcel(Request $request)
    {
        try {
            $fileName = date('YmdHis').".xlsx";
            if(Config::get('filesystems.default') == "s3") {
                Excel::store(new AdminRatingExport($request), 'digimed/images/rating-excel/'.$fileName, 's3');
                $S3Library = new \App\Library\S3Library;
                $digimedFile = ($S3Library->s3Url($fileName, null, 'digimed/images/rating-excel'));
            } else {
                Excel::store(new AdminRatingExport($request),'public/images/rating-excel/'.$fileName,'local');
                $digimedFile = Storage::url('app/public/images/rating-excel/'.$fileName);
            }
            $result = [ 'url' => $digimedFile ];
            return self::sentResponse(200, $result, __('digimed_validation.success_response.data_fetch_success'));
        } catch(Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

    public function adminRatingListPdf(Request $request)
    {
        try {

            /** @var object $authRole */
            $authRole = Auth::user();
            $auth_id = $authRole->id;

            $paginate = $request->count_per_page ? $request->count_per_page : 10;
            $pageNumber = $request->page ? $request->page : 1;
            $search_key = $request->search ? $request->search : '';

            $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 = Rating::with(['doctor','patient','appointment']);

            if(!empty($search_key)) {
                $list = $list->where(function($q) use($search_key) {
                    $q->whereHas('doctor',function($r) use($search_key) {
                        $r->where('first_name', 'LIKE', "%{$search_key}%");
                        $r->orWhere('last_name', 'LIKE', "%{$search_key}%");
                        $r->orWhere('passport_number', 'LIKE', "%{$search_key}%");
                    });
                    $q->orWhereHas('patient',function($r) use($search_key) {
                        $r->where('first_name', 'LIKE', "%{$search_key}%");
                        $r->orWhere('last_name', 'LIKE', "%{$search_key}%");
                        $r->orWhere('passport_number', 'LIKE', "%{$search_key}%");
                        $r->orWhere('unique_id', 'LIKE', "%{$search_key}%");
                    });
                });
            }

            if($authRole->hasRole(['clinic_admin'])) {
                $clinic_id = $authRole->clinicDetail->id;
                $list = $list->whereHas('doctor.userDetail.UserClinic', function($q) use($clinic_id) {
                    $q->where('clinic_id', $clinic_id);
                });
            }

            if($sort_by_col) {
                /**
                 * @var string $sort_by_col
                 * @var string $orderBy
                 */
                $list = $list->orderBy($sort_by_col, $orderBy);
            }

            $list = $list->get();
            $web_settings = WebSetting::find(1);
            $contact_email = $web_settings->contact_email;
            $website = $web_settings->website;
            $file_name = 'pdf_'.date('Y-m-d H:i:s').'.pdf';
            if(Config::get('filesystems.default') == "s3") {
                $logo_image = Storage::temporaryUrl('digimed/images/assets/img/logo.svg', now()->addMinutes(30));
            } else {
                $logo_image = Storage::disk('public')->url('images/logo.png');
            }
            $list_pdf = PDF::loadView('pdf.admin_ratings_list_pdf', compact('logo_image','list','contact_email','website'));
            // echo $list_pdf->stream();
            // die;
            if(Config::get('filesystems.default') == "s3") {
                Storage::disk('s3')->put('digimed/images/rating-pdf/'.$file_name, $list_pdf->output());
            }
            else{
                Storage::put('rating-pdf/'.$file_name, $list_pdf->output());
            }
            $S3Library = new \App\Library\S3Library;
            $digimedFile = ($S3Library->s3Url($file_name, null, 'digimed/images/rating-pdf'));
            $result = [ 'url' => $digimedFile ];
            return self::sentResponse(200, $result, __('digimed_validation.success_response.data_fetch_success'));
        } catch(Exception | Throwable | QueryException $e) {
            return self::sentResponse(500, [], $e->getMessage());
        }
    }

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

    public function statusRating(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'id' => 'required|integer|exists:ratings,id',
                'status' => 'required|in:0,1'
            ]);

            $apptRating = Rating::find($validatedData['id']);

            $apptRating->rating_status = $request->status;
            $apptRating->save();

            return response()->json([
                'code' => '200',
                'message' => __('digimed_validation.success_response.rating_status_update_success'),
                'data' => $apptRating,
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'code' => '500',
                'message' => __('digimed_validation.error_response.failed_to_process_request'),
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function createLabReview(LabRatingRequest $request)
    {
        $validated = $request->validated();

        try {
            $patient_id = auth()->user()->id;
            $rating = $request->rating;
            $comment = $request->comment;

            $labReview = new LabReviews();
            $labReview->lab_id = $request->lab_id;
            $labReview->patient_id = $patient_id;
            $labReview->order_id = $request->order_id;
            $labReview->rating = $rating;
            if (isset($request->experience_rating)) {
            $labReview->experience_rating = $request->experience_rating;
            }
            $labReview->comment = $comment;
            $labReview->created_by = $patient_id;
            $labReview->save();

            return self::sentResponse(200, [], __('digimed_validation.success_response.rating_updated'));
        } catch (Exception | Throwable | QueryException $e) {

            return self::sentResponse(200, [], $e->getMessage());
        }
    }

    public function listLabReviews(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'order_by' => 'in:asc,desc',
                'count_per_page' => 'integer|min:1',
                'sort_by' => 'string|in:id,rating,created_at',
                'search' => 'string|nullable',
            ]);

            $orderBy = $validatedData['order_by'] ?? 'desc';
            $countPerPage = $validatedData['count_per_page'] ?? 10;
            $sortBy = $validatedData['sort_by'] ?? 'id';
            $search = $validatedData['search'] ?? null;

            $lab = Lab::where('user_id', auth()->user()->id)->first();
            if (!$lab) {
                return self::sentResponse(403, [], __('digimed_validation.error_response.no_lab_associated'));
            }

            $query = LabReviews::where('lab_id', $lab->id)
                                ->whereNull('deleted_at');


            if ($search) {
                $query->where(function ($query) use ($search) {
                    $query->where('id', 'like', '%' . $search . '%')
                        ->orWhere('rating', 'like', '%' . $search . '%')
                        ->orWhere('comment', 'like', '%' . $search . '%');
                });
            }

            $labReviews = $query->with([
                    'patient:id,first_name,last_name',
                ])
                ->orderBy($sortBy, $orderBy)
                ->paginate($countPerPage);

            return response()->json([
                'code' => '200',
                'message' => __('digimed_validation.success_response.lab_review_retrive_success'),
                'data' => $labReviews
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'code' => '500',
                'message' => __('digimed_validation.error_response.failed_to_retrive_lab_reviews'),
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function statusLabReview(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'id' => 'required|integer|exists:lab_reviews,id',
                'status' => 'required|in:0,1'
            ]);

            $labReview = LabReviews::find($validatedData['id']);

            $labReview->status = $request->status;
            $labReview->save();

            return response()->json([
                'code' => '200',
                'message' => __('digimed_validation.success_response.lab_review_update_success'),
                'data' => $labReview,
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'code' => '500',
                'message' => __('digimed_validation.error_response.failed_to_process_request'),
                'error' => $e->getMessage(),
            ], 500);
        }
    }

    public function deleteLabReview(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'id' => 'required|integer|exists:lab_reviews,id',
            ]);

            $labReview = LabReviews::find($validatedData['id']);

            $labReview->deleted_at = Carbon::now();
            $labReview->save();

            return response()->json([
                'code' => '200',
                'message' => __('digimed_validation.success_response.lab_review_delete_success'),
                'data' => $labReview,
            ], 200);

        } catch (\Exception $e) {
            return response()->json([
                'code' => '500',
                'message' => __('digimed_validation.error_response.failed_to_process_request'),
                'error' => $e->getMessage(),
            ], 500);
        }

    }

    public function updateLabReview(Request $request)
    {
        
        try {
            $rules = [               
                'id' => 'required|integer|exists:lab_reviews,id',
                'rating' => 'required_if:type,edit|integer',
                // 'experience_rating' => 'required_if:type,edit|integer',
                'comment' => 'required_if:type,edit|string|max:150',
                'type' => 'required|in:edit,hide',
                'status' => 'required|integer', //'required_if:type,hide|in:0,1',
            ];
            $messages = [];
            $validator = Validator::make($request->all(), $rules, $messages);

            if ($validator->fails()) {
                return self::sentResponse(422, [], $validator->errors()); 
            } 
            $validatedData = $request->validate([
               
            ]);
        
            $labReview = LabReviews::find($request->id); 
            if(!is_null($labReview)) {
                if($request->type=='hide') {
                    $labReview->status = $request->status;
                }
                else {
                    if (isset($request->experience_rating)) {
                        $labReview->experience_rating = $request->experience_rating;
                    }
                    $labReview->rating = $request->rating;
                    $labReview->comment = $request->comment;
                }
                $labReview->save(); 
                return response()->json([
                    'code' => '200',
                    'message' => __('digimed_validation.success_response.lab_review_update_success'),
                    'data' => $labReview,
                ], 200);
            }
            return response()->json([
                'code' => '200',
                'message' => __('digimed_validation.error_response.records_not_found'),
                'data' => $labReview,
            ], 200); 

        } catch (\Exception $e) {
            return response()->json([
                'code' => '500',
                'message' => __('digimed_validation.error_response.failed_to_process_request'),
                'error' => $e->getMessage(),
            ], 500);
        }

    }
}