From cd9d6d5027ae7854eab48d3fd39b368e5e61a149 Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Sun, 17 Sep 2023 17:19:40 +0200 Subject: [PATCH] add more checks --- src/webapp/main/src/components/noseatplan.vue | 61 +++++++++++++++++ .../userApp/seatplanComponents/standing.vue | 1 - .../seatplan/userApp/userWindow.vue | 1 - .../main/src/views/purchasing/CartView.vue | 64 +++++++++++++++++- .../src/views/purchasing/PurchaseView.vue | 67 ++++++++++++++++++- 5 files changed, 189 insertions(+), 5 deletions(-) diff --git a/src/webapp/main/src/components/noseatplan.vue b/src/webapp/main/src/components/noseatplan.vue index 48e7e30..aa8407a 100644 --- a/src/webapp/main/src/components/noseatplan.vue +++ b/src/webapp/main/src/components/noseatplan.vue @@ -92,6 +92,66 @@ export default { } } }, + seatChecks () { + let self = this; + let allSeatsAvailable = true; + + fetch( localStorage.getItem( 'url' ) + '/getAPI/getReservedSeats?event=' + this.event.eventID ).then( res => { + if ( res.status === 200 ) { + let unavailableSeats = {}; + res.json().then( data => { + for ( let seat in data.reserved ) { + if ( data.reserved[ seat ] ) { + if ( !unavailableSeats[ data.reserved[ seat ].component ] ) { + unavailableSeats[ data.reserved[ seat ].component ] = {}; + } + unavailableSeats[ data.reserved[ seat ].component ][ data.reserved[ seat ].id ] = 'nav'; + } + } + for ( let seat in data.user ) { + if ( data.user[ seat ] ) { + if ( !unavailableSeats[ data.user[ seat ].component ] ) { + unavailableSeats[ data.user[ seat ].component ] = {}; + } + unavailableSeats[ data.user[ seat ].component ][ data.user[ seat ].id ] = 'sel'; + } + } + + let tickets = {}; + if ( this.cart[ this.event.eventID ] ) { + tickets = this.cart[ this.event.eventID ][ 'tickets' ]; + } + + if ( data.user ) { + for ( let element in tickets ) { + if ( !data.user[ element ] ) { + allSeatsAvailable = false; + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length > 1 ) { + delete this.cart[ this.event.eventID ][ 'tickets' ][ element ]; + } else { + delete this.cart[ this.event.eventID ]; + } + } + } + } else { + delete this.cart[ this.event.eventID ]; + allSeatsAvailable = false; + } + + this.unavailableSeats = unavailableSeats; + + if ( !allSeatsAvailable ) { + setTimeout( () => { + self.$refs.popups.openPopup( 'We are sorry to tell you that since the last time the seat plan was refreshed, one or more of the seats you have selected has/have been taken.', {}, 'string' ); + }, 500 ); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } + } ); + } else { + console.error( 'unable to load' ); + } + } ); + }, cartHandling () { for ( let ticket in this.selectedTickets ) { let category = ''; @@ -183,6 +243,7 @@ export default { }, 1 ); this.cart = localStorage.getItem( 'cart' ) ? JSON.parse( localStorage.getItem( 'cart' ) ): {}; this.loadTickets(); + this.seatChecks(); } } diff --git a/src/webapp/main/src/components/seatplan/userApp/seatplanComponents/standing.vue b/src/webapp/main/src/components/seatplan/userApp/seatplanComponents/standing.vue index f60356e..13263cc 100644 --- a/src/webapp/main/src/components/seatplan/userApp/seatplanComponents/standing.vue +++ b/src/webapp/main/src/components/seatplan/userApp/seatplanComponents/standing.vue @@ -105,7 +105,6 @@ export default { this.style += ` background-color: ${this.color}; color: ${this.color}`; this.circularStyle += ` background-color: ${this.color}; color: ${this.color}`; this.trapezoidStyle += ` background-color: ${this.color}; color: ${this.color}`; - console.log( this.style ); }, }, watch: { diff --git a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue index aaec908..2c30381 100644 --- a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue +++ b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue @@ -147,7 +147,6 @@ } ); }, prepSeatplan ( seatInfo ) { - console.log( seatInfo ); // Mark all selected seats + all unavailable seats let categoryDetails = {}; for ( let category in this.event.categories ) { diff --git a/src/webapp/main/src/views/purchasing/CartView.vue b/src/webapp/main/src/views/purchasing/CartView.vue index ad633d7..5f4896b 100644 --- a/src/webapp/main/src/views/purchasing/CartView.vue +++ b/src/webapp/main/src/views/purchasing/CartView.vue @@ -139,8 +139,65 @@ } localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); }, - logs ( message ) { - console.log( message ); + seatChecks ( event ) { + let self = this; + let allSeatsAvailable = true; + + fetch( localStorage.getItem( 'url' ) + '/getAPI/getReservedSeats?event=' + event ).then( res => { + if ( res.status === 200 ) { + let unavailableSeats = {}; + res.json().then( data => { + for ( let seat in data.reserved ) { + if ( data.reserved[ seat ] ) { + if ( !unavailableSeats[ data.reserved[ seat ].component ] ) { + unavailableSeats[ data.reserved[ seat ].component ] = {}; + } + unavailableSeats[ data.reserved[ seat ].component ][ data.reserved[ seat ].id ] = 'nav'; + } + } + for ( let seat in data.user ) { + if ( data.user[ seat ] ) { + if ( !unavailableSeats[ data.user[ seat ].component ] ) { + unavailableSeats[ data.user[ seat ].component ] = {}; + } + unavailableSeats[ data.user[ seat ].component ][ data.user[ seat ].id ] = 'sel'; + } + } + + let tickets = {}; + if ( this.cart[ event ] ) { + tickets = this.cart[ event ][ 'tickets' ]; + } + + if ( data.user ) { + for ( let element in tickets ) { + if ( !data.user[ element ] ) { + allSeatsAvailable = false; + if ( Object.keys( this.cart[ event ][ 'tickets' ] ).length > 1 ) { + delete this.cart[ event ][ 'tickets' ][ element ]; + } else { + delete this.cart[ event ]; + } + } + } + } else { + delete this.cart[ event ]; + allSeatsAvailable = false; + } + + this.unavailableSeats = unavailableSeats; + + if ( !allSeatsAvailable ) { + setTimeout( () => { + self.$refs.popups.openPopup( 'We are sorry to tell you that since the last time the seat plan was refreshed, one or more of the seats you have selected has/have been taken.', {}, 'string' ); + }, 500 ); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } + } ); + } else { + console.error( 'unable to load' ); + } + } ); }, }, created () { @@ -150,6 +207,9 @@ }, 1 ); this.cart = localStorage.getItem( 'cart' ) ? JSON.parse( localStorage.getItem( 'cart' ) ): {}; this.calculateTotal(); + for ( let event in this.cart ) { + this.seatChecks( event ); + } } } diff --git a/src/webapp/main/src/views/purchasing/PurchaseView.vue b/src/webapp/main/src/views/purchasing/PurchaseView.vue index d2a4bb6..9dc3e4a 100644 --- a/src/webapp/main/src/views/purchasing/PurchaseView.vue +++ b/src/webapp/main/src/views/purchasing/PurchaseView.vue @@ -76,6 +76,7 @@ + @@ -216,6 +217,7 @@ import { useUserStore } from '@/stores/userStore'; import { useBackendStore } from '@/stores/backendStore'; import { mapStores } from 'pinia'; import notifications from '@/components/notifications/notifications.vue'; +import popups from '@/components/notifications/popups.vue'; export default { name: 'PurchaseView', @@ -231,6 +233,7 @@ export default { }, components: { notifications, + popups, }, computed: { ...mapStores( useUserStore ), @@ -238,7 +241,6 @@ export default { }, methods: { loadData () { - // TODO: FUTURE Also load the customer data from server! this.cartNotEmpty = false; let cart = JSON.parse( localStorage.getItem( 'cart' ) ); @@ -256,6 +258,69 @@ export default { } else { this.$router.push( '/tickets' ); } + for ( let event in this.cart ) { + this.seatChecks( event ); + } + }, + seatChecks ( event ) { + let self = this; + let allSeatsAvailable = true; + + fetch( localStorage.getItem( 'url' ) + '/getAPI/getReservedSeats?event=' + event ).then( res => { + if ( res.status === 200 ) { + let unavailableSeats = {}; + res.json().then( data => { + for ( let seat in data.reserved ) { + if ( data.reserved[ seat ] ) { + if ( !unavailableSeats[ data.reserved[ seat ].component ] ) { + unavailableSeats[ data.reserved[ seat ].component ] = {}; + } + unavailableSeats[ data.reserved[ seat ].component ][ data.reserved[ seat ].id ] = 'nav'; + } + } + for ( let seat in data.user ) { + if ( data.user[ seat ] ) { + if ( !unavailableSeats[ data.user[ seat ].component ] ) { + unavailableSeats[ data.user[ seat ].component ] = {}; + } + unavailableSeats[ data.user[ seat ].component ][ data.user[ seat ].id ] = 'sel'; + } + } + + let tickets = {}; + if ( this.cart[ event ] ) { + tickets = this.cart[ event ][ 'tickets' ]; + } + + if ( data.user ) { + for ( let element in tickets ) { + if ( !data.user[ element ] ) { + allSeatsAvailable = false; + if ( Object.keys( this.cart[ event ][ 'tickets' ] ).length > 1 ) { + delete this.cart[ event ][ 'tickets' ][ element ]; + } else { + delete this.cart[ event ]; + } + } + } + } else { + delete this.cart[ event ]; + allSeatsAvailable = false; + } + + this.unavailableSeats = unavailableSeats; + + if ( !allSeatsAvailable ) { + setTimeout( () => { + self.$refs.popups.openPopup( 'We are sorry to tell you that an error occurred in the system and all sessions have been reset. You will need to pick the seats again. We are very sorry for the inconvenience', {}, 'string' ); + }, 500 ); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } + } ); + } else { + console.error( 'unable to load' ); + } + } ); }, calculateTotal () { this.backend[ 'total' ] = 0;