diff --git a/backend/views/event-type/_form.php b/backend/views/event-type/_form.php
index 02abc8a..8b4c9e6 100644
--- a/backend/views/event-type/_form.php
+++ b/backend/views/event-type/_form.php
@@ -13,6 +13,7 @@ use yii\widgets\ActiveForm;
= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
+ = $form->field($model, 'theme')->dropDownList(\common\models\EventType::themes()) ?>
= Html::submitButton($model->isNewRecord ? Yii::t('event-type', 'Create') : Yii::t('event-type', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
diff --git a/backend/views/event-type/index.php b/backend/views/event-type/index.php
index 3163e74..ef18f81 100644
--- a/backend/views/event-type/index.php
+++ b/backend/views/event-type/index.php
@@ -26,7 +26,13 @@ $this->params['breadcrumbs'][] = $this->title;
'name',
'created_at:datetime',
'updated_at:datetime',
-
+ [
+ 'attribute' => 'theme',
+ 'label' => 'Színtéma',
+ 'value' => function ($model, $key, $index, $column){
+ return isset($model['theme']) ? "Színtéma " . ($model['theme']+1) : "";
+ }
+ ],
['class' => 'yii\grid\ActionColumn',
'template' => '{view} {update}'
],
diff --git a/backend/views/event-type/view.php b/backend/views/event-type/view.php
index 1a6a8cd..1ea0c5d 100644
--- a/backend/views/event-type/view.php
+++ b/backend/views/event-type/view.php
@@ -30,6 +30,10 @@ $this->params['breadcrumbs'][] = $this->title;
'attributes' => [
'id',
'name',
+ [
+ 'label'=> 'Színtéma',
+ 'value' => ( isset($model->theme) ? 'Színtéma ' . ($model->theme+1) : '-' )
+ ],
'created_at',
'updated_at',
],
diff --git a/common/components/Helper.php b/common/components/Helper.php
index 74939f5..fee3699 100644
--- a/common/components/Helper.php
+++ b/common/components/Helper.php
@@ -22,7 +22,7 @@ class Helper {
*/
public static function calcStartDatimeDaysSinceToday($start, $format = "datetime" ){
$now = time();
-
+
if ( $format == "datetime"){
$format = "Y-m-d H:i";
}else if ( $format == "date") {
@@ -30,10 +30,10 @@ class Helper {
}else{
//use format
}
-
+
$d = \DateTime::createFromFormat( $format , $start)->getTimeStamp();
$days_between = ceil(abs( $now - $d) / 86400 );
-
+
return $days_between;
}
@@ -52,8 +52,8 @@ class Helper {
*/
public static function restrictIfNotAdminTheStartDate($query,$date, $fields = ['transfer.paid_at','transfer.created_at'], $format = 'datetime'){
$result = null;
-
-
+
+
$needFix = false;
if ( !isset($date) || empty($date)){
$needFix = true;
@@ -63,19 +63,19 @@ class Helper {
$needFix = true;
}
}
-
+
if ( $needFix == true ){
$d = Helper::getReceptionVisibilityDays();
-
+
$time = date( "Y-m-d H:i:s", strtotime("today -$d day") );
-
+
$conditions = [];
-
+
foreach ($fields as $f ){
$conditions[] = ['>=', $f, $time];
}
-
-
+
+
if ( count($conditions) > 1 ){
$andWhereCond = [];
$andWhereCond[0] = "or";
@@ -87,26 +87,26 @@ class Helper {
}else if ( count($conditions) == 1 ){
$andWhereCond = $conditions[0];
}
-
+
// $start_date_condition = ['or',[ '>=', 'transfer.created_at', $time ] ,[ '>=', 'transfer.paid_at', $time] ];
- if ( isset($andWhereCond)){
+ if ( isset($andWhereCond)){
$query->andWhere( $andWhereCond );
}
-
+
}
-
+
return $result;
}
-
+
public static function getDateTimeString( ){
-
+
return date("Y-m-d H:i:s");
}
public static function getDateString( ){
-
+
return date("Y-m-d");
}
-
+
public static function getArrayValue($arr,$key,$def){
$result = $def;
if ( array_key_exists($key, $arr)){
@@ -114,8 +114,8 @@ class Helper {
}
return $result;
}
-
-
+
+
public static function hufRound($m) {
$result = round ( $m / 5, 0 ) * 5;
return $result;
@@ -128,18 +128,18 @@ class Helper {
* @param $end
*/
public static function notInInterval($query, $field, $start, $end) {
- $query->andFilterWhere ( [
+ $query->andFilterWhere ( [
'or',
- [
+ [
'<',
$field,
- isset ( $start ) ? $start : '1900-01-01'
+ isset ( $start ) ? $start : '1900-01-01'
],
- [
+ [
'>=',
$field,
- isset ( $end ) ? $end : '3000-01-01'
- ]
+ isset ( $end ) ? $end : '3000-01-01'
+ ]
] );
}
@@ -150,21 +150,21 @@ class Helper {
* @param string $end the end date
*/
public static function notPaid($query, $field, $start, $end) {
- $query->andFilterWhere ( [
+ $query->andFilterWhere ( [
'or',
- [
+ [
'<',
$field,
- isset ( $start ) ? $start : '1900-01-01'
+ isset ( $start ) ? $start : '1900-01-01'
],
- [
+ [
'>=',
$field,
- isset ( $end ) ? $end : '3000-01-01'
+ isset ( $end ) ? $end : '3000-01-01'
],
- [
- "transfer.status" => Transfer::STATUS_NOT_PAID
- ]
+ [
+ "transfer.status" => Transfer::STATUS_NOT_PAID
+ ]
] );
}
@@ -175,15 +175,15 @@ class Helper {
* @param string $end the end date
*/
public static function inInterval($query, $field, $start, $end) {
- $query->andFilterWhere ( [
+ $query->andFilterWhere ( [
'>=',
$field,
- $start
+ $start
] );
- $query->andFilterWhere ( [
+ $query->andFilterWhere ( [
'<',
$field,
- $end
+ $end
] );
}
@@ -194,53 +194,53 @@ class Helper {
* @return array the query 'in interval' rule
*/
public static function queryInIntervalRule($field, $start, $end) {
- return [
+ return [
'and',
- [
+ [
'>=',
$field,
- $start
+ $start
],
- [
+ [
'<',
$field,
- $end
- ]
+ $end
+ ]
];
}
public static function queryExpireRule($field_start, $field_end, $start, $end) {
- return [
+ return [
'and',
- [
+ [
'<',
$field_start,
- $end
+ $end
],
- [
+ [
'>=',
$field_end,
- $start
+ $start
],
- [
+ [
'<=',
$field_end,
- $end
- ]
+ $end
+ ]
];
}
public static function queryValidRule($field_start, $field_end, $start, $end) {
- return [
+ return [
'and',
- [
+ [
'<',
$field_start,
- $end
+ $end
],
- [
+ [
'>=',
$field_end,
- $start
- ]
+ $start
+ ]
];
}
public static function sqlInIntervalRule($field, $paramStart, $paramEnd) {
@@ -270,35 +270,35 @@ class Helper {
public static function queryAccountConstraint($query, $field) {
if (! RoleDefinition::isAdmin ()) {
$query->innerJoin ( "user_account_assignment", $field . ' = user_account_assignment.id_account' );
- $query->andWhere ( [
- 'user_account_assignment.id_user' => Yii::$app->user->id
+ $query->andWhere ( [
+ 'user_account_assignment.id_user' => Yii::$app->user->id
] );
}
}
public static function roleLabels() {
- return [
+ return [
'reception' => Yii::t ( 'common/role', 'Reception' ),
'admin' => Yii::t ( 'common/role', 'Administrator' ),
- 'employee' => Yii::t ( 'common/role', 'Alkalmazott' )
+ 'employee' => Yii::t ( 'common/role', 'Alkalmazott' )
];
}
public static function roleDefinitions() {
- return [
- 'employee' => [
- 'canAllow' => [
- 'employee'
- ]
+ return [
+ 'employee' => [
+ 'canAllow' => [
+ 'employee'
+ ]
],
- 'admin' => [
- 'canAllow' => [
+ 'admin' => [
+ 'canAllow' => [
'admin',
'reception',
- 'employee'
- ]
+ 'employee'
+ ]
],
- 'reception' => [
- 'canAllow' => [ ]
- ]
+ 'reception' => [
+ 'canAllow' => [ ]
+ ]
];
}
public static function flash($mode, $message) {
@@ -322,26 +322,26 @@ class Helper {
public static function isUserCartVisibilityAll() {
return \Yii::$app->params ['user_cart_item_visibility'] == 'all';
}
-
+
public static function getBackendSkin() {
return \Yii::$app->params ['backend_skin'] ;
}
-
+
public static function getCompany() {
return \Yii::$app->params ['company'] ;
}
public static function getCompanyName() {
return \Yii::$app->params ['company_name'] ;
}
-
+
public static function isCompanyMovar() {
return \Yii::$app->params ['company'] == 'movar';
}
-
+
public static function isCompanyGyor() {
return \Yii::$app->params ['company'] == 'gyor';
}
-
+
public static function isUserCartOn() {
return \Yii::$app->params ['user_cart_on'] == true;
}
@@ -353,26 +353,26 @@ class Helper {
public static function isTicketTypeDoorAllowedCheckOn() {
return \Yii::$app->params ['ticket_type_door_allowed_check_on'] == true;
}
-
+
public static function getProductSaleDefaultFocus() {
return \Yii::$app->params ['product_sale_default_focus'] ;
}
public static function isProductVisibilityAccount() {
return \Yii::$app->params ['product_visiblity'] == 'account';
}
-
+
public static function isAccountStateClosePreloadMoney() {
return \Yii::$app->params ['account_state_close_preload_money'] == true;
}
-
+
public static function isAccountStateOpenSendMail() {
return \Yii::$app->params ['mail_account_state_open'] == true;
}
-
+
public static function isAccountStateCloseSendMail() {
return \Yii::$app->params ['mail_account_state_close'] == true;
}
-
+
public static function getReceptionVisibilityDays() {
return \Yii::$app->params ['reception_visibility_days'] ;
}
@@ -399,12 +399,16 @@ class Helper {
public static function isReceptionTransferIndexEnabled(){
return !Helper::isReceptionTransferListToday();
}
-
+
+ public static function getGroupTrainingUrl(){
+ return \Yii::$app->params['group_training.url'];
+ }
+
public static function getRealUserIp() {
$client = @$_SERVER ['HTTP_CLIENT_IP'];
$forward = @$_SERVER ['HTTP_X_FORWARDED_FOR'];
$remote = $_SERVER ['REMOTE_ADDR'];
-
+
if (filter_var ( $client, FILTER_VALIDATE_IP )) {
$ip = $client;
} elseif (filter_var ( $forward, FILTER_VALIDATE_IP )) {
@@ -412,10 +416,10 @@ class Helper {
} else {
$ip = $remote;
}
-
+
return $ip;
}
-
+
public static function url_get_contents ($Url) {
if (!function_exists('curl_init')){
die('CURL is not installed!');
@@ -427,14 +431,14 @@ class Helper {
curl_close($ch);
return $output;
}
-
+
public static function getGeoIp() {
$ip = Helper::getRealUserIp ();
$details = json_decode ( Helper::url_get_contents( "http://ipinfo.io/{$ip}/json" ) );
return $details;
}
-
-
+
+
public static function mkYiiSortItem($field, $column){
return [
$field => [
@@ -454,7 +458,7 @@ class Helper {
}
return $result;
}
-
+
public static function setBit($val,$index,$bit_on){
$flag = +$val;
if ( $bit_on ){
@@ -471,7 +475,7 @@ class Helper {
return $result ;
}
-
+
public static function generateRandomString($length = 6,$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWX' ) {
$charactersLength = strlen($characters);
$randomString = '';
@@ -480,7 +484,7 @@ class Helper {
}
return $randomString;
}
-
+
public static function getWebUrl(){
if ( \Yii::$app->params['development'] == true ){
return "http://localhost/fitness-web";
@@ -529,5 +533,5 @@ class Helper {
return $result;
}
-
-}
\ No newline at end of file
+
+}
diff --git a/common/config/params.php b/common/config/params.php
index ccdbe50..ca98fd8 100644
--- a/common/config/params.php
+++ b/common/config/params.php
@@ -64,5 +64,6 @@ return [
'ticket_type_door_allowed_check_on' => false,
'warn_ticket_expire_in_days_count' => 3,
'warn_ticket_expire_in_usage_count' => 3,
- 'inventory.products.only.active' => true
+ 'inventory.products.only.active' => true,
+ 'group_training.url' => 'https://fitnessadmin.hu'
];
diff --git a/common/helpers/AppArrayHelper.php b/common/helpers/AppArrayHelper.php
new file mode 100644
index 0000000..7dc2598
--- /dev/null
+++ b/common/helpers/AppArrayHelper.php
@@ -0,0 +1,40 @@
+ [obj1.id => obj1,obj2.id => obj2]
+ * @param $array
+ * @return array
+ */
+ public static function objectArrayToMapById($array){
+ return AppArrayHelper::objectArrayToMap(
+ $array,
+ function ($item){
+ return $item->id;
+ },
+ function ($item){
+ return $item;
+ }
+ );
+ }
+
+}
diff --git a/common/helpers/AppDateTimeHelper.php b/common/helpers/AppDateTimeHelper.php
new file mode 100644
index 0000000..f0233fd
--- /dev/null
+++ b/common/helpers/AppDateTimeHelper.php
@@ -0,0 +1,16 @@
+
-
Kedves customer->name?>!
-
- Az Ön új jelszava:
-
-
- -
- "plainPassword ?>"
-
-
-
- Üdvözlettel:
-
-
- companyName ?>
-
-
- Ez egy automatikus e-mail üzenet, amelyre nem tud válaszolni.
-
+
Kedves customer->name ?>!
+
+ Az Ön új jelszava:
+
+
+ plainPassword ?>
+
+
A bejelentkezéshez kattintson a következő linkre: groupTrainingUrl ?>
+
+ Üdvözlettel:
+
+
+ companyName ?>
+
+
+ Ez egy automatikus e-mail üzenet, amelyre nem tud válaszolni.
+
diff --git a/common/models/Event.php b/common/models/Event.php
index 63db6eb..82059d0 100644
--- a/common/models/Event.php
+++ b/common/models/Event.php
@@ -161,7 +161,8 @@ class Event extends ActiveRecord
* @return EventRegistration[]|ActiveQuery
*/
public function getActiveEventRegistrations(){
- return $this->hasMany(EventRegistration::class,['id_event' => 'id'])->andWhere(
+ return $this->hasMany(EventRegistration::class,['id_event' => 'id'])
+ ->andWhere(
[
'event_registration.canceled_at' => null,
'event_registration.deleted_at' => null,
@@ -169,19 +170,6 @@ class Event extends ActiveRecord
);
}
- /**
- * @return EventRegistration[]|ActiveQuery
- */
- public function getActiveEventRegistrationsForCustomer(){
- return $this->hasMany(EventRegistration::class,['id_event' => 'id'])->andWhere(
- [
- 'event_registration.canceled_at' => null,
- 'event_registration.deleted_at' => null,
- 'event_registration.id_customer' => \Yii::$app->user->id
- ]
- );
- }
-
/**
* @return integer
*/
diff --git a/common/models/EventRegistration.php b/common/models/EventRegistration.php
index 8a4f2b8..468afd2 100644
--- a/common/models/EventRegistration.php
+++ b/common/models/EventRegistration.php
@@ -57,45 +57,52 @@ class EventRegistration extends \yii\db\ActiveRecord
public function behaviors()
{
- return ArrayHelper::merge( [
+ return ArrayHelper::merge([
[
'class' => TimestampBehavior::className(),
- 'value' => function(){ return date('Y-m-d H:i:s' ); }
+ 'value' => function () {
+ return date('Y-m-d H:i:s');
+ }
]
],
parent::behaviors());
}
- public function getEvent(){
- return $this->hasOne($this->getEventClass(),['id' => 'id_event']);
+ public function getEvent()
+ {
+ return $this->hasOne($this->getEventClass(), ['id' => 'id_event']);
}
- public function getCustomer(){
- return $this->hasOne($this->getCustomerClass(),['id' => 'id_customer']);
+ public function getCustomer()
+ {
+ return $this->hasOne($this->getCustomerClass(), ['id' => 'id_customer']);
}
- public function getEventClass(){
+ public function getEventClass()
+ {
return Event::class;
}
- public function getCustomerClass(){
+ public function getCustomerClass()
+ {
return Customer::class;
}
/**
* @param EventRegistration $eventRegistration
*/
- public static function isActive($eventRegistration){
- if ( !isset($eventRegistration ) ){
+ public static function isActive($eventRegistration)
+ {
+ if (!isset($eventRegistration)) {
return false;
}
- if ( isset($eventRegistration->canceled_at ) ){
+ if (isset($eventRegistration->canceled_at)) {
return false;
}
- if ( isset($eventRegistration->deleted_at ) ){
+ if (isset($eventRegistration->deleted_at)) {
return false;
}
@@ -105,32 +112,40 @@ class EventRegistration extends \yii\db\ActiveRecord
/**
* @param EventRegistration $eventRegistration
*/
- public static function isForCustomer($eventRegistration,$idCustomer){
- if ( !isset($eventRegistration ) ){
+ public static function isForCustomer($eventRegistration, $idCustomer)
+ {
+ if (!isset($eventRegistration)) {
return false;
}
- if ( !isset($eventRegistration->id_customer ) ){
+ if (!isset($eventRegistration->id_customer)) {
return false;
}
- return $eventRegistration->id_customer == $idCustomer;
+ return $eventRegistration->id_customer == $idCustomer;
}
/**
* @param EventRegistration[] $eventRegistrations
*/
- public static function filterActive($eventRegistrations){
- return array_filter($eventRegistrations, EventRegistration::class.'::isActive' );
+ public static function filterActive($eventRegistrations)
+ {
+ if (!isset($eventRegistrations)) {
+ return [];
+ }
+ return array_filter($eventRegistrations, EventRegistration::class . '::isActive');
}
/**
* @param EventRegistration[] $eventRegistrations
*/
- public static function filterForCustomer($eventRegistrations,$idCustomer){
+ public static function filterForCustomer($eventRegistrations, $idCustomer)
+ {
$result = [];
- foreach ($eventRegistrations as $eventRegistration){
- if ( EventRegistration::isForCustomer($eventRegistration,$idCustomer)){
- $result[] = $eventRegistration;
+ if (isset($eventRegistrations)) {
+ foreach ($eventRegistrations as $eventRegistration) {
+ if (EventRegistration::isForCustomer($eventRegistration, $idCustomer)) {
+ $result[] = $eventRegistration;
+ }
}
}
return $result;
diff --git a/common/models/EventType.php b/common/models/EventType.php
index 07f2717..fd440a1 100644
--- a/common/models/EventType.php
+++ b/common/models/EventType.php
@@ -11,6 +11,7 @@ use yii\helpers\ArrayHelper;
*
* @property integer $id
* @property string $name
+ * @property string $theme
* @property string $created_at
* @property string $updated_at
*/
@@ -30,9 +31,10 @@ class EventType extends \yii\db\ActiveRecord
public function rules()
{
return [
- [['name'], 'required'],
+ [['name','theme'], 'required'],
[['name'], 'unique'],
- [['name'], 'string', 'max' => 255]
+ [['name'], 'string', 'max' => 255],
+ [['theme'], 'string', 'max' => 50]
];
}
@@ -104,4 +106,12 @@ class EventType extends \yii\db\ActiveRecord
// TODO: implement bossiness logic to select ticket
return $possibleTickets[0];
}
+
+ static function themes() {
+ $themes = [];
+ for ($x = 0; $x < 10; $x++) {
+ $themes[$x] = "Színtéma " . ($x+1);
+ }
+ return $themes;
+ }
}
diff --git a/common/models/Trainer.php b/common/models/Trainer.php
index 18ec78d..da43ec1 100644
--- a/common/models/Trainer.php
+++ b/common/models/Trainer.php
@@ -2,6 +2,7 @@
namespace common\models;
+use common\helpers\AppArrayHelper;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\helpers\ArrayHelper;
diff --git a/common/modules/event/manager/EventManager.php b/common/modules/event/manager/EventManager.php
index 38ed3b6..e9253ff 100644
--- a/common/modules/event/manager/EventManager.php
+++ b/common/modules/event/manager/EventManager.php
@@ -3,10 +3,12 @@
namespace common\modules\event\manager;
use common\models\Event;
+use common\models\EventRegistration;
use common\modules\event\models\timetable\TimeTableMonth;
use common\modules\event\models\timetable\TimeTableMonthDay;
use common\modules\event\models\timetable\TimeTableMonthWeek;
use customerapi\models\available\EventInterval;
+use customerapi\models\details\EventRegistrationView;
use DateTime;
use Exception;
use yii\db\Query;
@@ -23,13 +25,14 @@ class EventManager
* @throws \yii\base\Exception on any error
* @throws StaleObjectException
*/
- public function deleteEvent($id){
+ public function deleteEvent($id)
+ {
$event = Event::findOne($id);
- if ( !isset($event)){
+ if (!isset($event)) {
throw new \yii\base\Exception("Event $id not found");
}
$registrations = $event->eventRegistrations;
- if ( !isset($registrations) || count($registrations) === 0 ){
+ if (!isset($registrations) || count($registrations) === 0) {
$event->delete();
} else {
$event->deleted_at = time();
@@ -43,7 +46,7 @@ class EventManager
* @return TimeTableMonth
* @throws Exception
*/
- public function loadTimeTable($interval , $activeOrDisplayInterval = "active" )
+ public function loadTimeTable($interval, $activeOrDisplayInterval = "active")
{
$timeTable = new TimeTableMonth();
@@ -73,11 +76,11 @@ class EventManager
$timeTable->weeks[$weekNumber]->$weekDayName = $timeTableMonthDay;
}
- if ( $activeOrDisplayInterval == "active"){
+ if ($activeOrDisplayInterval == "active") {
$dateTimeFrom = $interval->firstActiveDate;
$to = clone $interval->lastActiveDate;
$dateTimeTo = $to->modify('+1 day');
- }else{
+ } else {
// active
$dateTimeFrom = $interval->firstDisplayDate;
$to = clone $interval->lastDisplayDate;
@@ -85,7 +88,7 @@ class EventManager
}
// get events between active dates
- $events =$this->getEvents($dateTimeFrom,$dateTimeTo);
+ $events = $this->getEvents($dateTimeFrom, $dateTimeTo);
// set events per day
/** @var Event $event */
@@ -108,8 +111,8 @@ class EventManager
/**
* Get all active events between the to dates
- * @param DateTime $fromInc from date inclusive (>=)
- * @param DateTime $toExcl to date exclusive (<)
+ * @param DateTime $fromInc from date inclusive (>=)
+ * @param DateTime $toExcl to date exclusive (<)
* @return Event[]
*/
public function getEvents($fromInc, $toExcl)
@@ -150,18 +153,61 @@ class EventManager
public function getEventsForDay($date)
{
$start = clone $date;
- $start->setTime(0,0);
+ $start->setTime(0, 0);
$to = clone $start;
$to->modify('+1 day');
- return $this->getEvents($start,$to);
+ return $this->getEvents($start, $to);
}
- public function getEvent($id){
+ public function getEvent($id)
+ {
return Event::findOne($id);
}
+ public function findActiveRegistrations($idEvent, $idCustomer = null)
+ {
+ $registrations = EventRegistrationView::find()->andWhere(['id_event' => $idEvent, 'id_customer' => \Yii::$app->user->id])->all();
+ $allActiveRegistrations = EventRegistration::filterActive($registrations);
+ if (isset($idCustomer)) {
+ $allActiveRegistrations = EventRegistration::filterForCustomer($allActiveRegistrations, \Yii::$app->user->id);
+ }
+ return $allActiveRegistrations;
+ }
+
+
+ public function findActiveEvent($idEvent, $interval, $withRelatedObjects = false)
+ {
+ $paramEventStartMax = (clone $interval->lastActiveDate);
+ $paramEventStartMax = $paramEventStartMax->modify('+1 day');
+ $paramEventStartMax = $paramEventStartMax->getTimestamp();
+ $query = Event::find()
+ ->andWhere(['event.id' => $idEvent])
+ ->andWhere(['>=', 'event.start', $interval->firstActiveDate->getTimestamp()])
+ ->andWhere(['<', 'event.start', $paramEventStartMax])
+ ->andWhere(['event.active' => '1']);
+
+ if ($withRelatedObjects) {
+ $query = $query->innerJoinWith('trainer')
+ ->innerJoinWith('eventType')
+ ->innerJoinWith('room');
+ }
+
+
+ return $query->one();
+ }
+
+ public function findActiveEvents($interval)
+ {
+ $paramEventStartMax = (clone $interval->lastActiveDate);
+ $paramEventStartMax = $paramEventStartMax->modify('+1 day');
+ $paramEventStartMax = $paramEventStartMax->getTimestamp();
+ return Event::find()
+ ->andWhere(['>=', 'event.start', $interval->firstActiveDate->getTimestamp()])
+ ->andWhere(['<', 'event.start', $paramEventStartMax])
+ ->andWhere(['event.active' => '1'])->all();
+ }
}
diff --git a/console/migrations/m210930_101018_alter_table_event_type_add_field_color.php b/console/migrations/m210930_101018_alter_table_event_type_add_field_color.php
new file mode 100644
index 0000000..fe83dda
--- /dev/null
+++ b/console/migrations/m210930_101018_alter_table_event_type_add_field_color.php
@@ -0,0 +1,42 @@
+addColumn("event_type",'theme',$this->string(50));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function safeDown()
+ {
+ echo "m210930_101018_alter_table_event_type_add_field_color cannot be reverted.\n";
+
+ return false;
+ }
+
+ /*
+ // Use up()/down() to run migration code without a transaction.
+ public function up()
+ {
+
+ }
+
+ public function down()
+ {
+ echo "m210930_101018_alter_table_event_type_add_field_color cannot be reverted.\n";
+
+ return false;
+ }
+ */
+}
diff --git a/customer/app/src/app/_helpers/fake-backend.ts b/customer/app/src/app/_helpers/fake-backend.ts
index 7b8a54b..aa93a9c 100644
--- a/customer/app/src/app/_helpers/fake-backend.ts
+++ b/customer/app/src/app/_helpers/fake-backend.ts
@@ -47,11 +47,13 @@ export class FakeBackendInterceptor implements HttpInterceptor {
let eventTypes: EventType[] = [
{
id: 1,
- name: 'Típus 1'
+ name: 'Típus 1',
+ theme: '0'
},
{
id: 2,
- name: 'Típus 2'
+ name: 'Típus 2',
+ theme: '0'
}
];
diff --git a/customer/app/src/app/app.module.ts b/customer/app/src/app/app.module.ts
index fe301ba..9fbc8dc 100644
--- a/customer/app/src/app/app.module.ts
+++ b/customer/app/src/app/app.module.ts
@@ -39,6 +39,7 @@ import {environment} from "../environments/environment";
import {AppState} from "./state/app.state";
import {NgxsReduxDevtoolsPluginModule} from "@ngxs/devtools-plugin";
import {NgxsLoggerPluginModule} from "@ngxs/logger-plugin";
+import { EventDatePipe } from './pipes/event-time.pipe';
@@ -66,6 +67,7 @@ registerLocaleData(localeHu, 'hu');
GuestLayoutComponent,
SecuredLayoutComponent,
PasswordChangeComponent,
+ EventDatePipe,
],
imports: [
diff --git a/customer/app/src/app/app.service.ts b/customer/app/src/app/app.service.ts
new file mode 100644
index 0000000..cf35947
--- /dev/null
+++ b/customer/app/src/app/app.service.ts
@@ -0,0 +1,26 @@
+import { Injectable } from '@angular/core';
+import * as moment from "moment";
+
+@Injectable({
+ providedIn: 'root'
+})
+export class AppService {
+
+ constructor() { }
+
+ formatDateTime(datetime: number, date:boolean, time: boolean) {
+ let format ;
+ if ( date && time ){
+ format = 'YYYY.MM.DD HH:mm';
+ } else if (date){
+ format = 'YYYY.MM.DD';
+ } else {
+ format = 'HH:mm';
+ }
+ return this.dateToMoment(datetime).utc().format(format);
+ }
+
+ dateToMoment(date: number) {
+ return moment.unix(date);
+ }
+}
diff --git a/customer/app/src/app/components/fit-event-types/fit-event-types.component.ts b/customer/app/src/app/components/fit-event-types/fit-event-types.component.ts
index f767788..8c957ab 100644
--- a/customer/app/src/app/components/fit-event-types/fit-event-types.component.ts
+++ b/customer/app/src/app/components/fit-event-types/fit-event-types.component.ts
@@ -1,6 +1,6 @@
import {Component, forwardRef, OnInit} from '@angular/core';
import {EventService, EventType} from "../../services/event.service";
-import {ControlValueAccessor, FormControl, FormGroup, NG_VALUE_ACCESSOR} from "@angular/forms";
+import {ControlValueAccessor, NG_VALUE_ACCESSOR} from "@angular/forms";
const FIT_EVENT_TYPES_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
@@ -22,10 +22,8 @@ export class FitEventTypesComponent implements OnInit, ControlValueAccessor {
private onChange: Function;
private onTouched: Function;
-
public value: string;
-
constructor(private eventService: EventService) {
this.onChange = (_: any) => { };
this.onTouched = () => { };
@@ -34,7 +32,7 @@ export class FitEventTypesComponent implements OnInit, ControlValueAccessor {
ngOnInit() {
this.eventService.findAllEventTypes()
.subscribe(value => {
- this.types = [{ id: -1, name: 'Minden Típus'}].concat( value);
+ this.types = [{ id: -1, name: 'Minden Típus', theme: '' }].concat( value);
this._setValue(this.types[0].id);
}
);
diff --git a/customer/app/src/app/components/fit-navigation/fit-navigation.component.html b/customer/app/src/app/components/fit-navigation/fit-navigation.component.html
index 8b54512..213aa7f 100644
--- a/customer/app/src/app/components/fit-navigation/fit-navigation.component.html
+++ b/customer/app/src/app/components/fit-navigation/fit-navigation.component.html
@@ -6,7 +6,8 @@
-
+
-
diff --git a/customer/app/src/app/components/fit-navigation/fit-navigation.component.ts b/customer/app/src/app/components/fit-navigation/fit-navigation.component.ts
index 8a8d415..0aa2e73 100644
--- a/customer/app/src/app/components/fit-navigation/fit-navigation.component.ts
+++ b/customer/app/src/app/components/fit-navigation/fit-navigation.component.ts
@@ -13,7 +13,7 @@ export class FitNavigationComponent implements OnInit {
items: MenuItem[] = [
{
route: '/home',
- label: 'Home',
+ label: 'Órarend',
roles: ['*']
},
// {
diff --git a/customer/app/src/app/components/month-calendar-event/month-calendar-event.component.html b/customer/app/src/app/components/month-calendar-event/month-calendar-event.component.html
index 4d2cfbb..fdbf12e 100644
--- a/customer/app/src/app/components/month-calendar-event/month-calendar-event.component.html
+++ b/customer/app/src/app/components/month-calendar-event/month-calendar-event.component.html
@@ -1,22 +1,22 @@
+
+
+
-
{{formatTime()}}
+
{{event.start | eventDate:'time' }}
{{event.eventType.name}}
- {{formatTrainer()}} very long name
+ {{formatTrainer()}}
diff --git a/customer/app/src/app/components/month-calendar-event/month-calendar-event.component.ts b/customer/app/src/app/components/month-calendar-event/month-calendar-event.component.ts
index 9bee905..01b0886 100644
--- a/customer/app/src/app/components/month-calendar-event/month-calendar-event.component.ts
+++ b/customer/app/src/app/components/month-calendar-event/month-calendar-event.component.ts
@@ -1,6 +1,6 @@
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
import {Event} from "../../services/event.service";
-import {dateToMoment, MonthCalendarEvent} from "../month-calendar/month-calendar.component";
+import { MonthCalendarEvent} from "../month-calendar/month-calendar.component";
@Component({
selector: 'app-month-calendar-event',
@@ -21,10 +21,6 @@ export class MonthCalendarEventComponent implements OnInit {
ngOnInit() {
}
- formatTime() {
- return dateToMoment(this.event.start).utc().format('HH:mm');
- }
-
hasTrainer() {
return !!this.event.trainer;
}
@@ -42,7 +38,7 @@ export class MonthCalendarEventComponent implements OnInit {
}
maySelect() {
- return this.event.registrations?.length == 0 && this.event.hasFreeSeats;
+ return this.isRegistered() ? true : this.event.hasFreeSeats;
}
isRegistered() {
@@ -50,6 +46,30 @@ export class MonthCalendarEventComponent implements OnInit {
}
isDisabled() {
- return false;
+ return !this.isRegistered() && !this.event.hasFreeSeats;
+ }
+
+ getEventThemeClass(): string {
+
+ const theme = this.event?.eventType?.theme;
+ let styleClass = "bg-dark";
+ if (this.isDisabled()) {
+ styleClass = "bg-secondary";
+ } else {
+ if (theme != null && theme.length > 0) {
+ if (this.isRegistered()) {
+ styleClass += " event-theme-active-" + theme;
+ } else {
+ styleClass += " event-theme-normal-" + theme;
+ }
+ } else {
+ if (this.isRegistered()) {
+ styleClass += " bg-primary";
+ } else {
+ styleClass += " bg-dark";
+ }
+ }
+ }
+ return styleClass;
}
}
diff --git a/customer/app/src/app/pages/event-details/event-details.component.html b/customer/app/src/app/pages/event-details/event-details.component.html
index 1290e70..2b15954 100644
--- a/customer/app/src/app/pages/event-details/event-details.component.html
+++ b/customer/app/src/app/pages/event-details/event-details.component.html
@@ -15,11 +15,11 @@
Edzés kezdési időpontja
-
{{event.start * 1000 | date:'yyyy.MM.dd HH:mm'}}
+
{{event.start | eventDate:'datetime'}}
Edzés vége
-
{{event.end * 1000 | date:'yyyy.MM.dd HH:mm'}}
+
{{event.end | eventDate: 'datetime'}}
Férőhelyek száma
diff --git a/customer/app/src/app/pages/event-details/event-details.component.ts b/customer/app/src/app/pages/event-details/event-details.component.ts
index 4999984..f63a519 100644
--- a/customer/app/src/app/pages/event-details/event-details.component.ts
+++ b/customer/app/src/app/pages/event-details/event-details.component.ts
@@ -41,8 +41,8 @@ export class EventDetailsComponent implements OnInit {
ngOnInit() {
let idEvent = +this.route.snapshot.paramMap.get('idEvent');
this.eventService.findEvent(idEvent).subscribe(
- value => {
- this.event = value;
+ event => {
+ this.event = event;
this.eventForm.patchValue({"idEvent": this.event.id})
}
);
@@ -74,7 +74,7 @@ export class EventDetailsComponent implements OnInit {
this.eventService.register(request)
.subscribe(
value => {
- this.toastr.success('Sikeresen Foglalás', 'Foglalás');
+ this.toastr.success('Sikeres Foglalás', 'Foglalás');
this.goBack();
},
@@ -106,6 +106,7 @@ export class EventDetailsComponent implements OnInit {
this.eventService.cancelRegistration(event.registrations[0].id)
.subscribe(
() => {
+ this.toastr.success("Sikeres lemondás", "Lemondás")
this.goBack();
},
() => {
diff --git a/customer/app/src/app/pages/registration/registration.component.html b/customer/app/src/app/pages/registration/registration.component.html
index d9bea35..f5d0187 100644
--- a/customer/app/src/app/pages/registration/registration.component.html
+++ b/customer/app/src/app/pages/registration/registration.component.html
@@ -25,6 +25,18 @@
Terem
{{registration.event?.room?.name }}
+
+
Regisztráció időpontja
+
{{registration.created_at | eventDate:'datetime' }}
+
+
+
Regisztráció lemondásának időpontja
+
{{registration.canceled_at | eventDate:'datetime' }}
+
+
+
Regisztráció törlésének időpontja
+
{{registration.deleted_at | eventDate:'datetime' }}
+
Státusz
diff --git a/customer/app/src/app/pages/registrations/registrations.component.html b/customer/app/src/app/pages/registrations/registrations.component.html
index b71a6e5..99ea7dc 100644
--- a/customer/app/src/app/pages/registrations/registrations.component.html
+++ b/customer/app/src/app/pages/registrations/registrations.component.html
@@ -1,16 +1,28 @@
-
-
- {{(registration.event.start * 1000) | date:'yyyy.MM.dd HH:mm'}} - {{registration.event.eventType.name}}
- - {{registration.event.trainer.name}}
-
-
+
+ Jelenleg nincsen aktív foglalása
+
+
+
+
+
+
+
+ {{ registration.event.start | eventDate: 'datetime' }} - {{registration.event.eventType.name}}
+ - {{registration.event.trainer.name}}
+
+
+
diff --git a/customer/app/src/app/pages/registrations/registrations.component.ts b/customer/app/src/app/pages/registrations/registrations.component.ts
index 6537275..f5256f1 100644
--- a/customer/app/src/app/pages/registrations/registrations.component.ts
+++ b/customer/app/src/app/pages/registrations/registrations.component.ts
@@ -3,6 +3,9 @@ import {Observable} from "rxjs";
import {EventService, Registration} from "../../services/event.service";
import {NavigationService} from "../../services/navigation.service";
import {flatMap, map, mergeMap} from "rxjs/operators";
+import {RegistrationService} from "../../services/reservation.service";
+import { faCalendarCheck, faCalendarMinus, faCalendarTimes } from '@fortawesome/free-solid-svg-icons';
+
@Component({
selector: 'app-registrations',
@@ -10,9 +13,14 @@ import {flatMap, map, mergeMap} from "rxjs/operators";
styleUrls: ['./registrations.component.scss']
})
export class RegistrationsComponent implements OnInit {
+ faCalendarCheck = faCalendarCheck;
+ faCalendarMinus = faCalendarMinus;
+ faCalendarTimes = faCalendarTimes;
registrations: Observable
;
- constructor(private eventService: EventService, private navigationService: NavigationService) { }
+ constructor(private eventService: EventService,
+ private navigationService: NavigationService,
+ public registrationService: RegistrationService) { }
ngOnInit() {
this.registrations = this.eventService.findRegistrations()
diff --git a/customer/app/src/app/pipes/event-time.pipe.ts b/customer/app/src/app/pipes/event-time.pipe.ts
new file mode 100644
index 0000000..3fb1edb
--- /dev/null
+++ b/customer/app/src/app/pipes/event-time.pipe.ts
@@ -0,0 +1,19 @@
+import { Pipe, PipeTransform } from '@angular/core';
+import {AppService} from "../app.service";
+
+@Pipe({
+ name: 'eventDate'
+})
+export class EventDatePipe implements PipeTransform {
+
+ constructor(private appService: AppService) {
+
+ }
+
+ transform(unixtime: number, format: 'date' | 'time' | 'datetime' ): unknown {
+ const date = format == 'date' || format == 'datetime';
+ const time = format == 'time' || format == 'datetime';
+ return this.appService.formatDateTime(unixtime,date,time);
+ }
+
+}
diff --git a/customer/app/src/app/services/event.service.ts b/customer/app/src/app/services/event.service.ts
index c7e0a9a..5af08a3 100644
--- a/customer/app/src/app/services/event.service.ts
+++ b/customer/app/src/app/services/event.service.ts
@@ -88,6 +88,7 @@ export interface Room {
export interface EventType {
id: number;
name: string;
+ theme: string;
}
export interface DayToDisplay {
diff --git a/customer/app/src/app/services/reservation.service.ts b/customer/app/src/app/services/reservation.service.ts
index 5ca3cab..f600529 100644
--- a/customer/app/src/app/services/reservation.service.ts
+++ b/customer/app/src/app/services/reservation.service.ts
@@ -8,13 +8,13 @@ export class RegistrationService {
constructor() { }
- public isCanceled(registration: Registration){
- return registration.canceled_at != null;
- }
-
public isDeleted(registration: Registration){
return registration.deleted_at != null;
}
+ public isCanceled(registration: Registration){
+ return !this.isDeleted(registration) && registration.canceled_at != null;
+ }
+
public isActive(registration: Registration){
return !this.isDeleted(registration) && !this.isCanceled(registration)
diff --git a/customer/app/src/styles.scss b/customer/app/src/styles.scss
index 11cf200..6f5e9c1 100644
--- a/customer/app/src/styles.scss
+++ b/customer/app/src/styles.scss
@@ -1,6 +1,7 @@
/* You can add global styles to this file, and also import other style files */
+
$font-size-xs: 0.625rem;
$font-size-sm: 1rem;
$font-size-md: 1.25rem;
@@ -54,6 +55,7 @@ $btn-border-radius: $border-radius-0;
@import '~ngx-toastr/toastr';
@import "styles/bootstrap-custom";
@import "styles/fonts";
+@import "styles/event.themes";
html{
height: 100%;
}
@@ -65,3 +67,6 @@ body{
background-repeat: repeat-y;
}
+
+
+
diff --git a/customer/app/src/styles/event.themes.scss b/customer/app/src/styles/event.themes.scss
new file mode 100644
index 0000000..3539b40
--- /dev/null
+++ b/customer/app/src/styles/event.themes.scss
@@ -0,0 +1,52 @@
+$event-color-yellow: #ECB809; // - sárga
+$event-color-burgundy :#AE173B; // - bordó
+$event-color-pink :#DF429B; // - pink
+$event-color-purple :#B929B1; // - lila
+$event-color-turquoise :#3EBFAE; // - türkiz
+$event-color-blue :#6594D1; // - kék
+$event-color-orange :#F1591A; // - narancs
+$event-color-green :#30B211; // - zöld
+$event-color-red :#E82A36; // - piros
+$event-color-brown :#98701E; // - barna
+
+
+$event-theme-0: $event-color-yellow; // - sárga
+$event-theme-1 :$event-color-burgundy; // - bordó
+$event-theme-2 :$event-color-pink; // - pink
+$event-theme-3 :$event-color-purple; // - lila
+$event-theme-4 :$event-color-turquoise; // - türkiz
+$event-theme-5 :$event-color-blue; // - kék
+$event-theme-6 :$event-color-orange; // - narancs
+$event-theme-7 :$event-color-green; // - zöld
+$event-theme-8 :$event-color-red; // - piros
+$event-theme-9 :$event-color-brown; // - barna
+
+
+$event-themes: (
+ "0": $event-theme-0,
+ "1": $event-theme-1,
+ "2": $event-theme-2,
+ "3": $event-theme-3,
+ "4": $event-theme-4,
+ "5": $event-theme-5,
+ "6": $event-theme-6,
+ "7": $event-theme-7,
+ "8": $event-theme-8,
+ "9": $event-theme-9
+);
+
+@each $name, $color in $event-themes {
+
+ @debug "event theme - divider offset:";
+
+ .event-theme-normal-#{$name} {
+ .event-bar{
+ background-color: #{$color} !important;
+ }
+ }
+
+ .event-theme-active-#{$name}{
+ background-color: #{$color} !important;
+ }
+
+}
diff --git a/customerapi/controllers/EventController.php b/customerapi/controllers/EventController.php
index 0f9d87e..1487828 100644
--- a/customerapi/controllers/EventController.php
+++ b/customerapi/controllers/EventController.php
@@ -9,12 +9,18 @@
namespace customerapi\controllers;
+use common\helpers\AppArrayHelper;
use common\models\Event;
use common\models\EventRegistration;
use common\models\EventType;
+use common\models\Trainer;
+use common\modules\event\manager\EventManager;
use customerapi\manager\EventRegistrationManager;
use customerapi\models\available\EventInterval;
use customerapi\models\available\EventAvailable;
+use customerapi\models\available\EventTypeAvailable;
+use customerapi\models\available\RoomAvailable;
+use customerapi\models\available\TrainerAvailable;
use customerapi\models\DayToDisplay;
use customerapi\models\details\EventDetailsView;
use customerapi\models\details\EventRegistrationView;
@@ -23,6 +29,7 @@ use customerapi\models\details\RoomDetailsView;
use customerapi\models\details\TrainerDetailsView;
use DateTime;
use Exception;
+use yii\db\ActiveQuery;
use yii\db\Query;
use yii\web\Response;
@@ -58,37 +65,42 @@ class EventController extends \customerapi\controllers\CustomerApiController
$dates[] = $dayToDisplay;
}
- // get events between active dates
- $query = EventAvailable::find();
- $query = $query->select(
- [
- '{{event}}.*',
-// 'COUNT({{event_registration}}.id) AS reservationCount'
- ]);
+ $eventManager = new EventManager();
+ $events = $eventManager->findActiveEvents($interval);
+ $trainers = AppArrayHelper::objectArrayToMapById( TrainerAvailable::find()->all() );
+ $rooms = AppArrayHelper::objectArrayToMapById( RoomAvailable::find()->all() );
+ $eventTypes = AppArrayHelper::objectArrayToMapById( EventTypeAvailable::find()->all() );
- $paramEventStartMax = clone $interval->lastActiveDate;
- $paramEventStartMax = $paramEventStartMax->modify('+1 day');
- $paramEventStartMax = $paramEventStartMax->getTimestamp();
- $events = $query
- ->innerJoinWith('trainer')
- ->innerJoinWith('eventType')
- ->innerJoinWith('room')
- ->andWhere(['>=', 'event.start', $interval->firstActiveDate->getTimestamp()])
- ->andWhere(['<', 'event.start', $paramEventStartMax])
- ->andWhere(['event.active' => '1'])
- ->all();
+
+ $availableEvents = [];
+
+ /** @var $event /common/models/Event $event */
+ foreach ($events as $event ){
+ $availableEvent = EventAvailable::fromEvent($event);
+ $availableEvent->trainer = $trainers[$event->id_trainer];
+ $availableEvent->room = $rooms[$event->id_room];
+ $availableEvent->eventType = $eventTypes[$event->id_event_type];
+
+ $totalRegistrations = $eventManager->findActiveRegistrations($event->id);
+ $customerRegistration = EventRegistration::filterForCustomer($totalRegistrations,\Yii::$app->user->id);
+ $availableEvent->registrationCount = count($totalRegistrations);
+ $availableEvent->eventRegistrations = $customerRegistration;
+ $availableEvent->hasFreeSeats = $availableEvent->registrationCount < $availableEvent->seat_count;
+
+
+ $availableEvents[] = $availableEvent;
+
+
+ }
// set events per day
/** @var EventAvailable $event */
- foreach ($events as $event) {
+ foreach ($availableEvents as $event) {
$eventDay = new DateTime();
$eventDay->setTimestamp($event->start);
$eventDay->setTime(0, 0);
- $event->reservationCount = $event->getEventRegistrationCount();
- $event->hasFreeSeats = $event->reservationCount < $event->seat_count;
-
/** @var DayToDisplay $date */
foreach ($dates as $date) {
if ($date->date === $eventDay->getTimestamp()) {
@@ -122,11 +134,13 @@ class EventController extends \customerapi\controllers\CustomerApiController
$paramEventStartMax = $paramEventStartMax->modify('+1 day');
$paramEventStartMax = $paramEventStartMax->getTimestamp();
+
+ /** @var ActiveQuery $query */
return $query
->innerJoinWith('trainer')
->innerJoinWith('eventType')
->innerJoinWith('room')
- ->joinWith('activeEventRegistrations','event.id = activeEventRegistrations.id_event')
+ ->joinWith('activeEventRegistrations')
->andWhere(['>=', 'event.start', $interval->firstActiveDate->getTimestamp()])
->andWhere(['<', 'event.start', $paramEventStartMax])
->andWhere(['event.active' => '1']);
@@ -141,14 +155,10 @@ class EventController extends \customerapi\controllers\CustomerApiController
public function actionEvent($id_event)
{
$interval = EventInterval::createInterval();
+ $manger = new EventManager();
try {
- $query = Event::find();
- $query = $this->buildEventQuery($query, $interval);
- $query = $query->andWhere(['event.id' => $id_event]);
-
/** @var Event $event */
- $event = $query->one();
-
+ $event = $manger->findActiveEvent($id_event,$interval);
$result = new EventDetailsView();
$result->id = $event->id;
$result->start = $event->start;
diff --git a/customerapi/controllers/EventRegistrationController.php b/customerapi/controllers/EventRegistrationController.php
index b780d4e..1a16d02 100644
--- a/customerapi/controllers/EventRegistrationController.php
+++ b/customerapi/controllers/EventRegistrationController.php
@@ -29,7 +29,7 @@ class EventRegistrationController extends CustomerApiController
public function actionIndex()
{
$registrationManager = new EventRegistrationManager();
- return $this->asJson( $registrationManager->findCustomerRegistrationsWithEvent() );
+ return $this->asJson( $registrationManager->findCustomerRegistrationsWithEvent(\Yii::$app->user->id) );
}
/** @noinspection PhpUnused */
@@ -42,7 +42,7 @@ class EventRegistrationController extends CustomerApiController
{
$registrationManager = new EventRegistrationManager();
return $this->asJson(
- $registrationManager->findRegistration($id_registration)
+ $registrationManager->findRegistration($id_registration,\Yii::$app->user->id)
);
}
diff --git a/customerapi/manager/EventRegistrationManager.php b/customerapi/manager/EventRegistrationManager.php
index d5818ed..f6615ab 100644
--- a/customerapi/manager/EventRegistrationManager.php
+++ b/customerapi/manager/EventRegistrationManager.php
@@ -2,9 +2,11 @@
namespace customerapi\manager;
use common\models\EventRegistration;
+use common\modules\event\manager\EventManager;
use customerapi\models\available\EventInterval;
-use customerapi\models\registrations\EventRegistrationAvailable;
-use yii\db\ActiveQuery;
+use customerapi\models\dto\EventDTO;
+use customerapi\models\dto\EventRegistrationDTO;
+use yii\web\NotFoundHttpException;
class EventRegistrationManager
{
@@ -12,44 +14,55 @@ class EventRegistrationManager
/** Get Customer registrations
* @throws \Exception
*/
- public function findCustomerRegistrationsWithEvent()
- {
- return $this->prepareQueryFindRegistrationsForCustomer()->all();
- }
-
- public function findCustomerRegistrations($clazz= EventRegistration::class )
+ public function findCustomerRegistrationsWithEvent($idCustomer)
{
$interval = EventInterval::createInterval();
- return EventRegistration::find()
- ->innerJoinWith('event')
- ->andWhere(['and',
- ['>=', 'event.start', $interval->firstActiveDate->getTimestamp()],
- ['id_customer' => \Yii::$app->user->getId()]
- ])->all();
- }
+ $now = new \DateTime();
+ $eventRegistrations = EventRegistration::find()
+ ->andWhere(['id_customer' => $idCustomer])
+// ->andWhere(['>=', 'event.start', $now->getTimestamp()])
+ ->all();
- public function findRegistration($id_registration)
- {
- return $this->prepareQueryFindRegistrationsForCustomer()
- ->andWhere(['event_registration.id' => $id_registration])
- ->one();
+ $result = [];
+ $eventManager = new EventManager();
+ foreach ($eventRegistrations as $registration ){
+ $dto = EventRegistrationDTO::fromEventRegistration($registration);
+
+ $event = $eventManager->findActiveEvent($registration->id_event, $interval,true);
+ if ( isset($event)){
+ $dto->event = EventDTO::fromEventWithRelatedObjects($event);
+ $result[] = $dto;
+ }
+ }
+
+ return $result;
}
+
/**
- * Prepare a query to get registrations for customer
- * @return ActiveQuery query
- * @throws \Exception
+ * @throws NotFoundHttpException
*/
- private function prepareQueryFindRegistrationsForCustomer(){
+ public function findRegistration($id_registration, $id_customer)
+ {
$interval = EventInterval::createInterval();
- return EventRegistrationAvailable::find()
- ->innerJoinWith('event')
- ->andWhere(['and',
- ['>=', 'event.start', $interval->firstActiveDate->getTimestamp()],
- ['id_customer' => \Yii::$app->user->getId()]
- ]);
+
+ $registration = EventRegistration::findOne(['id' => $id_registration, 'id_customer' => $id_customer]);
+
+ if ( !isset($registration)){
+ throw new NotFoundHttpException();
+ }
+
+ $eventManager = new EventManager();
+ $event = $eventManager->findActiveEvent($registration->id_event,$interval,true);
+
+ if ( !isset($event)){
+ throw new NotFoundHttpException();
+ }
+
+ return EventRegistrationDTO::fromEventRegistrationWithEvent($registration,$event);
}
+
}
diff --git a/customerapi/models/available/EventAvailable.php b/customerapi/models/available/EventAvailable.php
index a74346d..3c04ef1 100644
--- a/customerapi/models/available/EventAvailable.php
+++ b/customerapi/models/available/EventAvailable.php
@@ -5,54 +5,72 @@ namespace customerapi\models\available;
use common\models\Event;
+use common\models\EventRegistration;
+use common\models\EventType;
+use common\models\Room;
+use common\models\Trainer;
+use yii\base\Model;
-class EventAvailable extends Event
+class EventAvailable extends Model
{
- public $reservationCount;
+ public $id;
+ public $start;
+ public $end;
+ public $seat_count;
+ public $created_at;
+ public $updated_at;
+ public $deleted_at;
+ public $active;
+ public $eventType;
+ public $trainer;
+ public $room;
+ public $eventRegistrations;
+
+ public $registrationCount;
public $hasFreeSeats;
- protected function getTrainerClass()
+ /**
+ * @param $event /common/models/Event
+ */
+ public static function fromEvent($event)
{
- // override trainer class to have more control
- // about json fields
- return TrainerAvailable::class;
- }
+ $available = new EventAvailable();
+ $available->id = $event->id;
+ $available->start = $event->start;
+ $available->end = $event->end;
+ $available->seat_count = $event->seat_count;
+ $available->created_at = $event->created_at;
+ $available->updated_at = $event->updated_at;
+ $available->deleted_at = $event->deleted_at;
+ $available->active = $event->active;
- protected function getEventTypeClass()
- {
- return EventTypeAvailable::class;
+ return $available;
}
- protected function getRoomClass()
- {
- return RoomAvailable::class;
- }
-
-
function fields()
{
$fields = [
- "id" => "id",
- "start" => "start",
- "end" => "end",
- "seat_count" => "seat_count",
- "active" => "active",
- "reservationCount" => "reservationCount",
- "hasFreeSeats" => "hasFreeSeats",
+ "id" => "id",
+ "start" => "start",
+ "end" => "end",
+ "seat_count" => "seat_count",
+ "active" => "active",
+ "reservationCount" => "registrationCount",
+ "hasFreeSeats" => "hasFreeSeats",
];
$fields['trainer'] = 'trainer';
$fields['eventType'] = 'eventType';
$fields['room'] = 'room';
- $fields['registrations'] = 'activeEventRegistrationsForCustomer';
+ $fields['registrations'] = 'eventRegistrations';
return $fields;
}
function extraFields()
{
- $extra= parent::extraFields();
+ $extra = parent::extraFields();
$extra[] = 'trainer';
return $extra;
}
diff --git a/customerapi/models/available/EventTypeAvailable.php b/customerapi/models/available/EventTypeAvailable.php
index 4debbd3..907e053 100644
--- a/customerapi/models/available/EventTypeAvailable.php
+++ b/customerapi/models/available/EventTypeAvailable.php
@@ -13,7 +13,8 @@ class EventTypeAvailable extends EventType
{
return [
'id' => 'id',
- 'name' => 'name'
+ 'name' => 'name',
+ 'theme' => 'theme'
];
}
diff --git a/customerapi/models/dto/EventDTO.php b/customerapi/models/dto/EventDTO.php
new file mode 100644
index 0000000..f5f103b
--- /dev/null
+++ b/customerapi/models/dto/EventDTO.php
@@ -0,0 +1,70 @@
+ "id",
+ "start" => "start",
+ "end" => "end",
+ "seat_count" => "seat_count",
+ "active" => "active",
+ "reservationCount" => "registrationCount",
+ "hasFreeSeats" => "hasFreeSeats",
+ "registrations" => "eventRegistrations",
+ ];
+ $fields['trainer'] = 'trainer';
+ $fields['eventType'] = 'eventType';
+ $fields['room'] = 'room';
+// $fields['registrations'] = 'eventRegistrations';
+ return $fields;
+ }
+
+ /**
+ * @param $event /common/models/Event
+ */
+ public static function fromEvent($event)
+ {
+ $dto = new EventDTO();
+ $dto->id = $event->id;
+ $dto->start = $event->start;
+ $dto->end = $event->end;
+ $dto->seat_count = $event->seat_count;
+ $dto->created_at = $event->created_at;
+ $dto->updated_at = $event->updated_at;
+ $dto->deleted_at = $event->deleted_at;
+ $dto->active = $event->active;
+
+ return $dto;
+ }
+
+ public static function fromEventWithRelatedObjects($event){
+ $eventDto = EventDTO::fromEvent($event);
+ $eventDto->trainer = TrainerDTO::fromTrainer($event->trainer);
+ $eventDto->room = RoomDTO::fromRoom($event->room);
+ $eventDto->eventType = EventTypeDTO::fromEventType($event->eventType);
+ return $eventDto;
+ }
+
+}
diff --git a/customerapi/models/dto/EventRegistrationDTO.php b/customerapi/models/dto/EventRegistrationDTO.php
new file mode 100644
index 0000000..0edfaad
--- /dev/null
+++ b/customerapi/models/dto/EventRegistrationDTO.php
@@ -0,0 +1,63 @@
+ 'id',
+ 'id_event' => 'id_event',
+ 'id_customer' => 'id_customer',
+ 'id_card' => 'id_card',
+ 'id_ticket' => 'id_ticket',
+ 'created_at' => 'created_at',
+ 'updated_at' => 'updated_at',
+ 'canceled_at' => 'canceled_at',
+ 'deleted_at' => 'deleted_at',
+ ];
+ $fields['event'] = 'event';
+ return $fields;
+ }
+
+
+ public static function fromEventRegistration($registration){
+ $dto = new EventRegistrationDTO();
+
+ $dto->id = $registration->id;
+ $dto->id_event = $registration->id_event;
+ $dto->id_customer = $registration->id_customer;
+ $dto->id_card = $registration->id_card;
+ $dto->id_ticket = $registration->id_ticket;
+ $dto->created_at = AppDateTimeHelper::convertMySqlDatetimeToPhpInteger( $registration->created_at);
+ $dto->updated_at = AppDateTimeHelper::convertMySqlDatetimeToPhpInteger($registration->updated_at);
+ $dto->canceled_at =AppDateTimeHelper::convertMySqlDatetimeToPhpInteger( $registration->canceled_at);
+ $dto->deleted_at = AppDateTimeHelper::convertMySqlDatetimeToPhpInteger($registration->deleted_at);
+
+ return $dto;
+ }
+
+ public static function fromEventRegistrationWithEvent($registration,$event){
+ $registrationDto = EventRegistrationDTO::fromEventRegistration($registration);
+ $registrationDto->event = EventDTO::fromEventWithRelatedObjects($event);
+ return $registrationDto;
+ }
+
+
+}
diff --git a/customerapi/models/dto/EventTypeDTO.php b/customerapi/models/dto/EventTypeDTO.php
new file mode 100644
index 0000000..a26d06c
--- /dev/null
+++ b/customerapi/models/dto/EventTypeDTO.php
@@ -0,0 +1,23 @@
+id = $eventType->id;
+ $dto->name = $eventType->name;
+ $dto->theme = $eventType->theme;
+ $dto->created_at = $eventType->created_at;
+ $dto->updated_at = $eventType->updated_at;
+ return $dto;
+}
+}
diff --git a/customerapi/models/dto/RoomDTO.php b/customerapi/models/dto/RoomDTO.php
new file mode 100644
index 0000000..2ae9707
--- /dev/null
+++ b/customerapi/models/dto/RoomDTO.php
@@ -0,0 +1,27 @@
+id = $room->id;
+ $dto->name = $room->name;
+ $dto->seat_count = $room->seat_count;
+ $dto->created_at = $room->created_at;
+ $dto->updated_at = $room->updated_at;
+ return $dto;
+ }
+}
diff --git a/customerapi/models/dto/TrainerDTO.php b/customerapi/models/dto/TrainerDTO.php
new file mode 100644
index 0000000..3bae3c5
--- /dev/null
+++ b/customerapi/models/dto/TrainerDTO.php
@@ -0,0 +1,32 @@
+id = $trainer->id;
+ $dto->name = $trainer->name;
+ $dto->phone = $trainer->phone;
+ $dto->email = $trainer->email;
+ $dto->password = $trainer->password;
+ $dto->active = $trainer->active;
+ $dto->created_at = $trainer->created_at;
+ $dto->updated_at = $trainer->updated_at;
+
+ return $dto;
+ }
+
+}
diff --git a/frontend/controllers/CustomerController.php b/frontend/controllers/CustomerController.php
index c5769b7..ad774c2 100644
--- a/frontend/controllers/CustomerController.php
+++ b/frontend/controllers/CustomerController.php
@@ -242,6 +242,7 @@ class CustomerController extends Controller
$model->customer = $customer;
$model->email = $customer->email;
$model->companyName = Helper::getCompanyName();
+ $model->groupTrainingUrl = Helper::getGroupTrainingUrl();
if ( \Yii::$app->request->isPost ){
$model->load(\Yii::$app->request->post());
diff --git a/frontend/models/PasswordChangeModel.php b/frontend/models/PasswordChangeModel.php
index 9ab38a9..fd4ac2b 100644
--- a/frontend/models/PasswordChangeModel.php
+++ b/frontend/models/PasswordChangeModel.php
@@ -19,6 +19,7 @@ class PasswordChangeModel extends Model
public $card;
public $companyName;
public $plainPassword;
+ public $groupTrainingUrl;
/**
* @inheritdoc