@cimplify/sdk 0.45.2 → 0.45.4
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/dist/advanced.d.mts +3 -2
- package/dist/advanced.d.ts +3 -2
- package/dist/{chunk-JNXCY43J.js → chunk-3OPVWRIP.js} +2 -2
- package/dist/{chunk-F4CGIOIJ.js → chunk-CJN5SPXN.js} +598 -158
- package/dist/{chunk-EMEUSFSR.mjs → chunk-DZGOF7CA.mjs} +598 -158
- package/dist/{chunk-YVIIBCJR.mjs → chunk-GDGDDGAE.mjs} +1 -1
- package/dist/{client-DjzIoewX.d.ts → client-B0RPhAvp.d.ts} +2 -2
- package/dist/{client-EM8xKCPO.d.mts → client-BUtbmHv-.d.mts} +2 -2
- package/dist/{client-C5LcbNxL.d.mts → client-CDUY-6nC.d.mts} +2 -1
- package/dist/{client-Bsd4Vi_y.d.ts → client-aZInadOY.d.ts} +2 -1
- package/dist/{index-yMe4VZqR.d.mts → index-3C9J8Wb-.d.mts} +3 -2
- package/dist/{index-PbBuEWp7.d.ts → index-DC_ZcSgO.d.ts} +3 -2
- package/dist/index.d.mts +6 -5
- package/dist/index.d.ts +6 -5
- package/dist/mock/cli.mjs +598 -158
- package/dist/mock/library.d.mts +2 -2
- package/dist/mock/library.d.ts +2 -2
- package/dist/mock/library.js +598 -158
- package/dist/mock/library.mjs +598 -158
- package/dist/mock/msw.d.mts +1 -1
- package/dist/mock/msw.d.ts +1 -1
- package/dist/mock/msw.js +598 -158
- package/dist/mock/msw.mjs +598 -158
- package/dist/payment-Bse2XJ-c.d.mts +113 -0
- package/dist/payment-JcNqOf_T.d.ts +113 -0
- package/dist/{price-DMijJ6_3.d.mts → price-YBGk5seG.d.mts} +1 -1
- package/dist/{price-DmQTOnjj.d.ts → price-mHkRncgW.d.ts} +1 -1
- package/dist/{payment-4JSLNTVM.d.ts → product-DiX-HGkT.d.mts} +1 -111
- package/dist/{payment-4JSLNTVM.d.mts → product-DiX-HGkT.d.ts} +1 -111
- package/dist/react.d.mts +4 -3
- package/dist/react.d.ts +4 -3
- package/dist/{server-UARbamIZ.d.ts → server-BY-DDUM0.d.mts} +10 -1
- package/dist/{server-Bs295U0t.d.ts → server-CiUhgjZA.d.mts} +43 -1
- package/dist/{server-Bs295U0t.d.mts → server-CiUhgjZA.d.ts} +43 -1
- package/dist/{server-UARbamIZ.d.mts → server-DkrQ4Idn.d.ts} +10 -1
- package/dist/server.d.mts +4 -3
- package/dist/server.d.ts +4 -3
- package/dist/testing/msw.d.mts +2 -1
- package/dist/testing/msw.d.ts +2 -1
- package/dist/testing/msw.js +2 -2
- package/dist/testing/msw.mjs +1 -1
- package/dist/testing/suite.d.mts +6 -5
- package/dist/testing/suite.d.ts +6 -5
- package/dist/testing/suite.js +21 -21
- package/dist/testing/suite.mjs +2 -2
- package/dist/testing.d.mts +5 -4
- package/dist/testing.d.ts +5 -4
- package/dist/testing.js +77 -77
- package/dist/testing.mjs +3 -3
- package/dist/utils.d.mts +4 -3
- package/dist/utils.d.ts +4 -3
- package/package.json +1 -1
|
@@ -3784,6 +3784,10 @@ function toApiProduct(p, ctx) {
|
|
|
3784
3784
|
duration_unit: p.duration_unit,
|
|
3785
3785
|
duration_minutes: p.duration_minutes,
|
|
3786
3786
|
billing_plans: p.billing_plans,
|
|
3787
|
+
/** Per-product customer inputs (prescription upload, consent
|
|
3788
|
+
* signature, etc.). The Rust backend emits this on ProductView; the
|
|
3789
|
+
* SDK's React components branch on its presence to render inputs. */
|
|
3790
|
+
input_fields: p.input_fields ?? [],
|
|
3787
3791
|
created_at: p.created_at,
|
|
3788
3792
|
updated_at: p.updated_at,
|
|
3789
3793
|
metadata: {
|
|
@@ -5675,8 +5679,8 @@ function createLinkService({ clock, ids }) {
|
|
|
5675
5679
|
|
|
5676
5680
|
// src/mock/seeds/image.ts
|
|
5677
5681
|
var CDN_BASE_URL = "https://static-tmp.cimplify.io";
|
|
5678
|
-
function seedImage(industry,
|
|
5679
|
-
return `${CDN_BASE_URL}/seed/${industry}/${
|
|
5682
|
+
function seedImage(industry, slug) {
|
|
5683
|
+
return `${CDN_BASE_URL}/seed/${industry}/${slug}.jpg`;
|
|
5680
5684
|
}
|
|
5681
5685
|
|
|
5682
5686
|
// src/mock/seeds/default.ts
|
|
@@ -5739,7 +5743,7 @@ function seedDefault(registry) {
|
|
|
5739
5743
|
default_address: "12 Independence Ave, Accra",
|
|
5740
5744
|
default_offers_table_service: true,
|
|
5741
5745
|
default_accepts_online_orders: true,
|
|
5742
|
-
image: img("
|
|
5746
|
+
image: img("business-hero"),
|
|
5743
5747
|
status: "active",
|
|
5744
5748
|
created_at: ISO,
|
|
5745
5749
|
updated_at: ISO,
|
|
@@ -5794,8 +5798,8 @@ function seedDefault(registry) {
|
|
|
5794
5798
|
price: "25.00",
|
|
5795
5799
|
description: "24-hour fermented country loaf with our heritage starter \u2014 open crumb, blistered crust, naturally tangy. Baked fresh every morning.",
|
|
5796
5800
|
category: "breads",
|
|
5797
|
-
imageUrl: img("
|
|
5798
|
-
images: [img("
|
|
5801
|
+
imageUrl: img("sourdough-loaf"),
|
|
5802
|
+
images: [img("sourdough-loaf"), img("whole-wheat")],
|
|
5799
5803
|
tags: ["bread", "vegan", "signature"],
|
|
5800
5804
|
isSignature: true,
|
|
5801
5805
|
ingredients: ["Wheat flour", "Sourdough starter", "Sea salt", "Filtered water"],
|
|
@@ -5810,7 +5814,7 @@ function seedDefault(registry) {
|
|
|
5810
5814
|
price: "20.00",
|
|
5811
5815
|
description: "Hearty 100% whole wheat with sunflower, sesame, and pumpkin seeds. Slow-fermented for a soft crumb and nutty depth.",
|
|
5812
5816
|
category: "breads",
|
|
5813
|
-
imageUrl: img("
|
|
5817
|
+
imageUrl: img("whole-wheat"),
|
|
5814
5818
|
tags: ["bread", "vegan", "high-fibre"],
|
|
5815
5819
|
ingredients: ["Whole wheat flour", "Sunflower seeds", "Sesame", "Pumpkin seeds"],
|
|
5816
5820
|
allergies: ["wheat", "gluten", "sesame"],
|
|
@@ -5823,7 +5827,7 @@ function seedDefault(registry) {
|
|
|
5823
5827
|
price: "15.00",
|
|
5824
5828
|
description: "Crackling crust, airy crumb. Best eaten warm, within an hour of baking.",
|
|
5825
5829
|
category: "breads",
|
|
5826
|
-
imageUrl: img("
|
|
5830
|
+
imageUrl: img("baguette"),
|
|
5827
5831
|
tags: ["bread", "vegan"],
|
|
5828
5832
|
ingredients: ["Wheat flour", "Yeast", "Sea salt", "Water"],
|
|
5829
5833
|
allergies: ["wheat", "gluten"],
|
|
@@ -5836,7 +5840,7 @@ function seedDefault(registry) {
|
|
|
5836
5840
|
price: "30.00",
|
|
5837
5841
|
description: "High-hydration focaccia drenched in olive oil, scattered with sea salt and fresh rosemary. Sold whole or by the slab.",
|
|
5838
5842
|
category: "breads",
|
|
5839
|
-
imageUrl: img("
|
|
5843
|
+
imageUrl: img("focaccia"),
|
|
5840
5844
|
tags: ["bread", "vegetarian"],
|
|
5841
5845
|
ingredients: ["00 flour", "Olive oil", "Rosemary", "Maldon salt"],
|
|
5842
5846
|
pairings: ["Burrata", "Prosciutto", "Caponata"],
|
|
@@ -5850,7 +5854,7 @@ function seedDefault(registry) {
|
|
|
5850
5854
|
price: "18.00",
|
|
5851
5855
|
description: "Caramelised brown butter, three over-ripe bananas, walnuts, finished with a salted maple glaze.",
|
|
5852
5856
|
category: "breads",
|
|
5853
|
-
imageUrl: img("
|
|
5857
|
+
imageUrl: img("banana-bread"),
|
|
5854
5858
|
tags: ["sweet", "comfort"],
|
|
5855
5859
|
ingredients: ["Bananas", "Brown butter", "Walnuts", "Maple syrup"],
|
|
5856
5860
|
allergies: ["wheat", "gluten", "dairy", "nuts", "eggs"],
|
|
@@ -5865,8 +5869,8 @@ function seedDefault(registry) {
|
|
|
5865
5869
|
price: "12.00",
|
|
5866
5870
|
description: "27 layers of laminated dough wrapped around French butter. Crisp, shattering crust and a tender honeycomb interior.",
|
|
5867
5871
|
category: "pastries",
|
|
5868
|
-
imageUrl: img("
|
|
5869
|
-
images: [img("
|
|
5872
|
+
imageUrl: img("croissant"),
|
|
5873
|
+
images: [img("croissant"), img("pain-au-chocolat")],
|
|
5870
5874
|
tags: ["pastry", "vegetarian", "signature"],
|
|
5871
5875
|
isSignature: true,
|
|
5872
5876
|
ingredients: ["French butter", "Wheat flour", "Milk", "Eggs"],
|
|
@@ -5880,7 +5884,7 @@ function seedDefault(registry) {
|
|
|
5880
5884
|
price: "14.00",
|
|
5881
5885
|
description: "Our croissant dough wrapped around two batons of 70% Valrhona dark chocolate.",
|
|
5882
5886
|
category: "pastries",
|
|
5883
|
-
imageUrl: img("
|
|
5887
|
+
imageUrl: img("pain-au-chocolat"),
|
|
5884
5888
|
tags: ["pastry", "chocolate"],
|
|
5885
5889
|
ingredients: ["Croissant dough", "Valrhona chocolate"],
|
|
5886
5890
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -5893,7 +5897,7 @@ function seedDefault(registry) {
|
|
|
5893
5897
|
price: "16.00",
|
|
5894
5898
|
description: "Flaky pastry filled with almond cream, dusted with toasted slivers and powdered sugar.",
|
|
5895
5899
|
category: "pastries",
|
|
5896
|
-
imageUrl: img("
|
|
5900
|
+
imageUrl: img("almond-danish"),
|
|
5897
5901
|
tags: ["pastry", "nuts"],
|
|
5898
5902
|
ingredients: ["Pastry dough", "Almond cream", "Toasted almonds"],
|
|
5899
5903
|
allergies: ["wheat", "gluten", "dairy", "eggs", "nuts"],
|
|
@@ -5906,7 +5910,7 @@ function seedDefault(registry) {
|
|
|
5906
5910
|
price: "13.00",
|
|
5907
5911
|
description: "Soft enriched dough swirled with butter and Ceylon cinnamon, finished with cream-cheese glaze.",
|
|
5908
5912
|
category: "pastries",
|
|
5909
|
-
imageUrl: img("
|
|
5913
|
+
imageUrl: img("cinnamon-roll"),
|
|
5910
5914
|
tags: ["pastry", "comfort"],
|
|
5911
5915
|
ingredients: ["Enriched dough", "Cinnamon", "Brown sugar", "Cream cheese"],
|
|
5912
5916
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -5919,7 +5923,7 @@ function seedDefault(registry) {
|
|
|
5919
5923
|
price: "12.00",
|
|
5920
5924
|
description: "Dark, dense, fudgy brownie with a glossy shell. Chocolate four ways. Best slightly warm.",
|
|
5921
5925
|
category: "pastries",
|
|
5922
|
-
imageUrl: img("
|
|
5926
|
+
imageUrl: img("brownie"),
|
|
5923
5927
|
tags: ["chocolate", "vegetarian"],
|
|
5924
5928
|
ingredients: ["Dark chocolate", "Cocoa", "Brown butter", "Eggs"],
|
|
5925
5929
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -5932,7 +5936,7 @@ function seedDefault(registry) {
|
|
|
5932
5936
|
price: "60.00",
|
|
5933
5937
|
description: "Six French macarons \u2014 pistachio, raspberry, salted caramel, espresso, vanilla bean, and dark chocolate ganache.",
|
|
5934
5938
|
category: "pastries",
|
|
5935
|
-
imageUrl: img("
|
|
5939
|
+
imageUrl: img("macaron-box"),
|
|
5936
5940
|
tags: ["pastry", "gift", "premium"],
|
|
5937
5941
|
ingredients: ["Almond flour", "Egg whites", "Sugar", "Various fillings"],
|
|
5938
5942
|
allergies: ["nuts", "eggs", "dairy"],
|
|
@@ -5946,7 +5950,7 @@ function seedDefault(registry) {
|
|
|
5946
5950
|
price: "22.00",
|
|
5947
5951
|
description: "Three layers of dark chocolate sponge with chocolate ganache and cr\xE8me p\xE2tissi\xE8re, finished with a mirror glaze. (Slice)",
|
|
5948
5952
|
category: "cakes",
|
|
5949
|
-
imageUrl: img("
|
|
5953
|
+
imageUrl: img("chocolate-cake"),
|
|
5950
5954
|
tags: ["cake", "chocolate", "signature"],
|
|
5951
5955
|
isSignature: true,
|
|
5952
5956
|
ingredients: ["Dark chocolate", "Cr\xE8me p\xE2tissi\xE8re", "Cocoa", "Eggs"],
|
|
@@ -5961,7 +5965,7 @@ function seedDefault(registry) {
|
|
|
5961
5965
|
price: "22.00",
|
|
5962
5966
|
description: "Classic red velvet with cream cheese frosting and white chocolate shavings.",
|
|
5963
5967
|
category: "cakes",
|
|
5964
|
-
imageUrl: img("
|
|
5968
|
+
imageUrl: img("red-velvet"),
|
|
5965
5969
|
tags: ["cake"],
|
|
5966
5970
|
ingredients: ["Buttermilk", "Cocoa", "Cream cheese", "Beetroot"],
|
|
5967
5971
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -5974,7 +5978,7 @@ function seedDefault(registry) {
|
|
|
5974
5978
|
price: "20.00",
|
|
5975
5979
|
description: "Spiced carrot cake with toasted walnuts, golden raisins, and cream-cheese frosting.",
|
|
5976
5980
|
category: "cakes",
|
|
5977
|
-
imageUrl: img("
|
|
5981
|
+
imageUrl: img("carrot-cake"),
|
|
5978
5982
|
tags: ["cake", "spiced"],
|
|
5979
5983
|
ingredients: ["Carrot", "Walnuts", "Cinnamon", "Cream cheese"],
|
|
5980
5984
|
allergies: ["wheat", "gluten", "dairy", "eggs", "nuts"],
|
|
@@ -5987,7 +5991,7 @@ function seedDefault(registry) {
|
|
|
5987
5991
|
price: "24.00",
|
|
5988
5992
|
description: "Dense, creamy New York cheesecake on a butter graham crust. Topped with seasonal berry compote.",
|
|
5989
5993
|
category: "cakes",
|
|
5990
|
-
imageUrl: img("
|
|
5994
|
+
imageUrl: img("cheesecake"),
|
|
5991
5995
|
tags: ["cake", "premium"],
|
|
5992
5996
|
ingredients: ["Cream cheese", "Sour cream", "Graham crust", "Vanilla"],
|
|
5993
5997
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -6000,8 +6004,8 @@ function seedDefault(registry) {
|
|
|
6000
6004
|
price: "250.00",
|
|
6001
6005
|
description: "Made-to-order three-tier cake. Choose size, flavour, and frosting. 48-hour notice required for personalisation.",
|
|
6002
6006
|
category: "cakes",
|
|
6003
|
-
imageUrl: img("
|
|
6004
|
-
images: [img("
|
|
6007
|
+
imageUrl: img("birthday-cake"),
|
|
6008
|
+
images: [img("birthday-cake"), img("chocolate-cake")],
|
|
6005
6009
|
tags: ["cake", "made-to-order", "premium"],
|
|
6006
6010
|
ingredients: ["Sponge cake", "Buttercream", "Custom decoration"],
|
|
6007
6011
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -6015,7 +6019,7 @@ function seedDefault(registry) {
|
|
|
6015
6019
|
price: "10.00",
|
|
6016
6020
|
description: "Locally roasted Arabica from Volta Region. Notes of cocoa, dark fruit, and brown sugar.",
|
|
6017
6021
|
category: "drinks",
|
|
6018
|
-
imageUrl: img("
|
|
6022
|
+
imageUrl: img("coffee"),
|
|
6019
6023
|
tags: ["drink", "coffee", "vegan"],
|
|
6020
6024
|
ingredients: ["Single-origin Arabica beans"],
|
|
6021
6025
|
pairings: ["Croissant", "Brownie"],
|
|
@@ -6028,7 +6032,7 @@ function seedDefault(registry) {
|
|
|
6028
6032
|
price: "8.00",
|
|
6029
6033
|
description: "Choice of English breakfast, Earl Grey, green sencha, or chamomile.",
|
|
6030
6034
|
category: "drinks",
|
|
6031
|
-
imageUrl: img("
|
|
6035
|
+
imageUrl: img("tea"),
|
|
6032
6036
|
tags: ["drink", "tea", "vegan"],
|
|
6033
6037
|
calories: 0
|
|
6034
6038
|
},
|
|
@@ -6039,7 +6043,7 @@ function seedDefault(registry) {
|
|
|
6039
6043
|
price: "12.00",
|
|
6040
6044
|
description: "Iced hibiscus tea with ginger, pineapple peel, and a hint of clove. Tart, refreshing, lightly sweet.",
|
|
6041
6045
|
category: "drinks",
|
|
6042
|
-
imageUrl: img("
|
|
6046
|
+
imageUrl: img("sobolo"),
|
|
6043
6047
|
tags: ["drink", "vegan", "ghana"],
|
|
6044
6048
|
isSignature: true,
|
|
6045
6049
|
ingredients: ["Hibiscus", "Ginger", "Pineapple", "Clove"],
|
|
@@ -6052,7 +6056,7 @@ function seedDefault(registry) {
|
|
|
6052
6056
|
price: "15.00",
|
|
6053
6057
|
description: "Hand-pressed at sunrise from Ghanaian Valencia oranges. No sugar, no concentrate.",
|
|
6054
6058
|
category: "drinks",
|
|
6055
|
-
imageUrl: img("
|
|
6059
|
+
imageUrl: img("orange-juice"),
|
|
6056
6060
|
tags: ["drink", "vegan"],
|
|
6057
6061
|
calories: 110
|
|
6058
6062
|
},
|
|
@@ -6064,8 +6068,8 @@ function seedDefault(registry) {
|
|
|
6064
6068
|
price: "30.00",
|
|
6065
6069
|
description: "A buttery croissant, a single-origin coffee, and a fresh-pressed orange juice. Everything you need to start the day. Save GH\u20B57 vs buying separately.",
|
|
6066
6070
|
category: "boxes",
|
|
6067
|
-
imageUrl: img("
|
|
6068
|
-
images: [img("
|
|
6071
|
+
imageUrl: img("breakfast-box"),
|
|
6072
|
+
images: [img("breakfast-box"), img("coffee")],
|
|
6069
6073
|
tags: ["bundle", "breakfast"],
|
|
6070
6074
|
productType: "bundle"
|
|
6071
6075
|
},
|
|
@@ -6076,7 +6080,7 @@ function seedDefault(registry) {
|
|
|
6076
6080
|
price: "60.00",
|
|
6077
6081
|
description: "Pick 6 to 12 of our pastries \u2014 mix and match. Freshly boxed for sharing.",
|
|
6078
6082
|
category: "boxes",
|
|
6079
|
-
imageUrl: img("
|
|
6083
|
+
imageUrl: img("pastry-box"),
|
|
6080
6084
|
tags: ["composite", "build-your-own", "gift"],
|
|
6081
6085
|
productType: "composite"
|
|
6082
6086
|
},
|
|
@@ -6088,7 +6092,7 @@ function seedDefault(registry) {
|
|
|
6088
6092
|
price: "85.00",
|
|
6089
6093
|
description: "Heavy-weight cotton-canvas apron with leather neck strap, embroidered logo, and two front pockets. Made in Accra.",
|
|
6090
6094
|
category: "merch",
|
|
6091
|
-
imageUrl: img("
|
|
6095
|
+
imageUrl: img("apron"),
|
|
6092
6096
|
tags: ["merch", "physical"],
|
|
6093
6097
|
renderHint: "physical"
|
|
6094
6098
|
},
|
|
@@ -6099,7 +6103,7 @@ function seedDefault(registry) {
|
|
|
6099
6103
|
price: "35.00",
|
|
6100
6104
|
description: "12oz natural canvas tote, screen-printed with our wheat-stalk crest. Roomy enough for two loaves.",
|
|
6101
6105
|
category: "merch",
|
|
6102
|
-
imageUrl: img("
|
|
6106
|
+
imageUrl: img("tote-bag"),
|
|
6103
6107
|
tags: ["merch", "physical", "gift"],
|
|
6104
6108
|
renderHint: "physical",
|
|
6105
6109
|
isNew: true
|
|
@@ -6112,7 +6116,7 @@ function seedDefault(registry) {
|
|
|
6112
6116
|
price: "320.00",
|
|
6113
6117
|
description: "Stone-milled heritage wheat flour, the same we use in our country sourdough. Tiered pricing for caf\xE9s, restaurants, and home-baking co-ops.",
|
|
6114
6118
|
category: "merch",
|
|
6115
|
-
imageUrl: img("
|
|
6119
|
+
imageUrl: img("flour-25kg"),
|
|
6116
6120
|
tags: ["wholesale", "physical", "trade"],
|
|
6117
6121
|
renderHint: "physical",
|
|
6118
6122
|
quantityPricing: [
|
|
@@ -6130,7 +6134,7 @@ function seedDefault(registry) {
|
|
|
6130
6134
|
price: "45.00",
|
|
6131
6135
|
description: "PDF + EPUB walkthrough of our sourdough programme \u2014 starter, levain, autolyse, bulk fermentation, shaping, scoring. Lifetime updates.",
|
|
6132
6136
|
category: "merch",
|
|
6133
|
-
imageUrl: img("
|
|
6137
|
+
imageUrl: img("sourdough-ebook"),
|
|
6134
6138
|
tags: ["digital", "download"],
|
|
6135
6139
|
productType: "digital",
|
|
6136
6140
|
digitalProductType: "download"
|
|
@@ -6142,7 +6146,7 @@ function seedDefault(registry) {
|
|
|
6142
6146
|
price: "100.00",
|
|
6143
6147
|
description: "Send instantly. Redeemable in-store and online toward any product. Choose any amount from GH\u20B550 upward.",
|
|
6144
6148
|
category: "merch",
|
|
6145
|
-
imageUrl: img("
|
|
6149
|
+
imageUrl: img("gift-card"),
|
|
6146
6150
|
tags: ["digital", "gift"],
|
|
6147
6151
|
productType: "digital",
|
|
6148
6152
|
digitalProductType: "gift_code",
|
|
@@ -6156,7 +6160,7 @@ function seedDefault(registry) {
|
|
|
6156
6160
|
price: "320.00",
|
|
6157
6161
|
description: "Two-hour hands-on class: shape your own boule, score it, and take home a baked loaf and a starter jar. Held Saturdays, 10am\u201312pm.",
|
|
6158
6162
|
category: "classes",
|
|
6159
|
-
imageUrl: img("
|
|
6163
|
+
imageUrl: img("baking-class"),
|
|
6160
6164
|
tags: ["class", "service", "hands-on"],
|
|
6161
6165
|
productType: "service",
|
|
6162
6166
|
durationMinutes: 120
|
|
@@ -6168,7 +6172,7 @@ function seedDefault(registry) {
|
|
|
6168
6172
|
price: "480.00",
|
|
6169
6173
|
description: "Three-hour deep-dive on laminated dough. We cover croissants, danishes, kouign-amann. Aprons supplied; pastries to take home.",
|
|
6170
6174
|
category: "classes",
|
|
6171
|
-
imageUrl: img("
|
|
6175
|
+
imageUrl: img("pastry-workshop"),
|
|
6172
6176
|
tags: ["class", "service", "advanced"],
|
|
6173
6177
|
productType: "service",
|
|
6174
6178
|
durationMinutes: 180,
|
|
@@ -6182,7 +6186,7 @@ function seedDefault(registry) {
|
|
|
6182
6186
|
price: "180.00",
|
|
6183
6187
|
description: "Rent our commercial bakery after hours. Deck oven, retarder-proofer, mixers, scales \u2014 bring your team or shoot your content. Hourly.",
|
|
6184
6188
|
category: "classes",
|
|
6185
|
-
imageUrl: img("
|
|
6189
|
+
imageUrl: img("kitchen-rental"),
|
|
6186
6190
|
tags: ["rental", "service", "commercial"],
|
|
6187
6191
|
productType: "service",
|
|
6188
6192
|
durationUnit: "hours"
|
|
@@ -6195,7 +6199,7 @@ function seedDefault(registry) {
|
|
|
6195
6199
|
price: "650.00",
|
|
6196
6200
|
description: "One-bedroom loft above the bakery. Wakes up to fresh croissants, ends with a private dinner. Ghana Tourism-licensed. Per night.",
|
|
6197
6201
|
category: "classes",
|
|
6198
|
-
imageUrl: img("
|
|
6202
|
+
imageUrl: img("loft-stay"),
|
|
6199
6203
|
tags: ["stay", "service", "premium"],
|
|
6200
6204
|
productType: "service",
|
|
6201
6205
|
durationUnit: "nights"
|
|
@@ -6208,7 +6212,7 @@ function seedDefault(registry) {
|
|
|
6208
6212
|
price: "0.00",
|
|
6209
6213
|
description: "A fresh loaf delivered to your door every week. Pause or skip any time. Choose monthly or quarterly billing for a discount.",
|
|
6210
6214
|
category: "classes",
|
|
6211
|
-
imageUrl: img("
|
|
6215
|
+
imageUrl: img("loaf-subscription"),
|
|
6212
6216
|
tags: ["subscription", "service", "delivery"],
|
|
6213
6217
|
productType: "service",
|
|
6214
6218
|
billingPlans: [
|
|
@@ -7036,31 +7040,7 @@ function seedReesa(registry) {
|
|
|
7036
7040
|
|
|
7037
7041
|
// src/mock/seeds/restaurant.ts
|
|
7038
7042
|
var ISO4 = "2026-01-01T00:00:00.000Z";
|
|
7039
|
-
var
|
|
7040
|
-
"business-hero": "1414235077428-338989a2e8c0",
|
|
7041
|
-
kelewele: "1599487488170-d11ec9c172f0",
|
|
7042
|
-
"spring-rolls": "1559339352-11d035aa65de",
|
|
7043
|
-
"soup-of-the-day": "1547592180-85f173990554",
|
|
7044
|
-
"jollof-rice": "1546069901-d5bfd2cbfb1f",
|
|
7045
|
-
"banku-tilapia": "1485921325833-c519f76c4927",
|
|
7046
|
-
"fufu-light-soup": "1602253057119-44d745d9b860",
|
|
7047
|
-
waakye: "1565299624946-b28f40a0ae38",
|
|
7048
|
-
"grilled-chicken": "1598103442097-8b74394b95c6",
|
|
7049
|
-
burger: "1568901346375-23c9450c58cd",
|
|
7050
|
-
"yam-fries": "1576107232684-1279f390859f",
|
|
7051
|
-
"fried-plantain": "1493770348161-369560ae357d",
|
|
7052
|
-
salad: "1512621776951-a57141f2eefd",
|
|
7053
|
-
"ice-cream": "1488900128323-21503983a07e",
|
|
7054
|
-
"cake-slice": "1565958011703-44f9829ba187",
|
|
7055
|
-
"fruit-bowl": "1490474418585-ba9bad8fd0ea",
|
|
7056
|
-
"soft-drink": "1581636625402-29b2a704ef13",
|
|
7057
|
-
sobolo: "1556679343-c7306c1976bc",
|
|
7058
|
-
"fresh-juice": "1610970881699-44a5587cabec",
|
|
7059
|
-
water: "1564325724739-bae0bd08762c",
|
|
7060
|
-
feast: "1559847844-5315695dadae",
|
|
7061
|
-
byo: "1551782450-a2132b4ba21d"
|
|
7062
|
-
};
|
|
7063
|
-
var photoFor = (slug) => seedImage("restaurant", PHOTO[slug] ?? "1414235077428-338989a2e8c0");
|
|
7043
|
+
var photoFor = (slug) => seedImage("restaurant", slug);
|
|
7064
7044
|
function seedRestaurant(registry) {
|
|
7065
7045
|
const businessId = "bus_mamas_kitchen";
|
|
7066
7046
|
const business = {
|
|
@@ -7520,29 +7500,7 @@ function seedRestaurant(registry) {
|
|
|
7520
7500
|
|
|
7521
7501
|
// src/mock/seeds/retail.ts
|
|
7522
7502
|
var ISO5 = "2026-01-01T00:00:00.000Z";
|
|
7523
|
-
var
|
|
7524
|
-
"android-flagship": "1592750475338-74b7b21085ab",
|
|
7525
|
-
"android-mid": "1511707171634-5f897ff02aa9",
|
|
7526
|
-
"phone-budget": "1574944985070-8f3ebc6b79d2",
|
|
7527
|
-
"laptop-pro": "1517336714731-489689fd1ca8",
|
|
7528
|
-
"laptop-air": "1496181133206-80ce9b88a853",
|
|
7529
|
-
"laptop-budget": "1601784551446-20c9e07cdbdb",
|
|
7530
|
-
"headphones-anc": "1505740420928-5e560c06d30e",
|
|
7531
|
-
"earbuds-pro": "1572569511254-d8f925fe2cbb",
|
|
7532
|
-
"speaker-bt": "1612287230202-1ff1d85d1bdf",
|
|
7533
|
-
"phone-case": "1611532736597-de2d4265fba3",
|
|
7534
|
-
"screen-protector": "1568952433726-3896e3881c65",
|
|
7535
|
-
"fast-charger": "1620794108219-aedbaded4eea",
|
|
7536
|
-
"laptop-sleeve": "1604671801908-6f0c6a092c05",
|
|
7537
|
-
"wireless-mouse": "1594732832278-abd644401426",
|
|
7538
|
-
"mech-keyboard": "1583394838336-acd977736f90",
|
|
7539
|
-
"gaming-controller": "1542751371-adc38448a05e",
|
|
7540
|
-
"gaming-headset": "1606220945770-b5b6c2c55bf1",
|
|
7541
|
-
"console-handheld": "1593642634524-b40b5baae6bb",
|
|
7542
|
-
wfh: "1605236453806-6ff36851218e",
|
|
7543
|
-
"game-pack": "1606144042614-b2417e99c4e3"
|
|
7544
|
-
};
|
|
7545
|
-
var photoFor2 = (slug) => seedImage("retail", PHOTO2[slug] ?? "1517336714731-489689fd1ca8");
|
|
7503
|
+
var photoFor2 = (slug) => seedImage("retail", slug);
|
|
7546
7504
|
function seedRetail(registry) {
|
|
7547
7505
|
const businessId = "bus_currents_electronics";
|
|
7548
7506
|
const business = {
|
|
@@ -8015,29 +7973,7 @@ function seedRetail(registry) {
|
|
|
8015
7973
|
|
|
8016
7974
|
// src/mock/seeds/services.ts
|
|
8017
7975
|
var ISO6 = "2026-01-01T00:00:00.000Z";
|
|
8018
|
-
var
|
|
8019
|
-
"business-hero": "1540555700478-4be289fbecef",
|
|
8020
|
-
"swedish-massage-60": "1544161515-4ab6ce6db874",
|
|
8021
|
-
"swedish-massage-90": "1519823551278-64ac92734fb1",
|
|
8022
|
-
"deep-tissue-60": "1571019613454-1cb2f99b2d8b",
|
|
8023
|
-
"couples-massage": "1591343395082-e120087004b4",
|
|
8024
|
-
"hot-stone-90": "1620733723572-11c53f73a416",
|
|
8025
|
-
"facial-classic": "1487412947147-5cebf100ffc2",
|
|
8026
|
-
"facial-anti-aging": "1487412947147-5cebf100ffc2",
|
|
8027
|
-
"facial-acne": "1556228720-195a672e8a03",
|
|
8028
|
-
manicure: "1604654894610-df63bc536371",
|
|
8029
|
-
pedicure: "1519415943484-9fa1873496d4",
|
|
8030
|
-
"gel-manicure": "1607779097040-26e80aa78e66",
|
|
8031
|
-
haircut: "1622286342621-4bd786c2447c",
|
|
8032
|
-
"hair-treatment": "1633681926022-84c23e8cb2d6",
|
|
8033
|
-
color: "1560066984-138dadb4c035",
|
|
8034
|
-
"yoga-session": "1545205597-3d9d02c29597",
|
|
8035
|
-
meditation: "1506126613408-eca07ce68773",
|
|
8036
|
-
"spa-day": "1571019613454-1cb2f99b2d8b",
|
|
8037
|
-
couples: "1591343395082-e120087004b4",
|
|
8038
|
-
custom: "1540555700478-4be289fbecef"
|
|
8039
|
-
};
|
|
8040
|
-
var photoFor3 = (slug) => seedImage("services", PHOTO3[slug] ?? "1540555700478-4be289fbecef");
|
|
7976
|
+
var photoFor3 = (slug) => seedImage("services", slug);
|
|
8041
7977
|
function seedServices(registry) {
|
|
8042
7978
|
const businessId = "bus_serene_spa";
|
|
8043
7979
|
const business = {
|
|
@@ -8417,35 +8353,7 @@ function seedServices(registry) {
|
|
|
8417
8353
|
|
|
8418
8354
|
// src/mock/seeds/grocery.ts
|
|
8419
8355
|
var ISO7 = "2026-01-01T00:00:00.000Z";
|
|
8420
|
-
var
|
|
8421
|
-
"business-hero": "1542838132-92c53300491e",
|
|
8422
|
-
"tomatoes-1kg": "1592924357228-91a4daadcfea",
|
|
8423
|
-
"onions-1kg": "1620574387735-3624d75b2dbc",
|
|
8424
|
-
"ginger-200g": "1594631252845-29fc4cc8cde9",
|
|
8425
|
-
"bananas-bunch": "1571771019784-3ff35f4f4277",
|
|
8426
|
-
pineapple: "1550258987-190a2d41a8ba",
|
|
8427
|
-
"spinach-bunch": "1576045057995-568f588f82fb",
|
|
8428
|
-
"milk-1l": "1563636619-e9143da7973b",
|
|
8429
|
-
"yogurt-500g": "1488477181946-6428a0291777",
|
|
8430
|
-
"eggs-12": "1582722872445-44dc5f7e3c8f",
|
|
8431
|
-
"cheese-200g": "1486297678162-eb2a19b0a32d",
|
|
8432
|
-
"chicken-1kg": "1604503468506-a8da13d82791",
|
|
8433
|
-
"beef-mince-500g": "1607623814075-e51df1bdc82f",
|
|
8434
|
-
"tilapia-each": "1535473895227-bdecb20fb157",
|
|
8435
|
-
"rice-5kg": "1586201375761-83865001e31c",
|
|
8436
|
-
"garri-2kg": "1582284540020-8acbe03f4924",
|
|
8437
|
-
"palm-oil-1l": "1611078489935-0cb964de46d6",
|
|
8438
|
-
"vegetable-oil-1l": "1474979266404-7eaacbcd87c5",
|
|
8439
|
-
"salt-1kg": "1607301406259-dfb186e15de8",
|
|
8440
|
-
"sugar-1kg": "1610725664285-7c57e6eeac3f",
|
|
8441
|
-
"tomato-paste": "1561136594-7f68413baa99",
|
|
8442
|
-
"soap-bar": "1600857062241-98e5dba7f214",
|
|
8443
|
-
"detergent-1kg": "1582735689369-4fe89db7114c",
|
|
8444
|
-
"tissue-pack": "1583947215259-38e31be8751f",
|
|
8445
|
-
"trash-bags": "1605600659908-0ef719419d41",
|
|
8446
|
-
essentials: "1542838132-92c53300491e"
|
|
8447
|
-
};
|
|
8448
|
-
var photoFor4 = (slug) => seedImage("grocery", PHOTO4[slug] ?? "1542838132-92c53300491e");
|
|
8356
|
+
var photoFor4 = (slug) => seedImage("grocery", slug);
|
|
8449
8357
|
function seedGrocery(registry) {
|
|
8450
8358
|
const businessId = "bus_freshmart";
|
|
8451
8359
|
const business = {
|
|
@@ -8708,23 +8616,7 @@ function seedGrocery(registry) {
|
|
|
8708
8616
|
|
|
8709
8617
|
// src/mock/seeds/fashion.ts
|
|
8710
8618
|
var ISO8 = "2026-01-01T00:00:00.000Z";
|
|
8711
|
-
var
|
|
8712
|
-
"heavyweight-hoodie-charcoal": "1556905055-8f358a7a47b2",
|
|
8713
|
-
"heavyweight-hoodie-cream": "1576566588028-4147f3842f27",
|
|
8714
|
-
"heavyweight-hoodie-cobalt": "1542838686-37da4a9fd1b3",
|
|
8715
|
-
"studio-tee-black": "1521572163474-6864f9cf17ab",
|
|
8716
|
-
"studio-tee-natural": "1485518882345-15568b007407",
|
|
8717
|
-
"graphic-tee-frx-mark": "1521223890158-f9f7c3d5d504",
|
|
8718
|
-
"carbon-bomber": "1591047139829-d91aecb6caea",
|
|
8719
|
-
"field-jacket-olive": "1564859228273-274232fdb516",
|
|
8720
|
-
"wide-leg-trouser": "1542272604-787c3835535d",
|
|
8721
|
-
"track-pant-charcoal": "1604176354204-9268737828e4",
|
|
8722
|
-
"studio-cap": "1620799140408-edc6dcb6d633",
|
|
8723
|
-
"tote-natural": "1591195853828-11db59a44f6b",
|
|
8724
|
-
"knit-beanie": "1542838132-92c53300491e",
|
|
8725
|
-
"studio-sock-3pack": "1602810318383-e386cc2a3ccf"
|
|
8726
|
-
};
|
|
8727
|
-
var photoFor5 = (slug) => seedImage("fashion", PHOTO5[slug] ?? "1556905055-8f358a7a47b2");
|
|
8619
|
+
var photoFor5 = (slug) => seedImage("fashion", slug);
|
|
8728
8620
|
var SIZES = ["XS", "S", "M", "L", "XL", "2XL"];
|
|
8729
8621
|
function seedFashion(registry) {
|
|
8730
8622
|
const businessId = "bus_studio_frx";
|
|
@@ -8739,7 +8631,7 @@ function seedFashion(registry) {
|
|
|
8739
8631
|
default_address: "Osu Oxford Street, Accra",
|
|
8740
8632
|
default_offers_table_service: false,
|
|
8741
8633
|
default_accepts_online_orders: true,
|
|
8742
|
-
image: seedImage("fashion", "
|
|
8634
|
+
image: seedImage("fashion", "business-hero"),
|
|
8743
8635
|
status: "active",
|
|
8744
8636
|
created_at: ISO8,
|
|
8745
8637
|
updated_at: ISO8,
|
|
@@ -9141,6 +9033,553 @@ function seedFashion(registry) {
|
|
|
9141
9033
|
return { businessId };
|
|
9142
9034
|
}
|
|
9143
9035
|
|
|
9036
|
+
// src/mock/seeds/pharmacy.ts
|
|
9037
|
+
var ISO9 = "2026-01-01T00:00:00.000Z";
|
|
9038
|
+
var photoFor6 = (slug) => seedImage("pharmacy", slug);
|
|
9039
|
+
function seedPharmacy(registry) {
|
|
9040
|
+
const businessId = "bus_wellspring_pharmacy";
|
|
9041
|
+
const business = {
|
|
9042
|
+
id: businessId,
|
|
9043
|
+
name: "Wellspring Pharmacy",
|
|
9044
|
+
handle: "wellspring",
|
|
9045
|
+
business_type: "retail",
|
|
9046
|
+
email: "care@wellspringpharmacy.test",
|
|
9047
|
+
default_currency: "GHS",
|
|
9048
|
+
default_phone: "+233244778899",
|
|
9049
|
+
default_address: "5 Liberation Road, Ridge, Accra",
|
|
9050
|
+
default_offers_table_service: false,
|
|
9051
|
+
default_accepts_online_orders: true,
|
|
9052
|
+
image: photoFor6("business-hero"),
|
|
9053
|
+
status: "active",
|
|
9054
|
+
created_at: ISO9,
|
|
9055
|
+
updated_at: ISO9,
|
|
9056
|
+
created_by: "seed",
|
|
9057
|
+
preferences: {
|
|
9058
|
+
theme: "clinical",
|
|
9059
|
+
tagline: "Trusted care, delivered same-day",
|
|
9060
|
+
checkout: { allow_guest: true }
|
|
9061
|
+
},
|
|
9062
|
+
is_online_only: false,
|
|
9063
|
+
enabled_payment_types: ["card", "mobile_money", "cash"],
|
|
9064
|
+
default_location_settings: {},
|
|
9065
|
+
country_code: "GH",
|
|
9066
|
+
timezone: "Africa/Accra"
|
|
9067
|
+
};
|
|
9068
|
+
registry.businesses.put(businessId, business);
|
|
9069
|
+
const categories = [
|
|
9070
|
+
{ slug: "pain-relief", name: "Pain Relief" },
|
|
9071
|
+
{ slug: "cold-flu", name: "Cold & Flu" },
|
|
9072
|
+
{ slug: "vitamins", name: "Vitamins & Supplements" },
|
|
9073
|
+
{ slug: "first-aid", name: "First Aid" },
|
|
9074
|
+
{ slug: "personal-care", name: "Personal Care" },
|
|
9075
|
+
{ slug: "devices", name: "Medical Devices" },
|
|
9076
|
+
{ slug: "baby", name: "Baby & Mother" }
|
|
9077
|
+
];
|
|
9078
|
+
const catIds = /* @__PURE__ */ new Map();
|
|
9079
|
+
for (const c of categories) {
|
|
9080
|
+
const id = `cat_${c.slug}`;
|
|
9081
|
+
catIds.set(c.slug, id);
|
|
9082
|
+
const cat = {
|
|
9083
|
+
id,
|
|
9084
|
+
business_id: businessId,
|
|
9085
|
+
name: c.name,
|
|
9086
|
+
slug: c.slug,
|
|
9087
|
+
description: `Wellspring \u2014 ${c.name}`,
|
|
9088
|
+
product_ids: [],
|
|
9089
|
+
display_order: 0,
|
|
9090
|
+
is_active: true,
|
|
9091
|
+
created_at: ISO9,
|
|
9092
|
+
updated_at: ISO9
|
|
9093
|
+
};
|
|
9094
|
+
registry.categories.put(id, cat);
|
|
9095
|
+
}
|
|
9096
|
+
function field(productSlug, f) {
|
|
9097
|
+
return {
|
|
9098
|
+
id: f.id ?? `fld_${productSlug}_${f.slug}`,
|
|
9099
|
+
product_id: `prod_${productSlug}`,
|
|
9100
|
+
...f
|
|
9101
|
+
};
|
|
9102
|
+
}
|
|
9103
|
+
const products = [
|
|
9104
|
+
// Pain Relief
|
|
9105
|
+
{
|
|
9106
|
+
slug: "paracetamol",
|
|
9107
|
+
name: "Paracetamol 500mg (24 tablets)",
|
|
9108
|
+
price: "12.00",
|
|
9109
|
+
category: "pain-relief",
|
|
9110
|
+
description: "Fever and mild-to-moderate pain. Adults and children over 12.",
|
|
9111
|
+
tags: ["otc", "analgesic"],
|
|
9112
|
+
inputs: [
|
|
9113
|
+
field("paracetamol", {
|
|
9114
|
+
slug: "age_confirmation",
|
|
9115
|
+
name: "Age confirmation",
|
|
9116
|
+
field_type: "checkbox",
|
|
9117
|
+
is_required: true,
|
|
9118
|
+
display_order: 0,
|
|
9119
|
+
help_text: "I confirm this product is for someone aged 12 or over."
|
|
9120
|
+
})
|
|
9121
|
+
]
|
|
9122
|
+
},
|
|
9123
|
+
{ slug: "ibuprofen", name: "Ibuprofen 200mg (20 tablets)", price: "18.00", category: "pain-relief", description: "Anti-inflammatory for headaches, muscle pain, menstrual cramps.", tags: ["otc", "nsaid"] },
|
|
9124
|
+
{ slug: "aspirin", name: "Aspirin 300mg (30 tablets)", price: "15.00", category: "pain-relief", description: "Pain relief and low-dose daily cardiovascular protection.", tags: ["otc", "analgesic"] },
|
|
9125
|
+
{ slug: "allergy-relief", name: "Cetirizine 10mg (10 tablets)", price: "22.00", category: "pain-relief", description: "Non-drowsy antihistamine for seasonal allergies.", tags: ["otc", "antihistamine"] },
|
|
9126
|
+
// Cold & Flu
|
|
9127
|
+
{ slug: "cold-flu-syrup", name: "Cold & Flu Syrup (200ml)", price: "35.00", category: "cold-flu", description: "Multi-symptom relief: blocked nose, sore throat, dry cough.", tags: ["otc", "syrup"] },
|
|
9128
|
+
{ slug: "throat-lozenges", name: "Honey-Lemon Throat Lozenges (24)", price: "18.00", category: "cold-flu", description: "Soothes sore throat and irritation.", tags: ["otc", "lozenge"] },
|
|
9129
|
+
{ slug: "decongestant", name: "Nasal Decongestant Spray (10ml)", price: "28.00", category: "cold-flu", description: "Fast-acting relief for blocked nasal passages.", tags: ["otc", "spray"] },
|
|
9130
|
+
// Vitamins & Supplements
|
|
9131
|
+
{ slug: "multivitamin", name: "Daily Multivitamin (60 tablets)", price: "85.00", category: "vitamins", description: "Once-daily formula with 22 essential vitamins and minerals.", tags: ["supplement", "daily"] },
|
|
9132
|
+
{ slug: "vitamin-c", name: "Vitamin C 1000mg (90 tablets)", price: "65.00", category: "vitamins", description: "Immune-support antioxidant. Time-released.", tags: ["supplement", "immune"] },
|
|
9133
|
+
{ slug: "vitamin-d", name: "Vitamin D3 1000IU (120 capsules)", price: "55.00", category: "vitamins", description: "Bone and immune health. 4-month supply.", tags: ["supplement", "bone-health"] },
|
|
9134
|
+
{ slug: "omega-3", name: "Omega-3 Fish Oil (90 softgels)", price: "120.00", category: "vitamins", description: "1000mg EPA+DHA for heart and brain health.", tags: ["supplement", "heart-health"] },
|
|
9135
|
+
{ slug: "probiotics", name: "Probiotic 10-Strain (30 capsules)", price: "95.00", category: "vitamins", description: "Digestive and immune support.", tags: ["supplement", "digestive"] },
|
|
9136
|
+
// First Aid
|
|
9137
|
+
{ slug: "first-aid-kit", name: "Home First Aid Kit", price: "180.00", category: "first-aid", description: "60-piece kit with plasters, gauze, antiseptic, scissors, and quick-reference guide.", tags: ["kit", "essential"] },
|
|
9138
|
+
{ slug: "plasters", name: "Assorted Plasters (40 pack)", price: "22.00", category: "first-aid", description: "Waterproof adhesive bandages in five sizes.", tags: ["first-aid"] },
|
|
9139
|
+
{ slug: "antiseptic", name: "Antiseptic Cream (30g)", price: "18.00", category: "first-aid", description: "For cuts, grazes, and minor skin infections.", tags: ["first-aid", "cream"] },
|
|
9140
|
+
{ slug: "bandages", name: "Elastic Crepe Bandage (5cm x 4.5m)", price: "15.00", category: "first-aid", description: "Reusable compression bandage for sprains.", tags: ["first-aid"] },
|
|
9141
|
+
// Personal Care
|
|
9142
|
+
{ slug: "hand-sanitizer", name: "Hand Sanitizer 70% Alcohol (500ml)", price: "32.00", category: "personal-care", description: "Kills 99.9% of germs. Moisturising formula.", tags: ["hygiene"] },
|
|
9143
|
+
{ slug: "face-mask", name: "Surgical Face Masks (50 pack)", price: "45.00", category: "personal-care", description: "3-ply earloop masks. Disposable.", tags: ["hygiene", "ppe"] },
|
|
9144
|
+
{ slug: "lip-balm", name: "Medicated Lip Balm (4g)", price: "12.00", category: "personal-care", description: "SPF 15 with cocoa butter and beeswax.", tags: ["skin-care"] },
|
|
9145
|
+
// Medical Devices
|
|
9146
|
+
{ slug: "thermometer", name: "Digital Thermometer", price: "65.00", category: "devices", description: "Fast oral / underarm reading in 10 seconds. Auto-shutoff.", tags: ["device", "essential"] },
|
|
9147
|
+
{
|
|
9148
|
+
slug: "blood-pressure-monitor",
|
|
9149
|
+
name: "Automatic BP Monitor",
|
|
9150
|
+
price: "320.00",
|
|
9151
|
+
category: "devices",
|
|
9152
|
+
description: "Upper-arm cuff with memory for two users. Irregular heartbeat detection.",
|
|
9153
|
+
tags: ["device", "premium"],
|
|
9154
|
+
inputs: [
|
|
9155
|
+
field("blood-pressure-monitor", {
|
|
9156
|
+
slug: "arm_size",
|
|
9157
|
+
name: "Arm circumference",
|
|
9158
|
+
field_type: "select",
|
|
9159
|
+
options: ["Standard (22\u201332 cm)", "Large (32\u201342 cm)"],
|
|
9160
|
+
is_required: true,
|
|
9161
|
+
display_order: 0,
|
|
9162
|
+
help_text: "Pick the cuff that fits \u2014 wrong size gives inaccurate readings."
|
|
9163
|
+
})
|
|
9164
|
+
]
|
|
9165
|
+
},
|
|
9166
|
+
{ slug: "glucometer", name: "Blood Glucose Meter Starter Kit", price: "280.00", category: "devices", description: "Meter, 25 test strips, lancing device, 25 lancets, carry case.", tags: ["device", "diabetes"] },
|
|
9167
|
+
{ slug: "pulse-oximeter", name: "Fingertip Pulse Oximeter", price: "145.00", category: "devices", description: "SpO2 + heart-rate reading in under 10 seconds.", tags: ["device"] },
|
|
9168
|
+
// Baby & Mother
|
|
9169
|
+
{
|
|
9170
|
+
slug: "baby-formula",
|
|
9171
|
+
name: "Infant Formula Stage 1 (400g)",
|
|
9172
|
+
price: "150.00",
|
|
9173
|
+
category: "baby",
|
|
9174
|
+
description: "0\u20136 months. Iron-fortified, with prebiotics.",
|
|
9175
|
+
tags: ["baby", "nutrition"],
|
|
9176
|
+
inputs: [
|
|
9177
|
+
field("baby-formula", {
|
|
9178
|
+
slug: "baby_dob",
|
|
9179
|
+
name: "Baby's date of birth",
|
|
9180
|
+
field_type: "date",
|
|
9181
|
+
is_required: true,
|
|
9182
|
+
display_order: 0,
|
|
9183
|
+
help_text: "Confirms stage 1 is the right formula for your baby's age."
|
|
9184
|
+
}),
|
|
9185
|
+
field("baby-formula", {
|
|
9186
|
+
slug: "allergies",
|
|
9187
|
+
name: "Known allergies or intolerances",
|
|
9188
|
+
field_type: "textarea",
|
|
9189
|
+
is_required: false,
|
|
9190
|
+
display_order: 1,
|
|
9191
|
+
placeholder: "e.g. lactose, soy. Leave blank if none.",
|
|
9192
|
+
semantic_kind: "allergen"
|
|
9193
|
+
})
|
|
9194
|
+
]
|
|
9195
|
+
},
|
|
9196
|
+
{ slug: "baby-wipes", name: "Sensitive Baby Wipes (72 pack)", price: "28.00", category: "baby", description: "Alcohol-free, fragrance-free. Dermatologist-tested.", tags: ["baby", "hygiene"] },
|
|
9197
|
+
// ── Prescription medications (Rx; require a verified prescription) ─
|
|
9198
|
+
{
|
|
9199
|
+
slug: "amoxicillin-rx",
|
|
9200
|
+
name: "Amoxicillin 500mg (Rx)",
|
|
9201
|
+
price: "65.00",
|
|
9202
|
+
category: "pain-relief",
|
|
9203
|
+
description: "Broad-spectrum antibiotic. Prescription required \u2014 our pharmacist will verify before dispensing.",
|
|
9204
|
+
tags: ["prescription", "antibiotic"],
|
|
9205
|
+
requiresPrescription: true,
|
|
9206
|
+
inputs: [
|
|
9207
|
+
field("amoxicillin-rx", {
|
|
9208
|
+
slug: "prescription_upload",
|
|
9209
|
+
name: "Upload prescription",
|
|
9210
|
+
field_type: "file",
|
|
9211
|
+
is_required: true,
|
|
9212
|
+
display_order: 0,
|
|
9213
|
+
help_text: "PDF or photo of your doctor's prescription (max 10 MB).",
|
|
9214
|
+
validation: { accepted_formats: ["pdf", "jpg", "jpeg", "png", "heic"], max_size_mb: 10 }
|
|
9215
|
+
}),
|
|
9216
|
+
field("amoxicillin-rx", {
|
|
9217
|
+
slug: "patient_dob",
|
|
9218
|
+
name: "Patient date of birth",
|
|
9219
|
+
field_type: "date",
|
|
9220
|
+
is_required: true,
|
|
9221
|
+
display_order: 1
|
|
9222
|
+
}),
|
|
9223
|
+
field("amoxicillin-rx", {
|
|
9224
|
+
slug: "consent",
|
|
9225
|
+
name: "I confirm this prescription is genuine and issued for the named patient",
|
|
9226
|
+
field_type: "checkbox",
|
|
9227
|
+
is_required: true,
|
|
9228
|
+
display_order: 2,
|
|
9229
|
+
semantic_kind: "consent"
|
|
9230
|
+
})
|
|
9231
|
+
]
|
|
9232
|
+
},
|
|
9233
|
+
{
|
|
9234
|
+
slug: "insulin-rx",
|
|
9235
|
+
name: "Insulin Glargine 100u/ml (Rx)",
|
|
9236
|
+
price: "240.00",
|
|
9237
|
+
category: "devices",
|
|
9238
|
+
description: "Long-acting basal insulin. Cold-chain delivery; prescription required.",
|
|
9239
|
+
tags: ["prescription", "diabetes", "cold-chain"],
|
|
9240
|
+
requiresPrescription: true,
|
|
9241
|
+
inputs: [
|
|
9242
|
+
field("insulin-rx", {
|
|
9243
|
+
slug: "prescription_upload",
|
|
9244
|
+
name: "Upload prescription",
|
|
9245
|
+
field_type: "file",
|
|
9246
|
+
is_required: true,
|
|
9247
|
+
display_order: 0,
|
|
9248
|
+
help_text: "PDF or photo of your doctor's prescription (max 10 MB).",
|
|
9249
|
+
validation: { accepted_formats: ["pdf", "jpg", "jpeg", "png", "heic"], max_size_mb: 10 }
|
|
9250
|
+
}),
|
|
9251
|
+
field("insulin-rx", {
|
|
9252
|
+
slug: "delivery_temp_acknowledgement",
|
|
9253
|
+
name: "I'll be available to receive a cold-chain delivery",
|
|
9254
|
+
field_type: "checkbox",
|
|
9255
|
+
is_required: true,
|
|
9256
|
+
display_order: 1,
|
|
9257
|
+
help_text: "Insulin must be refrigerated. Delivery driver will hand over directly \u2014 not leave at door.",
|
|
9258
|
+
semantic_kind: "consent"
|
|
9259
|
+
})
|
|
9260
|
+
]
|
|
9261
|
+
},
|
|
9262
|
+
{
|
|
9263
|
+
slug: "vaccination-consent",
|
|
9264
|
+
name: "Flu Shot \u2014 At-Pharmacy",
|
|
9265
|
+
price: "80.00",
|
|
9266
|
+
category: "personal-care",
|
|
9267
|
+
description: "Pharmacist-administered seasonal influenza vaccine. Walk-in or book a slot.",
|
|
9268
|
+
tags: ["service", "vaccination"],
|
|
9269
|
+
inputs: [
|
|
9270
|
+
field("vaccination-consent", {
|
|
9271
|
+
slug: "patient_name",
|
|
9272
|
+
name: "Patient name",
|
|
9273
|
+
field_type: "text",
|
|
9274
|
+
is_required: true,
|
|
9275
|
+
display_order: 0
|
|
9276
|
+
}),
|
|
9277
|
+
field("vaccination-consent", {
|
|
9278
|
+
slug: "patient_dob",
|
|
9279
|
+
name: "Date of birth",
|
|
9280
|
+
field_type: "date",
|
|
9281
|
+
is_required: true,
|
|
9282
|
+
display_order: 1
|
|
9283
|
+
}),
|
|
9284
|
+
field("vaccination-consent", {
|
|
9285
|
+
slug: "allergies",
|
|
9286
|
+
name: "Known allergies or reactions to past vaccines",
|
|
9287
|
+
field_type: "textarea",
|
|
9288
|
+
is_required: false,
|
|
9289
|
+
display_order: 2,
|
|
9290
|
+
placeholder: "Egg, latex, prior vaccine reactions, etc. Leave blank if none.",
|
|
9291
|
+
semantic_kind: "allergen"
|
|
9292
|
+
}),
|
|
9293
|
+
field("vaccination-consent", {
|
|
9294
|
+
slug: "consent_signature",
|
|
9295
|
+
name: "Signed consent",
|
|
9296
|
+
field_type: "signature",
|
|
9297
|
+
is_required: true,
|
|
9298
|
+
display_order: 3,
|
|
9299
|
+
help_text: "Required by our administering pharmacist before vaccination.",
|
|
9300
|
+
semantic_kind: "consent"
|
|
9301
|
+
})
|
|
9302
|
+
]
|
|
9303
|
+
}
|
|
9304
|
+
];
|
|
9305
|
+
for (const p of products) {
|
|
9306
|
+
const id = `prod_${p.slug}`;
|
|
9307
|
+
const catId = catIds.get(p.category);
|
|
9308
|
+
const product = {
|
|
9309
|
+
id,
|
|
9310
|
+
business_id: businessId,
|
|
9311
|
+
name: p.name,
|
|
9312
|
+
slug: p.slug,
|
|
9313
|
+
description: p.description,
|
|
9314
|
+
product_type: "product",
|
|
9315
|
+
base_price: p.price,
|
|
9316
|
+
currency: "GHS",
|
|
9317
|
+
image: photoFor6(p.slug),
|
|
9318
|
+
images: [photoFor6(p.slug)],
|
|
9319
|
+
is_available: true,
|
|
9320
|
+
category_ids: [catId],
|
|
9321
|
+
collection_ids: [],
|
|
9322
|
+
add_on_ids: [],
|
|
9323
|
+
variant_ids: [],
|
|
9324
|
+
tags: p.tags ?? [],
|
|
9325
|
+
input_fields: p.inputs,
|
|
9326
|
+
metadata: p.requiresPrescription ? { requires_prescription: true } : void 0,
|
|
9327
|
+
created_at: ISO9,
|
|
9328
|
+
updated_at: ISO9
|
|
9329
|
+
};
|
|
9330
|
+
registry.products.put(id, product);
|
|
9331
|
+
const cat = registry.categories.get(catId);
|
|
9332
|
+
cat.product_ids.push(id);
|
|
9333
|
+
registry.categories.put(catId, cat);
|
|
9334
|
+
}
|
|
9335
|
+
const essentials = {
|
|
9336
|
+
id: "col_essentials",
|
|
9337
|
+
business_id: businessId,
|
|
9338
|
+
name: "Home Essentials",
|
|
9339
|
+
slug: "essentials",
|
|
9340
|
+
description: "Stock up your medicine cabinet.",
|
|
9341
|
+
product_ids: [
|
|
9342
|
+
"prod_paracetamol",
|
|
9343
|
+
"prod_first-aid-kit",
|
|
9344
|
+
"prod_thermometer",
|
|
9345
|
+
"prod_hand-sanitizer",
|
|
9346
|
+
"prod_multivitamin"
|
|
9347
|
+
],
|
|
9348
|
+
is_active: true,
|
|
9349
|
+
created_at: ISO9,
|
|
9350
|
+
updated_at: ISO9
|
|
9351
|
+
};
|
|
9352
|
+
registry.collections.put(essentials.id, essentials);
|
|
9353
|
+
for (const pid of essentials.product_ids) {
|
|
9354
|
+
const p = registry.products.get(pid);
|
|
9355
|
+
if (p) {
|
|
9356
|
+
p.collection_ids.push(essentials.id);
|
|
9357
|
+
registry.products.put(pid, p);
|
|
9358
|
+
}
|
|
9359
|
+
}
|
|
9360
|
+
const packAxis = {
|
|
9361
|
+
id: "axis_pack_size",
|
|
9362
|
+
business_id: businessId,
|
|
9363
|
+
product_id: "prod_paracetamol",
|
|
9364
|
+
name: "Pack size",
|
|
9365
|
+
display_order: 0,
|
|
9366
|
+
affects_recipe: false,
|
|
9367
|
+
values: [
|
|
9368
|
+
{ id: "axv_pack_24", name: "24 tablets", display: 0 },
|
|
9369
|
+
{ id: "axv_pack_48", name: "48 tablets", display: 1 },
|
|
9370
|
+
{ id: "axv_pack_100", name: "100 tablets (family)", display: 2 }
|
|
9371
|
+
].map((v) => ({
|
|
9372
|
+
id: v.id,
|
|
9373
|
+
business_id: businessId,
|
|
9374
|
+
axis_id: "axis_pack_size",
|
|
9375
|
+
name: v.name,
|
|
9376
|
+
display_order: v.display,
|
|
9377
|
+
created_at: ISO9,
|
|
9378
|
+
updated_at: ISO9
|
|
9379
|
+
})),
|
|
9380
|
+
created_at: ISO9,
|
|
9381
|
+
updated_at: ISO9
|
|
9382
|
+
};
|
|
9383
|
+
registry.variantAxes.put(packAxis.id, packAxis);
|
|
9384
|
+
const packAdj = { pack_24: "0.00", pack_48: "8.00", pack_100: "18.00" };
|
|
9385
|
+
const paracetamolVariantIds = [];
|
|
9386
|
+
let firstVariant = true;
|
|
9387
|
+
for (const pk of packAxis.values) {
|
|
9388
|
+
const key = pk.id.replace("axv_pack_", "pack_");
|
|
9389
|
+
const id = `var_paracetamol_${key.replace("pack_", "")}`;
|
|
9390
|
+
const variant = {
|
|
9391
|
+
id,
|
|
9392
|
+
product_id: "prod_paracetamol",
|
|
9393
|
+
business_id: businessId,
|
|
9394
|
+
name: pk.name,
|
|
9395
|
+
sku: `PCM-${key.toUpperCase()}`,
|
|
9396
|
+
price_adjustment: packAdj[key] ?? "0.00",
|
|
9397
|
+
component_multiplier: "1.00",
|
|
9398
|
+
is_default: firstVariant,
|
|
9399
|
+
is_active: true,
|
|
9400
|
+
axis_value_ids: [pk.id],
|
|
9401
|
+
created_at: ISO9,
|
|
9402
|
+
updated_at: ISO9
|
|
9403
|
+
};
|
|
9404
|
+
registry.variants.put(id, variant);
|
|
9405
|
+
paracetamolVariantIds.push(id);
|
|
9406
|
+
firstVariant = false;
|
|
9407
|
+
}
|
|
9408
|
+
const paracetamol = registry.products.get("prod_paracetamol");
|
|
9409
|
+
if (paracetamol) {
|
|
9410
|
+
paracetamol.variant_ids = paracetamolVariantIds;
|
|
9411
|
+
registry.products.put(paracetamol.id, paracetamol);
|
|
9412
|
+
}
|
|
9413
|
+
const formAddOn = {
|
|
9414
|
+
id: "addon_form",
|
|
9415
|
+
business_id: businessId,
|
|
9416
|
+
name: "Format",
|
|
9417
|
+
is_multiple_allowed: false,
|
|
9418
|
+
is_required: false,
|
|
9419
|
+
is_mutually_exclusive: true,
|
|
9420
|
+
min_selections: 0,
|
|
9421
|
+
max_selections: 1,
|
|
9422
|
+
created_at: ISO9,
|
|
9423
|
+
updated_at: ISO9,
|
|
9424
|
+
options: [
|
|
9425
|
+
{ id: "addopt_generic", add_on_id: "addon_form", business_id: businessId, name: "Generic (default)", default_price: "0.00", is_required: false, is_mutually_exclusive: true, created_at: ISO9, updated_at: ISO9 },
|
|
9426
|
+
{ id: "addopt_brand", add_on_id: "addon_form", business_id: businessId, name: "Brand-name (+30%)", default_price: "8.00", is_required: false, is_mutually_exclusive: true, created_at: ISO9, updated_at: ISO9 }
|
|
9427
|
+
]
|
|
9428
|
+
};
|
|
9429
|
+
registry.addOns.put(formAddOn.id, formAddOn);
|
|
9430
|
+
const medProductIds = ["prod_paracetamol", "prod_ibuprofen", "prod_aspirin", "prod_allergy-relief"];
|
|
9431
|
+
for (const pid of medProductIds) {
|
|
9432
|
+
registry.productAddOns.put(`${pid}:${formAddOn.id}`, { product_id: pid, add_on_id: formAddOn.id });
|
|
9433
|
+
const p = registry.products.get(pid);
|
|
9434
|
+
if (p) {
|
|
9435
|
+
p.add_on_ids.push(formAddOn.id);
|
|
9436
|
+
registry.products.put(pid, p);
|
|
9437
|
+
}
|
|
9438
|
+
}
|
|
9439
|
+
const services = [
|
|
9440
|
+
{
|
|
9441
|
+
id: "svc_bp_check",
|
|
9442
|
+
business_id: businessId,
|
|
9443
|
+
name: "Blood Pressure Check",
|
|
9444
|
+
description: "Free in-store BP reading with our pharmacist.",
|
|
9445
|
+
duration_minutes: 15,
|
|
9446
|
+
price: "0.00",
|
|
9447
|
+
is_available: true
|
|
9448
|
+
},
|
|
9449
|
+
{
|
|
9450
|
+
id: "svc_consultation",
|
|
9451
|
+
business_id: businessId,
|
|
9452
|
+
name: "Pharmacist Consultation",
|
|
9453
|
+
description: "15-minute one-on-one about medications, interactions, or symptoms.",
|
|
9454
|
+
duration_minutes: 15,
|
|
9455
|
+
price: "30.00",
|
|
9456
|
+
is_available: true
|
|
9457
|
+
},
|
|
9458
|
+
{
|
|
9459
|
+
id: "svc_prescription_refill",
|
|
9460
|
+
business_id: businessId,
|
|
9461
|
+
name: "Prescription Refill",
|
|
9462
|
+
description: "Upload your prescription; we prepare it for pickup or delivery same-day.",
|
|
9463
|
+
duration_minutes: 30,
|
|
9464
|
+
price: "0.00",
|
|
9465
|
+
is_available: true
|
|
9466
|
+
},
|
|
9467
|
+
{
|
|
9468
|
+
id: "svc_vaccination",
|
|
9469
|
+
business_id: businessId,
|
|
9470
|
+
name: "Vaccination (Flu, Tetanus)",
|
|
9471
|
+
description: "Walk-in or by appointment. Pharmacist-administered.",
|
|
9472
|
+
duration_minutes: 20,
|
|
9473
|
+
price: "80.00",
|
|
9474
|
+
is_available: true
|
|
9475
|
+
}
|
|
9476
|
+
];
|
|
9477
|
+
for (const s of services) registry.services.put(s.id, s);
|
|
9478
|
+
const tags = [
|
|
9479
|
+
{ id: "tag_otc", business_id: businessId, name: "OTC", slug: "otc", color: "#16a34a", sort_order: 0, usage_count: 11, created_at: ISO9, updated_at: ISO9 },
|
|
9480
|
+
{ id: "tag_essential", business_id: businessId, name: "Essential", slug: "essential", color: "#2563eb", sort_order: 1, usage_count: 2, created_at: ISO9, updated_at: ISO9 },
|
|
9481
|
+
{ id: "tag_prescription", business_id: businessId, name: "Prescription", slug: "prescription", color: "#dc2626", sort_order: 2, usage_count: 0, created_at: ISO9, updated_at: ISO9 }
|
|
9482
|
+
];
|
|
9483
|
+
for (const t of tags) registry.tags.put(t.id, t);
|
|
9484
|
+
const medication = {
|
|
9485
|
+
id: "tax_medication",
|
|
9486
|
+
business_id: businessId,
|
|
9487
|
+
name: "Medication",
|
|
9488
|
+
slug: "medication",
|
|
9489
|
+
path: ["Health", "Medication"],
|
|
9490
|
+
attribute_template_ids: ["attr_active_ingredient", "attr_dosage"],
|
|
9491
|
+
created_at: ISO9,
|
|
9492
|
+
updated_at: ISO9
|
|
9493
|
+
};
|
|
9494
|
+
registry.taxonomies.put(medication.id, medication);
|
|
9495
|
+
const attrs = [
|
|
9496
|
+
{
|
|
9497
|
+
id: "attr_active_ingredient",
|
|
9498
|
+
business_id: businessId,
|
|
9499
|
+
namespace: "core",
|
|
9500
|
+
name: "Active ingredient",
|
|
9501
|
+
slug: "active-ingredient",
|
|
9502
|
+
attribute_type: "text",
|
|
9503
|
+
is_required: false,
|
|
9504
|
+
is_filterable: true,
|
|
9505
|
+
visibility: "public",
|
|
9506
|
+
display_order: 0,
|
|
9507
|
+
applies_to: "product",
|
|
9508
|
+
created_at: ISO9,
|
|
9509
|
+
updated_at: ISO9
|
|
9510
|
+
},
|
|
9511
|
+
{
|
|
9512
|
+
id: "attr_dosage",
|
|
9513
|
+
business_id: businessId,
|
|
9514
|
+
namespace: "core",
|
|
9515
|
+
name: "Dosage form",
|
|
9516
|
+
slug: "dosage-form",
|
|
9517
|
+
attribute_type: "select",
|
|
9518
|
+
options: ["tablet", "capsule", "syrup", "spray", "cream", "drops"],
|
|
9519
|
+
is_required: false,
|
|
9520
|
+
is_filterable: true,
|
|
9521
|
+
visibility: "public",
|
|
9522
|
+
display_order: 1,
|
|
9523
|
+
applies_to: "product",
|
|
9524
|
+
created_at: ISO9,
|
|
9525
|
+
updated_at: ISO9
|
|
9526
|
+
},
|
|
9527
|
+
{
|
|
9528
|
+
id: "attr_prescription_required",
|
|
9529
|
+
business_id: businessId,
|
|
9530
|
+
namespace: "core",
|
|
9531
|
+
name: "Prescription required",
|
|
9532
|
+
slug: "prescription-required",
|
|
9533
|
+
attribute_type: "boolean",
|
|
9534
|
+
is_required: false,
|
|
9535
|
+
is_filterable: true,
|
|
9536
|
+
visibility: "public",
|
|
9537
|
+
display_order: 2,
|
|
9538
|
+
applies_to: "product",
|
|
9539
|
+
created_at: ISO9,
|
|
9540
|
+
updated_at: ISO9
|
|
9541
|
+
}
|
|
9542
|
+
];
|
|
9543
|
+
for (const a of attrs) registry.attributeDefs.put(a.id, a);
|
|
9544
|
+
const articles = [
|
|
9545
|
+
{
|
|
9546
|
+
id: "kb_prescription",
|
|
9547
|
+
business_id: businessId,
|
|
9548
|
+
title: "Prescription handling",
|
|
9549
|
+
slug: "prescription-handling",
|
|
9550
|
+
content: "Upload prescriptions through the prescription-refill service. Our pharmacist verifies before dispensing; same-day pickup or delivery within Accra.",
|
|
9551
|
+
category: "logistics",
|
|
9552
|
+
tags: ["prescription", "delivery"],
|
|
9553
|
+
created_at: ISO9,
|
|
9554
|
+
updated_at: ISO9
|
|
9555
|
+
},
|
|
9556
|
+
{
|
|
9557
|
+
id: "kb_returns",
|
|
9558
|
+
business_id: businessId,
|
|
9559
|
+
title: "Returns & exchanges",
|
|
9560
|
+
slug: "returns",
|
|
9561
|
+
content: "Sealed OTC products may be returned within 7 days with receipt. Opened products, prescriptions, and refrigerated items are non-returnable for safety reasons.",
|
|
9562
|
+
category: "policies",
|
|
9563
|
+
tags: ["returns"],
|
|
9564
|
+
created_at: ISO9,
|
|
9565
|
+
updated_at: ISO9
|
|
9566
|
+
},
|
|
9567
|
+
{
|
|
9568
|
+
id: "kb_consultation",
|
|
9569
|
+
business_id: businessId,
|
|
9570
|
+
title: "Pharmacist consultations",
|
|
9571
|
+
slug: "consultations",
|
|
9572
|
+
content: "15-minute pharmacist appointments cover medication review, side-effect questions, OTC selection, and symptom triage. Book through the services menu.",
|
|
9573
|
+
category: "services",
|
|
9574
|
+
tags: ["consultation"],
|
|
9575
|
+
created_at: ISO9,
|
|
9576
|
+
updated_at: ISO9
|
|
9577
|
+
}
|
|
9578
|
+
];
|
|
9579
|
+
for (const a of articles) registry.knowledgeArticles.put(a.id, a);
|
|
9580
|
+
return { businessId };
|
|
9581
|
+
}
|
|
9582
|
+
|
|
9144
9583
|
// src/mock/seeds/registry.ts
|
|
9145
9584
|
var SEEDS = {
|
|
9146
9585
|
default: seedDefault,
|
|
@@ -9150,7 +9589,8 @@ var SEEDS = {
|
|
|
9150
9589
|
retail: seedRetail,
|
|
9151
9590
|
services: seedServices,
|
|
9152
9591
|
grocery: seedGrocery,
|
|
9153
|
-
fashion: seedFashion
|
|
9592
|
+
fashion: seedFashion,
|
|
9593
|
+
pharmacy: seedPharmacy
|
|
9154
9594
|
};
|
|
9155
9595
|
function applySeed(registry, name) {
|
|
9156
9596
|
const fn = SEEDS[name];
|