JEMBOT MAWOT Bypass Shell

Current Path : /home/cinepatreb/billetterie/modules/mollie/subscription/Factory/
Upload File :
Current File : /home/cinepatreb/billetterie/modules/mollie/subscription/Factory/CreateSubscriptionDataFactory.php

<?php
/**
 * Mollie       https://www.mollie.nl
 *
 * @author      Mollie B.V. <info@mollie.nl>
 * @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\Factory;

use Mollie;
use Mollie\Adapter\ConfigurationAdapter;
use Mollie\Adapter\Context;
use Mollie\Config\Config;
use Mollie\Repository\MolCustomerRepository;
use Mollie\Repository\PaymentMethodRepositoryInterface;
use Mollie\Subscription\DTO\CreateSubscriptionData as SubscriptionDataDTO;
use Mollie\Subscription\DTO\SubscriptionOrderAmountProviderData;
use Mollie\Subscription\Exception\CouldNotCreateSubscriptionData;
use Mollie\Subscription\Exception\MollieSubscriptionException;
use Mollie\Subscription\Provider\SubscriptionDescriptionProvider;
use Mollie\Subscription\Provider\SubscriptionIntervalProvider;
use Mollie\Subscription\Provider\SubscriptionOrderAmountProvider;
use Mollie\Subscription\Provider\SubscriptionStartDateProvider;
use Mollie\Subscription\Repository\CombinationRepository;
use Mollie\Utility\SecureKeyUtility;
use Order;

if (!defined('_PS_VERSION_')) {
    exit;
}

class CreateSubscriptionDataFactory
{
    /** @var MolCustomerRepository */
    private $customerRepository;
    /** @var SubscriptionIntervalProvider */
    private $subscriptionInterval;
    /** @var SubscriptionDescriptionProvider */
    private $subscriptionDescription;
    /** @var PaymentMethodRepositoryInterface */
    private $methodRepository;
    /** @var Mollie */
    private $module;
    /** @var Context */
    private $context;
    /** @var ConfigurationAdapter */
    private $configuration;
    /** @var SubscriptionOrderAmountProvider */
    private $subscriptionOrderAmountProvider;
    /** @var SubscriptionStartDateProvider */
    private $subscriptionStartDateProvider;
    /** @var CombinationRepository */
    private $combination;

    public function __construct(
        MolCustomerRepository $customerRepository,
        SubscriptionIntervalProvider $subscriptionInterval,
        SubscriptionDescriptionProvider $subscriptionDescription,
        PaymentMethodRepositoryInterface $methodRepository,
        Mollie $module,
        Context $context,
        ConfigurationAdapter $configuration,
        SubscriptionOrderAmountProvider $subscriptionOrderAmountProvider,
        SubscriptionStartDateProvider $subscriptionStartDateProvider,
        CombinationRepository $combination
    ) {
        $this->customerRepository = $customerRepository;
        $this->subscriptionInterval = $subscriptionInterval;
        $this->subscriptionDescription = $subscriptionDescription;
        $this->methodRepository = $methodRepository;
        $this->module = $module;
        $this->context = $context;
        $this->configuration = $configuration;
        $this->subscriptionOrderAmountProvider = $subscriptionOrderAmountProvider;
        $this->subscriptionStartDateProvider = $subscriptionStartDateProvider;
        $this->combination = $combination;
    }

    /**
     * @throws MollieSubscriptionException
     */
    public function build(Order $order, array $subscriptionProduct): SubscriptionDataDTO
    {
        // TODO modify mol_customer table to hold id_customer (default PS customer ID as it holds id_shop). Then we won't need separate id_shop and id_shop_group column

        try {
            /** @var \MolCustomer|null $molCustomer */
            $molCustomer = $this->customerRepository->findOneBy([
                'email' => $order->getCustomer()->email,
            ]);
        } catch (\Throwable $exception) {
            throw CouldNotCreateSubscriptionData::unknownError($exception);
        }

        if (!$molCustomer) {
            throw CouldNotCreateSubscriptionData::failedToFindMollieCustomer((string) $order->getCustomer()->email);
        }

        try {
            $interval = $this->subscriptionInterval->getSubscriptionInterval((int) $subscriptionProduct['id_product_attribute']);
        } catch (\Throwable $exception) {
            throw CouldNotCreateSubscriptionData::failedToRetrieveSubscriptionInterval($exception, (int) $subscriptionProduct['id_product_attribute']);
        }

        $description = $this->subscriptionDescription->getSubscriptionDescription($order);

        $subscriptionCarrierId = (int) $this->configuration->get(Config::MOLLIE_SUBSCRIPTION_ORDER_CARRIER_ID);

        try {
            $orderAmount = $this->subscriptionOrderAmountProvider->get(
                SubscriptionOrderAmountProviderData::create(
                    (int) $order->id_address_delivery,
                    (int) $order->id_cart,
                    (int) $order->id_customer,
                    $subscriptionProduct,
                    $subscriptionCarrierId,
                    (int) $order->id_currency,
                    (float) $subscriptionProduct['total_price_tax_incl']
                )
            );
        } catch (\Throwable $exception) {
            throw CouldNotCreateSubscriptionData::failedToProvideSubscriptionOrderAmount($exception);
        }

        $subscriptionData = new SubscriptionDataDTO(
            $molCustomer->customer_id,
            $orderAmount,
            $interval,
            $description
        );

        $subscriptionData->setWebhookUrl($this->context->getModuleLink(
            'mollie',
            'subscriptionWebhook'
        ));

        $secureKey = SecureKeyUtility::generateReturnKey(
            $order->id_customer,
            $order->id_cart,
            $this->module->name
        );

        $subscriptionData->setMetaData([
            'secure_key' => $secureKey,
            'subscription_carrier_id' => $subscriptionCarrierId,
        ]);

        $combination = $this->combination->getById((int) $subscriptionProduct['id_product_attribute']);
        $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']);

        return $subscriptionData;
    }
}

xxxxx1.0, XXX xxxx