Files
shipping-portal/app/Http/Controllers/Exports/ExportController.php
T

139 lines
5.3 KiB
PHP

<?php
namespace App\Http\Controllers\Exports;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Excel;
use Illuminate\Support\Facades\Storage;
use App\Classes\General\AWSS3Helper;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\Exportable;
use App\Classes\Modules\Exports\Services\ExportsCompanies;
use App\Classes\Modules\Exports\Services\ExportsSalesInvoicesReport;
use App\Classes\Modules\Exports\Services\ExportsReceivePaymentDepositEntryReport;
use App\Classes\Modules\Exports\Services\ExportsReceivePaymentForOrderReport;
use Carbon\Carbon;
class ExportController
{
public function companies(Request $request){
[$startDate, $endDate] = $this->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();
}
};
}
}