Files
api-extranetwork/app/Core/Service/PropertyRoomService.php
ExtraNetwork e5c4b6aa13 first commit
2026-05-12 17:04:54 +03:00

2083 lines
94 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Core\Service;
use App\Core\Repository\PropertyRoom\PropertyRoomRepository;
use App\Core\Repository\PropertyChannelMapping\PropertyChannelMappingRepository;
use App\Core\Repository\PropertyRoomBed\PropertyRoomBedRepository;
use App\Core\Repository\PropertyRoomRatePrice\PropertyRoomRatePriceRepository;
use App\Core\Repository\Property\PropertyRepository;
use App\Core\Repository\PropertyRoomAvailability\PropertyRoomAvailabilityRepository;
use App\Core\Repository\PropertyRoomViewMapping\PropertyRoomViewMappingRepository;
use App\Core\Repository\PropertyRoomConnected\PropertyRoomConnectedRepository;
use App\Core\Service\PropertyRoomTypeService;
use App\Core\Validator\PropertyRoom\PropertyRoomAddValidator;
use App\Core\Validator\PropertyRoom\PropertyRoomAndBedAddValidator;
use App\Core\Validator\PropertyRoom\PropertyRoomUpdateValidator;
use App\Core\Validator\PropertyRoom\PropertyRoomDeleteValidator;
use App\Core\Validator\PropertyRoom\PropertyRoomInventoryValidator;
use App\Core\Validator\PropertyRoom\PropertyRoomAndBedUpdateValidator;
use App\Core\Service\LanguageService;
use App\Core\Repository\PropertyAvailabilityType\PropertyAvailabilityTypeRepository;
use App;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Config;
use Exception;
use App\Exceptions\ApiErrorException;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class PropertyRoomService
{
private $propertyRoomRepository;
private $propertyChannelMappingRepository;
private $propertyRoomBedRepository;
private $propertyRoomRatePriceRepository;
private $propertyRoomAvailabilityRepository;
private $propertyRoomAddValidator;
private $propertyRoomUpdateValidator;
private $propertyRoomDeleteValidator;
private $propertyRoomAndBedAddValidator;
private $propertyRoomInventoryValidator;
private $propertyRepository;
private $propertyRoomTypeService;
private $propertyRoomViewMappingRepository;
private $propertyRoomAndBedUpdateValidator;
private $languageService;
private $propertyAvailabilityTypeRepository;
public function __construct(
PropertyRoomRepository $propertyRoomRepository,
LanguageService $languageService,
PropertyChannelMappingRepository $propertyChannelMappingRepository,
PropertyRoomBedRepository $propertyRoomBedRepository,
PropertyRoomRatePriceRepository $propertyRoomRatePriceRepository,
PropertyRoomAvailabilityRepository $propertyRoomAvailabilityRepository,
PropertyRoomUpdateValidator $propertyRoomUpdateValidator,
PropertyRoomDeleteValidator $propertyRoomDeleteValidator,
PropertyRoomAddValidator $propertyRoomAddValidator,
PropertyRoomInventoryValidator $propertyRoomInventoryValidator,
PropertyRepository $propertyRepository,
PropertyRoomAndBedAddValidator $propertyRoomAndBedAddValidator,
PropertyRoomTypeService $propertyRoomTypeService,
PropertyRoomViewMappingRepository $propertyRoomViewMappingRepository,
PropertyRoomAndBedUpdateValidator $propertyRoomAndBedUpdateValidator,
PropertyAvailabilityTypeRepository $propertyAvailabilityTypeRepository,
PropertyRoomConnectedRepository $propertyRoomConnectedRepository
)
{
$this->propertyRoomRepository = $propertyRoomRepository;
$this->propertyChannelMappingRepository = $propertyChannelMappingRepository;
$this->propertyRoomBedRepository = $propertyRoomBedRepository;
$this->propertyRoomRatePriceRepository = $propertyRoomRatePriceRepository;
$this->propertyRoomAvailabilityRepository = $propertyRoomAvailabilityRepository;
$this->propertyRoomAddValidator = $propertyRoomAddValidator;
$this->propertyRoomAndBedAddValidator = $propertyRoomAndBedAddValidator;
$this->propertyRoomUpdateValidator = $propertyRoomUpdateValidator;
$this->propertyRoomDeleteValidator = $propertyRoomDeleteValidator;
$this->propertyRoomInventoryValidator = $propertyRoomInventoryValidator;
$this->propertyRepository = $propertyRepository;
$this->propertyRoomTypeService = $propertyRoomTypeService;
$this->propertyRoomViewMappingRepository = $propertyRoomViewMappingRepository;
$this->propertyRoomAndBedUpdateValidator = $propertyRoomAndBedUpdateValidator;
$this->languageService = $languageService;
$this->propertyAvailabilityTypeRepository = $propertyAvailabilityTypeRepository;
$this->propertyRoomConnectedRepository = $propertyRoomConnectedRepository;
}
public function create($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$validationResult = $this->propertyRoomAddValidator->validate($params);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$description = [];
foreach (fillOnUndefined($params, "description", []) as $title) {
$description[$title['language_code']] = $title['description'];
}
$insertData =
[
'property_id' => fillOnUndefined($params, 'property_id'),
'name' => fillOnUndefined($params, 'name'),
'room_type_id' => fillOnUndefined($params, 'room_type_id'),
'max_occupancy' => fillOnUndefined($params, 'max_occupancy'),
'max_adult' => fillOnUndefined($params, 'max_adult'),
'max_child' => fillOnUndefined($params, 'max_child'),
'room_size' => fillOnUndefined($params, 'room_size'),
'room_size_type' => fillOnUndefined($params, 'room_size_type'),
'room_type_count' => fillOnUndefined($params, 'room_type_count', 1),
'room_count' => fillOnUndefined($params, 'room_count'),
'bathroom_count' => fillOnUndefined($params, 'bathroom_count'),
'toilet_count' => fillOnUndefined($params, 'toilet_count'),
'lounge_count' => fillOnUndefined($params, 'lounge_count'),
'max_child_number' => fillOnUndefined($params, 'max_child_number'),
'description' => json_encode($description),
"status" => fillOnUndefined($params, "status", 1),
"created_by" => fillOnUndefined($params, "created_by"),
"updated_by" => fillOnUndefined($params, "updated_by"),
];
$userCreateResult = $this->propertyRoomRepository->create($insertData);
if ($userCreateResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$userData = $userCreateResult["data"];
$response = [
'status' => true,
'data' => $userData,
];
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function select($param = [], $column = ['*'])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$data = $this->propertyRoomRepository->findByCriteria($param, $column);
$response = [
'status' => true,
'data' => $data,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function update($id, $param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$updateResult = $this->propertyRoomRepository->update($id, $param);
if ($updateResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$updateData = $updateResult["data"];
$response = [
'status' => true,
'data' => $updateData,
];
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function updateOrCreate($criteria = [], $saveData = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$data = $this->propertyRoomRepository->updateOrCreate($criteria, $saveData);
if ($data['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$response = [
'status' => true,
'data' => $data,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function addPropertyRoom($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$insertData =
[
'property_id' => fillOnUndefined($params, 'property_id'),
'name' => fillOnUndefined($params, 'name'),
'room_type_id' => fillOnUndefined($params, 'room_type_id'),
'max_occupancy' => fillOnUndefined($params, 'max_occupancy'),
'max_adult' => fillOnUndefined($params, 'max_adult'),
'max_child' => fillOnUndefined($params, 'max_child'),
'occupancy_lock' => fillOnUndefined($params, 'occupancy_lock'),
'room_size' => fillOnUndefined($params, 'room_size'),
'room_size_type' => fillOnUndefined($params, 'room_size_type'),
'room_type_count' => fillOnUndefined($params, 'room_type_count', 1),
'room_count' => fillOnUndefined($params, 'room_count'),
'bathroom_count' => fillOnUndefined($params, 'bathroom_count'),
'toilet_count' => fillOnUndefined($params, 'toilet_count'),
'lounge_count' => fillOnUndefined($params, 'lounge_count'),
'max_child_number' => fillOnUndefined($params, 'max_child_number'),
'description' => fillOnUndefined($params, 'description'),
"status" => fillOnUndefined($params, "status", 1),
"created_by" => fillOnUndefined($params, "user_id"),
"updated_by" => fillOnUndefined($params, "user_id")
];
$userCreateResult = $this->create($insertData);
if ($userCreateResult['status'] != 'success') {
throw new ApiErrorException($userCreateResult['message']);
}
$userData = $userCreateResult["data"];
$response = [
'status' => true,
'data' => $userData,
];
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function getPropertyRooms($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
],
'with' => ['propertyRoomType', 'propertyRoomBedGroup.propertyRoomBedType']
];
$data = $this->propertyRoomRepository->findByCriteria($criteria, ['id', 'name', 'room_type_id', 'max_occupancy', 'max_adult', 'max_child', 'room_size', 'room_size_type', 'room_type_count', 'room_count', 'bathroom_count', 'toilet_count', 'lounge_count', 'max_child_number']);
$newRoomMapping = [];
foreach ($data as $room) {
$bedGroups = collect($room['property_room_bed_group'])->keyBy('bed_group')->keys();
$group = [];
foreach ($bedGroups as $bedGroup) {
$thisGroup = collect($room['property_room_bed_group'])->where('bed_group', '=', $bedGroup)->map(function ($bedItem) use ($bedGroup) {
$responseMapping = $bedItem;
$responseMapping['bed_type_name'] = $bedItem['property_room_bed_type']['name'];
unset($responseMapping['property_room_bed_type']);
return $responseMapping;
})->toArray();
$newItem = [];
foreach ($thisGroup as $item) {
$newItem[] = $item;
}
$group[] = $newItem;
}
$room['property_room_bed_group'] = $group;
$newRoomMapping[] = $room;
}
$response = [
'status' => true,
'data' => $newRoomMapping,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function updatePropertyRoom($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$validationResult = $this->propertyRoomUpdateValidator->validate($params);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$description = [];
foreach (fillOnUndefined($params, "description", []) as $title) {
$description[$title['language_code']] = $title['description'];
}
$updateData =
[
'name' => fillOnUndefined($params, 'name'),
'room_type_id' => fillOnUndefined($params, 'room_type_id'),
'max_occupancy' => fillOnUndefined($params, 'max_occupancy'),
'max_adult' => fillOnUndefined($params, 'max_adult'),
'max_child' => fillOnUndefined($params, 'max_child'),
'occupancy_lock' => fillOnUndefined($params, 'occupancy_lock'),
'exclude_occupancy' => json_encode($params['exclude_occupancy'], true),
'room_size' => fillOnUndefined($params, 'room_size', null),
'room_size_type' => fillOnUndefined($params, 'room_size_type', null),
'room_type_count' => fillOnUndefined($params, 'room_type_count', 1),
'room_count' => fillOnUndefined($params, 'room_count', null),
'bathroom_count' => fillOnUndefined($params, 'bathroom_count', null),
'toilet_count' => fillOnUndefined($params, 'toilet_count', null),
'lounge_count' => fillOnUndefined($params, 'lounge_count', null),
'max_child_number' => fillOnUndefined($params, 'max_child_number', null),
'description' => json_encode($description),
"updated_by" => fillOnUndefined($params, "user_id")
];
$updateResult = $this->update($params['id'], $updateData);
if ($updateResult['status'] != 'success') {
throw new ApiErrorException($updateResult['message']);
}
$userData = $updateResult["data"];
$response = [
'status' => true,
'data' => $userData,
];
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function deletePropertyRoom($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$validationResult = $this->propertyRoomDeleteValidator->validate($params);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$updateData =
[
'status' => 0,
"updated_by" => fillOnUndefined($params, "user_id")
];
$updateResult = $this->update($params['id'], $updateData);
if ($updateResult['status'] != 'success') {
throw new ApiErrorException($updateResult['message']);
}
$userData = $updateResult["data"];
$response = [
'status' => true,
'data' => $userData,
];
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function getPropertyRoomRateChannel($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$criteria = [
'criteria' => [
//['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
],
'with' => [
'propertyRoomType', 'propertyRoomRateMapping.propertyRoomRateChannel', 'propertyRoomRateMapping.connectedRate',
'propertyRoomRateMapping.propertyRoomRate', 'propertyRoomBedGroup.propertyRoomBedType',
'propertyRoomViewMapping.propertyRoomViewType', 'propertyRoomConnected'
]
];
$columns = [
'id', 'name', 'room_type_id', 'max_occupancy', 'max_adult', 'max_child', 'exclude_occupancy', 'room_size',
'room_size_type', 'room_type_count', 'room_count', 'bathroom_count', 'toilet_count', 'lounge_count',
'max_child_number', 'description', 'is_connected_room', 'is_connected_room_price', 'is_connected_room_availability',
'occupancy_lock', 'status'
];
$roomData = $this->propertyRoomRepository->findByCriteria($criteria, $columns);
foreach ($roomData as $roomKey => $room) {
$roomData[$roomKey]['is_connected_room'] = $room['is_connected_room'] == 1 ? true : false;
$roomData[$roomKey]['is_connected_room_price'] = $room['is_connected_room_price'] == 1 ? true : false;
$roomData[$roomKey]['is_connected_room_availability'] = $room['is_connected_room_availability'] == 1 ? true : false;
}
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => fillOnUndefined($params, 'property_id')],
],
'with' => ['channel']
];
$channelData = $this->propertyChannelMappingRepository->findByCriteria($criteria, ['id', 'property_id', 'channel_id']);
$getApplicationLanguages = $this->languageService->getApplicationLanguages();
if ($getApplicationLanguages['status'] != 'success') {
throw new ApiErrorException($getApplicationLanguages['message']);
}
$applicationLanguages = $getApplicationLanguages['data'];
$return = [];
foreach ($roomData as $room) {
$item = $room;
$descriptionLangContents = json_decode($item['description'], 1);
$responseLangDescription = [];
foreach ($applicationLanguages as $applicationLanguage) {
$langKey = $applicationLanguage['code'];
$responseLangDescription[] = [
'language_code' => $langKey,
'description' => isset($descriptionLangContents[$langKey]) ? $descriptionLangContents[$langKey] : null
];
}
$item['description'] = $responseLangDescription;
$item['property_room_bed_group'] = [];
$item['exclude_occupancy'] = json_decode($room['exclude_occupancy']);
if (isset($room['property_room_rate_mapping'])) {
$roomRateMappings = $room['property_room_rate_mapping'];
$mapping = [];
foreach ($roomRateMappings as $roomRateMapping) {
if (isset($roomRateMapping['property_room_rate_channel'])) {
$newChannelData = [];
$roomRateChannels = $roomRateMapping['property_room_rate_channel'];
$rateChannelKey = [];
foreach ($roomRateChannels as $roomRateChannel) {
if ($roomRateChannel['status'] == 1) {
$rateChannelKey[$roomRateChannel['channel_id'] . '|' . $roomRateChannel['room_rate_mapping_id']] = $roomRateChannel['id'];
}
}
foreach ($channelData as $channel) {
$newChannelData[] = [
'id' => $channel['channel']['id'],
'name' => $channel['channel']['name'],
'channel_category_id' => $channel['channel']['channel_category_id'],
'country_code' => $channel['channel']['country_code'],
'currency_code' => $channel['channel']['currency_code'],
'logo' => $channel['channel']['logo'],
'is_checked' => isset($rateChannelKey[$channel['channel_id'] . '|' . $roomRateMapping['id']]),
];
}
$roomRateMapping['property_room_rate_channel'] = $newChannelData;
}
$roomRateMapping['name'] = $roomRateMapping['property_room_rate']['name'];
$roomRateMapping['min_stay'] = $roomRateMapping['property_room_rate']['min_stay'];
$roomRateMapping['max_stay'] = $roomRateMapping['property_room_rate']['max_stay'];
unset($roomRateMapping['property_room_rate']);
$mapping[] = $roomRateMapping;
}
$item['property_room_rate_mapping'] = $mapping;
}
$bedGroups = collect($room['property_room_bed_group'])->keyBy('bed_group')->keys();
$group = [];
foreach ($bedGroups as $bedGroup) {
$thisGroup = collect($room['property_room_bed_group'])->where('bed_group', '=', $bedGroup)->map(function ($bedItem) use ($bedGroup) {
$responseMapping = $bedItem;
$responseMapping['bed_type_name'] = $bedItem['property_room_bed_type']['name'];
$responseMapping['bed_type_language_key'] = $bedItem['property_room_bed_type']['language_key'];
unset($responseMapping['property_room_bed_type']);
return $responseMapping;
})->toArray();
$newItem = [];
foreach ($thisGroup as $bedItem) {
$newItem[] = $bedItem;
}
$group[] = $newItem;
}
$item['property_room_bed_group'] = $group;
$item['property_room_view_mapping'] = collect($room['property_room_view_mapping'])->map(function ($value) {
return $value['property_room_view_type'];
})->all();
$return[] = $item;
}
$response = [
'status' => true,
'data' => $return,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function getPropertyRoomInventory($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$validationResult = $this->propertyRoomInventoryValidator->validate($params);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$propertyRequest = [
'criteria' => [
['field' => 'id', 'condition' => '=', 'value' => $params['property_id']],
['field' => 'status', 'condition' => '=', 'value' => 1],
],
'firstRow' => 1
];
$property = $this->propertyRepository->findByCriteria($propertyRequest);
if (!$property) {
throw new ApiErrorException(lang('Property not found'));
}
// Get Channel Mapping Information
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => fillOnUndefined($params, 'property_id')],
['field' => 'channel_id', 'condition' => '=', 'value' => fillOnUndefined($params, 'channel_id')],
],
'with' => ['channel'],
'firstRow' => 1
];
$channelData = $this->propertyChannelMappingRepository->findByCriteria($criteria, ['id', 'property_id', 'channel_id', 'currency_code']);
if (!$channelData) {
throw new ApiErrorException('Channel mapping not found');
}
$inventoryGetParams = $params;
$inventoryGetParams['channelData'] = $channelData;
$roomRatePrices = $this->getInventory($inventoryGetParams);
if ($roomRatePrices['status'] != 'success') {
throw new ApiErrorException($roomRatePrices['message']);
}
$response = [
'status' => true,
'data' => $roomRatePrices['data'],
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function checkPropertyRoomMapping($param = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$request = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $param['property_id']],
],
'whereIn' => [
['field' => 'id', 'value' => $param['room_ids']],
],
'count' => 1
];
$data = $this->propertyRoomRepository->findByCriteria($request);
if ($data < count($param['room_ids'])) {
throw new ApiErrorException('Property - Room Mapping not validate.');
}
$response = [
'status' => true,
'data' => $data,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function addPropertyRoomAndBed($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
DB::beginTransaction();
// check room name, it is null set room type name.
if ($params['name'] == null) {
$propertyRoomTypeCriteria = [
'criteria' => [
['field' => 'id', 'condition' => '=', 'value' => $params['room_type_id']],
],
'firstRow' => true,
];
$propertyType = $this->propertyRoomTypeService->select($propertyRoomTypeCriteria);
$params['name'] = $propertyType['data']['name'];
}
$validationResult = $this->propertyRoomAndBedAddValidator->validate($params);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$description = [];
foreach (fillOnUndefined($params, "description", []) as $title) {
$description[$title['language_code']] = $title['description'];
}
if (!$params['is_connected_room']) {
$params['is_connected_room_price'] = null;
$params['is_connected_room_availability'] = null;
$params['connected_rooms'] = [];
}
$insertRoomData =
[
'property_id' => fillOnUndefined($params, 'property_id'),
'name' => fillOnUndefined($params, 'name'),
'room_type_id' => fillOnUndefined($params, 'room_type_id'),
'max_occupancy' => fillOnUndefined($params, 'max_occupancy'),
'max_adult' => fillOnUndefined($params, 'max_adult'),
'max_child' => fillOnUndefined($params, 'max_child'),
'occupancy_lock' => fillOnUndefined($params, 'occupancy_lock'),
'exclude_occupancy' => json_encode($params['exclude_occupancy'], true),
'room_size' => fillOnUndefined($params, 'room_size', null),
'room_size_type' => fillOnUndefined($params, 'room_size_type', null),
'room_type_count' => fillOnUndefined($params, 'room_type_count', 1),
'room_count' => fillOnUndefined($params, 'room_count', null),
'bathroom_count' => fillOnUndefined($params, 'bathroom_count', null),
'toilet_count' => fillOnUndefined($params, 'toilet_count', null),
'lounge_count' => fillOnUndefined($params, 'lounge_count', null),
'max_child_number' => fillOnUndefined($params, 'max_child_number', null),
'description' => json_encode($description),
'is_connected_room' => fillOnUndefined($params, 'is_connected_room', null) ? 1 : null,
'is_connected_room_price' => fillOnUndefined($params, 'is_connected_room_price', null) ? 1 : null,
'is_connected_room_availability' => fillOnUndefined($params, 'is_connected_room_availability', null) ? 1 : null,
"status" => fillOnUndefined($params, "status", 1),
"created_by" => fillOnUndefined($params, "user_id"),
"updated_by" => fillOnUndefined($params, "user_id")
];
$insertRoomDataResult = $this->propertyRoomRepository->create($insertRoomData);
if ($insertRoomDataResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$roomId = $insertRoomDataResult['data']['id'];
$roomBedGroup = fillOnUndefined($params, 'room_bed_group', []);
$bedGroupIndex = 1;
$insertBedData = [];
$isBedGroupInsert = true;
if (count($roomBedGroup) == 1) {
if (count($roomBedGroup[0]) == 1) {
if (empty($roomBedGroup[0][0]['bed_type_id'])) {
$isBedGroupInsert = false;
}
}
}
if ($isBedGroupInsert) {
$roomBedGroups = [];
collect($roomBedGroup)->map(function ($value) use (&$roomBedGroups) {
$roomBedGroups[] = collect($value)
->groupBy('bed_type_id')
->map(function ($val) {
return $val->count();
})->toArray();
});
foreach ($roomBedGroups as $bedGroup) {
foreach ($bedGroup as $bedTypeId => $bedTypeCount) {
if (!empty($bedTypeId)) {
$insertBedData[] =
[
'room_id' => $roomId,
'bed_group' => $bedGroupIndex,
'count' => $bedTypeCount,
'bed_type_id' => $bedTypeId,
"status" => fillOnUndefined($params, "status", 1),
"created_by" => fillOnUndefined($params, "user_id", 0),
"updated_by" => fillOnUndefined($params, "user_id", 0),
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
}
$bedGroupIndex++;
}
$insertBedResult = $this->propertyRoomBedRepository->insert($insertBedData);
if ($insertBedResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}
if (!empty($params['room_view_type'])) {
foreach ($params['room_view_type'] as $roomViewType) {
$datas[] = [
'room_id' => $roomId,
'room_view_type_id' => $roomViewType,
"created_by" => fillOnUndefined($params, "user_id", 0),
"updated_by" => fillOnUndefined($params, "user_id", 0),
"created_at" => time(),
"updated_at" => time(),
];
}
$propertyRoomViewMappingResult = $this->propertyRoomViewMappingRepository->createAll($datas);
if ($propertyRoomViewMappingResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}
//Connected Rooms
if ($params['is_connected_room']) {
$syncPropertyConnectedRoomParam = [
'property_id' => $params['property_id'],
'room_id' => $roomId,
'connected_rooms' => $params['connected_rooms'],
'user_id' => fillOnUndefined($params, 'user_id')
];
$syncPropertyConnectedRoom = $this->syncPropertyConnectedRoom($syncPropertyConnectedRoomParam);
if ($syncPropertyConnectedRoom['status'] != 'success') {
throw new Exception($syncPropertyConnectedRoom['message']);
}
}
//$userData = $insertBedResult["data"];
$response = [
'status' => true,
//'data' => $userData,
];
DB::commit();
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
DB::rollBack();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
DB::rollBack();
}
return output($response);
}
public function updatePropertyRoomAndBed($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
DB::beginTransaction();
// check room name, it is null set room type name.
if ($params['name'] == null) {
$propertyRoomTypeCriteria = [
'criteria' => [
['field' => 'id', 'condition' => '=', 'value' => $params['room_type_id']],
],
'firstRow' => true,
];
$propertyType = $this->propertyRoomTypeService->select($propertyRoomTypeCriteria);
$params['name'] = $propertyType['data']['name'];
}
$validationResult = $this->propertyRoomAndBedUpdateValidator->validate($params);
if ($validationResult->errors()->first()) {
$errors = $validationResult->errors()->all();
throw new ApiErrorException($errors);
}
$description = [];
foreach (fillOnUndefined($params, "description", []) as $title) {
$description[$title['language_code']] = $title['description'];
}
if (!$params['is_connected_room']) {
$params['is_connected_room_price'] = null;
$params['is_connected_room_availability'] = null;
$params['connected_rooms'] = [];
}
$insertRoomData =
[
'property_id' => fillOnUndefined($params, 'property_id'),
'name' => fillOnUndefined($params, 'name'),
'room_type_id' => fillOnUndefined($params, 'room_type_id'),
'max_occupancy' => fillOnUndefined($params, 'max_occupancy'),
'max_adult' => fillOnUndefined($params, 'max_adult'),
'max_child' => fillOnUndefined($params, 'max_child'),
'occupancy_lock' => fillOnUndefined($params, 'occupancy_lock'),
'exclude_occupancy' => json_encode($params['exclude_occupancy'], true),
'room_size' => fillOnUndefined($params, 'room_size', null),
'room_size_type' => fillOnUndefined($params, 'room_size_type', null),
'room_type_count' => fillOnUndefined($params, 'room_type_count', 1),
'room_count' => fillOnUndefined($params, 'room_count', null),
'bathroom_count' => fillOnUndefined($params, 'bathroom_count', null),
'toilet_count' => fillOnUndefined($params, 'toilet_count', null),
'lounge_count' => fillOnUndefined($params, 'lounge_count', null),
'max_child_number' => fillOnUndefined($params, 'max_child_number', null),
'is_connected_room' => fillOnUndefined($params, 'is_connected_room', null) ? 1 : null,
'is_connected_room_price' => fillOnUndefined($params, 'is_connected_room_price', null) ? 1 : null,
'is_connected_room_availability' => fillOnUndefined($params, 'is_connected_room_availability', null) ? 1 : null,
'description' => json_encode($description),
"status" => fillOnUndefined($params, "status", 1),
"updated_by" => fillOnUndefined($params, "user_id")
];
$insertRoomDataResult = $this->propertyRoomRepository->update(fillOnUndefined($params, 'room_id'), $insertRoomData);
if ($insertRoomDataResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
$roomId = $insertRoomDataResult['data']['id'];
$roomBedGroup = fillOnUndefined($params, 'room_bed_group', []);
$bedGroupIndex = 1;
$insertBedData = [];
$roomBedCriteria = [
'criteria' => [
['field' => 'room_id', 'condition' => '=', 'value' => $params['room_id']],
]
];
$roomBeds = $this->propertyRoomBedRepository->findByCriteria($roomBedCriteria);
$roomBeds = collect($roomBeds)->keyBy('id')->keys()->all();
if ($roomBeds) {
$destroyStatus = $this->propertyRoomBedRepository->destroy($roomBeds);
if ($destroyStatus['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}
$roomViewCriteria = [
'criteria' => [
['field' => 'room_id', 'condition' => '=', 'value' => $params['room_id']],
]
];
$roomViews = $this->propertyRoomViewMappingRepository->findByCriteria($roomViewCriteria);
$roomViews = collect($roomViews)->keyBy('id')->keys()->all();
if ($roomViews) {
$destroyStatus = $this->propertyRoomViewMappingRepository->destroy($roomViews);
if ($destroyStatus['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}
$isBedGroupInsert = true;
if (count($roomBedGroup) == 1) {
if (count($roomBedGroup[0]) == 1) {
if (empty($roomBedGroup[0][0]['bed_type_id'])) {
$isBedGroupInsert = false;
}
}
}
if ($isBedGroupInsert) {
$roomBedGroups = [];
collect($roomBedGroup)->map(function ($value) use (&$roomBedGroups) {
$roomBedGroups[] = collect($value)
->groupBy('bed_type_id')
->map(function ($val) {
return $val->count();
})->toArray();
});
foreach ($roomBedGroups as $bedGroup) {
foreach ($bedGroup as $bedTypeId => $bedTypeCount) {
if (!empty($bedTypeId)) {
$insertBedData[] =
[
'room_id' => $roomId,
'bed_group' => $bedGroupIndex,
'count' => $bedTypeCount,
'bed_type_id' => $bedTypeId,
"status" => fillOnUndefined($params, "status", 1),
"created_by" => fillOnUndefined($params, "user_id", 0),
"updated_by" => fillOnUndefined($params, "user_id", 0),
'created_at' => Carbon::now()->timestamp,
'updated_at' => Carbon::now()->timestamp,
];
}
}
$bedGroupIndex++;
}
$insertBedResult = $this->propertyRoomBedRepository->insert($insertBedData);
if ($insertBedResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}
if (!empty($params['room_view_type'])) {
foreach ($params['room_view_type'] as $roomViewType) {
$datas[] = [
'room_id' => $roomId,
'room_view_type_id' => $roomViewType,
"created_by" => fillOnUndefined($params, "user_id", 0),
"updated_by" => fillOnUndefined($params, "user_id", 0),
"created_at" => time(),
"updated_at" => time(),
];
}
$propertyRoomViewMappingResult = $this->propertyRoomViewMappingRepository->insert($datas);
if ($propertyRoomViewMappingResult['status'] != 'success') {
throw new Exception('api-unknown_error');
}
}
//Connected Rooms
$syncPropertyConnectedRoomParam = [
'property_id' => $params['property_id'],
'room_id' => $roomId,
'connected_rooms' => $params['connected_rooms'],
'user_id' => fillOnUndefined($params, 'user_id')
];
$syncPropertyConnectedRoom = $this->syncPropertyConnectedRoom($syncPropertyConnectedRoomParam);
if ($syncPropertyConnectedRoom['status'] != 'success') {
throw new Exception($syncPropertyConnectedRoom['message']);
}
//$userData = $insertBedResult["data"];
$response = [
'status' => true,
//'data' => $userData,
];
DB::commit();
} catch (ApiErrorException $e) {
$response['message'] = implode(', ', $e->getMessageArr());
DB::rollBack();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
DB::rollBack();
}
return output($response);
}
public function getPropertyRoomAndBed($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'id', 'condition' => '=', 'value' => $params['room_id']],
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
],
'with' => ['propertyRoomBedGroup', 'propertyRoomViewMapping'],
'firstRow' => true
];
$data = $this->propertyRoomRepository->findByCriteria($criteria, ['id', 'name', 'room_type_id', 'max_occupancy', 'max_adult', 'max_child', 'room_size', 'room_size_type', 'room_type_count', 'room_count', 'bathroom_count', 'toilet_count', 'lounge_count', 'max_child_number', 'description']);
$room = $data;
$getApplicationLanguages = $this->languageService->getApplicationLanguages();
if ($getApplicationLanguages['status'] != 'success') {
throw new ApiErrorException($getApplicationLanguages['message']);
}
$applicationLanguages = $getApplicationLanguages['data'];
$descriptionLangContents = json_decode($data['description'], 1);
$responseLangDescription = [];
foreach ($applicationLanguages as $applicationLanguage) {
$langKey = $applicationLanguage['code'];
$responseLangDescription[] = [
'language_code' => $langKey,
'description' => isset($descriptionLangContents[$langKey]) ? $descriptionLangContents[$langKey] : null
];
}
$room['description'] = $responseLangDescription;
$bedGroups = collect($room['property_room_bed_group'])->keyBy('bed_group')->keys();
$group = [];
foreach ($bedGroups as $bedGroup) {
$bedTypes = [];
$thisGroup = collect($room['property_room_bed_group'])->where('bed_group', '=', $bedGroup)->map(function ($bedItem) use ($bedGroup) {
$responseMapping = $bedItem;
return $responseMapping;
})->toArray();
foreach ($thisGroup as $groupItem) {
for ($i = 1; $i <= $groupItem['count']; $i++) {
$bedTypes[] = ['bed_type_id' => $groupItem['bed_type_id']];
}
}
$group[] = $bedTypes;
}
$room['property_room_bed_group'] = $group;
$room['property_room_view_mapping'] = collect($room['property_room_view_mapping'])->keyBy('room_view_type_id')->keys()->all();
$newRoomMapping = $room;
$response = [
'status' => true,
'data' => $newRoomMapping,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function getChannelRoomRateMapping($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
],
'with' => ['propertyRoomType', 'propertyRoomRateMapping.propertyRoomRateChannel', 'propertyRoomRateMapping.propertyRoomRate'],
'orderBy' => [
['field' => 'id', 'value' => 'ASC']
]
];
$roomData = $this->propertyRoomRepository->findByCriteria($criteria, ['id', 'name', 'room_type_id', 'max_occupancy', 'max_adult', 'max_child', 'exclude_occupancy', 'room_size', 'room_size_type', 'room_type_count', 'room_count', 'bathroom_count', 'toilet_count', 'lounge_count', 'max_child_number']);
$return = [];
foreach ($roomData as $room) {
$item = $room;
$item['exclude_occupancy'] = json_decode($room['exclude_occupancy']);
if ($room['property_room_rate_mapping']) {
$roomRateMappings = $room['property_room_rate_mapping'];
$mapping = [];
foreach ($roomRateMappings as $roomRateMapping) {
$propertyRoomRateChannel = null;
if (isset($roomRateMapping['property_room_rate_channel'])) {
$propertyRoomRateChannel = collect($roomRateMapping['property_room_rate_channel'])
->where('channel_id', '=', $params['channel_id'])
->where('room_rate_mapping_id', '=', $roomRateMapping['id'])
->first();
}
$mappingStatus = false;
if ($propertyRoomRateChannel) {
if ($propertyRoomRateChannel['status'] == 1) {
$mappingStatus = true;
}
}
$roomRateMapping['name'] = $roomRateMapping['property_room_rate']['name'];
$roomRateMapping['min_stay'] = $roomRateMapping['property_room_rate']['min_stay'];
$roomRateMapping['max_stay'] = $roomRateMapping['property_room_rate']['max_stay'];
$roomRateMapping['is_selected'] = $mappingStatus;
$roomRateMapping['has_date'] = $propertyRoomRateChannel['has_date'] == 0 ? false : true;
$roomRateMapping['end_date'] = $propertyRoomRateChannel['end_date'];
$roomRateMapping['start_date'] = $propertyRoomRateChannel['start_date'];
unset($roomRateMapping['property_room_rate']);
unset($roomRateMapping['property_room_rate_channel']);
$mapping[] = $roomRateMapping;
}
$item['property_room_rate_mapping'] = $mapping;
$return[] = $item;
}
}
$collection = collect($return);
$sorted = $collection->sortBy('id')->values()->all();
$response = [
'status' => true,
'data' => $sorted,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function inventoryRoomList($params = [])
{
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
isset($params['room_id']) ? ['field' => 'id', 'condition' => '=', 'value' => $params['room_id']] : null,
],
'with' => ['propertyRoomRateMapping.propertyRoomRate', 'propertyRoomRateMapping.propertyRoomRateChannel'],
"orderBy" => [
["field" => "id", "value" => "ASC"]
],
];
$roomData = $this->propertyRoomRepository->findByCriteria($criteria, ['id', 'name', 'room_type_id', 'max_occupancy', 'max_adult', 'max_child', 'room_size', 'room_size_type', 'room_type_count', 'room_count', 'bathroom_count', 'toilet_count', 'lounge_count', 'max_child_number']);
return $roomData ? $roomData : [];
}
public function inventoryRoomRateData($params = [])
{
$roomRatesCriteria = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
['field' => 'date', 'condition' => '>=', 'value' => $params['start_date']],
['field' => 'date', 'condition' => '<=', 'value' => $params['end_date']],
['field' => 'channel_id', 'condition' => '=', 'value' => $params['channel_id']],
],
'whereIn' => [
['field' => 'availability_type_id', 'value' => $params['availability_type_id']]
]
];
$roomRatePrice = $this->propertyRoomRatePriceRepository->findbyCriteria($roomRatesCriteria, ['id', 'property_id', 'property_room_id', 'room_rate_mapping_id', 'availability_type_id', 'channel_id', 'min_stay', 'max_stay', 'stop_sell', 'booking_on_request', 'date', 'amount', 'currency']);
$roomRatePrice = $roomRatePrice ? $roomRatePrice : [];
$priceArray = [];
foreach ($roomRatePrice as $price) {
$priceArray[$price['property_room_id'] . '|' . $price['room_rate_mapping_id'] . '|' . $price['availability_type_id'] . '|' . $price['date']] = $price;
}
return $priceArray;
}
public function inventoryAvailabilityData($params = [])
{
$availabilityTypeIds = implode(",", $params['availability_type_id']);
$roomAvailability = [];
if(!is_null($params['start_date']) && !is_null($params['end_date'])) {
$roomAvailabilityCriteria = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
['field' => 'date', 'condition' => '>=', 'value' => $params['start_date']],
['field' => 'date', 'condition' => '<=', 'value' => $params['end_date']],
],
'criteriaWhereRaw' =>
[
[
'query' => " ( `availability_type_id` = 3 OR ( `channel_id` = ? OR `channel_id` IS NULL ) AND `availability_type_id` IN ( " . $availabilityTypeIds . " ) )",
"binds" => [$params['channel_id']]
]
],
];
$roomAvailability = $this->propertyRoomAvailabilityRepository->findbyCriteria($roomAvailabilityCriteria);
}
$availabilityArray = [];
foreach ($roomAvailability as $availability) {
$availabilityArrayKey = $availability['property_room_id'] . '|' . $availability['room_rate_mapping_id'] . '|' . $availability['availability_type_id'] . '|' . $availability['channel_id'] . '|' . $availability['date'];
$availabilityArray[$availabilityArrayKey][] = [
'id' => $availability['id'],
'room_id' => $availability['property_room_id'],
'room_rate_mapping_id' => $availability['room_rate_mapping_id'],
'availability_type_id' => $availability['availability_type_id'],
'channel_id' => $availability['channel_id'],
'date' => $availability['date'],
'availability' => $availability['availability'],
'stop_sell' => $availability['stop_sell'],
];
}
//Sistemdeki benzer id listesi, mysql null unique index hatası için
foreach ($availabilityArray as $availabilityKey => $availability) {
if(count($availability) > 1) {
$availabilityArray[$availabilityKey] = last($availability);
$otherAvailabilityRowIds = collect($availability)->whereNotIn('id', [$availabilityArray[$availabilityKey]['id']])->pluck('id')->toArray();
$availabilityArray[$availabilityKey] = last($availability);
$availabilityArray[$availabilityKey]['otherIds'] = $otherAvailabilityRowIds;
} else {
$availabilityArray[$availabilityKey] = reset($availability);
}
}
return $availabilityArray;
}
public function getInventory($params)
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$startDate = fillOnUndefinedAndEmpty($params, 'start_date', date('Y-m-d'));
$endDate = fillOnUndefinedAndEmpty($params, 'end_date', Carbon::parse($startDate)->addDay(15)->format('Y-m-d'));
if ($endDate < $startDate) {
throw new ApiErrorException('date error');
}
$diffInDays = Carbon::parse($startDate)->diffInDays($endDate);
if ($diffInDays > 365) {
throw new ApiErrorException('Up to 1 yearly price updates can be made.'); //TODO: param extend
}
$channelSetupTypes = $this->setChannelAvailabilityTypes(['property_id' => $params['property_id'], 'channel_id' => $params['channel_id']]);
if ($channelSetupTypes['status'] != 'success') {
throw new ApiErrorException($channelSetupTypes['message']);
}
$channelSetupTypes = $channelSetupTypes['data'];
$forGeneralId = $channelSetupTypes['forGeneralId'];
$forAvailabilityData = $channelSetupTypes['forAvailabilityData'];
$forPriceData = $channelSetupTypes['forPriceData'];
$getPriceDataIds = collect($forPriceData)->keyBy('id')->keys()->toArray();
$getAvailabilityDataIds = collect($forAvailabilityData)->keyBy('id')->keys()->toArray();
$getAvailabilityDataIds = array_unique(array_merge($forGeneralId, $getAvailabilityDataIds));
$generalAvailabilityCheckId = $forGeneralId[0];
$roomData = $this->inventoryRoomList($params);
$priceRequest = [
'property_id' => $params['property_id'],
'start_date' => $startDate,
'end_date' => $endDate,
'channel_id' => $params['channel_id'],
'availability_type_id' => $getPriceDataIds,
];
$priceArray = $this->inventoryRoomRateData($priceRequest);
$availabilityRequest = [
'property_id' => $params['property_id'],
'start_date' => $startDate,
'end_date' => $endDate,
'channel_id' => $params['channel_id'],
'availability_type_id' => $getAvailabilityDataIds,
];
$availabilityArray = $this->inventoryAvailabilityData($availabilityRequest);
$quotaCollection = collect($availabilityArray)
->where('availability_type_id', '=', 3);
$currencyCode = $params['channelData']['currency_code'];
$return = [];
$keysForDevelopment = [];
// Fill Rooms
foreach ($roomData as $room) {
$item = $room;
$roomGeneralAvailability = collect($availabilityArray)
->where('room_id', '=', $room['id'])
->where('availability_type_id', '=', 1)
->where('room_rate_mapping_id', '=', null)
->where('channel_id', '=', null)
->toArray();
// Fill General availability Keys
$startDate = Carbon::parse($params['start_date']);
$roomAvailability = [];
$quotaAvailability = [];
$roomStopSell = [];
for ($i = 0; $i <= $diffInDays; $i++) {
$checkKey = $room['id'] . '||' . $generalAvailabilityCheckId . "||" . $startDate->format('Y-m-d');
$responseKey = 'AVA_' . $generalAvailabilityCheckId . '_' . $room['id'] . '_' . '0' . '_' . $startDate->format('Ymd');
$responseKeyStopSell = 'STS_' . $generalAvailabilityCheckId . '_' . $room['id'] . '_' . '0' . '_' . $startDate->format('Ymd');
$usedAvailability = $quotaCollection
->where('date', '=', $startDate->format('Y-m-d'))
->where('room_id', '=', $room['id'])
->sum('availability');
$remainingAvailability = isset($roomGeneralAvailability[$checkKey]['availability']) ? ($roomGeneralAvailability[$checkKey]['availability'] - $usedAvailability) : 0;
if (isset($roomGeneralAvailability[$checkKey])) {
$roomAvailability[$startDate->format('Y-m-d')] = [
'key' => $responseKey,
'value' => $roomGeneralAvailability[$checkKey]['availability'],
'stop_sell' => $roomGeneralAvailability[$checkKey]['stop_sell']
];
$roomStopSell[$startDate->format('Y-m-d')] = [
'key' => $responseKeyStopSell,
'value' => $roomGeneralAvailability[$checkKey]['stop_sell'],
];
$keysForDevelopment[$responseKey] = $roomGeneralAvailability[$checkKey]['availability'];
$keysForDevelopment[$responseKeyStopSell] = $roomGeneralAvailability[$checkKey]['stop_sell'];
} else {
$roomAvailability[$startDate->format('Y-m-d')] = [
'key' => $responseKey,
'value' => null,
'stop_sell' => 0
];
$roomStopSell[$startDate->format('Y-m-d')] = [
'key' => $responseKeyStopSell,
'value' => 0,
];
$keysForDevelopment[$responseKey] = rand(1, 10);
$keysForDevelopment[$responseKeyStopSell] = 0;
}
$responseRMKey = 'RMA_' . $generalAvailabilityCheckId . '_' . $room['id'] . '_' . '0' . '_' . $startDate->format('Ymd');
$quotaAvailability[$startDate->format('Y-m-d')] = [
'key' => $responseRMKey,
'value' => $remainingAvailability,
];
$startDate = $startDate->addDay();
}
$item['room_availability'] = $roomAvailability;
$item['remaining_availability'] = $quotaAvailability;
$item['room_stop_sell'] = $roomStopSell;
// Fill Room Rate Array
if (isset($room['property_room_rate_mapping'])) {
$roomRateMappings = $room['property_room_rate_mapping'];
if (isset($params['room_rate_mapping_id'])) {
$roomRateMappings = collect($roomRateMappings)
->where('id', '=', $params['room_rate_mapping_id'])
->toArray();
}
$mapping = [];
foreach ($roomRateMappings as $roomRateMapping) {
$checkMappingStatus = collect($roomRateMapping['property_room_rate_channel'])
->where('channel_id', '=', $params['channel_id'])
->where('status', '=', 1)
->first();
if ($checkMappingStatus) {
$roomRateMapping['name'] = $roomRateMapping['property_room_rate']['name'];
$roomRateMapping['min_stay'] = $roomRateMapping['property_room_rate']['min_stay'];
$roomRateMapping['max_stay'] = $roomRateMapping['property_room_rate']['max_stay'];
$roomRateMapping['currency_code'] = $currencyCode;
unset($roomRateMapping['property_room_rate']);
foreach ($forPriceData as $roomRateAvailabilityCheckId) {
$startDate = Carbon::parse($params['start_date']);
$prices[$roomRateAvailabilityCheckId['id']]['name'] = $roomRateAvailabilityCheckId['name'];
$prices[$roomRateAvailabilityCheckId['id']]['language_key'] = $roomRateAvailabilityCheckId['language_key'];
for ($i = 0; $i <= $diffInDays; $i++) {
$checkKey = $roomRateMapping['room_id'] . "|" . $roomRateMapping['id'] . "|" . $roomRateAvailabilityCheckId['id'] . "|" . $startDate->format('Y-m-d');
$responsePRCKey = 'PRC_' . $roomRateAvailabilityCheckId['id'] . '_' . $roomRateMapping['room_id'] . '_' . $roomRateMapping['id'] . '_' . $startDate->format('Ymd');
$responseSTSKey = 'STS_' . $roomRateAvailabilityCheckId['id'] . '_' . $roomRateMapping['room_id'] . '_' . $roomRateMapping['id'] . '_' . $startDate->format('Ymd');
$responseMNSKey = 'MNS_' . $roomRateAvailabilityCheckId['id'] . '_' . $roomRateMapping['room_id'] . '_' . $roomRateMapping['id'] . '_' . $startDate->format('Ymd');
// Fill Price Keys
if (isset($priceArray[$checkKey])) {
$prices[$roomRateAvailabilityCheckId['id']]['price'][$startDate->format('Y-m-d')] = [
'key' => $responsePRCKey,
'value' => $priceArray[$checkKey]['amount'],
'stop_sell' => $priceArray[$checkKey]['stop_sell'],
];
$prices[$roomRateAvailabilityCheckId['id']]['stop_sell'][$startDate->format('Y-m-d')] = [
'key' => $responseSTSKey,
'value' => $priceArray[$checkKey]['stop_sell'],
];
$prices[$roomRateAvailabilityCheckId['id']]['min_stay'][$startDate->format('Y-m-d')] = [
'key' => $responseMNSKey,
'value' => $priceArray[$checkKey]['min_stay'],
];
$keysForDevelopment[$responsePRCKey] = $priceArray[$checkKey]['amount'];
} else {
$prices[$roomRateAvailabilityCheckId['id']]['price'][$startDate->format('Y-m-d')] = [
'key' => $responsePRCKey,
'value' => null,
'stop_sell' => 0
];
$prices[$roomRateAvailabilityCheckId['id']]['stop_sell'][$startDate->format('Y-m-d')] = [
'key' => $responseSTSKey,
'value' => 0,
];
$prices[$roomRateAvailabilityCheckId['id']]['min_stay'][$startDate->format('Y-m-d')] = [
'key' => $responseMNSKey,
'value' => 1,
];
$keysForDevelopment[$responsePRCKey] = rand(1, 10);
}
$startDate = $startDate->addDay();
}
}
$roomRateMapping['prices'] = $prices;
$availabilities = [];
$prices = [];
foreach ($forAvailabilityData as $roomRateAvailabilityCheckId) {
$startDate = Carbon::parse($params['start_date']);
$availabilities[$roomRateAvailabilityCheckId['id']]['name'] = $roomRateAvailabilityCheckId['name'];
$availabilities[$roomRateAvailabilityCheckId['id']]['language_key'] = $roomRateAvailabilityCheckId['language_key'];
for ($i = 0; $i <= $diffInDays; $i++) {
$checkKey = $roomRateMapping['room_id'] . "|" . $roomRateMapping['id'] . "|" . $roomRateAvailabilityCheckId['id'] . "|" . $params['channel_id'] . "|" . $startDate->format('Y-m-d');
$responseAVAKey = 'AVA_' . $roomRateAvailabilityCheckId['id'] . '_' . $roomRateMapping['room_id'] . '_' . $roomRateMapping['id'] . '_' . $startDate->format('Ymd');
// Fill Availability Keys
if (isset($availabilityArray[$checkKey])) {
$availabilities[$roomRateAvailabilityCheckId['id']]['availability'][$startDate->format('Y-m-d')] = [
'key' => $responseAVAKey,
'value' => $availabilityArray[$checkKey]['availability'],
];
$keysForDevelopment[$responseAVAKey] = $availabilityArray[$checkKey]['availability'];
} else {
$availabilities[$roomRateAvailabilityCheckId['id']]['availability'][$startDate->format('Y-m-d')] = [
'key' => $responseAVAKey,
'value' => null,
];
$keysForDevelopment[$responseAVAKey] = rand(1, 10);
}
$startDate = $startDate->addDay();
}
}
$roomRateMapping['availabilities'] = $availabilities;
$mapping[] = $roomRateMapping;
}
}
$item['property_room_rate_mapping'] = $mapping;
if ($mapping) {
$return[] = $item;
}
}
}
// log::debug(json_encode($keysForDevelopment));
$response = [
'status' => true,
'data' => $return,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function setChannelAvailabilityTypes($params)
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
// Get Channel Setup
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => fillOnUndefined($params, 'property_id')],
['field' => 'channel_id', 'condition' => '=', 'value' => fillOnUndefined($params, 'channel_id')],
],
'firstRow' => 1
];
$channelSetupData = $this->propertyChannelMappingRepository->findByCriteria($criteria);
if (!$channelSetupData) {
throw new ApiErrorException('Channel mapping not found');
}
$propertyChannelSetupTypeId = $channelSetupData['property_availability_type_id'];
// Get All Availability types
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
]
];
$allAvailabilityTypes = $this->propertyAvailabilityTypeRepository->findByCriteria($criteria);
if (!$allAvailabilityTypes) {
throw new ApiErrorException('Availability types not found');
}
switch ($propertyChannelSetupTypeId) {
default :
$forGeneralId = [1];
$forAvailabilityId = [];
$forPriceId = [1];
break;
case 2:
$forGeneralId = [1];
$forAvailabilityId = [2];
$forPriceId = [2];
break;
case 3:
$forGeneralId = [1];
$forAvailabilityId = [3];
$forPriceId = [1, 3];
break;
}
$forGeneralData = $forGeneralId ? collect($allAvailabilityTypes)->whereIn('id', $forGeneralId)->toArray() : [];
$forAvailabilityData = $forGeneralId ? collect($allAvailabilityTypes)->whereIn('id', $forAvailabilityId)->toArray() : [];
$forPriceData = $forGeneralId ? collect($allAvailabilityTypes)->whereIn('id', $forPriceId)->toArray() : [];
$returnData = [
'forGeneralId' => $forGeneralId,
'forGeneralData' => $forGeneralData,
'forAvailabilityData' => $forAvailabilityData,
'forPriceData' => $forPriceData,
'channelAvailabilityWorkingType' => $propertyChannelSetupTypeId
];
$response = [
'status' => true,
'data' => $returnData,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function roomIncludeOccupancies($params = [])
{
$occupancies = [];
for ($i = 1; $i <= $params['max_adult']; $i++) {
for ($j = 0; $j <= $params['max_child']; $j++) {
$paxTotal = $i + $j;
if ($paxTotal > $params['max_occupancy']) {
continue;
}
$occupancy = str_repeat('A', $i) . str_repeat('C', $j);
if (array_search($occupancy, $params['exclude_occupancy']) > -1) {
continue;
}
$occupancies[] = $occupancy;
}
}
return $occupancies;
}
public function getGroupInventory($params)
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$startDate = fillOnUndefinedAndEmpty($params, 'start_date', date('Y-m-d'));
$endDate = fillOnUndefinedAndEmpty($params, 'end_date', Carbon::parse($startDate)->addDay(15)->format('Y-m-d'));
if ($endDate < $startDate) {
throw new ApiErrorException('date error');
}
$diffInDays = Carbon::parse($startDate)->diffInDays($endDate);
if ($diffInDays > 15) {
throw new ApiErrorException('date error');
}
$roomData = $this->inventoryRoomList($params);
$priceRequest = [
'property_id' => $params['property_id'],
'start_date' => $startDate,
'end_date' => $endDate,
'channel_id' => $params['channel_id'],
'availability_type_id' => 1,
];
$availabilityRequest = [
'property_id' => $params['property_id'],
'start_date' => $startDate,
'end_date' => $endDate,
'channel_id' => $params['channel_id'],
'availability_type_id' => 1,
];
$availabilityArray = $this->inventoryAvailabilityData($availabilityRequest);
$quotaCollection = collect($availabilityArray)
->where('availability_type_id', '=', 3);
$currencyCode = $params['channelData']['currency_code'];
$return = [];
$keysForDevelopment = [];
// Fill Rooms
foreach ($roomData as $room) {
$item = $room;
$roomGeneralAvailability = collect($availabilityArray)
->where('room_id', '=', $room['id'])
->where('availability_type_id', '=', 1)
->where('room_rate_mapping_id', '=', null)
->where('channel_id', '=', null)
->toArray();
// Fill General availability Keys
$startDate = Carbon::parse($params['start_date']);
$roomAvailability = [];
$quotaAvailability = [];
$roomStopSell = [];
for ($i = 0; $i <= $diffInDays; $i++) {
$checkKey = $room['id'] . '||' . $generalAvailabilityCheckId . "||" . $startDate->format('Y-m-d');
$responseKey = 'AVA_' . $generalAvailabilityCheckId . '_' . $room['id'] . '_' . '0' . '_' . $startDate->format('Ymd');
$responseKeyStopSell = 'STS_' . $generalAvailabilityCheckId . '_' . $room['id'] . '_' . '0' . '_' . $startDate->format('Ymd');
$usedAvailability = $quotaCollection
->where('date', '=', $startDate->format('Y-m-d'))
->where('room_id', '=', $room['id'])
->sum('availability');
$remainingAvailability = isset($roomGeneralAvailability[$checkKey]['availability']) ? ($roomGeneralAvailability[$checkKey]['availability'] - $usedAvailability) : 0;
if (isset($roomGeneralAvailability[$checkKey])) {
$roomAvailability[$startDate->format('Y-m-d')] = [
'key' => $responseKey,
'value' => $roomGeneralAvailability[$checkKey]['availability'],
'stop_sell' => $roomGeneralAvailability[$checkKey]['stop_sell']
];
$roomStopSell[$startDate->format('Y-m-d')] = [
'key' => $responseKeyStopSell,
'value' => $roomGeneralAvailability[$checkKey]['stop_sell'],
];
$keysForDevelopment[$responseKey] = $roomGeneralAvailability[$checkKey]['availability'];
$keysForDevelopment[$responseKeyStopSell] = $roomGeneralAvailability[$checkKey]['stop_sell'];
} else {
$roomAvailability[$startDate->format('Y-m-d')] = [
'key' => $responseKey,
'value' => null,
'stop_sell' => 0
];
$roomStopSell[$startDate->format('Y-m-d')] = [
'key' => $responseKeyStopSell,
'value' => 0,
];
$keysForDevelopment[$responseKey] = rand(1, 10);
$keysForDevelopment[$responseKeyStopSell] = 0;
}
$responseRMKey = 'RMA_' . $generalAvailabilityCheckId . '_' . $room['id'] . '_' . '0' . '_' . $startDate->format('Ymd');
$quotaAvailability[$startDate->format('Y-m-d')] = [
'key' => $responseRMKey,
'value' => $remainingAvailability,
];
$startDate = $startDate->addDay();
}
$item['room_availability'] = $roomAvailability;
$item['remaining_availability'] = $quotaAvailability;
$item['room_stop_sell'] = $roomStopSell;
// Fill Room Rate Array
if (isset($room['property_room_rate_mapping'])) {
$roomRateMappings = $room['property_room_rate_mapping'];
if (isset($params['room_rate_mapping_id'])) {
$roomRateMappings = collect($roomRateMappings)
->where('id', '=', $params['room_rate_mapping_id'])
->toArray();
}
$mapping = [];
foreach ($roomRateMappings as $roomRateMapping) {
$checkMappingStatus = collect($roomRateMapping['property_room_rate_channel'])
->where('channel_id', '=', $params['channel_id'])
->where('status', '=', 1)
->first();
if ($checkMappingStatus) {
$roomRateMapping['name'] = $roomRateMapping['property_room_rate']['name'];
$roomRateMapping['min_stay'] = $roomRateMapping['property_room_rate']['min_stay'];
$roomRateMapping['max_stay'] = $roomRateMapping['property_room_rate']['max_stay'];
$roomRateMapping['currency_code'] = $currencyCode;
unset($roomRateMapping['property_room_rate']);
foreach ($forPriceData as $roomRateAvailabilityCheckId) {
$startDate = Carbon::parse($params['start_date']);
$prices[$roomRateAvailabilityCheckId['id']]['name'] = $roomRateAvailabilityCheckId['name'];
$prices[$roomRateAvailabilityCheckId['id']]['language_key'] = $roomRateAvailabilityCheckId['language_key'];
for ($i = 0; $i <= $diffInDays; $i++) {
$checkKey = $roomRateMapping['room_id'] . "|" . $roomRateMapping['id'] . "|" . $roomRateAvailabilityCheckId['id'] . "|" . $startDate->format('Y-m-d');
$responsePRCKey = 'PRC_' . $roomRateAvailabilityCheckId['id'] . '_' . $roomRateMapping['room_id'] . '_' . $roomRateMapping['id'] . '_' . $startDate->format('Ymd');
$responseSTSKey = 'STS_' . $roomRateAvailabilityCheckId['id'] . '_' . $roomRateMapping['room_id'] . '_' . $roomRateMapping['id'] . '_' . $startDate->format('Ymd');
$responseMNSKey = 'MNS_' . $roomRateAvailabilityCheckId['id'] . '_' . $roomRateMapping['room_id'] . '_' . $roomRateMapping['id'] . '_' . $startDate->format('Ymd');
// Fill Price Keys
if (isset($priceArray[$checkKey])) {
$prices[$roomRateAvailabilityCheckId['id']]['price'][$startDate->format('Y-m-d')] = [
'key' => $responsePRCKey,
'value' => $priceArray[$checkKey]['amount'],
'stop_sell' => $priceArray[$checkKey]['stop_sell'],
];
$prices[$roomRateAvailabilityCheckId['id']]['stop_sell'][$startDate->format('Y-m-d')] = [
'key' => $responseSTSKey,
'value' => $priceArray[$checkKey]['stop_sell'],
];
$prices[$roomRateAvailabilityCheckId['id']]['min_stay'][$startDate->format('Y-m-d')] = [
'key' => $responseMNSKey,
'value' => $priceArray[$checkKey]['min_stay'],
];
$keysForDevelopment[$responsePRCKey] = $priceArray[$checkKey]['amount'];
} else {
$prices[$roomRateAvailabilityCheckId['id']]['price'][$startDate->format('Y-m-d')] = [
'key' => $responsePRCKey,
'value' => null,
'stop_sell' => 0
];
$prices[$roomRateAvailabilityCheckId['id']]['stop_sell'][$startDate->format('Y-m-d')] = [
'key' => $responseSTSKey,
'value' => 0,
];
$prices[$roomRateAvailabilityCheckId['id']]['min_stay'][$startDate->format('Y-m-d')] = [
'key' => $responseMNSKey,
'value' => 1,
];
$keysForDevelopment[$responsePRCKey] = rand(1, 10);
}
$startDate = $startDate->addDay();
}
}
$roomRateMapping['prices'] = $prices;
$availabilities = [];
$prices = [];
foreach ($forAvailabilityData as $roomRateAvailabilityCheckId) {
$startDate = Carbon::parse($params['start_date']);
$availabilities[$roomRateAvailabilityCheckId['id']]['name'] = $roomRateAvailabilityCheckId['name'];
$availabilities[$roomRateAvailabilityCheckId['id']]['language_key'] = $roomRateAvailabilityCheckId['language_key'];
for ($i = 0; $i <= $diffInDays; $i++) {
$checkKey = $roomRateMapping['room_id'] . "|" . $roomRateMapping['id'] . "|" . $roomRateAvailabilityCheckId['id'] . "|" . $params['channel_id'] . "|" . $startDate->format('Y-m-d');
$responseAVAKey = 'AVA_' . $roomRateAvailabilityCheckId['id'] . '_' . $roomRateMapping['room_id'] . '_' . $roomRateMapping['id'] . '_' . $startDate->format('Ymd');
// Fill Availability Keys
if (isset($availabilityArray[$checkKey])) {
$availabilities[$roomRateAvailabilityCheckId['id']]['availability'][$startDate->format('Y-m-d')] = [
'key' => $responseAVAKey,
'value' => $availabilityArray[$checkKey]['availability'],
];
$keysForDevelopment[$responseAVAKey] = $availabilityArray[$checkKey]['availability'];
} else {
$availabilities[$roomRateAvailabilityCheckId['id']]['availability'][$startDate->format('Y-m-d')] = [
'key' => $responseAVAKey,
'value' => null,
];
$keysForDevelopment[$responseAVAKey] = rand(1, 10);
}
$startDate = $startDate->addDay();
}
}
$roomRateMapping['availabilities'] = $availabilities;
$mapping[] = $roomRateMapping;
}
}
$item['property_room_rate_mapping'] = $mapping;
if ($mapping) {
$return[] = $item;
}
}
}
// log::debug(json_encode($keysForDevelopment));
$response = [
'status' => true,
'data' => $return,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function getParamsForPdfInvenyory($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$criteria = [
'criteria' => [
['field' => 'token', 'condition' => '=', 'value' => $params['token']],
['field' => 'status', 'condition' => '=', 'value' => 1],
],
'firstRow' => true
];
$mapping = $this->propertyChannelMappingRepository->findbyCriteria($criteria);
if (!isset($mapping)) {
throw new ApiErrorException('Channel mapping not found');
}
$startDate = date('Y-m') . "-01";
$return = [
'property_id' => $mapping['property_id'],
'channel_id' => $mapping['channel_id'],
'start_date' => $startDate,
'end_date' => Carbon::parse($startDate)->addMonth(6)->format('Y-m-d'),
];
$response = [
'status' => true,
'data' => $return,
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
public function syncPropertyConnectedRoom($params = [])
{
$response = ['status' => -1, 'message' => '', 'data' => null];
try {
$deletePropertyRoomConnectedCriteria = [
'criteria' => [
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']]
]
];
$deletePropertyRoomConnected = $this->propertyRoomConnectedRepository->delete($deletePropertyRoomConnectedCriteria);
if (!empty($params['connected_rooms'])) {
if (in_array($params['room_id'], $params['connected_rooms'])) {
throw new ApiErrorException('The room itself cannot be defined as a connected room.');
}
$criteria = [
'criteria' => [
['field' => 'status', 'condition' => '=', 'value' => 1],
['field' => 'property_id', 'condition' => '=', 'value' => $params['property_id']],
],
'whereIn' => [
['field' => 'id', 'value' => $params['connected_rooms']],
]
];
$rooms = $this->propertyRoomRepository->findByCriteria($criteria, ['id', 'name', 'room_type_id', 'max_occupancy', 'max_adult', 'max_child', 'room_size', 'room_size_type', 'room_type_count', 'room_count', 'bathroom_count', 'toilet_count', 'lounge_count', 'max_child_number', 'description']);
if (count($rooms) != count($params['connected_rooms'])) {
throw new ApiErrorException('Connected rooms are not available for this property.');
}
foreach ($rooms as $connectedRoom) {
$connectedRoomCreateParam = [
'property_id' => $params['property_id'],
'room_id' => $params['room_id'],
'connected_room_id' => $connectedRoom['id'],
'created_by' => $params['user_id'],
'updated_by' => $params['user_id'],
];
$connectedRoomCreate = $this->propertyRoomConnectedRepository->create($connectedRoomCreateParam);
if ($connectedRoomCreate['status'] != 'success') {
throw new Exception('Could not add connecting rooms.');
}
}
}
$response = [
'status' => true
];
} catch (ApiErrorException $e) {
$response['message'] = $e->getMessage();
} catch (Exception $e) {
$message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage();
Log::error($message);
$response['message'] = $e->getMessage();
}
return output($response);
}
}