restClient = $restClient; $this->mailer = $mailer; $this->reservationPushUrl = 'https://book-api.hyperguest.com'; $this->bearerToken = '63d51938dc3749788ac3e88ea6d58950'; $this->channelManagerId = 10; $this->channelManagerName = 'HyperGuest'; $this->bookingService = $bookingService; $this->channelManagerPropertyMappingService = $channelManagerPropertyMappingService; $this->channelManagerMappingService = $channelManagerMappingService; $this->propertyChannelService = $propertyChannelService; $this->propertyChannelMappingService = $propertyChannelMappingService; $this->propertyRoomRateChannelMappingService = $propertyRoomRateChannelMappingService; $this->paymentTypeMapping = [ 'CRD' => 'bank_transfer', 'HTL' => 'external' ]; } public function requestPost($method, $xmlPayload) { $response = ['status' => false, 'message' => '']; try { $this->restClient = new Client(['http_errors' => false]); $parameter = [ 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $this->bearerToken ] ]; if (!empty($jsonPayload)) { $parameter['body'] = $jsonPayload; } $request = $this->restClient->request('POST', $this->url . $method, $parameter); $getResponseBody = $request->getBody(); $getResponse = $getResponseBody->getContents(); $getResponse = json_decode($getResponse, 1); if ($request->getStatusCode() != 200) { $errors = singleElementArray($getResponse['errors']); $firstError = reset($errors); throw new ApiErrorException($firstError['code'] . ': ' . $firstError['title']); } $response = ["status" => true, 'message' => '', "data" => fillOnUndefined($getResponse, '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 requestPostReservationPushParam($propertyId, $bookingId, $type, $param = []) { $jsonResponse = null; try { $bookingDetail = $param['booking_detail']; $requestParam = [ 'criteria' => [ ['field' => 'status', 'condition' => '=', 'value' => 1], ['field' => 'property_id', 'condition' => '=', 'value' => $propertyId], ['field' => 'channel_manager_id', 'condition' => '=', 'value' => $this->channelManagerId], ], 'with' => ['channelManagerRoomRate.propertyRoomRateMapping'], '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']; $jsonResponse = []; $jsonResponse['dates']['from'] = $bookingDetail['checkin_date']; $jsonResponse['dates']['to'] = $bookingDetail['checkout_date']; $jsonResponse['propertyId'] = $channelManagerPropertyMapping['channel_manager_property_id']; //$jsonResponse['reservation']['code'] = $bookingDetail['booking_code']; //$jsonResponse['reservation']['status'] = $type; //$jsonResponse['reservation']['time'] = Carbon::createFromTimestamp($param['booking_detail']['created_at'])->toDateTimeString(); $jsonResponse['leadGuest']['birthDate'] = '1980-01-01'; $jsonResponse['leadGuest']['contact']['address'] = 'N/A'; $jsonResponse['leadGuest']['contact']['city'] = 'N/A'; $jsonResponse['leadGuest']['contact']['country'] = !empty($bookingDetail['booking_contact']['country_code']) ? $bookingDetail['booking_contact']['country_code'] : 'TR'; $jsonResponse['leadGuest']['contact']['email'] = $bookingDetail['booking_contact']['email']; $jsonResponse['leadGuest']['contact']['phone'] = $bookingDetail['booking_contact']['phoneFormatted']; $jsonResponse['leadGuest']['contact']['state'] = 'N/A'; $jsonResponse['leadGuest']['contact']['zip'] = 'N/A'; $jsonResponse['leadGuest']['name']['first'] = $bookingDetail['booking_contact']['name']; $jsonResponse['leadGuest']['name']['last'] = $bookingDetail['booking_contact']['surname']; $jsonResponse['leadGuest']['title'] = 'Mr'; $jsonResponse['reference']['agency'] = $bookingDetail['booking_code'];//'Extranetwork'; $jsonResponse['paymentDetails']['type'] = isset($this->paymentTypeMapping[$bookingDetail['payment_type_code']]) ? $this->paymentTypeMapping[$bookingDetail['payment_type_code']] : $this->paymentTypeMapping['HTL']; //$jsonResponse['paymentDetails']['details']['number'] = null; //$jsonResponse['paymentDetails']['details']['cvv'] = null; //$jsonResponse['paymentDetails']['details']['expiry']['month'] = null; //$jsonResponse['paymentDetails']['details']['name']['first'] = null; //$jsonResponse['paymentDetails']['details']['name']['last'] = null; $jsonResponse['rooms'] = []; $roomKey = 0; foreach ($bookingDetail['booking_room'] as $roomKey => $roomDetail) { /*$occupancy = occupancyCodeParser($roomDetail['occupancy_code']); $diffInDays = Carbon::parse($roomDetail['checkin_date'])->diffInDays(Carbon::parse($roomDetail['checkout_date'])); */ $roomPax = []; foreach ($roomDetail['room_pax'] as $pax) { $roomPax[] = [ 'birthDate' => $pax['birth_date'], /*'contact' => [ 'address' => null, 'city' => null, 'country' => $pax['citizen'], 'email' => null, 'phone' => null, 'state' => null, 'zip' => null, ],*/ 'name' => [ 'first' => $pax['name'], 'last' => $pax['surname'], ], //'title' => null ]; } $channelRoom = collect($channelManagerPropertyMapping['channel_manager_room_rate'])->where('property_room_rate_mapping.room_id', $roomDetail['room_id'])->first(); $channelRoomRate = collect($channelManagerPropertyMapping['channel_manager_room_rate'])->where('property_room_rate_mapping_id', $roomDetail['room_rate_mapping_id'])->first(); $jsonResponse['rooms'][$roomKey] = [ 'roomCode' => $channelRoom['channel_manager_room_id'], 'rateCode' => $channelRoomRate['channel_manager_room_rate_id'], 'expectedPrice' => [ 'amount' => $roomDetail['total'], 'currency' => $roomDetail['currency_code'], ], 'guests' => $roomPax, 'specialRequests' => [ $roomDetail['room_name'], $roomDetail['room_rate_name'], ] ]; } $metaNotes = []; $metaNotes[] = [ 'key' => 'Source', 'value' => 'Extranetwork', ]; $metaNotes[] = [ 'key' => 'BookingId', 'value' => $bookingDetail['id'], ]; $metaNotes[] = [ 'key' => 'BookingCode', 'value' => $bookingDetail['booking_code'], ]; $metaNotes[] = [ 'key' => 'ChannelBookingCode', 'value' => !empty($bookingDetail['channel_booking_code']) ? $bookingDetail['channel_booking_code'] : false, ]; $metaNotes[] = [ 'key' => 'Channel', 'value' => $bookingDetail['booking_channel']['name'], ]; $metaNotes[] = [ 'key' => 'Payment', 'value' => $bookingDetail['booking_payment_type']['code'] . ': ' . $bookingDetail['booking_payment_type']['name'], ]; $metaNotes[] = [ 'key' => 'Status', 'value' => $bookingDetail['booking_status']['name'], ]; if (!empty($bookingDetail['booking_contact']['note'])) { $metaNotes[] = [ 'key' => 'Note', 'value' => $bookingDetail['booking_contact']['note'], ]; } $jsonResponse['meta'] = $metaNotes; $jsonResponse['isTest'] = (App::environment() == 'production') ? false : true; $jsonResponse['groupBooking'] = false; return json_encode($jsonResponse); } catch (ApiErrorException | Exception $e) { $jsonResponse = null; $message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage(); Log::error($message); } return $jsonResponse; } public function requestPostReservationPush($jsonPayload) { $response = ['status' => false, 'message' => '']; $jsonPayloadArray = json_decode($jsonPayload, 1); $status = collect($jsonPayloadArray['meta'])->where('key', 'Status')->pluck('value')->first(); $bookingId = collect($jsonPayloadArray['meta'])->where('key', 'BookingId')->pluck('value')->first(); $bookingCode = collect($jsonPayloadArray['meta'])->where('key', 'BookingCode')->pluck('value')->first(); $channelBookingCode = collect($jsonPayloadArray['meta'])->where('key', 'ChannelBookingCode')->pluck('value')->first(); if ($status == 'Booking') { $method = '/2.0/booking/create'; } elseif ($status == 'Cancel/Refund') { $method = '/2.0/booking/cancel'; } if ($status == 'Cancel/Refund') { $jsonResponse = [ 'bookingId' => $channelBookingCode, 'reason' => 'N/A', 'simulation' => false, ]; $jsonPayload = json_encode($jsonResponse); } try { $this->restClient = new Client(['http_errors' => false]); $parameter = [ 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $this->bearerToken ] ]; //$jsonPayload = '{"dates":{"from":"2024-08-30","to":"2024-08-31"},"propertyId":"90365","leadGuest":{"birthDate":"1980-01-01","contact":{"address":false,"city":false,"country":"TR","email":"cem@test.com","phone":"+4932121321","state":false,"zip":false},"name":{"first":"cem","last":"test"},"title":"Mr"},"reference":{"agency":"BKG240730-5VI02ISW"},"paymentDetails":{"type":"external"},"rooms":[{"roomCode":"DBL","rateCode":"BB","expectedPrice":{"amount":200.75,"currency":"EUR"},"guests":[{"birthDate":"1988-07-20","name":{"first":"dsada","last":"sadsa"}},{"birthDate":"1988-07-24","name":{"first":"sad","last":"sadfds"}}],"specialRequests":["Standart Room With Sea View","Bed and Breakfast"]}],"meta":[{"key":"Source","value":"Extranetwork"},{"key":"BookingId","value":46502},{"key":"BookingCode","value":"BKG240730-5VI02ISW"},{"key":"ChannelBookingCode","value":false},{"key":"Channel","value":"Web Booking Engine"},{"key":"Payment","value":"HTL: Pay at Hotel"},{"key":"Status","value":"Booking"},{"key":"Note","value":"asdasd"}],"isTest":true,"groupBooking":false}'; if (!empty($jsonPayload)) { $parameter['body'] = $jsonPayload; } $request = $this->restClient->request('POST', $this->reservationPushUrl . $method, $parameter); $getResponseBody = $request->getBody(); $getResponse = $getResponseBody->getContents(); $getResponse = json_decode($getResponse, 1); //dd(json_encode($getResponse)); //Log::debug($method); //Log::debug($parameter); //Log::debug(json_encode($getResponse)); //Log::debug($request->getStatusCode()); if ($request->getStatusCode() != 200) { if (isset($getResponse['error'])) { if (is_array($getResponse['errorDetails']) && !empty($getResponse['errorDetails'])) { $errors = $getResponse['errorDetails']; $firstError = reset($errors); throw new ApiErrorException($firstError['message']); } elseif (!empty($getResponse['errorDetails'])) { throw new ApiErrorException($getResponse['errorDetails']); } else { throw new ApiErrorException($getResponse['error']); } } else { $errors = singleElementArray($getResponse); $firstError = reset($errors); throw new ApiErrorException($firstError['errorCode'] . ': ' . $firstError['errorDetails']); } } if ($status == 'Booking') { $channelBookingCodeUpdate = $this->bookingService->update($bookingId, ['channel_booking_code' => $getResponse['content']['bookingId']]); } $response = ['status' => true, 'message' => '', 'response' => json_encode($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 reservationListParam($propertyId) { $response = ['status' => false, 'message' => null]; return $response; } public function reservationList($propertyId) { $response = ['status' => false, 'message' => null]; return $response; } public function roomAvailabilityPush($propertyId) { $response = ['status' => false, 'message' => null]; return $response; } }