diff --git a/src/server/backend/api/postHandler.js b/src/server/backend/api/postHandler.js index f7e7aad..c8be6c4 100644 --- a/src/server/backend/api/postHandler.js +++ b/src/server/backend/api/postHandler.js @@ -90,111 +90,123 @@ class POSTHandler { if ( call === 'reserveTicket' ) { if ( data.count || data.count === 0 ) { db.getDataSimple( 'temp', 'user_id', session.id ).then( dat => { + // const id = data.id.slice( 0, data.id.indexOf( '_' ) ); if ( dat[ 0 ] ) { // data.count is the total amount of tickets currently selected let totalTickets = 0; // sum up total of tickets let info = JSON.parse( dat[ 0 ].data ); - let tickets = info[ data.eventID ]; + let tickets = info[ data.eventID ] ?? {}; for ( let ticket in tickets ) { - totalTickets += tickets[ ticket ].count; + if ( tickets[ ticket ].count ) { + totalTickets += tickets[ ticket ].count; + } else { + totalTickets += 1; + } } - // find actual ticket ID and check if there are tickets for this ticketID already - const id = data.id.slice( 0, data.id.indexOf( '_' ) ); - // check if total ticket count exceeds max tickets per order if ( this.settings.maxTickets !== 0 ) { if ( totalTickets >= this.settings.maxTickets ) { reject( { 'code': 418, 'message': 'ERR_TOO_MANY_TICKETS' } ); + return; } } if ( !this.temporarilySelectedTotals[ session.id ] ) { this.temporarilySelectedTotals[ session.id ] = {}; + } + if ( !this.temporarilySelectedTotals[ session.id ][ data.eventID ] ) { this.temporarilySelectedTotals[ session.id ][ data.eventID ] = {}; } + if ( !this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ] ) { + this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ] = 0; + } + let ticketCount = data.count; // check if total ticket count exceeds max tickets for this event and adjust if necessary - let ticketCount = data.count; if ( this.events[ data.eventID ].maxTickets == 0 || totalTickets < this.events[ data.eventID ].maxTickets ) { - // check if enough tickets are still available - if ( totalTickets < this.ticketTotals[ data.eventID ] - this.temporarilySelectedTotals[ session.id ][ data.eventID ][ id ] ) { - if ( data.count > this.ticketTotals[ data.eventID ] ) { - ticketCount = this.ticketTotals[ data.eventID ]; - } - info[ data.eventID ] = tickets; - if ( data.count < 1 ) { - if ( Object.keys( info[ data.eventID ] ).length < 1 ) { - delete info[ data.eventID ]; - } else { - delete info[ data.eventID ][ data.id ]; - } + let isExceeded = false; + if ( ( totalTickets - ( tickets[ data.id ] ? tickets[ data.id ][ 'count' ] : 0 ) + ticketCount ) > this.ticketTotals[ data.eventID ] - ( this.temporaryTotals[ data.eventID ] ?? 0 ) + totalTickets && data.count > 0 ) { + ticketCount = this.ticketTotals[ data.eventID ] - ( this.temporaryTotals[ data.eventID ] ?? 0 ) + ( tickets[ data.id ] ? tickets[ data.id ][ 'count' ] : 0 ); + isExceeded = true; + } + info[ data.eventID ] = tickets; + if ( data.count < 1 ) { + if ( Object.keys( info[ data.eventID ] ).length < 1 ) { + delete info[ data.eventID ]; } else { - info[ data.eventID ][ data.id ] = data; + delete info[ data.eventID ][ data.id ]; } - db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'timestamp': new Date().toString(), 'data': JSON.stringify( info ) } ); + } else { + info[ data.eventID ][ data.id ] = data; + } + db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'timestamp': new Date().toString(), 'data': JSON.stringify( info ) } ).then( () => { if ( !this.temporarilySelected[ data.eventID ] ) { this.temporarilySelected[ data.eventID ] = {}; } if ( !this.temporaryTotals[ data.eventID ] ) { this.temporaryTotals[ data.eventID ] = 0; } - this.temporarilySelected[ data.eventID ][ id ] = info; - this.temporaryTotals[ data.eventID ] -= this.temporarilySelectedTotals[ session.id ][ data.eventID ][ id ]; + this.temporarilySelected[ data.eventID ][ data.id ] = info[ data.eventID ] ? info[ data.eventID ][ data.id ] : undefined; + this.temporaryTotals[ data.eventID ] -= this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ]; this.temporaryTotals[ data.eventID ] += ticketCount; - this.temporarilySelectedTotals[ session.id ][ data.eventID ][ id ] = ticketCount; + this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ] = ticketCount; this.countFreeSeats(); - resolve( { 'status': 'ok', 'ticketCount': ticketCount } ); - } else { - reject( { 'code': 409, 'message': 'ERR_ALL_OCCUPIED' } ); - } + if ( isExceeded ) { + reject( { 'code': 409, 'message': { 'count': ticketCount } } ); + } else { + resolve( { 'status': 'ok' } ); + } + } ); } else { - reject( { 'code': 418, 'message': 'ERR_TOO_MANY_TICKETS' } ); + reject( { 'code': 418, 'message': { 'count': this.settings.maxTickets } } ); } - } else { - // find actual ticket ID and check if there are tickets for this ticketID already - const id = data.id.slice( 0, data.id.indexOf( '_' ) ); - + } else { if ( !this.temporarilySelectedTotals[ session.id ] ) { this.temporarilySelectedTotals[ session.id ] = {}; + } + if ( !this.temporarilySelectedTotals[ session.id ][ data.eventID ] ) { this.temporarilySelectedTotals[ session.id ][ data.eventID ] = {}; - this.temporarilySelectedTotals[ session.id ][ data.eventID ][ id ] = 0; + } + if ( !this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ] ) { + this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ] = 0; } let ticketCount = data.count; + // check if total ticket count exceeds max tickets for this event and adjust if necessary if ( this.events[ data.eventID ].maxTickets == 0 || ticketCount < this.events[ data.eventID ].maxTickets ) { - // check if enough tickets are still available - if ( ticketCount < parseInt( this.ticketTotals[ data.eventID ] ) - parseInt( this.temporarilySelectedTotals[ session.id ][ data.eventID ][ id ] ) ) { - if ( data.count > this.ticketTotals[ data.eventID ] ) { - ticketCount = this.ticketTotals[ data.eventID ]; - } - - // Create details - let info = {}; - info[ data.eventID ] = {}; - info[ data.eventID ][ data.id ] = data; + let isExceeded = false; + if ( ticketCount > this.ticketTotals[ data.eventID ] - ( this.temporaryTotals[ data.eventID ] ?? 0 ) + this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ] && data.count > 0 ) { + ticketCount = this.ticketTotals[ data.eventID ] - ( this.temporaryTotals[ data.eventID ] ?? 0 ) + this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ]; + isExceeded = true; + } + let info = {}; + info[ data.eventID ] = {}; + info[ data.eventID ][ data.id ] = data; + db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'timestamp': new Date().toString(), 'data': JSON.stringify( info ) } ).then( () => { if ( !this.temporarilySelected[ data.eventID ] ) { this.temporarilySelected[ data.eventID ] = {}; } if ( !this.temporaryTotals[ data.eventID ] ) { this.temporaryTotals[ data.eventID ] = 0; } - db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'timestamp': new Date().toString(), 'data': JSON.stringify( info ) } ); - this.temporarilySelected[ data.eventID ][ id ] = info; - this.temporaryTotals[ data.eventID ] -= this.temporarilySelectedTotals[ session.id ][ data.eventID ][ id ]; + this.temporarilySelected[ data.eventID ][ data.id ] = info[ data.eventID ] ? info[ data.eventID ][ data.id ] : undefined; + this.temporaryTotals[ data.eventID ] -= this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ]; this.temporaryTotals[ data.eventID ] += ticketCount; - this.temporarilySelectedTotals[ session.id ][ data.eventID ][ id ] = ticketCount; + this.temporarilySelectedTotals[ session.id ][ data.eventID ][ data.id ] = ticketCount; this.countFreeSeats(); - resolve( 'ok' ); - } else { - reject( { 'code': 409, 'message': 'ERR_ALL_OCCUPIED' } ); - } + if ( isExceeded ) { + reject( { 'code': 409, 'message': { 'count': ticketCount } } ); + } else { + resolve( { 'status': 'ok' } ); + } + } ); } else { - reject( { 'code': 418, 'message': 'ERR_TOO_MANY_TICKETS' } ); + reject( { 'code': 418, 'message': { 'count': this.settings.maxTickets } } ); } } } ); @@ -220,6 +232,8 @@ class POSTHandler { db.writeDataSimple( 'temp', 'user_id', session.id, { 'user_id': session.id, 'timestamp': new Date().toString(), 'data': JSON.stringify( info ) } ).then( () => { if ( !this.temporarilySelectedTotals[ session.id ] ) { this.temporarilySelectedTotals[ session.id ] = {}; + } + if ( !this.temporarilySelectedTotals[ session.id ][ data.eventID ] ) { this.temporarilySelectedTotals[ session.id ][ data.eventID ] = {}; } if ( !this.temporaryTotals[ data.eventID ] ) { @@ -299,7 +313,7 @@ class POSTHandler { } getReservedSeats ( event ) { - return this.allSelectedSeats[ event ] ? Object.values( Object.assign( {}, this.allSelectedSeats[ event ], this.temporarilySelected[ event ] ) ) : {}; + return this.allSelectedSeats[ event ] ? Object.values( Object.assign( {}, this.allSelectedSeats[ event ], this.temporarilySelected[ event ] ) ) : ( this.temporarilySelected[ event ] ?? {} ); } countFreeSeats() { @@ -310,6 +324,7 @@ class POSTHandler { for ( let el in this.temporaryTotals ) { this.freeSeats[ el ] -= this.temporaryTotals[ el ]; } + this.ticketTotals[ 'test3' ] = 2; } getFreeSeatsCount() { diff --git a/src/webapp/main/src/components/noseatplan.vue b/src/webapp/main/src/components/noseatplan.vue index 8b63bb4..45a4935 100644 --- a/src/webapp/main/src/components/noseatplan.vue +++ b/src/webapp/main/src/components/noseatplan.vue @@ -100,6 +100,7 @@ export default { if ( res.status === 200 ) { let unavailableSeats = {}; res.json().then( data => { + console.log( data ); for ( let seat in data.reserved ) { if ( data.reserved[ seat ] ) { if ( !unavailableSeats[ data.reserved[ seat ].component ] ) { @@ -138,6 +139,17 @@ export default { allSeatsAvailable = false; } + // Create selectedTickets object + if ( this.cart[ this.event.eventID ] ) { + for ( let ticket in this.cart[ this.event.eventID ][ 'tickets' ] ) { + if ( this.cart[ this.event.eventID ][ 'tickets' ][ ticket ][ 'count' ] ) { + this.selectedTickets[ this.cart[ this.event.eventID ][ 'tickets' ][ ticket ][ 'id' ] ] = this.cart[ this.event.eventID ][ 'tickets' ][ ticket ][ 'count' ]; + } else { + this.selectedTickets[ this.cart[ this.event.eventID ][ 'tickets' ][ ticket ][ 'id' ] ] = 0; + } + } + } + this.unavailableSeats = unavailableSeats; if ( !allSeatsAvailable ) { @@ -153,87 +165,118 @@ export default { } ); }, cartHandling () { - for ( let ticket in this.selectedTickets ) { - let category = ''; - const ticketSlice = ticket.slice( 0, ticket.indexOf( '_' ) ); - for ( let letter in ticketSlice ) { - if ( !isNaN( ticketSlice[ letter ] ) ) { - category += parseInt( ticketSlice[ letter ] ); + let tickets = Object.keys( this.selectedTickets ); + let ticket, ready = true; + let postInterval = setInterval( () => { + if ( ready ) { + ready = false; + if ( tickets.length > 0 ) { + ticket = tickets.pop(); + let category = ''; + const ticketSlice = ticket.slice( 0, ticket.indexOf( '_' ) ); + for ( let letter in ticketSlice ) { + if ( !isNaN( ticketSlice[ letter ] ) ) { + category += parseInt( ticketSlice[ letter ] ); + } + } + const options = { + method: 'post', + body: JSON.stringify( { + 'id': ticket, + 'component': 1, + 'ticketOption': ticket.substring( ticket.indexOf( '_' ) + 1 ), + 'eventID': this.event.eventID, + 'count': this.selectedTickets[ ticket ], + 'category': category, + 'name': this.event.categories[ category ].name + ' (' + this.event.ageGroups[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ].name + ')', + } ), + headers: { + 'Content-Type': 'application/json', + 'charset': 'utf-8' + } + }; + fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { + ready = true; + if ( !this.cart[ this.event.eventID ] ) { + this.cart[ this.event.eventID ] = { 'displayName': this.event.name, 'tickets': {}, 'eventID': this.event.eventID }; + } + if ( res.status === 200 ) { + // add item to cart + if ( this.selectedTickets[ ticket ] < 1 ) { + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length <= 1 ) { + try { + delete this.cart[ this.event.eventID ]; + } catch { + console.log( 'element nonexistent' ); + } + } else { + delete this.cart[ this.event.eventID ][ 'tickets' ][ ticket ]; + } + } else { + this.cart[ this.event.eventID ][ 'tickets' ][ ticket ] = { + 'displayName': this.event.categories[ ticket.slice( ticket.indexOf( '_' ) - 1, ticket.indexOf( '_' ) ) ].name + ' (' + this.event.ageGroups[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ].name + ')', + 'price': this.event.categories[ ticket.slice( ticket.indexOf( '_' ) - 1, ticket.indexOf( '_' ) ) ].price[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ], + 'id': ticket, + 'count': this.selectedTickets[ ticket ], + 'comp': 1, + }; + } + } else if ( res.status === 409 ) { + res.json().then( dat => { + if ( !this.cart[ this.event.eventID ] ) { + this.cart[ this.event.eventID ] = { 'displayName': this.event.name, 'tickets': {}, 'eventID': this.event.eventID }; + } + if ( dat.count < 1 ) { + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length <= 1 ) { + try { + delete this.cart[ this.event.eventID ]; + } catch { + console.log( 'element nonexistent' ); + } + } else { + delete this.cart[ this.event.eventID ][ 'tickets' ][ ticket ]; + } + } else { + this.cart[ this.event.eventID ][ 'tickets' ][ ticket ] = { + 'displayName': this.event.categories[ ticket.slice( ticket.indexOf( '_' ) - 1, ticket.indexOf( '_' ) ) ].name + ' (' + this.event.ageGroups[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ].name + ')', + 'price': this.event.categories[ ticket.slice( ticket.indexOf( '_' ) - 1, ticket.indexOf( '_' ) ) ].price[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ], + 'id': ticket, + 'count': dat.count, + 'comp': 1, + }; + } + this.selectedTickets[ ticket ] = dat.count; + } ); + setTimeout( () => { + this.$refs.popups.openPopup( 'Unfortunately, you have selected more tickets than were still available. The maximum amount of tickets that are available have been selected for you automatically. We are sorry for the inconvenience.', {}, 'string' ); + }, 300 ); + } else if ( res.status === 418 ) { + res.json().then( dat => { + this.selectedTickets[ ticket ] = dat.count; + } ); + setTimeout( () => { + this.$refs.popups.openPopup( 'We are sorry, but you have already selected the maximum amount of tickets you can buy at once.', {}, 'string' ); + }, 300 ); + } + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { + delete this.cart[ this.event.eventID ]; + } + + this.$refs.cart.calculateTotal(); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } ); + } else { + clearInterval( postInterval ); } } - const options = { - method: 'post', - body: JSON.stringify( { - 'id': ticket, - 'component': 1, - 'ticketOption': ticket.substring( ticket.indexOf( '_' ) + 1 ), - 'eventID': this.event.eventID, - 'count': this.selectedTickets[ ticket ], - 'category': category, - 'name': this.event.categories[ category ].name + ' (' + this.event.ageGroups[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ].name + ')', - } ), - headers: { - 'Content-Type': 'application/json', - 'charset': 'utf-8' - } - }; - fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { - if ( !this.cart[ this.event.eventID ] ) { - this.cart[ this.event.eventID ] = { 'displayName': this.event.name, 'tickets': {}, 'eventID': this.event.eventID }; - } - if ( res.status === 200 ) { - // add item to cart - if ( this.selectedTickets[ ticket ] < 1 ) { - if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { - try { - delete this.cart[ this.event.eventID ]; - } catch { - console.log( 'element nonexistent' ); - } - } else { - delete this.cart[ this.event.eventID ][ 'tickets' ][ ticket ]; - } - } else { - this.cart[ this.event.eventID ][ 'tickets' ][ ticket ] = { - 'displayName': this.event.categories[ ticket.slice( ticket.indexOf( '_' ) - 1, ticket.indexOf( '_' ) ) ].name + ' (' + this.event.ageGroups[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ].name + ')', - 'price': this.event.categories[ ticket.slice( ticket.indexOf( '_' ) - 1, ticket.indexOf( '_' ) ) ].price[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ], - 'id': ticket, - 'count': this.selectedTickets[ ticket ], - 'comp': 1, - }; - } - } else if ( res.status === 409 ) { - res.json().then( dat => { - this.cart[ this.event.eventID ][ 'tickets' ][ ticket ] = { - 'displayName': this.event.categories[ ticket.slice( ticket.indexOf( '_' ) - 1, ticket.indexOf( '_' ) ) ].name + ' (' + this.event.ageGroups[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ].name + ')', - 'price': this.event.categories[ ticket.slice( ticket.indexOf( '_' ) - 1, ticket.indexOf( '_' ) ) ].price[ ticket.substring( ticket.indexOf( '_' ) + 1 ) ], - 'id': ticket, - 'count': dat.count, - 'comp': 1, - }; - } ); - setTimeout( () => { - this.$refs.popups.openPopup( 'Unfortunately, you have selected more tickets than were still available. The maximum amount of tickets that are available have been selected for you automatically. We are sorry for the inconvenience.', {}, 'string' ); - }, 300 ); - } else if ( res.status === 418 ) { - setTimeout( () => { - this.$refs.popups.openPopup( 'We are sorry, but you have already selected the maximum amount of tickets you can buy at once.', {}, 'string' ); - }, 300 ); - } - if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { - delete this.cart[ this.event.eventID ]; - } - - this.$refs.cart.calculateTotal(); - localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); - } ); - } + } ); }, loadTickets () { fetch( '/getAPI/getEvent?event=' + sessionStorage.getItem( 'selectedTicket' ) ).then( res => { if ( res.status === 200 ) { res.json().then( json => { this.event = json ?? {}; + this.seatChecks(); } ); } } ); @@ -245,7 +288,6 @@ 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/userWindow.vue b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue index 06d8230..c668f6f 100644 --- a/src/webapp/main/src/components/seatplan/userApp/userWindow.vue +++ b/src/webapp/main/src/components/seatplan/userApp/userWindow.vue @@ -440,62 +440,91 @@ export default { if ( !this.cart[ this.event.eventID ] ) { this.cart[ this.event.eventID ] = { 'displayName': this.event.name, 'tickets': {}, 'eventID': this.event.eventID }; } - - for ( let group in data.data ) { - if ( data.data[ group ] > 0 ) { - const options = { - method: 'post', - body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'component': data.component, 'ticketOption': group, 'eventID': this.event.eventID, 'count': data.data[ group ], 'category': this.draggables[ data.component ].category, 'name': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')' } ), - headers: { - 'Content-Type': 'application/json', - 'charset': 'utf-8' - } - }; - fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { - if ( res.status === 200 ) { - this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] = { 'displayName': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')', 'price': this.event.categories[ this.draggables[ data.component ].category ].price[ group ], 'id': 'ticket' + data.component + '_' + group, 'count': data.data[ group ], 'comp': data.component }; - } else if ( res.status === 409 ) { - res.json().then( dat => { - this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] = { 'displayName': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')', 'price': this.event.categories[ this.draggables[ data.component ].category ].price[ group ], 'id': 'ticket' + data.component + '_' + group, 'count': dat.count, 'comp': data.component }; - } ); - setTimeout( () => { - this.$refs.popups.openPopup( 'Unfortunately, you have selected more tickets than were still available. The maximum amount of tickets that are available have been selected for you automatically. We are sorry for the inconvenience.', {}, 'string' ); - }, 300 ); - } else if ( res.status === 418 ) { - setTimeout( () => { - this.$refs.popups.openPopup( 'We are sorry, but you have already selected the maximum amount of tickets you can buy at once.', {}, 'string' ); - }, 300 ); - } - if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { - delete this.cart[ this.event.eventID ]; - } - - this.$refs.cart.calculateTotal(); - localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); - } ); - } else { - if ( this.cart[ this.event.eventID ] ) { - if ( this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] ) { - delete this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ]; - if ( this.cart[ this.event.eventID ] ) { - if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { - delete this.cart[ this.event.eventID ]; - } - } + + let groups = Object.keys( data.data ); + let group, ready = true; + let postInterval = setInterval( () => { + if ( ready ) { + ready = false; + if ( groups.length > 0 ) { + group = groups.pop(); + if ( data.data[ group ] > 0 ) { const options = { method: 'post', - body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'eventID': this.event.eventID, 'component': data.component } ), + body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'component': data.component, 'ticketOption': group, 'eventID': this.event.eventID, 'count': data.data[ group ], 'category': this.draggables[ data.component ].category, 'name': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')' } ), headers: { 'Content-Type': 'application/json', 'charset': 'utf-8' } }; - fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ); - localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + fetch( localStorage.getItem( 'url' ) + '/API/reserveTicket', options ).then( res => { + ready = true; + if ( res.status === 200 ) { + this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] = { 'displayName': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')', 'price': this.event.categories[ this.draggables[ data.component ].category ].price[ group ], 'id': 'ticket' + data.component + '_' + group, 'count': data.data[ group ], 'comp': data.component }; + } else if ( res.status === 409 ) { + res.json().then( dat => { + if ( dat.count < 1 ) { + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length <= 1 ) { + try { + delete this.cart[ this.event.eventID ]; + } catch { + console.log( 'element nonexistent' ); + } + } else { + delete this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ]; + } + } + + this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] = { 'displayName': 'Ticket ' + data.component + ' (' + this.event.ageGroups[ group ].name + ')', 'price': this.event.categories[ this.draggables[ data.component ].category ].price[ group ], 'id': 'ticket' + data.component + '_' + group, 'count': dat.count, 'comp': data.component }; + } ); + setTimeout( () => { + this.$refs.popups.openPopup( 'Unfortunately, you have selected more tickets than were still available. The maximum amount of tickets that are available have been selected for you automatically. We are sorry for the inconvenience.', {}, 'string' ); + }, 300 ); + } else if ( res.status === 418 ) { + setTimeout( () => { + this.$refs.popups.openPopup( 'We are sorry, but you have already selected the maximum amount of tickets you can buy at once.', {}, 'string' ); + }, 300 ); + } + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { + delete this.cart[ this.event.eventID ]; + } + + this.$refs.cart.calculateTotal(); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } ); + } else { + if ( this.cart[ this.event.eventID ] ) { + if ( this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ] ) { + delete this.cart[ this.event.eventID ][ 'tickets' ][ 'ticket' + data.component + '_' + group ]; + if ( this.cart[ this.event.eventID ] ) { + if ( Object.keys( this.cart[ this.event.eventID ][ 'tickets' ] ).length < 1 ) { + delete this.cart[ this.event.eventID ]; + } + } + const options = { + method: 'post', + body: JSON.stringify( { 'id': 'ticket' + data.component + '_' + group, 'eventID': this.event.eventID, 'component': data.component } ), + headers: { + 'Content-Type': 'application/json', + 'charset': 'utf-8' + } + }; + fetch( localStorage.getItem( 'url' ) + '/API/deselectTicket', options ).then( res => { + ready = true; + } ); + localStorage.setItem( 'cart', JSON.stringify( this.cart ) ); + } else { + ready = true; + } + } else { + ready = true; + } } + } else { + clearInterval( postInterval ); } } - } + }, 250 ); } }, created () {