diff --git a/subscription/DTO/CreateSubscriptionData.php b/subscription/DTO/CreateSubscriptionData.php index 62c4a1ead..86a29f65f 100644 --- a/subscription/DTO/CreateSubscriptionData.php +++ b/subscription/DTO/CreateSubscriptionData.php @@ -105,6 +105,11 @@ public function setMetaData(array $metaData): void $this->metaData = $metaData; } + public function setStartDate(string $startDate): void + { + $this->startDate = $startDate; + } + public function jsonSerialize(): array { $json = []; diff --git a/subscription/Factory/CreateSubscriptionDataFactory.php b/subscription/Factory/CreateSubscriptionDataFactory.php index c3deca151..3769916a1 100644 --- a/subscription/Factory/CreateSubscriptionDataFactory.php +++ b/subscription/Factory/CreateSubscriptionDataFactory.php @@ -25,6 +25,7 @@ use Mollie\Subscription\Provider\SubscriptionCarrierDeliveryPriceProvider; use Mollie\Subscription\Provider\SubscriptionDescriptionProvider; use Mollie\Subscription\Provider\SubscriptionIntervalProvider; +use Mollie\Subscription\Provider\SubscriptionStartDateProvider; use Mollie\Subscription\Repository\CombinationRepository; use Mollie\Subscription\Repository\CurrencyRepository as CurrencyAdapter; use Mollie\Utility\SecureKeyUtility; @@ -59,6 +60,8 @@ class CreateSubscriptionDataFactory private $context; /** @var SubscriptionCarrierDeliveryPriceProvider */ private $subscriptionCarrierDeliveryPriceProvider; + /** @var SubscriptionStartDateProvider */ + private $subscriptionStartDateProvider; public function __construct( MolCustomerRepository $customerRepository, @@ -69,7 +72,8 @@ public function __construct( PaymentMethodRepositoryInterface $methodRepository, Mollie $module, Context $context, - SubscriptionCarrierDeliveryPriceProvider $subscriptionCarrierDeliveryPriceProvider + SubscriptionCarrierDeliveryPriceProvider $subscriptionCarrierDeliveryPriceProvider, + SubscriptionStartDateProvider $subscriptionStartDateProvider ) { $this->customerRepository = $customerRepository; $this->subscriptionInterval = $subscriptionInterval; @@ -80,6 +84,7 @@ public function __construct( $this->module = $module; $this->context = $context; $this->subscriptionCarrierDeliveryPriceProvider = $subscriptionCarrierDeliveryPriceProvider; + $this->subscriptionStartDateProvider = $subscriptionStartDateProvider; } /** @@ -139,6 +144,8 @@ public function build(Order $order, array $subscriptionProduct): SubscriptionDat ] ); + $subscriptionData->setStartDate($this->subscriptionStartDateProvider->getSubscriptionStartDate($combination)); + // todo: check for solution what to do when mandate is missing $payment = $this->methodRepository->getPaymentBy('cart_id', $order->id_cart); $subscriptionData->setMandateId($payment['mandate_id']); diff --git a/subscription/Provider/SubscriptionStartDateProvider.php b/subscription/Provider/SubscriptionStartDateProvider.php new file mode 100644 index 000000000..61808c347 --- /dev/null +++ b/subscription/Provider/SubscriptionStartDateProvider.php @@ -0,0 +1,76 @@ + + * @copyright Mollie B.V. + * @license https://github.com/mollie/PrestaShop/blob/master/LICENSE.md + * + * @see https://github.com/mollie/PrestaShop + * @codingStandardsIgnoreStart + */ + +declare(strict_types=1); + +namespace Mollie\Subscription\Provider; + +use Combination; +use DateInterval; +use DateTime; +use DateTimeZone; +use Mollie\Adapter\ConfigurationAdapter; +use Mollie\Subscription\Config\Config; +use Mollie\Subscription\DTO\Object\Interval; +use Mollie\Subscription\Exception\SubscriptionIntervalException; +use Mollie\Subscription\Utility\Clock; + +if (!defined('_PS_VERSION_')) { + exit; +} + +class SubscriptionStartDateProvider +{ + /** @var ConfigurationAdapter */ + private $configuration; + + public function __construct(ConfigurationAdapter $configuration, Clock $clock) + { + $this->configuration = $configuration; + $this->clock = $clock; + } + + /** + * Returns subscription date time + * + * @throws SubscriptionIntervalException + */ + public function getSubscriptionStartDate(Combination $combination): string + { + $currentTime = new DateTime('now', new DateTimeZone('UTC')); + + foreach ($combination->getWsProductOptionValues() as $attribute) { + switch ($attribute['id']) { + case $this->configuration->get(Config::SUBSCRIPTION_ATTRIBUTE_DAILY): + $interval = new DateInterval('P1D'); + break; + case $this->configuration->get(Config::SUBSCRIPTION_ATTRIBUTE_WEEKLY): + $interval = new DateInterval('P7D'); + break; + case $this->configuration->get(Config::SUBSCRIPTION_ATTRIBUTE_MONTHLY): + $interval = new DateInterval('P1M'); + break; + case $this->configuration->get(Config::SUBSCRIPTION_ATTRIBUTE_YEARLY): + $interval = new DateInterval('P1Y'); + break; + default: + throw new SubscriptionIntervalException(sprintf('No interval exists for this %s attribute', $combination->id)); + } + + // Add the interval to the current time + $currentTime->add($interval); + return $currentTime->format('Y-m-d'); + } + + throw new SubscriptionIntervalException(sprintf('No interval exists for this %s attribute', $combination->id)); + } +}