getValidatedDates($request); $exporter = new ExportsCompanies($startDate, $endDate); return $this->handleExport($exporter, 'IZYIM - Customers Data Report.xls'); } public function salesInvoices(Request $request){ [$startDate, $endDate] = $this->getValidatedDates($request); $exporter = new ExportsSalesInvoicesReport($startDate, $endDate); //This will merge both paid and unpaid into a single excel sheet // $exporterA = new ExportsSalesInvoicesReport($startDate, $endDate); // $exporterB = new ExportsSalesInvoicesReport($startDate, $endDate, true); // $exporter = $this->buildCombinedInvoices($exporterA, $exporterB); return $this->handleExport($exporter, 'IZYIM - Sales Invoice Report.xls'); } public function salesInvoicesUnpaid(Request $request){ [$startDate, $endDate] = $this->getValidatedDates($request); $exporter = new ExportsSalesInvoicesReport($startDate, $endDate, true); return $this->handleExport($exporter, 'IZYIM - Sales Invoice Report (unpaid).xls'); } public function receivePaymentDepositEntry(Request $request){ [$startDate, $endDate] = $this->getValidatedDates($request); $exporter = new ExportsReceivePaymentDepositEntryReport($startDate, $endDate); return $this->handleExport($exporter, '11D - IZYIM - RECEIVE PAYMENT (FULL PAYMENT) [AR DEPOSIT ENTRY].xls'); } public function receivePaymentForOrder(Request $request){ [$startDate, $endDate] = $this->getValidatedDates($request); $exporter = new ExportsReceivePaymentForOrderReport($startDate, $endDate); return $this->handleExport($exporter, '11R - IZYIM - RECEIVE PAYMENT (FULL PAYMENT) [AR RECEIVE PAYMENT].xls'); } private function getValidatedDates(Request $request): array { $validated = $request->validate([ 'startDate' => 'nullable|date_format:d-m-Y', 'endDate' => 'nullable|date_format:d-m-Y|after_or_equal:startDate', ]); // $startDate = isset($validated['startDate']) && $validated['startDate'] // ? Carbon::createFromFormat('d-m-Y', $validated['startDate'])->startOfDay() // : Carbon::now()->subMonth()->startOfDay(); // $endDate = isset($validated['endDate']) && $validated['endDate'] // ? Carbon::createFromFormat('d-m-Y', $validated['endDate'])->endOfDay() // : Carbon::now()->endOfDay(); $startDate = isset($validated['startDate']) && $validated['startDate'] ? Carbon::createFromFormat('d-m-Y', $validated['startDate'])->startOfDay() : Carbon::now()->startOfMonth()->startOfDay(); $endDate = isset($validated['endDate']) && $validated['endDate'] ? Carbon::createFromFormat('d-m-Y', $validated['endDate'])->endOfDay() : Carbon::now()->endOfMonth()->endOfDay(); return [$startDate, $endDate]; } private function handleExport($exporter, string $exportFileName) { $filesystemDriver = Storage::getDefaultDriver(); if ($filesystemDriver === 's3') { return response([ 'src' => AWSS3Helper::S3Exportable($exportFileName, $exporter) ]); } $response = $exporter->download( $exportFileName, Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'] ); ob_end_clean(); // prevent corrupt download in some environments return $response; } private function buildCombinedInvoices($reportA, $reportB) { return new class($reportA, $reportB) implements FromCollection, WithHeadings, ShouldAutoSize { use Exportable; private $reportA; private $reportB; public function __construct($reportA, $reportB) { $this->reportA = $reportA; $this->reportB = $reportB; } public function collection() { $dataA = $this->reportA->query()->get()->map(function ($row) { return $this->reportA->map($row); }); $dataB = $this->reportB->query()->get()->map(function ($row) { return $this->reportB->map($row); }); return $dataA->merge($dataB); } public function headings(): array { return $this->reportA->headings(); } }; } }