id ?? null); if (!$sessId) { $user = User::where('role', 'employer')->first(); if ($user) { session(['user' => (object)[ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'role' => 'employer', 'subscription_status' => $user->subscription_status ?? 'active', ]]); return $user; } } else { return User::find($sessId); } return null; } private function buildProfileData($user, $profile) { return [ 'name' => $user->name, 'email' => $user->email, 'phone' => $profile->phone ?? '+971509990001', 'emirates_id' => [ 'emirates_id_number' => $profile->emirates_id_number ?? '784-1987-5493842-5', 'name' => $profile->emirates_id_name ?? $user->name, 'date_of_birth' => $profile->emirates_id_dob ?? '1987-04-14', 'nationality' => $profile->nationality ?? 'Bangladesh', 'issue_date' => $profile->emirates_id_issue_date ?? '2025-12-12', 'expiry_date' => $profile->emirates_id_expiry ?? '2027-12-11', 'employer' => $profile->emirates_id_employer ?? 'Msj International Technical Services L.L.C UAE', 'issue_place' => $profile->emirates_id_issue_place ?? 'Dubai', 'occupation' => $profile->emirates_id_occupation ?? 'Electrician', 'card_number' => $profile->emirates_id_card_number ?? '151023946', 'gender' => $profile->emirates_id_gender ?? 'M', ], 'fcm_token' => $user->fcm_token ?? 'fcm_token_example', 'address' => $profile->address ?? 'Villa 45, Street 12', 'property_type' => $profile->property_type, 'profile_photo_url' => $profile->profile_photo_url, 'email_notifications' => (bool)($profile->email_notifications ?? true), 'push_notifications' => (bool)($profile->push_notifications ?? true), ]; } public function index(Request $request) { $user = $this->resolveCurrentUser(); if (!$user) { return redirect()->route('employer.dashboard'); } // Fetch or create profile $profile = $user->employerProfile; if (!$profile) { $profile = EmployerProfile::create([ 'user_id' => $user->id, 'phone' => '+971509990001', 'emirates_id_number' => '784-1987-5493842-5', 'emirates_id_name' => 'Mohammad Jobaier Mohammad Abul Kalam', 'emirates_id_dob' => '1987-04-14', 'nationality' => 'Bangladesh', 'emirates_id_issue_date' => '2025-12-12', 'emirates_id_expiry' => '2027-12-11', 'emirates_id_employer' => 'Msj International Technical Services L.L.C UAE', 'emirates_id_issue_place' => 'Dubai', 'emirates_id_occupation' => 'Electrician', 'emirates_id_card_number' => '151023946', 'emirates_id_gender' => 'M', 'address' => 'Villa 45, Street 12', ]); } $employerProfile = $this->buildProfileData($user, $profile); return Inertia::render('Employer/Profile', [ 'employerProfile' => $employerProfile, ]); } public function edit(Request $request) { $user = $this->resolveCurrentUser(); if (!$user) { return redirect()->route('employer.dashboard'); } $profile = $user->employerProfile; if (!$profile) { $profile = EmployerProfile::create([ 'user_id' => $user->id, 'phone' => '+971509990001', 'emirates_id_number' => '784-1987-5493842-5', 'emirates_id_name' => 'Mohammad Jobaier Mohammad Abul Kalam', 'emirates_id_dob' => '1987-04-14', 'nationality' => 'Bangladesh', 'emirates_id_issue_date' => '2025-12-12', 'emirates_id_expiry' => '2027-12-11', 'emirates_id_employer' => 'Msj International Technical Services L.L.C UAE', 'emirates_id_issue_place' => 'Dubai', 'emirates_id_occupation' => 'Electrician', 'emirates_id_card_number' => '151023946', 'emirates_id_gender' => 'M', 'address' => 'Villa 45, Street 12', ]); } $employerProfile = $this->buildProfileData($user, $profile); return Inertia::render('Employer/ProfileEdit', [ 'employerProfile' => $employerProfile, ]); } public function update(Request $request) { $user = $this->resolveCurrentUser(); if (!$user) { return back()->withErrors(['general' => 'User session not found.']); } $sponsor = \App\Models\Sponsor::where('email', $user->email)->first(); $request->validate([ 'name' => 'required|string|max:255', 'email' => [ 'required', 'string', 'email', 'max:255', 'unique:users,email,' . $user->id, $sponsor ? 'unique:sponsors,email,' . $sponsor->id : 'unique:sponsors,email', ], 'phone' => 'required|string|max:255', 'company_name' => 'nullable|string|max:255', 'language' => 'nullable|string|in:English,Arabic,english,arabic', 'notifications' => 'nullable|boolean', 'nationality' => 'nullable|string|max:255', 'family_size' => 'nullable|string|max:255', 'accommodation' => 'nullable|string|max:255', 'district' => 'nullable|string|max:255', 'emirates_id_front' => 'nullable|file|image|max:10240', 'emirates_id_back' => 'nullable|file|image|max:10240', 'address' => 'nullable|string|max:255', 'property_type' => 'nullable|string|max:255', 'profile_photo' => 'nullable|image|max:10240', 'email_notifications' => 'nullable|boolean', 'push_notifications' => 'nullable|boolean', ]); $oldEmail = $user->getOriginal('email') ?? $user->email; // Update EmployerProfile $profile = $user->employerProfile; if (!$profile) { $profile = new EmployerProfile(['user_id' => $user->id]); } // Handle physical uploads/OCR for Emirates ID first to allow name autofill $uploaded = false; $extractedIdNumber = null; $extractedExpiry = null; $extractedName = null; $extractedDob = null; $extractedNationality = null; $extractedCardNumber = null; $extractedGender = null; $extractedOccupation = null; $extractedEmployer = null; $extractedIssuePlace = null; $extractedIssueDate = null; if ($request->hasFile('emirates_id_front')) { $file = $request->file('emirates_id_front'); $ocrFront = \App\Services\OcrDocumentService::extractEmiratesIdFrontData($file); $extractedIdNumber = $ocrFront['emirates_id_number'] ?? null; $extractedName = $ocrFront['name'] ?? null; $extractedDob = $ocrFront['date_of_birth'] ?? null; $extractedNationality = $ocrFront['nationality'] ?? null; $extractedCardNumber = $ocrFront['card_number'] ?? null; $extractedGender = $ocrFront['gender'] ?? null; $extractedOccupation = $ocrFront['occupation'] ?? null; $extractedEmployer = $ocrFront['employer'] ?? null; $extractedIssuePlace = $ocrFront['issue_place'] ?? null; $profile->emirates_id_front = '[DELETED_FOR_PDPL_COMPLIANCE]'; $uploaded = true; } if ($request->hasFile('emirates_id_back')) { $file = $request->file('emirates_id_back'); $ocrBack = \App\Services\OcrDocumentService::extractEmiratesIdBackData($file); $extractedExpiry = $ocrBack['expiry_date'] ?? null; $extractedIssueDate = $ocrBack['issue_date'] ?? null; $profile->emirates_id_back = '[DELETED_FOR_PDPL_COMPLIANCE]'; $uploaded = true; } if ($uploaded) { // Validate that name was extracted if ($request->hasFile('emirates_id_front') && empty($extractedName)) { return back()->withErrors(['emirates_id_front' => 'Failed to extract name from the Emirates ID. Please upload a clear image.']); } // Autofill user's name if (!empty($extractedName)) { $request->merge(['name' => $extractedName]); } } // Update User Model $user->update([ 'name' => $request->name, 'email' => $request->email, ]); // Sync with corresponding sponsor record if found $matchingSponsor = \App\Models\Sponsor::where('email', $oldEmail)->first(); if ($matchingSponsor) { $sponsorData = [ 'full_name' => $request->name, 'email' => $request->email, 'mobile' => $request->phone, ]; if ($uploaded) { if ($extractedIdNumber) { $sponsorData['emirates_id'] = $extractedIdNumber; } if ($extractedExpiry) { $sponsorData['emirates_id_expiry'] = $extractedExpiry; } if ($extractedName) { $sponsorData['emirates_id_name'] = $extractedName; } if ($extractedDob) { $sponsorData['emirates_id_dob'] = $extractedDob; } if ($extractedNationality) { $sponsorData['nationality'] = $extractedNationality; } if ($extractedGender) { $sponsorData['emirates_id_gender'] = $extractedGender; } if ($extractedOccupation) { $sponsorData['emirates_id_occupation'] = $extractedOccupation; } if ($extractedEmployer) { $sponsorData['emirates_id_employer'] = $extractedEmployer; } if ($extractedIssuePlace) { $sponsorData['emirates_id_issue_place'] = $extractedIssuePlace; } if ($extractedIssueDate) { $sponsorData['emirates_id_issue_date'] = $extractedIssueDate; } if ($extractedCardNumber) { $sponsorData['emirates_id_card_number'] = $extractedCardNumber; } } $matchingSponsor->update($sponsorData); } $profile->phone = $request->phone; if ($request->has('company_name')) { $profile->company_name = $request->company_name; } if ($request->has('language')) { $profile->language = ucfirst(strtolower($request->language)); } if ($request->has('notifications')) { $profile->notifications = $request->notifications; } if ($request->has('nationality') && !$uploaded) { $profile->nationality = $request->nationality; } if ($request->has('family_size')) { $profile->family_size = $request->family_size; } if ($request->has('accommodation')) { $profile->accommodation = $request->accommodation; } if ($request->has('district')) { $profile->district = $request->district; } if ($request->has('address')) { $profile->address = $request->address; } if ($request->has('property_type')) { $profile->property_type = $request->property_type; } if ($request->has('email_notifications')) { $profile->email_notifications = $request->email_notifications; } if ($request->has('push_notifications')) { $profile->push_notifications = $request->push_notifications; } if ($uploaded) { $profile->emirates_id_number = $extractedIdNumber ?? $profile->emirates_id_number ?? ('784-' . rand(1975, 2005) . '-' . rand(1000000, 9999999) . '-' . rand(1, 9)); $profile->emirates_id_expiry = $extractedExpiry ?? $profile->emirates_id_expiry ?? now()->addYears(rand(2, 4))->toDateString(); if ($extractedName) { $profile->emirates_id_name = $extractedName; } if ($extractedDob) { $profile->emirates_id_dob = $extractedDob; } if ($extractedNationality) { $profile->nationality = $extractedNationality; } if ($extractedCardNumber) { $profile->emirates_id_card_number = $extractedCardNumber; } if ($extractedGender) { $profile->emirates_id_gender = $extractedGender; } if ($extractedOccupation) { $profile->emirates_id_occupation = $extractedOccupation; } if ($extractedEmployer) { $profile->emirates_id_employer = $extractedEmployer; } if ($extractedIssuePlace) { $profile->emirates_id_issue_place = $extractedIssuePlace; } if ($extractedIssueDate) { $profile->emirates_id_issue_date = $extractedIssueDate; } $profile->verification_status = 'approved'; } // Handle profile photo upload if ($request->hasFile('profile_photo')) { $file = $request->file('profile_photo'); $path = $file->store('profile_photos', 'public'); $profile->profile_photo_url = asset('storage/' . $path); } $profile->save(); // Update session user name/email session(['user' => (object)[ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, 'role' => 'employer', 'subscription_status' => $user->subscription_status ?? 'active', 'verification_status' => $profile->verification_status ?? 'approved', ]]); return redirect()->route('employer.profile')->with('success', 'Profile updated successfully.'); } }