@bash-app/bash-common 30.45.0 → 30.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bash-app/bash-common",
3
- "version": "30.45.0",
3
+ "version": "30.47.0",
4
4
  "description": "Common data and scripts to use on the frontend and backend",
5
5
  "type": "module",
6
6
  "main": "src/index.ts",
@@ -330,6 +330,7 @@ model BashEvent {
330
330
  averageRating Float? @default(0)
331
331
  serviceBookings ServiceBooking[] // Add this field to create the reverse relation
332
332
  userReport UserReport[]
333
+ favoritedBy UserFavorite[]
333
334
  }
334
335
 
335
336
  model Coordinates {
@@ -1113,6 +1114,7 @@ model User {
1113
1114
  notifyForTrendingBashes Boolean @default(false)
1114
1115
  trendingBashThreshold Int @default(10) // Min attendees to trigger notification
1115
1116
  organizerUser UserFollowing[] @relation("FollowingOrganizers")
1117
+ favorites UserFavorite[]
1116
1118
  }
1117
1119
 
1118
1120
  model UserPreferences {
@@ -1268,7 +1270,6 @@ model AssociatedBash {
1268
1270
  ownerUserId String?
1269
1271
  owner User? @relation(fields: [ownerUserId], references: [id], onDelete: Cascade)
1270
1272
  isOrganizer Boolean?
1271
- isFavorite Boolean?
1272
1273
  service Service[]
1273
1274
 
1274
1275
  @@unique([ownerEmail, bashEventId])
@@ -1473,6 +1474,7 @@ model Service {
1473
1474
  userPromoCodeRedemption UserPromoCodeRedemption[]
1474
1475
  bookings ServiceBooking[]
1475
1476
  notification Notification[]
1477
+ favoritedBy UserFavorite[]
1476
1478
  }
1477
1479
 
1478
1480
  model StripeAccount {
@@ -1532,21 +1534,41 @@ model VolunteerService {
1532
1534
  }
1533
1535
 
1534
1536
  model EventService {
1535
- id String @id @default(cuid())
1537
+ id String @id @default(cuid())
1538
+
1539
+ // General classification
1540
+ eventServiceType EventServiceType // e.g. DecorAndDesign
1541
+ eventServiceSubType String? // e.g. "BalloonArt"
1542
+ formatOptions ServiceFormatOption[] // Related formats for this subtype
1543
+
1544
+ // Custom input support
1545
+ isCustom Boolean @default(false)
1546
+ customNote String?
1547
+
1548
+ // Optional linked models
1536
1549
  serviceRangeId String?
1537
- serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
1538
- eventServiceTypes EventServiceType[]
1539
- eventServiceSubType String?
1550
+ serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
1551
+ crowdSizeId String? @unique
1552
+ crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
1553
+ service Service?
1554
+ serviceId String?
1555
+
1556
+ // Other descriptors
1540
1557
  yearsOfExperience YearsOfExperience
1541
- crowdSizeId String? @unique
1542
- crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
1543
1558
  goodsOrServices String[]
1544
1559
  menuItems String?
1545
1560
  venueTypes String[]
1546
- secondaryVenueTypes String[] @default([])
1547
- service Service?
1561
+ secondaryVenueTypes String[] @default([])
1548
1562
  }
1549
1563
 
1564
+ model ServiceFormatOption {
1565
+ id String @id @default(cuid())
1566
+ eventServiceId String
1567
+ eventService EventService @relation(fields: [eventServiceId], references: [id], onDelete: Cascade)
1568
+ format String // e.g. "BalloonGarlands", "BuffetStyle", "WeddingFlorals"
1569
+ }
1570
+
1571
+
1550
1572
  model EntertainmentService {
1551
1573
  id String @id @default(cuid())
1552
1574
  serviceRangeId String?
@@ -1564,19 +1586,23 @@ model EntertainmentService {
1564
1586
  }
1565
1587
 
1566
1588
  model Vendor {
1567
- id String @id @default(cuid())
1568
- serviceRangeId String?
1569
- serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
1570
- vendorServiceTypes VendorServiceType[]
1589
+ id String @id @default(cuid())
1590
+ serviceRangeId String?
1591
+ serviceRange ServiceRange? @relation(fields: [serviceRangeId], references: [id])
1592
+ vendorServiceTypes VendorServiceType[]
1571
1593
  vendorServiceSubType String?
1572
- yearsOfExperience YearsOfExperience
1573
- crowdSizeId String? @unique
1574
- crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
1575
- goodsOrServices String[]
1576
- menuItems String?
1577
- venueTypes String[]
1578
- secondaryVenueTypes String[] @default([])
1579
- service Service?
1594
+ yearsOfExperience YearsOfExperience
1595
+ crowdSizeId String? @unique
1596
+ crowdSize AmountOfGuests? @relation(fields: [crowdSizeId], references: [id], onDelete: Cascade)
1597
+ goodsOrServices String[]
1598
+ menuItems String?
1599
+ venueTypes String[]
1600
+ secondaryVenueTypes String[] @default([])
1601
+ vendorType String?
1602
+ subType String?
1603
+ otherSubType String?
1604
+ detailsText String?
1605
+ service Service?
1580
1606
  }
1581
1607
 
1582
1608
  model Exhibitor {
@@ -1673,30 +1699,945 @@ model Organization {
1673
1699
  }
1674
1700
 
1675
1701
  enum EventServiceType {
1702
+ Financing
1703
+ EventPlanningAndManagement
1704
+ FoodAndBeverage
1705
+ Cleaning
1706
+ DecorAndDesign
1707
+ RentalEquipment
1708
+ MediaProductionAndCreative
1709
+ AudioVisualSupport
1710
+ HostingSupport
1711
+ PromotionAndMarketing
1712
+ Staffing
1713
+ Transportation
1714
+ Other
1715
+ }
1716
+
1717
+ enum FinancingSubType {
1676
1718
  Investor
1677
1719
  LongTermLoan
1678
1720
  ShortTermLoan
1679
- EventPlanning
1721
+ }
1722
+
1723
+ enum EventPlanningAndManagementSubType {
1724
+ EventPlanner
1725
+ EventManager
1726
+ VirtualAssistant
1727
+ Consultants
1728
+ }
1729
+
1730
+ enum FoodAndBeverageSubType {
1680
1731
  Caterer
1681
- Cleaner
1682
- Decorator
1683
- InteriorDesigner
1684
- RentalEquipmentProvider
1685
- FoodAndBeverageProvider
1732
+ FoodTruck
1733
+ FoodCartStand
1734
+ PrivateChefs
1735
+ Bartenders
1736
+ DessertBar
1737
+ BeverageCart
1738
+ }
1739
+
1740
+ enum CleaningSubType {
1741
+ LightCleaning
1742
+ DeepCleaning
1743
+ }
1744
+
1745
+ enum DecorAndDesignSubType {
1746
+ Decorators
1747
+ InteriorDesigners
1748
+ Floral
1749
+ BalloonArt
1750
+ Balloons
1751
+ TableStyling
1752
+ Centerpieces
1753
+ FurnitureStyling
1754
+ Lighting
1755
+ CustomSignage
1756
+ }
1757
+
1758
+ enum RentalEquipmentSubType {
1759
+ PASystem
1760
+ DJLighting
1761
+ Chairs
1762
+ Tables
1763
+ Tents
1764
+ Linens
1765
+ Staging
1766
+ Generators
1767
+ DanceFloor
1768
+ PhotoBooth
1769
+ }
1770
+
1771
+ enum MediaProductionAndCreativeSubType {
1686
1772
  Photographer
1687
1773
  Videographer
1688
1774
  MediaEditor
1689
- AVTechnician
1690
1775
  GraphicDesigner
1776
+ GoProWearer
1777
+ DroneShots
1778
+ AISpecialist
1779
+ }
1780
+
1781
+ enum AudioVisualSupportSubType {
1782
+ AVTechnician
1783
+ SoundEngineer
1784
+ LightingTech
1785
+ StageTech
1786
+ ProjectorSetup
1787
+ }
1788
+
1789
+ enum HostingSupportSubType {
1790
+ Emcee
1791
+ Greeter
1792
+ }
1793
+
1794
+ enum PromotionAndMarketingSubType {
1691
1795
  Influencer
1692
1796
  Promoter
1693
1797
  CelebrityAppearance
1798
+ }
1799
+
1800
+ enum StaffingSubType {
1694
1801
  CrewHand
1695
- EventManager
1696
- VirtualAssistant
1697
- Consulting
1698
- Transportation
1699
- Other
1802
+ ParkingManagement
1803
+ GuestRegistration
1804
+ Security
1805
+ }
1806
+
1807
+ enum TransportationSubType {
1808
+ Limo
1809
+ PartyBus
1810
+ GuestShuttle
1811
+ Valet
1812
+ ValetService
1813
+ }
1814
+
1815
+ enum OtherSubType {
1816
+ Bookkeepers
1817
+ CPAs
1818
+ Lawyers
1819
+ ThankYouCards
1820
+ Reporting
1821
+ }
1822
+
1823
+ //Sub types for the event service sub-types
1824
+ enum InvestorFormat {
1825
+ AngelInvestor
1826
+ VentureCapital
1827
+ PrivateEquity
1828
+ }
1829
+
1830
+ enum LongTermLoanFormat {
1831
+ BankLoan
1832
+ SBA
1833
+ PersonalInvestor
1834
+ }
1835
+
1836
+ enum ShortTermLoanFormat {
1837
+ BridgeLoan
1838
+ MerchantCashAdvance
1839
+ InvoiceFactoring
1840
+ }
1841
+
1842
+ enum EventPlannerFormat {
1843
+ WeddingPlanning
1844
+ CorporateEventPlanning
1845
+ SocialEventPlanning
1846
+ FestivalPlanning
1847
+ ConferencePlanning
1848
+ FullServicePlanning
1849
+ PartialPlanning
1850
+ DayOfCoordination
1851
+ MonthOfCoordination
1852
+ RemotePlanning
1853
+ OnSitePlanning
1854
+ DestinationPlanning
1855
+ LuxuryEventPlanning
1856
+ BudgetEventPlanning
1857
+ ThemeEventPlanning
1858
+ }
1859
+
1860
+ enum EventManagerFormat {
1861
+ WeddingManager
1862
+ CorporateEventManager
1863
+ FestivalManager
1864
+ ConferenceManager
1865
+ SocialEventManager
1866
+ OnSiteManager
1867
+ ProductionManager
1868
+ LogisticsManager
1869
+ VIPExperienceManager
1870
+ TechnicalManager
1871
+ VenueManager
1872
+ GuestServicesManager
1873
+ BrandExperienceManager
1874
+ EmergencyResponseManager
1875
+ MultiVenueManager
1876
+ }
1877
+
1878
+ enum VirtualAssistantFormat {
1879
+ EventScheduling
1880
+ VendorCoordination
1881
+ GuestListManagement
1882
+ RSVPHandling
1883
+ BudgetTracking
1884
+ TimelineManagement
1885
+ VendorPaymentProcessing
1886
+ ContractManagement
1887
+ TravelArrangements
1888
+ GuestCommunication
1889
+ SocialMediaManagement
1890
+ EventDocumentation
1891
+ InventoryTracking
1892
+ EmergencyContactManagement
1893
+ PostEventFollowUp
1894
+ }
1895
+
1896
+ enum ConsultantFormat {
1897
+ EventStrategy
1898
+ BudgetOptimization
1899
+ VendorNegotiation
1900
+ RiskManagement
1901
+ SustainabilityPlanning
1902
+ TechnologyIntegration
1903
+ BrandAlignment
1904
+ AudienceEngagement
1905
+ RevenueOptimization
1906
+ SponsorshipStrategy
1907
+ MarketingStrategy
1908
+ SocialMediaStrategy
1909
+ CrisisManagement
1910
+ ComplianceConsulting
1911
+ AccessibilityPlanning
1912
+ }
1913
+
1914
+ enum CateringFormat {
1915
+ Buffet
1916
+ Plated
1917
+ FamilyStyle
1918
+ PassedAppetizers
1919
+ FoodStations
1920
+ Tapas
1921
+ TastingMenu
1922
+ FoodTruckSingleVendor
1923
+ FoodTruckMultiVendor
1924
+ OpenBar
1925
+ CashBar
1926
+ BeerWineOnly
1927
+ BeverageCart
1928
+ NonAlcoholicOnly
1929
+ }
1930
+
1931
+ enum FoodTruckFormat {
1932
+ WeddingCatering
1933
+ CorporateEventCatering
1934
+ FestivalVendor
1935
+ WeddingReception
1936
+ CorporateLunch
1937
+ FestivalFood
1938
+ ThemeEventCatering
1939
+ LateNightService
1940
+ DessertTruck
1941
+ SpecialtyCuisine
1942
+ MultiCuisineFleet
1943
+ StationarySetup
1944
+ MobileService
1945
+ PopUpService
1946
+ BrandedExperience
1947
+ }
1948
+
1949
+ enum FoodCartStandFormat {
1950
+ WeddingReception
1951
+ CorporateEvent
1952
+ FestivalVendor
1953
+ MarketStyle
1954
+ StationarySetup
1955
+ MobileService
1956
+ PopUpService
1957
+ DessertCart
1958
+ SpecialtyCart
1959
+ ThemeBasedCart
1960
+ BrandedCart
1961
+ MultiVendorMarket
1962
+ LateNightService
1963
+ SnackService
1964
+ InteractiveCart
1965
+ }
1966
+
1967
+ enum PrivateChefFormat {
1968
+ WeddingReception
1969
+ CorporateDining
1970
+ IntimateDinner
1971
+ TastingMenu
1972
+ CustomMenu
1973
+ DietarySpecialized
1974
+ ThemeBasedMenu
1975
+ InteractiveCooking
1976
+ WinePairing
1977
+ MultiCourse
1978
+ FamilyStyle
1979
+ BuffetStyle
1980
+ PlatedService
1981
+ LateNightService
1982
+ BrunchService
1983
+ }
1984
+
1985
+ enum BartenderFormat {
1986
+ FullBarService
1987
+ PremiumBarService
1988
+ BeerWineBar
1989
+ SignatureCocktails
1990
+ MocktailSpecialist
1991
+ InteractiveBar
1992
+ ThemeBasedBar
1993
+ WineService
1994
+ ChampagneService
1995
+ CraftBeerBar
1996
+ WhiskeyTasting
1997
+ MixologyClass
1998
+ MobileBar
1999
+ StationaryBar
2000
+ BrandedBar
2001
+ }
2002
+
2003
+ enum DessertBarFormat {
2004
+ WeddingDessert
2005
+ CorporateDessert
2006
+ ThemeBasedDessert
2007
+ InteractiveDessert
2008
+ DietarySpecialized
2009
+ ChocolateFountain
2010
+ IceCreamBar
2011
+ CandyBar
2012
+ PastryDisplay
2013
+ CakeService
2014
+ DonutWall
2015
+ CookieBar
2016
+ LateNightDessert
2017
+ BrandedDessert
2018
+ MultiStationDessert
2019
+ }
2020
+
2021
+ enum BeverageCartFormat {
2022
+ FullBarCart
2023
+ PremiumBarCart
2024
+ BeerWineCart
2025
+ NonAlcoholicCart
2026
+ SignatureDrinksCart
2027
+ InteractiveCart
2028
+ ThemeBasedCart
2029
+ WineCart
2030
+ ChampagneCart
2031
+ CraftBeerCart
2032
+ CoffeeCart
2033
+ SmoothieCart
2034
+ MocktailCart
2035
+ MobileCart
2036
+ BrandedCart
2037
+ }
2038
+
2039
+ enum PhotographerFormat {
2040
+ CandidOnly
2041
+ PosedAndCandid
2042
+ FullDayCoverage
2043
+ HalfDayCoverage
2044
+ DroneIncluded
2045
+ GoProIncluded
2046
+ SocialMediaReady
2047
+ SameDayEdit
2048
+ Livestreaming
2049
+ RawFootageOnly
2050
+ }
2051
+
2052
+ enum DecoratorFormat {
2053
+ WeddingDecor
2054
+ CorporateEventDecor
2055
+ ThemePartyDecor
2056
+ HolidayDecor
2057
+ SeasonalDecor
2058
+ LuxuryEventDecor
2059
+ FestivalDecor
2060
+ BrandedEventDecor
2061
+ SustainableDecor
2062
+ MinimalistDecor
2063
+ BohemianDecor
2064
+ IndustrialDecor
2065
+ VintageDecor
2066
+ ModernDecor
2067
+ CulturalDecor
2068
+ }
2069
+
2070
+ enum InteriorDesignerFormat {
2071
+ VenueTransformation
2072
+ EventSpacePlanning
2073
+ TemporaryInstallations
2074
+ BrandedEnvironments
2075
+ VIPAreaDesign
2076
+ SpatialPlanning
2077
+ FlowOptimization
2078
+ MultiLevelDesign
2079
+ InteractiveSpaces
2080
+ SustainableDesign
2081
+ CulturalDesign
2082
+ LuxuryDesign
2083
+ PopUpDesign
2084
+ ImmersiveDesign
2085
+ HybridEventDesign
2086
+ }
2087
+
2088
+ enum FloralFormat {
2089
+ WeddingFlorals
2090
+ CenterpieceDesign
2091
+ ArchAndAisleDecor
2092
+ BoutonniereAndCorsages
2093
+ SeasonalArrangements
2094
+ HangingInstallations
2095
+ WallDecorations
2096
+ CeilingInstallations
2097
+ SustainableFlorals
2098
+ DriedArrangements
2099
+ PreservedFlowers
2100
+ ArtificialArrangements
2101
+ CulturalFlorals
2102
+ LuxuryArrangements
2103
+ InteractiveFlorals
2104
+ }
2105
+
2106
+ enum BalloonArtFormat {
2107
+ BalloonArchways
2108
+ CeilingInstallations
2109
+ CenterpieceDesigns
2110
+ BrandedDisplays
2111
+ ThemeDecorations
2112
+ BalloonGarlands
2113
+ FloatingInstallations
2114
+ InteractiveDisplays
2115
+ BalloonBackdrops
2116
+ BalloonSculptures
2117
+ BalloonWalls
2118
+ BalloonCeilings
2119
+ BalloonColumns
2120
+ BalloonFurniture
2121
+ BalloonPhotoBooths
2122
+ }
2123
+
2124
+ enum BalloonsFormat {
2125
+ HeliumArrangements
2126
+ AirFilledDisplays
2127
+ CustomLettering
2128
+ BrandedBalloons
2129
+ ThemeDecorations
2130
+ LEDBalloons
2131
+ ConfettiBalloons
2132
+ GiantBalloons
2133
+ BalloonBouquets
2134
+ BalloonClusters
2135
+ BalloonColumns
2136
+ BalloonArches
2137
+ BalloonGarlands
2138
+ BalloonBackdrops
2139
+ BalloonCenterpieces
2140
+ }
2141
+
2142
+ enum TableStylingFormat {
2143
+ WeddingTablescapes
2144
+ CorporateTableDesign
2145
+ ThemeTableDecor
2146
+ SeasonalArrangements
2147
+ BrandedTableSettings
2148
+ LuxuryTablescapes
2149
+ MinimalistDesign
2150
+ RusticDesign
2151
+ ModernDesign
2152
+ CulturalDesign
2153
+ InteractiveTables
2154
+ DessertTableDesign
2155
+ BuffetTableDesign
2156
+ CocktailTableDesign
2157
+ VIPTableDesign
2158
+ }
2159
+
2160
+ enum CenterpiecesFormat {
2161
+ WeddingCenterpieces
2162
+ CorporateCenterpieces
2163
+ ThemeCenterpieces
2164
+ SeasonalArrangements
2165
+ BrandedDisplays
2166
+ FloralCenterpieces
2167
+ CandleCenterpieces
2168
+ InteractiveCenterpieces
2169
+ FloatingCenterpieces
2170
+ HangingCenterpieces
2171
+ LEDCenterpieces
2172
+ SustainableCenterpieces
2173
+ CulturalCenterpieces
2174
+ LuxuryCenterpieces
2175
+ CustomCenterpieces
2176
+ }
2177
+
2178
+ enum FurnitureStylingFormat {
2179
+ LoungeAreas
2180
+ VIPSeating
2181
+ PhotoBackdrops
2182
+ BrandedFurniture
2183
+ ThemeDecor
2184
+ ConversationAreas
2185
+ DiningAreas
2186
+ CocktailAreas
2187
+ RestAreas
2188
+ InteractiveSpaces
2189
+ SustainableFurniture
2190
+ CulturalFurniture
2191
+ LuxuryFurniture
2192
+ CustomFurniture
2193
+ PopUpFurniture
2194
+ }
2195
+
2196
+ enum LightingFormat {
2197
+ AmbientLighting
2198
+ Uplighting
2199
+ SpotLighting
2200
+ ThemeLighting
2201
+ BrandedLighting
2202
+ VideoWall
2203
+ LEDWall
2204
+ ProjectionMapping
2205
+ IntelligentLighting
2206
+ MovingHeads
2207
+ WashLights
2208
+ PatternLights
2209
+ ColorChanging
2210
+ InteractiveLighting
2211
+ ArchitecturalLighting
2212
+ }
2213
+
2214
+ enum CustomSignageFormat {
2215
+ WelcomeSigns
2216
+ DirectionalSignage
2217
+ BrandedDisplays
2218
+ DigitalSignage
2219
+ InteractiveDisplays
2220
+ VideoWall
2221
+ LEDWall
2222
+ HolographicDisplay
2223
+ ProjectionMapping
2224
+ WayfindingSigns
2225
+ MenuBoards
2226
+ ScheduleDisplays
2227
+ SocialMediaWall
2228
+ BrandedBackdrops
2229
+ CustomInstallations
2230
+ }
2231
+
2232
+ enum PASystemFormat {
2233
+ IndoorEvents
2234
+ OutdoorEvents
2235
+ PortableSetup
2236
+ MultiZoneSystem
2237
+ BrandedAudio
2238
+ WirelessSystem
2239
+ DistributedAudio
2240
+ LineArraySystem
2241
+ PointSourceSystem
2242
+ SubwooferSystem
2243
+ MonitorSystem
2244
+ RecordingSystem
2245
+ StreamingSystem
2246
+ InteractiveAudio
2247
+ CustomAudio
2248
+ }
2249
+
2250
+ enum DJLightingFormat {
2251
+ DanceFloorLighting
2252
+ StageLighting
2253
+ ThemeLighting
2254
+ InteractiveLighting
2255
+ BrandedLighting
2256
+ LaserShow
2257
+ FogEffects
2258
+ HazeEffects
2259
+ MovingHeads
2260
+ LEDWash
2261
+ SpotLighting
2262
+ Uplighting
2263
+ ColorWash
2264
+ PatternProjection
2265
+ VideoMapping
2266
+ }
2267
+
2268
+ enum ChairsFormat {
2269
+ BanquetChairs
2270
+ LoungeChairs
2271
+ PremiumSeating
2272
+ ThemeChairs
2273
+ BrandedChairs
2274
+ FoldingChairs
2275
+ ChiavariChairs
2276
+ GhostChairs
2277
+ CrossBackChairs
2278
+ BarStools
2279
+ CocktailChairs
2280
+ VIPSeating
2281
+ OutdoorChairs
2282
+ CushionedChairs
2283
+ CustomChairs
2284
+ }
2285
+
2286
+ enum TablesFormat {
2287
+ BanquetTables
2288
+ CocktailTables
2289
+ PremiumTables
2290
+ ThemeTables
2291
+ BrandedTables
2292
+ RoundTables
2293
+ RectangularTables
2294
+ HighTopTables
2295
+ FarmTables
2296
+ MixAndMatchTables
2297
+ OutdoorTables
2298
+ VIPTables
2299
+ DessertTables
2300
+ RegistrationTables
2301
+ CustomTables
2302
+ }
2303
+
2304
+ enum TentsFormat {
2305
+ ClearSpanTents
2306
+ FrameTents
2307
+ PoleTents
2308
+ PremiumTents
2309
+ BrandedTents
2310
+ SailclothTents
2311
+ StretchTents
2312
+ CanopyTents
2313
+ MarqueeTents
2314
+ PopUpTents
2315
+ WeddingTents
2316
+ CorporateTents
2317
+ FestivalTents
2318
+ HeatedTents
2319
+ CustomTents
2320
+ }
2321
+
2322
+ enum LinensFormat {
2323
+ TableLinens
2324
+ ChairCovers
2325
+ PremiumLinens
2326
+ ThemeLinens
2327
+ BrandedLinens
2328
+ TableRunners
2329
+ Napkins
2330
+ Overlays
2331
+ Skirting
2332
+ Draping
2333
+ CeilingDrapes
2334
+ BackdropFabrics
2335
+ ChairSashes
2336
+ CustomLinens
2337
+ SeasonalLinens
2338
+ }
2339
+
2340
+ enum StagingFormat {
2341
+ MainStage
2342
+ PerformanceStage
2343
+ MultiLevelStage
2344
+ BrandedStage
2345
+ CustomStage
2346
+ PlatformStage
2347
+ ThrustStage
2348
+ ArenaStage
2349
+ CatwalkStage
2350
+ RunwayStage
2351
+ DJStage
2352
+ BandStage
2353
+ SpeakerStage
2354
+ FashionShowStage
2355
+ InteractiveStage
2356
+ }
2357
+
2358
+ enum GeneratorsFormat {
2359
+ BackupPower
2360
+ PrimaryPower
2361
+ SilentGenerators
2362
+ MultipleUnits
2363
+ BrandedPower
2364
+ SolarPower
2365
+ HybridPower
2366
+ EmergencyPower
2367
+ MobilePower
2368
+ DistributionUnits
2369
+ PowerManagement
2370
+ GreenPower
2371
+ HighCapacity
2372
+ LowNoise
2373
+ CustomPower
2374
+ }
2375
+
2376
+ enum DanceFloorFormat {
2377
+ StandardFloor
2378
+ LEDFloor
2379
+ PremiumFloor
2380
+ ThemeFloor
2381
+ BrandedFloor
2382
+ InteractiveFloor
2383
+ GlowFloor
2384
+ MarleyFloor
2385
+ SprungFloor
2386
+ CustomFloor
2387
+ ModularFloor
2388
+ OutdoorFloor
2389
+ StageFloor
2390
+ MultiLevelFloor
2391
+ VideoFloor
2392
+ }
2393
+
2394
+ enum PhotoBoothFormat {
2395
+ OpenAirBooth
2396
+ EnclosedBooth
2397
+ SocialMediaBooth
2398
+ GreenScreenBooth
2399
+ BrandedBooth
2400
+ }
2401
+
2402
+ enum VideographerFormat {
2403
+ WeddingCoverage
2404
+ EventHighlights
2405
+ LiveStreaming
2406
+ MultiCameraSetup
2407
+ DroneFootage
2408
+ }
2409
+
2410
+ enum MediaEditorFormat {
2411
+ SameDayEdit
2412
+ HighlightReel
2413
+ SocialMediaClips
2414
+ FullEventVideo
2415
+ BrandedContent
2416
+ }
2417
+
2418
+ enum GraphicDesignerFormat {
2419
+ EventBranding
2420
+ SocialMediaGraphics
2421
+ PrintMaterials
2422
+ DigitalDisplays
2423
+ CustomIllustrations
2424
+ }
2425
+
2426
+ enum GoProWearerFormat {
2427
+ GuestPerspective
2428
+ ActionShots
2429
+ BehindTheScenes
2430
+ InteractiveContent
2431
+ BrandedContent
2432
+ }
2433
+
2434
+ enum DroneShotsFormat {
2435
+ VenueOverview
2436
+ EventHighlights
2437
+ AerialPhotos
2438
+ LiveStreaming
2439
+ BrandedContent
2440
+ }
2441
+
2442
+ enum AISpecialistFormat {
2443
+ ContentGeneration
2444
+ ImageEnhancement
2445
+ VideoEditing
2446
+ SocialMediaContent
2447
+ BrandedContent
2448
+ }
2449
+
2450
+ enum AVTechnicianFormat {
2451
+ SoundSetup
2452
+ VideoSetup
2453
+ LightingSetup
2454
+ LiveStreaming
2455
+ TechnicalSupport
2456
+ }
2457
+
2458
+ enum SoundEngineerFormat {
2459
+ LiveSound
2460
+ Recording
2461
+ Mixing
2462
+ MultiZoneAudio
2463
+ TechnicalSupport
2464
+ }
2465
+
2466
+ enum LightingTechFormat {
2467
+ StageLighting
2468
+ AmbientLighting
2469
+ SpecialEffects
2470
+ ThemeLighting
2471
+ TechnicalSupport
2472
+ }
2473
+
2474
+ enum StageTechFormat {
2475
+ StageSetup
2476
+ EquipmentManagement
2477
+ TechnicalSupport
2478
+ SafetyMonitoring
2479
+ EmergencyResponse
2480
+ }
2481
+
2482
+ enum ProjectorSetupFormat {
2483
+ PresentationSetup
2484
+ VideoMapping
2485
+ InteractiveDisplays
2486
+ MultiScreenSetup
2487
+ BrandedContent
2488
+ }
2489
+
2490
+ enum EmceeFormat {
2491
+ WeddingMC
2492
+ CorporateEvents
2493
+ AwardCeremonies
2494
+ InteractiveHosting
2495
+ BrandedEvents
2496
+ }
2497
+
2498
+ enum GreeterFormat {
2499
+ VIPGreeting
2500
+ GuestCheckIn
2501
+ InformationDesk
2502
+ BrandAmbassador
2503
+ EventGuide
2504
+ }
2505
+
2506
+ enum InfluencerFormat {
2507
+ EventPromotion
2508
+ LiveCoverage
2509
+ BrandAmbassador
2510
+ SocialMediaTakeover
2511
+ ContentCreation
2512
+ }
2513
+
2514
+ enum PromoterFormat {
2515
+ LocalMarketing
2516
+ SocialMediaCampaign
2517
+ EmailMarketing
2518
+ CommunityOutreach
2519
+ TicketSales
2520
+ }
2521
+
2522
+ enum CelebrityAppearanceFormat {
2523
+ MeetAndGreet
2524
+ KeynoteSpeaking
2525
+ Performance
2526
+ BrandAmbassador
2527
+ PhotoOpportunities
2528
+ }
2529
+
2530
+ enum CrewHandFormat {
2531
+ SetupAndBreakdown
2532
+ EquipmentHandling
2533
+ VenuePreparation
2534
+ LoadInLoadOut
2535
+ TechnicalSupport
2536
+ }
2537
+
2538
+ enum ParkingManagementFormat {
2539
+ ValetService
2540
+ SelfParking
2541
+ ShuttleService
2542
+ VIPParking
2543
+ TrafficControl
2544
+ }
2545
+
2546
+ enum GuestRegistrationFormat {
2547
+ DigitalCheckIn
2548
+ DoorGuy
2549
+ VIPRegistration
2550
+ OnSiteRegistration
2551
+ PreEventRegistration
2552
+ BadgePrinting
2553
+ }
2554
+
2555
+ enum SecurityFormat {
2556
+ CrowdControl
2557
+ VIPProtection
2558
+ AccessControl
2559
+ EmergencyResponse
2560
+ AssetProtection
2561
+ }
2562
+
2563
+ enum LimoFormat {
2564
+ VIPTransport
2565
+ GroupTransport
2566
+ AirportTransfer
2567
+ WeddingService
2568
+ CorporateEvents
2569
+ }
2570
+
2571
+ enum PartyBusFormat {
2572
+ GroupTransport
2573
+ EntertainmentBus
2574
+ CorporateEvents
2575
+ WeddingService
2576
+ ThemeParties
2577
+ }
2578
+
2579
+ enum GuestShuttleFormat {
2580
+ VenueTransfer
2581
+ HotelShuttle
2582
+ ParkingShuttle
2583
+ VIPTransport
2584
+ ScheduledService
2585
+ }
2586
+
2587
+ enum ValetFormat {
2588
+ PremiumService
2589
+ StandardService
2590
+ VIPService
2591
+ EventBased
2592
+ CorporateEvents
2593
+ }
2594
+
2595
+ enum ValetServiceFormat {
2596
+ PremiumService
2597
+ StandardService
2598
+ VIPService
2599
+ EventBased
2600
+ CorporateEvents
2601
+ }
2602
+
2603
+ enum BookkeepersFormat {
2604
+ EventBudgeting
2605
+ VendorPaymentManagement
2606
+ ExpenseTracking
2607
+ FinancialReporting
2608
+ TaxPreparation
2609
+ }
2610
+
2611
+ enum CPAsFormat {
2612
+ EventTaxPlanning
2613
+ BusinessStructure
2614
+ FinancialCompliance
2615
+ RevenueOptimization
2616
+ EventDeductions
2617
+ }
2618
+
2619
+ enum LawyersFormat {
2620
+ EventContracts
2621
+ VendorAgreements
2622
+ LiabilityProtection
2623
+ InsuranceReview
2624
+ PermitCompliance
2625
+ }
2626
+
2627
+ enum ThankYouCardsFormat {
2628
+ CustomEventDesign
2629
+ BulkOrdering
2630
+ DigitalDelivery
2631
+ HandwrittenNotes
2632
+ PremiumPackaging
2633
+ }
2634
+
2635
+ enum ReportingFormat {
2636
+ EventAnalytics
2637
+ AttendanceTracking
2638
+ RevenueReporting
2639
+ VendorPerformance
2640
+ ROIAnalysis
1700
2641
  }
1701
2642
 
1702
2643
  enum EntertainmentServiceType {
@@ -1760,7 +2701,6 @@ enum VendorServiceType {
1760
2701
  Other
1761
2702
  }
1762
2703
 
1763
-
1764
2704
  enum OrganizationType {
1765
2705
  Church
1766
2706
  GreekLife
@@ -1902,6 +2842,7 @@ model ServiceRate {
1902
2842
  rateType ServiceRateType
1903
2843
  hourlyRateCents Int?
1904
2844
  dailyRateCents Int?
2845
+ flatRateCents Int?
1905
2846
  cleaningFeePerBookingCents Int?
1906
2847
  minimumTimeBlockHours Int?
1907
2848
  serviceSpecialRates ServiceSpecialRates?
@@ -2013,6 +2954,7 @@ enum ServiceBookingFeeType {
2013
2954
  enum ServiceRatePricingType {
2014
2955
  Hourly
2015
2956
  Daily
2957
+ Flat
2016
2958
  }
2017
2959
 
2018
2960
  enum ServiceBookingStatus {
@@ -2345,3 +3287,20 @@ model UserStats {
2345
3287
  @@index([servicesBookedCount])
2346
3288
  @@index([followersCount])
2347
3289
  }
3290
+
3291
+ model UserFavorite {
3292
+ id String @id @default(cuid())
3293
+ userId String
3294
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
3295
+ serviceId String?
3296
+ service Service? @relation(fields: [serviceId], references: [id], onDelete: Cascade)
3297
+ bashEventId String?
3298
+ bashEvent BashEvent? @relation(fields: [bashEventId], references: [id], onDelete: Cascade)
3299
+ createdAt DateTime @default(now())
3300
+
3301
+ @@unique([userId, serviceId])
3302
+ @@unique([userId, bashEventId])
3303
+ @@index([userId])
3304
+ @@index([serviceId])
3305
+ @@index([bashEventId])
3306
+ }
@@ -32,6 +32,7 @@ import {
32
32
  ServiceBookingPackage,
33
33
  ServiceBookingPriceBreakdown,
34
34
  ServiceDailyRates,
35
+ ServiceFormatOption,
35
36
  ServiceLink,
36
37
  ServicePackage,
37
38
  ServiceRange,
@@ -289,6 +290,7 @@ export const VENUE_DATA_TO_INCLUDE = {} satisfies Prisma.VenueInclude;
289
290
  export const EVENT_SERVICE_DATA_TO_INCLUDE = {
290
291
  crowdSize: true,
291
292
  serviceRange: true,
293
+ formatOptions: true,
292
294
  } satisfies Prisma.EventServiceInclude;
293
295
 
294
296
  export const ENTERTAINMENT_SERVICE_DATA_TO_INCLUDE = {
@@ -593,6 +595,7 @@ export type ServiceExtNoIds = Exclude<
593
595
  export interface EventServiceExt extends EventService {
594
596
  crowdSize?: AmountOfGuests;
595
597
  serviceRange?: ServiceRange;
598
+ formatOptions?: ServiceFormatOption[]
596
599
  }
597
600
 
598
601
  export interface EntertainmentServiceExt extends EntertainmentService {
@@ -62,6 +62,28 @@ export function serviceBookingCalcDayPriceBreakdown(
62
62
  // minimumTimeBlockHours: 0,
63
63
  };
64
64
 
65
+ // First check if any service rate has a flat rate - this takes precedence
66
+ const flatRateService = serviceRates.find(
67
+ (rate) => rate != null && (rate.flatRateCents ?? 0) > 0
68
+ );
69
+
70
+ if (flatRateService) {
71
+ pricingInfo.rateType = flatRateService.rateType ?? ServiceRateType.General;
72
+ pricingInfo.pricingType = "Flat" as ServiceRatePricingType;
73
+ pricingInfo.unitCount = 1; // Flat rate is always a single unit
74
+ pricingInfo.hours = hoursRemaining; // Use all remaining hours
75
+ pricingInfo.rateCents = flatRateService.flatRateCents ?? 0;
76
+ pricingInfo.piTotalCents = pricingInfo.rateCents; // Total is just the flat rate
77
+
78
+ pricingInfo.dateTimeRange = {
79
+ start: dateTimeRange.start,
80
+ end: dateTimeRange.start.plus({ hours: pricingInfo.hours }),
81
+ };
82
+
83
+ return pricingInfo;
84
+ }
85
+
86
+ // If no flat rate, proceed with the existing logic for hourly/daily rates
65
87
  // Find the first serviceRate where dailyRate or hourlyRate is not null based on isFullDay
66
88
  const validServiceRate = serviceRates.find(
67
89
  (rate) =>
@@ -211,25 +233,27 @@ export function serviceRatesFilter(
211
233
  }
212
234
 
213
235
  export function serviceRatesHasRates(rates: ServiceRatesLuxon) {
214
- const { generalRate, specialRates, dailyRates } = rates;
215
-
236
+ //check that we have rates with prices
216
237
  const isValidSpecialOrDailyRate = (
217
238
  rate: ServiceSpecialRatesExtT | ServiceDailyRatesExtT
218
239
  ) =>
219
240
  rate?.serviceRate &&
220
241
  ((rate.serviceRate?.dailyRateCents ?? 0) > 0 ||
221
- (rate.serviceRate?.hourlyRateCents ?? 0) > 0);
242
+ (rate.serviceRate?.hourlyRateCents ?? 0) > 0 ||
243
+ (rate.serviceRate?.flatRateCents ?? 0) > 0);
222
244
 
223
245
  const isValidGeneralRate = (rate: ServiceRate | undefined | null) =>
224
- rate && ((rate.dailyRateCents ?? 0) > 0 || (rate.hourlyRateCents ?? 0) > 0);
246
+ rate && (
247
+ (rate.dailyRateCents ?? 0) > 0 ||
248
+ (rate.hourlyRateCents ?? 0) > 0 ||
249
+ (rate.flatRateCents ?? 0) > 0
250
+ );
225
251
 
226
- const hasValidSpecialOrDailyRate = [...specialRates, ...dailyRates].some(
227
- isValidSpecialOrDailyRate
252
+ return (
253
+ rates.specialRates?.some(isValidSpecialOrDailyRate) ||
254
+ rates.dailyRates?.some(isValidSpecialOrDailyRate) ||
255
+ isValidGeneralRate(rates.generalRate)
228
256
  );
229
- const hasValidGeneralRate = isValidGeneralRate(generalRate);
230
-
231
- const hasRates = hasValidSpecialOrDailyRate || hasValidGeneralRate;
232
- return hasRates;
233
257
  }
234
258
 
235
259
  export function serviceRatesToLuxonRates(