mailer = $mailer; $this->channelService = $channelService; $this->channelManagerMappingService = $channelManagerMappingService; $this->channelManagerPropertyMappingService = $channelManagerPropertyMappingService; $this->bookingService = $bookingService; $this->bookingContactService = $bookingContactService; $this->bookingRoomService = $bookingRoomService; $this->bookingPaymentService = $bookingPaymentService; $this->propertyRoomAvailabilityService = $propertyRoomAvailabilityService; $this->newBookingMailService = $newBookingMailService; } public function reservationListParam($channelManagerPropertyId) { $userId = Config::get('app.channelManager.reseliva.userId'); $userPSW = Config::get('app.channelManager.reseliva.userPassword'); $requestParam = new \SimpleXMLElement(''); $Authentication = $requestParam->addChild('Authentication'); $Authentication->addChild('UserID', $userId); $Authentication->addChild('UserPSW', $userPSW); $Authentication->addChild('PropertyID', $channelManagerPropertyId); return $requestParam->asXML(); } public function reservationConfirmParam($propertyId, $channelManagerBookingId, $bookingCode) { $userId = Config::get('app.channelManager.reseliva.userId'); $userPSW = Config::get('app.channelManager.reseliva.userPassword'); $requestParam = new \SimpleXMLElement(''); $Authentication = $requestParam->addChild('Authentication'); $Authentication->addChild('UserID', $userId); $Authentication->addChild('UserPSW', $userPSW); $Authentication->addChild('PropertyID', $propertyId); $reservations = $requestParam->addChild('reservations'); $reservation = $reservations->addChild('reservation'); $reservation->addAttribute('reseliva_id', $channelManagerBookingId); $reservation->addAttribute('pms_id', $bookingCode); return $requestParam->asXML(); } 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($param) { $response = ['status' => false, 'message' => '']; DB::beginTransaction(); try { $bookingCode = getCodeGenerate('BKG'); $bookingStatus = 1; $roomRequest = []; foreach ($param['room'] as $room) { $roomRequest[] = [ 'adults' => $room['totalpax'], 'children' => $room['totalchd'], 'age' => [] ]; } if (empty(fillOnUndefined($param, 'reservno_ota'))) { $param['reservno_ota'] = null; } $bookingCreateParam = [ 'property_id' => $param['property']['id'], 'channel_id' => $param['property']['channel_id'], 'booking_code' => $bookingCode, 'channel_booking_code' => fillOnUndefined($param, 'reservno_ota'), 'search_key' => $param['reservno'], 'checkin_date' => $param['checkinFormatted'], 'checkout_date' => $param['checkoutFormatted'], 'rooms' => json_encode($roomRequest), 'payment_type_code' => 'CHN', 'room_amount' => $param['paymenttotal'], 'addon_amount' => 0, 'discount_amount' => 0, 'total' => $param['paymenttotal'], 'currency_code' => $param['paymentcurr'], 'channel_token' => null, 'booking_engine_token' => null, 'reservation_time' => $param['restimeUnixFormatted'], 'status' => $param['status'] == 'A' ? 1 : 0 ]; $bookingCreate = $this->bookingService->create($bookingCreateParam); //$bookingCreate['status'] = 'success'; //$bookingCreate['data']['id'] = 52; if ($bookingCreate['status'] != 'success') { throw new ApiErrorException(lang('Booking could not be made, Reservation: ' . $param['reservno'])); } //INSERT CONTACT DATA $bookingContactCreateParam = [ 'booking_id' => $bookingCreate['data']['id'], 'name' => $param['firstname'], 'surname' => !empty($param['lastname']) ? $param['lastname'] : null, 'phone_code' => null, 'phone_number' => $param['tel'], 'email' => $param['email'], 'note' => !empty($param['note']) ? $param['note'] : null, 'language_code' => fillOnUndefined($param, 'language', 'en'), 'status' => 1 ]; $bookingContactCreate = $this->bookingContactService->create($bookingContactCreateParam); //$bookingContactCreate['status'] = 'success'; if ($bookingContactCreate['status'] != 'success') { throw new ApiErrorException(lang('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' => str_repeat('A', $room['totalpax']) . str_repeat('C', $room['totalchd']), 'checkin_date' => $param['checkinFormatted'], //$room['checkin'], 'checkout_date' => $param['checkoutFormatted'],//$room['checkout'], 'rate_key' => null, 'rate_key_code' => null, 'availability_id' => 1, 'availability_code' => 'ROM', 'room_id' => $room['property']['room_id'], 'room_name' => $room['roomtype'], 'room_rate_mapping_id' => $room['property']['room_rate_mapping_id'], 'room_rate_name' => $room['ratename'], 'cancellation_policy' => null, 'payment_type_code' => 'CHN', 'rate_detail' => json_encode($room), 'total' => $room['total_amount'], 'currency_code' => $param['paymentcurr'], 'status' => $param['status'] == 'A' ? 1 : 0 ]; $bookingRoomCreate = $this->bookingRoomService->create($bookingRoomCreateParam); //$bookingRoomCreate['status'] = 'success'; if ($bookingRoomCreate['status'] != 'success') { throw new ApiErrorException(lang('Booking Room could not be made')); } /* ROOM AVAILABILITY */ $dateByDay = []; $dateByDay = $this->getDateByDay(['checkIn' => $room['checkin'], 'checkOut' => $room['checkout']]); foreach ($dateByDay as $day) { $requestParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $param['property']['id']], ['field' => 'property_room_id', 'condition' => '=', 'value' => $room['property']['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' => (isset($param['cc_token']) && !empty($param['cc_token'])) ? fillOnUndefined($param, 'cc_token') : null, 'payment_type_code' => 'CHN', 'total' => $param['paymenttotal'], 'currency_code' => $param['paymentcurr'], 'status' => 2 ]; $bookingPaymentCreate = $this->bookingPaymentService->create($bookingPaymentCreateParam); //$bookingContactCreate['status'] = 'success'; if ($bookingPaymentCreate['status'] != 'success') { throw new ApiErrorException(lang('Booking Payment could not be made')); } //INSERT PAYMENT DATA //INSERT CHANNEL PAYMENT DATA if (isset($param['cc_token']) && !empty($param['cc_token'])) { $bookingPaymentDataCreateParam = [ 'booking_id' => $bookingCreate['data']['id'], 'type' => 'ch', 'data' => md5($param['reservno'].$param['channelManagerPropertyId'].$param['cc_token']) ]; $bookingPaymentDataCreate = $this->bookingPaymentService->createPaymentData($bookingPaymentDataCreateParam); if ($bookingPaymentDataCreate['status'] != 'success') { throw new ApiErrorException(lang('Booking Payment could not be made')); } } //INSERT CHANNEL PAYMENT DATA //$param['reservno'] = '27145472222'; $reservationConfirmParam = $this->reservationConfirmParam($param['channelManagerPropertyId'], $param['reservno'], $bookingCode); $reservationConfirm = $this->channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } DB::commit(); $mailParams = ['booking_id' => $bookingCreate['data']['id']]; $this->newBookingMailService->process($mailParams); $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(); } if (!$response['status']) { DB::rollBack(); } return $response; } public function cancelBooking($param) { $response = ['status' => false, 'message' => '']; DB::beginTransaction(); try { $bookingCode = null; $bookingDetailParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $param['property']['id']], ['field' => 'search_key', 'condition' => '=', 'value' => $param['reservno']] ], 'with' => ['bookingRoom'], 'firstRow' => true ]; $bookingDetail = $this->bookingService->select($bookingDetailParam); if ($bookingDetail['status'] != 'success') { throw new ApiErrorException(lang('Booking could not be found, Reservation: ' . $param['reservno'])); } if (!empty($bookingDetail['data'])) { $bookingCode = $bookingDetail['data']['booking_code']; $this->bookingService->update($bookingDetail['data']['id'], ['status' => 0]); foreach ($bookingDetail['data']['booking_room'] as $roomOrder => $room) { $bookingRoomCreate = $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['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 */ } } $response['status'] = true; $bookingCode = is_null($bookingCode) ? 'ENW' . $param['reservno'] : $bookingCode; $reservationConfirmParam = $this->reservationConfirmParam($param['channelManagerPropertyId'], $param['reservno'], $bookingCode); $reservationConfirm = $this->channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } $notificationCancelToPropertyUser = [ 'channel' => $param['otaname'], 'channelBookingCode' => $param['reservno_ota'], 'propertyChannelManager' => $param['otaname'],//$channelManagerMapping['property_channel_manager']['name'], 'nameSurname' => $param['firstname'] . ' ' . $param['lastname'], 'propertyId' => $param['property']['id'], ]; $this->mailer->onQueue('cancelBookingMail', new CancelBookingMail($notificationCancelToPropertyUser)); } 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::commit(); } else { DB::rollBack(); } return $response; } public function modifiedBooking($param) { $response = ['status' => false, 'message' => '']; DB::beginTransaction(); try { $bookingCode = null; $bookingDetailParam = [ 'criteria' => [ ['field' => 'property_id', 'condition' => '=', 'value' => $param['property']['id']], ['field' => 'search_key', 'condition' => '=', 'value' => $param['reservno']] ], 'with' => ['bookingRoom', 'bookingContact'], 'firstRow' => true ]; $bookingDetail = $this->bookingService->select($bookingDetailParam); if ($bookingDetail['status'] != 'success') { throw new ApiErrorException(lang('Booking could not be found, Reservation: ' . $param['reservno'])); } if (!empty($bookingDetail['data'])) { $bookingCode = $bookingDetail['data']['booking_code']; $bookingUpdateParam = [ 'channel_booking_code' => fillOnUndefined($param, 'reservno_ota'), 'search_key' => $param['reservno'], 'checkin_date' => $param['checkinFormatted'], 'checkout_date' => $param['checkoutFormatted'], 'payment_type_code' => 'CHN', 'total' => $param['paymenttotal'], 'currency_code' => $param['paymentcurr'], ]; $bookingUpdate = $this->bookingService->update($bookingDetail['data']['id'], $bookingUpdateParam); $bookingContactUpdateParam = [ 'name' => $param['firstname'], 'surname' => $param['lastname'], 'phone_code' => null, 'phone_number' => $param['tel'], 'email' => $param['email'], 'note' => !empty($param['note']) ? $param['note'] : null, 'language_code' => fillOnUndefined($param, 'language', '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' => str_repeat('A', $roomChannel['totalpax']) . str_repeat('C', $roomChannel['totalchd']), 'checkin_date' => $roomChannel['checkin'], 'checkout_date' => $roomChannel['checkout'], 'room_id' => $roomChannel['property']['room_id'], 'room_name' => $roomChannel['roomtype'], 'room_rate_mapping_id' => $roomChannel['property']['room_rate_mapping_id'], 'room_rate_name' => $roomChannel['ratename'], 'rate_detail' => json_encode($roomChannel), 'total' => $roomChannel['total_amount'], 'currency_code' => $param['paymentcurr'], ]; $bookingRoomUpdate = $this->bookingRoomService->update($room['id'], $bookingRoomUpdateParam); } } } } $response['status'] = true; $bookingCode = is_null($bookingCode) ? 'ENW' . $param['reservno'] : $bookingCode; $reservationConfirmParam = $this->reservationConfirmParam($param['channelManagerPropertyId'], $param['reservno'], $bookingCode); $reservationConfirm = $this->channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } $notificationModifiedToPropertyUser = [ 'channel' => $param['otaname'], 'channelBookingCode' => $param['reservno_ota'], 'propertyChannelManager' => $param['otaname'],//$channelManagerMapping['property_channel_manager']['name'], 'nameSurname' => $param['firstname'] . ' ' . $param['lastname'], 'propertyId' => $param['property']['id'], ]; $this->mailer->onQueue('modifiedBookingMail', new ModifiedBookingMail($notificationModifiedToPropertyUser)); } 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::commit(); } else { DB::rollBack(); } return $response; } public function handle() { //$request = $this->channelService->productList(14480); try { /* 1. Reseliva mapping olan oteller çekilecek 2. Her otel için foreach ile reservaion servisi çağrılacak 3. Gelen bilgiler enw ye işlenecek, sonra da confirmcheck yapılacak * */ $this->info(date('Y-m-d H:i:s') . ' : Start'); $channelManagerMappingCriteria = [ 'criteria' => [ ['field' => 'status', 'condition' => '=', 'value' => 1], ], 'with' => ['propertyChannelManager'], 'orderBy' => [ ['field' => 'id', 'value' => 'ASC'] ] ]; $channelManagerMappingData = $this->channelManagerMappingService->select($channelManagerMappingCriteria); $channelManagerMappingCollect = collect($channelManagerMappingData['data']); $channelManagerPropertyMappingCriteria = [ 'criteria' => [ ['field' => 'status', 'condition' => '=', 'value' => 1], ['field' => 'channel_manager_id', 'condition' => '=', 'value' => 1], ['field' => 'channel_manager_property_id', 'condition' => '!=', 'value' => null], //['field' => 'property_id', 'condition' => '=', 'value' => 326],//TODO: Delete ], 'with' => ['channelManagerRoomRate.propertyRoomRateMapping'], 'orderBy' => [ ['field' => 'id', 'value' => 'ASC'] ] ]; $channelManagerPropertyMapping = $this->channelManagerPropertyMappingService->select($channelManagerPropertyMappingCriteria); if ($channelManagerPropertyMapping['status'] == 'success') { foreach ($channelManagerPropertyMapping['data'] as $propertyMapping) { $channelManagerRoomRateCollect = collect($propertyMapping['channel_manager_room_rate']); $reservationListParam = $this->reservationListParam($propertyMapping['channel_manager_property_id']); $reservationList = $this->channelService->reservationList($reservationListParam); if (!$reservationList['status']) { //$logMessage $mailParams = [ 'title' => 'ReservationPullService Error - ReservationList Error', 'logMessage' => '
' . $reservationListParam . '
' ]; $this->mailer->onQueue('logMail', new LogMail($mailParams)); //$logMessage throw new ApiErrorException('ReservationList Error: ' . $reservationList['message']); } foreach ($reservationList['data'] as $reservationKey => $reservation) { //Check Channel Manager Mapping $channelManagerMapping = $channelManagerMappingCollect->where('channel_manager_channel_id', $reservation['otaname'])->first(); //Eğer ExtranetWork ise içeri almadan onayla if ($reservation['otaname'] == 'ExtranetWork') { $reservationConfirmParam = $this->reservationConfirmParam($propertyMapping['channel_manager_property_id'], $reservation['reservno'], 'ENWRES' . $reservation['reservno']); //$reservationConfirm = $this->channelService->reservationConfirm($reservationConfirmParam); $reservationConfirm['status'] = true; if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } continue; } if (empty($channelManagerMapping)) { //Eğer mapping yapılmış kanal bulunamamış ise rezervasyonu içeri alamazsın //$logMessage $mailParams = [ 'title' => 'ReservationPullService Error - Channel Manager Mapping', 'logMessage' => '
' . print_r(array_merge($propertyMapping, $reservation), true) . '
' ]; $this->mailer->onQueue('logMail', new LogMail($mailParams)); //$logMessage unset($reservationList['data'][$reservationKey]); continue; } $reservationList['data'][$reservationKey]['property']['id'] = $propertyMapping['property_id']; $reservationList['data'][$reservationKey]['property']['channel_id'] = $channelManagerMapping['property_channel_id']; foreach ($reservation['room'] as $roomKey => $room) { //Check Room Rate Mapping $channelManagerRoomRate = $channelManagerRoomRateCollect->where('channel_manager_room_id', $room['roomid'])->where('channel_manager_room_rate_id', $room['rateid'])->first(); if (empty($channelManagerRoomRate)) { $channelManagerRoomRate = $channelManagerRoomRateCollect->where('channel_manager_room_id', $room['roomid'])->first(); } $reservationList['data'][$reservationKey]['room'][$roomKey]['property']['room_id'] = null; $reservationList['data'][$reservationKey]['room'][$roomKey]['property']['room_rate_id'] = null; $reservationList['data'][$reservationKey]['room'][$roomKey]['property']['room_rate_mapping_id'] = null; $reservationList['data'][$reservationKey]['channelManagerPropertyId'] = $propertyMapping['channel_manager_property_id']; if (empty($channelManagerRoomRate)) { //Eğer mapping yapılmış oda bulunamamış ise rezervasyonu içeri alamazsın //$logMessage $mailParams = [ 'title' => 'ReservationPullService Error - Channel Manager Room Rate Mapping', 'logMessage' => '
' . print_r(array_merge($propertyMapping, $reservation), true) . '
' ]; $this->mailer->onQueue('logMail', new LogMail($mailParams)); //$logMessage unset($reservationList['data'][$reservationKey]); $this->error(date('Y-m-d H:i:s') . ' : Error: RoomRate Mapping Reservation: ' . $reservation['reservno']); //Eşleşmeyen ve iptal edilen işlemin otele bildirilmesi. if ($reservation['status'] == 'C') { $notificationCancelToPropertyUser = [ 'channel' => $reservation['otaname'], 'channelBookingCode' => $reservation['reservno_ota'], 'propertyChannelManager' => $channelManagerMapping['property_channel_manager']['name'], 'nameSurname' => $reservation['firstname'] . ' ' . $reservation['lastname'], 'propertyId' => $propertyMapping['property_id'], ]; $this->mailer->onQueue('cancelBookingMail', new CancelBookingMail($notificationCancelToPropertyUser)); $reservationConfirmParam = $this->reservationConfirmParam($propertyMapping['channel_manager_property_id'], $reservation['reservno'], 'ENWRES' . $reservation['reservno']); $reservationConfirm = $this->channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } } } else { $reservationList['data'][$reservationKey]['room'][$roomKey]['property']['room_id'] = $channelManagerRoomRate['property_room_rate_mapping']['room_id']; $reservationList['data'][$reservationKey]['room'][$roomKey]['property']['room_rate_id'] = $channelManagerRoomRate['property_room_rate_mapping']['room_rate_id']; $reservationList['data'][$reservationKey]['room'][$roomKey]['property']['room_rate_mapping_id'] = $channelManagerRoomRate['property_room_rate_mapping']['id']; } } } foreach ($reservationList['data'] as $reservationKey => $reservation) { //Eğer ExtranetWork ise içeri almadan onayla if ($reservation['otaname'] == 'ExtranetWork') { $reservationConfirmParam = $this->reservationConfirmParam($propertyMapping['channel_manager_property_id'], $reservation['reservno'], 'ENWRES' . $reservation['reservno']); $reservationConfirm = $this->channelService->reservationConfirm($reservationConfirmParam); if (!$reservationConfirm['status']) { throw new ApiErrorException($reservationConfirm['message']); } continue; } $booking = ['status' => false, 'message' => '']; if ($reservation['status'] == 'A') { $booking = $this->createBooking($reservation); } elseif ($reservation['status'] == 'C') { $booking = $this->cancelBooking($reservation); } elseif ($reservation['status'] == 'M') { $booking = $this->modifiedBooking($reservation); } //M Modified kayıt bul güncelle ve sonra mail atılacak cancel ile aynı mail yapısı kullanılacak if ($booking['status']) { $this->info(date('Y-m-d H:i:s') . ' : Success: ' . $reservation['reservno']); } else { //$logMessage $mailParams = [ 'title' => 'ReservationPullService Error - Booking', 'logMessage' => '
' . print_r(array_merge($booking, $reservation), true) . '
' ]; $this->mailer->onQueue('logMail', new LogMail($mailParams)); //$logMessage $this->error(date('Y-m-d H:i:s') . ' : Error: ' . $booking['message']); } } } } $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); } } }