1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace App\Exports;
  3. use App\Models\Transaction;
  4. use App\Services\TransactionService;
  5. use Illuminate\Contracts\Support\Responsable;
  6. use Illuminate\Contracts\View\View;
  7. use Illuminate\Http\Request;
  8. use Maatwebsite\Excel\Concerns\Exportable;
  9. use Maatwebsite\Excel\Concerns\FromView;
  10. use Maatwebsite\Excel\Concerns\ShouldAutoSize;
  11. use Maatwebsite\Excel\Concerns\WithStyles;
  12. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  13. class TransactionExport implements ShouldAutoSize, Responsable, FromView, WithStyles
  14. {
  15. use Exportable;
  16. private $fileName = 'transaction-report.xls';
  17. public function __construct(private Request $request)
  18. {}
  19. public function view(): View
  20. {
  21. $transactions = Transaction::filter(request()->only('startDate', 'endDate', 'outlet'))
  22. ->get()
  23. ->groupBy('created_at')
  24. ->transform(fn($transactions) => [[
  25. 'date' => $transactions->first()->getRawOriginal('created_at'),
  26. 'createdAt' => $transactions->first()->created_at,
  27. 'totalTransaction' => $transactions->count(),
  28. 'totalPrice' => (new TransactionService)->totalPriceGroup($transactions),
  29. ]])
  30. ->flatten(1);
  31. return view('excel.transaction-report', compact('transactions'));
  32. }
  33. public function styles(Worksheet $sheet)
  34. {
  35. $lastRow = $sheet->getHighestDataRow();
  36. $lastSecondRow = $lastRow - 1;
  37. return [
  38. 1 => [
  39. 'font' => ['bold' => true, 'size' => 12],
  40. 'alignment' => ['vertical' => 'center', 'horizontal' => 'center'],
  41. ],
  42. 2 => [
  43. 'font' => ['bold' => true, 'size' => 12],
  44. 'alignment' => ['vertical' => 'center', 'horizontal' => 'center'],
  45. ],
  46. 4 => [
  47. 'font' => ['bold' => true],
  48. ],
  49. 'C' => ['alignment' => ['horizontal' => 'left']],
  50. 'D' => ['alignment' => ['horizontal' => 'left']],
  51. $lastRow => [
  52. 'font' => ['bold' => true, 'size' => 12],
  53. 'alignment' => ['horizontal' => 'left'],
  54. ],
  55. $lastSecondRow => [
  56. 'font' => ['bold' => true, 'size' => 12],
  57. 'alignment' => ['horizontal' => 'left'],
  58. ],
  59. ];
  60. }
  61. }