Your IP : 216.73.216.79


Current Path : /var/www/html/reddsis/app/Exports/
Upload File :
Current File : /var/www/html/reddsis/app/Exports/FeedbackExport.php

<?php

namespace App\Exports;

use App\Models\Backend\ContentFeedbackMain;
use App\Models\Backend\Ref;
use OpenSpout\Writer\XLSX\Writer;
use OpenSpout\Common\Entity\Row;

class FeedbackExport
{
    public function xlsx($from, $to, $statusFilter, $typeFilter)
    {
        $feedbacks = $this->query($from, $to, $statusFilter, $typeFilter);
        $statuses = Ref::where('cat', 'FEEDBACK_STATUS')->orderBy('sort')->pluck('descr', 'code');
        $types = Ref::where('cat', 'FEEDBACK_TYPE')->orderBy('sort')->pluck('descr', 'code');

        $writer = new Writer();
        $filename = storage_path("app/feedback-export.xlsx");
        $writer->openToFile($filename);

        $header = Row::fromValues(['No', 'Ticket No', 'Name', 'Email', 'Type', 'Category', 'Subject', 'Feedback', 'Status', 'Date']);
        $writer->addRow($header);

        foreach ($feedbacks as $i => $fb) {
            $row = Row::fromValues([
                $i + 1,
                $fb->ticket_no,
                $fb->name,
                $fb->email,
                $types[$fb->type] ?? $fb->type,
                $fb->cat,
                $fb->subject,
                $fb->feedback,
                $statuses[$fb->status] ?? $fb->status,
                $fb->created_at->format('Y-m-d H:i'),
            ]);
            $writer->addRow($row);
        }

        $writer->close();

        return response()->download($filename, 'feedback-' . now()->format('Y-m-d-His') . '.xlsx')->deleteFileAfterSend(true);
    }

    public function csv($from, $to, $statusFilter, $typeFilter)
    {
        $feedbacks = $this->query($from, $to, $statusFilter, $typeFilter);
        $statuses = Ref::where('cat', 'FEEDBACK_STATUS')->orderBy('sort')->pluck('descr', 'code');
        $types = Ref::where('cat', 'FEEDBACK_TYPE')->orderBy('sort')->pluck('descr', 'code');

        $filename = 'feedback-' . now()->format('Y-m-d-His') . '.csv';

        $headers = [
            'Content-Type' => 'text/csv',
            'Content-Disposition' => "attachment; filename=\"$filename\"",
        ];

        $callback = function () use ($feedbacks, $statuses, $types) {
            $handle = fopen('php://output', 'w');
            fputcsv($handle, ['No', 'Ticket No', 'Name', 'Email', 'Type', 'Category', 'Subject', 'Feedback', 'Status', 'Date']);

            foreach ($feedbacks as $i => $fb) {
                fputcsv($handle, [
                    $i + 1,
                    $fb->ticket_no,
                    $fb->name,
                    $fb->email,
                    $types[$fb->type] ?? $fb->type,
                    $fb->cat,
                    $fb->subject,
                    $fb->feedback,
                    $statuses[$fb->status] ?? $fb->status,
                    $fb->created_at->format('Y-m-d H:i'),
                ]);
            }

            fclose($handle);
        };

        return response()->stream($callback, 200, $headers);
    }

    private function query($from, $to, $statusFilter, $typeFilter)
    {
        return ContentFeedbackMain::query()
            ->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')
            ->get();
    }
}