From b2bb210cee5a22cf8d50d7641cfab8c1bc6407f8 Mon Sep 17 00:00:00 2001 From: Roland Schneider Date: Wed, 26 Dec 2018 16:50:17 +0100 Subject: [PATCH] implement registration --- backend/controllers/EventController.php | 30 ++++++ .../EventRegistrationController.php | 30 ++++++ backend/views/event-registration/_form.php | 7 -- .../_form_register_card.php | 24 +++++ backend/views/event-registration/_search.php | 32 ++++-- backend/views/event-registration/index.php | 9 +- .../event-registration/register_card.php | 21 ++++ backend/views/event/_form_register_card.php | 23 +++++ backend/views/event/index.php | 46 ++++++++- backend/views/event/register_card.php | 21 ++++ common/manager/EventRegistrationManager.php | 97 +++++++++++++++++++ common/messages/hu/event-registration.php | 32 ++++++ common/models/Card.php | 60 +++++++----- common/models/CardEventRegistrationForm.php | 33 +++++++ common/models/Event.php | 32 +++++- common/models/EventRegistration.php | 6 +- common/models/EventType.php | 16 +++ ...VENT_REGISTRATION_add_column_ID_TICKET.php | 28 ++++++ 18 files changed, 496 insertions(+), 51 deletions(-) create mode 100644 backend/views/event-registration/_form_register_card.php create mode 100644 backend/views/event-registration/register_card.php create mode 100644 backend/views/event/_form_register_card.php create mode 100644 backend/views/event/register_card.php create mode 100644 common/manager/EventRegistrationManager.php create mode 100644 common/messages/hu/event-registration.php create mode 100644 common/models/CardEventRegistrationForm.php create mode 100644 console/migrations/m181219_063217_alter_table_EVENT_REGISTRATION_add_column_ID_TICKET.php diff --git a/backend/controllers/EventController.php b/backend/controllers/EventController.php index 703e2d8..b44505e 100644 --- a/backend/controllers/EventController.php +++ b/backend/controllers/EventController.php @@ -2,10 +2,13 @@ namespace backend\controllers; +use common\manager\EventRegistrationManager; +use common\models\CardEventRegistrationForm; use Yii; use common\models\Event; use backend\models\EventSearch; use yii\web\Controller; +use yii\web\HttpException; use yii\web\NotFoundHttpException; use yii\filters\VerbFilter; @@ -95,6 +98,8 @@ class EventController extends Controller * If deletion is successful, the browser will be redirected to the 'index' page. * @param integer $id * @return mixed + * @throws NotFoundHttpException + * @throws \yii\db\StaleObjectException */ public function actionDelete($id) { @@ -103,6 +108,31 @@ class EventController extends Controller return $this->redirect(['index']); } + + public function actionRegisterCard($id){ + $model = new CardEventRegistrationForm(); + $model->event_id = $id; + if ($model->load(Yii::$app->request->post()) && $model->validate() ) { + $manager = new EventRegistrationManager(); + try { + $manager->registerCard($model); + } catch (HttpException $e) { + if ( array_key_exists($e->getCode(),EventRegistrationManager::$STATES)) { + $model->addError("id_event", Yii::t('event-registration', EventRegistrationManager::$STATES[$e->getCode()])); + } else { + $model->addError("id_event", Yii::t('event-registration', "Unknown Error")); + } + } + } + if ( $model->hasErrors() ){ + return $this->redirect(['view', 'id' => $model->registration->id]); + } else { + return $this->render('register_card', [ + 'model' => $model, + ]); + } + } + /** * Finds the Event model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. diff --git a/backend/controllers/EventRegistrationController.php b/backend/controllers/EventRegistrationController.php index 91e63b6..c109950 100644 --- a/backend/controllers/EventRegistrationController.php +++ b/backend/controllers/EventRegistrationController.php @@ -2,12 +2,17 @@ namespace backend\controllers; +use common\manager\EventRegistrationManager; +use common\models\CardEventRegistrationForm; use Yii; use common\models\EventRegistration; use backend\models\EventRegistrationSearch; +use yii\web\BadRequestHttpException; use yii\web\Controller; +use yii\web\HttpException; use yii\web\NotFoundHttpException; use yii\filters\VerbFilter; +use yii\web\ServerErrorHttpException; /** * EventRegistrationController implements the CRUD actions for EventRegistration model. @@ -95,6 +100,8 @@ class EventRegistrationController extends Controller * If deletion is successful, the browser will be redirected to the 'index' page. * @param integer $id * @return mixed + * @throws NotFoundHttpException + * @throws \yii\db\StaleObjectException */ public function actionDelete($id) { @@ -103,6 +110,29 @@ class EventRegistrationController extends Controller return $this->redirect(['index']); } + public function actionRegisterCard(){ + $model = new CardEventRegistrationForm(); + if ($model->load(Yii::$app->request->post()) && $model->validate() ) { + $manager = new EventRegistrationManager(); + try { + $manager->registerCard($model); + } catch (HttpException $e) { + if ( array_key_exists($e->getCode(),EventRegistrationManager::$STATES)) { + $model->addError("id_event", Yii::t('event-registration', EventRegistrationManager::$STATES[$e->getCode()])); + }else { + $model->addError("id_event", Yii::t('event-registration', "Unknown Error")); + } + } + } + if ( $model->hasErrors() ){ + return $this->redirect(['view', 'id' => $model->registration->id]); + } else { + return $this->render('register_card', [ + 'model' => $model, + ]); + } + } + /** * Finds the EventRegistration model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. diff --git a/backend/views/event-registration/_form.php b/backend/views/event-registration/_form.php index 9924d6e..732aa39 100644 --- a/backend/views/event-registration/_form.php +++ b/backend/views/event-registration/_form.php @@ -13,15 +13,8 @@ use yii\widgets\ActiveForm; field($model, 'id_event')->textInput() ?> - field($model, 'id_customer')->textInput() ?> - field($model, 'created_at')->textInput() ?> - - field($model, 'updated_at')->textInput() ?> - - field($model, 'canceled_at')->textInput() ?> -
isNewRecord ? Yii::t('event-registration', 'Create') : Yii::t('event-registration', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
diff --git a/backend/views/event-registration/_form_register_card.php b/backend/views/event-registration/_form_register_card.php new file mode 100644 index 0000000..97a44bb --- /dev/null +++ b/backend/views/event-registration/_form_register_card.php @@ -0,0 +1,24 @@ + + +
+ + + + field($model, 'card_number')->textInput() ?> + field($model, 'event_id')->textInput() ?> + +
+ isNewRecord ? Yii::t('event-registration', 'Create') : Yii::t('event-registration', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> +
+ + + +
diff --git a/backend/views/event-registration/_search.php b/backend/views/event-registration/_search.php index 2d919d0..b360509 100644 --- a/backend/views/event-registration/_search.php +++ b/backend/views/event-registration/_search.php @@ -15,21 +15,35 @@ use yii\widgets\ActiveForm; 'method' => 'get', ]); ?> - field($model, 'id') ?> +
+
+ Keresés +
+
+
+
+ field($model, 'id') ?> +
+
+ field($model, 'id_event') ?> +
+
+ field($model, 'id_customer') ?> +
+
+
+
- field($model, 'id_event') ?> - field($model, 'id_customer') ?> - field($model, 'created_at') ?> - field($model, 'updated_at') ?> - field($model, 'canceled_at') ?> + field($model, 'canceled_at') ?> -
- 'btn btn-primary']) ?> - 'btn btn-default']) ?> +
+
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;

title) ?>

- render('_search', ['model' => $searchModel]); ?> + render('_search', ['model' => $searchModel]); ?>

'btn btn-success']) ?> @@ -21,16 +21,15 @@ $this->params['breadcrumbs'][] = $this->title; $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; +?> +

+ +

title) ?>

+ + 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 @@ + + +
+ + + + field($model, 'card_number')->textInput() ?> + +
+ isNewRecord ? Yii::t('event-registration', 'Create') : Yii::t('event-registration', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> +
+ + + +
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; +?> +
+ +

title) ?>

+ + 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() + { + } + */ +}