@hartl-services/medusa-base 2.3.0 → 2.4.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/.medusa/server/src/admin/index.js +105 -47
- package/.medusa/server/src/admin/index.mjs +105 -47
- package/.medusa/server/src/api/admin/draft-orders/[id]/order-confirmation/route.js +23 -0
- package/.medusa/server/src/api/middlewares.js +16 -2
- package/.medusa/server/src/subscribers/order-zero-total-paid.js +19 -0
- package/.medusa/server/src/workflows/email/update-draft-order-confirmation.js +49 -0
- package/.medusa/server/src/workflows/hooks/draft-order-confirmation-default.js +39 -0
- package/.medusa/server/src/workflows/order/mark-zero-total-order-paid.js +45 -0
- package/README.md +45 -1
- package/package.json +2 -2
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
const jsxRuntime = require("react/jsx-runtime");
|
|
3
|
-
const react = require("react");
|
|
4
3
|
const adminSdk = require("@medusajs/admin-sdk");
|
|
5
4
|
const ui = require("@medusajs/ui");
|
|
6
5
|
const reactQuery = require("@tanstack/react-query");
|
|
7
|
-
const
|
|
6
|
+
const email = require("@hartl-services/medusa-food-supplements-contracts/paths/email");
|
|
8
7
|
const Medusa = require("@medusajs/js-sdk");
|
|
9
8
|
const reactRouterDom = require("react-router-dom");
|
|
10
9
|
const pluginFeatures = require("@hartl-services/medusa-food-supplements-contracts/paths/plugin-features");
|
|
11
|
-
const
|
|
10
|
+
const react = require("react");
|
|
11
|
+
const documents = require("@hartl-services/medusa-food-supplements-contracts/paths/documents");
|
|
12
12
|
const email$1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/email");
|
|
13
13
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
14
14
|
const Medusa__default = /* @__PURE__ */ _interopDefault(Medusa);
|
|
@@ -1026,6 +1026,103 @@ const PluginFeatureDisabledNotice = ({
|
|
|
1026
1026
|
]
|
|
1027
1027
|
}
|
|
1028
1028
|
);
|
|
1029
|
+
const withPagination = (params) => new URLSearchParams({
|
|
1030
|
+
limit: String(params.limit),
|
|
1031
|
+
offset: String(params.offset)
|
|
1032
|
+
});
|
|
1033
|
+
const withMessageQuery = (path, params) => {
|
|
1034
|
+
const query = withPagination(params);
|
|
1035
|
+
if (params.kind) {
|
|
1036
|
+
query.set("kind", params.kind);
|
|
1037
|
+
}
|
|
1038
|
+
if (params.status) {
|
|
1039
|
+
query.set("status", params.status);
|
|
1040
|
+
}
|
|
1041
|
+
if (params.resource_id) {
|
|
1042
|
+
query.set("resource_id", params.resource_id);
|
|
1043
|
+
}
|
|
1044
|
+
return `${path}?${query.toString()}`;
|
|
1045
|
+
};
|
|
1046
|
+
const listEmailMessages = (params) => sdk.client.fetch(
|
|
1047
|
+
withMessageQuery(email.emailAdminPaths.get.list, params)
|
|
1048
|
+
);
|
|
1049
|
+
const retrieveEmailMessage = (messageId) => sdk.client.fetch(
|
|
1050
|
+
email.emailAdminPaths.get.detail(messageId)
|
|
1051
|
+
);
|
|
1052
|
+
const resendEmailMessage = (messageId, body) => sdk.client.fetch(
|
|
1053
|
+
email.emailAdminPaths.post.resend(messageId),
|
|
1054
|
+
{ method: "POST", body }
|
|
1055
|
+
);
|
|
1056
|
+
const listEmailTermsVersions = (params) => {
|
|
1057
|
+
const query = withPagination(params);
|
|
1058
|
+
return sdk.client.fetch(
|
|
1059
|
+
`${email.emailAdminPaths.get.termsVersions}?${query.toString()}`
|
|
1060
|
+
);
|
|
1061
|
+
};
|
|
1062
|
+
const createEmailTermsVersion = (body) => sdk.client.fetch(
|
|
1063
|
+
email.emailAdminPaths.post.createTermsVersion,
|
|
1064
|
+
{ method: "POST", body }
|
|
1065
|
+
);
|
|
1066
|
+
const downloadEmailTermsVersion = async (termsVersionId) => {
|
|
1067
|
+
const response = await sdk.client.fetch(
|
|
1068
|
+
email.emailAdminPaths.get.downloadTermsVersion(termsVersionId),
|
|
1069
|
+
{ headers: { accept: "application/pdf" } }
|
|
1070
|
+
);
|
|
1071
|
+
return response.blob();
|
|
1072
|
+
};
|
|
1073
|
+
const retrieveDraftOrderConfirmation = (draftOrderId) => sdk.client.fetch(
|
|
1074
|
+
email.emailAdminPaths.get.draftOrderConfirmation(draftOrderId)
|
|
1075
|
+
);
|
|
1076
|
+
const updateDraftOrderConfirmation = (draftOrderId, body) => sdk.client.fetch(
|
|
1077
|
+
email.emailAdminPaths.post.updateDraftOrderConfirmation(draftOrderId),
|
|
1078
|
+
{ method: "POST", body }
|
|
1079
|
+
);
|
|
1080
|
+
const DraftOrderConfirmationWidgetContent = ({
|
|
1081
|
+
data
|
|
1082
|
+
}) => {
|
|
1083
|
+
const queryClient = reactQuery.useQueryClient();
|
|
1084
|
+
const queryKey = ["email", "draft-order-confirmation", data.id];
|
|
1085
|
+
const confirmationQuery = reactQuery.useQuery({
|
|
1086
|
+
queryKey,
|
|
1087
|
+
queryFn: () => retrieveDraftOrderConfirmation(data.id)
|
|
1088
|
+
});
|
|
1089
|
+
const update = reactQuery.useMutation({
|
|
1090
|
+
mutationFn: (send2) => updateDraftOrderConfirmation(data.id, { send_order_confirmation: send2 }),
|
|
1091
|
+
onSuccess: (confirmation) => {
|
|
1092
|
+
queryClient.setQueryData(queryKey, confirmation);
|
|
1093
|
+
},
|
|
1094
|
+
onError: (error) => {
|
|
1095
|
+
ui.toast.error("Die Einstellung konnte nicht gespeichert werden.", {
|
|
1096
|
+
description: getErrorMessage(error)
|
|
1097
|
+
});
|
|
1098
|
+
}
|
|
1099
|
+
});
|
|
1100
|
+
const switchId = `draft-order-confirmation-${data.id}`;
|
|
1101
|
+
const send = confirmationQuery.data?.send_order_confirmation;
|
|
1102
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
|
|
1103
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: "Bestellbestätigung" }) }),
|
|
1104
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-4 px-6 py-4", children: [
|
|
1105
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
|
|
1106
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { htmlFor: switchId, weight: "plus", children: "An Kunden senden" }),
|
|
1107
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: confirmationQuery.isError ? "Die Einstellung konnte nicht geladen werden." : send ? "Beim Umwandeln in eine Bestellung erhält der Kunde die Bestellbestätigung." : "Beim Umwandeln in eine Bestellung wird keine Bestellbestätigung an den Kunden gesendet." })
|
|
1108
|
+
] }),
|
|
1109
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1110
|
+
ui.Switch,
|
|
1111
|
+
{
|
|
1112
|
+
id: switchId,
|
|
1113
|
+
className: "shrink-0",
|
|
1114
|
+
checked: send === true,
|
|
1115
|
+
disabled: send === void 0 || update.isPending,
|
|
1116
|
+
onCheckedChange: (checked) => update.mutate(checked === true)
|
|
1117
|
+
}
|
|
1118
|
+
)
|
|
1119
|
+
] })
|
|
1120
|
+
] });
|
|
1121
|
+
};
|
|
1122
|
+
const DraftOrderConfirmationWidget = (props) => /* @__PURE__ */ jsxRuntime.jsx(PluginFeatureGate, { pluginKey: "email", featureKeys: ["order_mails"], children: /* @__PURE__ */ jsxRuntime.jsx(DraftOrderConfirmationWidgetContent, { ...props }) });
|
|
1123
|
+
adminSdk.defineWidgetConfig({
|
|
1124
|
+
zone: "draft_order.details.side.after"
|
|
1125
|
+
});
|
|
1029
1126
|
const listOrderDocuments = (orderId) => sdk.client.fetch(
|
|
1030
1127
|
documents.documentsPaths.admin.get.listForOrder(orderId)
|
|
1031
1128
|
);
|
|
@@ -1613,50 +1710,6 @@ const PluginFeaturesSettingsPage = () => {
|
|
|
1613
1710
|
const config = adminSdk.defineRouteConfig({
|
|
1614
1711
|
label: texts.menu.label
|
|
1615
1712
|
});
|
|
1616
|
-
const withPagination = (params) => new URLSearchParams({
|
|
1617
|
-
limit: String(params.limit),
|
|
1618
|
-
offset: String(params.offset)
|
|
1619
|
-
});
|
|
1620
|
-
const withMessageQuery = (path, params) => {
|
|
1621
|
-
const query = withPagination(params);
|
|
1622
|
-
if (params.kind) {
|
|
1623
|
-
query.set("kind", params.kind);
|
|
1624
|
-
}
|
|
1625
|
-
if (params.status) {
|
|
1626
|
-
query.set("status", params.status);
|
|
1627
|
-
}
|
|
1628
|
-
if (params.resource_id) {
|
|
1629
|
-
query.set("resource_id", params.resource_id);
|
|
1630
|
-
}
|
|
1631
|
-
return `${path}?${query.toString()}`;
|
|
1632
|
-
};
|
|
1633
|
-
const listEmailMessages = (params) => sdk.client.fetch(
|
|
1634
|
-
withMessageQuery(email.emailAdminPaths.get.list, params)
|
|
1635
|
-
);
|
|
1636
|
-
const retrieveEmailMessage = (messageId) => sdk.client.fetch(
|
|
1637
|
-
email.emailAdminPaths.get.detail(messageId)
|
|
1638
|
-
);
|
|
1639
|
-
const resendEmailMessage = (messageId, body) => sdk.client.fetch(
|
|
1640
|
-
email.emailAdminPaths.post.resend(messageId),
|
|
1641
|
-
{ method: "POST", body }
|
|
1642
|
-
);
|
|
1643
|
-
const listEmailTermsVersions = (params) => {
|
|
1644
|
-
const query = withPagination(params);
|
|
1645
|
-
return sdk.client.fetch(
|
|
1646
|
-
`${email.emailAdminPaths.get.termsVersions}?${query.toString()}`
|
|
1647
|
-
);
|
|
1648
|
-
};
|
|
1649
|
-
const createEmailTermsVersion = (body) => sdk.client.fetch(
|
|
1650
|
-
email.emailAdminPaths.post.createTermsVersion,
|
|
1651
|
-
{ method: "POST", body }
|
|
1652
|
-
);
|
|
1653
|
-
const downloadEmailTermsVersion = async (termsVersionId) => {
|
|
1654
|
-
const response = await sdk.client.fetch(
|
|
1655
|
-
email.emailAdminPaths.get.downloadTermsVersion(termsVersionId),
|
|
1656
|
-
{ headers: { accept: "application/pdf" } }
|
|
1657
|
-
);
|
|
1658
|
-
return response.blob();
|
|
1659
|
-
};
|
|
1660
1713
|
const PAGE_SIZE$1 = 20;
|
|
1661
1714
|
const MAX_PAGE_OFFSET$1 = 1e4;
|
|
1662
1715
|
const MAX_RESOURCE_ID_LENGTH = 255;
|
|
@@ -2485,6 +2538,11 @@ const PluginDetailPage = () => {
|
|
|
2485
2538
|
return /* @__PURE__ */ jsxRuntime.jsx(PluginPageShell, { pluginKey, children: /* @__PURE__ */ jsxRuntime.jsx(PluginFeatureSections, { pluginKey }) });
|
|
2486
2539
|
};
|
|
2487
2540
|
const widgetModule = { widgets: [
|
|
2541
|
+
{
|
|
2542
|
+
Component: DraftOrderConfirmationWidget,
|
|
2543
|
+
zone: ["draft_order.details.side.after"],
|
|
2544
|
+
widgetId: "Widget-24ee"
|
|
2545
|
+
},
|
|
2488
2546
|
{
|
|
2489
2547
|
Component: OrderDocumentsWidget,
|
|
2490
2548
|
zone: ["order.details.side.after"],
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect, useMemo, useRef } from "react";
|
|
3
2
|
import { defineWidgetConfig, defineRouteConfig } from "@medusajs/admin-sdk";
|
|
4
3
|
import { toast, Button, Text, Hint, Container, Heading, Alert, Label, Switch, Input, Select, StatusBadge, usePrompt, FocusModal, Prompt } from "@medusajs/ui";
|
|
5
4
|
import { useQuery, useQueryClient, useMutation } from "@tanstack/react-query";
|
|
6
|
-
import {
|
|
5
|
+
import { emailAdminPaths } from "@hartl-services/medusa-food-supplements-contracts/paths/email";
|
|
7
6
|
import Medusa from "@medusajs/js-sdk";
|
|
8
7
|
import { Link, useParams } from "react-router-dom";
|
|
9
8
|
import { pluginFeaturesAdminPaths } from "@hartl-services/medusa-food-supplements-contracts/paths/plugin-features";
|
|
10
|
-
import {
|
|
9
|
+
import { useState, useEffect, useMemo, useRef } from "react";
|
|
10
|
+
import { documentsPaths, packingListsPaths } from "@hartl-services/medusa-food-supplements-contracts/paths/documents";
|
|
11
11
|
import { EMAIL_TERMS_MAX_PDF_BYTES } from "@hartl-services/medusa-food-supplements-contracts/schemas/email";
|
|
12
12
|
const texts = {
|
|
13
13
|
menu: {
|
|
@@ -1023,6 +1023,103 @@ const PluginFeatureDisabledNotice = ({
|
|
|
1023
1023
|
]
|
|
1024
1024
|
}
|
|
1025
1025
|
);
|
|
1026
|
+
const withPagination = (params) => new URLSearchParams({
|
|
1027
|
+
limit: String(params.limit),
|
|
1028
|
+
offset: String(params.offset)
|
|
1029
|
+
});
|
|
1030
|
+
const withMessageQuery = (path, params) => {
|
|
1031
|
+
const query = withPagination(params);
|
|
1032
|
+
if (params.kind) {
|
|
1033
|
+
query.set("kind", params.kind);
|
|
1034
|
+
}
|
|
1035
|
+
if (params.status) {
|
|
1036
|
+
query.set("status", params.status);
|
|
1037
|
+
}
|
|
1038
|
+
if (params.resource_id) {
|
|
1039
|
+
query.set("resource_id", params.resource_id);
|
|
1040
|
+
}
|
|
1041
|
+
return `${path}?${query.toString()}`;
|
|
1042
|
+
};
|
|
1043
|
+
const listEmailMessages = (params) => sdk.client.fetch(
|
|
1044
|
+
withMessageQuery(emailAdminPaths.get.list, params)
|
|
1045
|
+
);
|
|
1046
|
+
const retrieveEmailMessage = (messageId) => sdk.client.fetch(
|
|
1047
|
+
emailAdminPaths.get.detail(messageId)
|
|
1048
|
+
);
|
|
1049
|
+
const resendEmailMessage = (messageId, body) => sdk.client.fetch(
|
|
1050
|
+
emailAdminPaths.post.resend(messageId),
|
|
1051
|
+
{ method: "POST", body }
|
|
1052
|
+
);
|
|
1053
|
+
const listEmailTermsVersions = (params) => {
|
|
1054
|
+
const query = withPagination(params);
|
|
1055
|
+
return sdk.client.fetch(
|
|
1056
|
+
`${emailAdminPaths.get.termsVersions}?${query.toString()}`
|
|
1057
|
+
);
|
|
1058
|
+
};
|
|
1059
|
+
const createEmailTermsVersion = (body) => sdk.client.fetch(
|
|
1060
|
+
emailAdminPaths.post.createTermsVersion,
|
|
1061
|
+
{ method: "POST", body }
|
|
1062
|
+
);
|
|
1063
|
+
const downloadEmailTermsVersion = async (termsVersionId) => {
|
|
1064
|
+
const response = await sdk.client.fetch(
|
|
1065
|
+
emailAdminPaths.get.downloadTermsVersion(termsVersionId),
|
|
1066
|
+
{ headers: { accept: "application/pdf" } }
|
|
1067
|
+
);
|
|
1068
|
+
return response.blob();
|
|
1069
|
+
};
|
|
1070
|
+
const retrieveDraftOrderConfirmation = (draftOrderId) => sdk.client.fetch(
|
|
1071
|
+
emailAdminPaths.get.draftOrderConfirmation(draftOrderId)
|
|
1072
|
+
);
|
|
1073
|
+
const updateDraftOrderConfirmation = (draftOrderId, body) => sdk.client.fetch(
|
|
1074
|
+
emailAdminPaths.post.updateDraftOrderConfirmation(draftOrderId),
|
|
1075
|
+
{ method: "POST", body }
|
|
1076
|
+
);
|
|
1077
|
+
const DraftOrderConfirmationWidgetContent = ({
|
|
1078
|
+
data
|
|
1079
|
+
}) => {
|
|
1080
|
+
const queryClient = useQueryClient();
|
|
1081
|
+
const queryKey = ["email", "draft-order-confirmation", data.id];
|
|
1082
|
+
const confirmationQuery = useQuery({
|
|
1083
|
+
queryKey,
|
|
1084
|
+
queryFn: () => retrieveDraftOrderConfirmation(data.id)
|
|
1085
|
+
});
|
|
1086
|
+
const update = useMutation({
|
|
1087
|
+
mutationFn: (send2) => updateDraftOrderConfirmation(data.id, { send_order_confirmation: send2 }),
|
|
1088
|
+
onSuccess: (confirmation) => {
|
|
1089
|
+
queryClient.setQueryData(queryKey, confirmation);
|
|
1090
|
+
},
|
|
1091
|
+
onError: (error) => {
|
|
1092
|
+
toast.error("Die Einstellung konnte nicht gespeichert werden.", {
|
|
1093
|
+
description: getErrorMessage(error)
|
|
1094
|
+
});
|
|
1095
|
+
}
|
|
1096
|
+
});
|
|
1097
|
+
const switchId = `draft-order-confirmation-${data.id}`;
|
|
1098
|
+
const send = confirmationQuery.data?.send_order_confirmation;
|
|
1099
|
+
return /* @__PURE__ */ jsxs(Container, { className: "divide-y p-0", children: [
|
|
1100
|
+
/* @__PURE__ */ jsx("div", { className: "px-6 py-4", children: /* @__PURE__ */ jsx(Heading, { level: "h2", children: "Bestellbestätigung" }) }),
|
|
1101
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4 px-6 py-4", children: [
|
|
1102
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
1103
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: switchId, weight: "plus", children: "An Kunden senden" }),
|
|
1104
|
+
/* @__PURE__ */ jsx(Text, { size: "small", className: "text-ui-fg-subtle", children: confirmationQuery.isError ? "Die Einstellung konnte nicht geladen werden." : send ? "Beim Umwandeln in eine Bestellung erhält der Kunde die Bestellbestätigung." : "Beim Umwandeln in eine Bestellung wird keine Bestellbestätigung an den Kunden gesendet." })
|
|
1105
|
+
] }),
|
|
1106
|
+
/* @__PURE__ */ jsx(
|
|
1107
|
+
Switch,
|
|
1108
|
+
{
|
|
1109
|
+
id: switchId,
|
|
1110
|
+
className: "shrink-0",
|
|
1111
|
+
checked: send === true,
|
|
1112
|
+
disabled: send === void 0 || update.isPending,
|
|
1113
|
+
onCheckedChange: (checked) => update.mutate(checked === true)
|
|
1114
|
+
}
|
|
1115
|
+
)
|
|
1116
|
+
] })
|
|
1117
|
+
] });
|
|
1118
|
+
};
|
|
1119
|
+
const DraftOrderConfirmationWidget = (props) => /* @__PURE__ */ jsx(PluginFeatureGate, { pluginKey: "email", featureKeys: ["order_mails"], children: /* @__PURE__ */ jsx(DraftOrderConfirmationWidgetContent, { ...props }) });
|
|
1120
|
+
defineWidgetConfig({
|
|
1121
|
+
zone: "draft_order.details.side.after"
|
|
1122
|
+
});
|
|
1026
1123
|
const listOrderDocuments = (orderId) => sdk.client.fetch(
|
|
1027
1124
|
documentsPaths.admin.get.listForOrder(orderId)
|
|
1028
1125
|
);
|
|
@@ -1610,50 +1707,6 @@ const PluginFeaturesSettingsPage = () => {
|
|
|
1610
1707
|
const config = defineRouteConfig({
|
|
1611
1708
|
label: texts.menu.label
|
|
1612
1709
|
});
|
|
1613
|
-
const withPagination = (params) => new URLSearchParams({
|
|
1614
|
-
limit: String(params.limit),
|
|
1615
|
-
offset: String(params.offset)
|
|
1616
|
-
});
|
|
1617
|
-
const withMessageQuery = (path, params) => {
|
|
1618
|
-
const query = withPagination(params);
|
|
1619
|
-
if (params.kind) {
|
|
1620
|
-
query.set("kind", params.kind);
|
|
1621
|
-
}
|
|
1622
|
-
if (params.status) {
|
|
1623
|
-
query.set("status", params.status);
|
|
1624
|
-
}
|
|
1625
|
-
if (params.resource_id) {
|
|
1626
|
-
query.set("resource_id", params.resource_id);
|
|
1627
|
-
}
|
|
1628
|
-
return `${path}?${query.toString()}`;
|
|
1629
|
-
};
|
|
1630
|
-
const listEmailMessages = (params) => sdk.client.fetch(
|
|
1631
|
-
withMessageQuery(emailAdminPaths.get.list, params)
|
|
1632
|
-
);
|
|
1633
|
-
const retrieveEmailMessage = (messageId) => sdk.client.fetch(
|
|
1634
|
-
emailAdminPaths.get.detail(messageId)
|
|
1635
|
-
);
|
|
1636
|
-
const resendEmailMessage = (messageId, body) => sdk.client.fetch(
|
|
1637
|
-
emailAdminPaths.post.resend(messageId),
|
|
1638
|
-
{ method: "POST", body }
|
|
1639
|
-
);
|
|
1640
|
-
const listEmailTermsVersions = (params) => {
|
|
1641
|
-
const query = withPagination(params);
|
|
1642
|
-
return sdk.client.fetch(
|
|
1643
|
-
`${emailAdminPaths.get.termsVersions}?${query.toString()}`
|
|
1644
|
-
);
|
|
1645
|
-
};
|
|
1646
|
-
const createEmailTermsVersion = (body) => sdk.client.fetch(
|
|
1647
|
-
emailAdminPaths.post.createTermsVersion,
|
|
1648
|
-
{ method: "POST", body }
|
|
1649
|
-
);
|
|
1650
|
-
const downloadEmailTermsVersion = async (termsVersionId) => {
|
|
1651
|
-
const response = await sdk.client.fetch(
|
|
1652
|
-
emailAdminPaths.get.downloadTermsVersion(termsVersionId),
|
|
1653
|
-
{ headers: { accept: "application/pdf" } }
|
|
1654
|
-
);
|
|
1655
|
-
return response.blob();
|
|
1656
|
-
};
|
|
1657
1710
|
const PAGE_SIZE$1 = 20;
|
|
1658
1711
|
const MAX_PAGE_OFFSET$1 = 1e4;
|
|
1659
1712
|
const MAX_RESOURCE_ID_LENGTH = 255;
|
|
@@ -2482,6 +2535,11 @@ const PluginDetailPage = () => {
|
|
|
2482
2535
|
return /* @__PURE__ */ jsx(PluginPageShell, { pluginKey, children: /* @__PURE__ */ jsx(PluginFeatureSections, { pluginKey }) });
|
|
2483
2536
|
};
|
|
2484
2537
|
const widgetModule = { widgets: [
|
|
2538
|
+
{
|
|
2539
|
+
Component: DraftOrderConfirmationWidget,
|
|
2540
|
+
zone: ["draft_order.details.side.after"],
|
|
2541
|
+
widgetId: "Widget-24ee"
|
|
2542
|
+
},
|
|
2485
2543
|
{
|
|
2486
2544
|
Component: OrderDocumentsWidget,
|
|
2487
2545
|
zone: ["order.details.side.after"],
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = exports.GET = void 0;
|
|
4
|
+
const email_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/email");
|
|
5
|
+
const update_draft_order_confirmation_1 = require("../../../../../workflows/email/update-draft-order-confirmation");
|
|
6
|
+
/** Every authenticated Admin user can read a draft's confirmation choice. */
|
|
7
|
+
const GET = async (req, res) => {
|
|
8
|
+
const confirmation = await (0, update_draft_order_confirmation_1.getDraftOrderConfirmation)(req.scope, req.params.id);
|
|
9
|
+
res.json(email_1.AdminDraftOrderConfirmationResponseSchema.parse(confirmation));
|
|
10
|
+
};
|
|
11
|
+
exports.GET = GET;
|
|
12
|
+
/** Every authenticated Admin user can switch it while the order is a draft. */
|
|
13
|
+
const POST = async (req, res) => {
|
|
14
|
+
const { result } = await (0, update_draft_order_confirmation_1.updateDraftOrderConfirmationWorkflow)(req.scope).run({
|
|
15
|
+
input: {
|
|
16
|
+
draft_order_id: req.params.id,
|
|
17
|
+
send_order_confirmation: req.validatedBody.send_order_confirmation,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
res.json(email_1.AdminDraftOrderConfirmationResponseSchema.parse(result));
|
|
21
|
+
};
|
|
22
|
+
exports.POST = POST;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL2FkbWluL2RyYWZ0LW9yZGVycy9baWRdL29yZGVyLWNvbmZpcm1hdGlvbi9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSwyRkFBNEg7QUFNNUgsb0hBR3dFO0FBRXhFLDZFQUE2RTtBQUN0RSxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQ3RCLEdBQStCLEVBQy9CLEdBQXdELEVBQ3pDLEVBQUU7SUFDakIsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFBLDJEQUF5QixFQUNsRCxHQUFHLENBQUMsS0FBSyxFQUNULEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUNkLENBQUM7SUFDRixHQUFHLENBQUMsSUFBSSxDQUFDLGlEQUF5QyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQztBQVRXLFFBQUEsR0FBRyxPQVNkO0FBRUYsK0VBQStFO0FBQ3hFLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDdkIsR0FBa0UsRUFDbEUsR0FBd0QsRUFDekMsRUFBRTtJQUNqQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFBLHNFQUFvQyxFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDM0UsS0FBSyxFQUFFO1lBQ0wsY0FBYyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM3Qix1QkFBdUIsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLHVCQUF1QjtTQUNuRTtLQUNGLENBQUMsQ0FBQztJQUNILEdBQUcsQ0FBQyxJQUFJLENBQUMsaURBQXlDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQyxDQUFDO0FBWFcsUUFBQSxJQUFJLFFBV2YifQ==
|
|
@@ -59,7 +59,8 @@ exports.default = (0, http_1.defineMiddlewares)({
|
|
|
59
59
|
// registers it with `app.use`, a prefix match that runs before every
|
|
60
60
|
// method-specific entry below, so a switched-off plugin answers 404 for
|
|
61
61
|
// the whole Admin mail log and the terms versions.
|
|
62
|
-
// The mail features gate subscribers only
|
|
62
|
+
// The mail features gate subscribers only, except the draft-order
|
|
63
|
+
// confirmation switch below, which belongs to `order_mails`.
|
|
63
64
|
{
|
|
64
65
|
matcher: "/admin/email",
|
|
65
66
|
middlewares: [(0, public_1.requirePluginFeature)(plugin_features_3.emailPluginFeatures)],
|
|
@@ -111,6 +112,19 @@ exports.default = (0, http_1.defineMiddlewares)({
|
|
|
111
112
|
methods: ["GET"],
|
|
112
113
|
middlewares: [(0, http_1.authenticate)("user", ["session", "bearer"])],
|
|
113
114
|
},
|
|
115
|
+
// Customer order confirmation of an Admin draft order (off by default,
|
|
116
|
+
// see workflows/hooks/draft-order-confirmation-default.ts).
|
|
117
|
+
{
|
|
118
|
+
matcher: "/admin/draft-orders/:id/order-confirmation",
|
|
119
|
+
middlewares: [(0, public_1.requirePluginFeature)(plugin_features_3.emailPluginFeatures, "order_mails")],
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
matcher: "/admin/draft-orders/:id/order-confirmation",
|
|
123
|
+
methods: ["POST"],
|
|
124
|
+
middlewares: [
|
|
125
|
+
(0, http_1.validateAndTransformBody)(email_1.UpdateAdminDraftOrderConfirmationSchema),
|
|
126
|
+
],
|
|
127
|
+
},
|
|
114
128
|
// Account confirmation: the resend route answers 404 while the
|
|
115
129
|
// `customer_verification` feature (or Konto-Mails, its parent) is off.
|
|
116
130
|
// Public by design (the customer cannot log in yet); the 60 s limit per
|
|
@@ -248,4 +262,4 @@ exports.default = (0, http_1.defineMiddlewares)({
|
|
|
248
262
|
},
|
|
249
263
|
],
|
|
250
264
|
});
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBS2lDO0FBQ2pDLCtHQUtrRjtBQUNsRixtR0FHNEU7QUFDNUUsMkZBTXdFO0FBQ3hFLDJIQUFrSTtBQUNsSSwyRkFBdUg7QUFFdkgsa0VBR3FDO0FBQ3JDLDhEQUE4RDtBQUM5RCxxR0FBOEY7QUFDOUYsdURBQXlEO0FBQ3pELHNDQUFnRDtBQUVoRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUUsT0FBTztJQUNQLFdBQVcsRUFBRSxDQUFDLElBQUEsNkJBQW9CLEVBQUMseUNBQXVCLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztDQUN0RSxDQUFDLENBQUE7QUFFRix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHVDQUF1QztBQUN2QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsNkNBQTZDO1lBQ3RELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVB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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = orderZeroTotalPaidSubscriber;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const zod_1 = require("@medusajs/framework/zod");
|
|
7
|
+
const mark_zero_total_order_paid_1 = require("../workflows/order/mark-zero-total-order-paid");
|
|
8
|
+
const OrderPlacedEventSchema = zod_1.z.object({ id: zod_1.z.string().min(1) });
|
|
9
|
+
/** Marks a placed 0 € order without payment as paid (see the workflow). */
|
|
10
|
+
async function orderZeroTotalPaidSubscriber({ event, container, }) {
|
|
11
|
+
const payload = OrderPlacedEventSchema.parse(event.data);
|
|
12
|
+
await (0, mark_zero_total_order_paid_1.markZeroTotalOrderPaidWorkflow)(container).run({
|
|
13
|
+
input: { order_id: payload.id },
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
exports.config = {
|
|
17
|
+
event: utils_1.OrderWorkflowEvents.PLACED,
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItemVyby10b3RhbC1wYWlkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLXplcm8tdG90YWwtcGFpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFZQSwrQ0FRQztBQWhCRCxxREFBZ0U7QUFDaEUsaURBQTRDO0FBRTVDLDhGQUErRjtBQUUvRixNQUFNLHNCQUFzQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFbkUsMkVBQTJFO0FBQzVELEtBQUssVUFBVSw0QkFBNEIsQ0FBQyxFQUN6RCxLQUFLLEVBQ0wsU0FBUyxHQUNlO0lBQ3hCLE1BQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsTUFBTSxJQUFBLDJEQUE4QixFQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNsRCxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRTtLQUNoQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSwyQkFBbUIsQ0FBQyxNQUFNO0NBQ2xDLENBQUMifQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateDraftOrderConfirmationWorkflow = exports.getDraftOrderConfirmation = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
/**
|
|
7
|
+
* Reads the customer-confirmation choice of a draft order. Anything that is
|
|
8
|
+
* not (or no longer) a draft answers 404, so the switch never touches a
|
|
9
|
+
* placed order.
|
|
10
|
+
*/
|
|
11
|
+
const getDraftOrderConfirmation = async (container, draftOrderId) => {
|
|
12
|
+
const { data } = await container
|
|
13
|
+
.resolve(utils_1.ContainerRegistrationKeys.QUERY)
|
|
14
|
+
.graph({
|
|
15
|
+
entity: "order",
|
|
16
|
+
fields: ["id", "no_notification"],
|
|
17
|
+
filters: { id: draftOrderId, is_draft_order: true },
|
|
18
|
+
});
|
|
19
|
+
const order = data[0];
|
|
20
|
+
if (!order) {
|
|
21
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `Draft order with id: ${draftOrderId} was not found`);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
draft_order_id: order.id,
|
|
25
|
+
send_order_confirmation: order.no_notification !== true,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
exports.getDraftOrderConfirmation = getDraftOrderConfirmation;
|
|
29
|
+
const updateDraftOrderConfirmationStep = (0, workflows_sdk_1.createStep)("email-update-draft-order-confirmation", async (input, { container }) => {
|
|
30
|
+
const current = await (0, exports.getDraftOrderConfirmation)(container, input.draft_order_id);
|
|
31
|
+
await container
|
|
32
|
+
.resolve(utils_1.Modules.ORDER)
|
|
33
|
+
.updateOrders(input.draft_order_id, {
|
|
34
|
+
no_notification: !input.send_order_confirmation,
|
|
35
|
+
});
|
|
36
|
+
return new workflows_sdk_1.StepResponse(input, {
|
|
37
|
+
id: input.draft_order_id,
|
|
38
|
+
no_notification: !current.send_order_confirmation,
|
|
39
|
+
});
|
|
40
|
+
}, async (previous, { container }) => {
|
|
41
|
+
if (!previous)
|
|
42
|
+
return;
|
|
43
|
+
await container
|
|
44
|
+
.resolve(utils_1.Modules.ORDER)
|
|
45
|
+
.updateOrders(previous.id, { no_notification: previous.no_notification });
|
|
46
|
+
});
|
|
47
|
+
/** Switches whether the converted draft confirms the order to the customer. */
|
|
48
|
+
exports.updateDraftOrderConfirmationWorkflow = (0, workflows_sdk_1.createWorkflow)("email-update-draft-order-confirmation", (input) => new workflows_sdk_1.WorkflowResponse(updateDraftOrderConfirmationStep(input)));
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWRyYWZ0LW9yZGVyLWNvbmZpcm1hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvZW1haWwvdXBkYXRlLWRyYWZ0LW9yZGVyLWNvbmZpcm1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxxREFJbUM7QUFDbkMscUVBSzJDO0FBaUIzQzs7OztHQUlHO0FBQ0ksTUFBTSx5QkFBeUIsR0FBRyxLQUFLLEVBQzVDLFNBQTBCLEVBQzFCLFlBQW9CLEVBQ2EsRUFBRTtJQUNuQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxTQUFTO1NBQzdCLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUM7U0FDeEMsS0FBSyxDQUFDO1FBQ0wsTUFBTSxFQUFFLE9BQU87UUFDZixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUM7UUFDakMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFO0tBQ3BELENBQUMsQ0FBQztJQUNMLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQThCLENBQUM7SUFDbkQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0Isd0JBQXdCLFlBQVksZ0JBQWdCLENBQ3JELENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTztRQUNMLGNBQWMsRUFBRSxLQUFLLENBQUMsRUFBRTtRQUN4Qix1QkFBdUIsRUFBRSxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUk7S0FDeEQsQ0FBQztBQUNKLENBQUMsQ0FBQztBQXRCVyxRQUFBLHlCQUF5Qiw2QkFzQnBDO0FBRUYsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFBLDBCQUFVLEVBQ2pELHVDQUF1QyxFQUN2QyxLQUFLLEVBQUUsS0FBNkIsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFBLGlDQUF5QixFQUM3QyxTQUFTLEVBQ1QsS0FBSyxDQUFDLGNBQWMsQ0FDckIsQ0FBQztJQUNGLE1BQU0sU0FBUztTQUNaLE9BQU8sQ0FBc0IsZUFBTyxDQUFDLEtBQUssQ0FBQztTQUMzQyxZQUFZLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRTtRQUNsQyxlQUFlLEVBQUUsQ0FBQyxLQUFLLENBQUMsdUJBQXVCO0tBQ2hELENBQUMsQ0FBQztJQUNMLE9BQU8sSUFBSSw0QkFBWSxDQUNyQixLQUFLLEVBQ0w7UUFDRSxFQUFFLEVBQUUsS0FBSyxDQUFDLGNBQWM7UUFDeEIsZUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDLHVCQUF1QjtLQUNsRCxDQUNGLENBQUM7QUFDSixDQUFDLEVBQ0QsS0FBSyxFQUFFLFFBQTBDLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ2xFLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTztJQUN0QixNQUFNLFNBQVM7U0FDWixPQUFPLENBQXNCLGVBQU8sQ0FBQyxLQUFLLENBQUM7U0FDM0MsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7QUFDOUUsQ0FBQyxDQUNGLENBQUM7QUFFRiwrRUFBK0U7QUFDbEUsUUFBQSxvQ0FBb0MsR0FBRyxJQUFBLDhCQUFjLEVBQ2hFLHVDQUF1QyxFQUN2QyxDQUFDLEtBQTZCLEVBQUUsRUFBRSxDQUNoQyxJQUFJLGdDQUFnQixDQUFDLGdDQUFnQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ2hFLENBQUMifQ==
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
4
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
5
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
6
|
+
/**
|
|
7
|
+
* A draft order starts without a customer order confirmation: drafts are
|
|
8
|
+
* Admin tasks (sample shipments, manual orders), and the Admin opts in per
|
|
9
|
+
* draft through the "Bestellbestätigung" widget. `createOrderWorkflow` is the
|
|
10
|
+
* workflow behind `POST /admin/draft-orders`; its `no_notification_order`
|
|
11
|
+
* flag is overridden here because the Admin dashboard never sends it.
|
|
12
|
+
*/
|
|
13
|
+
core_flows_1.createOrderWorkflow.hooks.orderCreated(async ({ order }, { container }) => {
|
|
14
|
+
const { data } = await container
|
|
15
|
+
.resolve(utils_1.ContainerRegistrationKeys.QUERY)
|
|
16
|
+
.graph({
|
|
17
|
+
entity: "order",
|
|
18
|
+
fields: ["id", "is_draft_order", "no_notification"],
|
|
19
|
+
filters: { id: order.id },
|
|
20
|
+
});
|
|
21
|
+
const created = data[0];
|
|
22
|
+
if (!created?.is_draft_order || created.no_notification === true) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
await container
|
|
26
|
+
.resolve(utils_1.Modules.ORDER)
|
|
27
|
+
.updateOrders(created.id, { no_notification: true });
|
|
28
|
+
return new workflows_sdk_1.StepResponse(undefined, {
|
|
29
|
+
id: created.id,
|
|
30
|
+
no_notification: created.no_notification ?? false,
|
|
31
|
+
});
|
|
32
|
+
}, async (previous, { container }) => {
|
|
33
|
+
if (!previous)
|
|
34
|
+
return;
|
|
35
|
+
await container
|
|
36
|
+
.resolve(utils_1.Modules.ORDER)
|
|
37
|
+
.updateOrders(previous.id, { no_notification: previous.no_notification });
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZnQtb3JkZXItY29uZmlybWF0aW9uLWRlZmF1bHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2hvb2tzL2RyYWZ0LW9yZGVyLWNvbmZpcm1hdGlvbi1kZWZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EscURBR2tDO0FBQ2xDLHFFQUFnRTtBQUNoRSw0REFBaUU7QUFhakU7Ozs7OztHQU1HO0FBQ0gsZ0NBQW1CLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FDcEMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ2pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLFNBQVM7U0FDN0IsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQztTQUN4QyxLQUFLLENBQUM7UUFDTCxNQUFNLEVBQUUsT0FBTztRQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQztRQUNuRCxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtLQUMxQixDQUFDLENBQUE7SUFDSixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUE2QixDQUFBO0lBQ25ELElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxJQUFJLE9BQU8sQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDakUsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLFNBQVM7U0FDWixPQUFPLENBQXNCLGVBQU8sQ0FBQyxLQUFLLENBQUM7U0FDM0MsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUN0RCxPQUFPLElBQUksNEJBQVksQ0FBa0MsU0FBUyxFQUFFO1FBQ2xFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUNkLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZSxJQUFJLEtBQUs7S0FDbEQsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxFQUNELEtBQUssRUFBRSxRQUEwQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUNsRSxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU07SUFDckIsTUFBTSxTQUFTO1NBQ1osT0FBTyxDQUFzQixlQUFPLENBQUMsS0FBSyxDQUFDO1NBQzNDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFBO0FBQzdFLENBQUMsQ0FDRixDQUFBIn0=
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.markZeroTotalOrderPaidWorkflow = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
|
|
6
|
+
const core_flows_1 = require("@medusajs/medusa/core-flows");
|
|
7
|
+
/**
|
|
8
|
+
* An order that costs nothing and has no payment collection (an Admin draft,
|
|
9
|
+
* e.g. a free sample shipment) would stay "Nicht bezahlt" forever: Medusa
|
|
10
|
+
* derives the payment status from payment collections only. A completed
|
|
11
|
+
* 0 € collection makes it "Bezahlt" in the Admin and in database queries,
|
|
12
|
+
* without a payment provider. Orders that already carry a collection (every
|
|
13
|
+
* checkout order) are left alone, so the workflow is safe to run twice.
|
|
14
|
+
*/
|
|
15
|
+
exports.markZeroTotalOrderPaidWorkflow = (0, workflows_sdk_1.createWorkflow)("order-mark-zero-total-paid", (input) => {
|
|
16
|
+
const lockKey = (0, workflows_sdk_1.transform)(input, ({ order_id }) => `order-zero-total-paid:${order_id}`);
|
|
17
|
+
(0, core_flows_1.acquireLockStep)({ key: lockKey, timeout: 10, ttl: 60 });
|
|
18
|
+
const { data: orders } = (0, core_flows_1.useQueryGraphStep)({
|
|
19
|
+
entity: "order",
|
|
20
|
+
fields: ["id", "total", "payment_collections.id"],
|
|
21
|
+
filters: { id: input.order_id },
|
|
22
|
+
});
|
|
23
|
+
const needsPayment = (0, workflows_sdk_1.transform)(orders, (rows) => {
|
|
24
|
+
const order = rows[0];
|
|
25
|
+
return (!!order &&
|
|
26
|
+
utils_1.MathBN.eq(utils_1.MathBN.convert(order.total), 0) &&
|
|
27
|
+
!(order.payment_collections ?? []).some(Boolean));
|
|
28
|
+
});
|
|
29
|
+
const created = (0, workflows_sdk_1.when)("order-zero-total-needs-payment", needsPayment, (needed) => needed).then(() => {
|
|
30
|
+
const collections = core_flows_1.createOrderPaymentCollectionWorkflow.runAsStep({
|
|
31
|
+
input: { order_id: input.order_id, amount: 0 },
|
|
32
|
+
});
|
|
33
|
+
const completion = (0, workflows_sdk_1.transform)(collections, (rows) => ({
|
|
34
|
+
selector: { id: rows[0].id },
|
|
35
|
+
update: { status: utils_1.PaymentCollectionStatus.COMPLETED },
|
|
36
|
+
}));
|
|
37
|
+
(0, core_flows_1.updatePaymentCollectionStep)(completion);
|
|
38
|
+
return collections;
|
|
39
|
+
});
|
|
40
|
+
(0, core_flows_1.releaseLockStep)({ key: lockKey });
|
|
41
|
+
return new workflows_sdk_1.WorkflowResponse((0, workflows_sdk_1.transform)({ created }, ({ created }) => ({
|
|
42
|
+
marked_paid: !!created?.length,
|
|
43
|
+
})));
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyay16ZXJvLXRvdGFsLW9yZGVyLXBhaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL29yZGVyL21hcmstemVyby10b3RhbC1vcmRlci1wYWlkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUdrQztBQUNsQyxxRUFLMEM7QUFDMUMsNERBTW9DO0FBV3BDOzs7Ozs7O0dBT0c7QUFDVSxRQUFBLDhCQUE4QixHQUFHLElBQUEsOEJBQWMsRUFDMUQsNEJBQTRCLEVBQzVCLENBQUMsS0FBa0MsRUFBRSxFQUFFO0lBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUEseUJBQVMsRUFDdkIsS0FBSyxFQUNMLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMseUJBQXlCLFFBQVEsRUFBRSxDQUN0RCxDQUFBO0lBQ0QsSUFBQSw0QkFBZSxFQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRXZELE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBQSw4QkFBaUIsRUFBQztRQUN6QyxNQUFNLEVBQUUsT0FBTztRQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsd0JBQXdCLENBQUM7UUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7S0FDaEMsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBQSx5QkFBUyxFQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBVyxFQUFFO1FBQ3ZELE1BQU0sS0FBSyxHQUFJLElBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDOUMsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLO1lBQ1AsY0FBTSxDQUFDLEVBQUUsQ0FBQyxjQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNqRCxDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixNQUFNLE9BQU8sR0FBRyxJQUFBLG9CQUFJLEVBQ2xCLGdDQUFnQyxFQUNoQyxZQUFZLEVBQ1osQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FDbkIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1YsTUFBTSxXQUFXLEdBQUcsaURBQW9DLENBQUMsU0FBUyxDQUFDO1lBQ2pFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7U0FDL0MsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBQSx5QkFBUyxFQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRCxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsK0JBQXVCLENBQUMsU0FBUyxFQUFFO1NBQ3RELENBQUMsQ0FBQyxDQUFBO1FBQ0gsSUFBQSx3Q0FBMkIsRUFBQyxVQUFVLENBQUMsQ0FBQTtRQUN2QyxPQUFPLFdBQVcsQ0FBQTtJQUNwQixDQUFDLENBQUMsQ0FBQTtJQUVGLElBQUEsNEJBQWUsRUFBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ2pDLE9BQU8sSUFBSSxnQ0FBZ0IsQ0FDekIsSUFBQSx5QkFBUyxFQUNQLEVBQUUsT0FBTyxFQUFFLEVBQ1gsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFnQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNO0tBQy9CLENBQUMsQ0FDSCxDQUNGLENBQUE7QUFDSCxDQUFDLENBQ0YsQ0FBQSJ9
|
package/README.md
CHANGED
|
@@ -41,6 +41,9 @@ packing lists) and S3 file storage, and the turnkey `medusa-config.ts` preset
|
|
|
41
41
|
repair").
|
|
42
42
|
- Requires passwords of at least 15 characters for customers and Admin users
|
|
43
43
|
(see "Password policy").
|
|
44
|
+
- Starts Admin draft orders without a customer order confirmation and marks
|
|
45
|
+
placed 0 € orders without payment as paid (see "Draft orders and 0 €
|
|
46
|
+
orders").
|
|
44
47
|
- Exports the shop's `medusa-config.ts` helpers from
|
|
45
48
|
`@hartl-services/medusa-base/config` and Sentry's `register()` from
|
|
46
49
|
`@hartl-services/medusa-base/instrumentation` (see "Config helpers" and
|
|
@@ -739,6 +742,36 @@ links itself:
|
|
|
739
742
|
Nothing to configure; `medusa db:migrate` after installing or upgrading to
|
|
740
743
|
0.4.1 is enough.
|
|
741
744
|
|
|
745
|
+
## Draft orders and 0 € orders
|
|
746
|
+
|
|
747
|
+
Draft orders (Medusa's `@medusajs/draft-order` plugin, loaded by default) are
|
|
748
|
+
the shop's way to enter an order in the Admin: sample shipments, orders taken
|
|
749
|
+
by phone, replacements. Item prices and the shipping amount are set directly
|
|
750
|
+
in the draft; converting it never involves a payment provider.
|
|
751
|
+
|
|
752
|
+
- **Customer order confirmation off by default.** The
|
|
753
|
+
`createOrderWorkflow.hooks.orderCreated` hook
|
|
754
|
+
(`workflows/hooks/draft-order-confirmation-default`) sets Medusa's
|
|
755
|
+
`no_notification` on every new draft, also when an API caller sent
|
|
756
|
+
`no_notification_order: false`. The Admin switches it per draft in the
|
|
757
|
+
**Bestellbestätigung** widget on the draft's detail page
|
|
758
|
+
(`GET`/`POST /admin/draft-orders/:id/order-confirmation`, see the E-Mail
|
|
759
|
+
"Admin API"). On conversion the `order-placed` subscriber records the
|
|
760
|
+
customer confirmation as `suppressed` (`notifications_disabled`); the copy
|
|
761
|
+
to the shop's order address is still sent. The shipment mail follows the
|
|
762
|
+
Admin's "notify customer" choice per shipment, not this switch.
|
|
763
|
+
- **0 € orders count as paid.** Medusa derives an order's payment status from
|
|
764
|
+
its payment collections only, so a converted 0 € draft would stay
|
|
765
|
+
"Nicht bezahlt". The subscriber `order-zero-total-paid` runs
|
|
766
|
+
`order-mark-zero-total-paid` on `order.placed`: an order with a total of 0
|
|
767
|
+
and no payment collection gets a completed 0 € payment collection and reads
|
|
768
|
+
"Bezahlt" (`payment_status: captured`). Orders that already carry a
|
|
769
|
+
collection, i.e. every checkout order, are left alone. In SQL, a paid
|
|
770
|
+
order is one whose linked `payment_collection` (via
|
|
771
|
+
`order_payment_collection`) has `status = 'completed'`.
|
|
772
|
+
|
|
773
|
+
Orders placed before installing this version keep their state.
|
|
774
|
+
|
|
742
775
|
## Config helpers
|
|
743
776
|
|
|
744
777
|
`@hartl-services/medusa-base/config` holds the generic environment helpers a
|
|
@@ -917,7 +950,7 @@ feature is switched on again.
|
|
|
917
950
|
| Key | Label | Default | Gates | Keeps running when off |
|
|
918
951
|
| --------------------- | ---------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- |
|
|
919
952
|
| (plugin switch) | E-Mail | on | every route under `/admin/email/*` (mail log, resends, terms versions; 404); jobs `email-reconcile-attempts`, `email-reconcile-pending-messages`, `email-retry-messages`; every feature below | checkout and orders; already queued messages stay stored |
|
|
920
|
-
| `order_mails` | Bestell-Mails | on | subscribers `order-placed`, `email-shipment-created`, `email-order-canceled`, `return-requested`, `return-received`, `documents-shipment-invoice-assignment-decided`, `documents-order-cancellation-ready`, `documents-refund-ready` | jobs, Admin routes, already created messages |
|
|
953
|
+
| `order_mails` | Bestell-Mails | on | subscribers `order-placed`, `email-shipment-created`, `email-order-canceled`, `return-requested`, `return-received`, `documents-shipment-invoice-assignment-decided`, `documents-order-cancellation-ready`, `documents-refund-ready`; route `/admin/draft-orders/:id/order-confirmation` (404) and its draft-order widget | jobs, Admin routes, already created messages |
|
|
921
954
|
| `account_mails` | Konto-Mails | on | subscribers `password-reset`, `user-invite`, `customer-verification` (the last one only with `customer_verification` on as well) | jobs, Admin routes, already created messages |
|
|
922
955
|
| `customer_verification` | Kontobestätigung per E-Mail | off | Medusa's e-mail verification of customer logins (see "Kontobestätigung per E-Mail"), route `POST /store/customer-verification/resend` (404 while off), subscriber `customer-verification`; child of `account_mails` | checkout and orders; confirmed accounts stay confirmed, already created messages |
|
|
923
956
|
| `affiliate_reminders` | Affiliate-Mails | on | subscribers `affiliate-consignment-reminder-due` (reminders to affiliates) and `affiliate-application-submitted` (notification to the shop about a new partner application) | jobs, Admin routes, already created messages |
|
|
@@ -1469,6 +1502,11 @@ Email exposes authenticated Admin operations at:
|
|
|
1469
1502
|
most 5 MiB with its `effective_at` timestamp.
|
|
1470
1503
|
- `GET /admin/email/terms-versions/:id/download` streams one authenticated,
|
|
1471
1504
|
non-cacheable PDF download.
|
|
1505
|
+
- `GET /admin/draft-orders/:id/order-confirmation` returns
|
|
1506
|
+
`AdminDraftOrderConfirmationResponse` (`{ draft_order_id,
|
|
1507
|
+
send_order_confirmation }`); `POST` with
|
|
1508
|
+
`{ send_order_confirmation: boolean }` switches it. Both answer 404 for an
|
|
1509
|
+
order that is not (or no longer) a draft and while `order_mails` is off.
|
|
1472
1510
|
|
|
1473
1511
|
List and detail responses expose only safe identifiers and linkage metadata,
|
|
1474
1512
|
kind/status and safe status codes, resource references, trigger, attempt
|
|
@@ -1501,6 +1539,12 @@ elsewhere), safe message and attempt status, and an explicitly confirmed
|
|
|
1501
1539
|
resend action.
|
|
1502
1540
|
Recipient, template, and payload data are intentionally absent from the page.
|
|
1503
1541
|
|
|
1542
|
+
The draft-order detail page carries the **Bestellbestätigung** widget (zone
|
|
1543
|
+
`draft_order.details.side.after`, hidden while `order_mails` is off). Its
|
|
1544
|
+
switch "An Kunden senden" starts off and decides whether the customer receives
|
|
1545
|
+
the order confirmation when the draft is converted (see "Draft orders and
|
|
1546
|
+
0 € orders").
|
|
1547
|
+
|
|
1504
1548
|
The `AGB/PDF-Versionen` section manages the global Terms PDFs. Admins can
|
|
1505
1549
|
upload a PDF of at most 5 MiB with its effective date, review versions newest
|
|
1506
1550
|
first, and download a selected version. Uploads receive a fresh request UUID;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hartl-services/medusa-base",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Base plugin for Hartl Services Medusa shops: per-plugin feature toggles with a generic Admin settings page, a Store endpoint for storefronts, enforcement helpers, the complete-cart hook composition, the root redirect, cart-promotion link repair, the built-in E-Mail, Documents and S3 file storage modules, config helpers with the turnkey food-shop preset, and the Sentry logger wrapper and instrumentation.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"mime-types": "3.0.1",
|
|
89
89
|
"nodemailer": "6.10.1",
|
|
90
90
|
"ulid": "^2.4.0",
|
|
91
|
-
"@hartl-services/medusa-food-supplements-contracts": "^0.
|
|
91
|
+
"@hartl-services/medusa-food-supplements-contracts": "^0.24.0"
|
|
92
92
|
},
|
|
93
93
|
"devDependencies": {
|
|
94
94
|
"@medusajs/admin-sdk": "2.19.0",
|