@websolutespa/bom-mixer-checkout 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/discount-DV1XgN08.js +12 -0
- package/dist/{discount-cVYAPi8A.js.map → discount-DV1XgN08.js.map} +1 -1
- package/dist/exports/server.d.ts +1 -10
- package/dist/exports/server.d.ts.map +1 -1
- package/dist/exports/server.js +33 -88
- package/dist/exports/server.js.map +1 -1
- package/dist/index.d.ts +10 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +830 -1850
- package/dist/index.js.map +1 -1
- package/dist/{retailer-DdroKqxH.d.ts → retailer-DrfVjYXU.d.ts} +4 -13
- package/dist/retailer-DrfVjYXU.d.ts.map +1 -0
- package/package.json +22 -18
- package/src/checkout/checkout-delivery.tsx +119 -119
- package/src/checkout/checkout-payment.tsx +118 -118
- package/src/checkout/checkout-review.tsx +245 -245
- package/src/hooks/useCart/useCart.test.tsx +103 -102
- package/src/hooks/useCart/useCart.tsx +156 -156
- package/src/hooks/useCheckout/useCheckout.test.tsx +54 -53
- package/src/models/checkout/checkout.service.ts +317 -317
- package/src/order/order-summary.tsx +73 -73
- package/dist/discount-cVYAPi8A.js +0 -12
- package/dist/retailer-DdroKqxH.d.ts.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @websolutespa/bom-mixer-checkout
|
|
2
2
|
|
|
3
|
+
## 3.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 3f7c21b: - Payload 3.91.0 and Next.js 16.4.2 (React 19.2.9): peer dependencies are now ranges, `payload` / `@payloadcms/*` `^3.91.0`, `next` `^16.3.3`, `react` / `react-dom` `^19.2.1`
|
|
8
|
+
- payload-plugin-bowl: the mixer context is built only for reads by an authenticated user (payload 3.90+ resolves the jwt user with the request query, populating tenants before `req.user` is set); email options typed with payload `SendEmailOptions`, no direct nodemailer dependency
|
|
9
|
+
- payload-plugin-storage: `AZURE_STORAGE_CONTAINER_ACCESS` (`private` default since payload 3.90, `blob`, `container`) for containers created by the plugin
|
|
10
|
+
- mixer web: `images.qualities` includes `IMAGE_QUALITY` (next 16 defaults to `[75]`)
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- cef3bd8: - bom-mixer-emails: @react-email/components 1.0.12 and @react-email/render 2.1.1 (react 19); `renderEmail` is now async and returns `Promise<string>`
|
|
15
|
+
- payload-plugin-bowl-llm: openai 7.42.0 (zod 4), @modelcontextprotocol/sdk 1.32.1
|
|
16
|
+
- bom-cli: openai 7.42.0 client (`chat.completions`, `completions`)
|
|
17
|
+
- sonner 2.0.8
|
|
18
|
+
- 12b6e2f: - test: replace the jest presets with shared vitest configurations, `@websolutespa/test/vitest` (`defineNodeConfig`, `defineDomConfig`, `definePayloadConfig`); drop jest dependencies
|
|
19
|
+
- declare every imported package and script binary in the package that uses it (no more reliance on hoisting), drop unused dependencies
|
|
20
|
+
- bom-mixer-checkout: `useCart.add` no longer mutates the previous cart state
|
|
21
|
+
|
|
3
22
|
## 3.0.1
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/models/discount/discount.ts
|
|
2
|
+
let IDiscountType = /* @__PURE__ */ function(IDiscountType) {
|
|
3
|
+
IDiscountType["Percent"] = "percent";
|
|
4
|
+
IDiscountType["Fixed"] = "fixed";
|
|
5
|
+
IDiscountType["Shipping"] = "shipping";
|
|
6
|
+
IDiscountType["Custom"] = "custom";
|
|
7
|
+
return IDiscountType;
|
|
8
|
+
}({});
|
|
9
|
+
//#endregion
|
|
10
|
+
export { IDiscountType as t };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=discount-DV1XgN08.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discount-
|
|
1
|
+
{"version":3,"file":"discount-DV1XgN08.js","names":[],"sources":["../src/models/discount/discount.ts"],"sourcesContent":["import { ILocalizable } from '@websolutespa/bom-core';\r\n\r\nexport enum IDiscountType {\r\n Percent = 'percent',\r\n Fixed = 'fixed',\r\n Shipping = 'shipping',\r\n Custom = 'custom'\r\n}\r\n\r\nexport type IDiscount = {\r\n id: string;\r\n abstract?: ILocalizable;\r\n type: IDiscountType;\r\n value: number;\r\n validFrom?: Date | string;\r\n validTo?: Date | string;\r\n};\r\n"],"mappings":";AAEA,IAAY,gBAAL,yBAAA,eAAA;AACL,eAAA,aAAA;AACA,eAAA,WAAA;AACA,eAAA,cAAA;AACA,eAAA,YAAA;;KACD"}
|
package/dist/exports/server.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IArticle,
|
|
1
|
+
import { S as IArticle, _ as IDiscount, d as ICheckoutPartial, g as IPayment, p as ICheckoutPaymentRedirect, r as IOrderDetail, t as IRetailer, u as ICheckoutItem, x as ICartItem, y as IDelivery } from "../retailer-DrfVjYXU.js";
|
|
2
2
|
import { IEquatable, IPaginationResult, QueryParams } from "@websolutespa/bom-core";
|
|
3
3
|
import * as _websolutespa_bom_mixer_store_server0 from "@websolutespa/bom-mixer-store/server";
|
|
4
4
|
import { IEmailComponent, IEmailLayoutComponent } from "@websolutespa/bom-mixer-emails";
|
|
@@ -7,14 +7,12 @@ import { IEmailComponent, IEmailLayoutComponent } from "@websolutespa/bom-mixer-
|
|
|
7
7
|
declare function getArticles(params?: QueryParams): Promise<IArticle[]>;
|
|
8
8
|
declare function getArticle(id: IEquatable, params?: QueryParams): Promise<IArticle | undefined>;
|
|
9
9
|
declare function getArticlesPagination(params?: QueryParams): Promise<IPaginationResult<IArticle>>;
|
|
10
|
-
//# sourceMappingURL=article.service.d.ts.map
|
|
11
10
|
//#endregion
|
|
12
11
|
//#region src/models/cart/cart.service.d.ts
|
|
13
12
|
declare function getItems(items: ICartItem[], market: string, locale: string, user?: {
|
|
14
13
|
id: IEquatable;
|
|
15
14
|
}): Promise<ICheckoutItem[]>;
|
|
16
15
|
declare function checkoutItemsHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
|
|
17
|
-
//# sourceMappingURL=cart.service.d.ts.map
|
|
18
16
|
//#endregion
|
|
19
17
|
//#region src/models/checkout/checkout.service.d.ts
|
|
20
18
|
declare function checkoutInfoHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
|
|
@@ -32,14 +30,12 @@ declare function checkoutSubmitHandler<T>({
|
|
|
32
30
|
bcc?: string;
|
|
33
31
|
}): _websolutespa_bom_mixer_store_server0.IHandler<any>;
|
|
34
32
|
declare function paymentResult(checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPaymentRedirect>;
|
|
35
|
-
//# sourceMappingURL=checkout.service.d.ts.map
|
|
36
33
|
//#endregion
|
|
37
34
|
//#region src/models/delivery/delivery.service.d.ts
|
|
38
35
|
declare function getDeliveries(params?: QueryParams): Promise<IDelivery[]>;
|
|
39
36
|
declare function getDelivery(id: IEquatable, params?: QueryParams): Promise<IDelivery | undefined>;
|
|
40
37
|
declare function getDeliveriesPagination(params?: QueryParams): Promise<IPaginationResult<IDelivery>>;
|
|
41
38
|
declare function checkoutDeliveryHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
|
|
42
|
-
//# sourceMappingURL=delivery.service.d.ts.map
|
|
43
39
|
//#endregion
|
|
44
40
|
//#region src/models/discount/discount.service.d.ts
|
|
45
41
|
declare function getDiscounts(params?: QueryParams): Promise<IDiscount[]>;
|
|
@@ -47,27 +43,22 @@ declare function getDiscount(id: IEquatable, params?: QueryParams): Promise<IDis
|
|
|
47
43
|
declare function getDiscountsPagination(params?: QueryParams): Promise<IPaginationResult<IDiscount>>;
|
|
48
44
|
declare function setDiscountCode(discountCode: string, checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPartial>;
|
|
49
45
|
declare function checkoutDiscountHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
|
|
50
|
-
//# sourceMappingURL=discount.service.d.ts.map
|
|
51
46
|
//#endregion
|
|
52
47
|
//#region src/models/order/order.service.d.ts
|
|
53
48
|
declare function getOrders(params?: QueryParams): Promise<IOrderDetail[]>;
|
|
54
49
|
declare function getOrder(id: IEquatable, params?: QueryParams): Promise<IOrderDetail | undefined>;
|
|
55
|
-
//# sourceMappingURL=order.service.d.ts.map
|
|
56
50
|
//#endregion
|
|
57
51
|
//#region src/models/payment/payment.service.d.ts
|
|
58
52
|
declare function getPayments(params?: QueryParams): Promise<IPayment[]>;
|
|
59
53
|
declare function getPayment(id: IEquatable, params?: QueryParams): Promise<IPayment | undefined>;
|
|
60
54
|
declare function getPaymentsPagination(params?: QueryParams): Promise<IPaginationResult<IPayment>>;
|
|
61
55
|
declare function checkoutPaymentsHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
|
|
62
|
-
//# sourceMappingURL=payment.service.d.ts.map
|
|
63
56
|
//#endregion
|
|
64
57
|
//#region src/models/retailer/retailer.service.d.ts
|
|
65
58
|
declare function getRetailers(params?: QueryParams): Promise<IRetailer[]>;
|
|
66
59
|
declare function getRetailer(id: IEquatable, params?: QueryParams): Promise<IRetailer | undefined>;
|
|
67
60
|
declare function getRetailersPagination(params?: QueryParams): Promise<IPaginationResult<IRetailer>>;
|
|
68
61
|
declare function checkoutRetailersHandler(): _websolutespa_bom_mixer_store_server0.IHandler<any>;
|
|
69
|
-
//# sourceMappingURL=retailer.service.d.ts.map
|
|
70
|
-
|
|
71
62
|
//#endregion
|
|
72
63
|
export { checkoutDeliveryHandler, checkoutDiscountHandler, checkoutInfoHandler, checkoutItemsHandler, checkoutPaymentsHandler, checkoutRetailersHandler, checkoutSubmitHandler, checkoutUpdateHandler, getArticle, getArticles, getArticlesPagination, getDeliveries, getDeliveriesPagination, getDelivery, getDiscount, getDiscounts, getDiscountsPagination, getItems, getOrder, getOrders, getPayment, getPayments, getPaymentsPagination, getRetailer, getRetailers, getRetailersPagination, paymentResult, setDiscountCode, updateCheckout };
|
|
73
64
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","names":[],"sources":["../../src/models/article/article.service.ts","../../src/models/cart/cart.service.ts","../../src/models/checkout/checkout.service.ts","../../src/models/delivery/delivery.service.ts","../../src/models/discount/discount.service.ts","../../src/models/order/order.service.ts","../../src/models/payment/payment.service.ts","../../src/models/retailer/retailer.service.ts"],"
|
|
1
|
+
{"version":3,"file":"server.d.ts","names":[],"sources":["../../src/models/article/article.service.ts","../../src/models/cart/cart.service.ts","../../src/models/checkout/checkout.service.ts","../../src/models/delivery/delivery.service.ts","../../src/models/discount/discount.service.ts","../../src/models/order/order.service.ts","../../src/models/payment/payment.service.ts","../../src/models/retailer/retailer.service.ts"],"mappings":"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"}
|
package/dist/exports/server.js
CHANGED
|
@@ -1,26 +1,18 @@
|
|
|
1
|
-
import { IDiscountType } from "../discount-
|
|
1
|
+
import { t as IDiscountType } from "../discount-DV1XgN08.js";
|
|
2
2
|
import { StoreStrategy, remoteApiPost, storeStrategy } from "@websolutespa/bom-mixer-store";
|
|
3
3
|
import { apiHandler, getStore } from "@websolutespa/bom-mixer-store/server";
|
|
4
4
|
import { getCurrentUser } from "@websolutespa/bom-mixer-auth/server";
|
|
5
5
|
import { getCountries, getProvinces, getRegions, getRoutesForSchemas, getRoutesForTemplates } from "@websolutespa/bom-mixer-models/server";
|
|
6
|
-
|
|
7
6
|
//#region src/models/article/article.service.ts
|
|
8
7
|
async function getArticles(params = {}) {
|
|
9
|
-
|
|
10
|
-
const items = await store.article.findMany(params);
|
|
11
|
-
return items;
|
|
8
|
+
return await (await getStore()).article.findMany(params);
|
|
12
9
|
}
|
|
13
10
|
async function getArticle(id, params = {}) {
|
|
14
|
-
|
|
15
|
-
const item = await store.article.findOne(id, params);
|
|
16
|
-
return item;
|
|
11
|
+
return await (await getStore()).article.findOne(id, params);
|
|
17
12
|
}
|
|
18
13
|
async function getArticlesPagination(params = {}) {
|
|
19
|
-
|
|
20
|
-
const pagination = await store.article.findPaged(params);
|
|
21
|
-
return pagination;
|
|
14
|
+
return await (await getStore()).article.findPaged(params);
|
|
22
15
|
}
|
|
23
|
-
|
|
24
16
|
//#endregion
|
|
25
17
|
//#region src/models/cart/cart.service.ts
|
|
26
18
|
async function getItems(items, market, locale, user) {
|
|
@@ -44,13 +36,11 @@ function checkoutItemsHandler() {
|
|
|
44
36
|
const items = request.body.items;
|
|
45
37
|
const locale = request.query.locale;
|
|
46
38
|
const market = request.query.market;
|
|
47
|
-
const
|
|
48
|
-
const data = await getItems(items, market, locale, user);
|
|
39
|
+
const data = await getItems(items, market, locale, await getCurrentUser(request, response));
|
|
49
40
|
return response.status(200).json(data);
|
|
50
41
|
}
|
|
51
42
|
});
|
|
52
43
|
}
|
|
53
|
-
|
|
54
44
|
//#endregion
|
|
55
45
|
//#region src/models/checkout/checkout.service.ts
|
|
56
46
|
function checkoutInfoHandler() {
|
|
@@ -64,10 +54,9 @@ function checkoutInfoHandler() {
|
|
|
64
54
|
request.query.market;
|
|
65
55
|
const countries = await getCountries(locale);
|
|
66
56
|
const provinces = await getProvinces(locale);
|
|
67
|
-
const regions = await getRegions(locale);
|
|
68
57
|
const data = {
|
|
69
58
|
countries,
|
|
70
|
-
regions,
|
|
59
|
+
regions: await getRegions(locale),
|
|
71
60
|
provinces
|
|
72
61
|
};
|
|
73
62
|
response.status(200).json(data);
|
|
@@ -150,15 +139,13 @@ function checkoutUpdateHandler() {
|
|
|
150
139
|
async function getOrCreateAddress(address, market, locale) {
|
|
151
140
|
if (address) {
|
|
152
141
|
if (address.id) return address;
|
|
153
|
-
|
|
142
|
+
return (await remoteApiPost(`/address?market=${market}&locale=${locale}`, {
|
|
154
143
|
...address,
|
|
155
144
|
country: address.country ? address.country.id : void 0,
|
|
156
145
|
region: address.region ? address.region.id : void 0,
|
|
157
146
|
province: address.province ? address.province.id : void 0
|
|
158
|
-
});
|
|
159
|
-
return result.doc;
|
|
147
|
+
})).doc;
|
|
160
148
|
}
|
|
161
|
-
return void 0;
|
|
162
149
|
}
|
|
163
150
|
function checkoutSubmitHandler({ Component, Layout, from = "no-reply@mixer.com", bcc = "lzampetti@gmail.com" }) {
|
|
164
151
|
return apiHandler({
|
|
@@ -203,14 +190,11 @@ function checkoutSubmitHandler({ Component, Layout, from = "no-reply@mixer.com",
|
|
|
203
190
|
};
|
|
204
191
|
const knownRoutes = await getRoutesForSchemas(["checkout_result"], market, locale);
|
|
205
192
|
if (storeStrategy !== StoreStrategy.Mock) {
|
|
206
|
-
const
|
|
207
|
-
const
|
|
208
|
-
const redirectUrl = `${knownRoutes.checkout_result}?orderId=${order.id}&status=OK`;
|
|
209
|
-
const data = { redirectUrl };
|
|
193
|
+
const order = (await remoteApiPost(`/order?market=${market}&locale=${locale}`, action)).doc;
|
|
194
|
+
const data = { redirectUrl: `${knownRoutes.checkout_result}?orderId=${order.id}&status=OK` };
|
|
210
195
|
response.status(200).json(data);
|
|
211
196
|
} else {
|
|
212
|
-
const
|
|
213
|
-
const data = { redirectUrl };
|
|
197
|
+
const data = { redirectUrl: `${knownRoutes.checkout_result}?orderId=1&status=OK` };
|
|
214
198
|
response.status(200).json(data);
|
|
215
199
|
}
|
|
216
200
|
} catch (error) {
|
|
@@ -221,27 +205,18 @@ function checkoutSubmitHandler({ Component, Layout, from = "no-reply@mixer.com",
|
|
|
221
205
|
}
|
|
222
206
|
async function paymentResult(checkout, market, locale) {
|
|
223
207
|
console.log("paymentResult", checkout);
|
|
224
|
-
|
|
225
|
-
const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;
|
|
226
|
-
return { redirectUrl };
|
|
208
|
+
return { redirectUrl: `${(await getRoutesForSchemas(["checkout_result"], market, locale)).checkout_result}?orderId=1&status=OK` };
|
|
227
209
|
}
|
|
228
|
-
|
|
229
210
|
//#endregion
|
|
230
211
|
//#region src/models/delivery/delivery.service.ts
|
|
231
212
|
async function getDeliveries(params = {}) {
|
|
232
|
-
|
|
233
|
-
const items = await store.delivery.findMany(params);
|
|
234
|
-
return items;
|
|
213
|
+
return await (await getStore()).delivery.findMany(params);
|
|
235
214
|
}
|
|
236
215
|
async function getDelivery(id, params = {}) {
|
|
237
|
-
|
|
238
|
-
const item = await store.delivery.findOne(id, params);
|
|
239
|
-
return item;
|
|
216
|
+
return await (await getStore()).delivery.findOne(id, params);
|
|
240
217
|
}
|
|
241
218
|
async function getDeliveriesPagination(params = {}) {
|
|
242
|
-
|
|
243
|
-
const pagination = await store.delivery.findPaged(params);
|
|
244
|
-
return pagination;
|
|
219
|
+
return await (await getStore()).delivery.findPaged(params);
|
|
245
220
|
}
|
|
246
221
|
function checkoutDeliveryHandler() {
|
|
247
222
|
return apiHandler({
|
|
@@ -252,17 +227,14 @@ function checkoutDeliveryHandler() {
|
|
|
252
227
|
request.body;
|
|
253
228
|
const locale = request.query.locale;
|
|
254
229
|
const market = request.query.market;
|
|
255
|
-
const items = await getDeliveries({
|
|
256
|
-
market,
|
|
257
|
-
locale,
|
|
258
|
-
sort: "createdAt"
|
|
259
|
-
});
|
|
260
230
|
/**
|
|
261
|
-
|
|
262
231
|
* todo: calculate price based on checkout.items
|
|
263
|
-
|
|
264
232
|
*/
|
|
265
|
-
const deliveries =
|
|
233
|
+
const deliveries = (await getDeliveries({
|
|
234
|
+
market,
|
|
235
|
+
locale,
|
|
236
|
+
sort: "createdAt"
|
|
237
|
+
})).map((x) => {
|
|
266
238
|
const delivery = {
|
|
267
239
|
...x,
|
|
268
240
|
delivery: x,
|
|
@@ -289,23 +261,16 @@ function checkoutDeliveryHandler() {
|
|
|
289
261
|
}
|
|
290
262
|
});
|
|
291
263
|
}
|
|
292
|
-
|
|
293
264
|
//#endregion
|
|
294
265
|
//#region src/models/discount/discount.service.ts
|
|
295
266
|
async function getDiscounts(params = {}) {
|
|
296
|
-
|
|
297
|
-
const items = await store.discount.findMany(params);
|
|
298
|
-
return items;
|
|
267
|
+
return await (await getStore()).discount.findMany(params);
|
|
299
268
|
}
|
|
300
269
|
async function getDiscount(id, params = {}) {
|
|
301
|
-
|
|
302
|
-
const item = await store.discount.findOne(id, params);
|
|
303
|
-
return item;
|
|
270
|
+
return await (await getStore()).discount.findOne(id, params);
|
|
304
271
|
}
|
|
305
272
|
async function getDiscountsPagination(params = {}) {
|
|
306
|
-
|
|
307
|
-
const pagination = await store.discount.findPaged(params);
|
|
308
|
-
return pagination;
|
|
273
|
+
return await (await getStore()).discount.findPaged(params);
|
|
309
274
|
}
|
|
310
275
|
async function setDiscountCode(discountCode, checkout, market, locale) {
|
|
311
276
|
const discounts = [];
|
|
@@ -328,10 +293,7 @@ async function setDiscountCode(discountCode, checkout, market, locale) {
|
|
|
328
293
|
price = discount.value * -1;
|
|
329
294
|
break;
|
|
330
295
|
case IDiscountType.Shipping:
|
|
331
|
-
|
|
332
|
-
const delivery = checkout.delivery?.price || 0;
|
|
333
|
-
price = delivery * -1;
|
|
334
|
-
}
|
|
296
|
+
price = (checkout.delivery?.price || 0) * -1;
|
|
335
297
|
break;
|
|
336
298
|
}
|
|
337
299
|
console.log("discount.price", price);
|
|
@@ -360,12 +322,10 @@ function checkoutDiscountHandler() {
|
|
|
360
322
|
}
|
|
361
323
|
});
|
|
362
324
|
}
|
|
363
|
-
|
|
364
325
|
//#endregion
|
|
365
326
|
//#region src/models/order/order.service.ts
|
|
366
327
|
async function getOrders(params = {}) {
|
|
367
|
-
const
|
|
368
|
-
const items = await store.order.findMany(params);
|
|
328
|
+
const items = await (await getStore()).order.findMany(params);
|
|
369
329
|
const { market, locale } = params;
|
|
370
330
|
if (typeof market === "string" && typeof locale === "string") {
|
|
371
331
|
const knownRoutes = await getRoutesForTemplates(["reserved_area_order_detail"], params.market, params.locale);
|
|
@@ -377,8 +337,7 @@ async function getOrders(params = {}) {
|
|
|
377
337
|
return items;
|
|
378
338
|
}
|
|
379
339
|
async function getOrder(id, params = {}) {
|
|
380
|
-
const
|
|
381
|
-
const item = await store.order.findOne(id, params);
|
|
340
|
+
const item = await (await getStore()).order.findOne(id, params);
|
|
382
341
|
if (item) {
|
|
383
342
|
const { market, locale } = params;
|
|
384
343
|
if (typeof market === "string" && typeof locale === "string") {
|
|
@@ -391,23 +350,16 @@ async function getOrder(id, params = {}) {
|
|
|
391
350
|
}
|
|
392
351
|
return item;
|
|
393
352
|
}
|
|
394
|
-
|
|
395
353
|
//#endregion
|
|
396
354
|
//#region src/models/payment/payment.service.ts
|
|
397
355
|
async function getPayments(params = {}) {
|
|
398
|
-
|
|
399
|
-
const items = await store.payment.findMany(params);
|
|
400
|
-
return items;
|
|
356
|
+
return await (await getStore()).payment.findMany(params);
|
|
401
357
|
}
|
|
402
358
|
async function getPayment(id, params = {}) {
|
|
403
|
-
|
|
404
|
-
const item = await store.payment.findOne(id, params);
|
|
405
|
-
return item;
|
|
359
|
+
return await (await getStore()).payment.findOne(id, params);
|
|
406
360
|
}
|
|
407
361
|
async function getPaymentsPagination(params = {}) {
|
|
408
|
-
|
|
409
|
-
const pagination = await store.payment.findPaged(params);
|
|
410
|
-
return pagination;
|
|
362
|
+
return await (await getStore()).payment.findPaged(params);
|
|
411
363
|
}
|
|
412
364
|
function checkoutPaymentsHandler() {
|
|
413
365
|
return apiHandler({
|
|
@@ -427,23 +379,16 @@ function checkoutPaymentsHandler() {
|
|
|
427
379
|
}
|
|
428
380
|
});
|
|
429
381
|
}
|
|
430
|
-
|
|
431
382
|
//#endregion
|
|
432
383
|
//#region src/models/retailer/retailer.service.ts
|
|
433
384
|
async function getRetailers(params = {}) {
|
|
434
|
-
|
|
435
|
-
const items = await store.retailer.findMany(params);
|
|
436
|
-
return items;
|
|
385
|
+
return await (await getStore()).retailer.findMany(params);
|
|
437
386
|
}
|
|
438
387
|
async function getRetailer(id, params = {}) {
|
|
439
|
-
|
|
440
|
-
const item = await store.retailer.findOne(id, params);
|
|
441
|
-
return item;
|
|
388
|
+
return await (await getStore()).retailer.findOne(id, params);
|
|
442
389
|
}
|
|
443
390
|
async function getRetailersPagination(params = {}) {
|
|
444
|
-
|
|
445
|
-
const pagination = await store.retailer.findPaged(params);
|
|
446
|
-
return pagination;
|
|
391
|
+
return await (await getStore()).retailer.findPaged(params);
|
|
447
392
|
}
|
|
448
393
|
function checkoutRetailersHandler() {
|
|
449
394
|
return apiHandler({
|
|
@@ -462,7 +407,7 @@ function checkoutRetailersHandler() {
|
|
|
462
407
|
}
|
|
463
408
|
});
|
|
464
409
|
}
|
|
465
|
-
|
|
466
410
|
//#endregion
|
|
467
411
|
export { checkoutDeliveryHandler, checkoutDiscountHandler, checkoutInfoHandler, checkoutItemsHandler, checkoutPaymentsHandler, checkoutRetailersHandler, checkoutSubmitHandler, checkoutUpdateHandler, getArticle, getArticles, getArticlesPagination, getDeliveries, getDeliveriesPagination, getDelivery, getDiscount, getDiscounts, getDiscountsPagination, getItems, getOrder, getOrders, getPayment, getPayments, getPaymentsPagination, getRetailer, getRetailers, getRetailersPagination, paymentResult, setDiscountCode, updateCheckout };
|
|
412
|
+
|
|
468
413
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":["params: QueryParams","id: IEquatable","items: ICartItem[]","market: string","locale: string","user?: { id: IEquatable }","request: NextApiRequest","response: NextApiResponse","response: NextApiResponse<ICheckoutItem[]>","locale: string | undefined","market: string | undefined","request: NextApiRequest","response: NextApiResponse","response: NextApiResponse<{\r\n countries: IOption[],\r\n regions: IOption[],\r\n provinces: IOption[]\r\n }>","locale: string | undefined","checkout: ICheckoutPartial","action: string","market: string","locale: string","response: NextApiResponse<ICheckoutPartial>","market: string | undefined","address: IUserAddress | undefined","response: NextApiResponse<ICheckoutPaymentRedirect>","shippingAddress: IUserAddress | undefined","billingAddress: IUserAddress | undefined","params: QueryParams","id: IEquatable","request: NextApiRequest","response: NextApiResponse","locale: string | undefined","market: string | undefined","deliveries: ICheckoutDelivery[]","params: QueryParams","id: IEquatable","discountCode: string","checkout: ICheckoutPartial","market: string","locale: string","discounts: ICheckoutDiscount[]","request: NextApiRequest","response: NextApiResponse","response: NextApiResponse<ICheckoutPartial>","locale: string | undefined","market: string | undefined","params: QueryParams","id: IEquatable","params: QueryParams","id: IEquatable","request: NextApiRequest","response: NextApiResponse","response: NextApiResponse<{ payments: IPayment[] }>","locale: string | undefined","market: string | undefined","params: QueryParams","id: IEquatable","request: NextApiRequest","response: NextApiResponse","response: NextApiResponse<{ retailers: IRetailer[] }>","locale: string | undefined","market: string | undefined"],"sources":["../../src/models/article/article.service.ts","../../src/models/cart/cart.service.ts","../../src/models/checkout/checkout.service.ts","../../src/models/delivery/delivery.service.ts","../../src/models/discount/discount.service.ts","../../src/models/order/order.service.ts","../../src/models/payment/payment.service.ts","../../src/models/retailer/retailer.service.ts"],"sourcesContent":["import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IArticle } from './article';\r\n\r\nexport async function getArticles(params: QueryParams = {}): Promise<IArticle[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.article!.findMany<IArticle>(params);\r\n return items;\r\n}\r\n\r\nexport async function getArticle(id: IEquatable, params: QueryParams = {}): Promise<IArticle | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.article!.findOne<IArticle>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getArticlesPagination(params: QueryParams = {}): Promise<IPaginationResult<IArticle>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.article!.findPaged<IArticle>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable } from '@websolutespa/bom-core';\r\nimport { getCurrentUser } from '@websolutespa/bom-mixer-auth/server';\r\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutItem } from '../checkout/checkout';\r\nimport { ICartItem } from './cart';\r\n\r\nexport async function getItems(items: ICartItem[], market: string, locale: string, user?: { id: IEquatable }): Promise<ICheckoutItem[]> {\r\n if (user) {\r\n // !!! todo calculate user discount price\r\n return items.map(x => ({ ...x, price: x.article.price * 0.9, fullPrice: x.article.price }));\r\n } else {\r\n return items.map(x => ({ ...x, price: x.article.price, fullPrice: x.article.price }));\r\n }\r\n}\r\n\r\nexport function checkoutItemsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutItem[]>) => {\r\n const items = request.body.items;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const user = await getCurrentUser(request, response);\r\n /*\r\n if (!user) {\r\n return response.status(400);\r\n }\r\n */\r\n const data = await getItems(items, market, locale, user);\r\n return response.status(200).json(data);\r\n },\r\n });\r\n}\r\n","import { IEntity, IOption } from '@websolutespa/bom-core';\r\nimport { IUserAddress } from '@websolutespa/bom-mixer-auth';\r\nimport { IEmailComponent, IEmailLayoutComponent } from '@websolutespa/bom-mixer-emails';\r\nimport { getCountries, getProvinces, getRegions, getRoutesForSchemas } from '@websolutespa/bom-mixer-models/server';\r\nimport { remoteApiPost, StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IDiscountType } from '../discount/discount';\r\nimport { ICheckoutPartial, ICheckoutPaymentRedirect } from './checkout';\r\n\r\n// step 1. Items\r\n// step 2. Info\r\n// step 3. Deliveries\r\n// step 4. Stores\r\n// step 5. Payments\r\n// step 6. Confirm\r\n\r\nexport function checkoutInfoHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{\r\n countries: IOption[],\r\n regions: IOption[],\r\n provinces: IOption[]\r\n }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const countries = await getCountries(locale) as IOption[];\r\n const provinces = await getProvinces(locale) as IOption[];\r\n const regions = await getRegions(locale) as IOption[];\r\n const data = { countries, regions, provinces };\r\n response.status(200).json(data);\r\n },\r\n });\r\n}\r\n\r\n// update\r\nexport async function updateCheckout(checkout: ICheckoutPartial, action: string, market: string, locale: string): Promise<ICheckoutPartial> {\r\n // generic checkout update\r\n switch (action) {\r\n case 'basket':\r\n break;\r\n case 'info':\r\n break;\r\n case 'delivery':\r\n checkout.delivery = checkout.delivery ? {\r\n ...checkout.delivery,\r\n delivery: {\r\n ...checkout.delivery,\r\n },\r\n } : undefined;\r\n break;\r\n case 'retailer':\r\n break;\r\n case 'discount':\r\n break;\r\n case 'payment':\r\n break;\r\n }\r\n // recalculate price\r\n const subTotal = checkout.items ? checkout.items.reduce((p, c) => {\r\n return p + c.price * c.qty;\r\n }, 0) : 0;\r\n const subTotalFull = checkout.items ? checkout.items.reduce((p, c) => {\r\n return p + c.fullPrice * c.qty;\r\n }, 0) : 0;\r\n const today = new Date();\r\n const subTotalDiscountPrice = (checkout.discounts || []).reduce((p, c) => {\r\n let value = 0;\r\n const discount = c.discount;\r\n if (\r\n (!discount.validFrom || new Date(discount.validFrom) < today)\r\n && (!discount.validTo || new Date(discount.validTo) > today)\r\n ) {\r\n switch (discount.type) {\r\n case IDiscountType.Percent: {\r\n value = Math.round(subTotal * discount.value * -1) / 100;\r\n c.price = value;\r\n }\r\n break;\r\n case IDiscountType.Fixed: {\r\n value = discount.value * -1;\r\n c.price = value;\r\n }\r\n break;\r\n }\r\n }\r\n return p + value;\r\n }, 0);\r\n console.log('subTotalDiscountPrice', subTotalDiscountPrice);\r\n const deliveryPrice = checkout.delivery?.price || 0;\r\n const afterTaxesDiscountPrice = (checkout.discounts || []).reduce((p, c) => {\r\n let value = 0;\r\n const discount = c.discount;\r\n if (\r\n (!discount.validFrom || new Date(discount.validFrom) < today) &&\r\n (!discount.validTo || new Date(discount.validTo) > today)\r\n ) {\r\n switch (discount.type) {\r\n case IDiscountType.Shipping: {\r\n value = deliveryPrice * -1;\r\n c.price = value;\r\n }\r\n break;\r\n }\r\n }\r\n return p + value;\r\n }, 0);\r\n console.log('afterTaxesDiscountPrice', afterTaxesDiscountPrice);\r\n // const totalDiscountPrice = subTotalDiscountPrice + afterTaxesDiscountPrice;\r\n const taxes = (subTotal + subTotalDiscountPrice) * 0.2;\r\n const total = subTotal + subTotalDiscountPrice + taxes + deliveryPrice + afterTaxesDiscountPrice;\r\n checkout.subTotal = subTotal;\r\n checkout.subTotalFull = subTotalFull;\r\n checkout.taxes = taxes;\r\n checkout.total = total;\r\n return checkout;\r\n}\r\n\r\nexport function checkoutUpdateHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPartial>) => {\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const action: string = request.body.action;\r\n const checkout: ICheckoutPartial = request.body.checkout;\r\n const updatedCheckout = await updateCheckout(checkout, action, market, locale);\r\n response.status(200).json(updatedCheckout);\r\n },\r\n });\r\n}\r\n\r\nasync function getOrCreateAddress(address: IUserAddress | undefined, market: string, locale: string) {\r\n if (address) {\r\n if (address.id) {\r\n return address;\r\n }\r\n const result = await remoteApiPost<{ doc: IUserAddress }>(`/address?market=${market}&locale=${locale}`, {\r\n ...address,\r\n country: address.country ? address.country.id : undefined,\r\n region: address.region ? address.region.id : undefined,\r\n province: address.province ? address.province.id : undefined,\r\n });\r\n return result.doc;\r\n }\r\n return undefined;\r\n}\r\n\r\n/*\r\nasync function getOrCreateEndUser(user: Partial<IUser> | undefined, address: IUserAddress | undefined, market: string, locale: string) {\r\n if (user && user.id) {\r\n return user as IUser;\r\n }\r\n if (address && address.id) {\r\n const result = await remoteApiPost<{ doc: IUser }>(`/end_users?market=${market}&locale=${locale}`, {\r\n firstName: address.firstName,\r\n lastName: address.lastName,\r\n email: address.email,\r\n password: uuid(),\r\n roles: ['guest'],\r\n });\r\n return result.doc;\r\n }\r\n return undefined;\r\n}\r\n*/\r\n\r\n// submit\r\nexport function checkoutSubmitHandler<T>({\r\n Component,\r\n Layout,\r\n from = 'no-reply@mixer.com',\r\n bcc = 'lzampetti@gmail.com',\r\n}: {\r\n Component: IEmailComponent<T>;\r\n Layout: IEmailLayoutComponent;\r\n from?: string; // !!! todo override from app settings in send mail\r\n bcc?: string;\r\n}) {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPaymentRedirect>) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse) => {\r\n try {\r\n const locale = request.query.locale as (string | undefined);\r\n const market = request.query.market as (string | undefined);\r\n if (!market || !locale) {\r\n return response.status(400).json({ message: 'Missing market or locale' });\r\n }\r\n const checkout: ICheckoutPartial = request.body;\r\n\r\n /*\r\n const origin = isDevelopment ? '' : getOrigin(request.headers);\r\n const layout = await getLayout(market, locale);\r\n const labelService = new LabelService(layout.labels);\r\n\r\n const subject = labelService.getLabel('shop.confirm.subject');\r\n const html = renderEmail<ShopConfirmProps>({\r\n Component: ShopConfirm,\r\n Layout: LayoutDefault,\r\n origin,\r\n layout,\r\n props,\r\n preview: subject,\r\n // optInUrl: `${origin}/api/checkout/confirm/optin?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\r\n // optOutUrl: `${origin}/api/checkout/confirm/optout?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\r\n // viewOnWebUrl: `${origin}/api/checkout/confirm?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\r\n });\r\n\r\n const emailData: IActionEmailData[] = [{\r\n to: props.email,\r\n from,\r\n bcc,\r\n subject,\r\n html,\r\n }];\r\n\r\n if (storeStrategy !== StoreStrategy.Mock) {\r\n const action: IShopConfirmAction = {\r\n firstName: props.firstName,\r\n lastName: props.lastName,\r\n email: props.email,\r\n password: props.password,\r\n consentPreferences: Object.entries(props).filter(([k, v]) => ['privacy'].includes(k) && v === true).map(([k, v]) => k),\r\n emailData,\r\n };\r\n // console.log('action', action, process.env.STORE_API_KEY);\r\n const result = await remoteApiPost(`/order_action?market=${market}&locale=${locale}`, action);\r\n // console.log(result);\r\n response.status(200).json(result);\r\n } else {\r\n response.status(200).json(html);\r\n }\r\n */\r\n\r\n let shippingAddress: IUserAddress | undefined = undefined;\r\n let billingAddress: IUserAddress | undefined = undefined;\r\n if (storeStrategy !== StoreStrategy.Mock) {\r\n shippingAddress = await getOrCreateAddress(checkout.shippingAddress, market, locale);\r\n // console.log('shippingAddress', shippingAddress?.id);\r\n\r\n billingAddress = await getOrCreateAddress(checkout.billingAddress, market, locale);\r\n // console.log('billingAddress', billingAddress?.id);\r\n }\r\n /*\r\n const user: IUser | undefined = await getOrCreateEndUser(checkout.user, billingAddress || shippingAddress, market, locale);\r\n console.log('user', user?.id);\r\n */\r\n\r\n const action = {\r\n ...checkout,\r\n billingAddress: billingAddress ? billingAddress.id : undefined,\r\n delivery: checkout.delivery ? {\r\n delivery: checkout.delivery.id,\r\n price: checkout.delivery.price,\r\n fullPrice: checkout.delivery.fullPrice,\r\n } : undefined,\r\n discounts: (checkout.discounts || []).map(x => ({\r\n discount: x.discount.id,\r\n price: x.price,\r\n })),\r\n items: (checkout.items || []).map(x => ({\r\n article: x.article.id,\r\n price: x.price,\r\n fullPrice: x.fullPrice,\r\n qty: x.qty,\r\n })),\r\n payment: checkout.payment ? checkout.payment.id : undefined,\r\n shippingAddress: shippingAddress ? shippingAddress.id : undefined,\r\n retailer: checkout.retailer ? checkout.retailer.id : undefined,\r\n user: checkout.user ? checkout.user.id : undefined,\r\n tenant: checkout.tenant ? checkout.tenant.id : undefined,\r\n };\r\n\r\n const knownRoutes = await getRoutesForSchemas(['checkout_result'], market, locale);\r\n // !!! todo return payment redirectUrl\r\n\r\n // console.log('action', action, knownRoutes);\r\n\r\n if (storeStrategy !== StoreStrategy.Mock) {\r\n const result = await remoteApiPost<{ doc: IEntity }>(`/order?market=${market}&locale=${locale}`, action);\r\n const order = result.doc;\r\n // const order = await createOrder(checkout);\r\n // throw 'error';\r\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=${order.id}&status=OK`;\r\n const data = { redirectUrl };\r\n response.status(200).json(data);\r\n\r\n } else {\r\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;\r\n const data = { redirectUrl };\r\n response.status(200).json(data);\r\n\r\n }\r\n\r\n } catch (error) {\r\n response.status(400).json(error);\r\n }\r\n },\r\n });\r\n}\r\n\r\n// result\r\nexport async function paymentResult(checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPaymentRedirect> {\r\n console.log('paymentResult', checkout);\r\n const knownRoutes = await getRoutesForSchemas(['checkout_result'], market, locale);\r\n // !!! todo return payment redirectUrl\r\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;\r\n return { redirectUrl };\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutDelivery } from '../checkout/checkout';\r\nimport { IDelivery } from './delivery';\r\n\r\nexport async function getDeliveries(params: QueryParams = {}): Promise<IDelivery[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.delivery!.findMany<IDelivery>(params);\r\n return items;\r\n}\r\n\r\nexport async function getDelivery(id: IEquatable, params: QueryParams = {}): Promise<IDelivery | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.delivery!.findOne<IDelivery>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getDeliveriesPagination(params: QueryParams = {}): Promise<IPaginationResult<IDelivery>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.delivery!.findPaged<IDelivery>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutDeliveryHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const items = await getDeliveries({\r\n market,\r\n locale,\r\n sort: 'createdAt',\r\n });\r\n /**\r\n * todo: calculate price based on checkout.items\r\n */\r\n const deliveries: ICheckoutDelivery[] = items.map(x => {\r\n const delivery = {\r\n ...x,\r\n delivery: x,\r\n price: 0,\r\n fullPrice: 0,\r\n };\r\n switch (x.id) {\r\n case 'in-store':\r\n delivery.price = 0;\r\n delivery.fullPrice = 0;\r\n break;\r\n case 'courier':\r\n delivery.price = 81;\r\n delivery.fullPrice = 81;\r\n break;\r\n case 'in-home':\r\n delivery.price = 156;\r\n delivery.fullPrice = 156;\r\n break;\r\n }\r\n return delivery;\r\n });\r\n response.status(200).json({ deliveries });\r\n },\r\n });\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutDiscount, ICheckoutPartial } from '../checkout/checkout';\r\nimport { updateCheckout } from '../checkout/checkout.service';\r\nimport { IDiscount, IDiscountType } from './discount';\r\n\r\nexport async function getDiscounts(params: QueryParams = {}): Promise<IDiscount[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.discount!.findMany<IDiscount>(params);\r\n return items;\r\n}\r\n\r\nexport async function getDiscount(id: IEquatable, params: QueryParams = {}): Promise<IDiscount | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.discount!.findOne<IDiscount>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getDiscountsPagination(params: QueryParams = {}): Promise<IPaginationResult<IDiscount>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.discount!.findPaged<IDiscount>(params);\r\n return pagination;\r\n}\r\n\r\n// discounts\r\nexport async function setDiscountCode(discountCode: string, checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPartial> {\r\n const discounts: ICheckoutDiscount[] = []; // checkout.discounts || [];\r\n const today = new Date();\r\n const discount = await getDiscount(discountCode, {\r\n market,\r\n locale,\r\n });\r\n console.log('discount', discount);\r\n if (discount &&\r\n (!discount.validFrom || new Date(discount.validFrom) < today) &&\r\n (!discount.validTo || new Date(discount.validTo) > today)\r\n ) {\r\n let price = 0;\r\n switch (discount.type) {\r\n case IDiscountType.Percent: {\r\n const total = (checkout.items || []).reduce((p, c) => p + c.price * c.qty, 0);\r\n price = Math.round(total * discount.value * -1) / 100;\r\n }\r\n break;\r\n case IDiscountType.Fixed:\r\n price = discount.value * -1;\r\n break;\r\n case IDiscountType.Shipping: {\r\n const delivery = checkout.delivery?.price || 0;\r\n price = delivery * -1;\r\n }\r\n break;\r\n }\r\n console.log('discount.price', price);\r\n discounts.push({\r\n discount,\r\n price,\r\n });\r\n }\r\n return await updateCheckout({ ...checkout, discounts }, 'discount', market, locale);\r\n}\r\n\r\nexport function checkoutDiscountHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPartial>) => {\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const discountCode = request.body.discountCode;\r\n const checkout = request.body.checkout;\r\n const updatedCheckout = await setDiscountCode(discountCode, checkout, market, locale);\r\n response.status(200).json(updatedCheckout);\r\n },\r\n });\r\n}\r\n","import { IEquatable, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { getRoutesForTemplates } from '@websolutespa/bom-mixer-models/server';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IOrderDetail } from './order';\r\n\r\nexport async function getOrders(params: QueryParams = {}): Promise<IOrderDetail[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.order!.findMany<IOrderDetail>(params);\r\n const { market, locale } = params;\r\n if (typeof market === 'string' && typeof locale === 'string') {\r\n const knownRoutes = await getRoutesForTemplates(['reserved_area_order_detail'], params.market, params.locale);\r\n return items.map(x => ({\r\n ...x,\r\n href: `${knownRoutes.reserved_area_order_detail}?orderId=${x.id}`,\r\n }));\r\n }\r\n return items;\r\n}\r\n\r\nexport async function getOrder(id: IEquatable, params: QueryParams = {}): Promise<IOrderDetail | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.order!.findOne<IOrderDetail>(id, params);\r\n if (item) {\r\n const { market, locale } = params;\r\n if (typeof market === 'string' && typeof locale === 'string') {\r\n const knownRoutes = await getRoutesForTemplates(['reserved_area_order_detail'], params.market, params.locale);\r\n return {\r\n ...item,\r\n href: `${knownRoutes.reserved_area_order_detail}?orderId=${item.id}`,\r\n };\r\n }\r\n }\r\n return item;\r\n}\r\n\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IPayment } from './payment';\r\n\r\n// https://github.com/MultiSafepay/MultiSafepay-icons\r\n\r\nexport async function getPayments(params: QueryParams = {}): Promise<IPayment[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.payment!.findMany<IPayment>(params);\r\n return items;\r\n}\r\n\r\nexport async function getPayment(id: IEquatable, params: QueryParams = {}): Promise<IPayment | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.payment!.findOne<IPayment>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getPaymentsPagination(params: QueryParams = {}): Promise<IPaginationResult<IPayment>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.payment!.findPaged<IPayment>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutPaymentsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{ payments: IPayment[] }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const payments = await getPayments({\r\n market,\r\n locale,\r\n sort: 'createdAt',\r\n });\r\n response.status(200).json({ payments });\r\n },\r\n });\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IRetailer } from './retailer';\r\n\r\nexport async function getRetailers(params: QueryParams = {}): Promise<IRetailer[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.retailer!.findMany<IRetailer>(params);\r\n return items;\r\n}\r\n\r\nexport async function getRetailer(id: IEquatable, params: QueryParams = {}): Promise<IRetailer | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.retailer!.findOne<IRetailer>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getRetailersPagination(params: QueryParams = {}): Promise<IPaginationResult<IRetailer>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.retailer!.findPaged<IRetailer>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutRetailersHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{ retailers: IRetailer[] }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const retailers = await getRetailers({ market, locale });\r\n response.status(200).json({ retailers });\r\n },\r\n });\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":[],"sources":["../../src/models/article/article.service.ts","../../src/models/cart/cart.service.ts","../../src/models/checkout/checkout.service.ts","../../src/models/delivery/delivery.service.ts","../../src/models/discount/discount.service.ts","../../src/models/order/order.service.ts","../../src/models/payment/payment.service.ts","../../src/models/retailer/retailer.service.ts"],"sourcesContent":["import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IArticle } from './article';\r\n\r\nexport async function getArticles(params: QueryParams = {}): Promise<IArticle[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.article!.findMany<IArticle>(params);\r\n return items;\r\n}\r\n\r\nexport async function getArticle(id: IEquatable, params: QueryParams = {}): Promise<IArticle | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.article!.findOne<IArticle>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getArticlesPagination(params: QueryParams = {}): Promise<IPaginationResult<IArticle>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.article!.findPaged<IArticle>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable } from '@websolutespa/bom-core';\r\nimport { getCurrentUser } from '@websolutespa/bom-mixer-auth/server';\r\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutItem } from '../checkout/checkout';\r\nimport { ICartItem } from './cart';\r\n\r\nexport async function getItems(items: ICartItem[], market: string, locale: string, user?: { id: IEquatable }): Promise<ICheckoutItem[]> {\r\n if (user) {\r\n // !!! todo calculate user discount price\r\n return items.map(x => ({ ...x, price: x.article.price * 0.9, fullPrice: x.article.price }));\r\n } else {\r\n return items.map(x => ({ ...x, price: x.article.price, fullPrice: x.article.price }));\r\n }\r\n}\r\n\r\nexport function checkoutItemsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutItem[]>) => {\r\n const items = request.body.items;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const user = await getCurrentUser(request, response);\r\n /*\r\n if (!user) {\r\n return response.status(400);\r\n }\r\n */\r\n const data = await getItems(items, market, locale, user);\r\n return response.status(200).json(data);\r\n },\r\n });\r\n}\r\n","import { IEntity, IOption } from '@websolutespa/bom-core';\nimport { IUserAddress } from '@websolutespa/bom-mixer-auth';\nimport { IEmailComponent, IEmailLayoutComponent } from '@websolutespa/bom-mixer-emails';\nimport { getCountries, getProvinces, getRegions, getRoutesForSchemas } from '@websolutespa/bom-mixer-models/server';\nimport { remoteApiPost, StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\nimport { NextApiRequest, NextApiResponse } from 'next';\nimport { IDiscountType } from '../discount/discount';\nimport { ICheckoutPartial, ICheckoutPaymentRedirect } from './checkout';\n\n// step 1. Items\n// step 2. Info\n// step 3. Deliveries\n// step 4. Stores\n// step 5. Payments\n// step 6. Confirm\n\nexport function checkoutInfoHandler() {\n return apiHandler({\n options: async (request: NextApiRequest, response: NextApiResponse) => {\n response.status(200).end();\n },\n post: async (request: NextApiRequest, response: NextApiResponse<{\n countries: IOption[],\n regions: IOption[],\n provinces: IOption[]\n }>) => {\n const checkout = request.body;\n const locale: string | undefined = request.query.locale as string;\n const market: string | undefined = request.query.market as string;\n const countries = await getCountries(locale) as IOption[];\n const provinces = await getProvinces(locale) as IOption[];\n const regions = await getRegions(locale) as IOption[];\n const data = { countries, regions, provinces };\n response.status(200).json(data);\n },\n });\n}\n\n// update\nexport async function updateCheckout(checkout: ICheckoutPartial, action: string, market: string, locale: string): Promise<ICheckoutPartial> {\n // generic checkout update\n switch (action) {\n case 'basket':\n break;\n case 'info':\n break;\n case 'delivery':\n checkout.delivery = checkout.delivery ? {\n ...checkout.delivery,\n delivery: {\n ...checkout.delivery,\n },\n } : undefined;\n break;\n case 'retailer':\n break;\n case 'discount':\n break;\n case 'payment':\n break;\n }\n // recalculate price\n const subTotal = checkout.items ? checkout.items.reduce((p, c) => {\n return p + c.price * c.qty;\n }, 0) : 0;\n const subTotalFull = checkout.items ? checkout.items.reduce((p, c) => {\n return p + c.fullPrice * c.qty;\n }, 0) : 0;\n const today = new Date();\n const subTotalDiscountPrice = (checkout.discounts || []).reduce((p, c) => {\n let value = 0;\n const discount = c.discount;\n if (\n (!discount.validFrom || new Date(discount.validFrom) < today)\n && (!discount.validTo || new Date(discount.validTo) > today)\n ) {\n switch (discount.type) {\n case IDiscountType.Percent: {\n value = Math.round(subTotal * discount.value * -1) / 100;\n c.price = value;\n }\n break;\n case IDiscountType.Fixed: {\n value = discount.value * -1;\n c.price = value;\n }\n break;\n }\n }\n return p + value;\n }, 0);\n console.log('subTotalDiscountPrice', subTotalDiscountPrice);\n const deliveryPrice = checkout.delivery?.price || 0;\n const afterTaxesDiscountPrice = (checkout.discounts || []).reduce((p, c) => {\n let value = 0;\n const discount = c.discount;\n if (\n (!discount.validFrom || new Date(discount.validFrom) < today) &&\n (!discount.validTo || new Date(discount.validTo) > today)\n ) {\n switch (discount.type) {\n case IDiscountType.Shipping: {\n value = deliveryPrice * -1;\n c.price = value;\n }\n break;\n }\n }\n return p + value;\n }, 0);\n console.log('afterTaxesDiscountPrice', afterTaxesDiscountPrice);\n // const totalDiscountPrice = subTotalDiscountPrice + afterTaxesDiscountPrice;\n const taxes = (subTotal + subTotalDiscountPrice) * 0.2;\n const total = subTotal + subTotalDiscountPrice + taxes + deliveryPrice + afterTaxesDiscountPrice;\n checkout.subTotal = subTotal;\n checkout.subTotalFull = subTotalFull;\n checkout.taxes = taxes;\n checkout.total = total;\n return checkout;\n}\n\nexport function checkoutUpdateHandler() {\n return apiHandler({\n options: async (request: NextApiRequest, response: NextApiResponse) => {\n response.status(200).end();\n },\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPartial>) => {\n const locale: string | undefined = request.query.locale as string;\n const market: string | undefined = request.query.market as string;\n const action: string = request.body.action;\n const checkout: ICheckoutPartial = request.body.checkout;\n const updatedCheckout = await updateCheckout(checkout, action, market, locale);\n response.status(200).json(updatedCheckout);\n },\n });\n}\n\nasync function getOrCreateAddress(address: IUserAddress | undefined, market: string, locale: string) {\n if (address) {\n if (address.id) {\n return address;\n }\n const result = await remoteApiPost<{ doc: IUserAddress }>(`/address?market=${market}&locale=${locale}`, {\n ...address,\n country: address.country ? address.country.id : undefined,\n region: address.region ? address.region.id : undefined,\n province: address.province ? address.province.id : undefined,\n });\n return result.doc;\n }\n return undefined;\n}\n\n/*\nasync function getOrCreateEndUser(user: Partial<IUser> | undefined, address: IUserAddress | undefined, market: string, locale: string) {\n if (user && user.id) {\n return user as IUser;\n }\n if (address && address.id) {\n const result = await remoteApiPost<{ doc: IUser }>(`/end_users?market=${market}&locale=${locale}`, {\n firstName: address.firstName,\n lastName: address.lastName,\n email: address.email,\n password: uuid(),\n roles: ['guest'],\n });\n return result.doc;\n }\n return undefined;\n}\n*/\n\n// submit\nexport function checkoutSubmitHandler<T>({\n Component,\n Layout,\n from = 'no-reply@mixer.com',\n bcc = 'lzampetti@gmail.com',\n}: {\n Component: IEmailComponent<T>;\n Layout: IEmailLayoutComponent;\n from?: string; // !!! todo override from app settings in send mail\n bcc?: string;\n}) {\n return apiHandler({\n options: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPaymentRedirect>) => {\n response.status(200).end();\n },\n post: async (request: NextApiRequest, response: NextApiResponse) => {\n try {\n const locale = request.query.locale as (string | undefined);\n const market = request.query.market as (string | undefined);\n if (!market || !locale) {\n return response.status(400).json({ message: 'Missing market or locale' });\n }\n const checkout: ICheckoutPartial = request.body;\n\n /*\n const origin = isDevelopment ? '' : getOrigin(request.headers);\n const layout = await getLayout(market, locale);\n const labelService = new LabelService(layout.labels);\n\n const subject = labelService.getLabel('shop.confirm.subject');\n const html = await renderEmail<ShopConfirmProps>({\n Component: ShopConfirm,\n Layout: LayoutDefault,\n origin,\n layout,\n props,\n preview: subject,\n // optInUrl: `${origin}/api/checkout/confirm/optin?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\n // optOutUrl: `${origin}/api/checkout/confirm/optout?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\n // viewOnWebUrl: `${origin}/api/checkout/confirm?market=${layout.market}&locale=${layout.locale}&actionSlug={actionSlug}&actionId={actionId}`,\n });\n\n const emailData: IActionEmailData[] = [{\n to: props.email,\n from,\n bcc,\n subject,\n html,\n }];\n\n if (storeStrategy !== StoreStrategy.Mock) {\n const action: IShopConfirmAction = {\n firstName: props.firstName,\n lastName: props.lastName,\n email: props.email,\n password: props.password,\n consentPreferences: Object.entries(props).filter(([k, v]) => ['privacy'].includes(k) && v === true).map(([k, v]) => k),\n emailData,\n };\n // console.log('action', action, process.env.STORE_API_KEY);\n const result = await remoteApiPost(`/order_action?market=${market}&locale=${locale}`, action);\n // console.log(result);\n response.status(200).json(result);\n } else {\n response.status(200).json(html);\n }\n */\n\n let shippingAddress: IUserAddress | undefined = undefined;\n let billingAddress: IUserAddress | undefined = undefined;\n if (storeStrategy !== StoreStrategy.Mock) {\n shippingAddress = await getOrCreateAddress(checkout.shippingAddress, market, locale);\n // console.log('shippingAddress', shippingAddress?.id);\n\n billingAddress = await getOrCreateAddress(checkout.billingAddress, market, locale);\n // console.log('billingAddress', billingAddress?.id);\n }\n /*\n const user: IUser | undefined = await getOrCreateEndUser(checkout.user, billingAddress || shippingAddress, market, locale);\n console.log('user', user?.id);\n */\n\n const action = {\n ...checkout,\n billingAddress: billingAddress ? billingAddress.id : undefined,\n delivery: checkout.delivery ? {\n delivery: checkout.delivery.id,\n price: checkout.delivery.price,\n fullPrice: checkout.delivery.fullPrice,\n } : undefined,\n discounts: (checkout.discounts || []).map(x => ({\n discount: x.discount.id,\n price: x.price,\n })),\n items: (checkout.items || []).map(x => ({\n article: x.article.id,\n price: x.price,\n fullPrice: x.fullPrice,\n qty: x.qty,\n })),\n payment: checkout.payment ? checkout.payment.id : undefined,\n shippingAddress: shippingAddress ? shippingAddress.id : undefined,\n retailer: checkout.retailer ? checkout.retailer.id : undefined,\n user: checkout.user ? checkout.user.id : undefined,\n tenant: checkout.tenant ? checkout.tenant.id : undefined,\n };\n\n const knownRoutes = await getRoutesForSchemas(['checkout_result'], market, locale);\n // !!! todo return payment redirectUrl\n\n // console.log('action', action, knownRoutes);\n\n if (storeStrategy !== StoreStrategy.Mock) {\n const result = await remoteApiPost<{ doc: IEntity }>(`/order?market=${market}&locale=${locale}`, action);\n const order = result.doc;\n // const order = await createOrder(checkout);\n // throw 'error';\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=${order.id}&status=OK`;\n const data = { redirectUrl };\n response.status(200).json(data);\n\n } else {\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;\n const data = { redirectUrl };\n response.status(200).json(data);\n\n }\n\n } catch (error) {\n response.status(400).json(error);\n }\n },\n });\n}\n\n// result\nexport async function paymentResult(checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPaymentRedirect> {\n console.log('paymentResult', checkout);\n const knownRoutes = await getRoutesForSchemas(['checkout_result'], market, locale);\n // !!! todo return payment redirectUrl\n const redirectUrl = `${knownRoutes.checkout_result}?orderId=1&status=OK`;\n return { redirectUrl };\n}\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutDelivery } from '../checkout/checkout';\r\nimport { IDelivery } from './delivery';\r\n\r\nexport async function getDeliveries(params: QueryParams = {}): Promise<IDelivery[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.delivery!.findMany<IDelivery>(params);\r\n return items;\r\n}\r\n\r\nexport async function getDelivery(id: IEquatable, params: QueryParams = {}): Promise<IDelivery | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.delivery!.findOne<IDelivery>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getDeliveriesPagination(params: QueryParams = {}): Promise<IPaginationResult<IDelivery>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.delivery!.findPaged<IDelivery>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutDeliveryHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const items = await getDeliveries({\r\n market,\r\n locale,\r\n sort: 'createdAt',\r\n });\r\n /**\r\n * todo: calculate price based on checkout.items\r\n */\r\n const deliveries: ICheckoutDelivery[] = items.map(x => {\r\n const delivery = {\r\n ...x,\r\n delivery: x,\r\n price: 0,\r\n fullPrice: 0,\r\n };\r\n switch (x.id) {\r\n case 'in-store':\r\n delivery.price = 0;\r\n delivery.fullPrice = 0;\r\n break;\r\n case 'courier':\r\n delivery.price = 81;\r\n delivery.fullPrice = 81;\r\n break;\r\n case 'in-home':\r\n delivery.price = 156;\r\n delivery.fullPrice = 156;\r\n break;\r\n }\r\n return delivery;\r\n });\r\n response.status(200).json({ deliveries });\r\n },\r\n });\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { ICheckoutDiscount, ICheckoutPartial } from '../checkout/checkout';\r\nimport { updateCheckout } from '../checkout/checkout.service';\r\nimport { IDiscount, IDiscountType } from './discount';\r\n\r\nexport async function getDiscounts(params: QueryParams = {}): Promise<IDiscount[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.discount!.findMany<IDiscount>(params);\r\n return items;\r\n}\r\n\r\nexport async function getDiscount(id: IEquatable, params: QueryParams = {}): Promise<IDiscount | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.discount!.findOne<IDiscount>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getDiscountsPagination(params: QueryParams = {}): Promise<IPaginationResult<IDiscount>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.discount!.findPaged<IDiscount>(params);\r\n return pagination;\r\n}\r\n\r\n// discounts\r\nexport async function setDiscountCode(discountCode: string, checkout: ICheckoutPartial, market: string, locale: string): Promise<ICheckoutPartial> {\r\n const discounts: ICheckoutDiscount[] = []; // checkout.discounts || [];\r\n const today = new Date();\r\n const discount = await getDiscount(discountCode, {\r\n market,\r\n locale,\r\n });\r\n console.log('discount', discount);\r\n if (discount &&\r\n (!discount.validFrom || new Date(discount.validFrom) < today) &&\r\n (!discount.validTo || new Date(discount.validTo) > today)\r\n ) {\r\n let price = 0;\r\n switch (discount.type) {\r\n case IDiscountType.Percent: {\r\n const total = (checkout.items || []).reduce((p, c) => p + c.price * c.qty, 0);\r\n price = Math.round(total * discount.value * -1) / 100;\r\n }\r\n break;\r\n case IDiscountType.Fixed:\r\n price = discount.value * -1;\r\n break;\r\n case IDiscountType.Shipping: {\r\n const delivery = checkout.delivery?.price || 0;\r\n price = delivery * -1;\r\n }\r\n break;\r\n }\r\n console.log('discount.price', price);\r\n discounts.push({\r\n discount,\r\n price,\r\n });\r\n }\r\n return await updateCheckout({ ...checkout, discounts }, 'discount', market, locale);\r\n}\r\n\r\nexport function checkoutDiscountHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<ICheckoutPartial>) => {\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const discountCode = request.body.discountCode;\r\n const checkout = request.body.checkout;\r\n const updatedCheckout = await setDiscountCode(discountCode, checkout, market, locale);\r\n response.status(200).json(updatedCheckout);\r\n },\r\n });\r\n}\r\n","import { IEquatable, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { getRoutesForTemplates } from '@websolutespa/bom-mixer-models/server';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IOrderDetail } from './order';\r\n\r\nexport async function getOrders(params: QueryParams = {}): Promise<IOrderDetail[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.order!.findMany<IOrderDetail>(params);\r\n const { market, locale } = params;\r\n if (typeof market === 'string' && typeof locale === 'string') {\r\n const knownRoutes = await getRoutesForTemplates(['reserved_area_order_detail'], params.market, params.locale);\r\n return items.map(x => ({\r\n ...x,\r\n href: `${knownRoutes.reserved_area_order_detail}?orderId=${x.id}`,\r\n }));\r\n }\r\n return items;\r\n}\r\n\r\nexport async function getOrder(id: IEquatable, params: QueryParams = {}): Promise<IOrderDetail | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.order!.findOne<IOrderDetail>(id, params);\r\n if (item) {\r\n const { market, locale } = params;\r\n if (typeof market === 'string' && typeof locale === 'string') {\r\n const knownRoutes = await getRoutesForTemplates(['reserved_area_order_detail'], params.market, params.locale);\r\n return {\r\n ...item,\r\n href: `${knownRoutes.reserved_area_order_detail}?orderId=${item.id}`,\r\n };\r\n }\r\n }\r\n return item;\r\n}\r\n\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IPayment } from './payment';\r\n\r\n// https://github.com/MultiSafepay/MultiSafepay-icons\r\n\r\nexport async function getPayments(params: QueryParams = {}): Promise<IPayment[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.payment!.findMany<IPayment>(params);\r\n return items;\r\n}\r\n\r\nexport async function getPayment(id: IEquatable, params: QueryParams = {}): Promise<IPayment | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.payment!.findOne<IPayment>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getPaymentsPagination(params: QueryParams = {}): Promise<IPaginationResult<IPayment>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.payment!.findPaged<IPayment>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutPaymentsHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{ payments: IPayment[] }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const payments = await getPayments({\r\n market,\r\n locale,\r\n sort: 'createdAt',\r\n });\r\n response.status(200).json({ payments });\r\n },\r\n });\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { IModelStore } from '@websolutespa/bom-mixer-models';\r\nimport { apiHandler, getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { IRetailer } from './retailer';\r\n\r\nexport async function getRetailers(params: QueryParams = {}): Promise<IRetailer[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.retailer!.findMany<IRetailer>(params);\r\n return items;\r\n}\r\n\r\nexport async function getRetailer(id: IEquatable, params: QueryParams = {}): Promise<IRetailer | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.retailer!.findOne<IRetailer>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getRetailersPagination(params: QueryParams = {}): Promise<IPaginationResult<IRetailer>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.retailer!.findPaged<IRetailer>(params);\r\n return pagination;\r\n}\r\n\r\nexport function checkoutRetailersHandler() {\r\n return apiHandler({\r\n options: async (request: NextApiRequest, response: NextApiResponse) => {\r\n response.status(200).end();\r\n },\r\n post: async (request: NextApiRequest, response: NextApiResponse<{ retailers: IRetailer[] }>) => {\r\n const checkout = request.body;\r\n const locale: string | undefined = request.query.locale as string;\r\n const market: string | undefined = request.query.market as string;\r\n const retailers = await getRetailers({ market, locale });\r\n response.status(200).json({ retailers });\r\n },\r\n });\r\n}\r\n"],"mappings":";;;;;;AAKA,eAAsB,YAAY,SAAsB,EAAE,EAAuB;AAG/E,QADc,OADA,MAAM,UAAuB,EACjB,QAAS,SAAmB,OAAO;;AAI/D,eAAsB,WAAW,IAAgB,SAAsB,EAAE,EAAiC;AAGxG,QADa,OADC,MAAM,UAAuB,EAClB,QAAS,QAAkB,IAAI,OAAO;;AAIjE,eAAsB,sBAAsB,SAAsB,EAAE,EAAwC;AAG1G,QADmB,OADL,MAAM,UAAuB,EACZ,QAAS,UAAoB,OAAO;;;;ACZrE,eAAsB,SAAS,OAAoB,QAAgB,QAAgB,MAAqD;AACtI,KAAI,KAEF,QAAO,MAAM,KAAI,OAAM;EAAE,GAAG;EAAG,OAAO,EAAE,QAAQ,QAAQ;EAAK,WAAW,EAAE,QAAQ;EAAO,EAAE;KAE3F,QAAO,MAAM,KAAI,OAAM;EAAE,GAAG;EAAG,OAAO,EAAE,QAAQ;EAAO,WAAW,EAAE,QAAQ;EAAO,EAAE;;AAIzF,SAAgB,uBAAuB;AACrC,QAAO,WAAW;EAChB,SAAS,OAAO,SAAyB,aAA8B;AACrE,YAAS,OAAO,IAAI,CAAC,KAAK;;EAE5B,MAAM,OAAO,SAAyB,aAA+C;GACnF,MAAM,QAAQ,QAAQ,KAAK;GAC3B,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,SAA6B,QAAQ,MAAM;GAOjD,MAAM,OAAO,MAAM,SAAS,OAAO,QAAQ,QAN9B,MAAM,eAAe,SAAS,SAAS,CAMI;AACxD,UAAO,SAAS,OAAO,IAAI,CAAC,KAAK,KAAK;;EAEzC,CAAC;;;;ACjBJ,SAAgB,sBAAsB;AACpC,QAAO,WAAW;EAChB,SAAS,OAAO,SAAyB,aAA8B;AACrE,YAAS,OAAO,IAAI,CAAC,KAAK;;EAE5B,MAAM,OAAO,SAAyB,aAI/B;AACY,WAAQ;GACzB,MAAM,SAA6B,QAAQ,MAAM;AACd,WAAQ,MAAM;GACjD,MAAM,YAAY,MAAM,aAAa,OAAO;GAC5C,MAAM,YAAY,MAAM,aAAa,OAAO;GAE5C,MAAM,OAAO;IAAE;IAAW,SADV,MAAM,WAAW,OAAO;IACL;IAAW;AAC9C,YAAS,OAAO,IAAI,CAAC,KAAK,KAAK;;EAElC,CAAC;;AAIJ,eAAsB,eAAe,UAA4B,QAAgB,QAAgB,QAA2C;AAE1I,SAAQ,QAAR;EACE,KAAK,SACH;EACF,KAAK,OACH;EACF,KAAK;AACH,YAAS,WAAW,SAAS,WAAW;IACtC,GAAG,SAAS;IACZ,UAAU,EACR,GAAG,SAAS,UACb;IACF,GAAG,KAAA;AACJ;EACF,KAAK,WACH;EACF,KAAK,WACH;EACF,KAAK,UACH;;CAGJ,MAAM,WAAW,SAAS,QAAQ,SAAS,MAAM,QAAQ,GAAG,MAAM;AAChE,SAAO,IAAI,EAAE,QAAQ,EAAE;IACtB,EAAE,GAAG;CACR,MAAM,eAAe,SAAS,QAAQ,SAAS,MAAM,QAAQ,GAAG,MAAM;AACpE,SAAO,IAAI,EAAE,YAAY,EAAE;IAC1B,EAAE,GAAG;CACR,MAAM,wBAAQ,IAAI,MAAM;CACxB,MAAM,yBAAyB,SAAS,aAAa,EAAE,EAAE,QAAQ,GAAG,MAAM;EACxE,IAAI,QAAQ;EACZ,MAAM,WAAW,EAAE;AACnB,OACG,CAAC,SAAS,aAAa,IAAI,KAAK,SAAS,UAAU,GAAG,WACnD,CAAC,SAAS,WAAW,IAAI,KAAK,SAAS,QAAQ,GAAG,OAEtD,SAAQ,SAAS,MAAjB;GACE,KAAK,cAAc;AACjB,YAAQ,KAAK,MAAM,WAAW,SAAS,QAAQ,GAAG,GAAG;AACrD,MAAE,QAAQ;AAEV;GACF,KAAK,cAAc;AACjB,YAAQ,SAAS,QAAQ;AACzB,MAAE,QAAQ;AAEV;;AAGN,SAAO,IAAI;IACV,EAAE;AACL,SAAQ,IAAI,yBAAyB,sBAAsB;CAC3D,MAAM,gBAAgB,SAAS,UAAU,SAAS;CAClD,MAAM,2BAA2B,SAAS,aAAa,EAAE,EAAE,QAAQ,GAAG,MAAM;EAC1E,IAAI,QAAQ;EACZ,MAAM,WAAW,EAAE;AACnB,OACG,CAAC,SAAS,aAAa,IAAI,KAAK,SAAS,UAAU,GAAG,WACtD,CAAC,SAAS,WAAW,IAAI,KAAK,SAAS,QAAQ,GAAG,OAEnD,SAAQ,SAAS,MAAjB;GACE,KAAK,cAAc;AACjB,YAAQ,gBAAgB;AACxB,MAAE,QAAQ;AAEV;;AAGN,SAAO,IAAI;IACV,EAAE;AACL,SAAQ,IAAI,2BAA2B,wBAAwB;CAE/D,MAAM,SAAS,WAAW,yBAAyB;CACnD,MAAM,QAAQ,WAAW,wBAAwB,QAAQ,gBAAgB;AACzE,UAAS,WAAW;AACpB,UAAS,eAAe;AACxB,UAAS,QAAQ;AACjB,UAAS,QAAQ;AACjB,QAAO;;AAGT,SAAgB,wBAAwB;AACtC,QAAO,WAAW;EAChB,SAAS,OAAO,SAAyB,aAA8B;AACrE,YAAS,OAAO,IAAI,CAAC,KAAK;;EAE5B,MAAM,OAAO,SAAyB,aAAgD;GACpF,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,SAAiB,QAAQ,KAAK;GACpC,MAAM,WAA6B,QAAQ,KAAK;GAChD,MAAM,kBAAkB,MAAM,eAAe,UAAU,QAAQ,QAAQ,OAAO;AAC9E,YAAS,OAAO,IAAI,CAAC,KAAK,gBAAgB;;EAE7C,CAAC;;AAGJ,eAAe,mBAAmB,SAAmC,QAAgB,QAAgB;AACnG,KAAI,SAAS;AACX,MAAI,QAAQ,GACV,QAAO;AAQT,UANe,MAAM,cAAqC,mBAAmB,OAAO,UAAU,UAAU;GACtG,GAAG;GACH,SAAS,QAAQ,UAAU,QAAQ,QAAQ,KAAK,KAAA;GAChD,QAAQ,QAAQ,SAAS,QAAQ,OAAO,KAAK,KAAA;GAC7C,UAAU,QAAQ,WAAW,QAAQ,SAAS,KAAK,KAAA;GACpD,CAAC,EACY;;;AAyBlB,SAAgB,sBAAyB,EACvC,WACA,QACA,OAAO,sBACP,MAAM,yBAML;AACD,QAAO,WAAW;EAChB,SAAS,OAAO,SAAyB,aAAwD;AAC/F,YAAS,OAAO,IAAI,CAAC,KAAK;;EAE5B,MAAM,OAAO,SAAyB,aAA8B;AAClE,OAAI;IACF,MAAM,SAAS,QAAQ,MAAM;IAC7B,MAAM,SAAS,QAAQ,MAAM;AAC7B,QAAI,CAAC,UAAU,CAAC,OACd,QAAO,SAAS,OAAO,IAAI,CAAC,KAAK,EAAE,SAAS,4BAA4B,CAAC;IAE3E,MAAM,WAA6B,QAAQ;IA8C3C,IAAI,kBAA4C,KAAA;IAChD,IAAI,iBAA2C,KAAA;AAC/C,QAAI,kBAAkB,cAAc,MAAM;AACxC,uBAAkB,MAAM,mBAAmB,SAAS,iBAAiB,QAAQ,OAAO;AAGpF,sBAAiB,MAAM,mBAAmB,SAAS,gBAAgB,QAAQ,OAAO;;IAQpF,MAAM,SAAS;KACb,GAAG;KACH,gBAAgB,iBAAiB,eAAe,KAAK,KAAA;KACrD,UAAU,SAAS,WAAW;MAC5B,UAAU,SAAS,SAAS;MAC5B,OAAO,SAAS,SAAS;MACzB,WAAW,SAAS,SAAS;MAC9B,GAAG,KAAA;KACJ,YAAY,SAAS,aAAa,EAAE,EAAE,KAAI,OAAM;MAC9C,UAAU,EAAE,SAAS;MACrB,OAAO,EAAE;MACV,EAAE;KACH,QAAQ,SAAS,SAAS,EAAE,EAAE,KAAI,OAAM;MACtC,SAAS,EAAE,QAAQ;MACnB,OAAO,EAAE;MACT,WAAW,EAAE;MACb,KAAK,EAAE;MACR,EAAE;KACH,SAAS,SAAS,UAAU,SAAS,QAAQ,KAAK,KAAA;KAClD,iBAAiB,kBAAkB,gBAAgB,KAAK,KAAA;KACxD,UAAU,SAAS,WAAW,SAAS,SAAS,KAAK,KAAA;KACrD,MAAM,SAAS,OAAO,SAAS,KAAK,KAAK,KAAA;KACzC,QAAQ,SAAS,SAAS,SAAS,OAAO,KAAK,KAAA;KAChD;IAED,MAAM,cAAc,MAAM,oBAAoB,CAAC,kBAAkB,EAAE,QAAQ,OAAO;AAKlF,QAAI,kBAAkB,cAAc,MAAM;KAExC,MAAM,SADS,MAAM,cAAgC,iBAAiB,OAAO,UAAU,UAAU,OAAO,EACnF;KAIrB,MAAM,OAAO,EAAE,aADK,GAAG,YAAY,gBAAgB,WAAW,MAAM,GAAG,aAC3C;AAC5B,cAAS,OAAO,IAAI,CAAC,KAAK,KAAK;WAE1B;KAEL,MAAM,OAAO,EAAE,aADK,GAAG,YAAY,gBAAgB,uBACvB;AAC5B,cAAS,OAAO,IAAI,CAAC,KAAK,KAAK;;YAI1B,OAAO;AACd,aAAS,OAAO,IAAI,CAAC,KAAK,MAAM;;;EAGrC,CAAC;;AAIJ,eAAsB,cAAc,UAA4B,QAAgB,QAAmD;AACjI,SAAQ,IAAI,iBAAiB,SAAS;AAItC,QAAO,EAAE,aADW,IAFA,MAAM,oBAAoB,CAAC,kBAAkB,EAAE,QAAQ,OAAO,EAE/C,gBAAgB,uBAC7B;;;;ACpTxB,eAAsB,cAAc,SAAsB,EAAE,EAAwB;AAGlF,QADc,OADA,MAAM,UAAuB,EACjB,SAAU,SAAoB,OAAO;;AAIjE,eAAsB,YAAY,IAAgB,SAAsB,EAAE,EAAkC;AAG1G,QADa,OADC,MAAM,UAAuB,EAClB,SAAU,QAAmB,IAAI,OAAO;;AAInE,eAAsB,wBAAwB,SAAsB,EAAE,EAAyC;AAG7G,QADmB,OADL,MAAM,UAAuB,EACZ,SAAU,UAAqB,OAAO;;AAIvE,SAAgB,0BAA0B;AACxC,QAAO,WAAW;EAChB,SAAS,OAAO,SAAyB,aAA8B;AACrE,YAAS,OAAO,IAAI,CAAC,KAAK;;EAE5B,MAAM,OAAO,SAAyB,aAA8B;AACjD,WAAQ;GACzB,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,SAA6B,QAAQ,MAAM;;;;GASjD,MAAM,cARQ,MAAM,cAAc;IAChC;IACA;IACA,MAAM;IACP,CAAC,EAI4C,KAAI,MAAK;IACrD,MAAM,WAAW;KACf,GAAG;KACH,UAAU;KACV,OAAO;KACP,WAAW;KACZ;AACD,YAAQ,EAAE,IAAV;KACE,KAAK;AACH,eAAS,QAAQ;AACjB,eAAS,YAAY;AACrB;KACF,KAAK;AACH,eAAS,QAAQ;AACjB,eAAS,YAAY;AACrB;KACF,KAAK;AACH,eAAS,QAAQ;AACjB,eAAS,YAAY;AACrB;;AAEJ,WAAO;KACP;AACF,YAAS,OAAO,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;;EAE5C,CAAC;;;;AC3DJ,eAAsB,aAAa,SAAsB,EAAE,EAAwB;AAGjF,QADc,OADA,MAAM,UAAuB,EACjB,SAAU,SAAoB,OAAO;;AAIjE,eAAsB,YAAY,IAAgB,SAAsB,EAAE,EAAkC;AAG1G,QADa,OADC,MAAM,UAAuB,EAClB,SAAU,QAAmB,IAAI,OAAO;;AAInE,eAAsB,uBAAuB,SAAsB,EAAE,EAAyC;AAG5G,QADmB,OADL,MAAM,UAAuB,EACZ,SAAU,UAAqB,OAAO;;AAKvE,eAAsB,gBAAgB,cAAsB,UAA4B,QAAgB,QAA2C;CACjJ,MAAM,YAAiC,EAAE;CACzC,MAAM,wBAAQ,IAAI,MAAM;CACxB,MAAM,WAAW,MAAM,YAAY,cAAc;EAC/C;EACA;EACD,CAAC;AACF,SAAQ,IAAI,YAAY,SAAS;AACjC,KAAI,aACD,CAAC,SAAS,aAAa,IAAI,KAAK,SAAS,UAAU,GAAG,WACtD,CAAC,SAAS,WAAW,IAAI,KAAK,SAAS,QAAQ,GAAG,QACnD;EACA,IAAI,QAAQ;AACZ,UAAQ,SAAS,MAAjB;GACE,KAAK,cAAc;IAAS;KAC1B,MAAM,SAAS,SAAS,SAAS,EAAE,EAAE,QAAQ,GAAG,MAAM,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC7E,aAAQ,KAAK,MAAM,QAAQ,SAAS,QAAQ,GAAG,GAAG;;AAElD;GACF,KAAK,cAAc;AACjB,YAAQ,SAAS,QAAQ;AACzB;GACF,KAAK,cAAc;AAEjB,aADiB,SAAS,UAAU,SAAS,KAC1B;AAEnB;;AAEJ,UAAQ,IAAI,kBAAkB,MAAM;AACpC,YAAU,KAAK;GACb;GACA;GACD,CAAC;;AAEJ,QAAO,MAAM,eAAe;EAAE,GAAG;EAAU;EAAW,EAAE,YAAY,QAAQ,OAAO;;AAGrF,SAAgB,0BAA0B;AACxC,QAAO,WAAW;EAChB,SAAS,OAAO,SAAyB,aAA8B;AACrE,YAAS,OAAO,IAAI,CAAC,KAAK;;EAE5B,MAAM,OAAO,SAAyB,aAAgD;GACpF,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,eAAe,QAAQ,KAAK;GAClC,MAAM,WAAW,QAAQ,KAAK;GAC9B,MAAM,kBAAkB,MAAM,gBAAgB,cAAc,UAAU,QAAQ,OAAO;AACrF,YAAS,OAAO,IAAI,CAAC,KAAK,gBAAgB;;EAE7C,CAAC;;;;ACvEJ,eAAsB,UAAU,SAAsB,EAAE,EAA2B;CAEjF,MAAM,QAAQ,OADA,MAAM,UAAuB,EACjB,MAAO,SAAuB,OAAO;CAC/D,MAAM,EAAE,QAAQ,WAAW;AAC3B,KAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;EAC5D,MAAM,cAAc,MAAM,sBAAsB,CAAC,6BAA6B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAC7G,SAAO,MAAM,KAAI,OAAM;GACrB,GAAG;GACH,MAAM,GAAG,YAAY,2BAA2B,WAAW,EAAE;GAC9D,EAAE;;AAEL,QAAO;;AAGT,eAAsB,SAAS,IAAgB,SAAsB,EAAE,EAAqC;CAE1G,MAAM,OAAO,OADC,MAAM,UAAuB,EAClB,MAAO,QAAsB,IAAI,OAAO;AACjE,KAAI,MAAM;EACR,MAAM,EAAE,QAAQ,WAAW;AAC3B,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;GAC5D,MAAM,cAAc,MAAM,sBAAsB,CAAC,6BAA6B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAC7G,UAAO;IACL,GAAG;IACH,MAAM,GAAG,YAAY,2BAA2B,WAAW,KAAK;IACjE;;;AAGL,QAAO;;;;ACzBT,eAAsB,YAAY,SAAsB,EAAE,EAAuB;AAG/E,QADc,OADA,MAAM,UAAuB,EACjB,QAAS,SAAmB,OAAO;;AAI/D,eAAsB,WAAW,IAAgB,SAAsB,EAAE,EAAiC;AAGxG,QADa,OADC,MAAM,UAAuB,EAClB,QAAS,QAAkB,IAAI,OAAO;;AAIjE,eAAsB,sBAAsB,SAAsB,EAAE,EAAwC;AAG1G,QADmB,OADL,MAAM,UAAuB,EACZ,QAAS,UAAoB,OAAO;;AAIrE,SAAgB,0BAA0B;AACxC,QAAO,WAAW;EAChB,SAAS,OAAO,SAAyB,aAA8B;AACrE,YAAS,OAAO,IAAI,CAAC,KAAK;;EAE5B,MAAM,OAAO,SAAyB,aAAwD;AAC3E,WAAQ;GACzB,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,WAAW,MAAM,YAAY;IACjC;IACA;IACA,MAAM;IACP,CAAC;AACF,YAAS,OAAO,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC;;EAE1C,CAAC;;;;ACpCJ,eAAsB,aAAa,SAAsB,EAAE,EAAwB;AAGjF,QADc,OADA,MAAM,UAAuB,EACjB,SAAU,SAAoB,OAAO;;AAIjE,eAAsB,YAAY,IAAgB,SAAsB,EAAE,EAAkC;AAG1G,QADa,OADC,MAAM,UAAuB,EAClB,SAAU,QAAmB,IAAI,OAAO;;AAInE,eAAsB,uBAAuB,SAAsB,EAAE,EAAyC;AAG5G,QADmB,OADL,MAAM,UAAuB,EACZ,SAAU,UAAqB,OAAO;;AAIvE,SAAgB,2BAA2B;AACzC,QAAO,WAAW;EAChB,SAAS,OAAO,SAAyB,aAA8B;AACrE,YAAS,OAAO,IAAI,CAAC,KAAK;;EAE5B,MAAM,OAAO,SAAyB,aAA0D;AAC7E,WAAQ;GACzB,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,SAA6B,QAAQ,MAAM;GACjD,MAAM,YAAY,MAAM,aAAa;IAAE;IAAQ;IAAQ,CAAC;AACxD,YAAS,OAAO,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;;EAE3C,CAAC"}
|