From e6d4d0ffc46b5f17bd8c63d9f3481d6476763ed2 Mon Sep 17 00:00:00 2001 From: Roland Schneider Date: Mon, 11 Oct 2021 22:32:43 +0200 Subject: [PATCH] add property and property definition --- backend/components/AdminMenuStructure.php | 22 +++++ backend/controllers/SettingsController.php | 77 +++++++++++++++++ backend/models/SettingsSearch.php | 41 +++++++++ backend/views/settings/index.php | 42 +++++++++ common/helpers/AppArrayHelper.php | 15 ++++ common/manager/EventRegistrationManager.php | 9 +- common/manager/PropertySettingsManager.php | 86 +++++++++++++++++++ common/models/Property.php | 53 ++++++++++++ common/models/PropertyDefinition.php | 58 +++++++++++++ common/models/PropertySetting.php | 44 ++++++++++ common/models/PropertySettingModel.php | 34 ++++++++ .../m211011_050352_add_properties.php | 67 +++++++++++++++ ...roup_training_customer_cancel_interval.php | 57 ++++++++++++ 13 files changed, 604 insertions(+), 1 deletion(-) create mode 100644 backend/controllers/SettingsController.php create mode 100644 backend/models/SettingsSearch.php create mode 100644 backend/views/settings/index.php create mode 100644 common/manager/PropertySettingsManager.php create mode 100644 common/models/Property.php create mode 100644 common/models/PropertyDefinition.php create mode 100644 common/models/PropertySetting.php create mode 100644 common/models/PropertySettingModel.php create mode 100644 console/migrations/m211011_050352_add_properties.php create mode 100644 console/migrations/m211011_052008_add_property_group_training_customer_cancel_interval.php diff --git a/backend/components/AdminMenuStructure.php b/backend/components/AdminMenuStructure.php index 144bc11..5ebda9a 100644 --- a/backend/components/AdminMenuStructure.php +++ b/backend/components/AdminMenuStructure.php @@ -235,6 +235,28 @@ class AdminMenuStructure ]; + ///////////////////////////// + // Group Training + ///////////////////////////// + $items = []; +// $items[] = ['label' => 'Felszerelés', 'url' => ['/event-equipment-type'], 'role' => [RoleDefinition::$ROLE_ADMIN]]; + $items[] = [ + 'label' => 'Beállítások', + 'url' => ['/settings/index'], + 'role' => [ + RoleDefinition::$ROLE_ADMIN, + ] + ]; + $this->menuItems[] = [ + 'label' => 'Beállítások', + 'url' => $this->emptyUrl, + 'items' => $items, + 'role' => [ + RoleDefinition::$ROLE_ADMIN + ] + ]; + + ///////////////////////////// // Development ///////////////////////////// diff --git a/backend/controllers/SettingsController.php b/backend/controllers/SettingsController.php new file mode 100644 index 0000000..307407d --- /dev/null +++ b/backend/controllers/SettingsController.php @@ -0,0 +1,77 @@ + [ + 'class' => \yii\filters\AccessControl::class, + 'rules' => [ + // allow authenticated users + [ + 'actions' => [ + 'index', + ], + 'allow' => true, + 'roles' => [ + 'admin', + 'employee', + 'reception' + ] + ] + ] + // everything else is denied + + ] + ]; + } + + /** + * Lists all Ticket models. + * + * @return mixed + */ + public function actionIndex() + { + $settingsManager = new PropertySettingsManager(); + $settings = $settingsManager->getPropertySettings(); + $settingsMap = AppArrayHelper::objectArrayToMap($settings, + function ($setting) { + return $setting->definition->id; + }, + function ($setting) { + return $setting; + }); + + $models = AppArrayHelper::mapValues($settings, function ($item) { + return PropertySettingModel::fromPropertySetting($item); + } + ); + + if (\Yii::$app->request->isPost) { + PropertySettingModel::loadMultiple($models, \Yii::$app->request->post()); + + foreach ($models as $model){ + if ( isset($settingsMap[$model->id_definition])){ + $setting = $settingsMap[$model->id_definition]; + $setting->setValue($model->value); + } + } + + $settingsManager->saveSettings(array_values($settingsMap)); + } + return $this->render('index', [ + 'settings' => $models + ]); + } + + +} diff --git a/backend/models/SettingsSearch.php b/backend/models/SettingsSearch.php new file mode 100644 index 0000000..613923d --- /dev/null +++ b/backend/models/SettingsSearch.php @@ -0,0 +1,41 @@ + + + +
+ + + + + +
+
+ label . ":" ?> +
+
+ field($setting, "[$index]value")->textInput(['maxlength' => true, 'label' => false])->label(false) ?> +
+ +
+ + + + +
+ 'btn btn-primary']) ?> +
+ + + +
diff --git a/common/helpers/AppArrayHelper.php b/common/helpers/AppArrayHelper.php index 7dc2598..f489d17 100644 --- a/common/helpers/AppArrayHelper.php +++ b/common/helpers/AppArrayHelper.php @@ -7,6 +7,14 @@ class AppArrayHelper { + public static function mapValues($array, $func){ + $result = []; + foreach ($array as $item){ + $result[] = $func($item); + } + return $result; + } + public static function objectArrayToMap($array, $funcGetId, $funcGetValue){ $result = []; @@ -37,4 +45,11 @@ class AppArrayHelper ); } + public static function getOrDefault($array, $key, $defaultValue = null){ + if ( isset($array[$key])){ + return $array[$key]; + } + return $defaultValue; + } + } diff --git a/common/manager/EventRegistrationManager.php b/common/manager/EventRegistrationManager.php index e160c8c..41b86af 100644 --- a/common/manager/EventRegistrationManager.php +++ b/common/manager/EventRegistrationManager.php @@ -3,11 +3,13 @@ namespace common\manager; use common\components\Helper; +use common\helpers\AppArrayHelper; use common\models\Card; use common\models\CardEventRegistrationForm; use common\models\Customer; use common\models\Event; use common\models\EventRegistration; +use common\models\PropertyDefinition; use common\models\Ticket; use customerapi\models\available\EventInterval; use customerapi\models\registrations\EventRegistrationAvailable; @@ -247,7 +249,12 @@ class EventRegistrationManager extends BaseObject if ($reason == EventRegistration::CANCEL_REASON_CUSTOMER) { $timeUntilEventStart = $event->start - $now; - if ($timeUntilEventStart < Helper::getGroupTrainingRegistrationCancelLimitMinutes() * 60) { + $settingsManager = new PropertySettingsManager(); + $limitMinutes = $settingsManager->getSetting( + PropertyDefinition::DEFINITION_GROUP_TRAINING_CUSTOMER_CANCEL_TIME_LIMIT, + Helper::getGroupTrainingRegistrationCancelLimitMinutes() + ); + if ($timeUntilEventStart <= $limitMinutes* 60) { throw new BadRequestHttpException('The reservation can\'t be deleted', self::CANCEL_TIME_LIMIT_REACHED); } } diff --git a/common/manager/PropertySettingsManager.php b/common/manager/PropertySettingsManager.php new file mode 100644 index 0000000..cce5203 --- /dev/null +++ b/common/manager/PropertySettingsManager.php @@ -0,0 +1,86 @@ +all(); + $properties = Property::find()->all(); + + $propertyByDefinition = AppArrayHelper::objectArrayToMap($properties, + function ($property) { + return $property->id_property_definition; + }, + function ($property) { + return $property; + } + ); + + foreach ($definitions as $definition) { + $setting = new PropertySetting([ + 'property' => AppArrayHelper::getOrDefault($propertyByDefinition, $definition->id), + 'definition' => $definition + ]); + $settings[] = $setting; + } + return $settings; + } + + /** + * @param PropertySetting $setting + */ + public function saveSetting($setting ){ + Property::deleteAll(['id_property_definition' =>$setting->definition->id ]); + $setting->property->save(false); + } + /** + * @param PropertySetting[] $setting + */ + public function saveSettings($settings ){ + foreach ($settings as $setting){ + Property::deleteAll(['id_property_definition' =>$setting->definition->id ]); + $setting->property->save(false); + + } + } + + public function getSettingsMap(){ + $settings = $this->getPropertySettings(); + return AppArrayHelper::objectArrayToMap($settings, + function ($setting){ + return $setting->definition->name; + }, + function ($setting){ + return $setting->getValue(); + }); + } + + public function getSettingFromSettingsMap($settingsMap,$key,$defaultValue = null){ + return AppArrayHelper::getOrDefault( + $settingsMap, + $key, + $defaultValue + ); + } + + public function getSetting($key,$defaultValue = null){ + $settingsMap = $this->getSettingsMap(); + return $this->getSettingFromSettingsMap($settingsMap,$key,$defaultValue); + } + + + +} diff --git a/common/models/Property.php b/common/models/Property.php new file mode 100644 index 0000000..2d7064f --- /dev/null +++ b/common/models/Property.php @@ -0,0 +1,53 @@ + 255] + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'id_user' => 'Id User', + 'id_property_definition' => 'Id Property Definition', + 'value' => 'Value', + 'created_at' => 'Created At', + 'updated_at' => 'Updated At', + ]; + } +} diff --git a/common/models/PropertyDefinition.php b/common/models/PropertyDefinition.php new file mode 100644 index 0000000..ce6ae39 --- /dev/null +++ b/common/models/PropertyDefinition.php @@ -0,0 +1,58 @@ + 100], + [['config'], 'string', 'max' => 255] + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'name' => 'Name', + 'label' => 'Label', + 'type' => 'Type', + 'config' => 'Config', + 'created_at' => 'Created At', + 'updated_at' => 'Updated At', + ]; + } +} diff --git a/common/models/PropertySetting.php b/common/models/PropertySetting.php new file mode 100644 index 0000000..d9f2255 --- /dev/null +++ b/common/models/PropertySetting.php @@ -0,0 +1,44 @@ +property)){ + $value = $this->property->value; + } + return $value; + } + + public function setValue($value){ + +// @property integer $id +// * @property integer $id_user +// * @property integer $id_property_definition +// * @property string $value + $this->property = new Property( + [ + 'id_user' => \Yii::$app->user->id, + 'id_property_definition' => $this->definition->id, + 'value' => $value + ] + ); + } + + public function getLabel(){ + return $this->definition->label; + } + +} diff --git a/common/models/PropertySettingModel.php b/common/models/PropertySettingModel.php new file mode 100644 index 0000000..ede74e8 --- /dev/null +++ b/common/models/PropertySettingModel.php @@ -0,0 +1,34 @@ +value = $setting->getValue(); + $result->label = $setting->getLabel(); + $result->id_definition = $setting->definition->id; + return $result; + } + + +} diff --git a/console/migrations/m211011_050352_add_properties.php b/console/migrations/m211011_050352_add_properties.php new file mode 100644 index 0000000..f72d440 --- /dev/null +++ b/console/migrations/m211011_050352_add_properties.php @@ -0,0 +1,67 @@ +db->driverName === 'mysql') { + // http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci + $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; + } + + $this->createTable('{{%property_definition}}', [ + 'id' => $this->primaryKey(), + 'name' => $this->string(100)->notNull(), + 'label' => $this->string(100)->notNull(), + 'type' => $this->string(100)->notNull(), + 'config' => $this->string(), + 'created_at' => $this->timestamp()->notNull(), + 'updated_at' => $this->timestamp()->notNull(), + ], $tableOptions); + + $this->createTable('{{%property}}', [ + 'id' => $this->primaryKey(), + 'id_user' => $this->integer(11), + 'id_property_definition' => $this->integer(11), + 'value' => $this->string(), + 'created_at' => $this->timestamp()->notNull(), + 'updated_at' => $this->timestamp()->notNull(), + ], $tableOptions); + + + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + echo "m211011_050352_add_properties cannot be reverted.\n"; + + return false; + } + + /* + // Use up()/down() to run migration code without a transaction. + public function up() + { + + } + + public function down() + { + echo "m211011_050352_add_properties cannot be reverted.\n"; + + return false; + } + */ +} diff --git a/console/migrations/m211011_052008_add_property_group_training_customer_cancel_interval.php b/console/migrations/m211011_052008_add_property_group_training_customer_cancel_interval.php new file mode 100644 index 0000000..9262f54 --- /dev/null +++ b/console/migrations/m211011_052008_add_property_group_training_customer_cancel_interval.php @@ -0,0 +1,57 @@ +insert("property_definition", + [ + 'name' => 'GROUP_TRAINING_CUSTOMER_CANCEL_TIME_LIMIT', + 'label' => 'Csoportos edzés - lemondás idő korlát (perc):', + 'type' => 'integer' + ]); + + $insertId = Yii::$app->db->getLastInsertID(); + $user = \common\models\User::find()->andWhere(['username' => 'admin'])->one(); + + $this->insert("property",[ + 'id_user' => $user->id, + 'id_property_definition' => $insertId, + 'value' => '60' + + ]); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + echo "m211011_052008_add_property_group_training_customer_cancel_interval cannot be reverted.\n"; + + return false; + } + + /* + // Use up()/down() to run migration code without a transaction. + public function up() + { + + } + + public function down() + { + echo "m211011_052008_add_property_group_training_customer_cancel_interval cannot be reverted.\n"; + + return false; + } + */ +}