Files
aperonight/db/seeds.rb
kbe dce5d0af12 fix: update seeds file to use correct payout_status enum value
- Change 'not_requested' to 'pending_request' in seeds.rb
- Fixes ArgumentError when running db:seed after enum update
- Ensures seeds file works with the new enum naming

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 12:00:05 +02:00

343 lines
12 KiB
Ruby
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# This file should ensure the existence of records required to run the application in every environment (production,
# development, test). The code here should be idempotent so that it can be executed at any point in every environment.
# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup).
#
# Example:
#
# ["Action", "Comedy", "Drama", "Horror"].each do |genre_name|
# MovieGenre.find_or_create_by!(name: genre_name)
# end
# Create admin user for development
admin_user = User.find_or_create_by!(email: "admin@example.com") do |u|
u.password = "password"
u.password_confirmation = "password"
u.last_name = nil
u.first_name = nil
end
# Create regular users for development
users = User.where.not(email: "admin@example.com").limit(5)
missing_users_count = 5 - users.count
missing_users_count.times do |i|
User.find_or_create_by!(email: "user#{i + 1}@example.com") do |u|
u.password = "password"
u.password_confirmation = "password"
u.last_name = nil
u.first_name = nil
end
end
# Reload all users after creation
users = User.all.to_a
# Create sample events
events_data = [
{
name: "Summer Beach Event",
slug: "summer-beach-event",
description: "Join us for an amazing night at the beach with music, dancing, and cocktails.",
venue_name: "Sunset Beach Resort",
venue_address: "123 Ocean Drive, Miami, FL",
latitude: 25.7617,
longitude: -80.1918,
start_time: 1.day.from_now,
end_time: 1.day.from_now + 6.hours,
featured: true,
image: "https://fastly.picsum.photos/id/407/300/200.jpg?hmac=9EhoXMZ1QdwJue90vzxcjBg2YzsZsAWCjJ7oxOhtcU0",
user: users.first
},
{
name: "Rooftop Jazz Night",
slug: "rooftop-jazz-night",
description: "Experience smooth jazz under the stars at our exclusive rooftop venue.",
venue_name: "Skyline Rooftop Bar",
venue_address: "456 Downtown Ave, New York, NY",
latitude: 40.7128,
longitude: -74.0060,
start_time: 3.days.from_now,
end_time: 3.days.from_now + 4.hours,
featured: true,
image: "https://images.unsplash.com/photo-1511671782779-c97d3d27a1d4?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80",
user: users.second
},
{
name: "Warehouse Electronic Festival",
slug: "warehouse-electronic-festival",
description: "A night of electronic music and dancing in an industrial warehouse setting.",
venue_name: "Downtown Warehouse",
venue_address: "789 Industrial Blvd, Los Angeles, CA",
latitude: 34.0522,
longitude: -118.2437,
start_time: 1.week.from_now,
end_time: 1.week.from_now + 8.hours,
featured: false,
image: "https://images.unsplash.com/photo-1470225620780-dba8ba36b745?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80",
user: users.third
}
]
events = []
events_data.each do |event_data|
user = event_data.delete(:user)
event = Event.find_or_create_by!(name: event_data[:name]) do |p|
p.assign_attributes(event_data)
p.user = user
p.state = :published
end
events << event
end
# Create ticket types for each event
events.each_with_index do |event, index|
# General Admission ticket type
TicketType.find_or_create_by!(event: event, name: "General Admission") do |tt|
tt.description = "General admission ticket for #{event.name}"
tt.price_cents = 2500 # $25.00
tt.quantity = 100
tt.sale_start_at = 1.month.ago
tt.sale_end_at = event.start_time - 1.hour
tt.minimum_age = 18
end
# VIP ticket type
TicketType.find_or_create_by!(event: event, name: "VIP") do |tt|
tt.description = "VIP access ticket for #{event.name} with premium benefits"
tt.price_cents = 7500 # $75.00
tt.quantity = 20
tt.sale_start_at = 1.month.ago
tt.sale_end_at = event.start_time - 1.hour
tt.minimum_age = 21
end
end
puts "Created #{User.count} users, #{Event.count} events, and #{TicketType.count} ticket types"
# Create regular user as promoter
promoter = User.find_or_create_by!(email: "kbataille@vivaldi.net") do |u|
u.password = "lareunion974!"
u.password_confirmation = "lareunion974!"
u.last_name = nil
u.first_name = nil
u.is_professionnal = true
end
# Create a completed event with earnings for payout demonstration
completed_event_promoter = User.find_or_create_by!(email: "kbataille@vivaldi.net") do |u|
u.password = "password"
u.password_confirmation = "password"
u.first_name = "Event"
u.last_name = "Promoter"
u.is_professionnal = true
# Ensure the promoter has a Stripe account for payouts
u.stripe_connected_account_id = "acct_test_payout_account" unless u.stripe_connected_account_id.present?
end
completed_event = Event.find_or_create_by!(name: "Completed Music Festival") do |e|
e.slug = "completed-music-festival"
e.state = :published
e.description = "An amazing music festival that has already taken place."
e.venue_name = "Central Park"
e.venue_address = "Central Park, New York, NY"
e.latitude = 40.7812
e.longitude = -73.9665
# Set the event to have ended 2 days ago
e.start_time = 2.days.ago
e.end_time = 2.days.ago + 8.hours
e.featured = false
e.image = "https://data.bizouk.com/cache1/events/images/10/78/87/b801a9a43266b4cc54bdda73bf34eec8_700_800_auto_97.jpg"
e.user = completed_event_promoter
# Ensure payout status is pending_request
e.payout_status = :pending_request
end
# Create ticket types for the completed event
general_ticket_type = TicketType.find_or_create_by!(event: completed_event, name: "General Admission") do |tt|
tt.description = "General admission ticket for the Completed Music Festival"
tt.price_cents = 5000 # $50.00
tt.quantity = 200
tt.sale_start_at = 1.month.ago
tt.sale_end_at = completed_event.start_time - 1.hour
tt.minimum_age = 18
end
vip_ticket_type = TicketType.find_or_create_by!(event: completed_event, name: "VIP") do |tt|
tt.description = "VIP access ticket for the Completed Music Festival"
tt.price_cents = 15000 # $150.00
tt.quantity = 50
tt.sale_start_at = 1.month.ago
tt.sale_end_at = completed_event.start_time - 1.hour
tt.minimum_age = 21
end
# Create some orders and tickets for the completed event to generate earnings
buyer_user = User.find_or_create_by!(email: "buyer@example.com") do |u|
u.password = "password"
u.password_confirmation = "password"
u.first_name = "Ticket"
u.last_name = "Buyer"
end
# Create multiple orders with different statuses to demonstrate the payout system
# Order 1: Paid order with general admission tickets
order1 = Order.find_or_create_by!(user: buyer_user, event: completed_event) do |o|
o.status = "paid"
o.total_amount_cents = 15000 # $150.00 for 3 general admission tickets ($50.00 each)
end
# Create tickets for order 1
3.times do |i|
Ticket.find_or_create_by!(order: order1, ticket_type: general_ticket_type) do |t|
t.qr_code = "ORDER1-TICKET#{i + 1}"
t.price_cents = 5000 # $50.00
t.status = "active"
t.first_name = "Attendee"
t.last_name = "#{i + 1}"
end
end
# Calculate platform fees using the actual model: €0.50 + 1.5% per ticket
# For 3 tickets at $50.00 each:
# Fixed fee: 3 tickets × $0.50 = $1.50 (150 cents)
# Percentage fee: 3 tickets × ($50.00 × 1.5%) = 3 × $0.75 = $2.25 (225 cents)
# Total platform fee: $1.50 + $2.25 = $3.75 (375 cents)
# Promoter payout: $150.00 - $3.75 = $146.25 (14625 cents)
# Create earnings for this paid order (this would normally happen automatically)
Earning.find_or_create_by!(event: completed_event, user: completed_event_promoter, order: order1) do |e|
e.amount_cents = 14625 # $146.25 (promoter payout after fees)
e.fee_cents = 375 # $3.75 platform fee
e.status = "pending"
end
# Order 2: Paid order with VIP tickets
order2 = Order.find_or_create_by!(user: buyer_user, event: completed_event) do |o|
o.status = "paid"
o.total_amount_cents = 30000 # $300.00 for 2 VIP tickets ($150.00 each)
end
# Create tickets for order 2
2.times do |i|
Ticket.find_or_create_by!(order: order2, ticket_type: vip_ticket_type) do |t|
t.qr_code = "ORDER2-TICKET#{i + 1}"
t.price_cents = 15000 # $150.00
t.status = "active"
t.first_name = "VIP"
t.last_name = "Attendee #{i + 1}"
end
end
# Calculate platform fees using the actual model: €0.50 + 1.5% per ticket
# For 2 tickets at $150.00 each:
# Fixed fee: 2 tickets × $0.50 = $1.00 (100 cents)
# Percentage fee: 2 tickets × ($150.00 × 1.5%) = 2 × $2.25 = $4.50 (450 cents)
# Total platform fee: $1.00 + $4.50 = $5.50 (550 cents)
# Promoter payout: $300.00 - $5.50 = $294.50 (29450 cents)
# Create earnings for this paid order (this would normally happen automatically)
Earning.find_or_create_by!(event: completed_event, user: completed_event_promoter, order: order2) do |e|
e.amount_cents = 29450 # $294.50 (promoter payout after fees)
e.fee_cents = 550 # $5.50 platform fee
e.status = "pending"
end
# Order 3: Refunded order to demonstrate that refunded tickets are excluded
order3 = Order.find_or_create_by!(user: buyer_user, event: completed_event) do |o|
o.status = "paid"
o.total_amount_cents = 5000 # $50.00 for 1 general admission ticket
end
# Create ticket for order 3 (will be refunded)
refunded_ticket = Ticket.find_or_create_by!(order: order3, ticket_type: general_ticket_type) do |t|
t.qr_code = "ORDER3-TICKET1"
t.price_cents = 5000 # $50.00
t.status = "refunded" # This ticket was refunded
t.first_name = "Refunded"
t.last_name = "Customer"
end
# Calculate platform fees using the actual model: €0.50 + 1.5% per ticket
# For 1 ticket at $50.00:
# Fixed fee: 1 ticket × $0.50 = $0.50 (50 cents)
# Percentage fee: 1 ticket × ($50.00 × 1.5%) = $0.75 (75 cents)
# Total platform fee: $0.50 + $0.75 = $1.25 (125 cents)
# Promoter payout: $50.00 - $1.25 = $48.75 (4875 cents)
# Create earnings for this refunded order (this would normally happen automatically)
Earning.find_or_create_by!(event: completed_event, user: completed_event_promoter, order: order3) do |e|
e.amount_cents = 4875 # $48.75 (promoter payout after fees)
e.fee_cents = 125 # $1.25 platform fee
e.status = "pending"
end
puts "Created 1 completed event with sample orders and earnings for payout demonstration"
belle_epoque_event = Event.find_or_create_by!(name: "LA BELLE ÉPOQUE PAR SISLEY ÉVENTS") do |e|
e.slug = "la-belle-epoque-par-sisley-events"
e.state = :draft
e.description = "
Sisley évents Présente :
SAM 13 SEPT
LA BELLE ÉPOQUE de 18H à 2H
sur le Rooftop LE PATIO
ÉVÈNEMENT EN PLEIN AIR
Ambiance Rétro / old school : zouk , Ragga , kompa , Dancehall , hip hop , Groove , Rnb …
Restauration disponible sur place : Accras ,Allocos , specialités asiatique , japonaise et une large carte de choix de Pizzas pour vous régaler !
TARIF D'ENTRÉE : 10€ SUR PLACE UNIQUEMENT
Réservée aux + de 30 ans
Suivez nous sur Instagram : Sisley Évents
Le patio
38 avenue Leon Gaumont , Montreuil
Parking du Décathlon disponible , rue de la république, à 100m du Patio
"
e.venue_name = "Le Patio Rooftop"
e.venue_address = "38 Av. Léon Gaumont, 93100 Montreuil"
e.latitude = 48.862336
e.longitude = 2.441218
e.start_time = 3.days.from_now
e.end_time = 3.days.from_now + 8.hours
e.featured = false
e.image = "https://data.bizouk.com/cache1/events/images/10/78/87/b801a9a43266b4cc54bdda73bf34eec8_700_800_auto_97.jpg"
e.user = promoter
e.allow_booking_during_event = true
end
belle_epoque_event.update!(start_time: 3.days.from_now, end_time: 3.days.from_now + 8.hours)
# Create ticket types for "La belle époque" event
belle_epoque_event = Event.find_by!(slug: "la-belle-epoque-par-sisley-events")
TicketType.find_or_create_by!(event: belle_epoque_event, name: "Free invitation valid before 7 p.m.") do |tt|
tt.description = "Free invitation ticket valid before 7 p.m. for La Belle Époque"
tt.price_cents = 0
tt.quantity = 50
tt.sale_start_at = Time.current
tt.sale_end_at = belle_epoque_event.start_time
tt.minimum_age = 30
tt.requires_id = true
end
TicketType.find_or_create_by!(event: belle_epoque_event, name: "ENTRY 10€ TO BE PAYED ON SITE ONLY") do |tt|
tt.description = "Entry ticket to be paid on site only (free in system)"
tt.price_cents = 0
tt.quantity = 100
tt.sale_start_at = Time.current
tt.sale_end_at = belle_epoque_event.start_time
tt.minimum_age = 30
tt.requires_id = true
end
TicketType.find_or_create_by!(event: belle_epoque_event, name: "Paid Entry 10€") do |tt|
tt.description = "Paid entry ticket for La Belle Époque at 10€"
tt.price_cents = 1000 # 10€
tt.quantity = 200
tt.sale_start_at = Time.current
tt.sale_end_at = belle_epoque_event.start_time
tt.minimum_age = 30
tt.requires_id = true
end
puts "Created 1 promoter, 1 draft event with ticket types"