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