@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
package/dist/mock/library.mjs
CHANGED
|
@@ -3854,6 +3854,10 @@ function toApiProduct(p, ctx) {
|
|
|
3854
3854
|
duration_unit: p.duration_unit,
|
|
3855
3855
|
duration_minutes: p.duration_minutes,
|
|
3856
3856
|
billing_plans: p.billing_plans,
|
|
3857
|
+
/** Per-product customer inputs (prescription upload, consent
|
|
3858
|
+
* signature, etc.). The Rust backend emits this on ProductView; the
|
|
3859
|
+
* SDK's React components branch on its presence to render inputs. */
|
|
3860
|
+
input_fields: p.input_fields ?? [],
|
|
3857
3861
|
created_at: p.created_at,
|
|
3858
3862
|
updated_at: p.updated_at,
|
|
3859
3863
|
metadata: {
|
|
@@ -5745,8 +5749,8 @@ function createLinkService({ clock, ids }) {
|
|
|
5745
5749
|
|
|
5746
5750
|
// src/mock/seeds/image.ts
|
|
5747
5751
|
var CDN_BASE_URL = "https://static-tmp.cimplify.io";
|
|
5748
|
-
function seedImage(industry,
|
|
5749
|
-
return `${CDN_BASE_URL}/seed/${industry}/${
|
|
5752
|
+
function seedImage(industry, slug) {
|
|
5753
|
+
return `${CDN_BASE_URL}/seed/${industry}/${slug}.jpg`;
|
|
5750
5754
|
}
|
|
5751
5755
|
|
|
5752
5756
|
// src/mock/seeds/default.ts
|
|
@@ -5809,7 +5813,7 @@ function seedDefault(registry) {
|
|
|
5809
5813
|
default_address: "12 Independence Ave, Accra",
|
|
5810
5814
|
default_offers_table_service: true,
|
|
5811
5815
|
default_accepts_online_orders: true,
|
|
5812
|
-
image: img("
|
|
5816
|
+
image: img("business-hero"),
|
|
5813
5817
|
status: "active",
|
|
5814
5818
|
created_at: ISO,
|
|
5815
5819
|
updated_at: ISO,
|
|
@@ -5864,8 +5868,8 @@ function seedDefault(registry) {
|
|
|
5864
5868
|
price: "25.00",
|
|
5865
5869
|
description: "24-hour fermented country loaf with our heritage starter \u2014 open crumb, blistered crust, naturally tangy. Baked fresh every morning.",
|
|
5866
5870
|
category: "breads",
|
|
5867
|
-
imageUrl: img("
|
|
5868
|
-
images: [img("
|
|
5871
|
+
imageUrl: img("sourdough-loaf"),
|
|
5872
|
+
images: [img("sourdough-loaf"), img("whole-wheat")],
|
|
5869
5873
|
tags: ["bread", "vegan", "signature"],
|
|
5870
5874
|
isSignature: true,
|
|
5871
5875
|
ingredients: ["Wheat flour", "Sourdough starter", "Sea salt", "Filtered water"],
|
|
@@ -5880,7 +5884,7 @@ function seedDefault(registry) {
|
|
|
5880
5884
|
price: "20.00",
|
|
5881
5885
|
description: "Hearty 100% whole wheat with sunflower, sesame, and pumpkin seeds. Slow-fermented for a soft crumb and nutty depth.",
|
|
5882
5886
|
category: "breads",
|
|
5883
|
-
imageUrl: img("
|
|
5887
|
+
imageUrl: img("whole-wheat"),
|
|
5884
5888
|
tags: ["bread", "vegan", "high-fibre"],
|
|
5885
5889
|
ingredients: ["Whole wheat flour", "Sunflower seeds", "Sesame", "Pumpkin seeds"],
|
|
5886
5890
|
allergies: ["wheat", "gluten", "sesame"],
|
|
@@ -5893,7 +5897,7 @@ function seedDefault(registry) {
|
|
|
5893
5897
|
price: "15.00",
|
|
5894
5898
|
description: "Crackling crust, airy crumb. Best eaten warm, within an hour of baking.",
|
|
5895
5899
|
category: "breads",
|
|
5896
|
-
imageUrl: img("
|
|
5900
|
+
imageUrl: img("baguette"),
|
|
5897
5901
|
tags: ["bread", "vegan"],
|
|
5898
5902
|
ingredients: ["Wheat flour", "Yeast", "Sea salt", "Water"],
|
|
5899
5903
|
allergies: ["wheat", "gluten"],
|
|
@@ -5906,7 +5910,7 @@ function seedDefault(registry) {
|
|
|
5906
5910
|
price: "30.00",
|
|
5907
5911
|
description: "High-hydration focaccia drenched in olive oil, scattered with sea salt and fresh rosemary. Sold whole or by the slab.",
|
|
5908
5912
|
category: "breads",
|
|
5909
|
-
imageUrl: img("
|
|
5913
|
+
imageUrl: img("focaccia"),
|
|
5910
5914
|
tags: ["bread", "vegetarian"],
|
|
5911
5915
|
ingredients: ["00 flour", "Olive oil", "Rosemary", "Maldon salt"],
|
|
5912
5916
|
pairings: ["Burrata", "Prosciutto", "Caponata"],
|
|
@@ -5920,7 +5924,7 @@ function seedDefault(registry) {
|
|
|
5920
5924
|
price: "18.00",
|
|
5921
5925
|
description: "Caramelised brown butter, three over-ripe bananas, walnuts, finished with a salted maple glaze.",
|
|
5922
5926
|
category: "breads",
|
|
5923
|
-
imageUrl: img("
|
|
5927
|
+
imageUrl: img("banana-bread"),
|
|
5924
5928
|
tags: ["sweet", "comfort"],
|
|
5925
5929
|
ingredients: ["Bananas", "Brown butter", "Walnuts", "Maple syrup"],
|
|
5926
5930
|
allergies: ["wheat", "gluten", "dairy", "nuts", "eggs"],
|
|
@@ -5935,8 +5939,8 @@ function seedDefault(registry) {
|
|
|
5935
5939
|
price: "12.00",
|
|
5936
5940
|
description: "27 layers of laminated dough wrapped around French butter. Crisp, shattering crust and a tender honeycomb interior.",
|
|
5937
5941
|
category: "pastries",
|
|
5938
|
-
imageUrl: img("
|
|
5939
|
-
images: [img("
|
|
5942
|
+
imageUrl: img("croissant"),
|
|
5943
|
+
images: [img("croissant"), img("pain-au-chocolat")],
|
|
5940
5944
|
tags: ["pastry", "vegetarian", "signature"],
|
|
5941
5945
|
isSignature: true,
|
|
5942
5946
|
ingredients: ["French butter", "Wheat flour", "Milk", "Eggs"],
|
|
@@ -5950,7 +5954,7 @@ function seedDefault(registry) {
|
|
|
5950
5954
|
price: "14.00",
|
|
5951
5955
|
description: "Our croissant dough wrapped around two batons of 70% Valrhona dark chocolate.",
|
|
5952
5956
|
category: "pastries",
|
|
5953
|
-
imageUrl: img("
|
|
5957
|
+
imageUrl: img("pain-au-chocolat"),
|
|
5954
5958
|
tags: ["pastry", "chocolate"],
|
|
5955
5959
|
ingredients: ["Croissant dough", "Valrhona chocolate"],
|
|
5956
5960
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -5963,7 +5967,7 @@ function seedDefault(registry) {
|
|
|
5963
5967
|
price: "16.00",
|
|
5964
5968
|
description: "Flaky pastry filled with almond cream, dusted with toasted slivers and powdered sugar.",
|
|
5965
5969
|
category: "pastries",
|
|
5966
|
-
imageUrl: img("
|
|
5970
|
+
imageUrl: img("almond-danish"),
|
|
5967
5971
|
tags: ["pastry", "nuts"],
|
|
5968
5972
|
ingredients: ["Pastry dough", "Almond cream", "Toasted almonds"],
|
|
5969
5973
|
allergies: ["wheat", "gluten", "dairy", "eggs", "nuts"],
|
|
@@ -5976,7 +5980,7 @@ function seedDefault(registry) {
|
|
|
5976
5980
|
price: "13.00",
|
|
5977
5981
|
description: "Soft enriched dough swirled with butter and Ceylon cinnamon, finished with cream-cheese glaze.",
|
|
5978
5982
|
category: "pastries",
|
|
5979
|
-
imageUrl: img("
|
|
5983
|
+
imageUrl: img("cinnamon-roll"),
|
|
5980
5984
|
tags: ["pastry", "comfort"],
|
|
5981
5985
|
ingredients: ["Enriched dough", "Cinnamon", "Brown sugar", "Cream cheese"],
|
|
5982
5986
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -5989,7 +5993,7 @@ function seedDefault(registry) {
|
|
|
5989
5993
|
price: "12.00",
|
|
5990
5994
|
description: "Dark, dense, fudgy brownie with a glossy shell. Chocolate four ways. Best slightly warm.",
|
|
5991
5995
|
category: "pastries",
|
|
5992
|
-
imageUrl: img("
|
|
5996
|
+
imageUrl: img("brownie"),
|
|
5993
5997
|
tags: ["chocolate", "vegetarian"],
|
|
5994
5998
|
ingredients: ["Dark chocolate", "Cocoa", "Brown butter", "Eggs"],
|
|
5995
5999
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -6002,7 +6006,7 @@ function seedDefault(registry) {
|
|
|
6002
6006
|
price: "60.00",
|
|
6003
6007
|
description: "Six French macarons \u2014 pistachio, raspberry, salted caramel, espresso, vanilla bean, and dark chocolate ganache.",
|
|
6004
6008
|
category: "pastries",
|
|
6005
|
-
imageUrl: img("
|
|
6009
|
+
imageUrl: img("macaron-box"),
|
|
6006
6010
|
tags: ["pastry", "gift", "premium"],
|
|
6007
6011
|
ingredients: ["Almond flour", "Egg whites", "Sugar", "Various fillings"],
|
|
6008
6012
|
allergies: ["nuts", "eggs", "dairy"],
|
|
@@ -6016,7 +6020,7 @@ function seedDefault(registry) {
|
|
|
6016
6020
|
price: "22.00",
|
|
6017
6021
|
description: "Three layers of dark chocolate sponge with chocolate ganache and cr\xE8me p\xE2tissi\xE8re, finished with a mirror glaze. (Slice)",
|
|
6018
6022
|
category: "cakes",
|
|
6019
|
-
imageUrl: img("
|
|
6023
|
+
imageUrl: img("chocolate-cake"),
|
|
6020
6024
|
tags: ["cake", "chocolate", "signature"],
|
|
6021
6025
|
isSignature: true,
|
|
6022
6026
|
ingredients: ["Dark chocolate", "Cr\xE8me p\xE2tissi\xE8re", "Cocoa", "Eggs"],
|
|
@@ -6031,7 +6035,7 @@ function seedDefault(registry) {
|
|
|
6031
6035
|
price: "22.00",
|
|
6032
6036
|
description: "Classic red velvet with cream cheese frosting and white chocolate shavings.",
|
|
6033
6037
|
category: "cakes",
|
|
6034
|
-
imageUrl: img("
|
|
6038
|
+
imageUrl: img("red-velvet"),
|
|
6035
6039
|
tags: ["cake"],
|
|
6036
6040
|
ingredients: ["Buttermilk", "Cocoa", "Cream cheese", "Beetroot"],
|
|
6037
6041
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -6044,7 +6048,7 @@ function seedDefault(registry) {
|
|
|
6044
6048
|
price: "20.00",
|
|
6045
6049
|
description: "Spiced carrot cake with toasted walnuts, golden raisins, and cream-cheese frosting.",
|
|
6046
6050
|
category: "cakes",
|
|
6047
|
-
imageUrl: img("
|
|
6051
|
+
imageUrl: img("carrot-cake"),
|
|
6048
6052
|
tags: ["cake", "spiced"],
|
|
6049
6053
|
ingredients: ["Carrot", "Walnuts", "Cinnamon", "Cream cheese"],
|
|
6050
6054
|
allergies: ["wheat", "gluten", "dairy", "eggs", "nuts"],
|
|
@@ -6057,7 +6061,7 @@ function seedDefault(registry) {
|
|
|
6057
6061
|
price: "24.00",
|
|
6058
6062
|
description: "Dense, creamy New York cheesecake on a butter graham crust. Topped with seasonal berry compote.",
|
|
6059
6063
|
category: "cakes",
|
|
6060
|
-
imageUrl: img("
|
|
6064
|
+
imageUrl: img("cheesecake"),
|
|
6061
6065
|
tags: ["cake", "premium"],
|
|
6062
6066
|
ingredients: ["Cream cheese", "Sour cream", "Graham crust", "Vanilla"],
|
|
6063
6067
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -6070,8 +6074,8 @@ function seedDefault(registry) {
|
|
|
6070
6074
|
price: "250.00",
|
|
6071
6075
|
description: "Made-to-order three-tier cake. Choose size, flavour, and frosting. 48-hour notice required for personalisation.",
|
|
6072
6076
|
category: "cakes",
|
|
6073
|
-
imageUrl: img("
|
|
6074
|
-
images: [img("
|
|
6077
|
+
imageUrl: img("birthday-cake"),
|
|
6078
|
+
images: [img("birthday-cake"), img("chocolate-cake")],
|
|
6075
6079
|
tags: ["cake", "made-to-order", "premium"],
|
|
6076
6080
|
ingredients: ["Sponge cake", "Buttercream", "Custom decoration"],
|
|
6077
6081
|
allergies: ["wheat", "gluten", "dairy", "eggs"],
|
|
@@ -6085,7 +6089,7 @@ function seedDefault(registry) {
|
|
|
6085
6089
|
price: "10.00",
|
|
6086
6090
|
description: "Locally roasted Arabica from Volta Region. Notes of cocoa, dark fruit, and brown sugar.",
|
|
6087
6091
|
category: "drinks",
|
|
6088
|
-
imageUrl: img("
|
|
6092
|
+
imageUrl: img("coffee"),
|
|
6089
6093
|
tags: ["drink", "coffee", "vegan"],
|
|
6090
6094
|
ingredients: ["Single-origin Arabica beans"],
|
|
6091
6095
|
pairings: ["Croissant", "Brownie"],
|
|
@@ -6098,7 +6102,7 @@ function seedDefault(registry) {
|
|
|
6098
6102
|
price: "8.00",
|
|
6099
6103
|
description: "Choice of English breakfast, Earl Grey, green sencha, or chamomile.",
|
|
6100
6104
|
category: "drinks",
|
|
6101
|
-
imageUrl: img("
|
|
6105
|
+
imageUrl: img("tea"),
|
|
6102
6106
|
tags: ["drink", "tea", "vegan"],
|
|
6103
6107
|
calories: 0
|
|
6104
6108
|
},
|
|
@@ -6109,7 +6113,7 @@ function seedDefault(registry) {
|
|
|
6109
6113
|
price: "12.00",
|
|
6110
6114
|
description: "Iced hibiscus tea with ginger, pineapple peel, and a hint of clove. Tart, refreshing, lightly sweet.",
|
|
6111
6115
|
category: "drinks",
|
|
6112
|
-
imageUrl: img("
|
|
6116
|
+
imageUrl: img("sobolo"),
|
|
6113
6117
|
tags: ["drink", "vegan", "ghana"],
|
|
6114
6118
|
isSignature: true,
|
|
6115
6119
|
ingredients: ["Hibiscus", "Ginger", "Pineapple", "Clove"],
|
|
@@ -6122,7 +6126,7 @@ function seedDefault(registry) {
|
|
|
6122
6126
|
price: "15.00",
|
|
6123
6127
|
description: "Hand-pressed at sunrise from Ghanaian Valencia oranges. No sugar, no concentrate.",
|
|
6124
6128
|
category: "drinks",
|
|
6125
|
-
imageUrl: img("
|
|
6129
|
+
imageUrl: img("orange-juice"),
|
|
6126
6130
|
tags: ["drink", "vegan"],
|
|
6127
6131
|
calories: 110
|
|
6128
6132
|
},
|
|
@@ -6134,8 +6138,8 @@ function seedDefault(registry) {
|
|
|
6134
6138
|
price: "30.00",
|
|
6135
6139
|
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.",
|
|
6136
6140
|
category: "boxes",
|
|
6137
|
-
imageUrl: img("
|
|
6138
|
-
images: [img("
|
|
6141
|
+
imageUrl: img("breakfast-box"),
|
|
6142
|
+
images: [img("breakfast-box"), img("coffee")],
|
|
6139
6143
|
tags: ["bundle", "breakfast"],
|
|
6140
6144
|
productType: "bundle"
|
|
6141
6145
|
},
|
|
@@ -6146,7 +6150,7 @@ function seedDefault(registry) {
|
|
|
6146
6150
|
price: "60.00",
|
|
6147
6151
|
description: "Pick 6 to 12 of our pastries \u2014 mix and match. Freshly boxed for sharing.",
|
|
6148
6152
|
category: "boxes",
|
|
6149
|
-
imageUrl: img("
|
|
6153
|
+
imageUrl: img("pastry-box"),
|
|
6150
6154
|
tags: ["composite", "build-your-own", "gift"],
|
|
6151
6155
|
productType: "composite"
|
|
6152
6156
|
},
|
|
@@ -6158,7 +6162,7 @@ function seedDefault(registry) {
|
|
|
6158
6162
|
price: "85.00",
|
|
6159
6163
|
description: "Heavy-weight cotton-canvas apron with leather neck strap, embroidered logo, and two front pockets. Made in Accra.",
|
|
6160
6164
|
category: "merch",
|
|
6161
|
-
imageUrl: img("
|
|
6165
|
+
imageUrl: img("apron"),
|
|
6162
6166
|
tags: ["merch", "physical"],
|
|
6163
6167
|
renderHint: "physical"
|
|
6164
6168
|
},
|
|
@@ -6169,7 +6173,7 @@ function seedDefault(registry) {
|
|
|
6169
6173
|
price: "35.00",
|
|
6170
6174
|
description: "12oz natural canvas tote, screen-printed with our wheat-stalk crest. Roomy enough for two loaves.",
|
|
6171
6175
|
category: "merch",
|
|
6172
|
-
imageUrl: img("
|
|
6176
|
+
imageUrl: img("tote-bag"),
|
|
6173
6177
|
tags: ["merch", "physical", "gift"],
|
|
6174
6178
|
renderHint: "physical",
|
|
6175
6179
|
isNew: true
|
|
@@ -6182,7 +6186,7 @@ function seedDefault(registry) {
|
|
|
6182
6186
|
price: "320.00",
|
|
6183
6187
|
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.",
|
|
6184
6188
|
category: "merch",
|
|
6185
|
-
imageUrl: img("
|
|
6189
|
+
imageUrl: img("flour-25kg"),
|
|
6186
6190
|
tags: ["wholesale", "physical", "trade"],
|
|
6187
6191
|
renderHint: "physical",
|
|
6188
6192
|
quantityPricing: [
|
|
@@ -6200,7 +6204,7 @@ function seedDefault(registry) {
|
|
|
6200
6204
|
price: "45.00",
|
|
6201
6205
|
description: "PDF + EPUB walkthrough of our sourdough programme \u2014 starter, levain, autolyse, bulk fermentation, shaping, scoring. Lifetime updates.",
|
|
6202
6206
|
category: "merch",
|
|
6203
|
-
imageUrl: img("
|
|
6207
|
+
imageUrl: img("sourdough-ebook"),
|
|
6204
6208
|
tags: ["digital", "download"],
|
|
6205
6209
|
productType: "digital",
|
|
6206
6210
|
digitalProductType: "download"
|
|
@@ -6212,7 +6216,7 @@ function seedDefault(registry) {
|
|
|
6212
6216
|
price: "100.00",
|
|
6213
6217
|
description: "Send instantly. Redeemable in-store and online toward any product. Choose any amount from GH\u20B550 upward.",
|
|
6214
6218
|
category: "merch",
|
|
6215
|
-
imageUrl: img("
|
|
6219
|
+
imageUrl: img("gift-card"),
|
|
6216
6220
|
tags: ["digital", "gift"],
|
|
6217
6221
|
productType: "digital",
|
|
6218
6222
|
digitalProductType: "gift_code",
|
|
@@ -6226,7 +6230,7 @@ function seedDefault(registry) {
|
|
|
6226
6230
|
price: "320.00",
|
|
6227
6231
|
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.",
|
|
6228
6232
|
category: "classes",
|
|
6229
|
-
imageUrl: img("
|
|
6233
|
+
imageUrl: img("baking-class"),
|
|
6230
6234
|
tags: ["class", "service", "hands-on"],
|
|
6231
6235
|
productType: "service",
|
|
6232
6236
|
durationMinutes: 120
|
|
@@ -6238,7 +6242,7 @@ function seedDefault(registry) {
|
|
|
6238
6242
|
price: "480.00",
|
|
6239
6243
|
description: "Three-hour deep-dive on laminated dough. We cover croissants, danishes, kouign-amann. Aprons supplied; pastries to take home.",
|
|
6240
6244
|
category: "classes",
|
|
6241
|
-
imageUrl: img("
|
|
6245
|
+
imageUrl: img("pastry-workshop"),
|
|
6242
6246
|
tags: ["class", "service", "advanced"],
|
|
6243
6247
|
productType: "service",
|
|
6244
6248
|
durationMinutes: 180,
|
|
@@ -6252,7 +6256,7 @@ function seedDefault(registry) {
|
|
|
6252
6256
|
price: "180.00",
|
|
6253
6257
|
description: "Rent our commercial bakery after hours. Deck oven, retarder-proofer, mixers, scales \u2014 bring your team or shoot your content. Hourly.",
|
|
6254
6258
|
category: "classes",
|
|
6255
|
-
imageUrl: img("
|
|
6259
|
+
imageUrl: img("kitchen-rental"),
|
|
6256
6260
|
tags: ["rental", "service", "commercial"],
|
|
6257
6261
|
productType: "service",
|
|
6258
6262
|
durationUnit: "hours"
|
|
@@ -6265,7 +6269,7 @@ function seedDefault(registry) {
|
|
|
6265
6269
|
price: "650.00",
|
|
6266
6270
|
description: "One-bedroom loft above the bakery. Wakes up to fresh croissants, ends with a private dinner. Ghana Tourism-licensed. Per night.",
|
|
6267
6271
|
category: "classes",
|
|
6268
|
-
imageUrl: img("
|
|
6272
|
+
imageUrl: img("loft-stay"),
|
|
6269
6273
|
tags: ["stay", "service", "premium"],
|
|
6270
6274
|
productType: "service",
|
|
6271
6275
|
durationUnit: "nights"
|
|
@@ -6278,7 +6282,7 @@ function seedDefault(registry) {
|
|
|
6278
6282
|
price: "0.00",
|
|
6279
6283
|
description: "A fresh loaf delivered to your door every week. Pause or skip any time. Choose monthly or quarterly billing for a discount.",
|
|
6280
6284
|
category: "classes",
|
|
6281
|
-
imageUrl: img("
|
|
6285
|
+
imageUrl: img("loaf-subscription"),
|
|
6282
6286
|
tags: ["subscription", "service", "delivery"],
|
|
6283
6287
|
productType: "service",
|
|
6284
6288
|
billingPlans: [
|
|
@@ -7106,31 +7110,7 @@ function seedReesa(registry) {
|
|
|
7106
7110
|
|
|
7107
7111
|
// src/mock/seeds/restaurant.ts
|
|
7108
7112
|
var ISO4 = "2026-01-01T00:00:00.000Z";
|
|
7109
|
-
var
|
|
7110
|
-
"business-hero": "1414235077428-338989a2e8c0",
|
|
7111
|
-
kelewele: "1599487488170-d11ec9c172f0",
|
|
7112
|
-
"spring-rolls": "1559339352-11d035aa65de",
|
|
7113
|
-
"soup-of-the-day": "1547592180-85f173990554",
|
|
7114
|
-
"jollof-rice": "1546069901-d5bfd2cbfb1f",
|
|
7115
|
-
"banku-tilapia": "1485921325833-c519f76c4927",
|
|
7116
|
-
"fufu-light-soup": "1602253057119-44d745d9b860",
|
|
7117
|
-
waakye: "1565299624946-b28f40a0ae38",
|
|
7118
|
-
"grilled-chicken": "1598103442097-8b74394b95c6",
|
|
7119
|
-
burger: "1568901346375-23c9450c58cd",
|
|
7120
|
-
"yam-fries": "1576107232684-1279f390859f",
|
|
7121
|
-
"fried-plantain": "1493770348161-369560ae357d",
|
|
7122
|
-
salad: "1512621776951-a57141f2eefd",
|
|
7123
|
-
"ice-cream": "1488900128323-21503983a07e",
|
|
7124
|
-
"cake-slice": "1565958011703-44f9829ba187",
|
|
7125
|
-
"fruit-bowl": "1490474418585-ba9bad8fd0ea",
|
|
7126
|
-
"soft-drink": "1581636625402-29b2a704ef13",
|
|
7127
|
-
sobolo: "1556679343-c7306c1976bc",
|
|
7128
|
-
"fresh-juice": "1610970881699-44a5587cabec",
|
|
7129
|
-
water: "1564325724739-bae0bd08762c",
|
|
7130
|
-
feast: "1559847844-5315695dadae",
|
|
7131
|
-
byo: "1551782450-a2132b4ba21d"
|
|
7132
|
-
};
|
|
7133
|
-
var photoFor = (slug) => seedImage("restaurant", PHOTO[slug] ?? "1414235077428-338989a2e8c0");
|
|
7113
|
+
var photoFor = (slug) => seedImage("restaurant", slug);
|
|
7134
7114
|
function seedRestaurant(registry) {
|
|
7135
7115
|
const businessId = "bus_mamas_kitchen";
|
|
7136
7116
|
const business = {
|
|
@@ -7590,29 +7570,7 @@ function seedRestaurant(registry) {
|
|
|
7590
7570
|
|
|
7591
7571
|
// src/mock/seeds/retail.ts
|
|
7592
7572
|
var ISO5 = "2026-01-01T00:00:00.000Z";
|
|
7593
|
-
var
|
|
7594
|
-
"android-flagship": "1592750475338-74b7b21085ab",
|
|
7595
|
-
"android-mid": "1511707171634-5f897ff02aa9",
|
|
7596
|
-
"phone-budget": "1574944985070-8f3ebc6b79d2",
|
|
7597
|
-
"laptop-pro": "1517336714731-489689fd1ca8",
|
|
7598
|
-
"laptop-air": "1496181133206-80ce9b88a853",
|
|
7599
|
-
"laptop-budget": "1601784551446-20c9e07cdbdb",
|
|
7600
|
-
"headphones-anc": "1505740420928-5e560c06d30e",
|
|
7601
|
-
"earbuds-pro": "1572569511254-d8f925fe2cbb",
|
|
7602
|
-
"speaker-bt": "1612287230202-1ff1d85d1bdf",
|
|
7603
|
-
"phone-case": "1611532736597-de2d4265fba3",
|
|
7604
|
-
"screen-protector": "1568952433726-3896e3881c65",
|
|
7605
|
-
"fast-charger": "1620794108219-aedbaded4eea",
|
|
7606
|
-
"laptop-sleeve": "1604671801908-6f0c6a092c05",
|
|
7607
|
-
"wireless-mouse": "1594732832278-abd644401426",
|
|
7608
|
-
"mech-keyboard": "1583394838336-acd977736f90",
|
|
7609
|
-
"gaming-controller": "1542751371-adc38448a05e",
|
|
7610
|
-
"gaming-headset": "1606220945770-b5b6c2c55bf1",
|
|
7611
|
-
"console-handheld": "1593642634524-b40b5baae6bb",
|
|
7612
|
-
wfh: "1605236453806-6ff36851218e",
|
|
7613
|
-
"game-pack": "1606144042614-b2417e99c4e3"
|
|
7614
|
-
};
|
|
7615
|
-
var photoFor2 = (slug) => seedImage("retail", PHOTO2[slug] ?? "1517336714731-489689fd1ca8");
|
|
7573
|
+
var photoFor2 = (slug) => seedImage("retail", slug);
|
|
7616
7574
|
function seedRetail(registry) {
|
|
7617
7575
|
const businessId = "bus_currents_electronics";
|
|
7618
7576
|
const business = {
|
|
@@ -8085,29 +8043,7 @@ function seedRetail(registry) {
|
|
|
8085
8043
|
|
|
8086
8044
|
// src/mock/seeds/services.ts
|
|
8087
8045
|
var ISO6 = "2026-01-01T00:00:00.000Z";
|
|
8088
|
-
var
|
|
8089
|
-
"business-hero": "1540555700478-4be289fbecef",
|
|
8090
|
-
"swedish-massage-60": "1544161515-4ab6ce6db874",
|
|
8091
|
-
"swedish-massage-90": "1519823551278-64ac92734fb1",
|
|
8092
|
-
"deep-tissue-60": "1571019613454-1cb2f99b2d8b",
|
|
8093
|
-
"couples-massage": "1591343395082-e120087004b4",
|
|
8094
|
-
"hot-stone-90": "1620733723572-11c53f73a416",
|
|
8095
|
-
"facial-classic": "1487412947147-5cebf100ffc2",
|
|
8096
|
-
"facial-anti-aging": "1487412947147-5cebf100ffc2",
|
|
8097
|
-
"facial-acne": "1556228720-195a672e8a03",
|
|
8098
|
-
manicure: "1604654894610-df63bc536371",
|
|
8099
|
-
pedicure: "1519415943484-9fa1873496d4",
|
|
8100
|
-
"gel-manicure": "1607779097040-26e80aa78e66",
|
|
8101
|
-
haircut: "1622286342621-4bd786c2447c",
|
|
8102
|
-
"hair-treatment": "1633681926022-84c23e8cb2d6",
|
|
8103
|
-
color: "1560066984-138dadb4c035",
|
|
8104
|
-
"yoga-session": "1545205597-3d9d02c29597",
|
|
8105
|
-
meditation: "1506126613408-eca07ce68773",
|
|
8106
|
-
"spa-day": "1571019613454-1cb2f99b2d8b",
|
|
8107
|
-
couples: "1591343395082-e120087004b4",
|
|
8108
|
-
custom: "1540555700478-4be289fbecef"
|
|
8109
|
-
};
|
|
8110
|
-
var photoFor3 = (slug) => seedImage("services", PHOTO3[slug] ?? "1540555700478-4be289fbecef");
|
|
8046
|
+
var photoFor3 = (slug) => seedImage("services", slug);
|
|
8111
8047
|
function seedServices(registry) {
|
|
8112
8048
|
const businessId = "bus_serene_spa";
|
|
8113
8049
|
const business = {
|
|
@@ -8487,35 +8423,7 @@ function seedServices(registry) {
|
|
|
8487
8423
|
|
|
8488
8424
|
// src/mock/seeds/grocery.ts
|
|
8489
8425
|
var ISO7 = "2026-01-01T00:00:00.000Z";
|
|
8490
|
-
var
|
|
8491
|
-
"business-hero": "1542838132-92c53300491e",
|
|
8492
|
-
"tomatoes-1kg": "1592924357228-91a4daadcfea",
|
|
8493
|
-
"onions-1kg": "1620574387735-3624d75b2dbc",
|
|
8494
|
-
"ginger-200g": "1594631252845-29fc4cc8cde9",
|
|
8495
|
-
"bananas-bunch": "1571771019784-3ff35f4f4277",
|
|
8496
|
-
pineapple: "1550258987-190a2d41a8ba",
|
|
8497
|
-
"spinach-bunch": "1576045057995-568f588f82fb",
|
|
8498
|
-
"milk-1l": "1563636619-e9143da7973b",
|
|
8499
|
-
"yogurt-500g": "1488477181946-6428a0291777",
|
|
8500
|
-
"eggs-12": "1582722872445-44dc5f7e3c8f",
|
|
8501
|
-
"cheese-200g": "1486297678162-eb2a19b0a32d",
|
|
8502
|
-
"chicken-1kg": "1604503468506-a8da13d82791",
|
|
8503
|
-
"beef-mince-500g": "1607623814075-e51df1bdc82f",
|
|
8504
|
-
"tilapia-each": "1535473895227-bdecb20fb157",
|
|
8505
|
-
"rice-5kg": "1586201375761-83865001e31c",
|
|
8506
|
-
"garri-2kg": "1582284540020-8acbe03f4924",
|
|
8507
|
-
"palm-oil-1l": "1611078489935-0cb964de46d6",
|
|
8508
|
-
"vegetable-oil-1l": "1474979266404-7eaacbcd87c5",
|
|
8509
|
-
"salt-1kg": "1607301406259-dfb186e15de8",
|
|
8510
|
-
"sugar-1kg": "1610725664285-7c57e6eeac3f",
|
|
8511
|
-
"tomato-paste": "1561136594-7f68413baa99",
|
|
8512
|
-
"soap-bar": "1600857062241-98e5dba7f214",
|
|
8513
|
-
"detergent-1kg": "1582735689369-4fe89db7114c",
|
|
8514
|
-
"tissue-pack": "1583947215259-38e31be8751f",
|
|
8515
|
-
"trash-bags": "1605600659908-0ef719419d41",
|
|
8516
|
-
essentials: "1542838132-92c53300491e"
|
|
8517
|
-
};
|
|
8518
|
-
var photoFor4 = (slug) => seedImage("grocery", PHOTO4[slug] ?? "1542838132-92c53300491e");
|
|
8426
|
+
var photoFor4 = (slug) => seedImage("grocery", slug);
|
|
8519
8427
|
function seedGrocery(registry) {
|
|
8520
8428
|
const businessId = "bus_freshmart";
|
|
8521
8429
|
const business = {
|
|
@@ -8778,23 +8686,7 @@ function seedGrocery(registry) {
|
|
|
8778
8686
|
|
|
8779
8687
|
// src/mock/seeds/fashion.ts
|
|
8780
8688
|
var ISO8 = "2026-01-01T00:00:00.000Z";
|
|
8781
|
-
var
|
|
8782
|
-
"heavyweight-hoodie-charcoal": "1556905055-8f358a7a47b2",
|
|
8783
|
-
"heavyweight-hoodie-cream": "1576566588028-4147f3842f27",
|
|
8784
|
-
"heavyweight-hoodie-cobalt": "1542838686-37da4a9fd1b3",
|
|
8785
|
-
"studio-tee-black": "1521572163474-6864f9cf17ab",
|
|
8786
|
-
"studio-tee-natural": "1485518882345-15568b007407",
|
|
8787
|
-
"graphic-tee-frx-mark": "1521223890158-f9f7c3d5d504",
|
|
8788
|
-
"carbon-bomber": "1591047139829-d91aecb6caea",
|
|
8789
|
-
"field-jacket-olive": "1564859228273-274232fdb516",
|
|
8790
|
-
"wide-leg-trouser": "1542272604-787c3835535d",
|
|
8791
|
-
"track-pant-charcoal": "1604176354204-9268737828e4",
|
|
8792
|
-
"studio-cap": "1620799140408-edc6dcb6d633",
|
|
8793
|
-
"tote-natural": "1591195853828-11db59a44f6b",
|
|
8794
|
-
"knit-beanie": "1542838132-92c53300491e",
|
|
8795
|
-
"studio-sock-3pack": "1602810318383-e386cc2a3ccf"
|
|
8796
|
-
};
|
|
8797
|
-
var photoFor5 = (slug) => seedImage("fashion", PHOTO5[slug] ?? "1556905055-8f358a7a47b2");
|
|
8689
|
+
var photoFor5 = (slug) => seedImage("fashion", slug);
|
|
8798
8690
|
var SIZES = ["XS", "S", "M", "L", "XL", "2XL"];
|
|
8799
8691
|
function seedFashion(registry) {
|
|
8800
8692
|
const businessId = "bus_studio_frx";
|
|
@@ -8809,7 +8701,7 @@ function seedFashion(registry) {
|
|
|
8809
8701
|
default_address: "Osu Oxford Street, Accra",
|
|
8810
8702
|
default_offers_table_service: false,
|
|
8811
8703
|
default_accepts_online_orders: true,
|
|
8812
|
-
image: seedImage("fashion", "
|
|
8704
|
+
image: seedImage("fashion", "business-hero"),
|
|
8813
8705
|
status: "active",
|
|
8814
8706
|
created_at: ISO8,
|
|
8815
8707
|
updated_at: ISO8,
|
|
@@ -9211,6 +9103,553 @@ function seedFashion(registry) {
|
|
|
9211
9103
|
return { businessId };
|
|
9212
9104
|
}
|
|
9213
9105
|
|
|
9106
|
+
// src/mock/seeds/pharmacy.ts
|
|
9107
|
+
var ISO9 = "2026-01-01T00:00:00.000Z";
|
|
9108
|
+
var photoFor6 = (slug) => seedImage("pharmacy", slug);
|
|
9109
|
+
function seedPharmacy(registry) {
|
|
9110
|
+
const businessId = "bus_wellspring_pharmacy";
|
|
9111
|
+
const business = {
|
|
9112
|
+
id: businessId,
|
|
9113
|
+
name: "Wellspring Pharmacy",
|
|
9114
|
+
handle: "wellspring",
|
|
9115
|
+
business_type: "retail",
|
|
9116
|
+
email: "care@wellspringpharmacy.test",
|
|
9117
|
+
default_currency: "GHS",
|
|
9118
|
+
default_phone: "+233244778899",
|
|
9119
|
+
default_address: "5 Liberation Road, Ridge, Accra",
|
|
9120
|
+
default_offers_table_service: false,
|
|
9121
|
+
default_accepts_online_orders: true,
|
|
9122
|
+
image: photoFor6("business-hero"),
|
|
9123
|
+
status: "active",
|
|
9124
|
+
created_at: ISO9,
|
|
9125
|
+
updated_at: ISO9,
|
|
9126
|
+
created_by: "seed",
|
|
9127
|
+
preferences: {
|
|
9128
|
+
theme: "clinical",
|
|
9129
|
+
tagline: "Trusted care, delivered same-day",
|
|
9130
|
+
checkout: { allow_guest: true }
|
|
9131
|
+
},
|
|
9132
|
+
is_online_only: false,
|
|
9133
|
+
enabled_payment_types: ["card", "mobile_money", "cash"],
|
|
9134
|
+
default_location_settings: {},
|
|
9135
|
+
country_code: "GH",
|
|
9136
|
+
timezone: "Africa/Accra"
|
|
9137
|
+
};
|
|
9138
|
+
registry.businesses.put(businessId, business);
|
|
9139
|
+
const categories = [
|
|
9140
|
+
{ slug: "pain-relief", name: "Pain Relief" },
|
|
9141
|
+
{ slug: "cold-flu", name: "Cold & Flu" },
|
|
9142
|
+
{ slug: "vitamins", name: "Vitamins & Supplements" },
|
|
9143
|
+
{ slug: "first-aid", name: "First Aid" },
|
|
9144
|
+
{ slug: "personal-care", name: "Personal Care" },
|
|
9145
|
+
{ slug: "devices", name: "Medical Devices" },
|
|
9146
|
+
{ slug: "baby", name: "Baby & Mother" }
|
|
9147
|
+
];
|
|
9148
|
+
const catIds = /* @__PURE__ */ new Map();
|
|
9149
|
+
for (const c of categories) {
|
|
9150
|
+
const id = `cat_${c.slug}`;
|
|
9151
|
+
catIds.set(c.slug, id);
|
|
9152
|
+
const cat = {
|
|
9153
|
+
id,
|
|
9154
|
+
business_id: businessId,
|
|
9155
|
+
name: c.name,
|
|
9156
|
+
slug: c.slug,
|
|
9157
|
+
description: `Wellspring \u2014 ${c.name}`,
|
|
9158
|
+
product_ids: [],
|
|
9159
|
+
display_order: 0,
|
|
9160
|
+
is_active: true,
|
|
9161
|
+
created_at: ISO9,
|
|
9162
|
+
updated_at: ISO9
|
|
9163
|
+
};
|
|
9164
|
+
registry.categories.put(id, cat);
|
|
9165
|
+
}
|
|
9166
|
+
function field(productSlug, f) {
|
|
9167
|
+
return {
|
|
9168
|
+
id: f.id ?? `fld_${productSlug}_${f.slug}`,
|
|
9169
|
+
product_id: `prod_${productSlug}`,
|
|
9170
|
+
...f
|
|
9171
|
+
};
|
|
9172
|
+
}
|
|
9173
|
+
const products = [
|
|
9174
|
+
// Pain Relief
|
|
9175
|
+
{
|
|
9176
|
+
slug: "paracetamol",
|
|
9177
|
+
name: "Paracetamol 500mg (24 tablets)",
|
|
9178
|
+
price: "12.00",
|
|
9179
|
+
category: "pain-relief",
|
|
9180
|
+
description: "Fever and mild-to-moderate pain. Adults and children over 12.",
|
|
9181
|
+
tags: ["otc", "analgesic"],
|
|
9182
|
+
inputs: [
|
|
9183
|
+
field("paracetamol", {
|
|
9184
|
+
slug: "age_confirmation",
|
|
9185
|
+
name: "Age confirmation",
|
|
9186
|
+
field_type: "checkbox",
|
|
9187
|
+
is_required: true,
|
|
9188
|
+
display_order: 0,
|
|
9189
|
+
help_text: "I confirm this product is for someone aged 12 or over."
|
|
9190
|
+
})
|
|
9191
|
+
]
|
|
9192
|
+
},
|
|
9193
|
+
{ 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"] },
|
|
9194
|
+
{ 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"] },
|
|
9195
|
+
{ slug: "allergy-relief", name: "Cetirizine 10mg (10 tablets)", price: "22.00", category: "pain-relief", description: "Non-drowsy antihistamine for seasonal allergies.", tags: ["otc", "antihistamine"] },
|
|
9196
|
+
// Cold & Flu
|
|
9197
|
+
{ 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"] },
|
|
9198
|
+
{ slug: "throat-lozenges", name: "Honey-Lemon Throat Lozenges (24)", price: "18.00", category: "cold-flu", description: "Soothes sore throat and irritation.", tags: ["otc", "lozenge"] },
|
|
9199
|
+
{ slug: "decongestant", name: "Nasal Decongestant Spray (10ml)", price: "28.00", category: "cold-flu", description: "Fast-acting relief for blocked nasal passages.", tags: ["otc", "spray"] },
|
|
9200
|
+
// Vitamins & Supplements
|
|
9201
|
+
{ 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"] },
|
|
9202
|
+
{ slug: "vitamin-c", name: "Vitamin C 1000mg (90 tablets)", price: "65.00", category: "vitamins", description: "Immune-support antioxidant. Time-released.", tags: ["supplement", "immune"] },
|
|
9203
|
+
{ 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"] },
|
|
9204
|
+
{ 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"] },
|
|
9205
|
+
{ slug: "probiotics", name: "Probiotic 10-Strain (30 capsules)", price: "95.00", category: "vitamins", description: "Digestive and immune support.", tags: ["supplement", "digestive"] },
|
|
9206
|
+
// First Aid
|
|
9207
|
+
{ 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"] },
|
|
9208
|
+
{ slug: "plasters", name: "Assorted Plasters (40 pack)", price: "22.00", category: "first-aid", description: "Waterproof adhesive bandages in five sizes.", tags: ["first-aid"] },
|
|
9209
|
+
{ slug: "antiseptic", name: "Antiseptic Cream (30g)", price: "18.00", category: "first-aid", description: "For cuts, grazes, and minor skin infections.", tags: ["first-aid", "cream"] },
|
|
9210
|
+
{ 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"] },
|
|
9211
|
+
// Personal Care
|
|
9212
|
+
{ 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"] },
|
|
9213
|
+
{ slug: "face-mask", name: "Surgical Face Masks (50 pack)", price: "45.00", category: "personal-care", description: "3-ply earloop masks. Disposable.", tags: ["hygiene", "ppe"] },
|
|
9214
|
+
{ 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"] },
|
|
9215
|
+
// Medical Devices
|
|
9216
|
+
{ slug: "thermometer", name: "Digital Thermometer", price: "65.00", category: "devices", description: "Fast oral / underarm reading in 10 seconds. Auto-shutoff.", tags: ["device", "essential"] },
|
|
9217
|
+
{
|
|
9218
|
+
slug: "blood-pressure-monitor",
|
|
9219
|
+
name: "Automatic BP Monitor",
|
|
9220
|
+
price: "320.00",
|
|
9221
|
+
category: "devices",
|
|
9222
|
+
description: "Upper-arm cuff with memory for two users. Irregular heartbeat detection.",
|
|
9223
|
+
tags: ["device", "premium"],
|
|
9224
|
+
inputs: [
|
|
9225
|
+
field("blood-pressure-monitor", {
|
|
9226
|
+
slug: "arm_size",
|
|
9227
|
+
name: "Arm circumference",
|
|
9228
|
+
field_type: "select",
|
|
9229
|
+
options: ["Standard (22\u201332 cm)", "Large (32\u201342 cm)"],
|
|
9230
|
+
is_required: true,
|
|
9231
|
+
display_order: 0,
|
|
9232
|
+
help_text: "Pick the cuff that fits \u2014 wrong size gives inaccurate readings."
|
|
9233
|
+
})
|
|
9234
|
+
]
|
|
9235
|
+
},
|
|
9236
|
+
{ 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"] },
|
|
9237
|
+
{ slug: "pulse-oximeter", name: "Fingertip Pulse Oximeter", price: "145.00", category: "devices", description: "SpO2 + heart-rate reading in under 10 seconds.", tags: ["device"] },
|
|
9238
|
+
// Baby & Mother
|
|
9239
|
+
{
|
|
9240
|
+
slug: "baby-formula",
|
|
9241
|
+
name: "Infant Formula Stage 1 (400g)",
|
|
9242
|
+
price: "150.00",
|
|
9243
|
+
category: "baby",
|
|
9244
|
+
description: "0\u20136 months. Iron-fortified, with prebiotics.",
|
|
9245
|
+
tags: ["baby", "nutrition"],
|
|
9246
|
+
inputs: [
|
|
9247
|
+
field("baby-formula", {
|
|
9248
|
+
slug: "baby_dob",
|
|
9249
|
+
name: "Baby's date of birth",
|
|
9250
|
+
field_type: "date",
|
|
9251
|
+
is_required: true,
|
|
9252
|
+
display_order: 0,
|
|
9253
|
+
help_text: "Confirms stage 1 is the right formula for your baby's age."
|
|
9254
|
+
}),
|
|
9255
|
+
field("baby-formula", {
|
|
9256
|
+
slug: "allergies",
|
|
9257
|
+
name: "Known allergies or intolerances",
|
|
9258
|
+
field_type: "textarea",
|
|
9259
|
+
is_required: false,
|
|
9260
|
+
display_order: 1,
|
|
9261
|
+
placeholder: "e.g. lactose, soy. Leave blank if none.",
|
|
9262
|
+
semantic_kind: "allergen"
|
|
9263
|
+
})
|
|
9264
|
+
]
|
|
9265
|
+
},
|
|
9266
|
+
{ slug: "baby-wipes", name: "Sensitive Baby Wipes (72 pack)", price: "28.00", category: "baby", description: "Alcohol-free, fragrance-free. Dermatologist-tested.", tags: ["baby", "hygiene"] },
|
|
9267
|
+
// ── Prescription medications (Rx; require a verified prescription) ─
|
|
9268
|
+
{
|
|
9269
|
+
slug: "amoxicillin-rx",
|
|
9270
|
+
name: "Amoxicillin 500mg (Rx)",
|
|
9271
|
+
price: "65.00",
|
|
9272
|
+
category: "pain-relief",
|
|
9273
|
+
description: "Broad-spectrum antibiotic. Prescription required \u2014 our pharmacist will verify before dispensing.",
|
|
9274
|
+
tags: ["prescription", "antibiotic"],
|
|
9275
|
+
requiresPrescription: true,
|
|
9276
|
+
inputs: [
|
|
9277
|
+
field("amoxicillin-rx", {
|
|
9278
|
+
slug: "prescription_upload",
|
|
9279
|
+
name: "Upload prescription",
|
|
9280
|
+
field_type: "file",
|
|
9281
|
+
is_required: true,
|
|
9282
|
+
display_order: 0,
|
|
9283
|
+
help_text: "PDF or photo of your doctor's prescription (max 10 MB).",
|
|
9284
|
+
validation: { accepted_formats: ["pdf", "jpg", "jpeg", "png", "heic"], max_size_mb: 10 }
|
|
9285
|
+
}),
|
|
9286
|
+
field("amoxicillin-rx", {
|
|
9287
|
+
slug: "patient_dob",
|
|
9288
|
+
name: "Patient date of birth",
|
|
9289
|
+
field_type: "date",
|
|
9290
|
+
is_required: true,
|
|
9291
|
+
display_order: 1
|
|
9292
|
+
}),
|
|
9293
|
+
field("amoxicillin-rx", {
|
|
9294
|
+
slug: "consent",
|
|
9295
|
+
name: "I confirm this prescription is genuine and issued for the named patient",
|
|
9296
|
+
field_type: "checkbox",
|
|
9297
|
+
is_required: true,
|
|
9298
|
+
display_order: 2,
|
|
9299
|
+
semantic_kind: "consent"
|
|
9300
|
+
})
|
|
9301
|
+
]
|
|
9302
|
+
},
|
|
9303
|
+
{
|
|
9304
|
+
slug: "insulin-rx",
|
|
9305
|
+
name: "Insulin Glargine 100u/ml (Rx)",
|
|
9306
|
+
price: "240.00",
|
|
9307
|
+
category: "devices",
|
|
9308
|
+
description: "Long-acting basal insulin. Cold-chain delivery; prescription required.",
|
|
9309
|
+
tags: ["prescription", "diabetes", "cold-chain"],
|
|
9310
|
+
requiresPrescription: true,
|
|
9311
|
+
inputs: [
|
|
9312
|
+
field("insulin-rx", {
|
|
9313
|
+
slug: "prescription_upload",
|
|
9314
|
+
name: "Upload prescription",
|
|
9315
|
+
field_type: "file",
|
|
9316
|
+
is_required: true,
|
|
9317
|
+
display_order: 0,
|
|
9318
|
+
help_text: "PDF or photo of your doctor's prescription (max 10 MB).",
|
|
9319
|
+
validation: { accepted_formats: ["pdf", "jpg", "jpeg", "png", "heic"], max_size_mb: 10 }
|
|
9320
|
+
}),
|
|
9321
|
+
field("insulin-rx", {
|
|
9322
|
+
slug: "delivery_temp_acknowledgement",
|
|
9323
|
+
name: "I'll be available to receive a cold-chain delivery",
|
|
9324
|
+
field_type: "checkbox",
|
|
9325
|
+
is_required: true,
|
|
9326
|
+
display_order: 1,
|
|
9327
|
+
help_text: "Insulin must be refrigerated. Delivery driver will hand over directly \u2014 not leave at door.",
|
|
9328
|
+
semantic_kind: "consent"
|
|
9329
|
+
})
|
|
9330
|
+
]
|
|
9331
|
+
},
|
|
9332
|
+
{
|
|
9333
|
+
slug: "vaccination-consent",
|
|
9334
|
+
name: "Flu Shot \u2014 At-Pharmacy",
|
|
9335
|
+
price: "80.00",
|
|
9336
|
+
category: "personal-care",
|
|
9337
|
+
description: "Pharmacist-administered seasonal influenza vaccine. Walk-in or book a slot.",
|
|
9338
|
+
tags: ["service", "vaccination"],
|
|
9339
|
+
inputs: [
|
|
9340
|
+
field("vaccination-consent", {
|
|
9341
|
+
slug: "patient_name",
|
|
9342
|
+
name: "Patient name",
|
|
9343
|
+
field_type: "text",
|
|
9344
|
+
is_required: true,
|
|
9345
|
+
display_order: 0
|
|
9346
|
+
}),
|
|
9347
|
+
field("vaccination-consent", {
|
|
9348
|
+
slug: "patient_dob",
|
|
9349
|
+
name: "Date of birth",
|
|
9350
|
+
field_type: "date",
|
|
9351
|
+
is_required: true,
|
|
9352
|
+
display_order: 1
|
|
9353
|
+
}),
|
|
9354
|
+
field("vaccination-consent", {
|
|
9355
|
+
slug: "allergies",
|
|
9356
|
+
name: "Known allergies or reactions to past vaccines",
|
|
9357
|
+
field_type: "textarea",
|
|
9358
|
+
is_required: false,
|
|
9359
|
+
display_order: 2,
|
|
9360
|
+
placeholder: "Egg, latex, prior vaccine reactions, etc. Leave blank if none.",
|
|
9361
|
+
semantic_kind: "allergen"
|
|
9362
|
+
}),
|
|
9363
|
+
field("vaccination-consent", {
|
|
9364
|
+
slug: "consent_signature",
|
|
9365
|
+
name: "Signed consent",
|
|
9366
|
+
field_type: "signature",
|
|
9367
|
+
is_required: true,
|
|
9368
|
+
display_order: 3,
|
|
9369
|
+
help_text: "Required by our administering pharmacist before vaccination.",
|
|
9370
|
+
semantic_kind: "consent"
|
|
9371
|
+
})
|
|
9372
|
+
]
|
|
9373
|
+
}
|
|
9374
|
+
];
|
|
9375
|
+
for (const p of products) {
|
|
9376
|
+
const id = `prod_${p.slug}`;
|
|
9377
|
+
const catId = catIds.get(p.category);
|
|
9378
|
+
const product = {
|
|
9379
|
+
id,
|
|
9380
|
+
business_id: businessId,
|
|
9381
|
+
name: p.name,
|
|
9382
|
+
slug: p.slug,
|
|
9383
|
+
description: p.description,
|
|
9384
|
+
product_type: "product",
|
|
9385
|
+
base_price: p.price,
|
|
9386
|
+
currency: "GHS",
|
|
9387
|
+
image: photoFor6(p.slug),
|
|
9388
|
+
images: [photoFor6(p.slug)],
|
|
9389
|
+
is_available: true,
|
|
9390
|
+
category_ids: [catId],
|
|
9391
|
+
collection_ids: [],
|
|
9392
|
+
add_on_ids: [],
|
|
9393
|
+
variant_ids: [],
|
|
9394
|
+
tags: p.tags ?? [],
|
|
9395
|
+
input_fields: p.inputs,
|
|
9396
|
+
metadata: p.requiresPrescription ? { requires_prescription: true } : void 0,
|
|
9397
|
+
created_at: ISO9,
|
|
9398
|
+
updated_at: ISO9
|
|
9399
|
+
};
|
|
9400
|
+
registry.products.put(id, product);
|
|
9401
|
+
const cat = registry.categories.get(catId);
|
|
9402
|
+
cat.product_ids.push(id);
|
|
9403
|
+
registry.categories.put(catId, cat);
|
|
9404
|
+
}
|
|
9405
|
+
const essentials = {
|
|
9406
|
+
id: "col_essentials",
|
|
9407
|
+
business_id: businessId,
|
|
9408
|
+
name: "Home Essentials",
|
|
9409
|
+
slug: "essentials",
|
|
9410
|
+
description: "Stock up your medicine cabinet.",
|
|
9411
|
+
product_ids: [
|
|
9412
|
+
"prod_paracetamol",
|
|
9413
|
+
"prod_first-aid-kit",
|
|
9414
|
+
"prod_thermometer",
|
|
9415
|
+
"prod_hand-sanitizer",
|
|
9416
|
+
"prod_multivitamin"
|
|
9417
|
+
],
|
|
9418
|
+
is_active: true,
|
|
9419
|
+
created_at: ISO9,
|
|
9420
|
+
updated_at: ISO9
|
|
9421
|
+
};
|
|
9422
|
+
registry.collections.put(essentials.id, essentials);
|
|
9423
|
+
for (const pid of essentials.product_ids) {
|
|
9424
|
+
const p = registry.products.get(pid);
|
|
9425
|
+
if (p) {
|
|
9426
|
+
p.collection_ids.push(essentials.id);
|
|
9427
|
+
registry.products.put(pid, p);
|
|
9428
|
+
}
|
|
9429
|
+
}
|
|
9430
|
+
const packAxis = {
|
|
9431
|
+
id: "axis_pack_size",
|
|
9432
|
+
business_id: businessId,
|
|
9433
|
+
product_id: "prod_paracetamol",
|
|
9434
|
+
name: "Pack size",
|
|
9435
|
+
display_order: 0,
|
|
9436
|
+
affects_recipe: false,
|
|
9437
|
+
values: [
|
|
9438
|
+
{ id: "axv_pack_24", name: "24 tablets", display: 0 },
|
|
9439
|
+
{ id: "axv_pack_48", name: "48 tablets", display: 1 },
|
|
9440
|
+
{ id: "axv_pack_100", name: "100 tablets (family)", display: 2 }
|
|
9441
|
+
].map((v) => ({
|
|
9442
|
+
id: v.id,
|
|
9443
|
+
business_id: businessId,
|
|
9444
|
+
axis_id: "axis_pack_size",
|
|
9445
|
+
name: v.name,
|
|
9446
|
+
display_order: v.display,
|
|
9447
|
+
created_at: ISO9,
|
|
9448
|
+
updated_at: ISO9
|
|
9449
|
+
})),
|
|
9450
|
+
created_at: ISO9,
|
|
9451
|
+
updated_at: ISO9
|
|
9452
|
+
};
|
|
9453
|
+
registry.variantAxes.put(packAxis.id, packAxis);
|
|
9454
|
+
const packAdj = { pack_24: "0.00", pack_48: "8.00", pack_100: "18.00" };
|
|
9455
|
+
const paracetamolVariantIds = [];
|
|
9456
|
+
let firstVariant = true;
|
|
9457
|
+
for (const pk of packAxis.values) {
|
|
9458
|
+
const key = pk.id.replace("axv_pack_", "pack_");
|
|
9459
|
+
const id = `var_paracetamol_${key.replace("pack_", "")}`;
|
|
9460
|
+
const variant = {
|
|
9461
|
+
id,
|
|
9462
|
+
product_id: "prod_paracetamol",
|
|
9463
|
+
business_id: businessId,
|
|
9464
|
+
name: pk.name,
|
|
9465
|
+
sku: `PCM-${key.toUpperCase()}`,
|
|
9466
|
+
price_adjustment: packAdj[key] ?? "0.00",
|
|
9467
|
+
component_multiplier: "1.00",
|
|
9468
|
+
is_default: firstVariant,
|
|
9469
|
+
is_active: true,
|
|
9470
|
+
axis_value_ids: [pk.id],
|
|
9471
|
+
created_at: ISO9,
|
|
9472
|
+
updated_at: ISO9
|
|
9473
|
+
};
|
|
9474
|
+
registry.variants.put(id, variant);
|
|
9475
|
+
paracetamolVariantIds.push(id);
|
|
9476
|
+
firstVariant = false;
|
|
9477
|
+
}
|
|
9478
|
+
const paracetamol = registry.products.get("prod_paracetamol");
|
|
9479
|
+
if (paracetamol) {
|
|
9480
|
+
paracetamol.variant_ids = paracetamolVariantIds;
|
|
9481
|
+
registry.products.put(paracetamol.id, paracetamol);
|
|
9482
|
+
}
|
|
9483
|
+
const formAddOn = {
|
|
9484
|
+
id: "addon_form",
|
|
9485
|
+
business_id: businessId,
|
|
9486
|
+
name: "Format",
|
|
9487
|
+
is_multiple_allowed: false,
|
|
9488
|
+
is_required: false,
|
|
9489
|
+
is_mutually_exclusive: true,
|
|
9490
|
+
min_selections: 0,
|
|
9491
|
+
max_selections: 1,
|
|
9492
|
+
created_at: ISO9,
|
|
9493
|
+
updated_at: ISO9,
|
|
9494
|
+
options: [
|
|
9495
|
+
{ 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 },
|
|
9496
|
+
{ 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 }
|
|
9497
|
+
]
|
|
9498
|
+
};
|
|
9499
|
+
registry.addOns.put(formAddOn.id, formAddOn);
|
|
9500
|
+
const medProductIds = ["prod_paracetamol", "prod_ibuprofen", "prod_aspirin", "prod_allergy-relief"];
|
|
9501
|
+
for (const pid of medProductIds) {
|
|
9502
|
+
registry.productAddOns.put(`${pid}:${formAddOn.id}`, { product_id: pid, add_on_id: formAddOn.id });
|
|
9503
|
+
const p = registry.products.get(pid);
|
|
9504
|
+
if (p) {
|
|
9505
|
+
p.add_on_ids.push(formAddOn.id);
|
|
9506
|
+
registry.products.put(pid, p);
|
|
9507
|
+
}
|
|
9508
|
+
}
|
|
9509
|
+
const services = [
|
|
9510
|
+
{
|
|
9511
|
+
id: "svc_bp_check",
|
|
9512
|
+
business_id: businessId,
|
|
9513
|
+
name: "Blood Pressure Check",
|
|
9514
|
+
description: "Free in-store BP reading with our pharmacist.",
|
|
9515
|
+
duration_minutes: 15,
|
|
9516
|
+
price: "0.00",
|
|
9517
|
+
is_available: true
|
|
9518
|
+
},
|
|
9519
|
+
{
|
|
9520
|
+
id: "svc_consultation",
|
|
9521
|
+
business_id: businessId,
|
|
9522
|
+
name: "Pharmacist Consultation",
|
|
9523
|
+
description: "15-minute one-on-one about medications, interactions, or symptoms.",
|
|
9524
|
+
duration_minutes: 15,
|
|
9525
|
+
price: "30.00",
|
|
9526
|
+
is_available: true
|
|
9527
|
+
},
|
|
9528
|
+
{
|
|
9529
|
+
id: "svc_prescription_refill",
|
|
9530
|
+
business_id: businessId,
|
|
9531
|
+
name: "Prescription Refill",
|
|
9532
|
+
description: "Upload your prescription; we prepare it for pickup or delivery same-day.",
|
|
9533
|
+
duration_minutes: 30,
|
|
9534
|
+
price: "0.00",
|
|
9535
|
+
is_available: true
|
|
9536
|
+
},
|
|
9537
|
+
{
|
|
9538
|
+
id: "svc_vaccination",
|
|
9539
|
+
business_id: businessId,
|
|
9540
|
+
name: "Vaccination (Flu, Tetanus)",
|
|
9541
|
+
description: "Walk-in or by appointment. Pharmacist-administered.",
|
|
9542
|
+
duration_minutes: 20,
|
|
9543
|
+
price: "80.00",
|
|
9544
|
+
is_available: true
|
|
9545
|
+
}
|
|
9546
|
+
];
|
|
9547
|
+
for (const s of services) registry.services.put(s.id, s);
|
|
9548
|
+
const tags = [
|
|
9549
|
+
{ id: "tag_otc", business_id: businessId, name: "OTC", slug: "otc", color: "#16a34a", sort_order: 0, usage_count: 11, created_at: ISO9, updated_at: ISO9 },
|
|
9550
|
+
{ id: "tag_essential", business_id: businessId, name: "Essential", slug: "essential", color: "#2563eb", sort_order: 1, usage_count: 2, created_at: ISO9, updated_at: ISO9 },
|
|
9551
|
+
{ id: "tag_prescription", business_id: businessId, name: "Prescription", slug: "prescription", color: "#dc2626", sort_order: 2, usage_count: 0, created_at: ISO9, updated_at: ISO9 }
|
|
9552
|
+
];
|
|
9553
|
+
for (const t of tags) registry.tags.put(t.id, t);
|
|
9554
|
+
const medication = {
|
|
9555
|
+
id: "tax_medication",
|
|
9556
|
+
business_id: businessId,
|
|
9557
|
+
name: "Medication",
|
|
9558
|
+
slug: "medication",
|
|
9559
|
+
path: ["Health", "Medication"],
|
|
9560
|
+
attribute_template_ids: ["attr_active_ingredient", "attr_dosage"],
|
|
9561
|
+
created_at: ISO9,
|
|
9562
|
+
updated_at: ISO9
|
|
9563
|
+
};
|
|
9564
|
+
registry.taxonomies.put(medication.id, medication);
|
|
9565
|
+
const attrs = [
|
|
9566
|
+
{
|
|
9567
|
+
id: "attr_active_ingredient",
|
|
9568
|
+
business_id: businessId,
|
|
9569
|
+
namespace: "core",
|
|
9570
|
+
name: "Active ingredient",
|
|
9571
|
+
slug: "active-ingredient",
|
|
9572
|
+
attribute_type: "text",
|
|
9573
|
+
is_required: false,
|
|
9574
|
+
is_filterable: true,
|
|
9575
|
+
visibility: "public",
|
|
9576
|
+
display_order: 0,
|
|
9577
|
+
applies_to: "product",
|
|
9578
|
+
created_at: ISO9,
|
|
9579
|
+
updated_at: ISO9
|
|
9580
|
+
},
|
|
9581
|
+
{
|
|
9582
|
+
id: "attr_dosage",
|
|
9583
|
+
business_id: businessId,
|
|
9584
|
+
namespace: "core",
|
|
9585
|
+
name: "Dosage form",
|
|
9586
|
+
slug: "dosage-form",
|
|
9587
|
+
attribute_type: "select",
|
|
9588
|
+
options: ["tablet", "capsule", "syrup", "spray", "cream", "drops"],
|
|
9589
|
+
is_required: false,
|
|
9590
|
+
is_filterable: true,
|
|
9591
|
+
visibility: "public",
|
|
9592
|
+
display_order: 1,
|
|
9593
|
+
applies_to: "product",
|
|
9594
|
+
created_at: ISO9,
|
|
9595
|
+
updated_at: ISO9
|
|
9596
|
+
},
|
|
9597
|
+
{
|
|
9598
|
+
id: "attr_prescription_required",
|
|
9599
|
+
business_id: businessId,
|
|
9600
|
+
namespace: "core",
|
|
9601
|
+
name: "Prescription required",
|
|
9602
|
+
slug: "prescription-required",
|
|
9603
|
+
attribute_type: "boolean",
|
|
9604
|
+
is_required: false,
|
|
9605
|
+
is_filterable: true,
|
|
9606
|
+
visibility: "public",
|
|
9607
|
+
display_order: 2,
|
|
9608
|
+
applies_to: "product",
|
|
9609
|
+
created_at: ISO9,
|
|
9610
|
+
updated_at: ISO9
|
|
9611
|
+
}
|
|
9612
|
+
];
|
|
9613
|
+
for (const a of attrs) registry.attributeDefs.put(a.id, a);
|
|
9614
|
+
const articles = [
|
|
9615
|
+
{
|
|
9616
|
+
id: "kb_prescription",
|
|
9617
|
+
business_id: businessId,
|
|
9618
|
+
title: "Prescription handling",
|
|
9619
|
+
slug: "prescription-handling",
|
|
9620
|
+
content: "Upload prescriptions through the prescription-refill service. Our pharmacist verifies before dispensing; same-day pickup or delivery within Accra.",
|
|
9621
|
+
category: "logistics",
|
|
9622
|
+
tags: ["prescription", "delivery"],
|
|
9623
|
+
created_at: ISO9,
|
|
9624
|
+
updated_at: ISO9
|
|
9625
|
+
},
|
|
9626
|
+
{
|
|
9627
|
+
id: "kb_returns",
|
|
9628
|
+
business_id: businessId,
|
|
9629
|
+
title: "Returns & exchanges",
|
|
9630
|
+
slug: "returns",
|
|
9631
|
+
content: "Sealed OTC products may be returned within 7 days with receipt. Opened products, prescriptions, and refrigerated items are non-returnable for safety reasons.",
|
|
9632
|
+
category: "policies",
|
|
9633
|
+
tags: ["returns"],
|
|
9634
|
+
created_at: ISO9,
|
|
9635
|
+
updated_at: ISO9
|
|
9636
|
+
},
|
|
9637
|
+
{
|
|
9638
|
+
id: "kb_consultation",
|
|
9639
|
+
business_id: businessId,
|
|
9640
|
+
title: "Pharmacist consultations",
|
|
9641
|
+
slug: "consultations",
|
|
9642
|
+
content: "15-minute pharmacist appointments cover medication review, side-effect questions, OTC selection, and symptom triage. Book through the services menu.",
|
|
9643
|
+
category: "services",
|
|
9644
|
+
tags: ["consultation"],
|
|
9645
|
+
created_at: ISO9,
|
|
9646
|
+
updated_at: ISO9
|
|
9647
|
+
}
|
|
9648
|
+
];
|
|
9649
|
+
for (const a of articles) registry.knowledgeArticles.put(a.id, a);
|
|
9650
|
+
return { businessId };
|
|
9651
|
+
}
|
|
9652
|
+
|
|
9214
9653
|
// src/mock/seeds/registry.ts
|
|
9215
9654
|
var SEEDS = {
|
|
9216
9655
|
default: seedDefault,
|
|
@@ -9220,7 +9659,8 @@ var SEEDS = {
|
|
|
9220
9659
|
retail: seedRetail,
|
|
9221
9660
|
services: seedServices,
|
|
9222
9661
|
grocery: seedGrocery,
|
|
9223
|
-
fashion: seedFashion
|
|
9662
|
+
fashion: seedFashion,
|
|
9663
|
+
pharmacy: seedPharmacy
|
|
9224
9664
|
};
|
|
9225
9665
|
function applySeed(registry, name) {
|
|
9226
9666
|
const fn = SEEDS[name];
|