restClient = $restClient; $this->mailer = $mailer; //$this->reservationPushUrl = 'https://cm-staging.hotelrunner.com/api/push/reservation/28fb9e7b18903126e9d71a10ced00db0edec8710'; $this->reservationPushUrl = 'https://cm.hotelrunner.com/api/push/reservation/da120fb30eae007e41034f5ab7824608ab8250de'; $this->typeMapping = [ 'Booking' => 'Confirm', 'Modify' => 'Modify', 'Cancel' => 'Cancel' ]; $this->roomStatusTypeMapping = [ 1 => 'Confirm', 0 => 'Cancel' ]; $this->channelManagerId = 3; $this->channelManagerName = 'HotelRunner'; $this->channelManagerPropertyMappingService = $channelManagerPropertyMappingService; $this->channelManagerMappingService = $channelManagerMappingService; } public function requestPost($method, $xmlPayload) { $response = ['status' => false, 'message' => '']; try { $this->restClient = new Client(['http_errors' => false]); $res = $this->restClient->post($this->url . $method, [ 'headers' => [ 'Content-Type' => 'text/xml; charset=UTF8', 'Accept' => 'text/xml' ], 'body' => $xmlPayload, ] ); $getResponseBody = $res->getBody(); $getResponse = $getResponseBody->getContents(); $getResponseXml = new \SimpleXMLElement($getResponse, LIBXML_NOCDATA); $getResponse = json_decode(json_encode($getResponseXml), 1); $response = ["status" => true, 'message' => '', "data" => $getResponse]; } 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 requestPostReservationPushParam($propertyId, $bookingId, $type, $param = []) { $type = $this->typeMapping[$type]; $bookingDetail = $param['booking_detail']; $xmlResponse = new \SimpleXMLElement(''); $xmlResponse->addChild('status', $type); $xmlResponse->addChild('code', $bookingDetail['booking_code']); $xmlResponse->addChild('time_zone', 'UTC'); if (in_array($type, ['Modify', 'Cancel'])) { $xmlResponse->addChild('date', Carbon::createFromTimestamp($param['booking_detail']['updated_at'], 'UTC')->toDateTimeString()); } else { $xmlResponse->addChild('date', Carbon::createFromTimestamp($param['booking_detail']['created_at'], 'UTC')->toDateTimeString()); } //$xmlResponse->addChild('name', $bookingDetail['booking_contact']['nameSurname']); $xmlResponse->addChild('name', ''); $xmlResponse->addChild('mail', $bookingDetail['booking_contact']['email']); $xmlResponse->addChild('address'); $xmlResponse->addChild('city'); $firstRoom = reset($bookingDetail['booking_room']); $firstPax = reset($firstRoom['room_pax']); $xmlResponse->addChild('country', $firstPax['pax_country']['name']); $xmlResponse->addChild('telephone', $bookingDetail['booking_contact']['phoneFormatted']); $xmlResponse->addChild('property_id', $bookingDetail['property_id']); $totalAdultCount = 0; $totalChildrenCount = 0; $roomSearchOccupancy = json_decode($bookingDetail['rooms'], 1); foreach ($roomSearchOccupancy as $roomOccupancy) { $totalAdultCount += $roomOccupancy['adults']; $totalChildrenCount += $roomOccupancy['children']; } $xmlResponse->addChild('adult_count', $totalAdultCount); $xmlResponse->addChild('child_count', $totalChildrenCount); $xmlResponse->addChild('total_cost', $bookingDetail['total']); $xmlResponse->addChild('currency', $bookingDetail['currency_code']); if (!empty($bookingDetail['booking_contact']['note'])) { $xmlResponse->addChild('remark', ''); } else { $xmlResponse->addChild('remark', $bookingDetail['booking_contact']['note']); } $xmlResponse->addChild('arrival_date', $bookingDetail['checkin_date']); $xmlResponse->addChild('departure_date', $bookingDetail['checkout_date']); $xmlResponse->addChild('card');//Credit Card $rooms = $xmlResponse->addChild('rooms'); foreach ($bookingDetail['booking_room'] as $roomKey => $roomDetail) { $room = $rooms->addChild('room'); $roomStatusType = isset($this->roomStatusTypeMapping[$roomDetail['status']]) ? $this->roomStatusTypeMapping[$roomDetail['status']] : 1; if (in_array($type, ['Modify']) && $roomDetail['status'] == 1) { $roomStatusType = $type; } if (in_array($type, ['Cancel'])) { $roomStatusType = $type; } $room->addChild('room_id', $roomDetail['room_id']); $room->addChild('rate_id', $roomDetail['room_rate_mapping_id']); $room->addChild('code', $roomDetail['room_id'] . ':' . $roomDetail['room_rate_mapping_id']); $isNonRefundable = false; $cancellationPolicy = json_decode($roomDetail['cancellation_policy'], 1); if (!empty($cancellationPolicy)) { if (isset($cancellationPolicy['isNonRefundable']) && $cancellationPolicy['isNonRefundable'] == 1) { $isNonRefundable = true; } } if ($isNonRefundable) { $roomName = $roomDetail['room_name'] . ' - ' . $roomDetail['room_rate_name'].' - NonRefundable'; } else { $roomName = $roomDetail['room_name'] . ' - ' . $roomDetail['room_rate_name']; } $room->addChild('name', ''); $roomPaxCollect = collect($roomDetail['room_pax']); $room->addChild('adult_count', $roomPaxCollect->where('type', 'ADT')->count()); $room->addChild('child_count', $roomPaxCollect->where('type', 'CHD')->count()); $childAges = isset($roomSearchOccupancy[$roomKey]) && $roomSearchOccupancy[$roomKey]['children'] > 0 ? '[' . implode(',', $roomSearchOccupancy[$roomKey]['age']) . ']' : null; $room->addChild('child_ages', $childAges); $room->addChild('arrival_date', $roomDetail['checkin_date']); $room->addChild('departure_date', $roomDetail['checkout_date']); $room->addChild('total_cost', $roomDetail['total']); $room->addChild('status', $roomStatusType); $room->addChild('non_refundable', $isNonRefundable); $dailyPrices = $room->addChild('daily_prices'); $diffInDays = Carbon::parse($roomDetail['checkin_date'])->diffInDays(Carbon::parse($roomDetail['checkout_date'])); $baseRateDaily = moneyDoubleFormatDecimal($roomDetail['total'] / $diffInDays); $currentDate = $roomDetail['checkin_date']; for ($i = 0; $i < $diffInDays; $i++) { $dailyPrice = $dailyPrices->addChild('daily_price'); $dailyPrice->addChild('date', $currentDate); $dailyPrice->addChild('price', $baseRateDaily); $currentDate = Carbon::parse($currentDate)->addDay()->toDateString(); } } //Log::debug($xmlResponse->asXML()); //dd(html_entity_decode($xmlResponse->asXML())); return html_entity_decode($xmlResponse->asXML()); } public function requestPostReservationPush($xmlPayload) { $response = ['status' => false, 'message' => '']; $propertyId = null; $xmlPayloadData = simplexml_load_string($xmlPayload); $xmlPayloadData = json_decode(json_encode($xmlPayloadData), 1); try { $this->restClient = new Client(['http_errors' => false]); $res = $this->restClient->post($this->reservationPushUrl . '/' . $xmlPayloadData['property_id'], [ 'headers' => [ 'Content-Type' => 'text/xml; charset=UTF8', //'Authorization' => 'Basic dUV4dHJhbmV0V29yazpFeHRybnRXcmsyMSEqMjI=', 'Accept' => 'text/xml' ], 'body' => $xmlPayload, ] ); $getResponseBody = $res->getBody(); $getResponseXmlBase = $getResponseBody->getContents(); $getResponseXml = new \SimpleXMLElement($getResponseXmlBase, LIBXML_NOCDATA); $getResponse = json_decode(json_encode($getResponseXml), 1); //Log::debug($xmlPayload); //Log::debug($getResponse); if ($getResponse['status'] != 0) { throw new ApiErrorException($getResponse['message']); } $response = ['status' => true, 'message' => '', 'response' => $getResponseXmlBase]; } 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; } }