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