Newer
Older
<?php
namespace QUI\Memberships;
use QUI;
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;
/**
* quiqqer/memberships permissions
*/
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';
public function createChild($data = []): QUI\CRUD\Child
Permission::checkPermission(self::PERMISSION_CREATE);
$data['createDate'] = Utils::getFormattedTimestamp();
$data['createUser'] = QUI::getUserBySession()->getId();
// title
$title = trim($data['title']);
if (empty($title)) {

Patrick Müller
committed
throw new QUI\Memberships\Exception([
'quiqqer/memberships',
'exception.handler.no.title'

Patrick Müller
committed
]);

Patrick Müller
committed
$data['title'] = [];
foreach (QUI::availableLanguages() as $lang) {
$data['title'][$lang] = $title;
}
$data['title'] = json_encode($data['title']);

Patrick Müller
committed
throw new QUI\Memberships\Exception([
'quiqqer/memberships',
'exception.handler.no.groups'

Patrick Müller
committed
]);
}
foreach ($groupIds as $groupId) {
// check if group exist by getting them
$Groups->get($groupId);
$data['groupIds'] = ',' . implode(',', $groupIds) . ',';
$data['duration'] = '1-month';

Patrick Müller
committed
$data['autoExtend'] = 0;
$data['editDate'] = null;
$data['editUser'] = null;
/** @var Membership $NewMembership */
$NewMembership = parent::createChild($data);

Patrick Müller
committed
QUI::getEvents()->fireEvent('quiqqerMembershipsCreate', [$NewMembership]);
return $NewMembership;
{
return 'quiqqer_memberships';
}
/**
* @inheritdoc
* @return string
*/
{
return Membership::class;
}
/**
* @inheritdoc
* @return array
*/

Patrick Müller
committed
return [
'title',
'description',
'content',
'duration',
'groupIds',

Patrick Müller
committed
'createDate',
'createUser',

Patrick Müller
committed
'paymentInterval'
// @todo additional fields for quiqqer/contracts

Patrick Müller
committed
];
}
/**
* Search memberships
*
* @param array $searchParams
* @param bool $countOnly (optional) - get count for search result only [default: false]
*/
public function search($searchParams, $countOnly = false)
{

Patrick Müller
committed
$memberships = [];
$Grid = new Grid($searchParams);
$gridParams = $Grid->parseDBParams($searchParams);

Patrick Müller
committed
$binds = [];
$where = [];
if ($countOnly) {
$sql = "SELECT COUNT(*)";
} else {
$sql = "SELECT id";
}
$sql .= " FROM `" . $this->getDataBaseTableName() . "`";
if (!empty($searchParams['userId'])) {
$memberhsipUsers = MembershipUsersHandler::getInstance()->getMembershipUsersByUserId(
(int)$searchParams['userId']

Patrick Müller
committed
$membershipIds = [];
/** @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'])) {

Patrick Müller
committed
$searchColumns = [
'title',
'description',
'content'

Patrick Müller
committed
];

Patrick Müller
committed
$whereOr = [];
foreach ($searchColumns as $searchColumn) {
$whereOr[] = '`' . $searchColumn . '` LIKE :search';
}
if (!empty($whereOr)) {
$where[] = '(' . implode(' OR ', $whereOr) . ')';

Patrick Müller
committed
$binds['search'] = [
'value' => '%' . $searchParams['search'] . '%',
'type' => \PDO::PARAM_STR

Patrick Müller
committed
];
// build WHERE query string
if (!empty($where)) {
$sql .= " WHERE " . implode(" AND ", $where);
$sortOn = Orthos::clear($searchParams['sortOn']);
$order .= " " . Orthos::clear($searchParams['sortBy']);
} else {
$order .= " ASC";
}
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()

Patrick Müller
committed
return [];
}
if ($countOnly) {
return (int)current(current($result));
}
* Get IDs of all memberships that have specific groups assigned (OR)
public function getMembershipIdsByGroupIds($groupIds)

Patrick Müller
committed
$ids = [];
if (empty($groupIds)) {
return $ids;
}
$sql = 'SELECT `id` FROM ' . self::getDataBaseTableName();

Patrick Müller
committed
$whereOr = [];
$bindParam = md5($groupId);
$whereOr[] = '`groupIds` LIKE :' . $bindParam;
$binds[$bindParam] = [
'type' => \PDO::PARAM_STR

Patrick Müller
committed
];
$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);

Patrick Müller
committed
return [];
foreach ($result as $row) {
$ids[] = $row['id'];

Patrick Müller
committed
/**
* 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);
}
*
* 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);
}
/**
* Require: quiqqer/products
*
* Get quiqqer/products membership Field
*

Patrick Müller
committed
* @return QUI\ERP\Products\Field\Field|false
public static function getProductMembershipField()
if (!Utils::isQuiqqerProductsInstalled()) {
return false;
}
try {
$Conf = QUI::getPackage('quiqqer/memberships')->getConfig();

Patrick Müller
committed
$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
*

Patrick Müller
committed
* @return QUI\ERP\Products\Field\Field|false
*/
public static function getProductMembershipFlagField()
{
if (!Utils::isQuiqqerProductsInstalled()) {
return false;
}
$Conf = QUI::getPackage('quiqqer/memberships')->getConfig();

Patrick Müller
committed
$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;
}