Skip to content
Code-Schnipsel Gruppen Projekte
Handler.php 11,2 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    namespace QUI\Memberships;
    
    use QUI;
    
    use QUI\CRUD\Factory;
    
    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\Permissions\Permission;
    use QUI\Utils\Grid;
    
    use QUI\Utils\Security\Orthos;
    
    
    class Handler extends Factory
    {
    
        /**
         * quiqqer/memberships permissions
         */
    
        const PERMISSION_CREATE = 'quiqqer.memberships.create';
        const PERMISSION_EDIT = 'quiqqer.memberships.edit';
        const PERMISSION_DELETE = 'quiqqer.memberships.delete';
    
    Patrick Müller's avatar
    Patrick Müller committed
        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
         */
    
    Patrick Müller's avatar
    Patrick Müller committed
        public function createChild($data = []): QUI\CRUD\Child
    
            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();
    
    Patrick Müller's avatar
    Patrick Müller committed
            $groupIds = $data['groupIds'];
    
    
            if (
                empty($groupIds)
    
    Patrick Müller's avatar
    Patrick Müller committed
                || !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
    
            $data['groupIds'] = ',' . implode(',', $groupIds) . ',';
            $data['duration'] = '1-month';
    
            $data['editDate'] = null;
            $data['editUser'] = null;
    
            /** @var Membership $NewMembership */
            $NewMembership = parent::createChild($data);
    
    
            QUI::getEvents()->fireEvent('quiqqerMembershipsCreate', [$NewMembership]);
    
    
        /**
         * @inheritdoc
         * @return string
         */
    
    Patrick Müller's avatar
    Patrick Müller committed
        public function getDataBaseTableName(): string
    
        {
            return 'quiqqer_memberships';
        }
    
        /**
         * @inheritdoc
         * @return string
         */
    
    Patrick Müller's avatar
    Patrick Müller committed
        public function getChildClass(): string
    
        {
            return Membership::class;
        }
    
        /**
         * @inheritdoc
         * @return array
         */
    
    Patrick Müller's avatar
    Patrick Müller committed
        public function getChildAttributes(): array
    
                '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)) {
    
                    $where[] = '(' . implode(' OR ', $whereOr) . ')';
    
                        'value' => '%' . $searchParams['search'] . '%',
                        'type' => \PDO::PARAM_STR
    
            // build WHERE query string
            if (!empty($where)) {
    
                $sql .= " WHERE " . implode(" AND ", $where);
    
            if (!empty($searchParams['sortOn'])) {
    
                $sortOn = Orthos::clear($searchParams['sortOn']);
    
                $order = "ORDER BY " . $sortOn;
    
                if (!empty($searchParams['sortBy'])) {
    
                    $order .= " " . Orthos::clear($searchParams['sortBy']);
    
                } else {
                    $order .= " ASC";
                }
    
    
                $sql .= " " . $order;
    
            if (!empty($gridParams['limit']) && !$countOnly) {
    
                $sql .= " LIMIT " . $gridParams['limit'];
    
            } else {
                if (!$countOnly) {
    
                    $sql .= " LIMIT " . (int)20;
    
            $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 ';
    
    
            $binds = [];
    
    Patrick Müller's avatar
    Patrick Müller committed
    
            foreach ($groupIds as $groupId) {
    
                $whereOr[] = '`groupIds` LIKE :' . $groupId;
    
                    'value' => '%,' . $groupId . ',%',
                    'type' => \PDO::PARAM_INT
    
    Patrick Müller's avatar
    Patrick Müller committed
            }
    
            $sql .= implode(" OR ", $whereOr);
    
    
            $PDO = QUI::getDataBase()->getPDO();
    
    Patrick Müller's avatar
    Patrick Müller committed
            $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();
    
    Patrick Müller's avatar
    Patrick Müller committed
            $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\Field\Field|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\Field\Field|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);
        }
    
    
        /**
         * Check if memberships are linked to contracts
         *
         * @return bool
         */
        public static function isLinkedToContracts()
        {
            try {
                $Conf = QUI::getPackage('quiqqer/memberships')->getConfig();
    
                if ((int)$Conf->get('membershipusers', 'linkWithContracts')) {
                    return true;
                }
            } catch (\Exception $Exception) {
                QUI\System\Log::writeException($Exception);
                return false;
            }
    
            return false;
        }