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;
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;
Patrick Müller's avatar
Patrick Müller committed

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
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();
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]);

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

    /**
     * @inheritdoc
     * @return string
     */
Patrick Müller's avatar
Patrick Müller committed
    public function getChildClass(): string
Patrick Müller's avatar
Patrick Müller committed
    {
        return Membership::class;
    }

    /**
     * @inheritdoc
     * @return array
     */
Patrick Müller's avatar
Patrick Müller committed
    public function getChildAttributes(): array
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)
    {
        $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));
        }
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 ';

        $binds = [];
Patrick Müller's avatar
Patrick Müller committed

        foreach ($groupIds as $groupId) {
            $bindParam = md5($groupId);
            $whereOr[] = '`groupIds` LIKE :' . $bindParam;
            $binds[$bindParam] = [
                'value' => '%,' . $groupId . ',%',
                'type' => \PDO::PARAM_STR
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;
    }