implement registration

This commit is contained in:
Roland Schneider 2018-12-26 16:50:17 +01:00
parent b6e590f196
commit b2bb210cee
18 changed files with 496 additions and 51 deletions

View File

@ -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.

View File

@ -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.

View File

@ -13,15 +13,8 @@ use yii\widgets\ActiveForm;
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'id_event')->textInput() ?>
<?= $form->field($model, 'id_customer')->textInput() ?>
<?= $form->field($model, 'created_at')->textInput() ?>
<?= $form->field($model, 'updated_at')->textInput() ?>
<?= $form->field($model, 'canceled_at')->textInput() ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('event-registration', 'Create') : Yii::t('event-registration', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

View File

@ -0,0 +1,24 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model common\models\CardEventRegistrationForm */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="event-registration-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'card_number')->textInput() ?>
<?= $form->field($model, 'event_id')->textInput() ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('event-registration', 'Create') : Yii::t('event-registration', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

View File

@ -15,21 +15,35 @@ use yii\widgets\ActiveForm;
'method' => 'get',
]); ?>
<div class="panel panel-default">
<div class="panel-heading">
Keresés
</div>
<div class="panel-body">
<div class="row">
<div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
<?= $form->field($model, 'id') ?>
</div>
<div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
<?= $form->field($model, 'id_event') ?>
</div>
<div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
<?= $form->field($model, 'id_customer') ?>
</div>
<div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
</div>
</div>
<?= $form->field($model, 'created_at') ?>
<?= $form->field($model, 'updated_at') ?>
<?php // echo $form->field($model, 'canceled_at') ?>
<div class="form-group">
</div>
<div class="panel-footer">
<?= Html::submitButton(Yii::t('event-registration', 'Search'), ['class' => 'btn btn-primary']) ?>
<?= Html::resetButton(Yii::t('event-registration', 'Reset'), ['class' => 'btn btn-default']) ?>
</div>
</div>
<?php ActiveForm::end(); ?>

View File

@ -13,7 +13,7 @@ $this->params['breadcrumbs'][] = $this->title;
<div class="event-registration-index">
<h1><?= Html::encode($this->title) ?></h1>
<?php // echo $this->render('_search', ['model' => $searchModel]); ?>
<?php echo $this->render('_search', ['model' => $searchModel]); ?>
<p>
<?= 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'],
],

View File

@ -0,0 +1,21 @@
<?php
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model common\models\CardEventRegistrationForm */
$this->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;
?>
<div class="event-registration-create">
<h1><?= Html::encode($this->title) ?></h1>
<?= $this->render('_form_register_card', [
'model' => $model,
]) ?>
</div>

View File

@ -0,0 +1,23 @@
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $model common\models\CardEventRegistrationForm */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="event-registration-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'card_number')->textInput() ?>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('event-registration', 'Create') : Yii::t('event-registration', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>

View File

@ -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('<span class="glyphicon glyphicon-eye-open"></span>', $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('<span class="glyphicon glyphicon-pencil"></span>', $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('<span class="glyphicon glyphicon-trash"></span>', $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('<span class="glyphicon glyphicon-user"></span>', $url, $options);
}
]
['class' => 'yii\grid\ActionColumn'],
],
],
]); ?>

View File

@ -0,0 +1,21 @@
<?php
use yii\helpers\Html;
/* @var $this yii\web\View */
/* @var $model common\models\CardEventRegistrationForm */
$this->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;
?>
<div class="event-registration-create">
<h1><?= Html::encode($this->title) ?></h1>
<?= $this->render('_form_register_card', [
'model' => $model,
]) ?>
</div>

View File

@ -0,0 +1,97 @@
<?php
namespace common\manager;
use common\models\Card;
use common\models\Event;
use common\models\EventRegistration;
use yii\web\BadRequestHttpException;
use yii\web\NotFoundHttpException;
use yii\web\ServerErrorHttpException;
/**
* Created by IntelliJ IDEA.
* User: rocho
* Date: 2018.12.17.
* Time: 6:12
*/
class EventRegistrationManager extends \yii\base\Object
{
const CARD_NOT_FOUND = 1;
const CUSTOMER_NOT_FOUND = 2;
const TICKET_NOT_FOUND = 3;
const NO_FREE_SEATS = 4;
const EVENT_TYPE_NOT_FOUND = 5;
const TICKET_INSUFFICIENT = 6;
public static $STATES = [
self::CARD_NOT_FOUND => "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;
}
}
}

View File

@ -0,0 +1,32 @@
<?php
/**
* Created by IntelliJ IDEA.
* User: rocho
* Date: 2018.12.06.
* Time: 7:55
*/
return [
'ID' => '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',
];

View File

@ -180,15 +180,19 @@ class Card extends \common\models\BaseFitnessActiveRecord
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');
@ -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);
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace common\models;
use common\components\Helper;
/**
* Created by IntelliJ IDEA.
* User: rocho
* Date: 2018.12.17.
* Time: 6:14
*/
class CardEventRegistrationForm extends \yii\base\Model
{
public $card_number;
public $event_id;
public $registration;
public function rules()
{
return [
[['card_number'], 'validateFormat' ]
];
}
public function validateFormat(){
$this->card_number = Helper::fixAsciiChars( $this->card_number );
}
public function getIsNewRecord(){
return true;
}
}

View File

@ -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']);
}
/**
* @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 ;
}
}

View File

@ -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']
];
}

View File

@ -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];
}
}

View File

@ -0,0 +1,28 @@
<?php
use yii\db\Schema;
use yii\db\Migration;
class m181219_063217_alter_table_EVENT_REGISTRATION_add_column_ID_TICKET extends Migration
{
public function up()
{
$this->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()
{
}
*/
}