mailer = $mailer; $this->channelManagerMappingService = $channelManagerMappingService; $this->channelManagerPropertyMappingService = $channelManagerPropertyMappingService; $this->bookingService = $bookingService; $this->bookingContactService = $bookingContactService; $this->bookingRoomService = $bookingRoomService; $this->bookingPaymentService = $bookingPaymentService; $this->propertyRoomAvailabilityService = $propertyRoomAvailabilityService; $this->newBookingMailService = $newBookingMailService; $this->channelManagerService = $channelManagerService; $this->channelManagerBookingService = $channelManagerBookingService; } public function getDateByDay($dates = []) { $dateByDay = []; $diffInDays = Carbon::parse($dates['checkIn'])->floatDiffInDays(Carbon::parse($dates['checkOut'])); for ($i = 0; $i < $diffInDays; $i++) { $dateByDay[] = Carbon::parse($dates['checkIn'])->addDay($i)->format('Y-m-d'); } return $dateByDay; } public function createBooking($channelCode, $param) { $response = ['status' => false, 'message' => '']; DB::beginTransaction(); try { $channelService = App::make("App\Core\Service\ChannelManager\\{$channelCode}"); $bookingCode = getCodeGenerate('BKG'); $param['booking']['booking_code'] = $bookingCode; $param['booking']['extra_param'] = json_encode($param['channel_manager']); $bookingCreate = $this->bookingService->create($param['booking']); //$bookingCreate['status'] = 'success';//TODO: Delete //$bookingCreate['data']['id'] = 1106; if ($bookingCreate['status'] != 'success') { throw new ApiErrorException('Booking could not be made, Reservation: ' . $param['booking']['search_key']); } $param['booking']['id'] = $bookingCreate['data']['id']; //INSERT CONTACT DATA $bookingContactCreateParam = [ 'booking_id' => $bookingCreate['data']['id'], 'name' => $param['contact']['name'], 'surname' => $param['contact']['surname'], 'phone_code' => $param['contact']['phone_code'], 'phone_number' => $param['contact']['phone_number'], 'email' => $param['contact']['email'], 'country_code' => fillOnUndefined($param['contact'], 'country_code'), 'note' => !empty($param['contact']['note']) ? $param['contact']['note'] : null, 'language_code' => fillOnUndefined($param['contact'], 'language', 'en'), 'extra_param' => fillOnUndefined($param['contact'], 'extra_param'), 'status' => 1 ]; $bookingContactCreate = $this->bookingContactService->create($bookingContactCreateParam); //$bookingContactCreate['status'] = 'success'; if ($bookingContactCreate['status'] != 'success') { throw new ApiErrorException('Booking Contact could not be made'); } //INSERT ROOM DATA foreach ($param['room'] as $roomOrder => $room) { $bookingRoomCreateParam = [ 'booking_id' => $bookingCreate['data']['id'], 'room_order_number' => ($roomOrder + 1), 'occupancy_code' => $room['occupancy_code'], 'checkin_date' => $room['checkin_date'], //$room['checkin'], 'checkout_date' => $room['checkout_date'],//$room['checkout'], 'rate_key' => fillOnUndefined($room, 'rate_key'), 'rate_key_code' => fillOnUndefined($room, 'rate_key_code'), 'availability_id' => 1, 'availability_code' => 'ROM', 'room_id' => $room['room_id'], 'room_name' => $room['room_name'], 'room_rate_mapping_id' => $room['room_rate_mapping_id'], 'room_rate_name' => $room['room_rate_name'], 'cancellation_policy' => fillOnUndefined($room, 'cancellation_policy'), 'payment_type_code' => fillOnUndefined($room, 'payment_type_code', 'CHN'), 'daily_amount' => fillOnUndefined($room, 'daily_amount'), 'extra_param' => fillOnUndefined($room, 'extra_param'), 'rate_detail' => fillOnUndefined($room, 'rate_detail'), 'total' => $room['total'], 'currency_code' => $room['currency_code'], 'status' => fillOnUndefined($room, 'status', 1), ]; $bookingRoomCreate = $this->bookingRoomService->create($bookingRoomCreateParam); //$bookingRoomCreate['status'] = 'success'; if ($bookingRoomCreate['status'] != 'success') { throw new ApiErrorException('Booking Room could not be made'); } /* ROOM AVAILABILITY */ $dateByDay = []; $dateByDay = $this->getDateByDay(['checkIn' => $room['checkin_date'], 'checkOut' => $room['checkout_date']]); foreach ($dateByDay as $day) { $requestParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $param['booking']['property_id']], ['field' => 'property_room_id', 'condition' => '=', 'value' => $room['room_id']], ['field' => 'availability_type_id', 'condition' => '=', 'value' => 1], ['field' => 'date', 'condition' => '=', 'value' => $day] ], ]; $getPropertyRoomAndRoomRateAvailability = $this->propertyRoomAvailabilityService->select($requestParam); if ($getPropertyRoomAndRoomRateAvailability['status'] != 'success') { throw new ApiErrorException('getPropertyRoomAndRoomRateAvailability Empty'); } foreach ($getPropertyRoomAndRoomRateAvailability['data'] as $roomAvailability) { $roomAvailabilityUpdated = $roomAvailability['availability'] <= 0 ? 0 : ($roomAvailability['availability'] - 1); $this->propertyRoomAvailabilityService->update($roomAvailability['id'], ['availability' => $roomAvailabilityUpdated]); } } /* ROOM AVAILABILITY */ } //INSERT PAYMENT DATA $bookingPaymentCreateParam = [ 'booking_id' => $bookingCreate['data']['id'], 'payment_code' => fillOnUndefined($param['payment'], 'payment_code'), 'payment_type_code' => fillOnUndefined($param['payment'], 'payment_type_code'),//Type: CHN 'payment_source_code' => fillOnUndefined($param['payment'], 'payment_source_code'), 'extra_param' => fillOnUndefined($param['payment'], 'extra_param'), 'total' => fillOnUndefined($param['payment'], 'total'), 'currency_code' => fillOnUndefined($param['payment'], 'currency_code'), 'status' => fillOnUndefined($param['payment'], 'status'),//Type: 2 ]; $bookingPaymentCreate = $this->bookingPaymentService->create($bookingPaymentCreateParam); //$bookingPaymentCreate['status'] = 'success'; if ($bookingPaymentCreate['status'] != 'success') { throw new ApiErrorException('Booking Payment could not be made'); } //INSERT PAYMENT DATA //INSERT CHANNEL PAYMENT DATA if (isset($param['payment_channel']) && !empty($param['payment_channel'])) { $bookingPaymentDataCreateParam = [ 'booking_id' => $bookingCreate['data']['id'], 'type' => fillOnUndefined($param['payment_channel'], 'type'), 'data' => fillOnUndefined($param['payment_channel'], 'data'), 'status' => fillOnUndefined($param['payment_channel'], 'status', 1), ]; $bookingPaymentDataCreate = $this->bookingPaymentService->createPaymentData($bookingPaymentDataCreateParam); if ($bookingPaymentDataCreate['status'] != 'success') { throw new ApiErrorException('Booking Channel Payment could not be made'); } } //INSERT CHANNEL PAYMENT DATA $reservationConfirmParam = $channelService->reservationConfirmParam($param['channel_manager']['property_id'], $param['channel_manager']['booking_id'], $bookingCode, $param); $reservationConfirm = $channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } //PUSH CHANNEL MANAGER QUEUE /* 538 Euphoria Hotel Batumi 541 Intourist Palace Hotel & SPA 545 Metro Sky Tower Hotel 546 Legend Hotel Batumi Convention Center & Spa 548 Legend Business Hotel Batumi 549 Euphoria Apartments 550 City Hotel Batumi */ /*if (in_array($bookingCreate['data']['property_id'], [546])) { $channelManagerBookingParam = [ 'property_id' => $bookingCreate['data']['property_id'], 'booking_id' => $bookingCreate['data']['id'], 'channel_manager_id' => $bookingCreate['data']['channel_manager_id'], 'type' => 'Booking', ]; $this->channelManagerBookingService->create($channelManagerBookingParam); }*/ $channelManagerPropertyMappingCriteria = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $bookingCreate['data']['property_id']], ['field' => 'channel_manager_property_id', 'condition' => '=', 'value' => null], ['field' => 'status', 'condition' => '=', 'value' => 1], ] ]; $channelManagerPropertyMapping = $this->channelManagerPropertyMappingService->select($channelManagerPropertyMappingCriteria); if ($channelManagerPropertyMapping['status'] == 'success' && !empty($channelManagerPropertyMapping['data'])) { foreach ($channelManagerPropertyMapping['data'] as $channelPropertyData) { if(in_array($channelPropertyData['channel_manager_id'],[11,13])) { continue; } $channelManagerBookingCreateParam = [ 'property_id' => $bookingCreate['data']['property_id'], 'booking_id' => $bookingCreate['data']['id'], 'channel_manager_id' => $channelPropertyData['channel_manager_id'], 'type' => 'Booking', ]; $channelManagerBookingCreate = $this->channelManagerBookingService->create($channelManagerBookingCreateParam); } } //PUSH CHANNEL MANAGER QUEUE DB::commit(); $mailParams = ['booking_id' => $bookingCreate['data']['id']]; $this->newBookingMailService->process($mailParams); $response['status'] = true; $response['data'] = $param; } 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']) { DB::rollBack(); } return $response; } public function modifiedBooking($channelCode, $param) { $response = ['status' => false, 'message' => '']; DB::beginTransaction(); try { $channelService = App::make("App\Core\Service\ChannelManager\\{$channelCode}"); $bookingCode = null; $bookingDetailParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $param['booking']['property_id']], ['field' => 'search_key', 'condition' => '=', 'value' => $param['booking']['search_key']], //['field' => 'channel_manager_id', 'condition' => '=', 'value' => $param['booking']['channel_manager_id']], ], 'with' => ['bookingRoom', 'bookingContact', 'bookingChannel', 'bookingPayment'], 'firstRow' => true ]; $bookingDetail = $this->bookingService->select($bookingDetailParam); if ($bookingDetail['status'] != 'success') { throw new ApiErrorException(lang('Booking could not be found, Reservation: ' . $param['booking']['search_key'])); } if (!empty($bookingDetail['data'])) { $bookingCode = $bookingDetail['data']['booking_code']; $param['booking']['id'] = $bookingDetail['data']['id']; $param['booking']['booking_code'] = $bookingDetail['data']['booking_code']; $bookingUpdateParam = [ 'channel_booking_code' => fillOnUndefined($param['booking'], 'channel_booking_code'), 'search_key' => $param['booking']['search_key'], 'checkin_date' => $param['booking']['checkin_date'], 'checkout_date' => $param['booking']['checkout_date'], 'payment_type_code' => $param['booking']['payment_type_code'], 'total' => $param['booking']['total'], 'currency_code' => $param['booking']['currency_code'], ]; $bookingUpdate = $this->bookingService->update($bookingDetail['data']['id'], $bookingUpdateParam); $bookingContactUpdateParam = [ 'name' => $param['contact']['name'], 'surname' => $param['contact']['surname'], 'phone_code' => $param['contact']['phone_code'], 'phone_number' => $param['contact']['phone_number'], 'email' => $param['contact']['email'], 'country_code' => !empty($param['contact']['country_code']) ? $param['contact']['country_code'] : null, 'note' => !empty($param['contact']['note']) ? $param['contact']['note'] : null, 'language_code' => fillOnUndefined($param['contact'], 'language_code', 'en') ]; $bookingContactUpdate = $this->bookingContactService->update($bookingDetail['data']['booking_contact']['id'], $bookingContactUpdateParam); foreach ($bookingDetail['data']['booking_room'] as $roomOrder => $room) { foreach ($param['room'] as $roomOrderChannel => $roomChannel) { if ($roomOrder == $roomOrderChannel) { $bookingRoomUpdateParam = [ 'occupancy_code' => $roomChannel['occupancy_code'], 'checkin_date' => $roomChannel['checkin_date'], 'checkout_date' => $roomChannel['checkout_date'], 'room_id' => $roomChannel['room_id'], 'room_name' => $roomChannel['room_name'], 'room_rate_mapping_id' => $roomChannel['room_rate_mapping_id'], 'room_rate_name' => $roomChannel['room_rate_name'], 'rate_detail' => json_encode($roomChannel), 'total' => $roomChannel['total'], 'currency_code' => $roomChannel['currency_code'], 'daily_amount' => fillOnUndefined($roomChannel, 'daily_amount'), ]; $bookingRoomUpdate = $this->bookingRoomService->update($room['id'], $bookingRoomUpdateParam); /* ROOM AVAILABILITY */ //Eğer odaya ait tarihler farklı ise buraya gelecek. if (($room['checkin_date'] != $roomChannel['checkin_date']) || ($room['checkout_date'] != $roomChannel['checkout_date'])) { $dateByDay = []; $dateByDay['update'] = []; $dateByDay['current'] = $this->getDateByDay(['checkIn' => $room['checkin_date'], 'checkOut' => $room['checkout_date']]); $dateByDay['modified'] = $this->getDateByDay(['checkIn' => $roomChannel['checkin_date'], 'checkOut' => $roomChannel['checkout_date']]); foreach ($dateByDay['current'] as $date) { $dateByDay['update'][$date] = !isset($dateByDay['update'][$date]) ? 0 : $dateByDay['update'][$date]; $dateByDay['update'][$date]++; } foreach ($dateByDay['modified'] as $date) { $dateByDay['update'][$date] = !isset($dateByDay['update'][$date]) ? 0 : $dateByDay['update'][$date]; $dateByDay['update'][$date]--; } ksort($dateByDay['update']); foreach ($dateByDay['update'] as $day => $availabilityModified) { $requestParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $param['booking']['property_id']], ['field' => 'property_room_id', 'condition' => '=', 'value' => $room['room_id']], ['field' => 'availability_type_id', 'condition' => '=', 'value' => 1], ['field' => 'date', 'condition' => '=', 'value' => $day] ], ]; $getPropertyRoomAndRoomRateAvailability = $this->propertyRoomAvailabilityService->select($requestParam); if ($getPropertyRoomAndRoomRateAvailability['status'] != 'success') { throw new ApiErrorException('getPropertyRoomAndRoomRateAvailability Empty'); } foreach ($getPropertyRoomAndRoomRateAvailability['data'] as $roomAvailability) { $roomAvailabilityUpdated = 0; $roomAvailabilityUpdated = $roomAvailability['availability'] + $availabilityModified; if($roomAvailabilityUpdated < 0) { $roomAvailabilityUpdated = 0; } $this->propertyRoomAvailabilityService->update($roomAvailability['id'], ['availability' => $roomAvailabilityUpdated]); } } } /* ROOM AVAILABILITY */ } } } //Added New Room Case if (count($bookingDetail['data']['booking_room']) != count($param['room']) && count($param['room']) > count($bookingDetail['data']['booking_room']) ) { foreach ($param['room'] as $roomOrderChannel => $roomChannel) { foreach ($bookingDetail['data']['booking_room'] as $roomOrder => $room) { if ($roomOrder != $roomOrderChannel) { $bookingRoomCreateParam = [ 'booking_id' => $bookingDetail['data']['id'], 'room_order_number' => ($roomOrderChannel + 1), 'occupancy_code' => $roomChannel['occupancy_code'], 'checkin_date' => $roomChannel['checkin_date'], //$room['checkin'], 'checkout_date' => $roomChannel['checkout_date'],//$room['checkout'], 'rate_key' => fillOnUndefined($roomChannel, 'rate_key'), 'rate_key_code' => fillOnUndefined($roomChannel, 'rate_key_code'), 'availability_id' => 1, 'availability_code' => 'ROM', 'room_id' => $roomChannel['room_id'], 'room_name' => $roomChannel['room_name'], 'room_rate_mapping_id' => $roomChannel['room_rate_mapping_id'], 'room_rate_name' => $roomChannel['room_rate_name'], 'cancellation_policy' => fillOnUndefined($roomChannel, 'cancellation_policy'), 'payment_type_code' => fillOnUndefined($roomChannel, 'payment_type_code', 'CHN'), 'daily_amount' => fillOnUndefined($roomChannel, 'daily_amount'), 'extra_param' => fillOnUndefined($roomChannel, 'extra_param'), 'rate_detail' => fillOnUndefined($roomChannel, 'rate_detail'), 'total' => $roomChannel['total'], 'currency_code' => $roomChannel['currency_code'], 'status' => fillOnUndefined($roomChannel, 'status', 1), ]; $bookingRoomCreate = $this->bookingRoomService->create($bookingRoomCreateParam); } } } } //UPDATE PAYMENT DATA $bookingPaymentUpdateParam = [ 'payment_type_code' => fillOnUndefined($param['payment'], 'payment_type_code'), 'payment_source_code' => fillOnUndefined($param['payment'], 'payment_source_code'), 'extra_param' => fillOnUndefined($param['payment'], 'extra_param'), 'total' => fillOnUndefined($param['payment'], 'total'), 'currency_code' => fillOnUndefined($param['payment'], 'currency_code') ]; $bookingPaymentUpdate = $this->bookingPaymentService->update($bookingDetail['data']['booking_payment']['id'], $bookingPaymentUpdateParam); //UPDATE PAYMENT DATA //INSERT CHANNEL PAYMENT DATA if (isset($param['payment_channel']) && !empty($param['payment_channel'])) { $bookingPaymentDataCreateParam = [ 'booking_id' => $bookingDetail['data']['id'], 'type' => fillOnUndefined($param['payment_channel'], 'type'), 'data' => fillOnUndefined($param['payment_channel'], 'data'), 'status' => fillOnUndefined($param['payment_channel'], 'status', 1), ]; $bookingPaymentDataCreate = $this->bookingPaymentService->createPaymentData($bookingPaymentDataCreateParam); if ($bookingPaymentDataCreate['status'] != 'success') { throw new ApiErrorException('Booking Channel Payment could not be made'); } } //INSERT CHANNEL PAYMENT DATA } else { return $this->createBooking($channelCode, $param); } $bookingCode = is_null($bookingCode) ? 'ENW' . $param['booking']['search_key'] : $bookingCode; $reservationConfirmParam = $channelService->reservationConfirmParam($param['channel_manager']['property_id'], $param['channel_manager']['booking_id'], $bookingCode, $param); $reservationConfirm = $channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } $notificationModifiedToPropertyUser = [ 'booking_id' => $param['booking']['id'], ]; $this->mailer->onQueue('modifiedBookingMail', new ModifiedBookingMail($notificationModifiedToPropertyUser)); $response['status'] = true; $response['data'] = $param; } 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']) { //PUSH CHANNEL MANAGER QUEUE $channelManagerPropertyMappingCriteria = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $bookingDetail['data']['property_id']], ['field' => 'channel_manager_property_id', 'condition' => '=', 'value' => null], ['field' => 'status', 'condition' => '=', 'value' => 1], ] ]; $channelManagerPropertyMapping = $this->channelManagerPropertyMappingService->select($channelManagerPropertyMappingCriteria); if ($channelManagerPropertyMapping['status'] == 'success' && !empty($channelManagerPropertyMapping['data'])) { foreach ($channelManagerPropertyMapping['data'] as $channelPropertyData) { if(in_array($channelPropertyData['channel_manager_id'],[11,13])) { continue; } $channelManagerBookingCreateParam = [ 'property_id' => $bookingDetail['data']['property_id'], 'booking_id' => $bookingDetail['data']['id'], 'channel_manager_id' => $channelPropertyData['channel_manager_id'], 'type' => 'Modify', ]; $channelManagerBookingCreate = $this->channelManagerBookingService->create($channelManagerBookingCreateParam); } } //PUSH CHANNEL MANAGER QUEUE DB::commit(); } else { DB::rollBack(); } return $response; } public function cancelBooking($channelCode, $param) { $response = ['status' => false, 'message' => '']; DB::beginTransaction(); try { $channelService = App::make("App\Core\Service\ChannelManager\\{$channelCode}"); $bookingCode = null; $bookingDetailParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $param['booking']['property_id']], ['field' => 'search_key', 'condition' => '=', 'value' => $param['booking']['search_key']], //['field' => 'channel_manager_id', 'condition' => '=', 'value' => $param['booking']['channel_manager_id']], ], 'with' => ['bookingRoom', 'bookingContact', 'bookingChannel'], 'firstRow' => true ]; $bookingDetail = $this->bookingService->select($bookingDetailParam); if ($bookingDetail['status'] != 'success') { throw new ApiErrorException(lang('Booking could not be found, Reservation: ' . $param['booking']['search_key'])); } if (!empty($bookingDetail['data'])) { $bookingCode = $bookingDetail['data']['booking_code']; $param['booking']['id'] = $bookingDetail['data']['id']; $param['booking']['booking_code'] = $bookingDetail['data']['booking_code']; $this->bookingService->update($bookingDetail['data']['id'], ['status' => 0]); foreach ($bookingDetail['data']['booking_room'] as $roomOrder => $room) { $bookingRoomUpdate = $this->bookingRoomService->update($room['id'], ['status' => 0]); /* ROOM AVAILABILITY */ $dateByDay = []; $dateByDay = $this->getDateByDay(['checkIn' => $room['checkin_date'], 'checkOut' => $room['checkout_date']]); foreach ($dateByDay as $day) { $requestParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $param['booking']['property_id']], ['field' => 'property_room_id', 'condition' => '=', 'value' => $room['room_id']], ['field' => 'availability_type_id', 'condition' => '=', 'value' => 1], ['field' => 'date', 'condition' => '=', 'value' => $day] ], ]; $getPropertyRoomAndRoomRateAvailability = $this->propertyRoomAvailabilityService->select($requestParam); if ($getPropertyRoomAndRoomRateAvailability['status'] != 'success') { throw new ApiErrorException('getPropertyRoomAndRoomRateAvailability Empty'); } foreach ($getPropertyRoomAndRoomRateAvailability['data'] as $roomAvailability) { $roomAvailabilityUpdated = $roomAvailability['availability'] <= 0 ? 1 : ($roomAvailability['availability'] + 1); $this->propertyRoomAvailabilityService->update($roomAvailability['id'], ['availability' => $roomAvailabilityUpdated]); } } /* ROOM AVAILABILITY */ } } $bookingCode = is_null($bookingCode) ? 'ENW' . $param['booking']['search_key'] : $bookingCode; $reservationConfirmParam = $channelService->reservationConfirmParam($param['channel_manager']['property_id'], $param['channel_manager']['booking_id'], $bookingCode, $param); $reservationConfirm = $channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } $notificationCancelToPropertyUser = [ 'booking_id' => $param['booking']['id'], ]; $this->mailer->onQueue('cancelBookingMail', new CancelBookingMail($notificationCancelToPropertyUser)); $response['status'] = true; $response['data'] = $param; } 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']) { //PUSH CHANNEL MANAGER QUEUE $channelManagerPropertyMappingCriteria = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $bookingDetail['data']['property_id']], ['field' => 'channel_manager_property_id', 'condition' => '=', 'value' => null], ['field' => 'status', 'condition' => '=', 'value' => 1], ] ]; $channelManagerPropertyMapping = $this->channelManagerPropertyMappingService->select($channelManagerPropertyMappingCriteria); if ($channelManagerPropertyMapping['status'] == 'success' && !empty($channelManagerPropertyMapping['data'])) { foreach ($channelManagerPropertyMapping['data'] as $channelPropertyData) { if(in_array($channelPropertyData['channel_manager_id'],[11,13])) { continue; } $channelManagerBookingCreateParam = [ 'property_id' => $bookingDetail['data']['property_id'], 'booking_id' => $bookingDetail['data']['id'], 'channel_manager_id' => $channelPropertyData['channel_manager_id'], 'type' => 'Cancel', ]; $channelManagerBookingCreate = $this->channelManagerBookingService->create($channelManagerBookingCreateParam); } } //PUSH CHANNEL MANAGER QUEUE DB::commit(); } else { DB::rollBack(); } return $response; } public function handle() { try { $this->info(date('Y-m-d H:i:s') . ' : Start'); $channelManagerCriteria = [ 'criteria' => [ ['field' => 'status', 'condition' => '=', 'value' => 1], ], 'orderBy' => [ ['field' => 'id', 'value' => 'ASC'] ] ]; $channelManager = $this->channelManagerService->select($channelManagerCriteria); $channelManagerList = []; if ($channelManager['status'] == 'success' && !empty($channelManager['data'])) { $channelManagerList = $channelManager['data']; } //CHANNEL MANAGER foreach ($channelManagerList as $channelKey => $channel) { $this->info(date('Y-m-d H:i:s') . ' : Channel Start: ' . $channel['name']); if (!class_exists("App\Core\Service\ChannelManager\\{$channel['name']}")) { $this->error(date('Y-m-d H:i:s') . ' : Channel: ' . $channel['name'] . ' Class does not exist!'); continue; } $channelService = App::make("App\Core\Service\ChannelManager\\{$channel['name']}"); $channelManagerPropertyMappingCriteria = [ 'criteria' => [ ['field' => 'status', 'condition' => '=', 'value' => 1], ['field' => 'channel_manager_id', 'condition' => '=', 'value' => $channel['id']], ['field' => 'channel_manager_property_id', 'condition' => '!=', 'value' => null], ], 'with' => ['channelManagerRoomRate.propertyRoomRateMapping', 'property'], 'orderBy' => [ ['field' => 'property_id', 'value' => 'ASC'] ] ]; //TODO: Channex limited hotels if ($channel['id'] == 2) { $channexPullReservationPropertyIds = [71,313, /*538, 541, 545, 546, 548, 549, 550,*/ 672, 712, 785, 808, 790, 755, 901, 952, 912, 848, 1098, 1103, 1035]; $channelManagerPropertyMappingCriteria['whereIn'][] = ["field" => "property_id", "value" => $channexPullReservationPropertyIds]; } $channelManagerPropertyMapping = $this->channelManagerPropertyMappingService->select($channelManagerPropertyMappingCriteria); //Eğer kanala ait bir otel yok ise devam et if ($channelManagerPropertyMapping['status'] != 'success' || empty($channelManagerPropertyMapping['data'])) { continue; } if ($channelManagerPropertyMapping['status'] == 'success') { //CHANNEL MANAGER PROPERTY foreach ($channelManagerPropertyMapping['data'] as $propertyMapping) { //Property if (!in_array($propertyMapping['property']['id'],[623])) { //continue; } $this->info(date('Y-m-d H:i:s') . ' : Property: ' . $propertyMapping['property']['id'] . ' - ' . $propertyMapping['property']['name']); $reservationListParam = $channelService->reservationListParam($propertyMapping['channel_manager_property_id']); $reservationList = $channelService->reservationList($reservationListParam); //Eğer kanaldaki otele ait bir rezervasyon yok ise devam et if (!$reservationList['status']) { continue; } //CHANNEL MANAGER PROPERTY Reservation foreach ($reservationList['data'] as $reservationKey => $reservation) { $reservationPullFormatted = $channelService->reservationPullFormattedData($propertyMapping['property_id'], $propertyMapping['channel_manager_property_id'], $reservation); if (!$reservationPullFormatted['status']) { //Burada bi hata var demektir, mail atılsın ama sonraki işleme devam edilsin. //$logMessage $mailParams = [ 'title' => $channel['name'] . ' - ReservationPullService Error - reservationPullFormatted', 'logMessage' => '
' . print_r($reservationPullFormatted, true) . '' ]; $this->mailer->onQueue('logMail', new LogMail($mailParams)); //$logMessage $this->error(date('Y-m-d H:i:s') . ' : Property: ' . $propertyMapping['property']['id'] . ' - ' . $propertyMapping['property']['name'].' Error: reservationPullFormattedData'); continue; } //TODO: Eğer burada gelen kanal extranetwork ise alınmış gibi yapılıp diğer işleme geçilmeli if (in_array($reservationPullFormatted['data']['channel_manager']['sub_channel'], ['ExtranetWork'])) { $reservationConfirmParam = $channelService->reservationConfirmParam($reservationPullFormatted['data']['channel_manager']['property_id'], $reservationPullFormatted['data']['channel_manager']['booking_id'], 'ENW' . $reservationPullFormatted['data']['channel_manager']['booking_id'], $reservationPullFormatted['data']); $reservationConfirm = $channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } continue; } $reservationPull = ['status' => false, 'message' => '']; if ($reservationPullFormatted['type'] == 'createBooking') { $reservationPull = $this->createBooking($channel['name'], $reservationPullFormatted['data']); } elseif ($reservationPullFormatted['type'] == 'modifiedBooking') { //If the modified reservation is not found, first create a reservation. $bookingDetailParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $reservationPullFormatted['data']['booking']['property_id']], ['field' => 'search_key', 'condition' => '=', 'value' => $reservationPullFormatted['data']['booking']['search_key']], ], 'firstRow' => true ]; $bookingDetail = $this->bookingService->select($bookingDetailParam); if (empty($bookingDetail['data'])) { $reservationPull = $this->createBooking($channel['name'], $reservationPullFormatted['data']); } else { $reservationPull = $this->modifiedBooking($channel['name'], $reservationPullFormatted['data']); } } elseif ($reservationPullFormatted['type'] == 'cancelBooking') { $reservationPull = $this->cancelBooking($channel['name'], $reservationPullFormatted['data']); } if ($reservationPull['status']) { $this->info(date('Y-m-d H:i:s') . ' : Success ' . $reservationPullFormatted['type'] . ': ' . $reservationPull['data']['booking']['booking_code']); } else { //$logMessage $mailParams = [ 'title' => $channel['name'] . ' - ReservationPullService Error - Booking', 'logMessage' => '
' . print_r(array_merge($reservationPullFormatted, $reservationPull), true) . '' ]; $this->mailer->onQueue('logMail', new LogMail($mailParams)); //$logMessage $this->error(date('Y-m-d H:i:s') . ' : Error: ' . $reservationPull['message']); } } } } $this->info(PHP_EOL); } //dd($channelManagerList); $this->info(date('Y-m-d H:i:s') . ' : Finished'); } catch (ApiErrorException $e) { $this->error(date('Y-m-d H:i:s') . ' : Error: ' . $e->getMessage()); } catch (Exception $e) { $message = $e->getFile() . " " . $e->getLine() . " " . $e->getMessage(); Log::error($message); $this->error(date('Y-m-d H:i:s') . ' : Error: ' . $message); } } }