Skip to content
Code-Schnipsel Gruppen Projekte
Handler.php 11,2 KiB
Newer Older
Patrick Müller's avatar
Patrick Müller committed
<?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;
Patrick Müller's avatar
Patrick Müller committed

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
     */
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);

        QUI::getEvents()->fireEvent('quiqqerMembershipsCreate', [$NewMembership]);

Patrick Müller's avatar
Patrick Müller committed
    /**
     * @inheritdoc
     * @return string
     */
    public function getDataBaseTableName()
    {
        return 'quiqqer_memberships';
    }

    /**
     * @inheritdoc
     * @return string
     */
    public function getChildClass()
    {
        return Membership::class;
    }

    /**
     * @inheritdoc
     * @return array
     */
    public function getChildAttributes()
    {
Patrick Müller's avatar
Patrick Müller committed
            'title',
            'description',
            'content',
            'duration',
            'groupIds',
Patrick Müller's avatar
Patrick Müller committed
            'editDate',
            'editUser',
Patrick Müller's avatar
Patrick Müller committed

            // these fields require quiqqer/order
Patrick Müller's avatar
Patrick Müller committed

            // @todo additional fields for quiqqer/contracts
Patrick Müller's avatar
Patrick Müller committed
    }

    /**
     * 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
Patrick Müller's avatar
Patrick Müller committed
     */
    public function search($searchParams, $countOnly = false)
    {
Patrick Müller's avatar
Patrick Müller committed
        $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));
        }
Patrick Müller's avatar
Patrick Müller committed

        foreach ($result as $row) {
Patrick Müller's avatar
Patrick Müller committed
            $memberships[] = $row['id'];
Patrick Müller's avatar
Patrick Müller committed
        }

        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\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;
    }