Your IP : 216.73.216.79


Current Path : /var/www/html/reddsis/app/Http/Controllers/Backend/
Upload File :
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');
    }
}