Skip to content
Code-Schnipsel Gruppen Projekte
Handler.php 7,81 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\Products\MembershipField;
Patrick Müller's avatar
Patrick Müller committed

class Handler extends Factory
{
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
     */
    public function createChild($data = array())
    {
        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)) {
            throw new QUI\Memberships\Exception(array(
                'quiqqer/memberships',
                'exception.handler.no.title'
            ));
        }

        $data['title'] = array();
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)
        ) {
            throw new QUI\Memberships\Exception(array(
                'quiqqer/memberships',
                'exception.handler.no.groups'
            ));
        }

        foreach ($groupIds as $groupId) {
            // check if group exist by getting them
            $Groups->get((int)$groupId);
        }

        $data['groupIds'] = ',' . implode(',', $groupIds) . ',';
        $data['duration'] = '1-month';

        /** @var Membership $NewMembership */
        $NewMembership = parent::createChild($data);
        $NewMembership->createProduct();

        return $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);
    }

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()
    {
        return array(
            'title',
            'description',
            'content',
            'duration',
            'groupIds',
Patrick Müller's avatar
Patrick Müller committed
            'editDate',
            'editUser',

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

            // @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
Patrick Müller's avatar
Patrick Müller committed
     */
    public function search($searchParams, $countOnly = false)
    {
        $memberships = array();
        $Grid        = new Grid($searchParams);
        $gridParams  = $Grid->parseDBParams($searchParams);

        $whereOr = array();

        if (!empty($searchParams['search'])) {
            $search = $searchParams['search'];

            $whereOr['title'] = array(
                'type'  => '%LIKE%',
                'value' => $search
            );

            $whereOr['description'] = array(
                'type'  => '%LIKE%',
                'value' => $search
            );

            $whereOr['content'] = array(
                'type'  => '%LIKE%',
                'value' => $search
            );
        }

        if ($countOnly) {
            $result = QUI::getDataBase()->fetch(array(
                'count'    => 1,
                'from'     => $this->getDataBaseTableName(),
                'where_or' => $whereOr
            ));

            return current(current($result));
        }

        $result = QUI::getDataBase()->fetch(array(
            'select'   => array(
                'id'
            ),
            'from'     => $this->getDataBaseTableName(),
            'where_or' => $whereOr,
            'limit'    => $gridParams['limit']
        ));

        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)
Patrick Müller's avatar
Patrick Müller committed
    {
        $ids = array();

        if (empty($groupIds)) {
            return $ids;
        }

Patrick Müller's avatar
Patrick Müller committed
        $sql = 'SELECT `id` FROM ' . self::getDataBaseTableName();
        $sql .= ' WHERE ';

        $whereOr = array();
        $binds   = array();

        foreach ($groupIds as $groupId) {
            $whereOr[]       = '`groupIds` LIKE :' . $groupId;
Patrick Müller's avatar
Patrick Müller committed
            $binds[$groupId] = array(
                'value' => '%,' . $groupId . ',%',
                'type'  => \PDO::PARAM_INT
            );
        }

        $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']);
        }

        try {
            $Stmt->execute();
            $result = $Stmt->fetchAll(\PDO::FETCH_ASSOC);
        } catch (\Exception $Exception) {
            QUI\System\Log::writeException($Exception);
            return array();
        }
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) {
            QUI\System\Log::addError(self::class . ' :: getProductCategory()');
            QUI\System\Log::writeException($Exception);

            return false;
        }
    }

    /**
     * Require: quiqqer/products
     *
     * Get quiqqer/products membership Field
     *
     * @return QUI\ERP\Products\Interfaces\FieldInterface|false
     */
    public static function getProductField()
    {
        try {
            return ProductFields::getField(MembershipField::FIELD_ID);
        } catch (\Exception $Exception) {
            QUI\System\Log::addError(self::class . ' :: getProductField()');
            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);
    }