Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

ExportService.php 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace App\Services;
  3. use App\Contracts\ExportableReport;
  4. use App\Models\Company;
  5. use Barryvdh\Snappy\Facades\SnappyPdf;
  6. use Carbon\Exceptions\InvalidFormatException;
  7. use Illuminate\Support\Carbon;
  8. use League\Csv\Bom;
  9. use League\Csv\CannotInsertRecord;
  10. use League\Csv\Exception;
  11. use League\Csv\Writer;
  12. use Symfony\Component\HttpFoundation\StreamedResponse;
  13. class ExportService
  14. {
  15. public function exportToCsv(Company $company, ExportableReport $report, ?string $startDate = null, ?string $endDate = null): StreamedResponse
  16. {
  17. if ($startDate && $endDate) {
  18. $formattedStartDate = Carbon::parse($startDate)->toDateString();
  19. $formattedEndDate = Carbon::parse($endDate)->toDateString();
  20. $dateLabel = $formattedStartDate . ' to ' . $formattedEndDate;
  21. } else {
  22. $formattedAsOfDate = Carbon::parse($endDate)->toDateString();
  23. $dateLabel = $formattedAsOfDate;
  24. }
  25. $timestamp = Carbon::now()->format('Y-m-d_H-i-s');
  26. $filename = $company->name . ' ' . $report->getTitle() . ' ' . $dateLabel . ' ' . $timestamp . '.csv';
  27. $headers = [
  28. 'Content-Type' => 'text/csv',
  29. 'Content-Disposition' => 'attachment; filename="' . $filename . '"',
  30. ];
  31. $callback = function () use ($startDate, $endDate, $report, $company) {
  32. $csv = Writer::createFromStream(fopen('php://output', 'wb'));
  33. $csv->setOutputBOM(Bom::Utf8);
  34. if ($startDate && $endDate) {
  35. $defaultStartDateFormat = Carbon::parse($startDate)->toDefaultDateFormat();
  36. $defaultEndDateFormat = Carbon::parse($endDate)->toDefaultDateFormat();
  37. $dateLabel = 'Date Range: ' . $defaultStartDateFormat . ' to ' . $defaultEndDateFormat;
  38. } else {
  39. $dateLabel = 'As of ' . Carbon::parse($endDate)->toDefaultDateFormat();
  40. }
  41. $csv->insertOne([$report->getTitle()]);
  42. $csv->insertOne([$company->name]);
  43. $csv->insertOne([$dateLabel]);
  44. $csv->insertOne([]);
  45. $csv->insertOne($report->getHeaders());
  46. foreach ($report->getCategories() as $category) {
  47. $this->writeDataRowsToCsv($csv, $category->header, $category->data, $report->getColumns());
  48. foreach ($category->types ?? [] as $type) {
  49. $this->writeDataRowsToCsv($csv, $type->header, $type->data, $report->getColumns());
  50. if (filled($type->summary)) {
  51. $csv->insertOne($type->summary);
  52. }
  53. }
  54. if (filled($category->summary)) {
  55. $csv->insertOne($category->summary);
  56. }
  57. $csv->insertOne([]);
  58. }
  59. if (filled($report->getOverallTotals())) {
  60. $csv->insertOne($report->getOverallTotals());
  61. }
  62. };
  63. return response()->streamDownload($callback, $filename, $headers);
  64. }
  65. public function exportToPdf(Company $company, ExportableReport $report, ?string $startDate = null, ?string $endDate = null): StreamedResponse
  66. {
  67. if ($startDate && $endDate) {
  68. $formattedStartDate = Carbon::parse($startDate)->toDateString();
  69. $formattedEndDate = Carbon::parse($endDate)->toDateString();
  70. $dateLabel = $formattedStartDate . ' to ' . $formattedEndDate;
  71. } else {
  72. $formattedAsOfDate = Carbon::parse($endDate)->toDateString();
  73. $dateLabel = $formattedAsOfDate;
  74. }
  75. $timestamp = Carbon::now()->format('Y-m-d_H-i-s');
  76. $filename = $company->name . ' ' . $report->getTitle() . ' ' . $dateLabel . ' ' . $timestamp . '.pdf';
  77. $pdf = SnappyPdf::loadView($report->getPdfView(), [
  78. 'company' => $company,
  79. 'report' => $report,
  80. 'startDate' => $startDate ? Carbon::parse($startDate)->toDefaultDateFormat() : null,
  81. 'endDate' => $endDate ? Carbon::parse($endDate)->toDefaultDateFormat() : null,
  82. ]);
  83. return response()->streamDownload(function () use ($pdf) {
  84. echo $pdf->inline();
  85. }, $filename);
  86. }
  87. /**
  88. * @throws CannotInsertRecord
  89. * @throws Exception
  90. */
  91. protected function writeDataRowsToCsv(Writer $csv, array $header, array $data, array $columns): void
  92. {
  93. if (isset($header[0]) && is_array($header[0])) {
  94. foreach ($header as $headerRow) {
  95. $csv->insertOne($headerRow);
  96. }
  97. } else {
  98. $csv->insertOne($header);
  99. }
  100. // Output data rows
  101. foreach ($data as $rowData) {
  102. $row = [];
  103. foreach ($columns as $column) {
  104. $columnName = $column->getName();
  105. $cell = $rowData[$columnName] ?? '';
  106. if ($column->isDate()) {
  107. try {
  108. $row[] = Carbon::parse($cell)->toDateString();
  109. } catch (InvalidFormatException) {
  110. $row[] = $cell;
  111. }
  112. } elseif (is_array($cell)) {
  113. $row[] = $cell['name'] ?? $cell['description'] ?? '';
  114. } else {
  115. $row[] = $cell;
  116. }
  117. }
  118. $csv->insertOne($row);
  119. }
  120. }
  121. }