skytab_sandbox_simulator 0.1.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.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -0
  3. data/bin/simulate +433 -0
  4. data/lib/skytab_sandbox_simulator/configuration.rb +205 -0
  5. data/lib/skytab_sandbox_simulator/data/bar_nightclub/categories.json +9 -0
  6. data/lib/skytab_sandbox_simulator/data/bar_nightclub/items.json +28 -0
  7. data/lib/skytab_sandbox_simulator/data/bar_nightclub/tenders.json +19 -0
  8. data/lib/skytab_sandbox_simulator/data/cafe_bakery/categories.json +9 -0
  9. data/lib/skytab_sandbox_simulator/data/cafe_bakery/items.json +30 -0
  10. data/lib/skytab_sandbox_simulator/data/cafe_bakery/tenders.json +17 -0
  11. data/lib/skytab_sandbox_simulator/data/fine_dining/categories.json +9 -0
  12. data/lib/skytab_sandbox_simulator/data/fine_dining/items.json +30 -0
  13. data/lib/skytab_sandbox_simulator/data/fine_dining/tenders.json +18 -0
  14. data/lib/skytab_sandbox_simulator/data/pizzeria/categories.json +9 -0
  15. data/lib/skytab_sandbox_simulator/data/pizzeria/items.json +28 -0
  16. data/lib/skytab_sandbox_simulator/data/pizzeria/tenders.json +18 -0
  17. data/lib/skytab_sandbox_simulator/data/restaurant/categories.json +44 -0
  18. data/lib/skytab_sandbox_simulator/data/restaurant/items.json +59 -0
  19. data/lib/skytab_sandbox_simulator/data/restaurant/tenders.json +22 -0
  20. data/lib/skytab_sandbox_simulator/database.rb +192 -0
  21. data/lib/skytab_sandbox_simulator/db/factories/business_types.rb +102 -0
  22. data/lib/skytab_sandbox_simulator/db/factories/categories.rb +243 -0
  23. data/lib/skytab_sandbox_simulator/db/factories/items.rb +976 -0
  24. data/lib/skytab_sandbox_simulator/db/factories/simulated_orders.rb +120 -0
  25. data/lib/skytab_sandbox_simulator/db/factories/simulated_payments.rb +75 -0
  26. data/lib/skytab_sandbox_simulator/db/migrate/20260316000000_enable_pgcrypto.rb +7 -0
  27. data/lib/skytab_sandbox_simulator/db/migrate/20260316000001_create_business_types.rb +18 -0
  28. data/lib/skytab_sandbox_simulator/db/migrate/20260316000002_create_categories.rb +18 -0
  29. data/lib/skytab_sandbox_simulator/db/migrate/20260316000003_create_items.rb +23 -0
  30. data/lib/skytab_sandbox_simulator/db/migrate/20260316000004_create_simulated_orders.rb +35 -0
  31. data/lib/skytab_sandbox_simulator/db/migrate/20260316000005_create_simulated_payments.rb +26 -0
  32. data/lib/skytab_sandbox_simulator/db/migrate/20260316000006_create_api_requests.rb +27 -0
  33. data/lib/skytab_sandbox_simulator/db/migrate/20260316000007_create_daily_summaries.rb +24 -0
  34. data/lib/skytab_sandbox_simulator/generators/data_loader.rb +125 -0
  35. data/lib/skytab_sandbox_simulator/generators/entity_generator.rb +107 -0
  36. data/lib/skytab_sandbox_simulator/generators/order_generator.rb +390 -0
  37. data/lib/skytab_sandbox_simulator/models/api_request.rb +43 -0
  38. data/lib/skytab_sandbox_simulator/models/business_type.rb +25 -0
  39. data/lib/skytab_sandbox_simulator/models/category.rb +17 -0
  40. data/lib/skytab_sandbox_simulator/models/daily_summary.rb +67 -0
  41. data/lib/skytab_sandbox_simulator/models/item.rb +32 -0
  42. data/lib/skytab_sandbox_simulator/models/record.rb +14 -0
  43. data/lib/skytab_sandbox_simulator/models/simulated_order.rb +40 -0
  44. data/lib/skytab_sandbox_simulator/models/simulated_payment.rb +28 -0
  45. data/lib/skytab_sandbox_simulator/seeder.rb +167 -0
  46. data/lib/skytab_sandbox_simulator/services/base_service.rb +227 -0
  47. data/lib/skytab_sandbox_simulator/services/skytab/catalog_service.rb +130 -0
  48. data/lib/skytab_sandbox_simulator/services/skytab/location_service.rb +54 -0
  49. data/lib/skytab_sandbox_simulator/services/skytab/order_service.rb +139 -0
  50. data/lib/skytab_sandbox_simulator/services/skytab/payment_service.rb +94 -0
  51. data/lib/skytab_sandbox_simulator/services/skytab/service_manager.rb +62 -0
  52. data/lib/skytab_sandbox_simulator/version.rb +5 -0
  53. data/lib/skytab_sandbox_simulator.rb +45 -0
  54. metadata +305 -0
@@ -0,0 +1,976 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Item traits across 5 business types.
4
+ # Each trait sets name, price (cents), sku, and associates with the correct
5
+ # category (which in turn associates with the correct business type).
6
+
7
+ FactoryBot.define do
8
+ factory :item, class: "SkytabSandboxSimulator::Models::Item" do
9
+ association :category
10
+ sequence(:name) { |n| "Item #{n}" }
11
+ price { 999 } # cents
12
+ active { true }
13
+ variants { [] }
14
+ metadata { {} }
15
+
16
+ # ═══════════════════════════════════════════════════════════
17
+ # RESTAURANT (8 categories, ~50 items)
18
+ # ═══════════════════════════════════════════════════════════
19
+
20
+ # ── Appetizers ─────────────────────────────────────────────
21
+
22
+ trait :buffalo_wings do
23
+ name { "Buffalo Wings" }
24
+ price { 1299 }
25
+ sku { "REST-APP-001" }
26
+ association :category, factory: [:category, :appetizers]
27
+ end
28
+
29
+ trait :mozzarella_sticks do
30
+ name { "Mozzarella Sticks" }
31
+ price { 999 }
32
+ sku { "REST-APP-002" }
33
+ association :category, factory: [:category, :appetizers]
34
+ end
35
+
36
+ trait :loaded_nachos do
37
+ name { "Loaded Nachos" }
38
+ price { 1199 }
39
+ sku { "REST-APP-003" }
40
+ association :category, factory: [:category, :appetizers]
41
+ end
42
+
43
+ trait :spinach_artichoke_dip do
44
+ name { "Spinach Artichoke Dip" }
45
+ price { 1099 }
46
+ sku { "REST-APP-004" }
47
+ association :category, factory: [:category, :appetizers]
48
+ end
49
+
50
+ trait :calamari do
51
+ name { "Calamari" }
52
+ price { 1399 }
53
+ sku { "REST-APP-005" }
54
+ association :category, factory: [:category, :appetizers]
55
+ end
56
+
57
+ trait :bruschetta do
58
+ name { "Bruschetta" }
59
+ price { 999 }
60
+ sku { "REST-APP-006" }
61
+ association :category, factory: [:category, :appetizers]
62
+ end
63
+
64
+ trait :shrimp_cocktail do
65
+ name { "Shrimp Cocktail" }
66
+ price { 1599 }
67
+ sku { "REST-APP-007" }
68
+ association :category, factory: [:category, :appetizers]
69
+ end
70
+
71
+ # ── Entrees ──────────────────────────────────────────────
72
+
73
+ trait :classic_burger do
74
+ name { "Classic Burger" }
75
+ price { 1499 }
76
+ sku { "REST-ENT-001" }
77
+ association :category, factory: [:category, :entrees]
78
+ end
79
+
80
+ trait :grilled_salmon do
81
+ name { "Grilled Salmon" }
82
+ price { 2199 }
83
+ sku { "REST-ENT-002" }
84
+ association :category, factory: [:category, :entrees]
85
+ end
86
+
87
+ trait :ny_strip_steak do
88
+ name { "NY Strip Steak" }
89
+ price { 2899 }
90
+ sku { "REST-ENT-003" }
91
+ association :category, factory: [:category, :entrees]
92
+ end
93
+
94
+ trait :chicken_parmesan do
95
+ name { "Chicken Parmesan" }
96
+ price { 1899 }
97
+ sku { "REST-ENT-004" }
98
+ association :category, factory: [:category, :entrees]
99
+ end
100
+
101
+ trait :fettuccine_alfredo do
102
+ name { "Fettuccine Alfredo" }
103
+ price { 1599 }
104
+ sku { "REST-ENT-005" }
105
+ association :category, factory: [:category, :entrees]
106
+ end
107
+
108
+ trait :fish_and_chips do
109
+ name { "Fish and Chips" }
110
+ price { 1699 }
111
+ sku { "REST-ENT-006" }
112
+ association :category, factory: [:category, :entrees]
113
+ end
114
+
115
+ trait :bbq_ribs do
116
+ name { "BBQ Ribs" }
117
+ price { 2399 }
118
+ sku { "REST-ENT-007" }
119
+ association :category, factory: [:category, :entrees]
120
+ end
121
+
122
+ trait :mushroom_risotto do
123
+ name { "Mushroom Risotto" }
124
+ price { 1799 }
125
+ sku { "REST-ENT-008" }
126
+ association :category, factory: [:category, :entrees]
127
+ end
128
+
129
+ trait :shrimp_scampi do
130
+ name { "Shrimp Scampi" }
131
+ price { 2099 }
132
+ sku { "REST-ENT-009" }
133
+ association :category, factory: [:category, :entrees]
134
+ end
135
+
136
+ # ── Sides ────────────────────────────────────────────────
137
+
138
+ trait :french_fries do
139
+ name { "French Fries" }
140
+ price { 499 }
141
+ sku { "REST-SID-001" }
142
+ association :category, factory: [:category, :sides]
143
+ end
144
+
145
+ trait :sweet_potato_fries do
146
+ name { "Sweet Potato Fries" }
147
+ price { 599 }
148
+ sku { "REST-SID-002" }
149
+ association :category, factory: [:category, :sides]
150
+ end
151
+
152
+ trait :onion_rings do
153
+ name { "Onion Rings" }
154
+ price { 549 }
155
+ sku { "REST-SID-003" }
156
+ association :category, factory: [:category, :sides]
157
+ end
158
+
159
+ trait :coleslaw do
160
+ name { "Coleslaw" }
161
+ price { 399 }
162
+ sku { "REST-SID-004" }
163
+ association :category, factory: [:category, :sides]
164
+ end
165
+
166
+ trait :mashed_potatoes do
167
+ name { "Mashed Potatoes" }
168
+ price { 499 }
169
+ sku { "REST-SID-005" }
170
+ association :category, factory: [:category, :sides]
171
+ end
172
+
173
+ trait :steamed_vegetables do
174
+ name { "Steamed Vegetables" }
175
+ price { 449 }
176
+ sku { "REST-SID-006" }
177
+ association :category, factory: [:category, :sides]
178
+ end
179
+
180
+ trait :garlic_bread do
181
+ name { "Garlic Bread" }
182
+ price { 449 }
183
+ sku { "REST-SID-007" }
184
+ association :category, factory: [:category, :sides]
185
+ end
186
+
187
+ # ── Desserts ─────────────────────────────────────────────
188
+
189
+ trait :chocolate_brownie do
190
+ name { "Chocolate Brownie" }
191
+ price { 699 }
192
+ sku { "REST-DES-001" }
193
+ association :category, factory: [:category, :desserts]
194
+ end
195
+
196
+ trait :ny_cheesecake do
197
+ name { "New York Cheesecake" }
198
+ price { 799 }
199
+ sku { "REST-DES-002" }
200
+ association :category, factory: [:category, :desserts]
201
+ end
202
+
203
+ trait :apple_pie do
204
+ name { "Apple Pie" }
205
+ price { 749 }
206
+ sku { "REST-DES-003" }
207
+ association :category, factory: [:category, :desserts]
208
+ end
209
+
210
+ trait :tiramisu do
211
+ name { "Tiramisu" }
212
+ price { 899 }
213
+ sku { "REST-DES-004" }
214
+ association :category, factory: [:category, :desserts]
215
+ end
216
+
217
+ trait :creme_brulee do
218
+ name { "Creme Brulee" }
219
+ price { 949 }
220
+ sku { "REST-DES-005" }
221
+ association :category, factory: [:category, :desserts]
222
+ end
223
+
224
+ # ── Beverages ────────────────────────────────────────────
225
+
226
+ trait :soft_drink do
227
+ name { "Soft Drink" }
228
+ price { 299 }
229
+ sku { "REST-BEV-001" }
230
+ association :category, factory: [:category, :beverages]
231
+ end
232
+
233
+ trait :iced_tea do
234
+ name { "Iced Tea" }
235
+ price { 299 }
236
+ sku { "REST-BEV-002" }
237
+ association :category, factory: [:category, :beverages]
238
+ end
239
+
240
+ trait :lemonade do
241
+ name { "Lemonade" }
242
+ price { 349 }
243
+ sku { "REST-BEV-003" }
244
+ association :category, factory: [:category, :beverages]
245
+ end
246
+
247
+ trait :coffee do
248
+ name { "Coffee" }
249
+ price { 349 }
250
+ sku { "REST-BEV-004" }
251
+ association :category, factory: [:category, :beverages]
252
+ end
253
+
254
+ trait :hot_tea do
255
+ name { "Hot Tea" }
256
+ price { 299 }
257
+ sku { "REST-BEV-005" }
258
+ association :category, factory: [:category, :beverages]
259
+ end
260
+
261
+ trait :sparkling_water do
262
+ name { "Sparkling Water" }
263
+ price { 349 }
264
+ sku { "REST-BEV-006" }
265
+ association :category, factory: [:category, :beverages]
266
+ end
267
+
268
+ trait :fresh_juice do
269
+ name { "Fresh Juice" }
270
+ price { 499 }
271
+ sku { "REST-BEV-007" }
272
+ association :category, factory: [:category, :beverages]
273
+ end
274
+
275
+ # ── Alcohol ──────────────────────────────────────────────
276
+
277
+ trait :draft_beer do
278
+ name { "Draft Beer" }
279
+ price { 599 }
280
+ sku { "REST-ALC-001" }
281
+ association :category, factory: [:category, :alcohol]
282
+ end
283
+
284
+ trait :domestic_beer do
285
+ name { "Domestic Beer" }
286
+ price { 499 }
287
+ sku { "REST-ALC-002" }
288
+ association :category, factory: [:category, :alcohol]
289
+ end
290
+
291
+ trait :import_beer do
292
+ name { "Import Beer" }
293
+ price { 649 }
294
+ sku { "REST-ALC-003" }
295
+ association :category, factory: [:category, :alcohol]
296
+ end
297
+
298
+ trait :house_wine do
299
+ name { "House Wine" }
300
+ price { 799 }
301
+ sku { "REST-ALC-004" }
302
+ association :category, factory: [:category, :alcohol]
303
+ end
304
+
305
+ trait :margarita do
306
+ name { "Margarita" }
307
+ price { 999 }
308
+ sku { "REST-ALC-005" }
309
+ association :category, factory: [:category, :alcohol]
310
+ end
311
+
312
+ trait :old_fashioned do
313
+ name { "Old Fashioned" }
314
+ price { 1299 }
315
+ sku { "REST-ALC-006" }
316
+ association :category, factory: [:category, :alcohol]
317
+ end
318
+
319
+ # ── Kids Menu ────────────────────────────────────────────
320
+
321
+ trait :chicken_tenders do
322
+ name { "Chicken Tenders" }
323
+ price { 799 }
324
+ sku { "REST-KID-001" }
325
+ association :category, factory: [:category, :kids_menu]
326
+ end
327
+
328
+ trait :kids_mac_and_cheese do
329
+ name { "Kids Mac and Cheese" }
330
+ price { 649 }
331
+ sku { "REST-KID-002" }
332
+ association :category, factory: [:category, :kids_menu]
333
+ end
334
+
335
+ trait :mini_burger do
336
+ name { "Mini Burger" }
337
+ price { 699 }
338
+ sku { "REST-KID-003" }
339
+ association :category, factory: [:category, :kids_menu]
340
+ end
341
+
342
+ trait :grilled_cheese do
343
+ name { "Grilled Cheese" }
344
+ price { 599 }
345
+ sku { "REST-KID-004" }
346
+ association :category, factory: [:category, :kids_menu]
347
+ end
348
+
349
+ trait :kids_quesadilla do
350
+ name { "Kids Quesadilla" }
351
+ price { 649 }
352
+ sku { "REST-KID-005" }
353
+ association :category, factory: [:category, :kids_menu]
354
+ end
355
+
356
+ # ── Specials ─────────────────────────────────────────────
357
+
358
+ trait :chefs_special do
359
+ name { "Chef's Special" }
360
+ price { 2499 }
361
+ sku { "REST-SPE-001" }
362
+ association :category, factory: [:category, :specials]
363
+ end
364
+
365
+ trait :soup_of_the_day do
366
+ name { "Soup of the Day" }
367
+ price { 599 }
368
+ sku { "REST-SPE-002" }
369
+ association :category, factory: [:category, :specials]
370
+ end
371
+
372
+ # ═══════════════════════════════════════════════════════════
373
+ # CAFE & BAKERY (5 categories)
374
+ # ═══════════════════════════════════════════════════════════
375
+
376
+ trait :house_drip_coffee do
377
+ name { "House Drip Coffee" }
378
+ price { 299 }
379
+ sku { "CAFE-COF-001" }
380
+ association :category, factory: [:category, :coffee_espresso]
381
+ end
382
+
383
+ trait :espresso do
384
+ name { "Espresso" }
385
+ price { 350 }
386
+ sku { "CAFE-COF-002" }
387
+ association :category, factory: [:category, :coffee_espresso]
388
+ end
389
+
390
+ trait :cappuccino do
391
+ name { "Cappuccino" }
392
+ price { 499 }
393
+ sku { "CAFE-COF-003" }
394
+ association :category, factory: [:category, :coffee_espresso]
395
+ end
396
+
397
+ trait :latte do
398
+ name { "Latte" }
399
+ price { 549 }
400
+ sku { "CAFE-COF-004" }
401
+ association :category, factory: [:category, :coffee_espresso]
402
+ end
403
+
404
+ trait :cold_brew do
405
+ name { "Cold Brew" }
406
+ price { 499 }
407
+ sku { "CAFE-COF-005" }
408
+ association :category, factory: [:category, :coffee_espresso]
409
+ end
410
+
411
+ trait :croissant do
412
+ name { "Croissant" }
413
+ price { 399 }
414
+ sku { "CAFE-PAS-001" }
415
+ association :category, factory: [:category, :pastries]
416
+ end
417
+
418
+ trait :blueberry_muffin do
419
+ name { "Blueberry Muffin" }
420
+ price { 399 }
421
+ sku { "CAFE-PAS-002" }
422
+ association :category, factory: [:category, :pastries]
423
+ end
424
+
425
+ trait :cinnamon_roll do
426
+ name { "Cinnamon Roll" }
427
+ price { 449 }
428
+ sku { "CAFE-PAS-003" }
429
+ association :category, factory: [:category, :pastries]
430
+ end
431
+
432
+ trait :chocolate_chip_cookie do
433
+ name { "Chocolate Chip Cookie" }
434
+ price { 299 }
435
+ sku { "CAFE-PAS-004" }
436
+ association :category, factory: [:category, :pastries]
437
+ end
438
+
439
+ trait :almond_croissant do
440
+ name { "Almond Croissant" }
441
+ price { 449 }
442
+ sku { "CAFE-PAS-005" }
443
+ association :category, factory: [:category, :pastries]
444
+ end
445
+
446
+ trait :avocado_toast do
447
+ name { "Avocado Toast" }
448
+ price { 1099 }
449
+ sku { "CAFE-BRK-001" }
450
+ association :category, factory: [:category, :breakfast_items]
451
+ end
452
+
453
+ trait :breakfast_burrito do
454
+ name { "Breakfast Burrito" }
455
+ price { 999 }
456
+ sku { "CAFE-BRK-002" }
457
+ association :category, factory: [:category, :breakfast_items]
458
+ end
459
+
460
+ trait :acai_bowl do
461
+ name { "Acai Bowl" }
462
+ price { 1199 }
463
+ sku { "CAFE-BRK-003" }
464
+ association :category, factory: [:category, :breakfast_items]
465
+ end
466
+
467
+ trait :yogurt_parfait do
468
+ name { "Yogurt Parfait" }
469
+ price { 699 }
470
+ sku { "CAFE-BRK-004" }
471
+ association :category, factory: [:category, :breakfast_items]
472
+ end
473
+
474
+ trait :turkey_club do
475
+ name { "Turkey Club" }
476
+ price { 1199 }
477
+ sku { "CAFE-SAN-001" }
478
+ association :category, factory: [:category, :sandwiches_wraps]
479
+ end
480
+
481
+ trait :caprese_panini do
482
+ name { "Caprese Panini" }
483
+ price { 1099 }
484
+ sku { "CAFE-SAN-002" }
485
+ association :category, factory: [:category, :sandwiches_wraps]
486
+ end
487
+
488
+ trait :chicken_caesar_wrap do
489
+ name { "Chicken Caesar Wrap" }
490
+ price { 1099 }
491
+ sku { "CAFE-SAN-003" }
492
+ association :category, factory: [:category, :sandwiches_wraps]
493
+ end
494
+
495
+ trait :blt do
496
+ name { "BLT" }
497
+ price { 999 }
498
+ sku { "CAFE-SAN-004" }
499
+ association :category, factory: [:category, :sandwiches_wraps]
500
+ end
501
+
502
+ trait :berry_blast_smoothie do
503
+ name { "Berry Blast Smoothie" }
504
+ price { 699 }
505
+ sku { "CAFE-SMO-001" }
506
+ association :category, factory: [:category, :smoothies_juice]
507
+ end
508
+
509
+ trait :green_detox_juice do
510
+ name { "Green Detox Juice" }
511
+ price { 799 }
512
+ sku { "CAFE-SMO-002" }
513
+ association :category, factory: [:category, :smoothies_juice]
514
+ end
515
+
516
+ trait :mango_tango_smoothie do
517
+ name { "Mango Tango Smoothie" }
518
+ price { 699 }
519
+ sku { "CAFE-SMO-003" }
520
+ association :category, factory: [:category, :smoothies_juice]
521
+ end
522
+
523
+ trait :fresh_oj do
524
+ name { "Fresh Orange Juice" }
525
+ price { 499 }
526
+ sku { "CAFE-SMO-004" }
527
+ association :category, factory: [:category, :smoothies_juice]
528
+ end
529
+
530
+ # ═══════════════════════════════════════════════════════════
531
+ # BAR & NIGHTCLUB (5 categories)
532
+ # ═══════════════════════════════════════════════════════════
533
+
534
+ trait :bar_house_lager do
535
+ name { "House Lager" }
536
+ price { 599 }
537
+ sku { "BAR-DRF-001" }
538
+ association :category, factory: [:category, :draft_beer]
539
+ end
540
+
541
+ trait :bar_ipa do
542
+ name { "IPA" }
543
+ price { 699 }
544
+ sku { "BAR-DRF-002" }
545
+ association :category, factory: [:category, :draft_beer]
546
+ end
547
+
548
+ trait :bar_stout do
549
+ name { "Stout" }
550
+ price { 749 }
551
+ sku { "BAR-DRF-003" }
552
+ association :category, factory: [:category, :draft_beer]
553
+ end
554
+
555
+ trait :bar_wheat_beer do
556
+ name { "Wheat Beer" }
557
+ price { 649 }
558
+ sku { "BAR-DRF-004" }
559
+ association :category, factory: [:category, :draft_beer]
560
+ end
561
+
562
+ trait :bar_margarita do
563
+ name { "Margarita" }
564
+ price { 1199 }
565
+ sku { "BAR-COC-001" }
566
+ association :category, factory: [:category, :cocktails]
567
+ end
568
+
569
+ trait :bar_old_fashioned do
570
+ name { "Old Fashioned" }
571
+ price { 1399 }
572
+ sku { "BAR-COC-002" }
573
+ association :category, factory: [:category, :cocktails]
574
+ end
575
+
576
+ trait :bar_mojito do
577
+ name { "Mojito" }
578
+ price { 1199 }
579
+ sku { "BAR-COC-003" }
580
+ association :category, factory: [:category, :cocktails]
581
+ end
582
+
583
+ trait :bar_espresso_martini do
584
+ name { "Espresso Martini" }
585
+ price { 1499 }
586
+ sku { "BAR-COC-004" }
587
+ association :category, factory: [:category, :cocktails]
588
+ end
589
+
590
+ trait :whiskey_neat do
591
+ name { "Whiskey Neat" }
592
+ price { 1099 }
593
+ sku { "BAR-SPI-001" }
594
+ association :category, factory: [:category, :spirits]
595
+ end
596
+
597
+ trait :vodka_soda do
598
+ name { "Vodka Soda" }
599
+ price { 899 }
600
+ sku { "BAR-SPI-002" }
601
+ association :category, factory: [:category, :spirits]
602
+ end
603
+
604
+ trait :tequila_shot do
605
+ name { "Tequila Shot" }
606
+ price { 799 }
607
+ sku { "BAR-SPI-003" }
608
+ association :category, factory: [:category, :spirits]
609
+ end
610
+
611
+ trait :rum_and_coke do
612
+ name { "Rum and Coke" }
613
+ price { 899 }
614
+ sku { "BAR-SPI-004" }
615
+ association :category, factory: [:category, :spirits]
616
+ end
617
+
618
+ trait :bar_house_red do
619
+ name { "House Red" }
620
+ price { 899 }
621
+ sku { "BAR-WIN-001" }
622
+ association :category, factory: [:category, :wine_list]
623
+ end
624
+
625
+ trait :bar_house_white do
626
+ name { "House White" }
627
+ price { 899 }
628
+ sku { "BAR-WIN-002" }
629
+ association :category, factory: [:category, :wine_list]
630
+ end
631
+
632
+ trait :bar_prosecco do
633
+ name { "Prosecco" }
634
+ price { 999 }
635
+ sku { "BAR-WIN-003" }
636
+ association :category, factory: [:category, :wine_list]
637
+ end
638
+
639
+ trait :bar_rose do
640
+ name { "Rose" }
641
+ price { 999 }
642
+ sku { "BAR-WIN-004" }
643
+ association :category, factory: [:category, :wine_list]
644
+ end
645
+
646
+ trait :bar_loaded_fries do
647
+ name { "Loaded Fries" }
648
+ price { 899 }
649
+ sku { "BAR-SNK-001" }
650
+ association :category, factory: [:category, :bar_snacks]
651
+ end
652
+
653
+ trait :bar_sliders do
654
+ name { "Sliders" }
655
+ price { 1199 }
656
+ sku { "BAR-SNK-002" }
657
+ association :category, factory: [:category, :bar_snacks]
658
+ end
659
+
660
+ trait :bar_wings do
661
+ name { "Wings" }
662
+ price { 1099 }
663
+ sku { "BAR-SNK-003" }
664
+ association :category, factory: [:category, :bar_snacks]
665
+ end
666
+
667
+ trait :bar_pretzel_bites do
668
+ name { "Pretzel Bites" }
669
+ price { 799 }
670
+ sku { "BAR-SNK-004" }
671
+ association :category, factory: [:category, :bar_snacks]
672
+ end
673
+
674
+ # ═══════════════════════════════════════════════════════════
675
+ # PIZZERIA (5 categories)
676
+ # ═══════════════════════════════════════════════════════════
677
+
678
+ trait :margherita do
679
+ name { "Margherita" }
680
+ price { 1499 }
681
+ sku { "PIZ-PIZ-001" }
682
+ association :category, factory: [:category, :pizzas]
683
+ end
684
+
685
+ trait :pepperoni do
686
+ name { "Pepperoni" }
687
+ price { 1599 }
688
+ sku { "PIZ-PIZ-002" }
689
+ association :category, factory: [:category, :pizzas]
690
+ end
691
+
692
+ trait :supreme do
693
+ name { "Supreme" }
694
+ price { 1899 }
695
+ sku { "PIZ-PIZ-003" }
696
+ association :category, factory: [:category, :pizzas]
697
+ end
698
+
699
+ trait :hawaiian do
700
+ name { "Hawaiian" }
701
+ price { 1599 }
702
+ sku { "PIZ-PIZ-004" }
703
+ association :category, factory: [:category, :pizzas]
704
+ end
705
+
706
+ trait :bbq_chicken_pizza do
707
+ name { "BBQ Chicken Pizza" }
708
+ price { 1799 }
709
+ sku { "PIZ-PIZ-005" }
710
+ association :category, factory: [:category, :pizzas]
711
+ end
712
+
713
+ trait :meat_lovers do
714
+ name { "Meat Lovers" }
715
+ price { 1899 }
716
+ sku { "PIZ-PIZ-006" }
717
+ association :category, factory: [:category, :pizzas]
718
+ end
719
+
720
+ trait :classic_calzone do
721
+ name { "Classic Calzone" }
722
+ price { 1299 }
723
+ sku { "PIZ-CAL-001" }
724
+ association :category, factory: [:category, :calzones]
725
+ end
726
+
727
+ trait :meat_calzone do
728
+ name { "Meat Calzone" }
729
+ price { 1499 }
730
+ sku { "PIZ-CAL-002" }
731
+ association :category, factory: [:category, :calzones]
732
+ end
733
+
734
+ trait :stromboli do
735
+ name { "Stromboli" }
736
+ price { 1399 }
737
+ sku { "PIZ-CAL-003" }
738
+ association :category, factory: [:category, :calzones]
739
+ end
740
+
741
+ trait :spinach_calzone do
742
+ name { "Spinach Calzone" }
743
+ price { 1299 }
744
+ sku { "PIZ-CAL-004" }
745
+ association :category, factory: [:category, :calzones]
746
+ end
747
+
748
+ trait :pizza_garlic_bread do
749
+ name { "Garlic Bread" }
750
+ price { 499 }
751
+ sku { "PIZ-SID-001" }
752
+ association :category, factory: [:category, :pizza_sides]
753
+ end
754
+
755
+ trait :pizza_garden_salad do
756
+ name { "Garden Salad" }
757
+ price { 699 }
758
+ sku { "PIZ-SID-002" }
759
+ association :category, factory: [:category, :pizza_sides]
760
+ end
761
+
762
+ trait :pizza_caesar_salad do
763
+ name { "Caesar Salad" }
764
+ price { 799 }
765
+ sku { "PIZ-SID-003" }
766
+ association :category, factory: [:category, :pizza_sides]
767
+ end
768
+
769
+ trait :garlic_knots do
770
+ name { "Garlic Knots" }
771
+ price { 499 }
772
+ sku { "PIZ-SID-004" }
773
+ association :category, factory: [:category, :pizza_sides]
774
+ end
775
+
776
+ trait :pizza_fountain_drink do
777
+ name { "Fountain Drink" }
778
+ price { 299 }
779
+ sku { "PIZ-DRK-001" }
780
+ association :category, factory: [:category, :pizza_drinks]
781
+ end
782
+
783
+ trait :pizza_iced_tea do
784
+ name { "Iced Tea" }
785
+ price { 299 }
786
+ sku { "PIZ-DRK-002" }
787
+ association :category, factory: [:category, :pizza_drinks]
788
+ end
789
+
790
+ trait :pizza_lemonade do
791
+ name { "Lemonade" }
792
+ price { 349 }
793
+ sku { "PIZ-DRK-003" }
794
+ association :category, factory: [:category, :pizza_drinks]
795
+ end
796
+
797
+ trait :cannoli do
798
+ name { "Cannoli" }
799
+ price { 599 }
800
+ sku { "PIZ-DES-001" }
801
+ association :category, factory: [:category, :pizza_desserts]
802
+ end
803
+
804
+ trait :pizza_brownie do
805
+ name { "Chocolate Brownie" }
806
+ price { 499 }
807
+ sku { "PIZ-DES-002" }
808
+ association :category, factory: [:category, :pizza_desserts]
809
+ end
810
+
811
+ trait :pizza_cheesecake do
812
+ name { "Cheesecake" }
813
+ price { 699 }
814
+ sku { "PIZ-DES-003" }
815
+ association :category, factory: [:category, :pizza_desserts]
816
+ end
817
+
818
+ # ═══════════════════════════════════════════════════════════
819
+ # FINE DINING (5 categories)
820
+ # ═══════════════════════════════════════════════════════════
821
+
822
+ trait :seared_foie_gras do
823
+ name { "Seared Foie Gras" }
824
+ price { 3200 }
825
+ sku { "FIN-FST-001" }
826
+ association :category, factory: [:category, :first_course]
827
+ end
828
+
829
+ trait :lobster_bisque do
830
+ name { "Lobster Bisque" }
831
+ price { 1800 }
832
+ sku { "FIN-FST-002" }
833
+ association :category, factory: [:category, :first_course]
834
+ end
835
+
836
+ trait :tuna_tartare do
837
+ name { "Tuna Tartare" }
838
+ price { 2400 }
839
+ sku { "FIN-FST-003" }
840
+ association :category, factory: [:category, :first_course]
841
+ end
842
+
843
+ trait :burrata_salad do
844
+ name { "Burrata Salad" }
845
+ price { 1900 }
846
+ sku { "FIN-FST-004" }
847
+ association :category, factory: [:category, :first_course]
848
+ end
849
+
850
+ trait :oysters_half_dozen do
851
+ name { "Oysters Half Dozen" }
852
+ price { 2800 }
853
+ sku { "FIN-FST-005" }
854
+ association :category, factory: [:category, :first_course]
855
+ end
856
+
857
+ trait :wagyu_ribeye do
858
+ name { "Wagyu Ribeye" }
859
+ price { 8500 }
860
+ sku { "FIN-MAN-001" }
861
+ association :category, factory: [:category, :main_course]
862
+ end
863
+
864
+ trait :chilean_sea_bass do
865
+ name { "Chilean Sea Bass" }
866
+ price { 4200 }
867
+ sku { "FIN-MAN-002" }
868
+ association :category, factory: [:category, :main_course]
869
+ end
870
+
871
+ trait :rack_of_lamb do
872
+ name { "Rack of Lamb" }
873
+ price { 5200 }
874
+ sku { "FIN-MAN-003" }
875
+ association :category, factory: [:category, :main_course]
876
+ end
877
+
878
+ trait :duck_breast do
879
+ name { "Duck Breast" }
880
+ price { 3800 }
881
+ sku { "FIN-MAN-004" }
882
+ association :category, factory: [:category, :main_course]
883
+ end
884
+
885
+ trait :truffle_risotto do
886
+ name { "Truffle Risotto" }
887
+ price { 3200 }
888
+ sku { "FIN-MAN-005" }
889
+ association :category, factory: [:category, :main_course]
890
+ end
891
+
892
+ trait :fine_creme_brulee do
893
+ name { "Creme Brulee" }
894
+ price { 1600 }
895
+ sku { "FIN-DES-001" }
896
+ association :category, factory: [:category, :fine_desserts]
897
+ end
898
+
899
+ trait :chocolate_souffle do
900
+ name { "Chocolate Souffle" }
901
+ price { 1800 }
902
+ sku { "FIN-DES-002" }
903
+ association :category, factory: [:category, :fine_desserts]
904
+ end
905
+
906
+ trait :tasting_plate do
907
+ name { "Dessert Tasting Plate" }
908
+ price { 2200 }
909
+ sku { "FIN-DES-003" }
910
+ association :category, factory: [:category, :fine_desserts]
911
+ end
912
+
913
+ trait :cheese_board do
914
+ name { "Artisan Cheese Board" }
915
+ price { 2600 }
916
+ sku { "FIN-DES-004" }
917
+ association :category, factory: [:category, :fine_desserts]
918
+ end
919
+
920
+ trait :fine_tiramisu do
921
+ name { "Tiramisu" }
922
+ price { 1500 }
923
+ sku { "FIN-DES-005" }
924
+ association :category, factory: [:category, :fine_desserts]
925
+ end
926
+
927
+ trait :fine_champagne do
928
+ name { "Champagne" }
929
+ price { 2200 }
930
+ sku { "FIN-WIN-001" }
931
+ association :category, factory: [:category, :fine_wines]
932
+ end
933
+
934
+ trait :fine_cabernet do
935
+ name { "Cabernet Sauvignon" }
936
+ price { 1800 }
937
+ sku { "FIN-WIN-002" }
938
+ association :category, factory: [:category, :fine_wines]
939
+ end
940
+
941
+ trait :fine_pinot_noir do
942
+ name { "Pinot Noir" }
943
+ price { 1600 }
944
+ sku { "FIN-WIN-003" }
945
+ association :category, factory: [:category, :fine_wines]
946
+ end
947
+
948
+ trait :fine_chardonnay do
949
+ name { "Chardonnay" }
950
+ price { 1500 }
951
+ sku { "FIN-WIN-004" }
952
+ association :category, factory: [:category, :fine_wines]
953
+ end
954
+
955
+ trait :fine_negroni do
956
+ name { "Negroni" }
957
+ price { 1800 }
958
+ sku { "FIN-COC-001" }
959
+ association :category, factory: [:category, :fine_cocktails]
960
+ end
961
+
962
+ trait :fine_manhattan do
963
+ name { "Manhattan" }
964
+ price { 1900 }
965
+ sku { "FIN-COC-002" }
966
+ association :category, factory: [:category, :fine_cocktails]
967
+ end
968
+
969
+ trait :fine_french_75 do
970
+ name { "French 75" }
971
+ price { 1700 }
972
+ sku { "FIN-COC-003" }
973
+ association :category, factory: [:category, :fine_cocktails]
974
+ end
975
+ end
976
+ end