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

1074 lines
45 KiB
PHP

<?php
namespace App\Http\Controllers\V1;
use App\Core\Mail\CancelBookingMail;
use App\Core\Service\OfferService;
use App\Core\Service\PropertyFactService;
use App\Core\Service\PropertyExecutiveService;
use App\Core\Service\PropertyRoomService;
use App\Core\Service\PropertyPhotoService\PropertyPhotoService;
use App\Core\Service\LanguageService;
use App\Core\Service\CurrencyService;
use App\Core\Service\PropertyBrandService;
use App\Core\Service\PropertyService;
use App\Core\Service\PropertyContactService;
use App\Core\Service\PropertyPaymentService;
use App\Core\Mail\OfferAcceptMail;
use App\Core\Mail\OfferPreConfirmCustomerMail;
use App\Core\Mail\OfferPreConfirmPropertyMail;
use App\Core\Mail\OfferSendMail;
//use App\Core\Service\QRCodeService;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App;
use Illuminate\Mail\Mailer;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Config;
use Exception;
use App\Exceptions\ApiErrorException;
//use Intervention\Image\Facades\Image;
class PropertyOfferController
{
private $request;
private $offerService;
private $propertyFactService;
private $propertyExecutiveService;
private $propertyRoomService;
private $propertyPhotoService;
private $languageService;
private $currencyService;
private $propertyBrandService;
private $propertyService;
private $propertyContactService;
private $propertyPaymentService;
// private $qrCode;
public function __construct(
Request $request,
Mailer $mailer,
OfferService $offerService,
PropertyFactService $propertyFactService,
PropertyExecutiveService $propertyExecutiveService,
PropertyRoomService $propertyRoomService,
PropertyPhotoService $propertyPhotoService,
LanguageService $languageService,
CurrencyService $currencyService,
PropertyBrandService $propertyBrandService,
PropertyContactService $propertyContactService,
PropertyService $propertyService,
PropertyPaymentService $propertyPaymentService
// QRCodeService $qrCode
)
{
$this->request = $request;
$this->mailer = $mailer;
$this->offerService = $offerService;
$this->propertyFactService = $propertyFactService;
$this->propertyExecutiveService = $propertyExecutiveService;
$this->propertyRoomService = $propertyRoomService;
$this->propertyPhotoService = $propertyPhotoService;
$this->languageService = $languageService;
$this->currencyService = $currencyService;
$this->propertyBrandService = $propertyBrandService;
$this->propertyService = $propertyService;
$this->propertyContactService = $propertyContactService;
$this->propertyPaymentService = $propertyPaymentService;
// $this->qrCode = $qrCode;
}
public function listPropertyOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $request->params;
$propertyRequest = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => fillOnUndefined($params, 'property_id')],
],
'with' => ['offerAcceptStatus','paymentTransaction'],
"orderBy" => [
["field" => "id", "value" => "DESC"]
]
];
$ticketCode = fillOnUndefinedAndEmpty($params, 'ticket_code');
if ($ticketCode) {
$propertyRequest['criteria'][] = ['field' => 'ticket_code', 'condition' => 'like', 'value' => '%' . $ticketCode . '%'];
}
$propertyOffers = $this->offerService->select($propertyRequest);
if ($propertyOffers['status'] != 'success') {
throw new Exception($propertyOffers['message']);
}
$offerList = [];
foreach ($propertyOffers['data'] as $offerKey => $value) {
$offerList[$offerKey] = $value;
$offerList[$offerKey]['total'] = moneyDoubleFormat($value['total']);
if(!empty($value['payment_type_mapping_id'])) {
$offerList[$offerKey]['is_payment_received'] = false;
$paymentTransactionList = collect($value['payment_transaction']);
if($paymentTransactionList->where('status',1)->count() > 0) {
$offerList[$offerKey]['is_payment_received'] = true;
}
}
unset($offerList[$offerKey]['payment_transaction']);
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $offerList];
} 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 createPropertyOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$requestParams = [
'locale' => fillOnUndefined($params, 'locale'),
'property_id' => fillOnUndefined($params, 'property_id'),
];
$getPropertyFact = $this->propertyFactService->getPropertyFact($requestParams);
if ($getPropertyFact['status'] != 'success') {
throw new ApiErrorException($getPropertyFact['message']);
}
$getPropertyFact = $this->propertyFactService->getPropertyOfferFilter($getPropertyFact['data'], []);
if ($getPropertyFact['status'] != 'success') {
throw new ApiErrorException($getPropertyFact['message']);
}
$accommodationTypes = $getPropertyFact['data']['accommodation_types'];
$propertyFacts = $getPropertyFact['data']['get_facts'];
$propertyExecutive = $this->propertyExecutiveService->listPropertyExecutive($requestParams);
if ($propertyExecutive['status'] != 'success') {
throw new Exception($propertyExecutive['message']);
}
$propertyRooms = $this->propertyRoomService->getPropertyRooms($requestParams);
if ($propertyRooms['status'] != 'success') {
throw new ApiErrorException($propertyRooms['message']);
}
$propertyPhotos = $this->propertyPhotoService->getPropertyPhotos($params);
if ($propertyPhotos['status'] != 'success') {
throw new ApiErrorException($propertyPhotos['message']);
}
$languageCriteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'is_application', 'condition' => '=', 'value' => 1],
['field' => 'is_published', 'condition' => '=', 'value' => 1]
],
"orderBy" => [
["field" => "name", "value" => "ASC"]
]
];
$languages = $this->languageService->getAllLanguages($languageCriteria, ['id', 'code', 'name', 'status', 'language_key']);
if ($languages['status'] != 'success') {
throw new ApiErrorException($languages['message']);
}
$currencies = $this->currencyService->getCurrencyList(['justBasicCurrencies' => true]);
if ($currencies['status'] != 'success') {
throw new ApiErrorException($currencies['message']);
}
$offerConfirmType = $this->offerService->selectOfferConfirmType([], ['code', 'name', 'language_key']);
if ($offerConfirmType['status'] != 'success') {
throw new ApiErrorException($offerConfirmType['message']);
}
$offerConfirmType = $offerConfirmType['data'];
$paymentList = $this->propertyPaymentService->getPaymentMappingList($params);
if ($paymentList['status'] != 'success') {
throw new ApiErrorException($paymentList['message']);
}
$paymentListType = collect($paymentList['data'])->map(function ($payment) {
return [
'id' => $payment['id'],
'name' => $payment['name'],
'currency_code' => $payment['currency_code'],
'title' => $payment['name'] . ' - ' . $payment['currency_code'],
'status' => $payment['status']
];
})->sortBy('title')->toArray();
$paymentListType = array_values($paymentListType);
$responseData = [
'get_facts' => $propertyFacts,
'accommodation_types' => $accommodationTypes,
'executives' => $propertyExecutive['data']['executives'],
'property_rooms' => $propertyRooms['data'],
'photos' => $propertyPhotos['data'],
'languages' => $languages['data'],
'currencies' => $currencies['data'],
'offer_confirm_type' => $offerConfirmType,
'payment_list_type' => $paymentListType,
];
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData];
} 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 storePropertyOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$requestParams = $params;
$requestParams['user_id'] = $this->request->auth->id;
$storeOffer = $this->offerService->addNewOffer($requestParams);
if ($storeOffer['status'] != 'success') {
throw new ApiErrorException($storeOffer['message']);
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $storeOffer['data']];
} 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 getPricePropertyOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$requestParams = $params;
$requestParams['user_id'] = $this->request->auth->id;
$checkPropertyOfferPermissionAccess = $this->offerService->checkPropertyOfferPermissionAccess(['property_id' => $params['property_id'], 'offer_id' => $params['offer_id']]);
if ($checkPropertyOfferPermissionAccess['status'] != 'success') {
throw new ApiErrorException($checkPropertyOfferPermissionAccess['message']);
}
$storeOffer = $this->offerService->getPriceList($requestParams);
if ($storeOffer['status'] != 'success') {
throw new ApiErrorException($storeOffer['message']);
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $storeOffer['data']];
} 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 storePricePropertyOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$requestParams = $params;
$requestParams['user_id'] = $this->request->auth->id;
$checkPropertyOfferPermissionAccess = $this->offerService->checkPropertyOfferPermissionAccess(['property_id' => $params['property_id'], 'offer_id' => $params['offer_id']]);
if ($checkPropertyOfferPermissionAccess['status'] != 'success') {
throw new ApiErrorException($checkPropertyOfferPermissionAccess['message']);
}
$storeOffer = $this->offerService->storePriceList($requestParams);
if ($storeOffer['status'] != 'success') {
throw new ApiErrorException($storeOffer['message']);
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $storeOffer['data']];
} 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 editPropertyOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$checkPropertyOfferPermissionAccess = $this->offerService->checkPropertyOfferPermissionAccess(['property_id' => $params['property_id'], 'offer_id' => $params['offer_id']]);
if ($checkPropertyOfferPermissionAccess['status'] != 'success') {
throw new ApiErrorException($checkPropertyOfferPermissionAccess['message']);
}
$requestParams = [
'locale' => fillOnUndefined($params, 'locale'),
'property_id' => fillOnUndefined($params, 'property_id'),
'offer_id' => fillOnUndefined($params, 'offer_id'),
];
$getOffer = $this->offerService->findOffer($requestParams);
if ($getOffer['status'] != 'success') {
throw new ApiErrorException($getOffer['message']);
}
$offerPrice = $getOffer['data']['offer_price'];
$startDate = collect($offerPrice)->keyBy('date')->keys()->min();
$endDate = collect($offerPrice)->keyBy('date')->keys()->max();
$getPropertyFact = $this->propertyFactService->getPropertyFact($requestParams);
if ($getPropertyFact['status'] != 'success') {
throw new ApiErrorException($getPropertyFact['message']);
}
$offerAccommodationMapping = collect($getOffer['data']['offer_accommodation_mapping'])->keyBy('id')->keys()->all();
$offerFactMapping = collect($getOffer['data']['offer_fact_mapping'])->keyBy('id')->keys()->all();
$offerAllFactIds = array_merge($offerAccommodationMapping, $offerFactMapping);
$getPropertyFact = $this->propertyFactService->getPropertyOfferFilter($getPropertyFact['data'], $offerAllFactIds);
if ($getPropertyFact['status'] != 'success') {
throw new ApiErrorException($getPropertyFact['message']);
}
$accommodationTypes = $getPropertyFact['data']['accommodation_types'];
$propertyFacts = $getPropertyFact['data']['get_facts'];
$propertyExecutive = $this->propertyExecutiveService->listPropertyExecutive($requestParams);
if ($propertyExecutive['status'] != 'success') {
throw new Exception($propertyExecutive['message']);
}
$propertyRooms = $this->propertyRoomService->getPropertyRooms($requestParams);
if ($propertyRooms['status'] != 'success') {
throw new ApiErrorException($propertyRooms['message']);
}
$propertyPhotos = $this->propertyPhotoService->getPropertyPhotos($params);
if ($propertyPhotos['status'] != 'success') {
throw new ApiErrorException($propertyPhotos['message']);
}
$languageCriteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'is_application', 'condition' => '=', 'value' => 1],
['field' => 'is_published', 'condition' => '=', 'value' => 1]
],
"orderBy" => [
["field" => "name", "value" => "ASC"]
]
];
$languages = $this->languageService->getAllLanguages($languageCriteria, ['id', 'code', 'name', 'status', 'language_key']);
if ($languages['status'] != 'success') {
throw new ApiErrorException($languages['message']);
}
$currencies = $this->currencyService->getCurrencyList();
if ($currencies['status'] != 'success') {
throw new ApiErrorException($currencies['message']);
}
$offerConfirmTypes = $this->offerService->selectOfferConfirmType([], ['code', 'name', 'language_key']);
if ($offerConfirmTypes['status'] != 'success') {
throw new ApiErrorException($offerConfirmTypes['message']);
}
$offerConfirmType = [];
foreach ($offerConfirmTypes['data'] as $offerConfirmTypeData) {
$isSelectedOfferConfirmType = false;
if ($offerConfirmTypeData['code'] == $getOffer['data']['confirm_type']) {
$isSelectedOfferConfirmType = true;
}
$offerConfirmType[] = [
'code' => $offerConfirmTypeData['code'],
'name' => $offerConfirmTypeData['name'],
'language_key' => $offerConfirmTypeData['language_key'],
'is_selected' => $isSelectedOfferConfirmType
];
}
$paymentList = $this->propertyPaymentService->getPaymentMappingList($params);
if ($paymentList['status'] != 'success') {
throw new ApiErrorException($paymentList['message']);
}
$paymentListType = collect($paymentList['data'])->map(function ($payment) use ($getOffer) {
$isSelectedPaymentType = false;
if ($payment['id'] == $getOffer['data']['payment_type_mapping_id']) {
$isSelectedPaymentType = true;
}
return [
'id' => $payment['id'],
'name' => $payment['name'],
'currency_code' => $payment['currency_code'],
'title' => $payment['name'] . ' - ' . $payment['currency_code'],
'status' => $payment['status'],
'is_selected' => $isSelectedPaymentType
];
})->sortBy('title')->toArray();
$paymentListType = array_values($paymentListType);
$responseData = [
'get_offer' => $getOffer['data'],
'get_facts' => $propertyFacts,
'accommodation_types' => $accommodationTypes,
'executives' => $propertyExecutive['data']['executives'],
'property_rooms' => $propertyRooms['data'],
'photos' => $propertyPhotos['data'],
'languages' => $languages['data'],
'currencies' => $currencies['data'],
'start_date' => fillOnUndefined($getOffer['data'], "check_in"),
'end_date' => fillOnUndefined($getOffer['data'], "check_out"),
'offer_confirm_type' => $offerConfirmType,
'payment_list_type' => $paymentListType,
];
$responseData = $this->offerService->editFormCheckValues($responseData);
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $responseData];
} 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 updatePropertyOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$requestParams = $params;
$requestParams['user_id'] = $this->request->auth->id;
$checkPropertyOfferPermissionAccess = $this->offerService->checkPropertyOfferPermissionAccess(['property_id' => $params['property_id'], 'offer_id' => $params['offer_id']]);
if ($checkPropertyOfferPermissionAccess['status'] != 'success') {
throw new ApiErrorException($checkPropertyOfferPermissionAccess['message']);
}
$storeOffer = $this->offerService->updateOffer($requestParams);
if ($storeOffer['status'] != 'success') {
throw new ApiErrorException($storeOffer['message']);
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $storeOffer['data']];
} 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 listPropertyOfferPublish(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$checkOffer = [
'criteria' => [
['field' => 'offer_code', 'condition' => '=', 'value' => fillOnUndefined($params, 'offer_code')],
['field' => 'status', 'condition' => '=', 'value' => 1],
],
'with' => ['paymentTransaction'],
'whereIn' => [
['field' => 'accept_status', 'value' => [1, 2, 3]],
],
'firstRow' => 1
];
$checkOfferData = $this->offerService->select($checkOffer);
if ($checkOfferData['status'] != "success" || !$checkOfferData['data']) {
throw new ApiErrorException('offer not found');
}
$params['offer_id'] = $checkOfferData['data']['id'];
$params['property_id'] = $checkOfferData['data']['property_id'];
$params['offer_code'] = $checkOfferData['data']['offer_code'];
/* $offerUrl = config('app.client_server')."/offer/".$params['offer_code'];
$generatedQRCode = $this->qrCode->generate($offerUrl, 250);
if($generatedQRCode['status'] === false){
throw new ApiErrorException($generatedQRCode['message']);
}
$qrCode = (string) Image::make($generatedQRCode['data'])->encode('data-url');*/
$requestParams = $params;
$getOffer = $this->offerService->findOffer($requestParams);
if ($getOffer['status'] != 'success') {
throw new ApiErrorException($getOffer['message']);
}
$offerLanguage = $getOffer['data']['language'];
$requestParams['locale'] = $offerLanguage;
$requestBrand = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => fillOnUndefined($params, 'property_id')],
],
'firstRow' => 1
];
$getPropertyBrand = $this->propertyBrandService->select($requestBrand);
$getPropertyBrand['data']['color_codes'] = json_decode($getPropertyBrand['data']['color_codes'], true);
if ($getPropertyBrand['status'] != "success") {
throw new ApiErrorException($getPropertyBrand['message']);
}
$defaultLogo = "/assets/img/logo/logo.png";
$getPropertyBrand['data']['logo_url'] = isset($getPropertyBrand['data']['logo_name']) ? Config::get('app.imageUrl') . '/property-photos/' . $params['property_id'] . '/logo/' . $getPropertyBrand['data']['logo_name'] . '_250x250.' . $getPropertyBrand['data']['logo_file_ext'] : $defaultLogo;
$getOffer['data']['expire_date'] = humanReadableDate($getOffer['data']['expire_date']);
$getPropertyFact = $this->propertyFactService->getPropertyFact($requestParams);
if ($getPropertyFact['status'] != 'success') {
throw new ApiErrorException($getPropertyFact['message']);
}
$offerAccommodationMapping = collect($getOffer['data']['offer_accommodation_mapping'])->keyBy('id')->keys()->all();
$offerFactMapping = collect($getOffer['data']['offer_fact_mapping'])->keyBy('id')->keys()->all();
$offerAllFactIds = array_merge($offerAccommodationMapping, $offerFactMapping);
$getPropertyFact = $this->propertyFactService->getPropertyOfferFilterForHtml($getPropertyFact['data'], $offerAllFactIds);
if ($getPropertyFact['status'] != 'success') {
throw new ApiErrorException($getPropertyFact['message']);
}
$getProperty = $this->propertyService->getPropertyDetail($requestParams);
if ($getProperty['status'] != 'success') {
throw new ApiErrorException($getProperty['message']);
}
$propertyContact = $this->propertyContactService->propertyContact($requestParams);
if ($propertyContact['status'] != 'success') {
throw new Exception($propertyContact['message']);
}
$getProperty['data']['contact'] = $propertyContact['data']['property_contact'];
$getRoomPriceParams = [
'offer_id' => $getOffer['data']['id'],
'property_id' => fillOnUndefined($params, 'property_id'),
'locale' => $offerLanguage,
];
$getRoomPrice = $this->offerService->getPrice($getRoomPriceParams);
if ($getRoomPrice['status'] != 'success') {
throw new ApiErrorException($getRoomPrice['message']);
}
$offerPayment = [];
if(!empty($checkOfferData['data']['payment_type_mapping_id'])) {
$paymentTransaction = collect($checkOfferData['data']['payment_transaction']);
$paymentLink = $paymentTransaction->where('code',null)->first();
if(isset($paymentLink['manuelPaymentLink'])) {
$offerPayment['payment_link'] = $paymentLink['manuelPaymentLink'];
$offerPayment['is_payment_received'] = false;
}
if($paymentTransaction->where('status',1)->count() > 0) {
$offerPayment['is_payment_received'] = true;
}
}
unset($getOffer['data']['offer_accommodation_mapping']);
unset($getOffer['data']['offer_fact_mapping']);
unset($getOffer['data']['offer_price']);
unset($getOffer['data']['offer_room_mapping']);
$offerPublishData = [
'property_brand' => fillOnUndefined($getPropertyBrand, "data", []),
'offer' => fillOnUndefined($getOffer, 'data', []),
'property' => fillOnUndefined($getProperty, 'data', []),
'property_fact' => fillOnUndefined($getPropertyFact, 'data', []),
'room_price' => fillOnUndefined($getRoomPrice, 'data', []),
'offer_payment' => $offerPayment
// "qr_code" => $qrCode
];
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $offerPublishData];
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
$response['statusCode'] = 404;
} 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 updatePropertyOfferStatus(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$requestParams = $params;
$requestParams['user_id'] = $this->request->auth->id;
$checkPropertyOfferPermissionAccess = $this->offerService->checkPropertyOfferPermissionAccess(['property_id' => $params['property_id'], 'offer_id' => $params['offer_id']]);
if ($checkPropertyOfferPermissionAccess['status'] != 'success') {
throw new ApiErrorException($checkPropertyOfferPermissionAccess['message']);
}
$statusOffer = $this->offerService->updateStatus($requestParams);
if ($statusOffer['status'] != 'success') {
throw new ApiErrorException($statusOffer['message']);
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $statusOffer['data']];
} 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 updatePropertyOfferAceptStatus(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$requestParams['user_id'] = $this->request->auth->id;
$checkPropertyOfferPermissionAccess = $this->offerService->checkPropertyOfferPermissionAccess(['property_id' => $params['property_id'], 'offer_id' => $params['offer_id']]);
if ($checkPropertyOfferPermissionAccess['status'] != 'success') {
throw new ApiErrorException($checkPropertyOfferPermissionAccess['message']);
}
$requestParams['offer_id'] = $checkPropertyOfferPermissionAccess['data']['id'];
$requestParams['offer_code'] = $checkPropertyOfferPermissionAccess['data']['offer_code'];
if ($checkPropertyOfferPermissionAccess['data']['confirm_type'] == 'HTL' && $checkPropertyOfferPermissionAccess['data']['accept_status'] == 2) {
$requestParams['accept_status'] = 1;
$statusOffer = $this->offerService->updateAcceptStatus($requestParams);
if ($statusOffer['status'] != 'success') {
throw new ApiErrorException($statusOffer['message']);
}
$offerAcceptMailParam = [
'offer_id' => $checkPropertyOfferPermissionAccess['data']['id'],
'property_id' => $checkPropertyOfferPermissionAccess['data']['property_id'],
'paymentUrl' => null
];
//Integrated Payment Link
if (!is_null($checkPropertyOfferPermissionAccess['data']['payment_type_mapping_id'])) {
$paymentLinkParam = [
'property_id' => $checkPropertyOfferPermissionAccess['data']['property_id'],
'title' => $checkPropertyOfferPermissionAccess['data']['title'],
'description' => $checkPropertyOfferPermissionAccess['data']['ticket_code'] . '-' . $checkPropertyOfferPermissionAccess['data']['offer_code'],
'email' => $checkPropertyOfferPermissionAccess['data']['email'],
'currency' => $checkPropertyOfferPermissionAccess['data']['currency'],
'base_amount' => $checkPropertyOfferPermissionAccess['data']['total'],
'commission' => '0',
'payment_method' => 'online',
'payment_type_mapping_id' => $checkPropertyOfferPermissionAccess['data']['payment_type_mapping_id'],
'locale' => $checkPropertyOfferPermissionAccess['data']['language'],
'user_id' => $checkPropertyOfferPermissionAccess['data']['created_by'],
];
$createPaymentLink = $this->propertyPaymentService->createManualPayment($paymentLinkParam);
if ($createPaymentLink['status'] == "success") {
$offerAcceptMailParam['paymentUrl'] = $createPaymentLink['data']['payment_link'];
$this->offerService->update($checkPropertyOfferPermissionAccess['data']['id'], ['payment_transaction_order_id' => $createPaymentLink['data']['order_id']]);
}
}
$this->mailer->onQueue('offerAcceptMail', new OfferAcceptMail($offerAcceptMailParam));
} else {
throw new ApiErrorException('Offer status not available');
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => []];
} 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 dashboardPropertyOffer(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $request->params;
$propertyRequest = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
['field' => 'status', 'condition' => '=', 'value' => 1],
],
];
$propertyOffers = $this->offerService->select($propertyRequest);
$propertyOffers = collect($propertyOffers['data'])->groupBy('accept_status')->map->count()->toArray();
$propertyPassiveRequest = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
['field' => 'status', 'condition' => '=', 'value' => 0],
],
];
$propertyPassiveOffers = $this->offerService->select($propertyPassiveRequest);
$passiveCounts = collect($propertyPassiveOffers['data'])->count();
$acceptAndPendingCount = collect($propertyOffers)->sum();
$offerDashboardData =
[
"passive" => $passiveCounts,
"canceled" => fillOnUndefined($propertyOffers, 0, 0),
"accepted" => fillOnUndefined($propertyOffers, 1, 0),
"pending" => fillOnUndefined($propertyOffers, 2, 0),
"total" => $passiveCounts + $acceptAndPendingCount,
];
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => $offerDashboardData];
} 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 updatePropertyOfferAcceptStatus(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$requestParams = $this->request->params;
$checkOfferApprovedParam = [
'offer_id' => $requestParams['offer_id']
];
$checkOfferApprovedStatus = $this->offerService->checkOfferApprovedStatus($checkOfferApprovedParam);
if ($checkOfferApprovedStatus['status'] != 'success') {
throw new ApiErrorException($checkOfferApprovedStatus['message']);
}
$requestParams['accept_status'] = 1;
if ($checkOfferApprovedStatus['data']['confirm_type'] == 'HTL') {
$requestParams['accept_status'] = 2;
}
$acceptStatusOffer = $this->offerService->updateAcceptStatus($requestParams);
if ($acceptStatusOffer['status'] != 'success') {
throw new ApiErrorException($acceptStatusOffer['message']);
}
if ($checkOfferApprovedStatus['data']['confirm_type'] == 'INS') {
$offerAcceptMailParam = [
'offer_id' => $checkOfferApprovedStatus['data']['id'],
'property_id' => $checkOfferApprovedStatus['data']['property_id'],
'paymentUrl' => null
];
//Integrated Payment Link
if (!is_null($checkOfferApprovedStatus['data']['payment_type_mapping_id'])) {
$paymentLinkParam = [
'property_id' => $checkOfferApprovedStatus['data']['property_id'],
'title' => $checkOfferApprovedStatus['data']['title'],
'description' => $checkOfferApprovedStatus['data']['ticket_code'] . '-' . $checkOfferApprovedStatus['data']['offer_code'],
'email' => $checkOfferApprovedStatus['data']['email'],
'currency' => $checkOfferApprovedStatus['data']['currency'],
'base_amount' => $checkOfferApprovedStatus['data']['total'],
'commission' => '0',
'payment_method' => 'online',
'payment_type_mapping_id' => $checkOfferApprovedStatus['data']['payment_type_mapping_id'],
'locale' => $checkOfferApprovedStatus['data']['language'],
'user_id' => $checkOfferApprovedStatus['data']['created_by'],
];
$createPaymentLink = $this->propertyPaymentService->createManualPayment($paymentLinkParam);
if ($createPaymentLink['status'] == "success") {
$offerAcceptMailParam['paymentUrl'] = $createPaymentLink['data']['payment_link'];
$this->offerService->update($checkOfferApprovedStatus['data']['id'], ['payment_transaction_order_id' => $createPaymentLink['data']['order_id']]);
}
}
$this->mailer->onQueue('offerAcceptMail', new OfferAcceptMail($offerAcceptMailParam));
} elseif ($checkOfferApprovedStatus['data']['confirm_type'] == 'HTL') {
$offerAcceptMailParam = [
'offer_id' => $checkOfferApprovedStatus['data']['id'],
'property_id' => $checkOfferApprovedStatus['data']['property_id'],
];
$this->mailer->onQueue('offerPreConfirmCustomerMail', new OfferPreConfirmCustomerMail($offerAcceptMailParam));
$this->mailer->onQueue('offerPreConfirmPropertyMail', new OfferPreConfirmPropertyMail($offerAcceptMailParam));
}
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => []];
} 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 sendOfferEmail(Request $request)
{
$response = ['status' => false, 'message' => '', 'data' => null, 'statusCode' => 500];
try {
if (is_null($this->request->getContent())) {
throw new ApiErrorException(lang('Parameter Error.'));
}
$params = $this->request->params;
$checkPropertyOfferPermissionAccess = $this->offerService->checkPropertyOfferPermissionAccess(['property_id' => $params['property_id'], 'offer_id' => $params['offer_id']]);
if ($checkPropertyOfferPermissionAccess['status'] != 'success') {
throw new ApiErrorException($checkPropertyOfferPermissionAccess['message']);
}
$offerSendMailParam = [
'offer_id' => $params['offer_id'],
'property_id' => $params['property_id']
];
$this->mailer->onQueue('offerSendMail', new OfferSendMail($offerSendMailParam));
$response = ['status' => 1, 'statusCode' => 200, 'message' => null, 'data' => []];
} 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']);
}
}