vendor/pimcore/pimcore/bundles/EcommerceFrameworkBundle/Model/AbstractProduct.php line 194

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Bundle\EcommerceFrameworkBundle\Model;
  15. use Pimcore\Bundle\EcommerceFrameworkBundle\AvailabilitySystem\AvailabilityInterface;
  16. use Pimcore\Bundle\EcommerceFrameworkBundle\AvailabilitySystem\AvailabilitySystemInterface;
  17. use Pimcore\Bundle\EcommerceFrameworkBundle\Exception\UnsupportedException;
  18. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  19. use Pimcore\Bundle\EcommerceFrameworkBundle\PriceSystem\PriceInfoInterface;
  20. use Pimcore\Bundle\EcommerceFrameworkBundle\PriceSystem\PriceInterface;
  21. use Pimcore\Bundle\EcommerceFrameworkBundle\PriceSystem\PriceSystemInterface;
  22. use Pimcore\Model\DataObject\Concrete;
  23. /**
  24.  * Abstract base class for pimcore objects who should be used as products in the online shop framework
  25.  */
  26. class AbstractProduct extends Concrete implements ProductInterfaceIndexableInterfaceCheckoutableInterface
  27. {
  28.     // =============================================
  29.     //     IndexableInterface Methods
  30.     //  =============================================
  31.     /**
  32.      * defines if product is included into the product index. If false, product doesn't appear in product index.
  33.      *
  34.      * @return bool
  35.      */
  36.     public function getOSDoIndexProduct(): bool
  37.     {
  38.         return true;
  39.     }
  40.     /**
  41.      * returns if product is active.
  42.      * there should either be a attribute in pro product object or
  43.      * it should be overwritten in mapped sub classes of product classes in case of multiple criteria for product active state
  44.      *
  45.      * @param bool $inProductList
  46.      *
  47.      * @throws UnsupportedException
  48.      *
  49.      * @return bool
  50.      */
  51.     public function isActive(bool $inProductList false): bool
  52.     {
  53.         throw new UnsupportedException('isActive is not supported for ' get_class($this));
  54.     }
  55.     /**
  56.      * defines the name of the price system for this product.
  57.      * there should either be a attribute in pro product object or
  58.      * it should be overwritten in mapped sub classes of product classes
  59.      *
  60.      * @throws UnsupportedException
  61.      *
  62.      * @return string|null
  63.      */
  64.     public function getPriceSystemName(): ?string
  65.     {
  66.         throw new UnsupportedException('getPriceSystemName is not supported for ' get_class($this));
  67.     }
  68.     /**
  69.      * returns product type for product index (either object or variant).
  70.      * by default it returns type of object, but it may be overwritten if necessary.
  71.      *
  72.      * @return string|null
  73.      */
  74.     public function getOSIndexType(): ?string
  75.     {
  76.         return $this->getType();
  77.     }
  78.     /**
  79.      * returns parent id for product index.
  80.      * by default it returns id of parent object, but it may be overwritten if necessary.
  81.      *
  82.      * @return int|null
  83.      */
  84.     public function getOSParentId()
  85.     {
  86.         return $this->getParentId();
  87.     }
  88.     /**
  89.      * returns array of categories.
  90.      * has to be overwritten either in pimcore object or mapped sub class.
  91.      *
  92.      * @throws UnsupportedException
  93.      *
  94.      * @return array|null
  95.      */
  96.     public function getCategories(): ?array
  97.     {
  98.         throw new UnsupportedException('getCategories is not supported for ' get_class($this));
  99.     }
  100.     // =============================================
  101.     //     CheckoutableInterface Methods
  102.     //  =============================================
  103.     /**
  104.      * called by default CommitOrderProcessor to get the product name to store it in the order item
  105.      * should be overwritten in mapped sub classes of product classes
  106.      *
  107.      * @throws UnsupportedException
  108.      *
  109.      * @return string|null
  110.      */
  111.     public function getOSName(): ?string
  112.     {
  113.         throw new UnsupportedException('getOSName is not supported for ' get_class($this));
  114.     }
  115.     /**
  116.      * called by default CommitOrderProcessor to get the product number to store it in the order item
  117.      * should be overwritten in mapped sub classes of product classes
  118.      *
  119.      * @throws UnsupportedException
  120.      *
  121.      * @return string|null
  122.      */
  123.     public function getOSProductNumber(): ?string
  124.     {
  125.         throw new UnsupportedException('getOSProductNumber is not supported for ' get_class($this));
  126.     }
  127.     /**
  128.      * defines the name of the availability system for this product.
  129.      * there should either be a attribute in pro product object or
  130.      * it should be overwritten in mapped sub classes of product classes
  131.      *
  132.      * @return string|null
  133.      */
  134.     public function getAvailabilitySystemName(): ?string
  135.     {
  136.         return 'default';
  137.     }
  138.     /**
  139.      * checks if product is bookable
  140.      * default implementation checks if there is a price available and of the product is active.
  141.      * may be overwritten in subclasses for additional logic
  142.      *
  143.      * @return bool
  144.      */
  145.     public function getOSIsBookable($quantityScale 1): bool
  146.     {
  147.         $price $this->getOSPrice($quantityScale);
  148.         return !empty($price) && $this->isActive();
  149.     }
  150.     /**
  151.      * returns instance of price system implementation based on result of getPriceSystemName()
  152.      *
  153.      * @return PriceSystemInterface|null
  154.      */
  155.     public function getPriceSystemImplementation(): ?PriceSystemInterface
  156.     {
  157.         return Factory::getInstance()->getPriceSystem($this->getPriceSystemName());
  158.     }
  159.     /**
  160.      * returns instance of availability system implementation based on result of getAvailabilitySystemName()
  161.      *
  162.      * @return AvailabilitySystemInterface|null
  163.      */
  164.     public function getAvailabilitySystemImplementation(): ?AvailabilitySystemInterface
  165.     {
  166.         return Factory::getInstance()->getAvailabilitySystem($this->getAvailabilitySystemName());
  167.     }
  168.     /**
  169.      * returns price for given quantity scale
  170.      *
  171.      * @param int $quantityScale
  172.      *
  173.      * @return PriceInterface|null
  174.      */
  175.     public function getOSPrice($quantityScale 1): ?PriceInterface
  176.     {
  177.         return $this->getOSPriceInfo($quantityScale)->getPrice();
  178.     }
  179.     /**
  180.      * returns price info for given quantity scale.
  181.      * price info might contain price and additional information for prices like discounts, ...
  182.      *
  183.      * @param int $quantityScale
  184.      *
  185.      * @return PriceInfoInterface|null
  186.      */
  187.     public function getOSPriceInfo($quantityScale 1): ?PriceInfoInterface
  188.     {
  189.         return $this->getPriceSystemImplementation()->getPriceInfo($this$quantityScale);
  190.     }
  191.     /**
  192.      * returns availability info based on given quantity
  193.      *
  194.      * @param int $quantity
  195.      *
  196.      * @return AvailabilityInterface|null
  197.      */
  198.     public function getOSAvailabilityInfo($quantity null): ?AvailabilityInterface
  199.     {
  200.         return $this->getAvailabilitySystemImplementation()->getAvailabilityInfo($this$quantity);
  201.     }
  202. }