Files
ExtraNetwork e5c4b6aa13 first commit
2026-05-12 17:04:54 +03:00

285 lines
10 KiB
PHP

<?php
namespace App\Core\Service\ChannelManager;
use App\Core\Mail\LogMail;
use App\Core\Service\ChannelManagerMappingService;
use App\Core\Service\ChannelManagerPropertyMappingService;
use App\Exceptions\ApiErrorException;
use Carbon\Carbon;
use GuzzleHttp\Client;
use Illuminate\Mail\Mailer;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Log;
use Exception;
class HotelRunner
{
private $statusMapping;
private $paymentTypeMapping;
private $channelManagerId;
private $channelManagerName;
private $mailer;
public function __construct(
Client $restClient,
Mailer $mailer,
ChannelManagerPropertyMappingService $channelManagerPropertyMappingService,
ChannelManagerMappingService $channelManagerMappingService
)
{
$this->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('<?xml version="1.0" encoding="UTF-8"?><reservation></reservation>');
$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', '<![CDATA[' . htmlentities($bookingDetail['booking_contact']['nameSurname']) . ']]>');
$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', '<![CDATA[' . htmlentities($bookingDetail['booking_contact']['note']) . ']]>');
} 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', '<![CDATA[' . htmlentities($roomName) . ']]>');
$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;
}
}