diff --git a/backend/views/event-registration/index.php b/backend/views/event-registration/index.php
index f6d170b..bc1b708 100644
--- a/backend/views/event-registration/index.php
+++ b/backend/views/event-registration/index.php
@@ -13,7 +13,7 @@ $this->params['breadcrumbs'][] = $this->title;
= Html::encode($this->title) ?>
- render('_search', ['model' => $searchModel]); ?>
+ render('_search', ['model' => $searchModel]); ?>
= Html::a(Yii::t('event-registration', 'Create Event Registration'), ['create'], ['class' => 'btn btn-success']) ?>
@@ -21,16 +21,15 @@ $this->params['breadcrumbs'][] = $this->title;
= GridView::widget([
'dataProvider' => $dataProvider,
- 'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'id_event',
'id_customer',
- 'created_at',
- 'updated_at',
- // 'canceled_at',
+ 'created_at:datetime',
+ 'updated_at:datetime',
+ 'canceled_at:datetime',
['class' => 'yii\grid\ActionColumn'],
],
diff --git a/backend/views/event-registration/register_card.php b/backend/views/event-registration/register_card.php
new file mode 100644
index 0000000..5e41518
--- /dev/null
+++ b/backend/views/event-registration/register_card.php
@@ -0,0 +1,21 @@
+title = Yii::t('event-registration', 'Create Event Registration');
+$this->params['breadcrumbs'][] = ['label' => Yii::t('event-registration', 'Event Registrations'), 'url' => ['index']];
+$this->params['breadcrumbs'][] = $this->title;
+?>
+
+
+
= Html::encode($this->title) ?>
+
+ = $this->render('_form_register_card', [
+ 'model' => $model,
+ ]) ?>
+
+
diff --git a/backend/views/event/_form_register_card.php b/backend/views/event/_form_register_card.php
new file mode 100644
index 0000000..c2ac420
--- /dev/null
+++ b/backend/views/event/_form_register_card.php
@@ -0,0 +1,23 @@
+
+
+
diff --git a/backend/views/event/index.php b/backend/views/event/index.php
index 8a9b83e..da6a166 100644
--- a/backend/views/event/index.php
+++ b/backend/views/event/index.php
@@ -62,8 +62,52 @@ $this->params['breadcrumbs'][] = $this->title;
'label' => \Yii::t('event', 'Updated At'),
'format' => 'datetime'
],
+ [
+ 'class' => 'yii\grid\ActionColumn',
+ 'template' => '{view} {update} {delete} {register-card}',
+ 'urlCreator' => function ($action, $model, $key, $index) {
+ $params = ['id' => $model['event_id']];
+ $params[0] = "event" . '/' . $action;
+ return \yii\helpers\Url::toRoute($params);
+ },
+ 'buttons' => [
+ 'view' => function ($url, $model, $key) {
+ $options = [
+ 'title' => Yii::t('yii', 'View'),
+ 'aria-label' => Yii::t('yii', 'View'),
+ 'data-pjax' => '0',
+ ];
+ return Html::a('
', $url, $options);
+ },
+ 'update' => function ($url, $model, $key) {
+ $options = [
+ 'title' => Yii::t('yii', 'Update'),
+ 'aria-label' => Yii::t('yii', 'Update'),
+ 'data-pjax' => '0',
+ ];
+ return Html::a('
', $url, $options);
+ },
+ 'delete' => function ($url, $model, $key) {
+ $options = [
+ 'title' => Yii::t('yii', 'Delete'),
+ 'aria-label' => Yii::t('yii', 'Delete'),
+ 'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'),
+ 'data-method' => 'post',
+ 'data-pjax' => '0',
+ ];
+ return Html::a('
', $url, $options);
+ },
+ 'register-card' => function ($url, $model, $key) {
+ $options = [
+ 'title' => Yii::t('yii', 'Register'),
+ 'aria-label' => Yii::t('yii', 'Register'),
+ 'data-pjax' => '0',
+ ];
+ return Html::a('
', $url, $options);
+ }
+ ]
- ['class' => 'yii\grid\ActionColumn'],
+ ],
],
]); ?>
diff --git a/backend/views/event/register_card.php b/backend/views/event/register_card.php
new file mode 100644
index 0000000..5e41518
--- /dev/null
+++ b/backend/views/event/register_card.php
@@ -0,0 +1,21 @@
+title = Yii::t('event-registration', 'Create Event Registration');
+$this->params['breadcrumbs'][] = ['label' => Yii::t('event-registration', 'Event Registrations'), 'url' => ['index']];
+$this->params['breadcrumbs'][] = $this->title;
+?>
+
+
+
= Html::encode($this->title) ?>
+
+ = $this->render('_form_register_card', [
+ 'model' => $model,
+ ]) ?>
+
+
diff --git a/common/manager/EventRegistrationManager.php b/common/manager/EventRegistrationManager.php
new file mode 100644
index 0000000..5ef65b5
--- /dev/null
+++ b/common/manager/EventRegistrationManager.php
@@ -0,0 +1,97 @@
+ "CARD_NOT_FOUND",
+ self::CUSTOMER_NOT_FOUND => "CUSTOMER_NOT_FOUND",
+ self::TICKET_NOT_FOUND => "TICKET_NOT_FOUND",
+ self::NO_FREE_SEATS => "NO_FREE_SEATS",
+ self::EVENT_TYPE_NOT_FOUND => "EVENT_TYPE_NOT_FOUND",
+ self::TICKET_INSUFFICIENT => "TICKET_INSUFFICIENT",
+
+
+ ];
+
+ /**
+ * @param \common\models\CardEventRegistrationForm $cardEventForm
+ * @throws NotFoundHttpException
+ * @throws BadRequestHttpException
+ * @throws ServerErrorHttpException
+ */
+ public function registerCard($cardEventForm){
+
+ if ( $cardEventForm->validate() ){
+
+ /** @var \common\models\Card $card */
+ $card = Card::readCard($cardEventForm->card_number,false);
+ if ( !isset($card )){
+ throw new NotFoundHttpException("Card not found: " . $cardEventForm->card_number,self::CARD_NOT_FOUND);
+ }
+
+ if ( $card->isFree() ){
+ throw new NotFoundHttpException("Customer not found", self::CUSTOMER_NOT_FOUND);
+ }
+
+ $activeTickets = $card->getActiveTickets();
+ if ( sizeof($activeTickets) == 0 ){
+ throw new NotFoundHttpException("Ticket not found", self::TICKET_NOT_FOUND);
+ }
+
+ /** @var \common\models\Event $event */
+ $event = Event::find()->andWhere(['id' => $cardEventForm->event_id])->one();
+ if ( !isset($event)){
+ throw new NotFoundHttpException("Event not found: " . $cardEventForm->event_id);
+ }
+
+ if ( !$event->hasFreeSeats() ){
+ throw new BadRequestHttpException("No free seats", self::NO_FREE_SEATS);
+ }
+
+ $eventType = $event->eventType;
+
+ if ( !isset($eventType) ){
+ throw new ServerErrorHttpException("Event type not found", self::EVENT_TYPE_NOT_FOUND);
+ }
+
+ $selectedTicket = $eventType->findTicketAllowingEventType($activeTickets);
+
+ if ( !isset($selectedTicket) ){
+ throw new NotFoundHttpException("Ticket not found", self::TICKET_INSUFFICIENT);
+ }
+
+ $registration = new EventRegistration();
+ $registration->id_event = $event->id;
+ $registration->id_card = $card->id_card;
+ $registration->id_ticket = $selectedTicket->id_ticket;
+ $registration->save(false);
+
+ $cardEventForm->registration = $registration;
+ }
+
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/common/messages/hu/event-registration.php b/common/messages/hu/event-registration.php
new file mode 100644
index 0000000..fe6c961
--- /dev/null
+++ b/common/messages/hu/event-registration.php
@@ -0,0 +1,32 @@
+ 'ID',
+ 'Name' => 'Név',
+ 'Seat Count' => 'Férőhelyek száma',
+ 'Create Event Registration' => 'Új regisztráció',
+ 'Update Event Registration:' => 'Regisztráció módosítása:',
+
+ 'Event Registrations' => 'Regisztrációk',
+ 'Created At' => 'Létrehozási dátum, idő',
+ 'Updated At' => 'Módosítási dátum, idő',
+ 'Search' => 'Keres',
+ 'Create' => 'Mentés',
+ 'Update' => 'Módosít',
+ 'Delete' => 'Törlés',
+ 'All' => 'Mind',
+ 'Unknown Error' => "Ismeretlen Hiba",
+ 'CARD_NOT_FOUND' => 'Kártya nem található',
+ 'CUSTOMER_NOT_FOUND' => 'Vendég nem található',
+ 'TICKET_NOT_FOUND' => 'Nincs aktív bérlet',
+ 'NO_FREE_SEATS' => 'Nincs szabad hely',
+ 'EVENT_TYPE_NOT_FOUND' => 'Az esemény típusa ismereten',
+ 'TICKET_INSUFFICIENT' => 'Nem található az eseményre jogosító aktív bérlet',
+];
\ No newline at end of file
diff --git a/common/models/Card.php b/common/models/Card.php
index 03c2ca9..16c95a9 100644
--- a/common/models/Card.php
+++ b/common/models/Card.php
@@ -24,7 +24,7 @@ use common\components\Helper;
*/
class Card extends \common\models\BaseFitnessActiveRecord
{
-
+
const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;
const STATUS_INACTIVE = 20;
@@ -34,8 +34,8 @@ class Card extends \common\models\BaseFitnessActiveRecord
const TYPE_BARCODE = 30;
const TYPE_OLD = 40;
const TYPE_EMPLOYEE = 50;
-
-
+
+
public static $FLAG_TICKET = 0; //has valid ticket
public static $FLAG_DOOR = 1; //door in/out order
public static $FLAG_KEY = 2; //key status
@@ -121,8 +121,8 @@ class Card extends \common\models\BaseFitnessActiveRecord
'updated_at' => Yii::t('common/card', 'Updated At'),
];
}
-
-
+
+
public function validateAscii($attribute, /** @noinspection PhpUnusedParameterInspection */
$params){
if ( !$this->hasErrors($this->$attribute)){
@@ -131,7 +131,7 @@ class Card extends \common\models\BaseFitnessActiveRecord
Yii::info(" $attribute converted to: " . $this->$attribute);
}
}
-
+
static function statuses() {
/** @noinspection PhpUndefinedClassInspection */
return [
@@ -140,7 +140,7 @@ class Card extends \common\models\BaseFitnessActiveRecord
self::STATUS_INACTIVE => 'Inaktív',
];
}
-
+
public function getStatusHuman(){
$result = null;
$s = self::statuses();
@@ -155,7 +155,7 @@ class Card extends \common\models\BaseFitnessActiveRecord
public static function toTypeName($type , $def = ""){
return Helper::getArrayValue(self::types(), $type, $def);
}
-
+
static function types() {
/** @noinspection PhpUndefinedClassInspection */
return [
@@ -166,7 +166,7 @@ class Card extends \common\models\BaseFitnessActiveRecord
self::TYPE_EMPLOYEE => Yii::t('common/card', 'Munkatárs'),
];
}
-
+
public function getTypeHuman(){
$result = null;
$s = self::types();
@@ -175,20 +175,24 @@ class Card extends \common\models\BaseFitnessActiveRecord
}
return $result;
}
-
+
public function isInactive(){
return $this->status == self::STATUS_DELETED;
}
-
+
+ /**
+ * Load card from the DB , where the number equals with card number or RFID number
+ * @param number|string $number the card number or the RFID number
+ * @param null|boolean $free optional. if set, append free or not free condition.
+ * @return \common\models\Card|null the card or null, if not found with given conditions
+ */
public static function readCard($number,$free = null){
$card = null;
$query = Card::find()
->leftJoin(Customer::tableName(), 'card.id_card = customer.id_customer_card ' );
-// ->andWhere(['number'=>$number ]);
-
+
Card::addCardNumberCondition($query, $number);
-
-
+
if ( isset($free) ){
if ( $free == true){
$query->andWhere('customer.id_customer is null');
@@ -196,20 +200,20 @@ class Card extends \common\models\BaseFitnessActiveRecord
$query->andWhere('customer.id_customer is not null');
}
}
-
+
$cards = $query->all();
-
+
if ( count($cards) == 1){
$card = $cards[0];
}
return $card;
}
-
-
+
+
public function getCustomer(){
return $this->hasOne(Customer::className(), ['id_customer_card' => 'id_card']);
}
-
+
public function getCustomerName(){
$name = null;
if ( $this->customer != null){
@@ -232,7 +236,7 @@ class Card extends \common\models\BaseFitnessActiveRecord
['and', ['in',$field_rfid_key ,[ $number ] ],"trim(coalesce(card.rfid_key, '')) <>'' "],
]);
}
-
+
public static function updateCardFlagTicket($id){
if ( !isset($id)){
return ;
@@ -255,7 +259,7 @@ class Card extends \common\models\BaseFitnessActiveRecord
}
}
-
+
public function beforeSave($insert) {
if (parent::beforeSave($insert)){
$this->flag = Helper::setBit( $this->flag , Card::$FLAG_STATUS, ( $this->status != Card::STATUS_ACTIVE ) );
@@ -263,8 +267,8 @@ class Card extends \common\models\BaseFitnessActiveRecord
}
return false;
}
-
-
+
+
public function getFlagText(){
return Helper::getArrayValue(DoorLog::getCardFlagTexts(), $this->validity, "Ismeretlen");
}
@@ -317,4 +321,12 @@ class Card extends \common\models\BaseFitnessActiveRecord
\Yii::$app->db->createCommand(self::$SQL_UPDATE_FLAG_STATUS_ACTIVE)->execute();
}
+ public function isFree(){
+ return !isset($this->customer);
+ }
+
+ public function getActiveTickets(){
+ return Ticket::readActive($this);
+ }
+
}
diff --git a/common/models/CardEventRegistrationForm.php b/common/models/CardEventRegistrationForm.php
new file mode 100644
index 0000000..aa4154f
--- /dev/null
+++ b/common/models/CardEventRegistrationForm.php
@@ -0,0 +1,33 @@
+card_number = Helper::fixAsciiChars( $this->card_number );
+ }
+
+ public function getIsNewRecord(){
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/common/models/Event.php b/common/models/Event.php
index 7e6e579..6fd3e46 100644
--- a/common/models/Event.php
+++ b/common/models/Event.php
@@ -9,14 +9,16 @@ use yii\helpers\ArrayHelper;
/**
* This is the model class for table "event".
*
-// * @property integer $id
+ * @property integer $id
* @property integer $start
* @property integer $end
* @property integer $id_room
* @property integer $id_trainer
* @property integer $id_event_type
+ * @property integer $seat_count
* @property string $created_at
* @property string $updated_at
+ * @property \common\models\EventType eventType
*/
class Event extends \yii\db\ActiveRecord
{
@@ -73,6 +75,9 @@ class Event extends \yii\db\ActiveRecord
];
}
+ /**
+ * @throws \Exception
+ */
public function afterFind()
{
parent::afterFind(); // TODO: Change the autogenerated stub
@@ -104,8 +109,31 @@ class Event extends \yii\db\ActiveRecord
return $this->hasOne(Trainer::className(),['id' => 'id_trainer']);
}
- public function getRoom(){
+ /**
+ * @return Room|\yii\db\ActiveQuery
+ */
+ public function getRoom() {
return $this->hasOne(Room::className(),['id' => 'id_room']);
}
+ /**
+ * @return \common\models\EventRegistration[]|\yii\db\ActiveQuery
+ */
+ public function getEventRegistrations(){
+ return $this->hasMany(EventRegistration::className(),['id_event' => 'id']);
+ }
+
+ /**
+ * @return \common\models\EventRegistration[]|\yii\db\ActiveQuery
+ */
+ public function getEventRegistrationCount(){
+ return sizeof($this->getEventRegistrations());
+ }
+
+ public function hasFreeSeats(){
+ $registrationCount = $this->getEventRegistrations() ;
+
+ return $registrationCount < $this->seat_count ;
+ }
+
}
diff --git a/common/models/EventRegistration.php b/common/models/EventRegistration.php
index 55dd92d..ab2cfaf 100644
--- a/common/models/EventRegistration.php
+++ b/common/models/EventRegistration.php
@@ -10,6 +10,8 @@ use Yii;
* @property integer $id
* @property integer $id_event
* @property integer $id_customer
+ * @property integer $id_card
+ * @property integer $id_ticket
* @property string $created_at
* @property string $updated_at
* @property string $canceled_at
@@ -25,14 +27,12 @@ class EventRegistration extends \yii\db\ActiveRecord
}
/**
- * @inheritdoc
+ * @inheritdocd
*/
public function rules()
{
return [
[['id_event', 'id_customer'], 'integer'],
- [['created_at', 'updated_at', 'canceled_at'], 'required'],
- [['created_at', 'updated_at', 'canceled_at'], 'safe']
];
}
diff --git a/common/models/EventType.php b/common/models/EventType.php
index 0666a6c..9235bd0 100644
--- a/common/models/EventType.php
+++ b/common/models/EventType.php
@@ -76,4 +76,20 @@ class EventType extends \yii\db\ActiveRecord
}
return ArrayHelper::merge($extra,$items);
}
+
+ /**
+ * Find the first ticket, which allows this event type
+ * @param \common\models\Ticket[] $tickets the list of active tickets
+ * @return Ticket|null
+ */
+ public function findTicketAllowingEventType($tickets){
+ if (!isset($tickets)){
+ return null;
+ }
+ if ( sizeof($tickets) == 0 ){
+ return null;
+ }
+ // TODO: implement bossiness logic to select ticket
+ return $tickets[0];
+ }
}
diff --git a/console/migrations/m181219_063217_alter_table_EVENT_REGISTRATION_add_column_ID_TICKET.php b/console/migrations/m181219_063217_alter_table_EVENT_REGISTRATION_add_column_ID_TICKET.php
new file mode 100644
index 0000000..57e00a5
--- /dev/null
+++ b/console/migrations/m181219_063217_alter_table_EVENT_REGISTRATION_add_column_ID_TICKET.php
@@ -0,0 +1,28 @@
+addColumn("event_registration", "id_ticket", $this->integer() );
+ $this->addColumn("event_registration", "id_card", $this->integer() );
+ }
+
+ public function down()
+ {
+ }
+
+ /*
+ // Use safeUp/safeDown to run migration code within a transaction
+ public function safeUp()
+ {
+ }
+
+ public function safeDown()
+ {
+ }
+ */
+}