267 lines
9.9 KiB
PHP
267 lines
9.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Employer;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use Inertia\Inertia;
|
|
use App\Models\User;
|
|
use App\Models\Conversation;
|
|
use App\Models\Message;
|
|
use App\Models\Worker;
|
|
use App\Models\JobOffer;
|
|
|
|
class MessageController extends Controller
|
|
{
|
|
private function resolveCurrentUser()
|
|
{
|
|
$sess = session('user');
|
|
$sessId = is_array($sess) ? ($sess['id'] ?? null) : ($sess->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;
|
|
}
|
|
|
|
public static function processWorkerResponse($conv, $worker, $text)
|
|
{
|
|
$replyText = strtolower(trim($text));
|
|
|
|
if ($replyText === 'yes' || $replyText === 'no') {
|
|
// Find the last message sent by the employer in this conversation (excluding the current worker message)
|
|
$lastEmployerMessage = Message::where('conversation_id', $conv->id)
|
|
->where('sender_type', 'employer')
|
|
->latest()
|
|
->first();
|
|
|
|
if ($lastEmployerMessage) {
|
|
$questionText = strtolower($lastEmployerMessage->text);
|
|
$isLookingJobQuestion = str_contains($questionText, 'looking job') ||
|
|
str_contains($questionText, 'looking for a job') ||
|
|
str_contains($questionText, 'looking for job') ||
|
|
str_contains($questionText, 'are you looking');
|
|
|
|
if ($isLookingJobQuestion) {
|
|
if ($replyText === 'yes') {
|
|
// S6 Outcome: Update status as Hired
|
|
$worker->update([
|
|
'status' => 'Hired',
|
|
'availability' => 'Hired'
|
|
]);
|
|
|
|
// Accept existing direct offer or application
|
|
$offer = JobOffer::where('employer_id', $conv->employer_id)
|
|
->where('worker_id', $worker->id)
|
|
->first();
|
|
|
|
if ($offer) {
|
|
$offer->update(['status' => 'accepted']);
|
|
} else {
|
|
JobOffer::create([
|
|
'employer_id' => $conv->employer_id,
|
|
'worker_id' => $worker->id,
|
|
'work_date' => now()->format('Y-m-d'),
|
|
'location' => 'Dubai',
|
|
'salary' => $worker->salary ?: 2000,
|
|
'notes' => 'Hired via chat agreement.',
|
|
'status' => 'accepted',
|
|
]);
|
|
}
|
|
} else if ($replyText === 'no') {
|
|
// S5 Outcome: Update status as Hidden (Auto-Hidden from search)
|
|
$worker->update([
|
|
'status' => 'hidden',
|
|
'availability' => 'Not Available'
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public function index(Request $request)
|
|
{
|
|
$user = $this->resolveCurrentUser();
|
|
if (!$user) {
|
|
return redirect()->route('employer.login');
|
|
}
|
|
|
|
$dbConversations = Conversation::where('employer_id', $user->id)
|
|
->with(['worker.category', 'messages'])
|
|
->latest('updated_at')
|
|
->get();
|
|
|
|
$conversations = $dbConversations->map(function ($conv) {
|
|
$lastMsg = $conv->messages->last();
|
|
return [
|
|
'id' => $conv->id,
|
|
'worker_id' => $conv->worker_id,
|
|
'worker_name' => $conv->worker->name ?? 'Candidate',
|
|
'category' => $conv->worker->category->name ?? 'General Helper',
|
|
'worker_status' => strtolower($conv->worker->status ?? 'active'),
|
|
'last_message' => $lastMsg->text ?? 'No messages yet.',
|
|
'unread' => $lastMsg ? ($lastMsg->sender_type === 'worker' && is_null($lastMsg->read_at)) : false,
|
|
'online' => true,
|
|
'sent_at' => $lastMsg ? $lastMsg->created_at->diffForHumans() : 'Just now',
|
|
];
|
|
})->toArray();
|
|
|
|
return Inertia::render('Employer/Messages/Index', [
|
|
'conversations' => $conversations,
|
|
]);
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
$user = $this->resolveCurrentUser();
|
|
if (!$user) {
|
|
return redirect()->route('employer.login');
|
|
}
|
|
|
|
$dbConversations = Conversation::where('employer_id', $user->id)
|
|
->with(['worker.category', 'messages'])
|
|
->latest('updated_at')
|
|
->get();
|
|
|
|
$conversations = $dbConversations->map(function ($conv) {
|
|
$lastMsg = $conv->messages->last();
|
|
return [
|
|
'id' => $conv->id,
|
|
'worker_id' => $conv->worker_id,
|
|
'worker_name' => $conv->worker->name ?? 'Candidate',
|
|
'category' => $conv->worker->category->name ?? 'General Helper',
|
|
'worker_status' => strtolower($conv->worker->status ?? 'active'),
|
|
'last_message' => $lastMsg->text ?? 'No messages yet.',
|
|
'unread' => $lastMsg ? ($lastMsg->sender_type === 'worker' && is_null($lastMsg->read_at)) : false,
|
|
'online' => true,
|
|
'sent_at' => $lastMsg ? $lastMsg->created_at->diffForHumans() : 'Just now',
|
|
];
|
|
})->toArray();
|
|
|
|
$activeConv = Conversation::where('employer_id', $user->id)
|
|
->where('id', $id)
|
|
->with(['worker.category', 'messages'])
|
|
->firstOrFail();
|
|
|
|
// Mark incoming messages as read
|
|
Message::where('conversation_id', $activeConv->id)
|
|
->where('sender_type', 'worker')
|
|
->whereNull('read_at')
|
|
->update(['read_at' => now()]);
|
|
|
|
$conversationData = [
|
|
'id' => $activeConv->id,
|
|
'worker_id' => $activeConv->worker_id,
|
|
'worker_name' => $activeConv->worker->name ?? 'Candidate',
|
|
'category' => $activeConv->worker->category->name ?? 'General Helper',
|
|
'worker_status' => strtolower($activeConv->worker->status ?? 'active'),
|
|
'online' => true,
|
|
'salary' => ($activeConv->worker->expected_salary ?? 2000) . ' AED',
|
|
'nationality' => $activeConv->worker->nationality ?? 'Unknown',
|
|
];
|
|
|
|
$initialMessages = $activeConv->messages->map(function ($msg) {
|
|
return [
|
|
'id' => $msg->id,
|
|
'sender' => $msg->sender_type, // employer or worker
|
|
'text' => $msg->text,
|
|
'time' => $msg->created_at->format('g:i A') . ($msg->created_at->isToday() ? ' Today' : ' ' . $msg->created_at->format('M d')),
|
|
];
|
|
})->toArray();
|
|
|
|
return Inertia::render('Employer/Messages/Show', [
|
|
'conversations' => $conversations,
|
|
'conversation' => $conversationData,
|
|
'initialMessages' => $initialMessages,
|
|
]);
|
|
}
|
|
|
|
public function send(Request $request, $id)
|
|
{
|
|
$user = $this->resolveCurrentUser();
|
|
if (!$user) {
|
|
return back()->withErrors(['general' => 'User session not found.']);
|
|
}
|
|
|
|
$request->validate([
|
|
'text' => 'required|string|max:1000',
|
|
]);
|
|
|
|
$conv = Conversation::where('employer_id', $user->id)->where('id', $id)->firstOrFail();
|
|
|
|
$message = Message::create([
|
|
'conversation_id' => $conv->id,
|
|
'sender_type' => 'employer',
|
|
'sender_id' => $user->id,
|
|
'text' => $request->text,
|
|
]);
|
|
|
|
// Touch conversation updated_at for sorting
|
|
$conv->touch();
|
|
|
|
// Check if employer sent predefined message "are you looking job?"
|
|
$textLower = strtolower($request->text);
|
|
if (
|
|
str_contains($textLower, 'looking job') ||
|
|
str_contains($textLower, 'looking for a job') ||
|
|
str_contains($textLower, 'looking for job') ||
|
|
str_contains($textLower, 'are you looking')
|
|
) {
|
|
// Automatically simulate worker response 'Yes' (triggers the S6 hired flow)
|
|
$workerResponseText = 'Yes';
|
|
|
|
// Create the message in database
|
|
Message::create([
|
|
'conversation_id' => $conv->id,
|
|
'sender_type' => 'worker',
|
|
'sender_id' => $conv->worker_id,
|
|
'text' => $workerResponseText,
|
|
]);
|
|
|
|
// Process the worker response to update status to Hired!
|
|
$worker = Worker::find($conv->worker_id);
|
|
if ($worker) {
|
|
self::processWorkerResponse($conv, $worker, $workerResponseText);
|
|
}
|
|
}
|
|
|
|
return back();
|
|
}
|
|
|
|
/**
|
|
* Start or load a conversation with a specific worker.
|
|
*
|
|
* @param int $workerId
|
|
* @return \Illuminate\Http\RedirectResponse
|
|
*/
|
|
public function startConversation($workerId)
|
|
{
|
|
$user = $this->resolveCurrentUser();
|
|
if (!$user) {
|
|
return redirect()->route('employer.login');
|
|
}
|
|
|
|
// Find or create conversation
|
|
$conv = Conversation::firstOrCreate([
|
|
'employer_id' => $user->id,
|
|
'worker_id' => $workerId,
|
|
]);
|
|
|
|
return redirect()->route('employer.messages.show', ['id' => $conv->id]);
|
|
}
|
|
}
|