| Current Path : /var/www/html/reddsis/app/Http/Controllers/Backend/ |
| Current File : /var/www/html/reddsis/app/Http/Controllers/Backend/ContentFeedbackController.php |
<?php
namespace App\Http\Controllers\Backend;
use App\Exports\FeedbackExport;
use App\Exports\FeedbackPdfExport;
use App\Http\Controllers\Controller;
use App\Http\Requests\Backend\ContentFeedbackRequest;
use App\Mail\FeedbackSubmittedMail;
use App\Models\Backend\BackendUser;
use App\Models\Backend\ContentFeedbackMain;
use App\Models\Backend\ContentFeedbackMessage;
use App\Models\Backend\Ref;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
class ContentFeedbackController extends Controller
{
public function index(Request $request)
{
$search = $request->get('search');
$from = $request->get('from');
$to = $request->get('to');
$statusFilter = $request->get('status');
$typeFilter = $request->get('type');
$feedbacks = ContentFeedbackMain::query()
->withCount(['messages' => fn($q) => $q->where('read_status', 'UNREAD')])
->when($search, function ($q) use ($search) {
$q->where(function ($sub) use ($search) {
$sub->where('ticket_no', 'like', "%{$search}%")
->orWhere('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%")
->orWhere('subject', 'like', "%{$search}%")
->orWhere('feedback', 'like', "%{$search}%");
});
})
->when($from, fn($q) => $q->whereDate('created_at', '>=', $from))
->when($to, fn($q) => $q->whereDate('created_at', '<=', $to))
->when($statusFilter, fn($q) => $q->where('status', $statusFilter))
->when($typeFilter, fn($q) => $q->where('type', $typeFilter))
->orderBy('created_at', 'desc')
->paginate(10)
->onEachSide(1)
->withQueryString();
$statuses = Ref::where('cat', 'FEEDBACK_STATUS')->orderBy('sort')->pluck('descr', 'code');
$types = Ref::where('cat', 'FEEDBACK_TYPE')->orderBy('sort')->pluck('descr', 'code');
$categories = Ref::where('cat', 'FEEDBACK_CATEGORY')->orderBy('sort')->pluck('descr', 'code');
return view('backend.module.contentFeedback.index', [
'feedbacks' => $feedbacks,
'statuses' => $statuses,
'types' => $types,
'categories' => $categories,
'search' => $search,
'from' => $from,
'to' => $to,
'statusFilter' => $statusFilter,
'typeFilter' => $typeFilter,
]);
}
public function create()
{
$types = Ref::where('cat', 'FEEDBACK_TYPE')->orderBy('sort')->pluck('descr', 'code');
$categories = Ref::where('cat', 'FEEDBACK_CATEGORY')->orderBy('sort')->pluck('descr', 'code');
return view('backend.module.contentFeedback.create', [
'types' => $types,
'categories' => $categories,
]);
}
public function store(ContentFeedbackRequest $request)
{
$feedback = ContentFeedbackMain::create([
'ticket_no' => ContentFeedbackMain::generateTicketNo(),
'name' => $request->name,
'email' => $request->email,
'type' => $request->type,
'cat' => $request->cat,
'subject' => $request->subject,
'feedback' => $request->feedback,
'status' => 'PENDING',
'created_user_type' => auth()->user()->getRoleNames()->first() ?? 'admin',
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
]);
try {
if ($feedback->email) {
Mail::to($feedback->email)->send(
new FeedbackSubmittedMail([
'name' => $feedback->name,
'subject' => $feedback->subject,
'ticket_no' => $feedback->ticket_no,
'message' => $feedback->feedback,
], 'user')
);
}
$admins = BackendUser::role('superadmin')->get();
foreach ($admins as $admin) {
Mail::to($admin->email)->send(
new FeedbackSubmittedMail([
'name' => $feedback->name,
'email' => $feedback->email,
'subject' => $feedback->subject,
'ticket_no' => $feedback->ticket_no,
'message' => $feedback->feedback,
], 'admin')
);
}
} catch (\Exception $e) {
}
flash()->success("Feedback [{$feedback->ticket_no}] created successfully!");
return redirect()->route('content-feedback.index');
}
public function edit($id)
{
$feedback = ContentFeedbackMain::with('messages')->findOrFail($id);
if ($feedback->status === 'PENDING') {
$feedback->update([
'status' => 'READ',
'updated_by' => auth()->id(),
]);
}
ContentFeedbackMessage::where('feedback_id', $id)
->where('read_status', 'UNREAD')
->where('send_to', 'admin')
->update(['read_status' => 'READ']);
$statuses = Ref::where('cat', 'FEEDBACK_STATUS')->orderBy('sort')->pluck('descr', 'code');
$types = Ref::where('cat', 'FEEDBACK_TYPE')->orderBy('sort')->pluck('descr', 'code');
$categories = Ref::where('cat', 'FEEDBACK_CATEGORY')->orderBy('sort')->pluck('descr', 'code');
return view('backend.module.contentFeedback.edit', [
'feedback' => $feedback,
'statuses' => $statuses,
'types' => $types,
'categories' => $categories,
]);
}
public function update(ContentFeedbackRequest $request, $id)
{
$feedback = ContentFeedbackMain::findOrFail($id);
$data = [
'type' => $request->type ?? $feedback->type,
'cat' => $request->cat ?? $feedback->cat,
'status' => $request->status ?? $feedback->status,
'updated_by' => auth()->id(),
'updated_user_type' => auth()->user()->getRoleNames()->first() ?? 'admin',
];
if ($request->filled('reply_message')) {
ContentFeedbackMessage::create([
'feedback_id' => $feedback->id,
'message' => $request->reply_message,
'read_status' => 'UNREAD',
'send_to' => 'user',
'created_user_type' => auth()->user()->getRoleNames()->first() ?? 'user',
'created_at' => now(),
'created_by' => auth()->id(),
]);
$data['status'] = 'REPLIED';
try {
if ($feedback->email) {
Mail::to($feedback->email)->send(
new FeedbackSubmittedMail([
'name' => $feedback->name,
'subject' => $feedback->subject,
'ticket_no' => $feedback->ticket_no,
'message' => $request->reply_message,
], 'reply')
);
}
} catch (\Exception $e) {
}
}
$feedback->update($data);
flash()->success('Feedback updated successfully!');
return redirect()->route('content-feedback.edit', $feedback->id);
}
public function export(Request $request)
{
$from = $request->get('from');
$to = $request->get('to');
$statusFilter = $request->get('status');
$typeFilter = $request->get('type');
$format = $request->get('format', 'csv');
return match ($format) {
'xlsx' => app(FeedbackExport::class)->xlsx($from, $to, $statusFilter, $typeFilter),
'pdf' => app(FeedbackPdfExport::class)->pdf($from, $to, $statusFilter, $typeFilter),
default => app(FeedbackExport::class)->csv($from, $to, $statusFilter, $typeFilter),
};
}
public function destroy($id)
{
$feedback = ContentFeedbackMain::findOrFail($id);
$feedback->delete();
flash()->success('Feedback deleted successfully.');
return redirect()->route('content-feedback.index');
}
}