| Current Path : /var/www/html/reddsis/app/Exports/ |
| 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();
}
}