You are here

ShippingRate.php in Commerce Shipping 8.2

File

src/ShippingRate.php
View source
<?php

namespace Drupal\commerce_shipping;

use Drupal\commerce_price\Price;
use Drupal\Core\Datetime\DrupalDateTime;

/**
 * Represents a shipping rate.
 */
final class ShippingRate {

  /**
   * The ID.
   *
   * @var string
   */
  protected $id;

  /**
   * The shipping method ID.
   *
   * @var string
   */
  protected $shippingMethodId;

  /**
   * The shipping service.
   *
   * @var \Drupal\commerce_shipping\ShippingService
   */
  protected $service;

  /**
   * The original amount.
   *
   * @var \Drupal\commerce_price\Price
   */
  protected $originalAmount;

  /**
   * The amount.
   *
   * @var \Drupal\commerce_price\Price
   */
  protected $amount;

  /**
   * The description.
   *
   * @var string
   */
  protected $description;

  /**
   * The delivery date.
   *
   * @var \Drupal\Core\Datetime\DrupalDateTime
   */
  protected $deliveryDate;

  /**
   * Constructs a new ShippingRate object.
   *
   * @param array $definition
   *   The definition.
   */
  public function __construct(array $definition) {
    foreach ([
      'shipping_method_id',
      'service',
      'amount',
    ] as $required_property) {
      if (empty($definition[$required_property])) {
        throw new \InvalidArgumentException(sprintf('Missing required property %s.', $required_property));
      }
    }
    if (!$definition['service'] instanceof ShippingService) {
      throw new \InvalidArgumentException(sprintf('Property "service" should be an instance of %s.', ShippingService::class));
    }
    if (!$definition['amount'] instanceof Price) {
      throw new \InvalidArgumentException(sprintf('Property "amount" should be an instance of %s.', Price::class));
    }

    // The ID is not required because most shipping methods generate one
    // rate per service, and use the service ID when purchasing labels.
    if (empty($definition['id'])) {
      $shipping_method_id = $definition['shipping_method_id'];
      $service_id = $definition['service']
        ->getId();
      $definition['id'] = $shipping_method_id . '--' . $service_id;
    }
    $this->id = $definition['id'];
    $this->shippingMethodId = $definition['shipping_method_id'];
    $this->service = $definition['service'];
    $this->originalAmount = $definition['original_amount'] ?? $definition['amount'];
    $this->amount = $definition['amount'];
    $this->description = $definition['description'] ?? '';
    $this->deliveryDate = $definition['delivery_date'] ?? NULL;
  }

  /**
   * Gets the ID.
   *
   * @return string
   *   The ID.
   */
  public function getId() : string {
    return $this->id;
  }

  /**
   * Gets the shipping method ID.
   *
   * @return string
   *   The shipping method ID.
   */
  public function getShippingMethodId() : string {
    return $this->shippingMethodId;
  }

  /**
   * Gets the shipping service.
   *
   * The shipping service label is meant to be displayed when presenting rates
   * for selection.
   *
   * @return \Drupal\commerce_shipping\ShippingService
   *   The shipping service.
   */
  public function getService() : ShippingService {
    return $this->service;
  }

  /**
   * Gets the original amount.
   *
   * This is the amount before promotions and fees are applied.
   *
   * @return \Drupal\commerce_price\Price
   *   The original amount.
   */
  public function getOriginalAmount() : Price {
    return $this->originalAmount;
  }

  /**
   * Sets the original amount.
   *
   * @param \Drupal\commerce_price\Price $original_amount
   *   The original amount.
   *
   * @return $this
   */
  public function setOriginalAmount(Price $original_amount) {
    $this->originalAmount = $original_amount;
    return $this;
  }

  /**
   * Gets the amount.
   *
   * @return \Drupal\commerce_price\Price
   *   The amount.
   */
  public function getAmount() : Price {
    return $this->amount;
  }

  /**
   * Sets the amount.
   *
   * @param \Drupal\commerce_price\Price $amount
   *   The amount.
   *
   * @return $this
   */
  public function setAmount(Price $amount) {
    $this->amount = $amount;
    return $this;
  }

  /**
   * Gets the description.
   *
   * Displayed to the end-user when available.
   *
   * @return string
   *   The description
   */
  public function getDescription() : string {
    return $this->description;
  }

  /**
   * Sets the description.
   *
   * @param string $description
   *   The description.
   *
   * @return $this
   */
  public function setDescription(string $description) {
    $this->description = $description;
    return $this;
  }

  /**
   * Gets the delivery date, if known.
   *
   * @return \Drupal\Core\Datetime\DrupalDateTime|null
   *   The delivery date, or NULL.
   */
  public function getDeliveryDate() {
    return $this->deliveryDate;
  }

  /**
   * Sets the delivery date.
   *
   * @param \Drupal\Core\Datetime\DrupalDateTime $delivery_date
   *   The delivery date.
   *
   * @return $this
   */
  public function setDeliveryDate(DrupalDateTime $delivery_date) {
    $this->deliveryDate = $delivery_date;
    return $this;
  }

  /**
   * Gets the array representation of the shipping rate.
   *
   * @return array
   *   The array representation of the shipping rate.
   */
  public function toArray() : array {
    return [
      'id' => $this->id,
      'shipping_method_id' => $this->shippingMethodId,
      'service' => $this->service,
      'original_amount' => $this->originalAmount,
      'amount' => $this->amount,
      'description' => $this->description,
      'delivery_date' => $this->deliveryDate,
    ];
  }

}

Classes

Namesort descending Description
ShippingRate Represents a shipping rate.