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 @@
+
+
+
+
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;
+ }
+ */
+}