Newer
Older
<?php
namespace QUI\Memberships;
use QUI;
use QUI\Package\Package;
use QUI\Memberships\Handler as MembershipsHandler;
use QUI\Memberships\Users\Handler as MembershipUsersHandler;
use QUI\Memberships\Products\MembershipField;
use QUI\ERP\Products\Handler\Fields as ProductFields;

Patrick Müller
committed
use QUI\ERP\Products\Field\Field as ProductField;
use QUI\ERP\Products\Handler\Categories as ProductCategories;
use QUI\ERP\Products\Handler\Search as ProductSearchHandler;
use QUI\ERP\Products\Product\Product;
use QUI\ERP\Products\Handler\Products as ProductsHandler;
/**
* Class Events
*
* Basic events for quiqqer/memberships
*/
class Events
{
/**
* quiqqer/quiqqer: onPackageSetup
*
* @param Package $Package
* @return void
*/
public static function onPackageSetup(Package $Package)
{
if ($Package->getName() !== 'quiqqer/memberships') {
return;
}
$packages = Utils::getInstalledMembershipPackages();

Patrick Müller
committed
try {
foreach ($packages as $package) {
switch ($package) {
case 'quiqqer/products':
self::createProductFields();
self::createProductCategory();
break;
case 'quiqqer/contracts':
// @todo setup routine for quiqqer/contracts
break;
}

Patrick Müller
committed
} catch (\Exception $Exception) {
QUI\System\Log::writeException($Exception);
/**
* quiqqer/products: onQuiqqerProductsProductDelete
*
* @param Product $Product
* @return void
*/
public static function onQuiqqerProductsProductDelete(Product $Product)
{

Patrick Müller
committed
$membershipFieldId = Handler::getProductMembershipField()->getId();
if (!$membershipFieldId) {
return;
}
// check if Product is assigned to a Membership

Patrick Müller
committed
$membershipId = $Product->getFieldValue($membershipFieldId);
if (empty($membershipId)) {
return;
}
// delete Product ID from MembershipUsers
try {
$Membership = MembershipsHandler::getInstance()->getChild($membershipId);
$MembershipUsers = MembershipUsersHandler::getInstance();

Patrick Müller
committed
$membershipUserIds = $Membership->searchUsers([
'productId' => $Product->getId()

Patrick Müller
committed
]);
foreach ($membershipUserIds as $membershipUserId) {
$MembershipUser = $MembershipUsers->getChild($membershipUserId);
$MembershipUser->setAttribute('productId', null);
$MembershipUser->update();
}
} catch (\Exception $Exception) {
QUI\System\Log::addError(

Patrick Müller
committed
self::class.' :: onQuiqqerProductsProductDelete -> '
.$Exception->getMessage()
/**
* quiqqer/quiqqer: onUserSave
*
* @param QUI\Users\User $User
* @return void
*/
public static function onUserSave(QUI\Users\User $User)
{
$DefaultMembership = MembershipsHandler::getDefaultMembership();
if ($DefaultMembership === false) {
return;
}
try {
$DefaultMembership->getMembershipUser($User->getId());
} catch (\Exception $Exception) {
if ($Exception->getCode() !== 404) {
return;
}
$DefaultMembership->addUser($User);
}
}

Patrick Müller
committed
* Create necessary membership product fields and save their IDs to the config

Patrick Müller
committed
* @throws \QUI\Exception
protected static function createProductFields()

Patrick Müller
committed
$L = new QUI\Locale();
$Conf = QUI::getPackage('quiqqer/memberships')->getConfig();

Patrick Müller
committed
// Membership field (create new one is not configured)
$MembershipField = Handler::getProductMembershipField();
if ($MembershipField === false) {
$translations = [
'de' => '',
'en' => ''
];
foreach ($translations as $l => $t) {
$L->setCurrent($l);
$translations[$l] = $L->get(
'quiqqer/memberships',
'products.field.membership'
);
}

Patrick Müller
committed
try {
$MembershipField = ProductFields::createField([
'type' => MembershipField::TYPE,
'titles' => $translations,
'workingtitles' => $translations
]);
$MembershipField->setAttribute('search_type', ProductSearchHandler::SEARCHTYPE_TEXT);
$MembershipField->save();
// add field id to config
$Conf->set('products', 'membershipFieldId', $MembershipField->getId());
$Conf->save();
} catch (\Exception $Exception) {
QUI\System\Log::addError(self::class.' :: createProductFields');
QUI\System\Log::writeException($Exception);
}

Patrick Müller
committed
// Membership flag field (create new one is not configured)
$MembershipFlagField = Handler::getProductMembershipFlagField();
if ($MembershipFlagField === false) {
$translations = [
'de' => '',
'en' => ''
];
foreach ($translations as $l => $t) {
$L->setCurrent($l);
$translations[$l] = $L->get(
'quiqqer/memberships',
'products.field.membershipflag'
);
}

Patrick Müller
committed
try {
$MembershipFlagField = ProductFields::createField([
'type' => ProductFields::TYPE_BOOL,
'titles' => $translations,
'workingtitles' => $translations
]);
$MembershipFlagField->setAttribute('search_type', ProductSearchHandler::SEARCHTYPE_BOOL);
$MembershipFlagField->save();
// add Flag field to backend search
$BackendSearch = ProductSearchHandler::getBackendSearch();
$searchFields = $BackendSearch->getSearchFields();
$searchFields[$MembershipFlagField->getId()] = true;
$BackendSearch->setSearchFields($searchFields);
// add field id to config
$Conf->set('products', 'membershipFlagFieldId', $MembershipFlagField->getId());
$Conf->save();
} catch (\Exception $Exception) {
QUI\System\Log::addError(self::class.' :: createProductFields');
QUI\System\Log::writeException($Exception);
}
* quiqqer/order: onQuiqqerOrderSuccessful
* Add user to a membership if he ordered a product that contains one
*
* @param QUI\ERP\Order\Order|QUI\ERP\Order\OrderInProcess $Order
public static function onQuiqqerOrderSuccessful($Order)
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
$MembershipField = Handler::getProductMembershipField();
if ($MembershipField === false) {
QUI\System\Log::addError(
self::class.' :: onQuiqqerOrderSuccessful -> Could not parse membership'
.' from Order #'.$Order->getPrefixedId().' because no membership field'
.' is configured. Please execute a system setup.'
);
return;
}
$membershipFieldId = $MembershipField->getId();
$Memberships = Handler::getInstance();
try {
$User = QUI::getUsers()->get($Order->getCustomer()->getId());
} catch (\Exception $Exception) {
QUI\System\Log::writeDebugException($Exception);
return;
}
// do not add guests to a membership!
if (!QUI::getUsers()->isAuth($User)) {
return;
}
/** @var QUI\ERP\Accounting\Article $Article */
foreach ($Order->getArticles()->getArticles() as $Article) {
try {
$Product = ProductsHandler::getProduct($Article->getId());
$ProductMembershipField = $Product->getField($membershipFieldId);
$Membership = $Memberships->getChild($ProductMembershipField->getValue());
$MembershipUser = $Membership->addUser($User);
$MembershipUser->addHistoryEntry(
MembershipUsersHandler::HISTORY_TYPE_MISC,
'Order: '.$Order->getPrefixedId()
);
$MembershipUser->update(false);
} catch (\Exception $Exception) {
QUI\System\Log::writeException($Exception);
}
/**
* quiqqer/products: onQuiqqerProductsFieldDeleteBefore
*
* @param ProductField $Field
* @throws Exception
*/
public static function onQuiqqerProductsFieldDeleteBefore(ProductField $Field)

Patrick Müller
committed
{
$MembershipField = Handler::getProductMembershipField();
if ($MembershipField !== false && $MembershipField->getId() === $Field->getId()) {
throw new Exception([
'quiqqer/memberships',
'exception.Events.onQuiqqerProductsFieldDelete.cannot_delete_field'
]);
}
$MembershipFlagField = Handler::getProductMembershipFlagField();
if ($MembershipFlagField !== false && $MembershipFlagField->getId() === $Field->getId()) {
throw new Exception([
'quiqqer/memberships',
'exception.Events.onQuiqqerProductsFieldDelete.cannot_delete_field'
]);
}

Patrick Müller
committed
}
/**
* Create a product category for memberships
*
* @return void
*/
protected static function createProductCategory()
{
$Category = MembershipsHandler::getProductCategory();
// do not create a product category if a default category has already been set
if ($Category !== false) {
return;
}
try {
$Category = ProductCategories::createCategory();
} catch (\Exception $Exception) {

Patrick Müller
committed
QUI\System\Log::addError(self::class.' :: createProductCategory()');
QUI\System\Log::writeException($Exception);
return;
}
$catId = $Category->getId();

Patrick Müller
committed
$titles = [

Patrick Müller
committed
];

Patrick Müller
committed
$descriptions = [

Patrick Müller
committed
];
$L = new QUI\Locale();
foreach ($titles as $l => $t) {
$L->setCurrent($l);
$t = $L->get('quiqqer/memberships', 'products.category.title');
$d = $L->get('quiqqer/memberships', 'products.category.description');

Patrick Müller
committed
$titles[$l] = $t;
$titles[$l.'_edit'] = $t;
$descriptions[$l] = $d;
$descriptions[$l.'_edit'] = $d;
}
// change title and description
QUI\Translator::edit(
'quiqqer/products',

Patrick Müller
committed
'products.category.'.$catId.'.title',
'quiqqer/products',
array_merge(
$titles,

Patrick Müller
committed
[

Patrick Müller
committed
]
)
);
QUI\Translator::edit(
'quiqqer/products',

Patrick Müller
committed
'products.category.'.$catId.'.description',
'quiqqer/products',
array_merge(
$descriptions,

Patrick Müller
committed
[

Patrick Müller
committed
]

Patrick Müller
committed
// assign Membership Field to category
$MembershipField = MembershipsHandler::getProductMembershipField();
if ($MembershipField !== false) {
$Category->addField($MembershipField);
}
$MembershipFlagField = MembershipsHandler::getProductMembershipFlagField();
if ($MembershipFlagField !== false) {
$Category->addField($MembershipFlagField);
}

Patrick Müller
committed
$Category->save();
// set new category as default product category for memberships
$Conf = QUI::getPackage('quiqqer/memberships')->getConfig();
$Conf->set('products', 'categoryId', $catId);
$Conf->save();