From 753cd46b2cef6d3a59c5e6231645545fff3829f3 Mon Sep 17 00:00:00 2001 From: Roland Schneider Date: Wed, 1 Jan 2020 21:05:37 +0100 Subject: [PATCH] add registrations to customer gui --- common/manager/EventRegistrationManager.php | 3 +- common/models/EventRegistration.php | 12 +++- common/modules/event/manager/EventManager.php | 4 ++ customer/app/src/app/_helpers/fake-backend.ts | 3 +- customer/app/src/app/app-routing.module.ts | 4 ++ customer/app/src/app/app.module.ts | 4 ++ .../fit-event-types.component.ts | 1 - .../fit-navigation.component.ts | 19 ++++-- .../month-calendar-day.component.ts | 2 - .../event-details.component.html | 65 ++++++++++--------- .../event-details/event-details.component.ts | 17 +++-- .../app/pages/events/events.component.html | 4 +- .../src/app/pages/events/events.component.ts | 6 +- .../app/src/app/pages/home/home.component.ts | 1 - .../registration/registration.component.html | 7 ++ .../registration/registration.component.scss | 0 .../registration.component.spec.ts | 25 +++++++ .../registration/registration.component.ts | 27 ++++++++ .../registrations.component.html | 13 ++++ .../registrations.component.scss | 0 .../registrations.component.spec.ts | 25 +++++++ .../registrations/registrations.component.ts | 31 +++++++++ customer/app/src/app/services/endpoints.ts | 18 +++-- .../app/src/app/services/event.service.ts | 18 ++++- .../src/app/services/navigation.service.ts | 5 ++ customerapi/controllers/EventController.php | 41 +++++++++++- .../EventRegistrationController.php | 56 ++++++++++++---- .../models/available/EventAvailable.php | 1 - .../available/EventRegistrationAvailable.php | 13 ---- .../models/details/EventDetailsView.php | 56 ++++++++++++++++ .../models/details/EventTypeDetailsView.php | 20 ++++++ .../models/details/RoomDetailsView.php | 19 ++++++ .../models/details/TrainerDetailsView.php | 20 ++++++ .../EventRegistrationAvailable.php | 31 +++++++++ 34 files changed, 473 insertions(+), 98 deletions(-) create mode 100644 customer/app/src/app/pages/registration/registration.component.html create mode 100644 customer/app/src/app/pages/registration/registration.component.scss create mode 100644 customer/app/src/app/pages/registration/registration.component.spec.ts create mode 100644 customer/app/src/app/pages/registration/registration.component.ts create mode 100644 customer/app/src/app/pages/registrations/registrations.component.html create mode 100644 customer/app/src/app/pages/registrations/registrations.component.scss create mode 100644 customer/app/src/app/pages/registrations/registrations.component.spec.ts create mode 100644 customer/app/src/app/pages/registrations/registrations.component.ts delete mode 100644 customerapi/models/available/EventRegistrationAvailable.php create mode 100644 customerapi/models/details/EventDetailsView.php create mode 100644 customerapi/models/details/EventTypeDetailsView.php create mode 100644 customerapi/models/details/RoomDetailsView.php create mode 100644 customerapi/models/details/TrainerDetailsView.php create mode 100644 customerapi/models/registrations/EventRegistrationAvailable.php diff --git a/common/manager/EventRegistrationManager.php b/common/manager/EventRegistrationManager.php index d8990c3..7a15315 100644 --- a/common/manager/EventRegistrationManager.php +++ b/common/manager/EventRegistrationManager.php @@ -8,6 +8,8 @@ use common\models\Customer; use common\models\Event; use common\models\EventRegistration; use common\models\Ticket; +use customerapi\models\available\EventInterval; +use customerapi\models\registrations\EventRegistrationAvailable; use Exception; use Throwable; use Yii; @@ -252,5 +254,4 @@ class EventRegistrationManager extends BaseObject } - } diff --git a/common/models/EventRegistration.php b/common/models/EventRegistration.php index b750052..03bf6d1 100644 --- a/common/models/EventRegistration.php +++ b/common/models/EventRegistration.php @@ -68,11 +68,19 @@ class EventRegistration extends \yii\db\ActiveRecord public function getEvent(){ - return $this->hasOne(Event::class,['id' => 'id_event']); + return $this->hasOne($this->getEventClass(),['id' => 'id_event']); } public function getCustomer(){ - return $this->hasOne(Customer::class,['id' => 'id_customer']); + return $this->hasOne($this->getCustomerClass(),['id' => 'id_customer']); } + + public function getEventClass(){ + return Event::class; + } + + public function getCustomerClass(){ + return Customer::class; + } } diff --git a/common/modules/event/manager/EventManager.php b/common/modules/event/manager/EventManager.php index 128e7ce..7629568 100644 --- a/common/modules/event/manager/EventManager.php +++ b/common/modules/event/manager/EventManager.php @@ -151,6 +151,10 @@ class EventManager return $this->getEvents($start,$to); } + public function getEvent($id){ + return Event::findOne($id); + } + } diff --git a/customer/app/src/app/_helpers/fake-backend.ts b/customer/app/src/app/_helpers/fake-backend.ts index a7ff8f4..a2cee01 100644 --- a/customer/app/src/app/_helpers/fake-backend.ts +++ b/customer/app/src/app/_helpers/fake-backend.ts @@ -85,13 +85,12 @@ export class FakeBackendInterceptor implements HttpInterceptor { eventType: eventTypes[id % eventTypes.length], reservedAt: reservedAt, reservationCount: id % 11, - seatCount: 10 + seat_count: 10 } ) } } } - console.info('events.size', events.length); // wrapping the API's in delayed observable to simulate the Server API Calls diff --git a/customer/app/src/app/app-routing.module.ts b/customer/app/src/app/app-routing.module.ts index bb8e847..d421462 100644 --- a/customer/app/src/app/app-routing.module.ts +++ b/customer/app/src/app/app-routing.module.ts @@ -6,6 +6,8 @@ import {ProfileComponent} from "./pages/profile/profile.component"; import {AuthGuard} from "./_guards"; import {EventsComponent} from "./pages/events/events.component"; import {EventDetailsComponent} from "./pages/event-details/event-details.component"; +import {RegistrationsComponent} from "./pages/registrations/registrations.component"; +import {RegistrationComponent} from "./pages/registration/registration.component"; const routes: Routes = [ { path: 'home', component: HomeComponent }, @@ -15,6 +17,8 @@ const routes: Routes = [ { path: 'profile', component: ProfileComponent, canActivate: [AuthGuard] }, { path: 'events', component: EventsComponent, canActivate: [AuthGuard] }, { path: 'event-details/:idEvent', component: EventDetailsComponent, canActivate: [AuthGuard] , pathMatch: 'full' }, + { path: 'registrations', component: RegistrationsComponent, canActivate: [AuthGuard] , pathMatch: 'full' }, + { path: 'registration/:idRegistration', component: RegistrationComponent, canActivate: [AuthGuard] , pathMatch: 'full' }, ]; @NgModule({ diff --git a/customer/app/src/app/app.module.ts b/customer/app/src/app/app.module.ts index 4683ff8..2d6ef2e 100644 --- a/customer/app/src/app/app.module.ts +++ b/customer/app/src/app/app.module.ts @@ -28,6 +28,8 @@ import { MonthCalendarComponent } from './components/month-calendar/month-calend import { MonthCalendarDayComponent } from './components/month-calendar-day/month-calendar-day.component'; import { MonthCalendarEventComponent } from './components/month-calendar-event/month-calendar-event.component'; import { EventDetailsComponent } from './pages/event-details/event-details.component'; +import { RegistrationsComponent } from './pages/registrations/registrations.component'; +import { RegistrationComponent } from './pages/registration/registration.component'; @@ -50,6 +52,8 @@ registerLocaleData(localeHu, 'hu'); MonthCalendarDayComponent, MonthCalendarEventComponent, EventDetailsComponent, + RegistrationsComponent, + RegistrationComponent, ], imports: [ BrowserModule, 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 8c7632c..82976af 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 @@ -47,7 +47,6 @@ export class FitEventTypesComponent implements OnInit, ControlValueAccessor { } setValue($event: Event) { - console.info($event); this._setValue(($event.target).value); } 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 cd05a90..027ae22 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 @@ -16,14 +16,19 @@ export class FitNavigationComponent implements OnInit { label: 'Home', roles: ['*'] }, + // { + // route: '/profile', + // label: 'Profil', + // roles: ['@'] + // }, + // { + // route: '/events', + // label: 'Események', + // roles: ['@'] + // }, { - route: '/profile', - label: 'Profil', - roles: ['@'] - }, - { - route: '/events', - label: 'Események', + route: '/registrations', + label: 'Foglalások', roles: ['@'] }, { diff --git a/customer/app/src/app/components/month-calendar-day/month-calendar-day.component.ts b/customer/app/src/app/components/month-calendar-day/month-calendar-day.component.ts index d6a5ca5..a9e88c2 100644 --- a/customer/app/src/app/components/month-calendar-day/month-calendar-day.component.ts +++ b/customer/app/src/app/components/month-calendar-day/month-calendar-day.component.ts @@ -21,8 +21,6 @@ export class MonthCalendarDayComponent implements OnInit { ngOnInit() { if ( this.day ){ - - console.info(this.day); this.oMoment = dateToMoment(this.day.date); } } 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 d13b325..e6e32bb 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 @@ -1,36 +1,37 @@
-
-
Edzés típusa
-
{{event.eventType.name}}
+

Jelentkezés

+
+
Edzés típusa
+
{{event.eventType.name}}
+
+
+
Edző
+
{{event?.trainer?.name}}
+
+
+
Edzés kezdési időpontja
+
{{event.start * 1000 | date:'yyyy.MM.dd HH:mm'}}
+
+
+
Edzés vége
+
{{event.end * 1000 | date:'yyyy.MM.dd HH:mm'}}
+
+
+
Férőhelyek száma
+
{{event.seat_count }}
+
+
+
Terem
+
{{event?.room?.name }}
+
+
+
+ Foglalás + Lemondás + Már nincs szabad hely
-
-
Edző
-
{{event.trainer.name}}
-
-
-
Edzés kezdési időpontja
-
{{event.start | date:'yyyy.MM.dd HH:mm'}}
-
-
-
Edzés vége
-
{{event.end | date:'yyyy.MM.dd HH:mm'}}
-
-
-
Férőhelyek száma
-
{{event.seatCount }}
-
- - - - -
-
- Foglalás - Lemondás - Már nincs szabad hely -
-
- Vissza -
+
+ Vissza
+
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 a481e1f..b5e7b20 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 @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import {Event, EventService} from "../../services/event.service"; -import {ActivatedRoute, RouterState} from "@angular/router"; +import {ActivatedRoute} from "@angular/router"; import {NavigationService} from "../../services/navigation.service"; @Component({ @@ -23,11 +23,11 @@ export class EventDetailsComponent implements OnInit { this.eventService.findEvent(idEvent).subscribe( value => this.event = value ); - } mayRegister(event: Event) { - return event.reservedAt == null && event.reservationCount < event.seatCount; + // return event.reservedAt == null && event.reservationCount < event.seat_count; + return true } mayCancel(event: Event) { @@ -35,19 +35,24 @@ export class EventDetailsComponent implements OnInit { } noFreeSeat(event: Event) { - return event.reservedAt == null && event.reservationCount >= event.seatCount; + return event.reservedAt == null && event.reservationCount >= event.seat_count; } - goBack(event: Event) { this.navigationService.navigateToHome(); } register(event: Event) { - + console.info("register", event); + this.eventService.register(event.id) + .subscribe( + value => {}, + value => {}, + ); } cancel(event: Event) { + } } diff --git a/customer/app/src/app/pages/events/events.component.html b/customer/app/src/app/pages/events/events.component.html index 21950e1..d2351c4 100644 --- a/customer/app/src/app/pages/events/events.component.html +++ b/customer/app/src/app/pages/events/events.component.html @@ -18,11 +18,11 @@
Férőhelyek száma
-
{{event.seatCount }}
+
{{event.seat_count }}
Szabad helyek száma
-
{{event.seatCount - event.reservationCount }}
+
{{event.seat_count - event.reservationCount }}
diff --git a/customer/app/src/app/pages/events/events.component.ts b/customer/app/src/app/pages/events/events.component.ts index 621c700..a26d7f7 100644 --- a/customer/app/src/app/pages/events/events.component.ts +++ b/customer/app/src/app/pages/events/events.component.ts @@ -30,7 +30,6 @@ export class EventsComponent implements OnInit { }); this.eventTypeForm.get('eventType').valueChanges.subscribe((params) => { - console.info('event type value change', params); this.selectedEventType = params; this.filterEvents(); }); @@ -38,7 +37,6 @@ export class EventsComponent implements OnInit { } filterEvents() { - console.info(this.events); this.eventTypeForm.get('eventType'); this.events = this.originalEvents; if (this.selectedEventType && this.selectedEventType > 0) { @@ -71,7 +69,7 @@ export class EventsComponent implements OnInit { } mayRegister(event: Event) { - return event.reservedAt == null && event.reservationCount < event.seatCount; + return event.reservedAt == null && event.reservationCount < event.seat_count; } mayCancel(event: Event) { @@ -79,7 +77,7 @@ export class EventsComponent implements OnInit { } noFreeSeat(event: Event) { - return event.reservedAt == null && event.reservationCount >= event.seatCount; + return event.reservedAt == null && event.reservationCount >= event.seat_count; } prepareEventDates(events: Event[]) { diff --git a/customer/app/src/app/pages/home/home.component.ts b/customer/app/src/app/pages/home/home.component.ts index b5d873f..bd02eb2 100644 --- a/customer/app/src/app/pages/home/home.component.ts +++ b/customer/app/src/app/pages/home/home.component.ts @@ -23,7 +23,6 @@ export class HomeComponent implements OnInit { } handleEvent($event: MonthCalendarEvent) { - console.info($event); this.navigationService.navigateToEventDetails($event.event.id); } } diff --git a/customer/app/src/app/pages/registration/registration.component.html b/customer/app/src/app/pages/registration/registration.component.html new file mode 100644 index 0000000..051600d --- /dev/null +++ b/customer/app/src/app/pages/registration/registration.component.html @@ -0,0 +1,7 @@ +
+ + + {{registration | json}} + +
+ diff --git a/customer/app/src/app/pages/registration/registration.component.scss b/customer/app/src/app/pages/registration/registration.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/customer/app/src/app/pages/registration/registration.component.spec.ts b/customer/app/src/app/pages/registration/registration.component.spec.ts new file mode 100644 index 0000000..d08995a --- /dev/null +++ b/customer/app/src/app/pages/registration/registration.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegistrationComponent } from './registration.component'; + +describe('RegistrationComponent', () => { + let component: RegistrationComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RegistrationComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RegistrationComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/customer/app/src/app/pages/registration/registration.component.ts b/customer/app/src/app/pages/registration/registration.component.ts new file mode 100644 index 0000000..f134615 --- /dev/null +++ b/customer/app/src/app/pages/registration/registration.component.ts @@ -0,0 +1,27 @@ +import { Component, OnInit } from '@angular/core'; +import {EventService, Registration} from "../../services/event.service"; +import {Observable} from "rxjs"; +import {ActivatedRoute, Router} from "@angular/router"; + +@Component({ + selector: 'app-registration', + templateUrl: './registration.component.html', + styleUrls: ['./registration.component.scss'] +}) +export class RegistrationComponent implements OnInit { + + registration: Observable; + + constructor(private eventService: EventService, + private route: Router, + private activeRoute: ActivatedRoute ) { } + + ngOnInit() { + this.activeRoute.params.subscribe( value => { + console.info("map: ", this.activeRoute.snapshot.paramMap); + this.registration = this.eventService.findRegistration(+this.activeRoute.snapshot.paramMap.get('idRegistration')); + + }); + } + +} diff --git a/customer/app/src/app/pages/registrations/registrations.component.html b/customer/app/src/app/pages/registrations/registrations.component.html new file mode 100644 index 0000000..032254d --- /dev/null +++ b/customer/app/src/app/pages/registrations/registrations.component.html @@ -0,0 +1,13 @@ +
+ + +
+
+ {{(registration.event.start * 1000) | date:'yyyy.MM.dd HH:mm'}} - {{registration.event.eventType.name}} +
+
+
+
+ diff --git a/customer/app/src/app/pages/registrations/registrations.component.scss b/customer/app/src/app/pages/registrations/registrations.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/customer/app/src/app/pages/registrations/registrations.component.spec.ts b/customer/app/src/app/pages/registrations/registrations.component.spec.ts new file mode 100644 index 0000000..e6584bb --- /dev/null +++ b/customer/app/src/app/pages/registrations/registrations.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RegistrationsComponent } from './registrations.component'; + +describe('RegistrationsComponent', () => { + let component: RegistrationsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ RegistrationsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RegistrationsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/customer/app/src/app/pages/registrations/registrations.component.ts b/customer/app/src/app/pages/registrations/registrations.component.ts new file mode 100644 index 0000000..6537275 --- /dev/null +++ b/customer/app/src/app/pages/registrations/registrations.component.ts @@ -0,0 +1,31 @@ +import { Component, OnInit } from '@angular/core'; +import {Observable} from "rxjs"; +import {EventService, Registration} from "../../services/event.service"; +import {NavigationService} from "../../services/navigation.service"; +import {flatMap, map, mergeMap} from "rxjs/operators"; + +@Component({ + selector: 'app-registrations', + templateUrl: './registrations.component.html', + styleUrls: ['./registrations.component.scss'] +}) +export class RegistrationsComponent implements OnInit { + + registrations: Observable; + constructor(private eventService: EventService, private navigationService: NavigationService) { } + + ngOnInit() { + this.registrations = this.eventService.findRegistrations() + .pipe( map( + (registration: Registration[]) => { + registration = registration.sort( (a, b) => a.created_at - b.created_at); + return registration; + } + ) ); + } + + showRegistration(registration: Registration) { + this.navigationService.navigateRegistration(registration.id); + } + +} diff --git a/customer/app/src/app/services/endpoints.ts b/customer/app/src/app/services/endpoints.ts index 3376a2e..8450ab7 100644 --- a/customer/app/src/app/services/endpoints.ts +++ b/customer/app/src/app/services/endpoints.ts @@ -1,6 +1,3 @@ -import {Observable} from "rxjs"; -import {EventType} from "./event.service"; - export class Endpoints { private static contextPath = "http://localhost:86/fitness_web"; private static baseUrl: string = Endpoints.contextPath + "/customerapi/web/index.php?r="; @@ -14,11 +11,20 @@ export class Endpoints { } public static GET_EVENT( id: number){ - return `${this.baseUrl}/event&id_event=${id}`; + return `${this.baseUrl}/event/event&id_event=${id}`; } - public static POST_EVENT_REGISTER( id: number){ - return `${this.baseUrl}/event/register&id_event=${id}`; + + public static POST_EVENT_REGISTRATIONS_REGISTER(id: number){ + return `${this.baseUrl}/event-registration/register&id_event=${id}`; + } + + public static GET_EVENT_REGISTRATIONS_FIND(){ + return `${this.baseUrl}/event-registration/index`; + } + + public static GET_REGISTRATION( id: number){ + return `${this.baseUrl}/event-registration/registration&id_registration=${id}`; } public static POST_EVENT_CANCEL( id: number){ diff --git a/customer/app/src/app/services/event.service.ts b/customer/app/src/app/services/event.service.ts index 87c9c07..50da7a3 100644 --- a/customer/app/src/app/services/event.service.ts +++ b/customer/app/src/app/services/event.service.ts @@ -20,12 +20,19 @@ export class EventService { } findEvent(idEvent: number ): Observable { - console.info(Endpoints.GET_EVENT( idEvent )); return this.http.get(Endpoints.GET_EVENT( idEvent )) as Observable; } register(idEvent: number ): Observable { - return this.http.post(Endpoints.POST_EVENT_REGISTER( idEvent ),{}) as Observable; + return this.http.post(Endpoints.POST_EVENT_REGISTRATIONS_REGISTER( idEvent ),{}) as Observable; + } + + findRegistrations(): Observable { + return this.http.get(Endpoints.GET_EVENT_REGISTRATIONS_FIND()) as Observable; + } + + findRegistration(idRegistration: number ): Observable { + return this.http.get(Endpoints.GET_REGISTRATION( idRegistration )) as Observable; } cancel(idEvent: number ): Observable { @@ -49,7 +56,7 @@ export interface Event { start: number; end: number; trainer?: Trainer; - seatCount: number; + seat_count: number; reservationCount: number; eventType: EventType; reservedAt: number; @@ -77,3 +84,8 @@ export interface EventsAvailableResponse { events: Event[]; } +export interface Registration { + id: number; + created_at: number; + event: Event +} diff --git a/customer/app/src/app/services/navigation.service.ts b/customer/app/src/app/services/navigation.service.ts index 3814cb6..77380b7 100644 --- a/customer/app/src/app/services/navigation.service.ts +++ b/customer/app/src/app/services/navigation.service.ts @@ -25,4 +25,9 @@ export class NavigationService { } + public navigateRegistration(idRegistration){ + this.navigate(['/registration/'+idRegistration ]) + } + + } diff --git a/customerapi/controllers/EventController.php b/customerapi/controllers/EventController.php index 22e2b8f..1930414 100644 --- a/customerapi/controllers/EventController.php +++ b/customerapi/controllers/EventController.php @@ -13,8 +13,11 @@ use common\models\Event; use customerapi\models\available\EventInterval; use customerapi\models\available\EventAvailable; use customerapi\models\DayToDisplay; +use customerapi\models\details\EventDetailsView; use DateTime; use Exception; +use yii\db\Query; +use yii\web\Response; /** @noinspection PhpUnused */ @@ -82,7 +85,6 @@ class EventController extends CustomerApiController } } - return $this->asJson([ 'interval' => $interval, @@ -90,4 +92,41 @@ class EventController extends CustomerApiController ]); } + /** + * @param Query $query + * @param $interval + * @return the query with the added conditions + */ + private function buildEventQuery($query, $interval) + { + return $query + ->innerJoinWith('trainer') + ->innerJoinWith('eventType') + ->innerJoinWith('room') + ->joinWith('activeEventRegistrations') + ->andWhere(['>=', 'event.start', $interval->firstActiveDate->getTimestamp()]) + ->andWhere(['<', 'event.start', (clone $interval->lastActiveDate)->modify('+1 day')->getTimestamp()]) + ->andWhere(['event.active' => '1']); + } + + /** + * @param integer $id_event the id of the event + * @return Response the response + * @throws \yii\base\Exception on any error + * @throws Exception + */ + public function actionEvent($id_event) + { + $interval = EventInterval::createInterval(); + try { + $query = EventDetailsView::find(); + $query = $this->buildEventQuery($query, $interval); + $query = $query->andWhere(['event.id' => $id_event]); + $event = $query->one(); + return $this->asJson($event); + } catch (Exception $e) { + throw new \yii\base\Exception($e->getMessage()); + } + } + } diff --git a/customerapi/controllers/EventRegistrationController.php b/customerapi/controllers/EventRegistrationController.php index 6df9baf..121ca06 100644 --- a/customerapi/controllers/EventRegistrationController.php +++ b/customerapi/controllers/EventRegistrationController.php @@ -13,9 +13,12 @@ use common\manager\EventRegistrationManager; use common\models\CardEventRegistrationForm; use common\models\Customer; use customerapi\models\available\EventInterval; -use customerapi\models\available\EventRegistrationAvailable; +use customerapi\models\registrations\EventRegistrationAvailable; +use Exception; use Throwable; use Yii; +use yii\db\ActiveQuery; +use yii\web\Response; /** @noinspection PhpUnused */ @@ -23,37 +26,62 @@ class EventRegistrationController extends CustomerApiController { /** @noinspection PhpUnused */ + /** + * @return Response + * @throws Exception + */ public function actionIndex() { - $interval = EventInterval::createInterval(); - - $registrations = EventRegistrationAvailable::find() - ->innerJoinWith('event') - ->andWhere(['and', - ['>=', 'event.start', $interval->firstActiveDate->getTimestamp()], - ['<', 'event.start', $interval->lastActiveDate->getTimestamp()], - ['id_customer' => Yii::$app->user->getId()] - ])->all(); + $registrations =$this->prepareQueryFindRegistrationsForCustomer()->all(); + return $this->asJson( $registrations ); + } + /** @noinspection PhpUnused */ + /*** + * @param $id_registration + * @return Response + * @throws Exception + */ + public function actionRegistration($id_registration) + { + $registrations = $this->prepareQueryFindRegistrationsForCustomer() + ->andWhere(['id_event_registration' => $id_registration]) + ->one(); return $this->asJson( - $registrations ); } + /** + * Prepare a query to get registrations for customer + * + * @return ActiveQuery + * @throws Exception + */ + private function prepareQueryFindRegistrationsForCustomer(){ + $interval = EventInterval::createInterval(); + return EventRegistrationAvailable::find() + ->innerJoinWith('event') + ->andWhere(['and', + ['>=', 'event.start', $interval->firstActiveDate->getTimestamp()], + ['id_customer' => Yii::$app->user->getId()] + ]); + } + + /** * @noinspection PhpUnused - * @param $idEvent + * @param $id_event * @throws Throwable */ - public function actionRegister($idEvent) { + public function actionRegister($id_event) { /** @var Customer $customer */ $customer = Yii::$app->user->getIdentity(); $card =$customer->card; $form = new CardEventRegistrationForm(); - $form->event_id = $idEvent; + $form->event_id = $id_event; $form->card_number = $card->number; $manager = new EventRegistrationManager(); diff --git a/customerapi/models/available/EventAvailable.php b/customerapi/models/available/EventAvailable.php index 330860f..69f3dda 100644 --- a/customerapi/models/available/EventAvailable.php +++ b/customerapi/models/available/EventAvailable.php @@ -5,7 +5,6 @@ namespace customerapi\models\available; use common\models\Event; -use common\models\EventType; class EventAvailable extends Event { diff --git a/customerapi/models/available/EventRegistrationAvailable.php b/customerapi/models/available/EventRegistrationAvailable.php deleted file mode 100644 index 1ed7f40..0000000 --- a/customerapi/models/available/EventRegistrationAvailable.php +++ /dev/null @@ -1,13 +0,0 @@ - "id", + "start" => "start", + "end" => "end", + "seat_count" => "seat_count", + "active" => "active", +// "reservationCount" => "reservationCount" + ]; + $fields['trainer'] = 'trainer'; + $fields['eventType'] = 'eventType'; + $fields['room'] = 'room'; + return $fields; + } + +} diff --git a/customerapi/models/details/EventTypeDetailsView.php b/customerapi/models/details/EventTypeDetailsView.php new file mode 100644 index 0000000..2751d8b --- /dev/null +++ b/customerapi/models/details/EventTypeDetailsView.php @@ -0,0 +1,20 @@ + 'id', + 'name' => 'name' + ]; + } + +} diff --git a/customerapi/models/details/RoomDetailsView.php b/customerapi/models/details/RoomDetailsView.php new file mode 100644 index 0000000..037b0d8 --- /dev/null +++ b/customerapi/models/details/RoomDetailsView.php @@ -0,0 +1,19 @@ + 'id', + 'name' => 'name', + 'seat_count' => 'seat_count' + ]; + } +} diff --git a/customerapi/models/details/TrainerDetailsView.php b/customerapi/models/details/TrainerDetailsView.php new file mode 100644 index 0000000..5795131 --- /dev/null +++ b/customerapi/models/details/TrainerDetailsView.php @@ -0,0 +1,20 @@ + 'id', + 'name' => 'name' + ]; + } + +} diff --git a/customerapi/models/registrations/EventRegistrationAvailable.php b/customerapi/models/registrations/EventRegistrationAvailable.php new file mode 100644 index 0000000..60dbff5 --- /dev/null +++ b/customerapi/models/registrations/EventRegistrationAvailable.php @@ -0,0 +1,31 @@ + "id", + "created_at" => "created_at", + "updated_at" => "updated_at", + ]; + $fields['event'] = 'event'; + return $fields; + } + + public function getEventClass() + { + return EventAvailable::class; + } + + +}