| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 | 
							- <?php
 - 
 - namespace App\Services;
 - 
 - use App\Contracts\ExportableReport;
 - use App\Models\Company;
 - use Barryvdh\Snappy\Facades\SnappyPdf;
 - use Carbon\Exceptions\InvalidFormatException;
 - use Illuminate\Support\Carbon;
 - use League\Csv\Bom;
 - use League\Csv\CannotInsertRecord;
 - use League\Csv\Exception;
 - use League\Csv\Writer;
 - use Symfony\Component\HttpFoundation\StreamedResponse;
 - 
 - class ExportService
 - {
 -     public function exportToCsv(Company $company, ExportableReport $report, ?string $startDate = null, ?string $endDate = null): StreamedResponse
 -     {
 -         if ($startDate && $endDate) {
 -             $formattedStartDate = Carbon::parse($startDate)->toDateString();
 -             $formattedEndDate = Carbon::parse($endDate)->toDateString();
 -             $dateLabel = $formattedStartDate . ' to ' . $formattedEndDate;
 -         } else {
 -             $formattedAsOfDate = Carbon::parse($endDate)->toDateString();
 -             $dateLabel = $formattedAsOfDate;
 -         }
 - 
 -         $timestamp = Carbon::now()->format('Y-m-d_H-i-s');
 - 
 -         $filename = $company->name . ' ' . $report->getTitle() . ' ' . $dateLabel . ' ' . $timestamp . '.csv';
 - 
 -         $headers = [
 -             'Content-Type' => 'text/csv',
 -             'Content-Disposition' => 'attachment; filename="' . $filename . '"',
 -         ];
 - 
 -         $callback = function () use ($startDate, $endDate, $report, $company) {
 -             $csv = Writer::createFromStream(fopen('php://output', 'wb'));
 -             $csv->setOutputBOM(Bom::Utf8);
 - 
 -             if ($startDate && $endDate) {
 -                 $defaultStartDateFormat = Carbon::parse($startDate)->toDefaultDateFormat();
 -                 $defaultEndDateFormat = Carbon::parse($endDate)->toDefaultDateFormat();
 -                 $dateLabel = 'Date Range: ' . $defaultStartDateFormat . ' to ' . $defaultEndDateFormat;
 -             } else {
 -                 $dateLabel = 'As of ' . Carbon::parse($endDate)->toDefaultDateFormat();
 -             }
 - 
 -             $csv->insertOne([$report->getTitle()]);
 -             $csv->insertOne([$company->name]);
 -             $csv->insertOne([$dateLabel]);
 -             $csv->insertOne([]);
 - 
 -             $csv->insertOne($report->getHeaders());
 - 
 -             foreach ($report->getCategories() as $category) {
 -                 $this->writeDataRowsToCsv($csv, $category->header, $category->data, $report->getColumns());
 - 
 -                 foreach ($category->types ?? [] as $type) {
 -                     $this->writeDataRowsToCsv($csv, $type->header, $type->data, $report->getColumns());
 - 
 -                     if (filled($type->summary)) {
 -                         $csv->insertOne($type->summary);
 -                     }
 -                 }
 - 
 -                 if (filled($category->summary)) {
 -                     $csv->insertOne($category->summary);
 -                 }
 - 
 -                 $csv->insertOne([]);
 -             }
 - 
 -             if (filled($report->getOverallTotals())) {
 -                 $csv->insertOne($report->getOverallTotals());
 -             }
 -         };
 - 
 -         return response()->streamDownload($callback, $filename, $headers);
 -     }
 - 
 -     public function exportToPdf(Company $company, ExportableReport $report, ?string $startDate = null, ?string $endDate = null): StreamedResponse
 -     {
 -         if ($startDate && $endDate) {
 -             $formattedStartDate = Carbon::parse($startDate)->toDateString();
 -             $formattedEndDate = Carbon::parse($endDate)->toDateString();
 -             $dateLabel = $formattedStartDate . ' to ' . $formattedEndDate;
 -         } else {
 -             $formattedAsOfDate = Carbon::parse($endDate)->toDateString();
 -             $dateLabel = $formattedAsOfDate;
 -         }
 - 
 -         $timestamp = Carbon::now()->format('Y-m-d_H-i-s');
 - 
 -         $filename = $company->name . ' ' . $report->getTitle() . ' ' . $dateLabel . ' ' . $timestamp . '.pdf';
 - 
 -         $pdf = SnappyPdf::loadView($report->getPdfView(), [
 -             'company' => $company,
 -             'report' => $report,
 -             'startDate' => $startDate ? Carbon::parse($startDate)->toDefaultDateFormat() : null,
 -             'endDate' => $endDate ? Carbon::parse($endDate)->toDefaultDateFormat() : null,
 -         ]);
 - 
 -         return response()->streamDownload(function () use ($pdf) {
 -             echo $pdf->inline();
 -         }, $filename);
 -     }
 - 
 -     /**
 -      * @throws CannotInsertRecord
 -      * @throws Exception
 -      */
 -     protected function writeDataRowsToCsv(Writer $csv, array $header, array $data, array $columns): void
 -     {
 -         if (isset($header[0]) && is_array($header[0])) {
 -             foreach ($header as $headerRow) {
 -                 $csv->insertOne($headerRow);
 -             }
 -         } else {
 -             $csv->insertOne($header);
 -         }
 - 
 -         // Output data rows
 -         foreach ($data as $rowData) {
 -             $row = [];
 - 
 -             foreach ($columns as $column) {
 -                 $columnName = $column->getName();
 -                 $cell = $rowData[$columnName] ?? '';
 - 
 -                 if ($column->isDate()) {
 -                     try {
 -                         $row[] = Carbon::parse($cell)->toDateString();
 -                     } catch (InvalidFormatException) {
 -                         $row[] = $cell;
 -                     }
 -                 } elseif (is_array($cell)) {
 -                     $row[] = $cell['name'] ?? $cell['description'] ?? '';
 -                 } else {
 -                     $row[] = $cell;
 -                 }
 -             }
 - 
 -             $csv->insertOne($row);
 -         }
 -     }
 - }
 
 
  |