Skip to content

Commit

Permalink
Merge pull request #215 from eurofurence/issue-213-ef-2024
Browse files Browse the repository at this point in the history
feat(#213): early bird discount and full invoices
  • Loading branch information
Jumpy-Squirrel committed Dec 13, 2023
2 parents 021e2b1 + 5bc9891 commit d12c8aa
Show file tree
Hide file tree
Showing 7 changed files with 348 additions and 17 deletions.
37 changes: 25 additions & 12 deletions src/apis/attsrv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,8 @@ const attendeeDtoFromRegistrationInfo = (registrationInfo: RegistrationInfo): At
&& registrationInfo.ticketLevel.addons['stage-pass'].selected,
'tshirt': !(config.ticketLevels[registrationInfo.ticketLevel.level].includes?.includes('tshirt') ?? false)
&& registrationInfo.ticketLevel.addons.tshirt.selected,
'early': registrationInfo.ticketLevel.addons.early.selected,
'door': registrationInfo.ticketLevel.addons.door.selected,
}),
user_comments: registrationInfo.optionalInfo.comments,
})
Expand All @@ -203,6 +205,28 @@ const registrationInfoFromAttendeeDto = (attendeeDto: AttendeeDto): Registration
const days = eachDayOfInterval(Interval.fromDateTimes(config.dayTicketStartDate, config.dayTicketEndDate))
const level = packages.has('sponsor2') ? 'super-sponsor' : packages.has('sponsor') ? 'sponsor' : 'standard'

// parse all hidden addons, so they show up in the invoice box
const hiddenAddons = Object.fromEntries(
Object.entries(config.addons)
.filter(([,addon]) => addon.hidden)
.map(([id, _addon]) => {
return [id, { selected: packages.has(id), options: {} }]
}),
)
const addons = {
...hiddenAddons,
'stage-pass': {
selected: (config.ticketLevels[level].includes?.includes('stage-pass') ?? false) || packages.has('stage'),
options: {},
},
tshirt: {
selected: (config.ticketLevels[level].includes?.includes('tshirt') ?? false) || packages.has('tshirt'),
options: {
size: tshirtFromApi(attendeeDto.tshirt_size) as RegistrationInfo['ticketLevel']['addons']['tshirt']['options']['size'],
},
},
}

return {
preferredLocale: attendeeDto.registration_language,
/* eslint-disable @typescript-eslint/indent */
Expand All @@ -222,18 +246,7 @@ const registrationInfoFromAttendeeDto = (attendeeDto: AttendeeDto): Registration
/* eslint-enable @typescript-eslint/indent */
ticketLevel: {
level,
addons: {
'stage-pass': {
selected: (config.ticketLevels[level].includes?.includes('stage-pass') ?? false) || packages.has('stage'),
options: {},
},
tshirt: {
selected: (config.ticketLevels[level].includes?.includes('tshirt') ?? false) || packages.has('tshirt'),
options: {
size: tshirtFromApi(attendeeDto.tshirt_size) as RegistrationInfo['ticketLevel']['addons']['tshirt']['options']['size'],
},
},
},
addons,
},
personalInfo: {
nickname: attendeeDto.nickname,
Expand Down
11 changes: 7 additions & 4 deletions src/components/funnels/funnels/register/steps/ticket/level.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,13 @@ const TicketLevel = (_: ReadonlyRouteComponentProps) => {
<AddonsSection>
<Localized id="register-ticket-level-addons-title"><h3>Select add-ons</h3></Localized>
<AddonsContainer>
{Object.entries(config.addons).filter(([, addon]) => !(addon.unavailableFor?.type?.includes(ticketType.type) ?? false)).map(([id, addon]) =>
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
<TicketLevelAddon key={id} addon={{ id, ...addon } as AugmentedAddon} formContext={formContext}/>,
)}
{Object.entries(config.addons)
.filter(([, addon]) => !addon.hidden)
.filter(([, addon]) => !(addon.unavailableFor?.type?.includes(ticketType.type) ?? false))
.map(([id, addon]) =>
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
<TicketLevelAddon key={id} addon={{ id, ...addon } as AugmentedAddon} formContext={formContext}/>,
)}
</AddonsContainer>
</AddonsSection>
</form>
Expand Down
153 changes: 153 additions & 0 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { DateTime } from 'luxon'
const apiPath = (path: string) => process.env.GATSBY_API_BASE_URL === undefined ? withPrefix(path) : `${process.env.GATSBY_API_BASE_URL}${path}`

const config = checkConfig({
version: 1, // increment to prevent loading from local storage (new year, pricing changes, default packages)
eventName: 'Eurofurence',
registrationLaunch: DateTime.fromISO('2023-01-21T12:30:23+02:00'),
registrationExpirationDate: DateTime.fromISO('2024-09-22', { zone: 'Europe/Berlin' }),
Expand Down Expand Up @@ -58,6 +59,7 @@ const config = checkConfig({
unavailableFor: {
type: ['day'],
},
hidden: false,
},
'tshirt': {
price: 20,
Expand All @@ -68,6 +70,157 @@ const config = checkConfig({
items: ['XS', 'wXS', 'S', 'wS', 'M', 'wM', 'L', 'wL', 'XL', 'wXL', 'XXL', 'wXXL', 'm3XL', 'w3XL', 'm4XL', 'w4XL'],
},
},
hidden: false,
},
'early': {
price: -5,
default: true, // don't forget to increment version when changing this
options: {},
hidden: true,
},
'door': {
price: 10,
default: false, // don't forget to increment version when changing this
options: {},
hidden: true,
},
'dealer-half': {
price: 50,
default: false,
options: {},
hidden: true,
},
'dealer-full': {
price: 100,
default: false,
options: {},
hidden: true,
},
'dealer-double': {
price: 200,
default: false,
options: {},
hidden: true,
},
'dealer-quad': {
price: 400,
default: false,
options: {},
hidden: true,
},
'boat-trip': {
price: 35,
default: false,
options: {},
hidden: true,
},
'boat-vip': {
price: 15,
default: false,
options: {},
hidden: true,
},
'boat-benefactor': {
price: 100,
default: false,
options: {},
hidden: true,
},
'artshow-table-half': {
price: 5,
default: false,
options: {},
hidden: true,
},
'artshow-table-one': {
price: 10,
default: false,
options: {},
hidden: true,
},
'artshow-table-oneandhalf': {
price: 15,
default: false,
options: {},
hidden: true,
},
'artshow-table-two': {
price: 20,
default: false,
options: {},
hidden: true,
},
'artshow-table-twoandhalf': {
price: 25,
default: false,
options: {},
hidden: true,
},
'artshow-table-three': {
price: 30,
default: false,
options: {},
hidden: true,
},
'artshow-table-threeandhalf': {
price: 35,
default: false,
options: {},
hidden: true,
},
'artshow-table-four': {
price: 40,
default: false,
options: {},
hidden: true,
},
'artshow-panel-half': {
price: 10,
default: false,
options: {},
hidden: true,
},
'artshow-panel-one': {
price: 20,
default: false,
options: {},
hidden: true,
},
'artshow-panel-oneandhalf': {
price: 30,
default: false,
options: {},
hidden: true,
},
'artshow-panel-two': {
price: 40,
default: false,
options: {},
hidden: true,
},
'artshow-panel-twoandhalf': {
price: 50,
default: false,
options: {},
hidden: true,
},
'artshow-panel-three': {
price: 60,
default: false,
options: {},
hidden: true,
},
'artshow-panel-threeandhalf': {
price: 70,
default: false,
options: {},
hidden: true,
},
'artshow-panel-four': {
price: 80,
default: false,
options: {},
hidden: true,
},
},
rooms: [
Expand Down
75 changes: 75 additions & 0 deletions src/localizations/de-DE.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,81 @@ invoice-item-definition-register-ticket-addons-tshirt =
.name = T-Shirt
.extra = {$size}
invoice-item-definition-register-ticket-addons-early =
.name = Frühbucher
invoice-item-definition-register-ticket-addons-door =
.name = Walk-in Zuschlag
invoice-item-definition-register-ticket-addons-dealer-half =
.name = Dealer (halber Tisch)
invoice-item-definition-register-ticket-addons-dealer-full =
.name = Dealer (1 Tisch)
invoice-item-definition-register-ticket-addons-dealer-double =
.name = Dealer (2 Tische)
invoice-item-definition-register-ticket-addons-dealer-quad =
.name = Dealer (4 Tische)
invoice-item-definition-register-ticket-addons-boat-trip =
.name = Bootsfahrt
invoice-item-definition-register-ticket-addons-boat-vip =
.name = Boot VIP
invoice-item-definition-register-ticket-addons-boat-benefactor =
.name = Bootssponsor
invoice-item-definition-register-ticket-addons-artshow-table-half =
.name = Artshow (halber Tisch)
invoice-item-definition-register-ticket-addons-artshow-table-one =
.name = Artshow (1 Tisch)
invoice-item-definition-register-ticket-addons-artshow-table-oneandhalf =
.name = Artshow (1,5 Tische)
invoice-item-definition-register-ticket-addons-artshow-table-two =
.name = Artshow (2 Tische)
invoice-item-definition-register-ticket-addons-artshow-table-twoandhalf =
.name = Artshow (2,5 Tische)
invoice-item-definition-register-ticket-addons-artshow-table-three =
.name = Artshow (3 Tische)
invoice-item-definition-register-ticket-addons-artshow-table-threeandhalf =
.name = Artshow (3,5 Tische)
invoice-item-definition-register-ticket-addons-artshow-table-four =
.name = Artshow (4 Tische)
invoice-item-definition-register-ticket-addons-artshow-panel-half =
.name = Artshow (halbes Panel)
invoice-item-definition-register-ticket-addons-artshow-panel-one =
.name = Artshow (1 Panel)
invoice-item-definition-register-ticket-addons-artshow-panel-oneandhalf =
.name = Artshow (1,5 Panels)
invoice-item-definition-register-ticket-addons-artshow-panel-two =
.name = Artshow (2 Panels)
invoice-item-definition-register-ticket-addons-artshow-panel-twoandhalf =
.name = Artshow (2,5 Panels)
invoice-item-definition-register-ticket-addons-artshow-panel-three =
.name = Artshow (3 Panels)
invoice-item-definition-register-ticket-addons-artshow-panel-threeandhalf =
.name = Artshow (3,5 Panels)
invoice-item-definition-register-ticket-addons-artshow-panel-four =
.name = Artshow (4 Panels)
invoice-item-definition-other =
.name = Sonstige
Expand Down
Loading

0 comments on commit d12c8aa

Please sign in to comment.