inklabs/kommerce-core

View on GitHub
src/Entity/ShipmentRate.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php
namespace inklabs\kommerce\Entity;

use DateTime;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints as Assert;

class ShipmentRate implements ValidationInterface
{
    /** @var string|null */
    protected $externalId;

    /** @var string|null */
    protected $shipmentExternalId;

    /** @var string|null */
    protected $service;

    /** @var string|null */
    protected $carrier;

    /** @var int|null */
    protected $deliveryDate;

    /** @var boolean|null */
    protected $isDeliveryDateGuaranteed;

    /** @var int|null */
    protected $deliveryDays;

    /** @var int|null */
    protected $estDeliveryDays;

    /** @var DeliveryMethodType */
    protected $deliveryMethod;

    /** @var Money */
    protected $rate;

    /** @var Money */
    protected $listRate;

    /** @var Money */
    protected $retailRate;

    public function __construct(Money $rate)
    {
        $this->rate = $rate;
        $this->setIsDeliveryDateGuaranteed(false);
        $this->setupDeliveryMethod();
    }

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('rate', new Assert\Valid);
        $metadata->addPropertyConstraint('listRate', new Assert\Valid);
        $metadata->addPropertyConstraint('retailRate', new Assert\Valid);

        $metadata->addPropertyConstraint('externalId', new Assert\Length([
            'max' => 60,
        ]));

        $metadata->addPropertyConstraint('shipmentExternalId', new Assert\Length([
            'max' => 60,
        ]));

        $metadata->addPropertyConstraint('service', new Assert\Length([
            'max' => 20,
        ]));

        $metadata->addPropertyConstraint('carrier', new Assert\Length([
            'max' => 20,
        ]));

        $metadata->addPropertyConstraint('deliveryDays', new Assert\Range([
            'min' => 0,
            'max' => 65535,
        ]));

        $metadata->addPropertyConstraint('estDeliveryDays', new Assert\Range([
            'min' => 0,
            'max' => 65535,
        ]));

        $metadata->addPropertyConstraint('deliveryMethod', new Assert\Valid);
    }

    public function getRate(): Money
    {
        return $this->rate;
    }

    public function setService(string $service)
    {
        $this->service = $service;
    }

    public function getService(): ?string
    {
        return $this->service;
    }

    public function setCarrier(string $carrier)
    {
        $this->carrier = $carrier;
    }

    public function getCarrier(): ?string
    {
        return $this->carrier;
    }

    public function setExternalId(string $externalId)
    {
        $this->externalId = $externalId;
    }

    public function getExternalId(): ?string
    {
        return $this->externalId;
    }

    public function setShipmentExternalId(string $shipmentExternalId)
    {
        $this->shipmentExternalId = $shipmentExternalId;
    }

    public function getShipmentExternalId(): ?string
    {
        return $this->shipmentExternalId;
    }

    public function setDeliveryDate(DateTime $deliveryDate = null)
    {
        $this->deliveryDate = $deliveryDate->getTimestamp();
    }

    public function getDeliveryDate(): ?DateTime
    {
        if ($this->deliveryDate === null) {
            return null;
        }

        $deliveryDate = new DateTime();
        $deliveryDate->setTimestamp($this->deliveryDate);
        return $deliveryDate;
    }

    public function setIsDeliveryDateGuaranteed(bool $isDeliveryDateGuaranteed)
    {
        $this->isDeliveryDateGuaranteed = $isDeliveryDateGuaranteed;
    }

    public function isDeliveryDateGuaranteed(): ?bool
    {
        return $this->isDeliveryDateGuaranteed;
    }

    public function setDeliveryDays(int $deliveryDays)
    {
        $this->deliveryDays = $deliveryDays;
        $this->setupDeliveryMethod();
    }

    public function setEstDeliveryDays(int $estDeliveryDays = null)
    {
        $this->estDeliveryDays = $estDeliveryDays;
    }

    public function getDeliveryDays(): ?int
    {
        return $this->deliveryDays;
    }

    public function getEstDeliveryDays(): ?int
    {
        return $this->estDeliveryDays;
    }

    public function setListRate(Money $listRate)
    {
        $this->listRate = $listRate;
    }

    public function setRetailRate(Money $retailRate)
    {
        $this->retailRate = $retailRate;
    }

    public function getListRate(): Money
    {
        return $this->listRate;
    }

    public function getRetailRate(): ?Money
    {
        return $this->retailRate;
    }

    private function setupDeliveryMethod(): void
    {
        $this->setDeliveryMethod(
            DeliveryMethodType::createByDeliveryDays($this->deliveryDays)
        );
    }

    public function getDeliveryMethod(): DeliveryMethodType
    {
        return $this->deliveryMethod;
    }

    private function setDeliveryMethod(DeliveryMethodType $deliveryMethod)
    {
        $this->deliveryMethod = $deliveryMethod;
    }
}