Skip to content
Code-Schnipsel Gruppen Projekte
Discount.php 10,4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henning Leutz's avatar
    Henning Leutz committed
    <?php
    
    /**
     * This file contains QUI\ERP\Discount\Discount
     */
    namespace QUI\ERP\Discount;
    
    use QUI;
    
    Henning Leutz's avatar
    Henning Leutz committed
    use QUI\Users\User;
    
    use QUI\Permissions\Permission;
    
    Henning Leutz's avatar
    Henning Leutz committed
    use QUI\Utils\Security\Orthos;
    
    use QUI\ERP\Products\Utils\Calc;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
    use QUI\ERP\Areas\Utils as AreaUtils;
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    /**
     * Class Discount
     * @package QUI\ERP\Discount
     */
    class Discount extends QUI\CRUD\Child
    {
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
         * Discount constructor.
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param int $id
         * @param Handler $Factory
         */
        public function __construct($id, Handler $Factory)
        {
            parent::__construct($id, $Factory);
    
    
    
            // attributes
            switch ($this->getAttribute('discount_type')) {
                case Handler::DISCOUNT_TYPE_CURRENCY:
                case Handler::DISCOUNT_TYPE_PERCENT:
                    break;
    
                default:
                    $this->setAttribute('discount_type', Handler::DISCOUNT_TYPE_PERCENT);
                    break;
            }
    
    
            $scope = (int)$this->getAttribute('scope');
    
            switch ($scope) {
                case Handler::DISCOUNT_SCOPE_EVERY_PRODUCT:
                case Handler::DISCOUNT_SCOPE_TOTAL:
                case Handler::DISCOUNT_SCOPE_UNIQUE:
                    $this->setAttribute('scope', $scope);
                    break;
    
                default:
                    $this->setAttribute('scope', 0);
            }
    
    
            // cleanup user group save
            $cleanup = QUI\Utils\ArrayHelper::cleanup($this->getAttribute('user_groups'));
            $cleanup = implode(',', $cleanup);
    
            if (!empty($cleanup)) {
                $cleanup = ',' . $cleanup . ',';
            }
    
            $this->setAttribute('user_groups', $cleanup);
    
    
            // cleanup product(s)
            $cleanup = QUI\Utils\ArrayHelper::cleanup($this->getAttribute('articles'));
            $cleanup = implode(',', $cleanup);
    
            if (!empty($cleanup)) {
                $cleanup = ',' . $cleanup . ',';
            }
    
            $this->setAttribute('articles', $cleanup);
    
    
            // cleanup user group save
            $cleanup = QUI\Utils\ArrayHelper::cleanup($this->getAttribute('user_groups'));
            $cleanup = implode(',', $cleanup);
    
            if (!empty($cleanup)) {
                $cleanup = ',' . $cleanup . ',';
            }
    
            $this->setAttribute('user_groups', $cleanup);
    
    
            // cleanup product(s)
            $cleanup = QUI\Utils\ArrayHelper::cleanup($this->getAttribute('articles'));
            $cleanup = implode(',', $cleanup);
    
            if (!empty($cleanup)) {
                $cleanup = ',' . $cleanup . ',';
            }
    
            $this->setAttribute('articles', $cleanup);
    
    
    
            // events
    
    Henning Leutz's avatar
    Henning Leutz committed
            $this->Events->addEvent('onDeleteBegin', function () {
                Permission::checkPermission('quiqqer.areas.area.delete');
            });
    
            $this->Events->addEvent('onDeleteEnd', function () {
                QUI\Translator::delete(
                    'quiqqer/discount',
                    'discount.' . $this->getId() . '.title'
                );
            });
    
            $this->Events->addEvent('onSaveBegin', function () {
                Permission::checkPermission('quiqqer.areas.area.edit');
    
                if ($this->getAttribute('date_from')
                    && !Orthos::checkMySqlDatetimeSyntax($this->getAttribute('date_from'))
                ) {
    
                    throw new QUI\ERP\Discount\Exception(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'quiqqer/discount',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'exception.discount.date_from.wrong'
    
    Henning Leutz's avatar
    Henning Leutz committed
                    ));
                }
    
                if ($this->getAttribute('date_until')
                    && !Orthos::checkMySqlDatetimeSyntax($this->getAttribute('date_until'))
                ) {
    
                    throw new QUI\ERP\Discount\Exception(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'quiqqer/discount',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'exception.discount.date_until.wrong'
    
    Henning Leutz's avatar
    Henning Leutz committed
                $purchaseQuantityFrom  = $this->getAttribute('purchase_quantity_from');
                $purchaseQuantityUntil = $this->getAttribute('purchase_quantity_until');
                $purchaseValueFrom     = $this->getAttribute('purchase_value_from');
                $purchaseValueUntil    = $this->getAttribute('purchase_value_until');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                if ($purchaseQuantityFrom === false
                    || $purchaseQuantityFrom < 0
                ) {
    
                    throw new QUI\ERP\Discount\Exception(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'quiqqer/discount',
                        'exception.discount.purchase_quantity_from.wrong'
                    ));
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                if ($purchaseQuantityUntil === false
                    || $purchaseQuantityUntil < 0
                ) {
    
                    throw new QUI\ERP\Discount\Exception(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'quiqqer/discount',
                        'exception.discount.purchase_quantity_until.wrong'
                    ));
                }
    
                if ($purchaseValueFrom === false
                    || $purchaseValueFrom < 0
                ) {
    
                    throw new QUI\ERP\Discount\Exception(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'quiqqer/discount',
                        'exception.discount.purchase_value_from.wrong'
                    ));
                }
    
                if ($purchaseValueUntil === false
                    || $purchaseValueUntil < 0
                ) {
    
                    throw new QUI\ERP\Discount\Exception(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'quiqqer/discount',
                        'exception.discount.purchase_value_until.wrong'
                    ));
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
         * Return the discount title
         *
         * @param null|QUI\Locale $Locale - optional, locale object
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return string
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function getTitle($Locale = null)
    
    Henning Leutz's avatar
    Henning Leutz committed
            if (!$Locale) {
                $Locale = QUI::getLocale();
            }
    
            return $Locale->get(
    
    Henning Leutz's avatar
    Henning Leutz committed
                'quiqqer/discount',
                'discount.' . $this->getId() . '.title'
            );
        }
    
        /**
         * Return the discount status
         *
         * @return boolean
         */
        public function isActive()
        {
            return $this->getAttribute('active') ? true : false;
        }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
        /**
         * Is the discount combinable with another discount?
         *
         * @param Discount $Discount
         * @return bool
         */
        public function canCombinedWith(Discount $Discount)
        {
            $combine = $this->getAttribute('combine');
    
            if (empty($combine)) {
                return false;
            }
    
            $combine = implode($combine, ',');
    
            if (!is_array($combine)) {
                return false;
            }
    
            foreach ($combine as $combineId) {
                if ($Discount->getId() == $combineId) {
                    return true;
                }
            }
    
            return false;
        }
    
        /**
         * is the user allowed to use the discount
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param QUI\Interfaces\Users\User $User
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @return boolean
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function canUsedBy(QUI\Interfaces\Users\User $User)
    
    Henning Leutz's avatar
    Henning Leutz committed
            if ($this->isActive() === false) {
                return false;
            }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            $userGroupValue = $this->getAttribute('user_groups');
            $areasValue     = $this->getAttribute('areas');
    
            // if groups and areas are empty, everbody is allowed
            if (empty($userGroupValue) && empty($areasValue)) {
                return true;
            }
    
            // not in area
            if (!empty($areasValue) && !AreaUtils::isUserInAreas($User, $areasValue)) {
                return false;
            }
    
    
            $userGroups = QUI\Utils\UserGroups::parseUsersGroupsString(
    
    Henning Leutz's avatar
    Henning Leutz committed
                $this->getAttribute('user_groups')
            );
    
            $discountUsers  = $userGroups['users'];
            $discountGroups = $userGroups['groups'];
    
            // user checking
            foreach ($discountUsers as $uid) {
                if ($User->getId() == $uid) {
                    return true;
                }
            }
    
            // group checking
            $groupsOfUser = $User->getGroups();
    
            /* @var $Group QUI\Groups\Group */
            foreach ($discountGroups as $gid) {
                foreach ($groupsOfUser as $Group) {
                    if ($Group->getId() == $gid) {
                        return true;
                    }
                }
            }
    
            return false;
        }
    
        /**
         * Verify the combination between the discounts
         *
         * @param Discount $Discount
    
         * @throws QUI\ERP\Discount\Exception
    
    Henning Leutz's avatar
    Henning Leutz committed
         */
        public function verifyCombinationWith(Discount $Discount)
        {
            if ($this->canCombinedWith($Discount) === false) {
    
                throw new QUI\ERP\Discount\Exception(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'quiqqer/discount',
                    'exception.discount.not.combinable',
                    array(
    
                        'id'         => $this->getId(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'discountId' => $Discount->getId()
                    )
                ));
            }
        }
    
        /**
         * Verify the usage of the discount by the user
         *
         * @param User $User
    
         * @throws QUI\ERP\Discount\Exception
    
    Henning Leutz's avatar
    Henning Leutz committed
         */
        public function verifyUser(User $User)
        {
            if ($this->canUsedBy($User) === false) {
    
                throw new QUI\ERP\Discount\Exception(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'quiqqer/discount',
                    'exception.discount.user.cant.use.discount',
                    array(
    
                        'id'     => $this->getId(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                        'userId' => $User->getId()
                    )
                ));
            }
        }
    
    
        /**
         * Parse the discount to a price factor
         *
    
    Henning Leutz's avatar
    Henning Leutz committed
         * @param null|QUI\Locale $Locale - optional, locale object
    
         * @return QUI\ERP\Products\Utils\PriceFactor
         */
    
    Henning Leutz's avatar
    Henning Leutz committed
        public function toPriceFactor($Locale = null)
    
        {
            switch ($this->getAttribute('discount_type')) {
                case Calc::CALCULATION_PERCENTAGE:
                    $calculation = Calc::CALCULATION_PERCENTAGE;
                    break;
    
                default:
                case Calc::CALCULATION_COMPLEMENT:
                    $calculation = Calc::CALCULATION_COMPLEMENT;
                    break;
            }
    
            switch ($this->getAttribute('price_calculation_basis')) {
                case Calc::CALCULATION_BASIS_NETTO:
                    $basis = Calc::CALCULATION_BASIS_NETTO;
                    break;
    
                default:
                    $basis = Calc::CALCULATION_BASIS_CURRENTPRICE;
            }
    
    
            $Plugin = QUI::getPackage('quiqqer/products');
            $Config = $Plugin->getConfig();
    
            $hideDiscounts = (int)$Config->getValue('products', 'hideDiscounts');
    
    
            return new QUI\ERP\Products\Utils\PriceFactor(array(
    
    Henning Leutz's avatar
    Henning Leutz committed
                'title'       => $this->getTitle($Locale),
    
                'description' => '',
                'priority'    => (int)$this->getAttribute('priority'),
                'calculation' => $calculation,
                'basis'       => $basis,
    
                'value'       => $this->getAttribute('discount') * -1,
                'visible'     => $hideDiscounts ? false : true
    
    Henning Leutz's avatar
    Henning Leutz committed
    }