Your IP : 216.73.216.43


Current Path : /home/rtorresani/www/vendor/stripe/module-payments/Block/Customer/
Upload File :
Current File : //home/rtorresani/www/vendor/stripe/module-payments/Block/Customer/Subscriptions.php

<?php

namespace StripeIntegration\Payments\Block\Customer;

use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Filesystem;
use Magento\Framework\View\Element;
use StripeIntegration\Payments\Helper\Logger;

class Subscriptions extends \Magento\Framework\View\Element\Template
{
    public $customerPaymentMethods = null;
    public $helper;
    public $subscriptionsHelper;
    public $subscriptionBlocks = [];
    public $orders = [];
    public $configurableProductIds = [];
    public $subscriptionModels = [];
    public $subscriptionProductModels = [];
    public $subscriptions;
    private $attributeRepository;
    private $config;
    private $subscriptionProductFactory;
    private $dataHelper;
    private $paymentMethodHelper;
    private $stripeCustomer;
    private $configurableViewModelFactory;
    private $subscriptionFactory;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Api\ProductAttributeRepositoryInterface $attributeRepository,
        \Magento\Swatches\ViewModel\Product\Renderer\ConfigurableFactory $configurableViewModelFactory,
        \StripeIntegration\Payments\Model\Config $config,
        \StripeIntegration\Payments\Model\Stripe\SubscriptionFactory $subscriptionFactory,
        \StripeIntegration\Payments\Model\SubscriptionProductFactory $subscriptionProductFactory,
        \StripeIntegration\Payments\Helper\Generic $helper,
        \StripeIntegration\Payments\Helper\PaymentMethod $paymentMethodHelper,
        \StripeIntegration\Payments\Helper\Data $dataHelper,
        \StripeIntegration\Payments\Helper\Subscriptions $subscriptionsHelper,
        array $data = []
    ) {
        $this->attributeRepository = $attributeRepository;
        $this->configurableViewModelFactory = $configurableViewModelFactory;
        $this->config = $config;
        $this->subscriptionFactory = $subscriptionFactory;
        $this->subscriptionProductFactory = $subscriptionProductFactory;
        $this->stripeCustomer = $helper->getCustomerModel();
        $this->helper = $helper;
        $this->paymentMethodHelper = $paymentMethodHelper;
        $this->dataHelper = $dataHelper;
        $this->subscriptionsHelper = $subscriptionsHelper;

        parent::__construct($context, $data);
    }

    public function getSubscriptions()
    {
        try
        {
            if (isset($this->subscriptions))
            {
                $subscriptions = $this->subscriptions;
            }
            else
            {
                $this->subscriptions = $subscriptions = $this->stripeCustomer->getSubscriptions();
            }

            $products = [];

            foreach ($subscriptions as $subscription)
            {
                $subscriptionItems = $this->stripeCustomer->getSubscriptionItems($subscription->id);

                foreach ($subscriptionItems as $subscriptionItem)
                {
                    if (!empty($subscriptionItem->price->product))
                        $products[$subscriptionItem->price->product->id] = $subscriptionItem->price->product;
                }
            }

            foreach ($subscriptions as &$subscription)
            {
                foreach ($subscription->items->data as $item)
                {
                    if (!empty($item->price->product) && is_string($item->price->product) && !empty($products[$item->price->product]))
                        $item->price->product = $products[$item->price->product];
                }
            }

            return $subscriptions;
        }
        catch (\Exception $e)
        {
            $this->helper->addError($e->getMessage());
            $this->helper->logError($e->getMessage());
            $this->helper->logError($e->getTraceAsString());
        }
    }

    public function getSubscriptionDefaultPaymentMethod($sub)
    {
        if (!empty($sub->default_payment_method))
        {
            $methods = [
                $sub->default_payment_method->type => [
                    $sub->default_payment_method
                ]
            ];
            $formattedMethods = $this->paymentMethodHelper->formatPaymentMethods($methods);
            return array_pop($formattedMethods);
        }

        return null;
    }

    public function getSubscriptionPaymentMethodId($sub)
    {
        $method = $this->getSubscriptionDefaultPaymentMethod($sub);

        if ($method)
            return $method['id'];
        else
            return null;
    }

    public function getInvoiceItems($sub)
    {
        $items = [];

        if (empty($sub->items->data))
            return $items;

        foreach ($sub->items->data as $item)
        {
            if ($item->quantity > 1)
                $qty = $item->quantity . " x ";
            else
                $qty = "";

            if (!empty($item->price->product->name))
                $items[] = $qty . $item->price->product->name;
        }

        return $items;
    }

    public function formatSubscriptionName($sub)
    {
        return $this->subscriptionsHelper->formatSubscriptionName($sub);
    }

    public function getCustomerPaymentMethods()
    {
        if (isset($this->customerPaymentMethods))
            return $this->customerPaymentMethods;

        return $this->customerPaymentMethods = $this->stripeCustomer->getSavedPaymentMethods(\StripeIntegration\Payments\Helper\PaymentMethod::SUPPORTS_SUBSCRIPTIONS, true);
    }

    public function getStatus($sub)
    {
        switch ($sub->status)
        {
            case 'trialing': // Trialing is not supported yet
            case 'active':
                return __("Active");
            case 'past_due':
                return __("Past Due");
            case 'unpaid':
                return __("Unpaid");
            case 'canceled':
                return __("Canceled");
            default:
                return __(ucwords(explode('_', $sub->status)));
        }
    }

    protected function createConfigurableSubscriptionBlock(\Stripe\Subscription $subscription)
    {
        $product = $this->subscriptionsHelper->getConfigurableSubscriptionProductFrom($subscription);
        if (!$product || !$product->getId())
            return null;

        // DO NOT use the text swatch, it caches the config values as if this is a single product page
        // The UI Component needs to be re-written to support multiple products per page
        $attribute = false; //$this->subscriptionsHelper->getConfigurableSubscriptionSuperAttribute($subscription);
        if ($attribute && $attribute->getProductAttribute() && $attribute->getProductAttribute()->getSwatchInputType() == "text")
        {
            $block = $this->getLayout()->createBlock('Magento\Swatches\Block\Product\Renderer\Configurable');
            $block->setTemplate('Magento_Swatches::product/view/renderer.phtml');

            $model = $this->configurableViewModelFactory->create();
            $block->setConfigurableViewModel($model);
        }
        else
        {
            $block = $this->getLayout()->createBlock('StripeIntegration\Payments\Block\Customer\ConfigurableSubscription');
            $block->setTemplate('StripeIntegration_Payments::product/view/type/options/configurable_dropdown.phtml');
            $block->setSubscription($subscription);
        }
        $block->setBlockId('update_subscription_' . $subscription->id);
        $block->setProduct($product);

        $this->subscriptionBlocks[$subscription->id] = $block;

        return $block;
    }

    protected function getConfigurableSubscriptionBlock(\Stripe\Subscription $subscription)
    {
        if (isset($this->subscriptionBlocks[$subscription->id]))
            return $this->subscriptionBlocks[$subscription->id];

        $this->subscriptionBlocks[$subscription->id] = $this->createConfigurableSubscriptionBlock($subscription);

        return $this->subscriptionBlocks[$subscription->id];
    }

    public function getSubscriptionUpdateOptions(\Stripe\Subscription $subscription)
    {
        $block = $this->getConfigurableSubscriptionBlock($subscription);

        if ($block)
            return $block->toHtml();
        else
            return '';
    }

    public function getConfigurableSubscriptionQty(\Stripe\Subscription $subscription): int
    {
        return $this->subscriptionsHelper->getConfigurableSubscriptionQty($subscription);
    }

    public function getSubscriptionModel(\Stripe\Subscription $subscription): ?\StripeIntegration\Payments\Model\Stripe\Subscription
    {
        if (isset($this->subscriptionModels[$subscription->id]))
            return $this->subscriptionModels[$subscription->id];

        try
        {
            $subscriptionModel = $this->subscriptionFactory->create()->fromSubscription($subscription);
            $this->subscriptionModels[$subscription->id] = $subscriptionModel;
        }
        catch (\Exception $e)
        {
            $this->helper->logError("Could not load subscription model for subscription {$subscription->id}: " . $e->getMessage());
            $this->subscriptionModels[$subscription->id] = null;
        }

        return $this->subscriptionModels[$subscription->id];
    }
}