bee_hotel-1.x-dev/modules/beehotel_happening_today/src/Service/OrderService.php

modules/beehotel_happening_today/src/Service/OrderService.php
<?php

namespace Drupal\beehotel_happening_today\Service;

use Drupal\commerce_log\LogStorageInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Url;

/**
 * Handles order-related operations and data.
 */
class OrderService {

  use StringTranslationTrait;

  /**
   * Populates order data in the main data array.
   *
   * @param array $data
   *   The data array passed by reference.
   */
  public function populateOrderData(array &$data) {
    $beehotelOrderService = \Drupal::service('bee_hotel.order');

    $data['commerce']['order'] = $beehotelOrderService->getOrderFromBatEvent($data['bat']['event_id']);
    $data['beehotel']['day_before_order'] = $beehotelOrderService->getDayBeforeOrder($data);

    $this->generateOrderLinks($data);
    $this->extractNumberOfPeople($data);
    $this->calculateCheckInTime($data);
    $this->populateCommentData($data);
  }

  /**
   * Generates order-related URLs.
   *
   * @param array $data
   *   The data array passed by reference.
   */
  public function generateOrderLinks(array &$data) {
    if (!isset($data['commerce']['order'])) {
      return;
    }

    $order = $data['commerce']['order']['object'];
    $orderId = $order->get('order_id')->value;

    $data['view_order_url'] = Url::fromRoute('entity.commerce_order.canonical', ['commerce_order' => $orderId])->toString();
    $data['edit_order_url'] = Url::fromRoute('entity.commerce_order.edit_form', ['commerce_order' => $orderId])->toString();
    $data['guest_messages_order_url'] = Url::fromRoute('entity.commerce_order.guest_messages', ['commerce_order' => $orderId])->toString();
    $data['edit_order_text'] = $this->t('#@number', ['@number' => $order->get("order_number")->value]);
  }

  /**
   * Extracts number of people from order.
   *
   * @param array $data
   *   The data array passed by reference.
   */
  public function extractNumberOfPeople(array &$data) {
    $data['people'] = 0;

    if (!isset($data['commerce']['order']['object'])) {
      return;
    }

    try {
      $order_items = $data['commerce']['order']['object']->get('order_items')->referencedEntities();

      if (!empty($order_items)) {
        $product_title = $order_items[0]->get('title')->value;
        $pattern = '/(\d+)\s*(?:Guests?|People|Persons?|Adults?|Pax)/i';

        if (preg_match($pattern, $product_title, $matches)) {
          $data['people'] = (int) $matches[1];
        }
      }
    }
    catch (\Exception $e) {
      \Drupal::logger('beehotel_happening_today')->error('Error extracting number of people: @error', [
        '@error' => $e->getMessage(),
      ]);
    }
  }

  /**
   * Calculates check-in time.
   *
   * @param array $data
   *   The data array passed by reference.
   */
  public function calculateCheckInTime(array &$data) {
    $data['check_in_time'] = $data['configFactory']
      ->get('bee_hotel.settings')
      ->get('beehotel')['dateandtime']['default_checkin_time'] ?? "???";

    if (isset($data['commerce']['order']['object']) &&
        $data['commerce']['order']['object']->hasField('field_announced_time_of_arrival') &&
        !$data['commerce']['order']['object']->get('field_announced_time_of_arrival')->isEmpty()) {

      $data['check_in_time'] = $data['commerce']['order']['object']
        ->get('field_announced_time_of_arrival')
        ->value;
    }
  }

  /**
   * Builds data for checking-in bookings.
   *
   * @param array $data
   *   The data array.
   *
   * @return array
   *   Structured data for checking-in bookings.
   */
  public function buildCheckingInData(array $data) {
    return [
      'booking_id' => $data['edit_order_text'] ?? "",
      'booking_link' => $data['view_order_url'] ?? "",
      'check_in_time' => $data['check_in_time'] ?? "",
      'comment_count' => $data['comment_count'] ?? 0,
      'comments' => $data['comments'] ?? [],
      'event_id' => $data['bat']['event_id'] ?? "",
      'end_date' => $data['commerce']['order']['dates']['checkout']->format('d-m-Y') ?? "",
      'nights_stayed' => $data['commerce']['order']['dates']['nights'] ?? "",
      'people' => $data['people'] ?? "",
      'start_date' => $data['commerce']['order']['dates']['checkin']->format('d-m-Y') ?? "",
      'unit_id' => $data['unit']['node']->Id() ?? "",
      'unit_name' => $data['unit']['node']->getTitle() ?? "",
    ];
  }

  /**
   * Builds data for in-progress bookings.
   *
   * @param array $data
   *   The data array.
   *
   * @return array
   *   Structured data for in-progress bookings.
   */
  public function buildInProgressData(array $data) {
    return [
      'event_id' => $data['bat']['event_id'] ?? "",
      'booking_id' => $data['commerce']['order']['object']->order_number->value ?? "",
      'booking_link' => $data['view_order_url'] ?? "",
      'comment_count' => $data['comment_count'] ?? 0,
      'comments' => $data['comments'] ?? [],
      'unit_id' => $data['unit']['node']->Id() ?? "",
      'unit_name' => $data['unit']['node']->getTitle() ?? "",
      'start_date' => $data['commerce']['order']['dates']['checkin']->format('d-m-Y') ?? "",
      'end_date' => $data['commerce']['order']['dates']['checkout']->format('d-m-Y') ?? "",
      'check_out_time' => '10:00am',
      'nights_stayed' => $data['commerce']['order']['object']->nights ?? "",
    ];
  }

  /**
   * Builds data for checking-out tomorrow bookings.
   *
   * @param array $data
   *   The data array.
   *
   * @return array
   *   Structured data for checking-out tomorrow bookings.
   */
  public function buildCheckingOutTomorrowData(array $data) {
    return [
      'event_id' => $data['bat']['event_id'] ?? "",
      'booking_id' => $data['edit_order_text'] ?? "",
      'booking_link' => $data['view_order_url'] ?? "",
      'booking_guest_messages' => $data['guest_messages_order_url'] ?? "",
      'comment_count' => $data['comment_count'] ?? 0,
      'comments' => $data['comments'] ?? [],
      'unit_id' => $data['unit']['node']->Id() ?? "",
      'unit_name' => $data['unit']['node']->getTitle() ?? "",
      'start_date' => $data['commerce']['order']['dates']['checkin']->format('d-m-Y') ?? "",
      'end_date' => $data['commerce']['order']['dates']['checkout']->format('d-m-Y') ?? "",
      'nights_stayed' => $data['commerce']['order']['dates']['nights'] ?? "",
      'people' => $data['people'] ?? "",
    ];
  }

  /**
   * Builds data for first night passed bookings.
   *
   * @param array $data
   *   The data array.
   *
   * @return array
   *   Structured data for first night passed bookings.
   */
  public function buildFirstNightPassedData(array $data) {
    return [
      'event_id' => $data['bat']['event_id'] ?? "",
      'booking_id' => $data['edit_order_text'] ?? "",
      'booking_link' => $data['view_order_url'] ?? "",
      'booking_guest_messages' => $data['guest_messages_order_url'] ?? "",
      'comment_count' => $data['comment_count'] ?? 0,
      'comments' => $data['comments'] ?? [],
      'unit_id' => $data['unit']['node']->Id() ?? "",
      'unit_name' => $data['unit']['node']->getTitle() ?? "",
      'start_date' => $data['commerce']['order']['dates']['checkin']->format('d-m-Y') ?? "",
      'end_date' => $data['commerce']['order']['dates']['checkout']->format('d-m-Y') ?? "",
      'nights_stayed' => $data['commerce']['order']['dates']['nights'] ?? "",
      'people' => $data['people'] ?? "",
    ];
  }

  /**
   * Builds data for checking-out bookings.
   *
   * @param array $data
   *   The data array.
   *
   * @return array
   *   Structured data for checking-out bookings.
   */
  public function buildCheckingOutData(array $data) {
    return [
      'booking_id' => $data['edit_order_text'] ?? "",
      'booking_link' => $data['view_order_url'] ?? "",
      'check_out_time' => '10:00am',
      'comment_count' => $data['comment_count'] ?? 0,
      'comments' => $data['comments'] ?? [],
      'end_date' => $data['beehotel']['day_before_order']['object']->checkout ?? "",
      'event_id' => $data['bat']['event_id'] ?? "",
      'guest_messages_order_url' => $data['guest_messages_order_url'] ?? "",
      'nights_stayed' => $data['beehotel']['day_before_order']['object']->nights ?? "",
      'start_date' => $data['beehotel']['day_before_order']['object']->checkin ?? "",
      'unit_id' => $data['unit']['node']->Id() ?? "",
      'unit_name' => $data['unit']['node']->getTitle() ?? "",
    ];
  }

  /**
   * Counts order comments from activity log.
   *
   * @param object $order
   *   The commerce order object.
   *
   * @return int
   *   The number of order comments.
   */
  public function countOrderComments($order) {
    if (!$order) {
      return 0;
    }

    try {
      /** @var \Drupal\commerce_log\LogStorageInterface $logStorage */
      $logStorage = \Drupal::entityTypeManager()->getStorage('commerce_log');

      $query = $logStorage->getQuery()
        ->accessCheck(FALSE)
        ->condition('source_entity_id', $order->id())
        ->condition('source_entity_type', 'commerce_order')
        ->condition('category_id', 'commerce_order');

      $logIds = $query->execute();

      return count($logIds);
    }
    catch (\Exception $e) {
      \Drupal::logger('beehotel_happening_today')->error('Error counting order comments: @error', [
        '@error' => $e->getMessage(),
      ]);
      return 0;
    }
  }

  /**
   * Gets order comments content from activity log.
   *
   * @param object $order
   *   The commerce order object.
   *
   * @return array
   *   Array of comment data.
   */
  public function getOrderComments($order) {
    $comments = [];

    if (!$order) {
      return $comments;
    }

    try {
      /** @var \Drupal\commerce_log\LogStorageInterface $logStorage */
      $logStorage = \Drupal::entityTypeManager()->getStorage('commerce_log');

      $query = $logStorage->getQuery()
        ->accessCheck(FALSE)
        ->condition('source_entity_id', $order->id())
        ->condition('source_entity_type', 'commerce_order')
        ->condition('category_id', 'commerce_order')
        ->condition('template_id', 'commerce_order_comment')
        ->sort('created', 'ASC');

      $logIds = $query->execute();
      $logs = $logStorage->loadMultiple($logIds);

      foreach ($logs as $log) {
        if ($log->hasField('comment') && !$log->get('comment')->isEmpty()) {
          $comment = $log->get('comment')->value;
          if (!empty(trim($comment))) {
            $comments[] = [
              'comment' => $comment,
              'author' => $log->getOwner()->getDisplayName(),
              'created' => \Drupal::service('date.formatter')->format($log->getCreatedTime(), 'short'),
              'timestamp' => $log->getCreatedTime(),
            ];
          }
        }
      }

      return $comments;
    }
    catch (\Exception $e) {
      \Drupal::logger('beehotel_happening_today')->error('Error getting order comments: @error', [
        '@error' => $e->getMessage(),
      ]);
      return [];
    }
  }

  /**
   * Populates comment data in the main data array.
   *
   * @param array $data
   *   The data array passed by reference.
   */
  public function populateCommentData(array &$data) {
    if (!isset($data['commerce']['order']['object'])) {
      $data['comment_count'] = 0;
      $data['comments'] = [];
      return;
    }

    $data['comment_count'] = $this->countOrderComments($data['commerce']['order']['object']);
    $data['comments'] = $this->getOrderComments($data['commerce']['order']['object']);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc