File: /mnt/data/ghayatcom/ghayatcom-api/app/Http/Controllers/Api/RegisterController.php
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Mail\SendInvitation;
use App\Jobs\SendInvitationJob;
use App\Jobs\SendEmailNotificationJob;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Auth;
use Validator;
use App\{User,HealthProfile,InsuranceDetail,Country,DoctorDocument,UserDetails,Role,UserSettingsNotification,Pharmacy,UserPharmacy};
use DB;
use Hash;
use Storage;
use Config;
use App\UserClinic;
use App\AdminSettings;
use App\UserAreaSpecialisation;
use App\DependantAccountHolder;
use App\UserAddress;
use Twilio\Rest\Client;
use Illuminate\Http\File;
use Twilio\Exceptions\TwilioException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Http\Requests\StepMobileRequest;
use App\Http\Requests\VerifyUserRequest;
use App\Http\Requests\LoginRequest;
use App\Http\Requests\StepMobileVerifyRequest;
use App\Http\Requests\StepPasscodeRequest;
use App\Http\Requests\StepEmailRequest;
use App\Http\Requests\StepEmailVerifyRequest;
use App\Http\Requests\TwoStepChooseRequest;
use App\Http\Requests\TwoStepVerificationRequest;
use App\Http\Requests\ResendOtpRequest;
use App\Http\Requests\UpdateUserProfileRequest;
use App\Http\Requests\UpdateDoctorProfileRequest;
use App\Http\Requests\ReviewDoctorRequest;
use App\Http\Requests\ActivateAccountRequest;
use App\Http\Requests\UserIdRequest;
use App\Http\Requests\ProfileImageRequest;
use App\Http\Requests\DoctorDocumentsRequest;
use App\Http\Requests\ConsultationTypeRequest;
use App\Http\Requests\CheckForgotPasscodeRequest;
use App\Http\Requests\DependantRetrieveForManageRequest;
use App\Http\Requests\VerifyPassportRequest;
use App\Http\Requests\UpdatePharmacyUserProfileRequest;
use App\Http\Requests\UpdatePharmacyProfileRequest;
use App\Http\Requests\UpdatePharmacyAddressRequest;
use App\Http\Resources\UserResource;
use Illuminate\Support\Carbon;
use App\Helpers\GeneralHelper;
use Illuminate\Database\QueryException;
use Throwable;
use Exception;
use App\Library\RandomLibrary;
use App\Library\S3Library;
use App\Library\TwilioLibrary;
use Illuminate\Support\Str;
use App\Sumsub;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use Illuminate\Support\Facades\Crypt;
/**
* App\Http\Controllers\Api
*
* @property mixed $roles_count
*/
class RegisterController extends Controller
{
public function stepMobile(StepMobileRequest $request, RandomLibrary $randomLibrary, TwilioLibrary $TwilioLibrary) {
try {
$validated = $request->validated();
$dependant_id = $request->dependant_id;
$user_id = $request->user_id;
$data_country_code = $request->country_code;
$data_mobile_number = $request->mobile_number;
$data_type = $request->type;
/**
* @var string $data_country_code
* @var string $data_mobile_number
* @var string $data_type
*/
$country = Country::where('phone_code', $data_country_code)->first();
if(!$country) {
return self::sentResponse(200, [], __('digimed_validation.error_response.country_code_not_valid'));
}
if(!empty($user_id)) {
$user = User::find($user_id);
} else {
if($data_type == 'pharmacy_admin') {
$user = User::with('doctorDocument')->with('userDetail')->where('mobile_number', $data_mobile_number)->whereHas('roles', function($q) {
$q->where('name', 'pharmacy_admin');
$q->orWhere('name', 'pharmacy');
}
)->first();
if(!empty($user)) {
return self::sentResponse(401, [], __('digimed_validation.error_response.mobileno_in_use'));
}
} else {
$user = User::with('doctorDocument')->with('userDetail')->where('mobile_number', $data_mobile_number)->whereHas(
'roles', function($q) use ($data_type){
$q->where('name', $data_type);
}
)->first();
}
}
DB::beginTransaction();
if(!empty($user)) {
if ($dependant_id != "") {
//Dependant flow
$userDependant = User::with('doctorDocument')->with('userDetail')->find($dependant_id);
$userDependant->country_code = trim($data_country_code);
$userDependant->mobile_number = trim($data_mobile_number);
$userDependant->is_mobile_number_verified = '0';
$userDependant->country_id = $country->id;
if ($data_type == 'patient') {
/** @var string|null $column */
$column = 'unique_id';
/** @var string $forCondition */
$forCondition = 'patient';
/** @var string|null $patient_id */
$patient_id = $randomLibrary->randomPluck(NULL, new User, $column, $forCondition);
$userDependant->unique_id = $patient_id;
}
$userDependant->save();
} elseif(!empty($user_id)) {
$user->country_code = trim($data_country_code);
$user->mobile_number = trim($data_mobile_number);
$user->country_id = $country->id;
$user->save();
$user->assignRole('pharmacy');
} else {
if($user->hasRole('super_admin') || $user->hasRole('admin')) {
return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
}
}
// $user->roles()->detach();
// $user->save();
// $user->assignRole($data_type);
} else {
if($dependant_id != "") {
//Dependant flow
$userDependant = User::with('doctorDocument')->with('userDetail')->find($dependant_id);
$userDependant->country_code = trim($data_country_code);
$userDependant->mobile_number = trim($data_mobile_number);
$userDependant->is_mobile_number_verified = '0';
$userDependant->country_id = $country->id;
if ($data_type == 'patient') {
/** @var string|null $column */
$column = 'unique_id';
/** @var string $forCondition */
$forCondition = 'patient';
/** @var string|null $patient_id */
$patient_id = $randomLibrary->randomPluck(NULL, new User, $column, $forCondition);
$userDependant->unique_id = $patient_id;
}
$userDependant->save();
} else {
//Normal flow
$array['type'] = $data_type;
$array['country_code'] = trim($data_country_code);
$array['mobile_number'] = trim($data_mobile_number);
$array['is_mobile_number_verified'] = '0';
$array['country_id'] = $country->id;
if ($data_type == 'patient') {
/** @var string|null $column */
$column = 'unique_id';
/** @var string $forCondition */
$forCondition = 'patient';
/** @var string|null $patient_id */
$patient_id = $randomLibrary->randomPluck(NULL, new User, $column, $forCondition);
$array['unique_id'] = $patient_id;
}
$user = User::create($array);
$user->assignRole($data_type);
if($data_type == 'patient' || $data_type == 'doctor') {
$external_user_id = substr(md5(date('Y-m-d H:i:s')), 0, 10);
$type = strtoupper("ID_CARD");
$application_id = substr(md5(date('Y-m-d H:i:s')), 0, 15);
$file_name =Str::random(10);
$upload_id =rand(00000, 99999);
$sumsub = new Sumsub();
$sumsub->user_id = $user->id;
$sumsub->application_id = $application_id;
$sumsub->type = $type;
$sumsub->external_user_id = $external_user_id;
$sumsub->file_name = $file_name;
$sumsub->upload_id = $upload_id;
$sumsub->status = '1';
$sumsub->created_by = $user->id;
$sumsub->save();
}
$userSettings = UserSettingsNotification::create(['user_id' => $user->id]);
}
}
//OTP
$mobile_number = trim('+'.$data_country_code).trim($data_mobile_number);
$send = $TwilioLibrary->sendOtpSMS($mobile_number);
if($send!=1) {
DB::rollback();
return self::sentResponse(200, [], 'Error - '.$send);
}
DB::commit();
return new UserResource(User::find($user->id), 200);
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function stepMobileVerify(StepMobileVerifyRequest $request, TwilioLibrary $TwilioLibrary) {
try {
$validated = $request->validated();
$mobile_number_verification_code = $request->mobile_number_verification_code;
$data_mobile_number = $request->mobile_number;
$data_country_code = $request->country_code;
/**
* @var string $mobile_number_verification_code
* @var string $data_mobile_number
* @var string $data_country_code
*/
DB::beginTransaction();
$user = User::find($request->user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
$mobile_number = trim('+'.$request->country_code).trim($data_mobile_number);
$send = $TwilioLibrary->verifyOtpSMS($mobile_number,$mobile_number_verification_code);
if($send != 1) {
DB::rollback();
return self::sentResponse(200, [], 'Error - '.$send);
} else {
$user->is_mobile_number_verified = '1';
$user->updated_by = $request->user_id;
$user->save();
DB::commit();
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, __('digimed_validation.success_response.mobile_no_verified_success'));
}
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function stepPasscode(StepPasscodeRequest $request) {
try {
$validated = $request->validated();
$passcode = $request->passcode;
/** @var string $passcode */
DB::beginTransaction();
$user = User::find($request->user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
$user->passcode = Hash::make($passcode);
if($user->roles[0]->name == "pharmacy_admin") {
$user->user_completion = Config::get('onboard_lists.for_pharmacy_list.1.id');
}
if($user->roles[0]->name == "pharmacy") {
$user->user_completion = Config::get('onboard_lists.for_pharmacy_list.1.id');
}
$user->save();
DB::commit();
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, __('digimed_validation.success_response.passcode_changed_success'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function stepEmail(StepEmailRequest $request) {
try {
$validated = $request->validated();
$encryptedEmail = Crypt::encryptString($request->email);
$user_email_details = User::where('email', $request->email)->first();
if ($user_email_details) {
if ($user_email_details->is_email_verified == 0) {
// If the user exists but is not verified, resend the verification code
DB::beginTransaction();
$verification_code = GeneralHelper::generateOtpCode();
$user_email_details->email_verification_code = $verification_code;
$user_email_details->save();
DB::commit();
// Send verification email again
$mailBody = [
'email' => $request->email,
'body' => [
'content' => 'Your email verification code for Genertion Health is: ' . $verification_code
],
'subject' => 'Email verification code',
];
dispatch(new SendInvitationJob($mailBody));
$response_array = ["user_id" => $user_email_details->id];
return self::sentResponse(200, $response_array, __('digimed_validation.error_response.not_verified_account'));
}
return self::sentResponse(500, [], __('digimed_validation.error_response.same_email_exists'));
}
$user = new User();
$user->email = $request->email;
$user->type = $request->type;
$user->password = bcrypt($request->password);
$user->type = $request->type;
$user->is_email_verified = '0';
DB::beginTransaction();
$verification_code = GeneralHelper::generateOtpCode();
$user->email_verification_code = $verification_code;
$user->save();
DB::commit();
$users = User::select('id')->where('email', $request->email)->first();
$roleId = $request->type === 'patient' ? 4 : 3;
DB::table('model_has_roles')->insert([
'role_id' => $roleId,
'model_type' => "App\User",
'model_id' => $users->id,
]);
$mailBody = [
'email' => $request->email,
'body' => [
'content' => 'Your email verification code for Genertion Health is: '.$verification_code
],
'subject' => 'Email verification code',
];
dispatch(new SendInvitationJob($mailBody));
// Mail::to($request->email)->send(new SendInvitation($mailBody));
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, __('digimed_validation.success_response.verification_sent_your_reg_mail'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function stepEmailVerify(StepEmailVerifyRequest $request)
{
try {
$validated = $request->validated();
$user = User::find($request->user_id);
if(!$user) {
return self::sentResponse(500, [], __('digimed_validation.error_response.incorrect_user'));
}
DB::beginTransaction();
if($user->email_verification_code == $request->email_verification_code) {
$user->is_email_verified = '1';
$user->save();
DB::commit();
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, __('digimed_validation.success_response.email_verified_success'));
} else {
return self::sentResponse(205, [], __('digimed_validation.error_response.invalid_email_verification_code'));
}
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function twoStepChoose(TwoStepChooseRequest $request, TwilioLibrary $TwilioLibrary) {
try {
$successMsg = "";
$validated = $request->validated();
$user = User::with('roles')->find($request->user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
DB::beginTransaction();
if($request->type == 1) {//SMS
$mobile_number = trim('+'.$user->country_code).trim($user->mobile_number);//OTP
$send = $TwilioLibrary->sendOtpSMS($mobile_number);
if($send != 1) {
DB::rollback();
return self::sentResponse(200, [], 'Error - '.$send);
}
$user->two_step_verification_type = $request->type;
$user->is_two_step_verified = '0';
$user->is_mobile_number_verified = '0';
$user->save();
DB::commit();
$successMsg = __('digimed_validation.success_response.two_step_sent_success_sms');
} else if($request->type == 2) {//EMAIL
$verification_code = mt_rand(100000,999999);
$user->two_step_verification_type = $request->type;
$user->is_two_step_verified = '0';
$user->email_verification_code = $verification_code;
$user->is_email_verified = '0';
$user->save();
DB::commit();
$mailBody = [
'email' => $user->email,
'body' => [
'content' => 'Your email two step verification code for '.config('app.name').' is: '.$verification_code
],
'subject' => 'Email two step verification code',
];
dispatch(new SendInvitationJob($mailBody));
// Mail::to($user->email)->send(new SendInvitation($mailBody));
$successMsg = __('digimed_validation.success_response.two_step_sent_success_email');
}
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, $successMsg);
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function twoStepVerification(TwoStepVerificationRequest $request, TwilioLibrary $TwilioLibrary)
{
try {
$validated = $request->validated();
$user = User::with('roles')->find($request->user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
if($user->is_two_step_verified == 0) {
if($user->two_step_verification_type != "") {
$successMsg = "";
DB::beginTransaction();
if($user->two_step_verification_type == 1) {//SMS
$mobile_number = trim('+'.$user->country_code).trim($user->mobile_number);
$data_verification_code = $request->verification_code;
/** @var string $data_verification_code */
$send = $TwilioLibrary->verifyOtpSMS($mobile_number,$data_verification_code);
if($send != 1) {
DB::rollback();
return self::sentResponse(200, [], 'Error - '.$send);
} else {
$user->is_mobile_number_verified = '1';
$user->is_two_step_Verified = '1';
$user->user_completion = Config::get('onboard_lists.for_patient_list.0.id');//User Completion -> Registration Completed.
$user->save();
DB::commit();
$successMsg = __('digimed_validation.success_response.two_step_verify_success_sms');
}
} else if($user->two_step_verification_type == 2) {//EMAIL
if($user->email_verification_code == $request->verification_code) {
$user->is_email_verified = '1';
$user->is_two_step_Verified = '1';
$user->user_completion = Config::get('onboard_lists.for_patient_list.0.id');//User Completion -> Registration Completed.
$user->save();
DB::commit();
$successMsg = __('digimed_validation.success_response.two_step_verify_success_email');
} else {
return self::sentResponse(401, [], __('digimed_validation.error_response.invalid_email_verification_code'));
}
}
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, $successMsg);
} else {
return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
}
} else {
return self::sentResponse(401, [], __('digimed_validation.error_response.already_two_step_verified'));
}
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function resendOtp(ResendOtpRequest $request, TwilioLibrary $TwilioLibrary) {
try {
$successMsg = "";
$validated = $request->validated();
$msgtype = $request->message_type;
DB::beginTransaction();
$user = User::with('roles')->find($request->user_id);
if(!$user){
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
if($msgtype == 2) {
if(empty($user->email)) {
return self::sentResponse(401, [], __('digimed_validation.error_response.email_not_available'));
}
$verification_code = mt_rand(100000,999999);
$user->email_verification_code = $verification_code;
$user->is_email_verified = '0';
$user->save();
DB::commit();
$mailBody = [
'email' => $user->email,
'body' => [
'content' => 'Your email verification code for '.config('app.name').' is: '.$verification_code
],
'subject' => 'Email verification code',
];
dispatch(new SendInvitationJob($mailBody));
// Mail::to($user->email)->send(new SendInvitation($mailBody));
$successMsg = __('digimed_validation.success_response.verification_sent_your_reg_mail');
} else if($msgtype == 1) {//SMS
$mobile_number = trim('+'.$user->country_code).trim($user->mobile_number);
$send = $TwilioLibrary->sendOtpSMS($mobile_number);
if($send != 1) {
DB::rollback();
return self::sentResponse(200, [], 'Error - '.$send);
} else {
$user->is_mobile_number_verified = '0';
$user->save();
DB::commit();
$successMsg = __('digimed_validation.success_response.verification_sent_your_reg_mbl');
}
}
$response_array = ["user_id" => $user->id];
return self::sentResponse(200, $response_array, $successMsg);
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function updateUserProfile(UpdateUserProfileRequest $request) {
try {
$validated = $request->validated();
$user = User::with('roles')->find($request->user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
DB::beginTransaction();
$data_dob = $request->dob;
/** @var string $data_dob */
$user->first_name = $request->first_name;
$user->last_name = $request->last_name;
$user->gender = $request->gender;
$user->dob = date('Y-m-d',strtotime(str_replace('/', '-', $data_dob)));
$user->country_id = $request->country_code;
$user->country_code = $request->country_code;
$user->weight = $request->weight;
$user->height = $request->height;
$user->smoker = $request->smoker;
$user->region = $request->region;
$user->mobile_number = $request->mobile_number;
$user->status = '2';
$user->ethnicity = $request->ethnicity;
$notification = UserSettingsNotification::firstOrNew(['user_id' => $request->user_id]);
$notification->reminders_email ="1";
$notification->reminders_inapp = "1";
$notification->reminders_push = "1";
$notification->appt_confirm_changes_email = "1";
$notification->appt_confirm_changes_inapp = "1";
$notification->appt_confirm_changes_push ="1";
$notification->updated_by = $request->user_id;
$notification->save();
// dd($user);
/** @var object $user->roles() */
if($user->is_email_verified ==1){
$user->save();
}
else{
return self::sentResponse(402, [], __('digimed_validation.error_response.email_not_verified'));
}
DB::commit();
return self::sentResponse(200, [], __('digimed_validation.success_response.user_profile_details_store_success'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function updateDoctorProfile(UpdateDoctorProfileRequest $request) {
try {
$validated = $request->validated();
$user = User::with('roles')->find($request->user_id);
if (!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
DB::beginTransaction();
$data_dob = $request->dob;
/** @var string $data_dob */
$user->first_name = $request->first_name;
$user->last_name = $request->last_name;
$user->gender = $request->gender;
$user->dob = date('Y-m-d', strtotime(str_replace('/', '-', $data_dob)));
$user->country_id = $request->country_code;
$user->country_code = $request->country_code;
$user->mobile_number = $request->mobile_number;
$user->address = $request->address;
$user->status = '1';
$user->user_completion = '3';
// New fields for personal and professional details
$user->medical_license_number = $request->medical_license_number;
$user->save();
$notification = UserSettingsNotification::firstOrNew(['user_id' => $request->user_id]);
$notification->reminders_email ="1";
$notification->reminders_inapp = "1";
$notification->reminders_push = "1";
$notification->appt_confirm_changes_email = "1";
$notification->appt_confirm_changes_inapp = "1";
$notification->appt_confirm_changes_push ="1";
$notification->updated_by = $request->user_id;
$notification->save();
$userdetails = UserDetails::firstOrNew(['user_id' => $request->user_id]);
$userdetails->medical_council_regno = $request->reg_no;
$userdetails->created_by = $request->user_id;
$userdetails->save();
$lastDetailID = $userdetails->id;
$data_specilation = $request->specilation;
/** @var string $data_specilation */
if ($data_specilation != "") {
$queryDelete = new UserAreaSpecialisation();
$querySpecilation = $queryDelete->where('user_detail_id', $lastDetailID);
if ($querySpecilation->count() > 0) {
$querySpecilation->update(['deleted_by' => $request->user_id]);
$querySpecilation->delete();
}
$areaSpecialisationExplode = explode(',', $data_specilation);
for ($i = 0; $i < count($areaSpecialisationExplode); $i++) {
$query = new UserAreaSpecialisation();
$query->user_detail_id = $lastDetailID;
$query->area_specialisation_id = $areaSpecialisationExplode[$i];
$query->created_by = $request->user_id;
$query->save();
}
}
$data_clinic = $request->clinic;
/** @var string $data_clinic */
if ($data_clinic != "") {
$queryDelete = new UserClinic();
$queryUserClinic = $queryDelete->where('user_detail_id', $lastDetailID);
if ($queryUserClinic->count() > 0) {
$queryUserClinic->update(['deleted_by' => $request->user_id]);
$queryUserClinic->delete();
}
$clinicExplode = explode(',', $data_clinic);
for ($i = 0; $i < count($clinicExplode); $i++) {
$queryUserClinic = new UserClinic();
$queryUserClinic->user_detail_id = $lastDetailID;
$queryUserClinic->clinic_id = $clinicExplode[$i];
$queryUserClinic->created_by = $request->user_id;
$queryUserClinic->save();
}
}
$adminEmail = AdminSettings::select('email_username')->first();
$emailUsername = $adminEmail ? $adminEmail->email_username : null;
$mailBody = [
'email' => $emailUsername,
'body' => [
'content' => 'A new registration request has been submitted by ' . $user->name . '. Please review and approve or reject the request.',
],
'subject' => 'New Registration Request'
];
dispatch(new SendEmailNotificationJob($mailBody));
DB::commit();
return self::sentResponse(200, [], __('digimed_validation.success_response.doctor_profile_details_store_success'));
} catch (Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function reviewDoctor(ReviewDoctorRequest $request)
{
$action = $request->action; // 'approve' or 'reject'
$user_id = $request->user_id;
// Retrieve the user by ID
$user = User::find($user_id);
if (!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
try {
DB::beginTransaction();
if ($action === 'approve') {
$user->status = '4'; // Approved status
$user->email_verification_code = Str::random(32); // Generate a random token
$user->save();
// Generate the activation link
$activationLink = route('user.activate', [
'user_id' => $user_id,
'email_verification_code' => $user->email_verification_code
]);
// Prepare the email body
$mailBody = [
'email' => $user->email,
'body' => [
'content' => 'Congratulations, your registration has been approved. Click the following link to activate your account: ' . $activationLink
],
'subject' => 'Account Activation'
];
dispatch(new SendEmailNotificationJob($mailBody));
DB::commit();
$log_msg = 'Registration approved for user ' . $user->name;
return self::sentResponse(200, [], __('digimed_validation.success_response.doctor_request_approve_success'));
} else {
$user->status = '3'; // Rejected status
$user->save();
// Prepare the rejection email body
$mailBody = [
'email' => $user->email,
'body' => [
'content' => 'Your registration request has been rejected. If you have any questions, please contact support.'
],
'subject' => 'Registration Request Rejected'
];
dispatch(new SendEmailNotificationJob($mailBody));
DB::commit();
$log_msg = 'Registration rejected for user ' . $user->name;
return self::sentResponse(200, [], __('digimed_validation.success_response.doctor_request_rejected'));
}
DB::commit();
// Log the action
GeneralHelper::auditLog($log_msg, 'User', $user_id);
return self::sentResponse(200, [], __('digimed_validation.success_response.doctor_request_process_success'));
} catch (Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function activateAccount(ActivateAccountRequest $request)
{
// Retrieve the user by ID
$user_id = $request->user_id;
$user = User::find($user_id);
$verification_code = $request->email_verification_code;
if (!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
// Verify the email_verification_code
if ($user->email_verification_code !== $verification_code) {
return self::sentResponse(500, [], __('digimed_validation.error_response.invalid_activation_token'));
}
// Activate the user
$user->status = '2'; // or another status indicating active user
$user->email_verification_code = ''; // Clear the activation token
$user->save();
return self::sentResponse(200, [], __('digimed_validation.success_response.account_activated_success'));
}
public function updatePharmacyUserProfile(UpdatePharmacyUserProfileRequest $request)
{
try {
$validated = $request->validated();
$user = User::with('roles')->find($request->user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
$user->first_name = $request->first_name;
$user->last_name = $request->last_name;
if($user->roles[0]->name == "pharmacy_admin") {
$user->user_completion = Config::get('onboard_lists.for_pharmacy_list.2.id');
$user->status = '1'; //Awaiting admin approval
}
if($user->roles[0]->name == "pharmacy") {
$user->user_completion = Config::get('onboard_lists.for_pharmacy_list.2.id');
$user->status = '2';
}
$user->save();
return self::sentResponse(200, [], __('digimed_validation.success_response.user_details_store_success'));
} catch(Exception | Throwable | QueryException $e) {
return self::sentResponse(500, [], $e->getMessage());
}
}
public function updatePharmacyProfile(UpdatePharmacyProfileRequest $request,S3Library $S3Library)
{
try {
$validated = $request->validated();
/** @var string|null $data_logo */
$data_logo = $request->logo;
/** @var string|null $user_id */
$user_id = $request->user_id;
$user = User::with('roles')->find($user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
if($user->roles[0]->name == "pharmacy") {
return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
}
DB::beginTransaction();
$pharmacy = Pharmacy::firstOrNew([
'created_by' => $user_id,
]);
if($user->roles[0]->name == "pharmacy_admin") {
$pharmacy->name = $request->pharmacy_name;
$pharmacy->registration_number = $request->registration_number;
}
if (!empty($data_logo)) {
if($S3Library->is_base64($data_logo)) { //Base 64
$digimedFile = $S3Library->base64($data_logo, $user_id, ['image'], 'digimed/images/pharmacy-logo/');
if($digimedFile['code'] == 200) {
$pharmacy->logo = $digimedFile['data'];
}
}
}
$pharmacy->save();
$userPharmacy = UserPharmacy::firstOrNew([
'user_id' => $user_id,
'pharmacy_id' => $pharmacy->id,
]);
$userPharmacy->save();
DB::commit();
return self::sentResponse(200, [], __('digimed_validation.success_response.pharmacy_details_store_success'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function updatePharmacyAddress(UpdatePharmacyAddressRequest $request)
{
try {
$validated = $request->validated();
/** @var string|null $user_id */
$user_id = $request->user_id;
$user = User::with('roles')->find($user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
if($user->roles[0]->name == "pharmacy") {
return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
}
DB::beginTransaction();
$pharmacy = Pharmacy::firstOrNew([
'created_by' => $user_id,
]);
$pharmacy->address = $request->address;
$pharmacy->locality_id = $request->locality_id;
$pharmacy->post_code = $request->post_code;
$pharmacy->save();
if($user->roles[0]->name == "pharmacy_admin") {
$user->user_completion = Config::get('onboard_lists.for_pharmacy_list.3.id');
$user->save();
}
DB::commit();
return self::sentResponse(200, [], __('digimed_validation.success_response.pharmacy_address_store_success'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function verifyPassport(VerifyPassportRequest $request)
{
try {
$validated = $request->validated();
$user_id = $request->user_id;
$user = User::find($request->user_id);
$user_role = $user->type;
$passport_number = $request->passport_number;
//update case
$updateCheck = User::where('id',$user_id)->where('passport_number', $passport_number)->count();
if(empty($updateCheck)){
/**
* @var string $user_role
* @var string $passport_number
*/
$checkUser = User::where(function($q) use($user_role,$passport_number){
$q->where('type',$user_role);
$q->where('passport_number',$passport_number);
})->count();
if(!empty($checkUser)) {
return self::sentResponse(401, [], __('digimed_validation.error_response.passportno_in_use'));
}
}
return self::sentResponse(200, [], __('digimed_validation.success_response.passportno_available'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function profileImage(ProfileImageRequest $request, S3Library $S3Library)
{
try {
$validated = $request->validated();
$user = User::find($request->user_id);
if(!$user) {
return self::sentResponse(401, [], __('digimed_validation.error_response.incorrect_user'));
}
DB::beginTransaction();
/** @var string|null $data_profile_image */
$data_profile_image = $request->profile_image;
/** @var string|null $user_id */
$user_id = $request->user_id;
if (!empty($data_profile_image)) {
/*if(!empty($user->profile_image)) {
if (Storage::exists('images/profile-images/' . $user->profile_image)) {
Storage::delete('images/profile-images/' . $user->profile_image);
}
}*/
if($S3Library->is_base64($data_profile_image)) { //Base 64
$digimedFile = $S3Library->base64($data_profile_image, $user_id, ['image'], 'digimed/images/profile-images/');
if($digimedFile['code'] == 200) {
$user->profile_image = $digimedFile['data'];
}
}
/*if (preg_match('/data:image\/(.+);base64,(.*)/', $data_profile_image, $matchings)) {
$imageData = base64_decode($matchings[2]);
$extension = $matchings[1];
$file_name = date('YmdHis') . rand(100, 999) . '_' . $request->user_id . '.' . $extension;
$path = 'images/profile-images/' . $file_name;
Storage::put($path, $imageData);
$user->profile_image = $file_name;
}*/
}
$user->biographies = $request->biographies;
$user->save();
DB::commit();
$response_array = ["user_id" => $user->id,"file_path" => $user->profile_image,"biographies" => $user->biographies];
return self::sentResponse(200, $response_array, __('digimed_validation.success_response.profile_image_stored_success'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function doctorDocuments(DoctorDocumentsRequest $request, S3Library $S3Library)
{
try {
$validated = $request->validated();
$user = User::with('roles')->find($request->user_id);
if(!$user->hasRole(['doctor'])) {
return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
}
DB::beginTransaction();
$userdetails = UserDetails::firstOrNew(['user_id' => $request->user_id]);
$userdetails->medical_council_regno = $request->reg_no;
$userdetails->created_by = $request->user_id;
$userdetails->save();
$lastDetailID = $userdetails->id;
$data_specilation = $request->specilation;
/** @var string $data_specilation */
if($data_specilation != "") {
$queryDelete = new UserAreaSpecialisation();
$querySpecilation = $queryDelete->where('user_detail_id', $lastDetailID);
if($querySpecilation->count() > 0) {
$querySpecilation->update(['deleted_by' => $request->user_id]);
$querySpecilation->delete();
}
$areaSpecialisationExplode = explode(',', $data_specilation);
for ($i=0; $i < count($areaSpecialisationExplode); $i++) {
$query = new UserAreaSpecialisation();
$query->user_detail_id = $lastDetailID;
$query->area_specialisation_id = $areaSpecialisationExplode[$i];
$query->created_by = $request->user_id;
$query->save();
}
}
$data_clinic = $request->clinic;
/** @var string $data_clinic */
if($data_clinic != "") {
$queryDelete = new UserClinic();
$queryUserClinic = $queryDelete->where('user_detail_id', $lastDetailID);
if($queryUserClinic->count() > 0) {
$queryUserClinic->update(['deleted_by' => $request->user_id]);
$queryUserClinic->delete();
}
$clinicExplode = explode(',', $data_clinic);
for ($i=0; $i < count($clinicExplode); $i++) {
$queryUserClinic = new UserClinic();
$queryUserClinic->user_detail_id = $lastDetailID;
$queryUserClinic->clinic_id = $clinicExplode[$i];
$queryUserClinic->created_by = $request->user_id;
$queryUserClinic->save();
}
}
$deleteArrFiles = $request->document_delete;
/** @var string $deleteArrFiles */
if(!empty($deleteArrFiles)) { //Delete file before upload
$decode = json_decode($deleteArrFiles);
/** @var array $decode */
if(count($decode) != 0) {
$queryDoc = DoctorDocument::where('user_id',$request->user_id)->first();
if($queryDoc) {
$result = $queryDoc->document;
$data_document_url_arr = json_decode($result);
$finalArr = [];
if (is_array($data_document_url_arr) || is_object($data_document_url_arr)) {
foreach ($data_document_url_arr as $key => $value) {
/** @var string $value */
$baseName = basename($value);
if (!in_array($baseName, $decode)) {
array_push($finalArr, $baseName);
} else {
if(Config::get('filesystems.default') == "s3") {
Storage::disk('s3')->delete('digimed/images/documents/'.$request->user_id.'/'.$baseName);
} else {
Storage::delete('digimed/images/documents/'.$request->user_id.'/'.$baseName);
}
}
}
}
$update = DoctorDocument::where('user_id', $request->user_id)->update(['document' => json_encode($finalArr)]);
}
}
}
$file = $request->file('document');
$document = DoctorDocument::where('user_id',$request->user_id)->first();
if($document) {
$documentNew = DoctorDocument::where('user_id',$request->user_id)->first();
if($documentNew->document != null) {
$exsistRecord = json_decode($documentNew->document);
} else {
$exsistRecord = [];
}
} else {
$documentNew = new DoctorDocument();
$exsistRecord = [];
}
$documentNew->user_id = $request->user_id;
if ($request->hasFile('document')) {
foreach($file as $key=>$val) {
/*$imageData=$file[$key]->getClientOriginalName();
$extension=$file[$key]->getClientOriginalExtension();
if(Storage::exists('images/documents/'.$request->user_id.'/'.$imageData)) {
$fCount = 0;
$condition = true;
do {
$renamedFile = pathinfo($imageData, PATHINFO_FILENAME).'_('.$fCount.').'.$extension;
if(Storage::exists('images/documents/'.$request->user_id.'/'.$renamedFile)) {
$fCount++;
$condition = true;
} else {
$condition = false;
$renamedFile = $renamedFile;
}
} while ($condition);
} else {
$renamedFile = $imageData;
}
if(preg_match("/\.(gif|jpeg|JPEG|jpg|JPG|png|PNG|pdf|docx|doc|DOCX|DOC)$/", $imageData)) {
$file_name = $renamedFile;
//date('YmdHis') . rand(100, 999) . '_' . $request->user_id . '.' . $extension;
$path = 'images/documents/'.$request->user_id.'/';
Storage::putFileAs($path, $file[$key], $file_name);
@var array $exsistRecord
array_push($exsistRecord, $file_name);
} else {
DB::rollback();
return self::sentResponse(200, [], __('digimed_validation.error_response.document_upload_faild_withtype'));
}*/
$digimedFile = $S3Library->fileUpload(true, 'jpeg|JPEG|jpg|JPG|png|PNG|pdf|docx|doc|DOCX|DOC', true, $file[$key], 'digimed/images/documents/'.$request->user_id.'/');
if($digimedFile['code'] == 500) {
DB::rollback();
return self::sentResponse(500, $digimedFile['data'], $digimedFile['msg']);
}
if($digimedFile['code'] == 200) {
$doctor_document = $digimedFile['data'];
/** @var array $exsistRecord */
array_push($exsistRecord, $doctor_document);
}
}
if(!empty($exsistRecord)) {
$documentVal = json_encode($exsistRecord);
} else {
$documentVal = NULL;
}
$documentNew->document = $documentVal;
}
$user = User::find($request->user_id);
$signatureVal = $user->signature;
if ($request->hasFile('signature')) {
$fileSignature = $request->file('signature');
$digimedFile = $S3Library->fileUpload(true, 'jpeg|JPEG|jpg|JPG|png|PNG|pdf|docx|doc|DOCX|DOC', true, $fileSignature, 'digimed/images/signature/'.$request->user_id.'/');
if($digimedFile['code'] == 500) {
DB::rollback();
return self::sentResponse(500, $digimedFile['data'], $digimedFile['msg']);
}
if($digimedFile['code'] == 200) {
$user->signature = $digimedFile['data'];
$user->save();
$signatureVal = $digimedFile['data'];
}
/*$fileName = $fileSignature->getClientOriginalName();
$fileExtension = $fileSignature->getClientOriginalExtension();
if(preg_match("/\.(jpeg|JPEG|jpg|JPG)$/", $fileName)) {
if (Storage::exists('images/signature/'.$request->user_id.'/'.$fileName)) {
$files = Storage::allFiles('images/signature/'.$request->user_id);
Storage::delete($files);
}
$path = 'images/signature/'.$request->user_id.'/';
Storage::putFileAs($path, $fileSignature, $fileName);
$user->signature = $fileName;
$user->save();
$signatureVal = $fileName;
} else {
DB::rollback();
return self::sentResponse(500, [], __('digimed_validation.error_response.signature_upload_faild_withtype'));
}*/
}
if (in_array($user->status, [0])) {
$user->status = '1'; //Awaiting admin approval
$user->save();
}
$documentNew->created_by = $request->user_id;
$documentNew->save();
$documentNew->refresh();
DB::commit();
$finalResultSet = [];
$sendData = $documentNew->where('user_id', $user->id)->first();
$decode = json_decode($sendData->document);
/** @var array $decode */
if(!empty(array_filter($decode))) {
$data_document_url_arr = $decode;
if (is_array($data_document_url_arr)) {
foreach($data_document_url_arr AS $sentVal) {
/** @var string $sentVal */
$finalResultSet[] = $sentVal;
}
}
}
$response_json = ["user_id" => $user->id,"documents" => $finalResultSet,"signature" => $signatureVal];
return self::sentResponse(200, $response_json, __('digimed_validation.success_response.document_stored_success'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function consultationType(ConsultationTypeRequest $request)
{
try {
$validated = $request->validated();
$user = User::with('roles')->find($request->user_id);
if(!$user->hasRole(['doctor'])) {
return self::sentResponse(401, [], __('digimed_validation.error_response.not_authorized'));
}
DB::beginTransaction();
$user = User::where('id',$request->user_id)->first();
$userDetails = UserDetails::where('user_id',$request->user_id)->first();
$home_visit = 0;
$on_demand = 0;
$schedule_appointment = 0;
if(!empty($request->home_visit)) $home_visit = $request->home_visit;
if(!empty($request->on_demand)) $on_demand = $request->on_demand;
if(!empty($request->schedule_appointment)) $schedule_appointment = $request->schedule_appointment;
if($userDetails) {
$userDetails->updated_by = $request->user_id;
} else {
$userDetails = New UserDetails();
$userDetails->user_id = $request->user_id;
$userDetails->created_by = $request->user_id;
// $userDetails->language_id = 1;
}
$userDetails->home_visit = $home_visit;
$userDetails->on_demand = $on_demand;
$userDetails->schedule_appointment = $schedule_appointment;
$userDetails->save();
if (in_array($user->status, [0])) {
/*$user->status = '1';*/ //Awaiting admin approval
$user->save();
}
//Notify to admin for doctor registration approval
// if($user->roles[0]->name == "doctor") {
// }
//User Completion -> Doctor Verification.
// $user->user_completion = Config::get('onboard_lists.for_doctor_list.3.id');
// $user->save();
DB::commit();
$response_json = ["user_id" => $user->id];
return self::sentResponse(200, $response_json, __('digimed_validation.success_response.consultation_saved_success'));
} catch(Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function aadharVerfication(Request $request){
// Define the API URL
$url = "https://kyc-api.surepass.io/api/v1/aadhaar-v2/generate-otp";
// Define the request headers
$headers = [
'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY5MzIyMDg4NywianRpIjoiMmMzODIwMTctZGQyZC00ZGVmLWFiZTgtMjYyOTM2Y2QzYmZlIiwidHlwZSI6ImFjY2VzcyIsImlkZW50aXR5IjoiZGV2Lm1lZGF3YXRhckBzdXJlcGFzcy5pbyIsIm5iZiI6MTY5MzIyMDg4NywiZXhwIjoyMDA4NTgwODg3LCJ1c2VyX2NsYWltcyI6eyJzY29wZXMiOlsid2FsbGV0Il19fQ.ubwCDJ8JjATsMhdCvy2HLNCMhcjE6-z3gR0rwBAvoAc',
'Content-Type: application/json',
];
// Define the request data
$aadhaar_number = '961560419605';
$data = [
'uid' => $aadhaar_number,
];
// dd($data);
// Initialize cURL session
$ch = curl_init($url);
// Set cURL options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
// Execute cURL request
$response = curl_exec($ch);
// Check for cURL errors
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
} else {
// Close cURL session
curl_close($ch);
// Process the response
//var_dump($response);
// dd($response);
$response_arr=json_decode($response,true);
print_r($response_arr); exit;
if($response_arr=='SUCCESS'){
$status=1;
$ref_id=$response_arr;
$message='Aadhaar OTP send to your registered mobile no.';
$other_details='';
}else{
$status=0;
$ref_id='';
$message=$response_arr;
$other_details='';
}
//
// request()->session()->put('ref_id',$ref_id); // this use in below function aadhaar_no_verify_check_otp()
return response()->json();
}
}
}