ReceiptExportController.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. use App\Models\Receipt;
  5. use Illuminate\Support\Str;
  6. use ZipArchive;
  7. use Barryvdh\DomPDF\Facade\Pdf;
  8. class ReceiptExportController extends Controller
  9. {
  10. public function exportZip(Request $request)
  11. {
  12. $q = Receipt::query()->with('member');
  13. if ($request->filled('filterStatus')) {
  14. $q->where('status', $request->input('filterStatus'));
  15. }
  16. if ($request->filled('filterFrom')) {
  17. $q->whereDate('date', '>=', $request->input('filterFrom'));
  18. }
  19. if ($request->filled('filterTo')) {
  20. $q->whereDate('date', '<=', $request->input('filterTo'));
  21. }
  22. if ($request->filled('filterMember')) {
  23. $q->where('member_id', $request->input('filterMember'));
  24. }
  25. // Eventuale ricerca globale
  26. if ($search = $request->input('search')) {
  27. $q->where(function ($sub) use ($search) {
  28. $sub->where('number', 'like', "%{$search}%")
  29. ->orWhere('status', 'like', "%{$search}%")
  30. ->orWhereHas('member', function ($mq) use ($search) {
  31. $mq->where('first_name', 'like', "%{$search}%")
  32. ->orWhere('last_name', 'like', "%{$search}%");
  33. });
  34. });
  35. }
  36. $receipts = $q->get();
  37. if ($receipts->isEmpty()) {
  38. return abort(404, 'Nessuna ricevuta trovata.');
  39. }
  40. $zipFileName = now()->format('Ymd') . '_Ricevute.zip';
  41. $zipPath = storage_path('app/' . $zipFileName);
  42. $zip = new \ZipArchive();
  43. if ($zip->open($zipPath, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) !== true) {
  44. return abort(500, 'Impossibile creare lo ZIP.');
  45. }
  46. foreach ($receipts as $receipt) {
  47. $lastName = Str::slug($receipt->member->last_name ?? 'sconosciuto', '_');
  48. $firstName = Str::slug($receipt->member->first_name ?? 'sconosciuto', '_');
  49. $pdfName = "Ricevuta_{$receipt->number}_{$lastName}_{$firstName}.pdf";
  50. $pdf = PDF::loadView('receipt', ['receipt' => $receipt]);
  51. $zip->addFromString($pdfName, $pdf->output());
  52. }
  53. $zip->close();
  54. return response()->download($zipPath)->deleteFileAfterSend(true);
  55. }
  56. }