username = 'reseliva'; $this->password = 'e3HYUTUSGcPwIRzV'; $this->request = $request; $this->propertyChannelService = $propertyChannelService; $this->propertyChannelMappingService = $propertyChannelMappingService; $this->propertyRoomRateChannelMappingService = $propertyRoomRateChannelMappingService; $this->propertyRoomRatePriceService = $propertyRoomRatePriceService; $this->propertyRoomAvailabilityService = $propertyRoomAvailabilityService; $this->propertyRoomService = $propertyRoomService; $this->bookingService = $bookingService; $this->channelManagerPropertyMappingService = $channelManagerPropertyMappingService; $this->channelManagerLogService = $channelManagerLogService; $payload = $this->request->getContent(); $payloadXML = simplexml_load_string($payload); $payloadParam = json_decode(json_encode($payloadXML), 1); $serviceRequestName = str_replace('RQ', '', $payloadXML->getName()); $this->serviceRequestName = $serviceRequestName; $this->param = $payloadParam; $this->channelId = 1; $this->channelManagerId = 1; //Reseliva, TODO: burada mapping yapılmış mı yapılmamış mı kontrol edilmeli, her şey verilmemeli //channelManagerLogService $this->channelManagerLogId = null; $this->channelManagerRequestTime = microtime(true); $insertDataLog = [ 'property_id' => $this->param['Hotel']['@attributes']['id'], 'channel_manager_id' => $this->channelManagerId, 'type' => 'C2E', 'service' => $serviceRequestName, 'request' => $payload, 'response' => null, 'ip_address' => $this->request->ip(), 'status' => null ]; $channelManagerLog = $this->channelManagerLogService->create($insertDataLog); if ($channelManagerLog['status'] == 'success') { $this->channelManagerLogId = $channelManagerLog['data']['id']; } //channelManagerLogService //Authentication $errors = []; if ($this->username != $payloadParam['Authentication']['@attributes']['username'] || $this->password != $payloadParam['Authentication']['@attributes']['password']) { $errors[] = [ //'code' => 100, 'message' => 'Your username or password is incorrect.' ]; } if (!empty($errors)) { $this->responseError($errors); } } public function responseError($errors) { $serviceRequestName = $this->serviceRequestName; $xmlResponse = new \SimpleXMLElement('<' . $serviceRequestName . 'RS>'); foreach ($errors as $error) { $xmlResponseError = $xmlResponse->addChild('Error', $error['message']); if (isset($error['code'])) { $xmlResponseError->addAttribute('code', $error['code']); } } //channelManagerLogService if (!is_null($this->channelManagerLogId)) { $updateDataLog = [ 'response' => $xmlResponse->asXML(), 'status' => 0 ]; if (!is_null($this->channelManagerRequestTime)) { $updateDataLog['response_time'] = microtime(true) - $this->channelManagerRequestTime; } $channelManagerLog = $this->channelManagerLogService->update($this->channelManagerLogId, $updateDataLog); } //channelManagerLogService echo $xmlResponse->asXML(); die(); } public function responseSuccess($xmlPayload) { //channelManagerLogService if (!is_null($this->channelManagerLogId)) { $updateDataLog = [ 'response' => $xmlPayload->asXML(), 'status' => 1 ]; if (!is_null($this->channelManagerRequestTime)) { $updateDataLog['response_time'] = microtime(true) - $this->channelManagerRequestTime; } $channelManagerLog = $this->channelManagerLogService->update($this->channelManagerLogId, $updateDataLog); } //channelManagerLogService echo $xmlPayload->asXML(); die(); } public function propertyChannelMapping($propertyId) { $response = ['status' => false, 'message' => '']; try { $propertyChannelMappingCriteria = [ 'criteria' => [ ['field' => 'channel_id', 'condition' => '=', 'value' => $this->channelId], ['field' => 'property_id', 'condition' => '=', 'value' => $propertyId], ['field' => 'status', 'condition' => '=', 'value' => 1], ], 'firstRow' => true ]; $propertyChannelMapping = $this->propertyChannelMappingService->select($propertyChannelMappingCriteria); if ($propertyChannelMapping['status'] != 'success') { throw new ApiErrorException($propertyChannelMapping['message']); } $response = [ 'status' => true, 'data' => $propertyChannelMapping['data'] ]; } 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 $response; } public function channelPropertyRoomRate($propertyId) { $response = ['status' => false, 'message' => '']; try { $requestParam = [ 'criteria' => [ ['field' => 'channel_id', 'condition' => '=', 'value' => $this->channelId], ['field' => 'property_id', 'condition' => '=', 'value' => $propertyId], ['field' => 'status', 'condition' => '=', 'value' => 1], ], 'with' => [ 'propertyRoomRateMapping.propertyRoomRate.propertyRoomRateAccommodation', 'propertyRoomRateMapping.propertyRoom.propertyRoomType', ] ]; $getChannelPropertyRoomRate = $this->propertyRoomRateChannelMappingService->select($requestParam); if ($getChannelPropertyRoomRate['status'] != 'success' || empty($getChannelPropertyRoomRate['data'])) { throw new ApiErrorException('Property Room Rate not found'); } $getChannelPropertyRoomRate['data'] = collect($getChannelPropertyRoomRate['data'])->where('property_room_rate_mapping.property_room.status',1)->toArray(); $response = [ 'status' => true, 'data' => $getChannelPropertyRoomRate['data'] ]; } 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 $response; } public function channelManagerPropertyCheck($propertyId) { $response = ['status' => false, 'message' => '']; try { $requestParam = [ 'criteria' => [ ['field' => 'status', 'condition' => '=', 'value' => 1], ['field' => 'property_id', 'condition' => '=', 'value' => $propertyId], ['field' => 'channel_manager_id', 'condition' => '=', 'value' => $this->channelManagerId], ], 'firstRow' => true ]; $channelManagerPropertyMapping = $this->channelManagerPropertyMappingService->select($requestParam); if ($channelManagerPropertyMapping['status'] != 'success' || empty($channelManagerPropertyMapping['data'])) { throw new ApiErrorException('Property Room Rate not found'); } $channelManagerPropertyMapping = $channelManagerPropertyMapping['data']; if (!is_null($channelManagerPropertyMapping['channel_manager_property_id'])) { throw new ApiErrorException('This hotel can only be updated by ENW'); } $response = [ 'status' => true ]; } 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 $response; } public function roomRate(Request $request) { $response = ['status' => false, 'message' => '']; try { $propertyId = $this->param['Hotel']['@attributes']['id']; $channelManagerPropertyCheck = $this->channelManagerPropertyCheck($propertyId); if (!$channelManagerPropertyCheck['status']) { throw new ApiErrorException($channelManagerPropertyCheck['message']); } $channelPropertyRoomRate = $this->channelPropertyRoomRate($propertyId); if (!$channelPropertyRoomRate['status']) { throw new ApiErrorException($channelPropertyRoomRate['message']); } $channelPropertyRoomRate = $channelPropertyRoomRate['data']; $propertyChannelMapping = $this->propertyChannelMapping($propertyId); if (!$propertyChannelMapping['status']) { throw new ApiErrorException($propertyChannelMapping['message']); } $propertyChannelMapping = $propertyChannelMapping['data']; $serviceRequestName = $this->serviceRequestName; $xmlResponse = new \SimpleXMLElement('<' . $serviceRequestName . 'RS>'); $ProductList = $xmlResponse->addChild('ProductList'); $ProductListHotel = $ProductList->addChild('Hotel'); $ProductListHotel->addAttribute('id', $propertyId); $ProductListHotel->addAttribute('currency', $propertyChannelMapping['currency_code']); $ProductListHotel->addAttribute('child_age_group_number', 1); //TODO: $roomRates = []; foreach ($channelPropertyRoomRate as $roomRate) { if ($roomRate['property_room_rate_mapping']['property_room_rate']['name'] == 'Best Available Rate') { continue; } $roomRates[$roomRate['property_room_rate_mapping']['room_id']]['room'] = [ 'id' => $roomRate['property_room_rate_mapping']['property_room']['id'], 'name' => $roomRate['property_room_rate_mapping']['property_room']['name'], 'status' => 'Active', 'capacity' => $roomRate['property_room_rate_mapping']['property_room']['max_adult'], 'capacity_child' => $roomRate['property_room_rate_mapping']['property_room']['max_child'], ]; $roomRates[$roomRate['property_room_rate_mapping']['room_id']] ['rate'][$roomRate['property_room_rate_mapping']['id']] = [ 'id' => $roomRate['property_room_rate_mapping']['id'], 'name' => $roomRate['property_room_rate_mapping']['property_room_rate']['property_room_rate_accommodation']['name'], 'rate' => $roomRate['property_room_rate_mapping']['property_room_rate']['name'] ]; } foreach ($roomRates as $roomId => $roomRate) { $RoomType = $ProductList->addChild('RoomType'); $RoomType->addAttribute('id', $roomId); $RoomType->addAttribute('name', $roomRate['room']['name']); $RoomType->addAttribute('status', $roomRate['room']['status']); $RoomType->addAttribute('capacity', $roomRate['room']['capacity']); $RoomType->addAttribute('capacity_child', $roomRate['room']['capacity_child']); foreach ($roomRate['rate'] as $roomRateMappingId => $rate) { $RatePlan = $RoomType->addChild('RatePlan'); $RatePlan->addAttribute('id', $roomRateMappingId); $RatePlan->addAttribute('name', $rate['name'] . ' - ' . $rate['rate']); } } $this->responseSuccess($xmlResponse); } 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(); } if (!$response['status']) { $errors[] = [ 'message' => $response['message'] ]; $this->responseError($errors); } } public function availabilityRateUpdate(Request $request) { $response = ['status' => false, 'message' => '']; try { $propertyId = $this->param['Hotel']['@attributes']['id']; $channelManagerPropertyCheck = $this->channelManagerPropertyCheck($propertyId); if (!$channelManagerPropertyCheck['status']) { throw new ApiErrorException($channelManagerPropertyCheck['message']); } $channelPropertyRoomRate = $this->channelPropertyRoomRate($propertyId); if (!$channelPropertyRoomRate['status']) { throw new ApiErrorException($channelPropertyRoomRate['message']); } $channelPropertyRoomRate = $channelPropertyRoomRate['data']; $channelPropertyRoomRateCollect = collect($channelPropertyRoomRate); $propertyChannelMapping = $this->propertyChannelMapping($propertyId); if (!$propertyChannelMapping['status']) { throw new ApiErrorException($propertyChannelMapping['message']); } $propertyChannelMapping = $propertyChannelMapping['data']; $availRateUpdates = singleElementXMLArray($this->param['AvailRateUpdate']); DB::beginTransaction(); foreach ($availRateUpdates as $availRateUpdate) { $dateRange = []; $dateRange['startDate'] = $availRateUpdate['DateRange']['@attributes']['from']; $dateRange['finishDate'] = $availRateUpdate['DateRange']['@attributes']['to']; if (Carbon::parse($dateRange['startDate'])->isBefore(Carbon::now()->toDateString()) || Carbon::parse($dateRange['finishDate'])->isBefore(Carbon::now()->toDateString())) { throw new ApiErrorException('Dates to be updated cannot be earlier than today'); } $roomTypes = singleElementXMLArray($availRateUpdate['RoomType']); foreach ($roomTypes as $roomType) { $roomId = $roomType['@attributes']['id']; $roomCheck = $channelPropertyRoomRateCollect->where('property_room_rate_mapping.room_id', $roomId)->isEmpty(); if ($roomCheck) { throw new ApiErrorException('Tanımlı ya da aktif olmayan oda'); } $totalInventoryAvailable = null; if (isset($roomType['Inventory']['@attributes']['totalInventoryAvailable'])) { $totalInventoryAvailable = $roomType['Inventory']['@attributes']['totalInventoryAvailable']; } $requestParamBase = [ 'property_id' => fillOnUndefined($propertyChannelMapping, 'property_id'), 'channel_id' => fillOnUndefined($propertyChannelMapping, 'channel_id'), 'availability_type_id' => fillOnUndefined($propertyChannelMapping, 'property_availability_type_id', 1), 'start_date' => $dateRange['startDate'], 'end_date' => $dateRange['finishDate'], 'include_days' => ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] ]; if (!is_null($totalInventoryAvailable)) { $requestParams = []; $requestParams = $requestParamBase; $requestParams['update_type'] = 'availability'; $requestParams['value'] = $totalInventoryAvailable; $requestParams['room_rates'] = [ ['room_id' => $roomId] ]; $propertyRoomRateMapping = $this->propertyRoomAvailabilityService->bulkUpdate($requestParams); if ($propertyRoomRateMapping['status'] != 'success') { throw new ApiErrorException($propertyRoomRateMapping['message']); } } if (isset($roomType['RatePlan'])) { $ratePlans = singleElementXMLArray($roomType['RatePlan']); foreach ($ratePlans as $ratePlan) { $roomRateMappingId = $ratePlan['@attributes']['id']; $isCloseRoomRateMappingSale = null; if (isset($ratePlan['@attributes']['closed'])) { $isCloseRoomRateMappingSale = $ratePlan['@attributes']['closed'] == 'true' ? true : false; } $channelRoomRateMappingCheck = $channelPropertyRoomRateCollect->where('room_rate_mapping_id', $roomRateMappingId)->isEmpty(); if ($channelRoomRateMappingCheck) { throw new ApiErrorException('Tanımlı ya da aktif olmayan oda konaklama'); } $roomRates = []; $roomRates[] = [ 'room_id' => $roomId, 'room_rate_mapping_id' => [ $roomRateMappingId ] ]; $paramsListChannel = []; $paramsListChannel[] = 1; //CONNECTED CHANNEL RATE UPDATE $propertyChannelMappingConnectedCriteria = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $requestParamBase['property_id']], ['field' => 'connected_channel_id', 'condition' => '=', 'value' => $requestParamBase['channel_id']], ['field' => 'channel_id', 'condition' => '=', 'value' => 5],//JUST CM ['field' => 'status', 'condition' => '=', 'value' => 1], ], 'with' => ['channel'] ]; $propertyChannelMappingConnected = $this->propertyChannelMappingService->select($propertyChannelMappingConnectedCriteria); if ($propertyChannelMappingConnected['status'] == 'success') { foreach ($propertyChannelMappingConnected['data'] as $channel) { if (!is_null($channel['channel']['parent_id'])) { continue; } $paramsListChannel[] = $channel['channel_id']; } } //CONNECTED CHANNEL RATE UPDATE foreach ($paramsListChannel as $paramChannelId) { //Eğer Rate var ise currency check yapılmalı ve PerDay var mı check edilmeli, burada sonra günceleme yaptırılabilri if (isset($ratePlan['Rate'])) { $currency = $ratePlan['Rate']['@attributes']['currency']; $currencyCheck = ($currency == $propertyChannelMapping['currency_code']) ? true : false; if (!$currencyCheck) { throw new ApiErrorException('Kanal döviz kuru ile eşleşmeyen döviz kuru, kanal döviz kuru: ' . $propertyChannelMapping['currency_code']); } $channelRoomRateMapping = $channelPropertyRoomRateCollect->where('room_rate_mapping_id', $roomRateMappingId)->first(); $amountPerDay = $ratePlan['Rate']['PerDay']['@attributes']['rate']; $requestParams = []; $requestParams = $requestParamBase; $requestParams['update_type'] = 'rate'; $requestParams['value'] = $amountPerDay; $requestParams['room_rates'] = $roomRates; $requestParams['channel_id'] = $paramChannelId; $propertyRoomRateMapping = $this->propertyRoomRatePriceService->bulkUpdate($requestParams); if ($propertyRoomRateMapping['status'] != 'success') { throw new ApiErrorException($propertyRoomRateMapping['message']); } } //Room Rate Stop Sale if (!is_null($isCloseRoomRateMappingSale)) { $requestParams = []; $requestParams = $requestParamBase; $requestParams['update_type'] = 'rate_stop_sell'; $requestParams['value'] = $isCloseRoomRateMappingSale ? 1 : 0; $requestParams['room_rates'] = $roomRates; $requestParams['channel_id'] = $paramChannelId; $propertyRoomRateMapping = $this->propertyRoomRatePriceService->bulkUpdate($requestParams); if ($propertyRoomRateMapping['status'] != 'success') { throw new ApiErrorException($propertyRoomRateMapping['message']); } } //Kısıtlamalar var ise min los if (isset($ratePlan['Restrictions'])) { //Minimum Konaklama Gün Sayısı if (isset($ratePlan['Restrictions']['@attributes']['minLOS'])) { $minStay = $ratePlan['Restrictions']['@attributes']['minLOS']; $requestParams = []; $requestParams = $requestParamBase; $requestParams['update_type'] = 'min_stay'; $requestParams['value'] = $minStay; $requestParams['room_rates'] = $roomRates; $requestParams['channel_id'] = $paramChannelId; $propertyRoomRateMapping = $this->propertyRoomRatePriceService->bulkUpdate($requestParams); if ($propertyRoomRateMapping['status'] != 'success') { throw new ApiErrorException($propertyRoomRateMapping['message']); } } } } } } } } DB::commit(); $serviceRequestName = $this->serviceRequestName; $xmlResponse = new \SimpleXMLElement('<' . $serviceRequestName . 'RS>'); $xmlResponse->addChild('Success'); $xmlResponse->addChild('ConfirmCode', $this->channelManagerLogId); $this->responseSuccess($xmlResponse); } 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(); } DB::rollBack(); if (!$response['status']) { $errors[] = [ 'message' => $response['message'] ]; $this->responseError($errors); } } public function availabilityRate(Request $request) { $response = ['status' => false, 'message' => '']; try { $propertyId = $this->param['Hotel']['@attributes']['id']; $channelManagerPropertyCheck = $this->channelManagerPropertyCheck($propertyId); if (!$channelManagerPropertyCheck['status']) { throw new ApiErrorException($channelManagerPropertyCheck['message']); } $startDate = $this->param['ParamSet']['AvailRateRetrieval']['@attributes']['from']; $finishDate = $this->param['ParamSet']['AvailRateRetrieval']['@attributes']['to']; $channelPropertyRoomRate = $this->channelPropertyRoomRate($propertyId); if (!$channelPropertyRoomRate['status']) { throw new ApiErrorException($channelPropertyRoomRate['message']); } $channelPropertyRoomRate = $channelPropertyRoomRate['data']; $propertyChannelMapping = $this->propertyChannelMapping($propertyId); if (!$propertyChannelMapping['status']) { throw new ApiErrorException($propertyChannelMapping['message']); } $propertyChannelMapping = $propertyChannelMapping['data']; $requestParams = [ 'property_id' => $propertyId, 'room_id' => null, 'room_rate_mapping_id' => null, 'channel_id' => $this->channelId, 'start_date' => $startDate, 'end_date' => $finishDate, ]; $propertyRoomType = $this->propertyRoomService->getPropertyRoomInventory($requestParams); if ($propertyRoomType['status'] != 'success') { throw new ApiErrorException($propertyRoomType['message']); } $propertyRoomType = $propertyRoomType['data']; $propertyRoomRateAvailability = collect($propertyRoomType); $roomRates = []; foreach ($propertyRoomRateAvailability as $room) { foreach ($room['property_room_rate_mapping'] as $roomRateMapping) { foreach ($room['room_availability'] as $date => $roomAvailability) { $roomRates[$room['id']]['availability'][$date] = $roomAvailability['value']; } $roomRates[$room['id']]['rate'][$roomRateMapping['id']] = [ 'roomName' => $room['name'], 'roomRateName' => $roomRateMapping['name'], //'minStay' => $roomRateMapping['min_stay'], //'maxStay' => $roomRateMapping['max_stay'], 'currencyCode' => $roomRateMapping['currency_code'], ]; $roomRatePrices = reset($roomRateMapping['prices']); foreach ($roomRatePrices['price'] as $date => $roomRatePrice) { $roomRates[$room['id']]['rate'][$roomRateMapping['id']]['price'][$date] = $roomRatePrice['value']; $roomRates[$room['id']]['rate'][$roomRateMapping['id']]['stopSell'][$date] = $roomRatePrice['stop_sell']; } foreach ($roomRatePrices['stop_sell'] as $date => $stopSell) { $roomRates[$room['id']]['rate'][$roomRateMapping['id']]['stopSell'][$date] = $stopSell['value']; } foreach ($roomRatePrices['min_stay'] as $date => $minStay) { $roomRates[$room['id']]['rate'][$roomRateMapping['id']]['minstay'][$date] = $minStay['value']; } } } $serviceRequestName = $this->serviceRequestName; $xmlResponse = new \SimpleXMLElement('<' . $serviceRequestName . 'RS>'); $AvailRateList = $xmlResponse->addChild('AvailRateList'); $AvailRateListHotel = $AvailRateList->addChild('Hotel'); $AvailRateListHotel->addAttribute('id', $propertyId); $diffInDays = Carbon::parse($startDate)->diffInDays(Carbon::parse($finishDate)); if ($diffInDays > 180) { throw new ApiErrorException('A maximum of 180 days of data can be retrieved.'); } $currentDate = $startDate; for ($i = 0; $i <= $diffInDays; $i++) { //Burada her roomid, roomratemappingid, availability, stopsell, kur, fiyat hepsi var ise kayda girece $AvailRate = $AvailRateList->addChild('AvailRate'); $AvailRate->addAttribute('date', $currentDate); foreach ($roomRates as $roomId => $roomRateMapping) { $RoomType = $AvailRate->addChild('RoomType'); $RoomType->addAttribute('id', $roomId); $Inventory = $RoomType->addChild('Inventory'); $Inventory->addAttribute('totalInventoryAvailable', $roomRateMapping['availability'][$currentDate]); foreach ($roomRateMapping['rate'] as $roomRateMappingId => $roomRate) { $RatePlan = $RoomType->addChild('RatePlan'); $RatePlan->addAttribute('id', $roomRateMappingId); $RatePlan->addAttribute('closed', $roomRate['stopSell'][$currentDate] == 1 ? 'true' : 'false'); $Rate = $RatePlan->addChild('Rate'); $Rate->addAttribute('currency', $roomRate['currencyCode']); $PerDay = $Rate->addChild('PerDay'); $PerDay->addAttribute('rate', $roomRate['price'][$currentDate]); $Restrictions = $RatePlan->addChild('Restrictions'); $Restrictions->addAttribute('minLOS', $roomRate['minstay'][$currentDate]); } } $currentDate = Carbon::parse($currentDate)->addDay()->toDateString(); } $this->responseSuccess($xmlResponse); } 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(); } if (!$response['status']) { $errors[] = [ 'message' => $response['message'] ]; $this->responseError($errors); } } public function booking(Request $request, $param = []) { $response = ['status' => false, 'message' => '']; try { $propertyId = $this->param['Hotel']['@attributes']['id']; $bookingId = $this->param['Booking']['@attributes']['id']; $type = $this->param['Booking']['@attributes']['type']; if (!in_array($type, ['Book', 'Modify', 'Cancel'])) { throw new ApiErrorException('Unknown process type:' . $type); } $this->serviceRequestName = 'BookingRetrieval'; $channelPropertyRoomRate = $this->channelPropertyRoomRate($propertyId); if (!$channelPropertyRoomRate['status']) { throw new ApiErrorException($channelPropertyRoomRate['message']); } $channelPropertyRoomRate = $channelPropertyRoomRate['data']; $propertyChannelMapping = $this->propertyChannelMapping($propertyId); if (!$propertyChannelMapping['status']) { throw new ApiErrorException($propertyChannelMapping['message']); } $propertyChannelMapping = $propertyChannelMapping['data']; $requestData = [ 'criteria' => [ ['field' => 'id', 'condition' => '=', 'value' => $bookingId], ['field' => 'property_id', 'condition' => '=', 'value' => $propertyId], ], 'with' => ['bookingContact', 'bookingChannel', 'bookingPayment', 'bookingPaymentType', 'bookingStatus', 'bookingRoom.roomPax.paxCountry'], 'firstRow' => true ]; $bookingDetail = $this->bookingService->select($requestData); if ($bookingDetail['status'] != 'success') { throw new ApiErrorException('Property Booking Data not found'); } $bookingDetail = $bookingDetail['data']; $serviceRequestName = 'BookingRetrieval'; $xmlResponse = new \SimpleXMLElement('<' . $serviceRequestName . 'RS>'); if (in_array($bookingDetail['status'], [0, 3])) { $Bookings = $xmlResponse->addChild('Bookings'); $Booking = $Bookings->addChild('Booking'); $Booking->addAttribute('id', $bookingDetail['id']); $Booking->addAttribute('type', 'Cancel'); $Booking->addAttribute('cancelDateTime', Carbon::createFromTimestamp($bookingDetail['updated_at'])->toISOString()); $Hotel = $Booking->addChild('Hotel'); $Hotel->addAttribute('id', $bookingDetail['property_id']); foreach ($bookingDetail['booking_room'] as $room) { $RoomStay = $Booking->addChild('RoomStay'); $RoomStay->addAttribute('roomTypeID', $room['room_id']); $RoomStay->addAttribute('ratePlanID', $room['room_rate_mapping_id']); $StayDate = $RoomStay->addChild('StayDate'); $StayDate->addAttribute('arrival', $room['checkin_date']); $StayDate->addAttribute('departure', $room['checkout_date']); } } else { $Bookings = $xmlResponse->addChild('Bookings'); $Booking = $Bookings->addChild('Booking'); $Booking->addAttribute('id', $bookingDetail['id']); //Book ve Modify Aynı olacak, Cancel if ($type == 'Book') { $Booking->addAttribute('type', 'Book'); $Booking->addAttribute('createDateTime', Carbon::createFromTimestamp($bookingDetail['created_at'])->toISOString()); } if ($type == 'Modify') { $Booking->addAttribute('type', 'Modify'); $Booking->addAttribute('modifyDateTime', Carbon::createFromTimestamp($bookingDetail['updated_at'])->toISOString()); } $Hotel = $Booking->addChild('Hotel'); $Hotel->addAttribute('id', $bookingDetail['property_id']); foreach ($bookingDetail['booking_room'] as $room) { $RoomStay = $Booking->addChild('RoomStay'); $RoomStay->addAttribute('roomTypeID', $room['room_id']); $RoomStay->addAttribute('ratePlanID', $room['room_rate_mapping_id']); $StayDate = $RoomStay->addChild('StayDate'); $StayDate->addAttribute('arrival', $room['checkin_date']); $StayDate->addAttribute('departure', $room['checkout_date']); $roomPaxCollect = collect($room['room_pax']); $GuestCount = $RoomStay->addChild('GuestCount'); $GuestCount->addAttribute('adult', $roomPaxCollect->where('type', 'ADT')->count()); $diffInDays = Carbon::parse($room['checkin_date'])->diffInDays(Carbon::parse($room['checkout_date'])); //dd($room['total'], $diffInDays, $room); $PerDayRates = $RoomStay->addChild('PerDayRates'); $PerDayRates->addAttribute('currency', $room['currency_code']); $baseRateDaily = moneyDoubleFormatDecimal($room['total'] / $diffInDays); $currentDate = $room['checkin_date']; for ($i = 0; $i < $diffInDays; $i++) { $PerDayRate = $PerDayRates->addChild('PerDayRate'); $PerDayRate->addAttribute('stayDate', $currentDate); $PerDayRate->addAttribute('baseRate', $baseRateDaily); $PerDayRate->addAttribute('hotelServiceFees', 0); $currentDate = Carbon::parse($currentDate)->addDay()->toDateString(); } $Total = $RoomStay->addChild('Total'); $Total->addAttribute('amountAfterTaxes', $room['total']); $Total->addAttribute('amountOfTaxes', 0); $Total->addAttribute('currency', $room['currency_code']); $RoomStay->addChild('RoomNotes', $bookingDetail['booking_contact']['note']); } $PrimaryGuest = $Booking->addChild('PrimaryGuest'); $Name = $PrimaryGuest->addChild('Name'); $Name->addAttribute('givenName', $bookingDetail['booking_contact']['name']); $Name->addAttribute('surname', $bookingDetail['booking_contact']['surname']); $Phone = $PrimaryGuest->addChild('Phone'); $Phone->addAttribute('countryCode', $bookingDetail['booking_contact']['phone_code']); //$Phone->addAttribute('cityAreaCode'); $Phone->addAttribute('number', $bookingDetail['booking_contact']['phone_number']); $PrimaryGuest->addChild('Email', $bookingDetail['booking_contact']['email']); $Total = $Booking->addChild('Total'); $Total->addAttribute('amountAfterTaxes', $bookingDetail['total']); $Total->addAttribute('amountOfTaxes', 0); $Total->addAttribute('currency', $bookingDetail['currency_code']); $Booking->addChild('SpecialRequest'); $Booking->addChild('BookingNotes', $bookingDetail['booking_contact']['note']); } $this->responseSuccess($xmlResponse); } 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(); } if (!$response['status']) { $errors[] = [ 'message' => $response['message'] ]; $this->responseError($errors); } } }