Create download api for booking document (invoice, purchase order, deliver order, supplier deliver order)

This commit is contained in:
ahmedsophyudden
2022-02-27 23:09:12 +08:00
parent d5ecd0330e
commit 5eb24878f9
3 changed files with 116 additions and 0 deletions
@@ -0,0 +1,94 @@
<?php
namespace App\Classes\Modules\Bookings\ControllersLogic;
use ZipArchive;
use Carbon\Carbon;
use App\Models\User;
use App\Models\Booking;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use App\Classes\Exceptions\MalformedRequestException;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Classes\General\Abstracts\AbstractControllerLogic;
class DownloadBookingDocumentLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification(): array
{
return [
'title' => 'Download Booking Document',
'message' => 'You have successfully retrieved a Booking Document'
];
}
/**
* DownloadBookingDocumentLogic constructor.
*/
public function __construct()
{
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request): JsonResponse
{
Auth::login(User::findOrFail(1));
$zip_file = 'do_' . Carbon::yesterday()->format('Y_m_d') . '.zip';
$attachment = storage_path() . '/' . $zip_file;
$zip = new ZipArchive();
if ($zip->open($attachment, ZIPARCHIVE::CREATE | ZipArchive::OVERWRITE)) {
$bookings = Booking::where('status', ApprovalStatus::COMPLETED)->whereDate('updated_at', '>=', $request->input('startDate'))->whereDate('updated_at', '<=', $request->input('endDate'))
->whereHas('transactions', function ($query) {
return $query->where('type', TransactionType::PAYMENT)->whereHas('transactions', function ($query) {
return $query->where('issuer', 2);
});
})->get();
if (!count($bookings)) throw new MalformedRequestException('No available file to download');
foreach ($bookings as $booking) {
$file = $booking->documents()->where('document_type', $request->input('type'))->first()->files()->first();
$zip->addFile(Storage::disk('documents')->path($file->file->file_info->original->file), $booking->created_at->format('d_m_Y') . '_' . $booking->marking . '.pdf');
}
$zip->close();
while (ob_get_level()) {
ob_end_clean();
}
ob_start();
header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: " . filesize($attachment));
header('Pragma: no-cache');
header("Content-Disposition: attachment; filename=\"" . basename($attachment) . "\"");
ob_flush();
ob_clean();
readfile($attachment);
File::delete($attachment);
exit;
}
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Bookings;
use App\Classes\Modules\Bookings\ControllersLogic\DownloadBookingDocumentLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class DownloadBookingDocumentController
{
/**
* @param Request $request
* @param DownloadBookingDocumentLogic $logic
* @return JsonResponse
*/
public function download(Request $request, DownloadBookingDocumentLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
+2
View File
@@ -32,4 +32,6 @@ Route::group(['prefix' => 'booking', 'as' => 'booking.', 'namespace' => 'Booking
Route::post('{id}/proforma/create', 'CreateProformaInvoiceTransaction@create')->name('proforma.create');
Route::get('/document/download', 'DownloadBookingDocumentController@download')->name('download');
});