Jelentkezés
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 cebddd4..672ca45 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,8 +1,10 @@
-import { Component, OnInit } from '@angular/core';
+import {Component, OnInit} from '@angular/core';
import {Event, EventService, RegisterEventRequest} from "../../services/event.service";
import {ActivatedRoute} from "@angular/router";
import {NavigationService} from "../../services/navigation.service";
import {FormBuilder, FormGroup, Validators} from "@angular/forms";
+import {ToastrService} from "ngx-toastr";
+import {RegistrationErrors} from "../../app.types";
@Component({
selector: 'app-event-details',
@@ -20,39 +22,32 @@ export class EventDetailsComponent implements OnInit {
private fb: FormBuilder,
private eventService: EventService,
private route: ActivatedRoute,
- private navigationService: NavigationService
- ) { }
+ private navigationService: NavigationService,
+ private toastr: ToastrService
+ ) {
+ this.formControls = {
+ idEvent: ["", [Validators.required]],
+ }
+ this.eventForm = this.fb.group(this.formControls);
+
+ }
ngOnInit() {
- console.info("event details")
- this.formControls = {
- idEvent: ["", [Validators.required ]],
- }
let idEvent = +this.route.snapshot.paramMap.get('idEvent');
this.eventService.findEvent(idEvent).subscribe(
value => {
-
this.event = value;
- this.event.equipmentTypeAssignments.forEach((assignment,index) =>{
- this.formControls['equipment'+assignment.id] = ["", [Validators.required ]]
- })
- this.eventForm = this.fb.group(this.formControls);
this.eventForm.patchValue({"idEvent": this.event.id})
}
);
}
mayRegister(event: Event) {
- // return event.reservedAt == null && event.reservationCount < event.seat_count;
- return true
+ return event.hasFreeSeats && event.registrations.length == 0;
}
mayCancel(event: Event) {
- return event.reservedAt;
- }
-
- noFreeSeat(event: Event) {
- return event.reservedAt == null && event.reservationCount >= event.seat_count;
+ return event.registrations.length > 0;
}
goBack(event: Event) {
@@ -60,33 +55,53 @@ export class EventDetailsComponent implements OnInit {
}
register(event: Event) {
- console.info("register", event);
- console.info(this.eventForm.value);
- let request :RegisterEventRequest= {
+ let request: RegisterEventRequest = {
idEvent: this.eventForm.value.idEvent,
equipment: []
};
- this.event.equipmentTypeAssignments.forEach((value, index) => {
- if ( this.eventForm.value.hasOwnProperty('equipment'+value.id) ){
- if ( this.eventForm.value['equipment'+value.id] === "1"){
- request.equipment.push(value.id);
- }
- }
- });
-
- console.info(request);
this.eventService.register(request)
.subscribe(
- value => {},
- value => {},
+ value => {
+ this.toastr.success('Sikeresen Foglalás', 'Foglalás');
+
+ this.navigationService.navigateToHome()
+ },
+ error => {
+ let status = error.status;
+ let code = error?.error?.code;
+ let message = "Hiba történt";
+ if (status == 400) {
+ switch (code) {
+ case RegistrationErrors.ALREADY_REGISTERED:
+ message = "Már regisztárlt erre az edzésre!";
+ break;
+ case RegistrationErrors.MAX_SEAT_COUNT_EXCEEDED:
+ case RegistrationErrors.TICKET_INSUFFICIENT:
+ message = "Nem rendelkezik megfelelő bérlettel!"
+ break;
+ case RegistrationErrors.NO_FREE_SEATS:
+ message = "Nincs több szabad hely!"
+ break;
+ }
+ }
+
+ this.toastr.error(message, "Foglalás")
+ },
);
}
cancel(event: Event) {
-
+ this.eventService.cancelRegistration(event.registrations[0].id)
+ .subscribe(
+ () => {
+ this.navigationService.navigateToHome();
+ },
+ () => {
+ this.toastr.error("Hiba történt", "Lemondás")
+ });
}
}
diff --git a/customer/app/src/app/pages/events/events.component.html b/customer/app/src/app/pages/events/events.component.html
index d2351c4..3ab5b19 100644
--- a/customer/app/src/app/pages/events/events.component.html
+++ b/customer/app/src/app/pages/events/events.component.html
@@ -27,8 +27,8 @@
Vissza
diff --git a/customer/app/src/app/pages/events/events.component.ts b/customer/app/src/app/pages/events/events.component.ts
index a26d7f7..7d24f15 100644
--- a/customer/app/src/app/pages/events/events.component.ts
+++ b/customer/app/src/app/pages/events/events.component.ts
@@ -69,15 +69,15 @@ export class EventsComponent implements OnInit {
}
mayRegister(event: Event) {
- return event.reservedAt == null && event.reservationCount < event.seat_count;
+ return event.hasFreeSeats && event.registrations.length == 0;
}
- mayCancel(event: Event) {
- return event.reservedAt;
- }
+ // mayCancel(event: Event) {
+ // return event.reservedAt;
+ // }
noFreeSeat(event: Event) {
- return event.reservedAt == null && event.reservationCount >= event.seat_count;
+ return !event.hasFreeSeats;
}
prepareEventDates(events: Event[]) {
diff --git a/customer/app/src/app/pages/registrations/registrations.component.spec.ts b/customer/app/src/app/pages/registrations/registrations.component.spec.ts
deleted file mode 100644
index 80c6083..0000000
--- a/customer/app/src/app/pages/registrations/registrations.component.spec.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
-
-import { RegistrationsComponent } from './registrations.component';
-
-describe('RegistrationsComponent', () => {
- let component: RegistrationsComponent;
- let fixture: ComponentFixture
;
-
- beforeEach(waitForAsync(() => {
- 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/services/event.service.ts b/customer/app/src/app/services/event.service.ts
index 311a2ca..d92fd22 100644
--- a/customer/app/src/app/services/event.service.ts
+++ b/customer/app/src/app/services/event.service.ts
@@ -1,9 +1,7 @@
import {Injectable} from '@angular/core';
import {HttpClient} from "@angular/common/http";
import {Endpoints} from "./endpoints";
-import {forkJoin, Observable} from "rxjs";
-import {map} from "rxjs/operators";
-import {CalendarEvent} from "../app.types";
+import { Observable} from "rxjs";
@Injectable({
providedIn: 'root'
@@ -64,9 +62,9 @@ export interface Event {
seat_count: number;
reservationCount: number;
eventType: EventType;
- reservedAt: number;
room: Room;
- equipmentTypeAssignments?: EquipmentTypeAssignment[];
+ registrations: Registration[];
+ hasFreeSeats?: boolean;
}
export interface EquipmentTypeAssignment {
@@ -106,7 +104,7 @@ export interface EventsAvailableResponse {
export interface Registration {
id: number;
created_at: number;
- event: Event
+ event?: Event
}
export interface RegisterEventRequest{
diff --git a/customer/app/src/app/services/navigation.service.ts b/customer/app/src/app/services/navigation.service.ts
index 77380b7..02b8e23 100644
--- a/customer/app/src/app/services/navigation.service.ts
+++ b/customer/app/src/app/services/navigation.service.ts
@@ -29,5 +29,9 @@ export class NavigationService {
this.navigate(['/registration/'+idRegistration ])
}
+ public navigateRegistrations(){
+ this.navigate(['/registrations' ]);
+ }
+
}
diff --git a/customerapi/controllers/EventController.php b/customerapi/controllers/EventController.php
index 0a9626b..7490ec1 100644
--- a/customerapi/controllers/EventController.php
+++ b/customerapi/controllers/EventController.php
@@ -9,13 +9,19 @@
namespace customerapi\controllers;
+use common\models\Event;
+use common\models\EventRegistration;
+use customerapi\manager\EventRegistrationManager;
use customerapi\models\available\EventInterval;
use customerapi\models\available\EventAvailable;
use customerapi\models\DayToDisplay;
use customerapi\models\details\EventDetailsView;
+use customerapi\models\details\EventRegistrationView;
+use customerapi\models\details\EventTypeDetailsView;
+use customerapi\models\details\RoomDetailsView;
+use customerapi\models\details\TrainerDetailsView;
use DateTime;
use Exception;
-use yii\db\ActiveRecord;
use yii\db\Query;
use yii\web\Response;
@@ -63,7 +69,7 @@ class EventController extends CustomerApiController
->innerJoinWith('trainer')
->innerJoinWith('eventType')
->innerJoinWith('room')
- ->joinWith('activeEventRegistrationsForCustomer')
+// ->leftJoin('activeEventRegistrationsForCustomer')
->andWhere(['>=', 'event.start', $interval->firstActiveDate->getTimestamp()])
->andWhere(['<', 'event.start', (clone $interval->lastActiveDate)->modify('+1 day')->getTimestamp()])
->andWhere(['event.active' => '1'])
@@ -77,6 +83,7 @@ class EventController extends CustomerApiController
$eventDay->setTime(0, 0);
$event->reservationCount = $event->getEventRegistrationCount();
+ $event->hasFreeSeats = $event->reservationCount < $event->seat_count;
/** @var DayToDisplay $date */
foreach ($dates as $date) {
@@ -105,7 +112,7 @@ class EventController extends CustomerApiController
->innerJoinWith('trainer')
->innerJoinWith('eventType')
->innerJoinWith('room')
- ->joinWith('activeEventRegistrations')
+ ->joinWith('activeEventRegistrations','event.id = activeEventRegistrations.id_event')
->andWhere(['>=', 'event.start', $interval->firstActiveDate->getTimestamp()])
->andWhere(['<', 'event.start', (clone $interval->lastActiveDate)->modify('+1 day')->getTimestamp()])
->andWhere(['event.active' => '1']);
@@ -121,11 +128,32 @@ class EventController extends CustomerApiController
{
$interval = EventInterval::createInterval();
try {
- $query = EventDetailsView::find();
+ $query = Event::find();
$query = $this->buildEventQuery($query, $interval);
$query = $query->andWhere(['event.id' => $id_event]);
+
+ /** @var Event $event */
$event = $query->one();
- return $this->asJson($event);
+
+
+ $result = new EventDetailsView();
+ $result->id = $event->id;
+ $result->start = $event->start;
+ $result->end = $event->end;
+ $result->seatCount = $event->seat_count;
+ $result->trainer = TrainerDetailsView::findOne($event->id_trainer);
+ $result->room = RoomDetailsView::findOne($event->id_room);
+ $result->eventType = EventTypeDetailsView::findOne($event->id_event_type);
+ $registrations = EventRegistrationView::find()->all();
+ $allActiveRegistrations = EventRegistration::filterActive($registrations);
+ $customerActiveRegistrations = EventRegistration::filterForCustomer($allActiveRegistrations,\Yii::$app->user->id);
+ $result->reservationCount = count($allActiveRegistrations);
+ $result->registrations = $customerActiveRegistrations;
+ $result->hasFreeSeats = $event->seat_count > count($allActiveRegistrations);
+
+
+
+ return $this->asJson($result);
} catch (Exception $e) {
throw new \yii\base\Exception($e->getMessage());
}
diff --git a/customerapi/controllers/EventRegistrationController.php b/customerapi/controllers/EventRegistrationController.php
index 8ce7bff..8c1455c 100644
--- a/customerapi/controllers/EventRegistrationController.php
+++ b/customerapi/controllers/EventRegistrationController.php
@@ -59,7 +59,7 @@ class EventRegistrationController extends CustomerApiController
$form->event_id = $id_event;
$form->card_number = $card->number;
- $manager = new EventRegistrationManager();
+ $manager = new \common\manager\EventRegistrationManager();
$manager->registerCard($form);
return $form->registration;
diff --git a/customerapi/manager/EventRegistrationManager.php b/customerapi/manager/EventRegistrationManager.php
index 65483df..d5818ed 100644
--- a/customerapi/manager/EventRegistrationManager.php
+++ b/customerapi/manager/EventRegistrationManager.php
@@ -17,7 +17,7 @@ class EventRegistrationManager
return $this->prepareQueryFindRegistrationsForCustomer()->all();
}
- public function findCustomerRegistrations()
+ public function findCustomerRegistrations($clazz= EventRegistration::class )
{
$interval = EventInterval::createInterval();
return EventRegistration::find()
diff --git a/customerapi/models/available/EventAvailable.php b/customerapi/models/available/EventAvailable.php
index ef0d2bf..a74346d 100644
--- a/customerapi/models/available/EventAvailable.php
+++ b/customerapi/models/available/EventAvailable.php
@@ -10,6 +10,7 @@ class EventAvailable extends Event
{
public $reservationCount;
+ public $hasFreeSeats;
protected function getTrainerClass()
{
@@ -39,6 +40,7 @@ class EventAvailable extends Event
"seat_count" => "seat_count",
"active" => "active",
"reservationCount" => "reservationCount",
+ "hasFreeSeats" => "hasFreeSeats",
];
$fields['trainer'] = 'trainer';
$fields['eventType'] = 'eventType';
diff --git a/customerapi/models/details/EventDetailsView.php b/customerapi/models/details/EventDetailsView.php
index 76570e2..052e16c 100644
--- a/customerapi/models/details/EventDetailsView.php
+++ b/customerapi/models/details/EventDetailsView.php
@@ -5,37 +5,37 @@ namespace customerapi\models\details;
use common\models\Event;
+use yii\base\Model;
-class EventDetailsView extends Event
+/**
+$property string $eventName;
+$property string $start;
+$property string $end;
+$property string $seatCount;
+$property string $reservationCount;
+$property customerapi\models\details\EventDetailsView $room;
+$property customerapi\models\details\TrainerDetailsView $trainer;
+$property customerapi\models\details\EventTypeDetailsView $eventType;
+$property string $registrations;
+ */
+class EventDetailsView extends Model // extends Event
{
+ public $id;
+ public $start;
+ public $end;
+ public $seatCount;
+ // total count of registrations
public $reservationCount;
+ public $room;
+ public $trainer;
+ public $eventType;
+ // registrations for current user
+ public $registrations;
+
+ public $hasFreeSeats;
- /**
- * @return string
- */
- protected function getTrainerClass()
- {
- // override trainer class to have more control
- // about json fields
- return TrainerDetailsView::class;
- }
-
- protected function getEventTypeClass()
- {
- return EventTypeDetailsView::class;
- }
-
- protected function getRoomClass()
- {
- return RoomDetailsView::class;
- }
-
- protected function getEquipmentTypeAssignmentsClass()
- {
- return EventEquipmentTypeAssignmentView::class;
- }
/**
@@ -49,15 +49,17 @@ class EventDetailsView extends Event
"id" => "id",
"start" => "start",
"end" => "end",
- "seat_count" => "seat_count",
- "active" => "active",
-// "reservationCount" => "reservationCount"
+ "seat_count" => "seatCount",
+ "reservationCount" => "reservationCount",
+ "registrations" => "registrations",
+ "hasFreeSeats" => "hasFreeSeats"
];
$fields['trainer'] = 'trainer';
$fields['eventType'] = 'eventType';
$fields['room'] = 'room';
- $fields['equipmentTypeAssignments'] = 'equipmentTypeAssignments';
return $fields;
}
}
+
+
diff --git a/customerapi/models/details/EventRegistrationView.php b/customerapi/models/details/EventRegistrationView.php
new file mode 100644
index 0000000..5e05248
--- /dev/null
+++ b/customerapi/models/details/EventRegistrationView.php
@@ -0,0 +1,17 @@
+ 'id',
+ 'created_at' => 'created_at',
+ ];
+ }
+
+}
diff --git a/docker/start.sh b/docker/start.sh
index 94ed85c..f92c8da 100644
--- a/docker/start.sh
+++ b/docker/start.sh
@@ -4,6 +4,8 @@ PROJECT_DIR=$(pwd)/..
PORT=86
HOST=localhost
+docker container stop fitness-web || true
+
docker run \
-v ${PROJECT_DIR}:/var/www/html/fitness_web \
--rm \