Files
api-extranetwork/app/Http/Controllers/V1/ExportPdfController.php
ExtraNetwork e5c4b6aa13 first commit
2026-05-12 17:04:54 +03:00

742 lines
30 KiB
PHP

<?php
namespace App\Http\Controllers\V1;
use App\Core\Mail\PropertyProductOfferMail;
use App\Core\Service\PdfContentService;
use App\Core\Service\PropertyRoomService;
use App\Exceptions\ApiErrorException;
use App\Jobs\PropertyCatalogServiceJob;
use App\Jobs\RunPropertyCatalogService;
use App\Models\PropertyProductOffer;
use App\Models\User;
use Carbon\Carbon;
use Exception;
use Illuminate\Mail\Mailer;
use Illuminate\Support\Facades\App;
use Barryvdh\DomPDF\PDF;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
class ExportPdfController
{
private $pdf;
private $pdfContentService;
private $propertyRoomService;
public function __construct(
PDF $pdf,
PdfContentService $pdfContentService,
PropertyRoomService $propertyRoomService,
Mailer $mailer
)
{
$this->pdf = $pdf;
$this->pdfContentService = $pdfContentService;
$this->propertyRoomService = $propertyRoomService;
$this->mailer = $mailer;
}
public function pdf(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = json_decode($request->getContent(), 1);
$params = current($params);
if (isset($params['dataExport']) && $params['dataExport'] == 'json') {
$pdfDataRequest = [
'property_id' => fillOnUndefined($params, 'property_id', null),
'locale' => app('translator')->getLocale()
];
$factSheetDataResponse = $this->pdfContentService->factSheetData($pdfDataRequest);
if ($factSheetDataResponse['status'] != 'success') {
throw new Exception($factSheetDataResponse['message']);
}
$factSheetData = $factSheetDataResponse['data'];
return apiResponse(1, null, $factSheetData, 200);
}
if (isset($params['dataExport']) && $params['dataExport'] == 'catalog') {
/*$pdfDataRequest = [
'property_id' => fillOnUndefined($params, 'property_id', null),
'locale' => fillOnUndefined($params, 'language', 'en'),
];
$factSheetDataResponse = $this->pdfContentService->factSheetData($pdfDataRequest);
if ($factSheetDataResponse['status'] != 'success') {
throw new Exception($factSheetDataResponse['message']);
}
$pageContent = $factSheetDataResponse['data'];
$pdfLanguage = $pdfDataRequest['locale'];
app('translator')->setLocale($pdfLanguage);
$pdfService = $this->pdf->loadView('pdf.propertyCatalog', compact('pageContent'), [], 'UTF8');
//$pdfService->setOptions(['dpi' => 100, 'isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true]);
$hotelName = Str::slug($pageContent['name'], '_', 'en') . '_' . $pdfLanguage;
return $pdfService->download($hotelName . '.pdf');*/
dispatch(new PropertyCatalogServiceJob(
fillOnUndefined($params, 'property_id', null),
fillOnUndefined($params, 'language', app('translator')->getLocale()),
fillOnUndefined($params, 'email', null)
));
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => null];
return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);
}
$pdfDataRequest = [
'property_id' => fillOnUndefined($params, 'property_id', null),
'locale' => app('translator')->getLocale()
];
$pdfDataResponse = $this->pdfContentService->pdfData($pdfDataRequest);
if ($pdfDataResponse['status'] != 'success') {
throw new Exception($pdfDataResponse['message']);
}
$pdfData = $pdfDataResponse['data'];
$pdfLanguage = upperCase(app('translator')->getLocale());
$logoBase64 = null;
if ($pdfData['property_brand']) {
if ($pdfData['property_brand']['logo_name']) {
$logoFile = Config::get('app.imageUrl') . '/property-photos/' . $pdfData['property_brand']['property_id'] . '/logo/' . $pdfData['property_brand']['logo_name'] . '_250x250.' . $pdfData['property_brand']['logo_file_ext'];
$logoBase64 = 'data:image/' . $pdfData['property_brand']['logo_file_ext'] . ';base64,' . base64_encode(file_get_contents($logoFile));
}
}
$ip = $request->ip();
$pdf = $this->pdf->loadView('pdf.hotelContent', compact('pdfData', 'logoBase64', 'ip'), [], 'UTF8');
$hotelName = Str::slug($pdfData['name'], '_', 'en') . '_' . $pdfLanguage;
return $pdf->download($hotelName . '.pdf');
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
$response['statusCode'] = 400;
} catch (\Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
$response['statusCode'] = 500;
}
return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);
// return $pdf->stream();
}
public function getPropertyPdfInventory(Request $request, $token)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
$requestParams = [
'token' => $token
];
$params = $this->propertyRoomService->getParamsForPdfInvenyory($requestParams);
$params = $params['data'];
$requestParams = [
'property_id' => fillOnUndefined($params, 'property_id'),
'channel_id' => fillOnUndefined($params, 'channel_id'),
'start_date' => fillOnUndefined($params, 'start_date'),
'end_date' => fillOnUndefined($params, 'end_date'),
];
$inventoryData = $this->propertyRoomService->getPropertyRoomInventory($requestParams);
if ($inventoryData['status'] != 'success') {
throw new ApiErrorException($inventoryData['message']);
}
$data = $inventoryData['data'];
foreach ($data as $dataKey => $dataVal) {
//room_availability
$i = 0;
$monthKey = null;
foreach ($dataVal['room_availability'] as $key => $val) {
$keyArr = explode('-', $key);
if ($monthKey != $keyArr[1]) {
$monthKey = $keyArr[1];
$i++;
}
if ($i > 6) {
continue;
}
$data[$dataKey]['monthly_room_availability'][$i][$key] = $val;
}
//room_stop_sell
$i = 0;
$monthKey = null;
foreach ($dataVal['room_stop_sell'] as $key => $val) {
$keyArr = explode('-', $key);
if ($monthKey != $keyArr[1]) {
$monthKey = $keyArr[1];
$i++;
}
if ($i > 6) {
continue;
}
$data[$dataKey]['monthly_room_stop_sell'][$i][$key] = $val;
}
foreach ($dataVal['property_room_rate_mapping'] as $propertyRoomRateMappingKey => $propertyRoomRateMappingVal) {
foreach ($propertyRoomRateMappingVal['prices'] as $pricesKey => $pricesVal) {
//price
$i = 0;
$monthKey = null;
foreach ($pricesVal['price'] as $key => $val) {
$keyArr = explode('-', $key);
if ($monthKey != $keyArr[1]) {
$monthKey = $keyArr[1];
$i++;
}
if ($i > 6) {
continue;
}
$data[$dataKey]['property_room_rate_mapping'][$propertyRoomRateMappingKey]['prices'][$pricesKey]['monthly_price'][$i][$key] = $val;
}
//stop_sell
$i = 0;
$monthKey = null;
foreach ($pricesVal['stop_sell'] as $key => $val) {
$keyArr = explode('-', $key);
if ($monthKey != $keyArr[1]) {
$monthKey = $keyArr[1];
$i++;
}
if ($i > 6) {
continue;
}
$data[$dataKey]['property_room_rate_mapping'][$propertyRoomRateMappingKey]['prices'][$pricesKey]['monthly_stop_sell'][$i][$key] = $val;
}
//min_stay
$i = 0;
$monthKey = null;
foreach ($pricesVal['min_stay'] as $key => $val) {
$keyArr = explode('-', $key);
if ($monthKey != $keyArr[1]) {
$monthKey = $keyArr[1];
$i++;
}
if ($i > 6) {
continue;
}
$data[$dataKey]['property_room_rate_mapping'][$propertyRoomRateMappingKey]['prices'][$pricesKey]['monthly_min_stay'][$i][$key] = $val;
}
}
}
}
$propertyDataRequest = [
'property_id' => fillOnUndefined($params, 'property_id', null)
];
$propertyDataResponse = $this->pdfContentService->propertyBaseData($propertyDataRequest);
if ($propertyDataResponse['status'] != 'success') {
throw new Exception($propertyDataResponse['message']);
}
$propertyData = $propertyDataResponse['data'];
$logoBase64 = null;
if ($propertyData['property_brand']) {
if ($propertyData['property_brand']['logo_name']) {
$logoFile = Config::get('app.imageUrl') . '/property-photos/' . $propertyData['property_brand']['property_id'] . '/logo/' . $propertyData['property_brand']['logo_name'] . '_250x250.' . $propertyData['property_brand']['logo_file_ext'];
$logoBase64 = 'data:image/' . $propertyData['property_brand']['logo_file_ext'] . ';base64,' . base64_encode(file_get_contents($logoFile));
}
}
/*$pdf = $this->pdf->loadView('pdf.inventory', compact('data','propertyData','logoFile','logoBase64'), [], 'UTF8' )->setPaper('a4', 'landscape');
$pdfLanguage = upperCase(app('translator')->getLocale());
$fileName = Str::slug('inventory', '_','en').'_'.$pdfLanguage;*/
return view('pdf.inventory', compact('data', 'propertyData', 'logoFile', 'logoBase64'));
/*return $pdf->download($fileName.'.pdf');*/
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
$response['statusCode'] = 400;
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
$response['statusCode'] = 500;
}
return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);
}
public function propertyProductOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = json_decode($request->getContent(), 1);
$params = current($params);
if (fillOnUndefined($params, 'version') == 'v2') {
$offerKey = [];
$offerKey[] = $params['propertyName'];
$offerKey[] = $params['executiveName'];
$offerKey[] = $params['executiveEmail'];
$offerKey[] = $params['executivePhone'];
$offerKey[] = $params['accountManager'];
$offerKey[] = hash('sha256', json_encode($params['detail'], JSON_UNESCAPED_UNICODE));
$offerKey = md5(implode('-', $offerKey));
} else {
$offerKey = md5($params['propertyName'] . '-' . $params['executiveName'] . '-' . $params['package'] . '-' . $params['numberOfRooms'] . '-' . $params['promotionCode']);
if ($offerKey != fillOnUndefined($params, 'hashKey')) {
throw new ApiErrorException('HASH verification error!');
}
}
$createParam = [
'offer_key' => $offerKey,
'property_name' => $params['propertyName'],
'executive_name' => $params['executiveName'],
'executive_email' => $params['executiveEmail'],
'executive_phone' => $params['executivePhone'],
'account_manager_name' => fillOnUndefined($params, 'accountManagerName'),
'account_manager_email' => fillOnUndefined($params, 'accountManagerEmail'),
'confirm' => fillOnUndefined($params, 'confirm'),
'offer_date' => Carbon::now()->toDateTimeString(),
'offer_expire_date' => Carbon::now()->addDays(2)->toDateTimeString(),
'package' => $params['package'],
'promotion_code' => $params['promotionCode'],
'detail' => fillOnUndefined($params, 'detail') ? json_encode($params['detail']) : json_encode($params),
'version' => fillOnUndefined($params, 'version', 'v1'),
'ip_address' => $params['ipAddress'],
'status' => 1,
'created_at' => time(),
'updated_at' => time()
];
$propertyProductOfferCheck = PropertyProductOffer::where('offer_key', $offerKey)->first();
if ($propertyProductOfferCheck) {
$propertyProductOfferSync = PropertyProductOffer::where('offer_key', $offerKey)->update($createParam);
} else {
$propertyProductOfferSync = PropertyProductOffer::insert($createParam);
}
if (!$propertyProductOfferSync) {
throw new ApiErrorException('Your offer could not be generated. Please try again.');
}
if(fillOnUndefined($params, 'sendEmail')) {
$propertyProductOfferMail = ['offerKey' => $offerKey];
$this->mailer->onQueue('propertyProductOfferMail', new PropertyProductOfferMail($propertyProductOfferMail));
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => ['offer_key' => $offerKey]];
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
$response['statusCode'] = 400;
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
//$response['message'] = $e->getMessage();
$response['message'] = 'Your offer could not be generated. Please try again.';
$response['statusCode'] = 500;
}
return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);
}
public function propertyProductOfferExport(Request $request, $offerKey)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
$package = [
'LRG' => [
'commission' => 15,
'minFee' => 2,
'name' => 'Paket A',
'creditRange' => [
'25-50' => [
'min' => 25,
'max' => 50,
'monthly' => 250,
'annually' => 3000,
],
'51-75' => [
'min' => 51,
'max' => 75,
'monthly' => 500,
'annually' => 6000,
],
'76-100' => [
'min' => 76,
'max' => 100,
'monthly' => 750,
'annually' => 9000,
],
'101-150' => [
'min' => 101,
'max' => 150,
'monthly' => 1000,
'annually' => 12000,
],
'151-200' => [
'min' => 151,
'max' => 200,
'monthly' => 1500,
'annually' => 18000,
],
'201-250' => [
'min' => 201,
'max' => 250,
'monthly' => 2000,
'annually' => 24000,
],
'250+' => [
'min' => 251,
'max' => null,
'monthly' => 2500,
'annually' => 30000,
],
]
],
'MED' => [
'commission' => 10,
'minFee' => 3,
'name' => 'Paket B',
'creditRange' => [
'25-50' => [
'min' => 25,
'max' => 50,
'monthly' => 375,
'annually' => 4500,
],
'51-75' => [
'min' => 51,
'max' => 75,
'monthly' => 750,
'annually' => 9000,
],
'76-100' => [
'min' => 76,
'max' => 100,
'monthly' => 1125,
'annually' => 13500,
],
'101-150' => [
'min' => 101,
'max' => 150,
'monthly' => 1500,
'annually' => 18000,
],
'151-200' => [
'min' => 151,
'max' => 200,
'monthly' => 2250,
'annually' => 27000,
],
'201-250' => [
'min' => 201,
'max' => 250,
'monthly' => 3000,
'annually' => 36000,
],
'250+' => [
'min' => 251,
'max' => null,
'monthly' => 3750,
'annually' => 45000,
],
]
],
'SML' => [
'commission' => 5,
'minFee' => 4,
'name' => 'Paket C',
'creditRange' => [
'25-50' => [
'min' => 25,
'max' => 50,
'monthly' => 750,
'annually' => 9000,
],
'51-75' => [
'min' => 51,
'max' => 75,
'monthly' => 1500,
'annually' => 18000,
],
'76-100' => [
'min' => 76,
'max' => 100,
'monthly' => 2250,
'annually' => 27000,
],
'101-150' => [
'min' => 101,
'max' => 150,
'monthly' => 3000,
'annually' => 36000,
],
'151-200' => [
'min' => 151,
'max' => 200,
'monthly' => 4500,
'annually' => 54000,
],
'201-250' => [
'min' => 201,
'max' => 250,
'monthly' => 6000,
'annually' => 72000,
],
'250+' => [
'min' => 251,
'max' => null,
'monthly' => 7500,
'annually' => 90000,
],
],
]
];
$campaign = [
'promotion' => [
'code' => [/*'ITF2025','ATF2025','TTI2025'*/],
'percentage' => 50
],
'oneYearAnnually' => [
'percentage' => 10
],
'twoYearAnnually' => [
'percentage' => 20
]
];
$userListIds = [904, 941, 1485];//22-41
try {
if (is_null($request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$userList = User::whereIn('id', $userListIds)->get()->toArray();
$offerDetail = PropertyProductOffer::where('offer_key', $offerKey)->first();
$offerDetail = $offerDetail ? $offerDetail->toArray() : null;
if (empty($offerDetail)) {
return redirect()->to(config('app.url'));
}
$pageContent = [
'name' => $offerDetail['property_name'],
'executiveName' => $offerDetail['executive_name'],
'executiveEmail' => $offerDetail['executive_email'],
'executivePhone' => $offerDetail['detailArray']['executivePhone'],
'offerTime' => $offerDetail['offer_date'],
'offerExpireTime' => $offerDetail['offer_expire_date'],
'offerTimeFormatted' => $offerDetail['offerTimeFormatted'],
'offerExpireTimeFormatted' => $offerDetail['offerExpireTimeFormatted'],
'numberOfRooms' => $offerDetail['detailArray']['numberOfRooms'],
'package' => $offerDetail['package'],
'promotionCode' => $offerDetail['promotion_code'],
];
$pageContent['package'] = !empty($request->get('package')) ? $request->get('package') : $pageContent['package'];
$pageContent['numberOfRooms'] = !empty($request->get('numberOfRooms')) ? $request->get('numberOfRooms') : $pageContent['numberOfRooms'];
$creditPackage = [];
if ((int)$pageContent['numberOfRooms'] < 25) {
$creditPackage = $package[$pageContent['package']]['creditRange']['25-50'];
} elseif ((int)$pageContent['numberOfRooms'] > 250) {
$creditPackage = $package[$pageContent['package']]['creditRange']['250+'];
} else {
$creditPackage = collect($package[$pageContent['package']]['creditRange'])
->where('min', '<=', (int)$pageContent['numberOfRooms'])
->where('max', '>=', (int)$pageContent['numberOfRooms'])
->first();
}
$pricing = [];
$pricing['minFee'] = $package[$pageContent['package']]['minFee'];
$pricing['minFeeBeforeDiscount'] = $package[$pageContent['package']]['minFee'];
if (in_array($pageContent['promotionCode'], $campaign['promotion']['code'])) {
$pricing['minFee'] = (int)($pricing['minFee'] * (1 - ($campaign['promotion']['percentage'] / 100)));
}
$pricing['commission'] = $package[$pageContent['package']]['commission'];
$pricing['minFee'] = $pricing['minFee'];
$pricing['minFeeBeforeDiscount'] = $pricing['minFeeBeforeDiscount'];
$pricing['monthly']['minFee'] = (int)$pricing['minFee'] * (int)$pageContent['numberOfRooms'];
$pricing['monthly']['minFeeBeforePromotion'] = (int)$pricing['minFeeBeforeDiscount'] * (int)$pageContent['numberOfRooms'];
$pricing['monthly']['commission'] = $package[$pageContent['package']]['commission'];
//$pricing['monthly']['minReservationTotal'] = number_format(((int)$pricing['monthly']['minFee'] * 100) / $package[$pageContent['package']]['commission'], 0, '', '.');
$pricing['monthly']['minReservationTotal'] = number_format(fillOnUndefined($creditPackage, 'monthly', 0), 0, '', '.');
$pricing['annually']['minFee'] = (int)$pricing['monthly']['minFee'] * 12;
$pricing['annually']['minFeeBeforePromotion'] = (int)$pricing['monthly']['minFeeBeforePromotion'] * 12;
$pricing['annually']['commission'] = $package[$pageContent['package']]['commission'];
$pricing['annually']['minFeeDiscount'] = (int)$pricing['annually']['minFee'] * (1 - ($campaign['oneYearAnnually']['percentage'] / 100));//%10
//$pricing['annually']['minReservationTotal'] = number_format(((int)$pricing['annually']['minFeeDiscount'] * 100) / $package[$pageContent['package']]['commission'], 0, '', '.');
$pricing['annually']['minReservationTotal'] = number_format(fillOnUndefined($creditPackage, 'annually', 0), 0, '', '.');
if ($pricing['minFee'] == $pricing['minFeeBeforeDiscount']) {
$pricing['monthly']['minFeeBeforePromotion'] = null;
$pricing['annually']['minFeeBeforePromotion'] = null;
}
$pageContent['packageName'] = $package[$pageContent['package']]['name'];
$pageContent['pricing'] = $pricing;
$accountUserDetail = collect($userList)->where('email', $offerDetail['detailArray']['accountManager'])->first();
$pageContent['accountManagerName'] = fillOnUndefined($accountUserDetail, 'nameSurname');
$pageContent['accountManagerEmail'] = fillOnUndefined($accountUserDetail, 'email');
$pageContent['accountManagerPhone'] = fillOnUndefined($accountUserDetail, 'phone');
$pdfService = $this->pdf->loadView('pdf.propertyProductOffer', compact('pageContent'), [], 'UTF8');
$pdfService->setOptions(['dpi' => 100, 'isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true]);
$hotelName = Str::slug($pageContent['name'], '_', 'en');
return $pdfService->stream($hotelName . '.pdf');
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
$response['statusCode'] = 400;
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
$response['statusCode'] = 500;
}
return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);
}
public function propertyProductOfferData(Request $request, $offerKey)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
$userListIds = [904, 941, 1485];//22-41
try {
if (is_null($request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$userList = User::whereIn('id', $userListIds)->get()->toArray();
$offerDetail = PropertyProductOffer::where('offer_key', $offerKey)->first();
$offerDetail = $offerDetail ? $offerDetail->toArray() : null;
if (empty($offerDetail)) {
return redirect()->to(config('app.url'));
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $offerDetail];
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
$response['statusCode'] = 400;
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
$response['statusCode'] = 500;
}
return apiResponse($response['status'], $response['message'], $response['data'], $response['statusCode']);
}
}