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