bnovo
This commit is contained in:
116
pms_integration/plugins/travelline_pms.py
Normal file
116
pms_integration/plugins/travelline_pms.py
Normal file
@@ -0,0 +1,116 @@
|
||||
import logging
|
||||
import requests
|
||||
from datetime import datetime
|
||||
from .base_plugin import BasePMSPlugin
|
||||
|
||||
class TravelLinePMSPlugin(BasePMSPlugin):
|
||||
"""
|
||||
Плагин для интеграции с PMS TravelLine.
|
||||
"""
|
||||
BASE_URL = "https://partner.tlintegration.com/api/webpms/v1"
|
||||
|
||||
def __init__(self, pms_config):
|
||||
"""
|
||||
Инициализация плагина с конфигурацией PMS.
|
||||
|
||||
:param pms_config: Конфигурация PMS (объект PMSConfiguration).
|
||||
"""
|
||||
super().__init__(pms_config)
|
||||
self.api_key = pms_config.token
|
||||
self.logger = logging.getLogger(self.__class__.__name__)
|
||||
|
||||
def _get_headers(self):
|
||||
"""
|
||||
Возвращает заголовки для запросов.
|
||||
"""
|
||||
return {
|
||||
"Authorization": f"Bearer {self.api_key}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
def _fetch_data(self):
|
||||
"""
|
||||
Получение данных из API TravelLine (поиск бронирований).
|
||||
|
||||
:return: Список номеров бронирований.
|
||||
"""
|
||||
url = f"{self.BASE_URL}/bookings"
|
||||
params = {
|
||||
"roomId": self.pms_config.room_id,
|
||||
"modifiedFrom": self.pms_config.modified_from,
|
||||
"modifiedTo": self.pms_config.modified_to,
|
||||
"state": self.pms_config.state,
|
||||
"affectsPeriodFrom": self.pms_config.affects_period_from,
|
||||
"affectsPeriodTo": self.pms_config.affects_period_to,
|
||||
}
|
||||
params = {k: v for k, v in params.items() if v is not None}
|
||||
|
||||
try:
|
||||
response = requests.get(url, headers=self._get_headers(), params=params)
|
||||
response.raise_for_status()
|
||||
self.logger.info("Данные успешно получены из API TravelLine.")
|
||||
return response.json().get("bookingNumbers", [])
|
||||
except requests.RequestException as e:
|
||||
self.logger.error(f"Ошибка при запросе к API TravelLine: {e}")
|
||||
return []
|
||||
|
||||
def fetch_data(self):
|
||||
"""
|
||||
Обертка для получения данных из API TravelLine с дополнительной обработкой.
|
||||
|
||||
:return: Список номеров бронирований.
|
||||
"""
|
||||
return self._fetch_data()
|
||||
|
||||
def get_default_parser_settings(self):
|
||||
"""
|
||||
Возвращает настройки парсера по умолчанию.
|
||||
"""
|
||||
return {
|
||||
"field_mapping": {
|
||||
"reservation_id": "bookingNumber",
|
||||
"check_in": "actualCheckInDateTime",
|
||||
"check_out": "actualCheckOutDateTime",
|
||||
"room_number": "roomId",
|
||||
"status": "state",
|
||||
},
|
||||
"date_format": "%Y-%m-%dT%H:%M"
|
||||
}
|
||||
|
||||
def process_data(self, booking_number, room_stay_id, action, actual_date_time):
|
||||
"""
|
||||
Обработка данных для заселения или выселения проживания.
|
||||
|
||||
:param booking_number: Номер бронирования.
|
||||
:param room_stay_id: Идентификатор проживания.
|
||||
:param action: Действие ("check-in" или "check-out").
|
||||
:param actual_date_time: Фактические дата и время.
|
||||
:return: Ответ API.
|
||||
"""
|
||||
if action not in ["check-in", "check-out"]:
|
||||
raise ValueError("Invalid action. Must be 'check-in' or 'check-out'.")
|
||||
|
||||
url = f"{self.BASE_URL}/bookings/{booking_number}/room-stays/{room_stay_id}/{action}"
|
||||
payload = {
|
||||
f"actual{action.capitalize()}DateTime": actual_date_time
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.post(url, headers=self._get_headers(), json=payload)
|
||||
response.raise_for_status()
|
||||
self.logger.info(f"Успешно выполнено действие '{action}' для бронирования {booking_number}.")
|
||||
return response.json()
|
||||
except requests.RequestException as e:
|
||||
self.logger.error(f"Ошибка при выполнении действия '{action}': {e}")
|
||||
return {}
|
||||
|
||||
def validate_plugin(self):
|
||||
"""
|
||||
Проверка плагина на соответствие требованиям.
|
||||
"""
|
||||
required_methods = ["fetch_data", "get_default_parser_settings", "_fetch_data"]
|
||||
for method in required_methods:
|
||||
if not hasattr(self, method):
|
||||
raise ValueError(f"Плагин {type(self).__name__} не реализует метод {method}.")
|
||||
self.logger.info(f"Плагин {self.__class__.__name__} успешно прошел валидацию.")
|
||||
return True
|
||||
Reference in New Issue
Block a user