/home2/mshostin/crm.ms-hostingladz.com/app/Http/Controllers/BounceBackController.php
<?php
namespace App\Http\Controllers;
use App\Models\Complaints;
use App\Models\BounceBackComplaint;
use App\Models\MobileAgent;
use App\Models\Department;
use App\Models\ComplaintAssignAgent;
use App\Models\ComplaintAssignDepartment;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Exception;
use App\Services\LogService;
class BounceBackController extends Controller
{
public function detail($complaintId)
{
$complaint = Complaints::with([
'customer',
'type',
'subtype',
'prio',
'assignedComplaints.agents.user',
'assignedComplaintsDepartment.user'
])->findOrFail($complaintId);
$bounceBacks = BounceBackComplaint::with([
'mobileAgent.user',
'departmentUser',
'bouncedByUser'
])->where('complaint_id', $complaintId)
->orderBy('bounced_at', 'desc')
->get();
// Log the admin action
if (auth()->check()) {
LogService::create('BounceBack', $complaintId,
auth()->user()->name . ' viewed bounce back complaint details for complaint #' . $complaint->comp_num
);
}
return view('pages.bounceBack.detail', compact('complaint', 'bounceBacks'));
}
public function index(Request $request)
{
if ($request->type === 'ajax') {
$query = BounceBackComplaint::with([
'complaint.customer',
'complaint.type',
'complaint.subtype',
'complaint.prio',
'complaint.assignedComplaints.agents.user',
'complaint.assignedComplaintsDepartment.user',
'departmentUser'
]);
// Apply search filter
if ($request->has('search') && $request->search != null && $request->search != '') {
$query->whereHas('complaint', function ($q) use ($request) {
$q->where('comp_num', 'LIKE', '%' . $request->search . '%')
->orWhere('customer_name', 'LIKE', '%' . $request->search . '%');
});
}
// Apply type filter
if ($request->has('type_filter') && $request->type_filter != null && $request->type_filter != '') {
$query->where('type', $request->type_filter);
}
// Apply status filter
if ($request->has('status_filter') && $request->status_filter != null && $request->status_filter != '') {
$query->where('status', $request->status_filter);
}
$bounceBacks = $query->orderBy('bounced_at', 'desc')->paginate(15);
// Log the admin action
if (auth()->check()) {
LogService::create('BounceBack', 0,
auth()->user()->name . ' viewed bounce back complaints list (Admin Panel)'
);
}
return response()->json($bounceBacks);
}
return view('pages.bounceBack.index');
}
public function getAgents()
{
$agents = MobileAgent::with(['user'])
->where('status', 1)
->get();
// Log the action
if (auth()->check()) {
LogService::create('BounceBack', 0,
auth()->user()->name . ' loaded mobile agents list for bounce back assignment'
);
}
return response()->json($agents);
}
public function getDepartments()
{
$departments = Department::where('status', 1)->get();
// Log the action
if (auth()->check()) {
LogService::create('BounceBack', 0,
auth()->user()->name . ' loaded departments list for bounce back assignment'
);
}
return response()->json($departments);
}
public function assign(Request $request)
{
try {
$request->validate([
'complaint_id' => 'required|exists:complaint,id',
'assignment_type' => 'required|in:agent,department',
'agent_id' => 'required_if:assignment_type,agent|exists:mobile_agent,id',
'department_id' => 'required_if:assignment_type,department|exists:departments,id'
]);
$complaintId = $request->complaint_id;
$assignmentType = $request->assignment_type;
// Check if complaint is already assigned
$existingAssignment = null;
if ($assignmentType === 'agent') {
$existingAssignment = ComplaintAssignAgent::where('complaint_id', $complaintId)->first();
} else {
$existingAssignment = ComplaintAssignDepartment::where('complaint_id', $complaintId)->first();
}
if ($existingAssignment) {
return response()->json([
'success' => false,
'message' => 'Complaint is already assigned to ' . $assignmentType
], 400);
}
// Create new assignment
if ($assignmentType === 'agent') {
ComplaintAssignAgent::create([
'complaint_id' => $complaintId,
'agent_id' => $request->agent_id,
'status' => 0
]);
} else {
ComplaintAssignDepartment::create([
'complaint_id' => $complaintId,
'user_id' => $request->department_id,
'status' => 0
]);
}
// Update bounce back status to resolved
BounceBackComplaint::where('complaint_id', $complaintId)
->where('status', 'active')
->update(['status' => 'resolved']);
// Log the assignment action
$assignmentType = $assignmentType === 'agent' ? 'Mobile Agent' : 'Department';
$assignedTo = '';
if ($assignmentType === 'Mobile Agent') {
$agent = MobileAgent::with('user')->find($request->agent_id);
$assignedTo = $agent ? $agent->user->name : 'Unknown Agent';
} else {
$department = Department::find($request->department_id);
$assignedTo = $department ? $department->name : 'Unknown Department';
}
LogService::create('Complaint', $complaintId,
"Bounce back complaint reassigned to {$assignmentType}: {$assignedTo} by " . auth()->user()->name
);
return response()->json([
'success' => true,
'message' => 'Complaint assigned successfully'
]);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => $e->getMessage()
], 500);
}
}
}