Skip to content
Code-Schnipsel Gruppen Projekte
Handler.php 10,9 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    namespace QUI\Memberships;
    
    use QUI\CRUD\Factory;
    use QUI\Utils\Grid;
    use QUI;
    
    use QUI\Permissions\Permission;
    
    Patrick Müller's avatar
    Patrick Müller committed
    use QUI\ERP\Products\Handler\Categories as ProductCategories;
    
    use QUI\ERP\Products\Handler\Fields as ProductFields;
    
    use QUI\Memberships\Users\Handler as MembershipUsersHandler;
    use QUI\Utils\Security\Orthos;
    
    
    class Handler extends Factory
    {
    
        /**
         * quiqqer/memberships permissions
         */
    
    Patrick Müller's avatar
    Patrick Müller committed
        const PERMISSION_CREATE     = 'quiqqer.memberships.create';
        const PERMISSION_EDIT       = 'quiqqer.memberships.edit';
        const PERMISSION_DELETE     = 'quiqqer.memberships.delete';
        const PERMISSION_FORCE_EDIT = 'quiqqer.memberships.force_edit';
    
    
    Patrick Müller's avatar
    Patrick Müller committed
        /**
         * @inheritdoc
    
    Patrick Müller's avatar
    Patrick Müller committed
         * @throws QUI\Memberships\Exception
    
    Patrick Müller's avatar
    Patrick Müller committed
         */
    
            Permission::checkPermission(self::PERMISSION_CREATE);
    
    
    Patrick Müller's avatar
    Patrick Müller committed
            $data['createDate'] = Utils::getFormattedTimestamp();
    
    Patrick Müller's avatar
    Patrick Müller committed
            $data['createUser'] = QUI::getUserBySession()->getId();
    
    Patrick Müller's avatar
    Patrick Müller committed
    
            // title
            $title = trim($data['title']);
    
            if (empty($title)) {
    
    Patrick Müller's avatar
    Patrick Müller committed
                    'quiqqer/memberships',
                    'exception.handler.no.title'
    
    Patrick Müller's avatar
    Patrick Müller committed
    
            foreach (QUI::availableLanguages() as $lang) {
                $data['title'][$lang] = $title;
            }
    
            $data['title'] = json_encode($data['title']);
    
    
    Patrick Müller's avatar
    Patrick Müller committed
            // groupIds
            $Groups   = QUI::getGroups();
            $groupIds = $data['groupIds'];
    
            if (empty($groupIds)
                || !is_array($groupIds)
            ) {
    
    Patrick Müller's avatar
    Patrick Müller committed
                    'quiqqer/memberships',
                    'exception.handler.no.groups'
    
    Patrick Müller's avatar
    Patrick Müller committed
            }
    
            foreach ($groupIds as $groupId) {
                // check if group exist by getting them
                $Groups->get((int)$groupId);
            }
    
    
            $data['groupIds']   = ','.implode(',', $groupIds).',';
            $data['duration']   = '1-month';
            $data['autoExtend'] = 0;
            $data['editDate']   = null;
            $data['editUser']   = null;
    
            /** @var Membership $NewMembership */
            $NewMembership = parent::createChild($data);
            $NewMembership->createProduct();
    
    
            QUI::getEvents()->fireEvent('quiqqerMembershipsCreate', [$NewMembership]);
    
    
    Patrick Müller's avatar
    Patrick Müller committed
        /**
         * Get membership
         *
         * @param int $id
         * @return Membership
         */
        public function getChild($id)
        {
            return parent::getChild($id);
        }
    
    
        /**
         * @inheritdoc
         * @return string
         */
        public function getDataBaseTableName()
        {
            return 'quiqqer_memberships';
        }
    
        /**
         * @inheritdoc
         * @return string
         */
        public function getChildClass()
        {
            return Membership::class;
        }
    
        /**
         * @inheritdoc
         * @return array
         */
        public function getChildAttributes()
        {
    
                'title',
                'description',
                'content',
                'duration',
                'groupIds',
    
                'editDate',
                'editUser',
    
    
                // these fields require quiqqer/order
    
    
                // @todo additional fields for quiqqer/contracts
    
        }
    
        /**
         * Search memberships
         *
         * @param array $searchParams
         * @param bool $countOnly (optional) - get count for search result only [default: false]
    
    Patrick Müller's avatar
    Patrick Müller committed
         * @return array - membership IDs
    
         */
        public function search($searchParams, $countOnly = false)
        {
    
            $Grid        = new Grid($searchParams);
            $gridParams  = $Grid->parseDBParams($searchParams);
    
    
            if ($countOnly) {
                $sql = "SELECT COUNT(*)";
            } else {
                $sql = "SELECT id";
            }
    
            $sql .= " FROM `".$this->getDataBaseTableName()."`";
    
            if (!empty($searchParams['userId'])) {
                $memberhsipUsers = MembershipUsersHandler::getInstance()->getMembershipUsersByUserId(
                    (int)$searchParams['userId']
    
    
                /** @var QUI\Memberships\Users\MembershipUser $MembershipUser */
                foreach ($memberhsipUsers as $MembershipUser) {
                    $membershipIds[] = $MembershipUser->getMembership()->getId();
                }
    
                if (!empty($membershipIds)) {
    
                    $where[] = '`id` IN ('.implode(',', $membershipIds).')';
    
                }
            }
    
            if (!empty($searchParams['search'])) {
    
                    'title',
                    'description',
                    'content'
    
    
                foreach ($searchColumns as $searchColumn) {
    
                    $whereOr[] = '`'.$searchColumn.'` LIKE :search';
    
                }
    
                if (!empty($whereOr)) {
    
                    $binds['search'] = [
                        'value' => '%'.$searchParams['search'].'%',
    
                        'type'  => \PDO::PARAM_STR
    
            // build WHERE query string
            if (!empty($where)) {
    
            }
    
            // ORDER
            if (!empty($searchParams['sortOn'])
            ) {
                $sortOn = Orthos::clear($searchParams['sortOn']);
    
    
                if (isset($searchParams['sortBy']) &&
                    !empty($searchParams['sortBy'])
                ) {
    
                    $order .= " ".Orthos::clear($searchParams['sortBy']);
    
                } else {
                    $order .= " ASC";
                }
    
    
            }
    
            // LIMIT
            if (!empty($gridParams['limit'])
                && !$countOnly
            ) {
    
            } else {
                if (!$countOnly) {
    
            $Stmt = QUI::getPDO()->prepare($sql);
    
            // bind search values
            foreach ($binds as $var => $bind) {
    
                $Stmt->bindValue(':'.$var, $bind['value'], $bind['type']);
    
            try {
                $Stmt->execute();
                $result = $Stmt->fetchAll(\PDO::FETCH_ASSOC);
            } catch (\Exception $Exception) {
                QUI\System\Log::addError(
    
                    self::class.' :: searchUsers() -> '.$Exception->getMessage()
    
            }
    
            if ($countOnly) {
                return (int)current(current($result));
            }
    
    
            foreach ($result as $row) {
    
    Patrick Müller's avatar
    Patrick Müller committed
                $memberships[] = $row['id'];
    
            }
    
            return $memberships;
        }
    
    Patrick Müller's avatar
    Patrick Müller committed
        /**
    
    Patrick Müller's avatar
    Patrick Müller committed
         * Get IDs of all memberships that have specific groups assigned (OR)
    
    Patrick Müller's avatar
    Patrick Müller committed
         * @param array $groupIds
    
    Patrick Müller's avatar
    Patrick Müller committed
         * @return int[]
         */
    
    Patrick Müller's avatar
    Patrick Müller committed
        public function getMembershipIdsByGroupIds($groupIds)
    
            if (empty($groupIds)) {
                return $ids;
            }
    
    
            $sql = 'SELECT `id` FROM '.self::getDataBaseTableName();
    
    Patrick Müller's avatar
    Patrick Müller committed
            $sql .= ' WHERE ';
    
    
    Patrick Müller's avatar
    Patrick Müller committed
    
            foreach ($groupIds as $groupId) {
    
                $whereOr[]       = '`groupIds` LIKE :'.$groupId;
                $binds[$groupId] = [
                    'value' => '%,'.$groupId.',%',
    
    Patrick Müller's avatar
    Patrick Müller committed
                    'type'  => \PDO::PARAM_INT
    
    Patrick Müller's avatar
    Patrick Müller committed
            }
    
            $sql .= implode(" OR ", $whereOr);
    
            $PDO  = QUI::getDataBase()->getPDO();
            $Stmt = $PDO->prepare($sql);
    
            // bind search values
            foreach ($binds as $var => $bind) {
    
                $Stmt->bindValue(':'.$var, $bind['value'], $bind['type']);
    
    Patrick Müller's avatar
    Patrick Müller committed
            }
    
            try {
                $Stmt->execute();
                $result = $Stmt->fetchAll(\PDO::FETCH_ASSOC);
            } catch (\Exception $Exception) {
                QUI\System\Log::writeException($Exception);
    
    Patrick Müller's avatar
    Patrick Müller committed
    
            foreach ($result as $row) {
                $ids[] = $row['id'];
    
    Patrick Müller's avatar
    Patrick Müller committed
            return $ids;
    
    
        /**
         * Get config entry for a membership setting
         *
         * @param string $key
         * @return mixed
         */
        public static function getSetting($key)
        {
            $Config = QUI::getPackage('quiqqer/memberships')->getConfig();
            return $Config->get('memberships', $key);
        }
    
         * Requires: quiqqer/products
    
    Patrick Müller's avatar
    Patrick Müller committed
         *
         * Get Memberships product category
         *
         * @return QUI\ERP\Products\Interfaces\CategoryInterface|false
         */
        public static function getProductCategory()
        {
            $Conf       = QUI::getPackage('quiqqer/memberships')->getConfig();
            $categoryId = $Conf->get('products', 'categoryId');
    
            if (empty($categoryId)) {
                return false;
            }
    
            try {
                return ProductCategories::getCategory((int)$categoryId);
            } catch (\Exception $Exception) {
    
                if ($Exception->getCode() !== 404) {
    
                    QUI\System\Log::addError(self::class.' :: getProductCategory()');
    
                    QUI\System\Log::writeException($Exception);
                }
    
    Patrick Müller's avatar
    Patrick Müller committed
    
                return false;
            }
        }
    
    
        /**
         * Require: quiqqer/products
         *
         * Get quiqqer/products membership Field
         *
         * @return QUI\ERP\Products\Interfaces\FieldInterface|false
         */
    
        public static function getProductMembershipField()
    
            if (!Utils::isQuiqqerProductsInstalled()) {
                return false;
            }
    
            try {
    
                $Conf    = QUI::getPackage('quiqqer/memberships')->getConfig();
                $fieldId = $Conf->get('products', 'membershipFieldId');
    
                if (empty($fieldId)) {
                    return false;
                }
    
                return ProductFields::getField($fieldId);
    
            } catch (\Exception $Exception) {
                QUI\System\Log::writeException($Exception);
                return false;
            }
        }
    
        /**
         * Require: quiqqer/products
         *
         * Get quiqqer/products membership flag Field
         *
         * @return QUI\ERP\Products\Interfaces\FieldInterface|false
         */
        public static function getProductMembershipFlagField()
        {
            if (!Utils::isQuiqqerProductsInstalled()) {
                return false;
            }
    
    
                $Conf    = QUI::getPackage('quiqqer/memberships')->getConfig();
                $fieldId = $Conf->get('products', 'membershipFlagFieldId');
    
                if (empty($fieldId)) {
                    return false;
                }
    
                return ProductFields::getField($fieldId);
    
            } catch (\Exception $Exception) {
                QUI\System\Log::writeException($Exception);
                return false;
            }
        }
    
    
        /**
         * Get the default membership
         *
         * @return Membership|false - Membership or false if none set
         */
        public static function getDefaultMembership()
        {
            $membershipId = self::getSetting('defaultMembershipId');
    
            if (empty($membershipId)) {
                return false;
            }
    
            return self::getInstance()->getChild((int)$membershipId);
        }