@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.
@@ -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 documents = require("@hartl-services/medusa-food-supplements-contracts/paths/documents");
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 email = require("@hartl-services/medusa-food-supplements-contracts/paths/email");
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 { documentsPaths, packingListsPaths } from "@hartl-services/medusa-food-supplements-contracts/paths/documents";
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 { emailAdminPaths } from "@hartl-services/medusa-food-supplements-contracts/paths/email";
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; no route belongs to them.
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBS2lDO0FBQ2pDLCtHQUtrRjtBQUNsRixtR0FHNEU7QUFDNUUsMkZBS3dFO0FBQ3hFLDJIQUFrSTtBQUNsSSwyRkFBdUg7QUFFdkgsa0VBR3FDO0FBQ3JDLDhEQUE4RDtBQUM5RCxxR0FBOEY7QUFDOUYsdURBQXlEO0FBQ3pELHNDQUFnRDtBQUVoRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWUsRUFBRSxHQUFHLElBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUUsT0FBTztJQUNQLFdBQVcsRUFBRSxDQUFDLElBQUEsNkJBQW9CLEVBQUMseUNBQXVCLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztDQUN0RSxDQUFDLENBQUE7QUFFRix5RUFBeUU7QUFDekUsbUVBQW1FO0FBQ25FLHVFQUF1RTtBQUN2RSwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHVDQUF1QztBQUN2QyxrQkFBZSxJQUFBLHdCQUFpQixFQUFDO0lBQy9CLE1BQU0sRUFBRTtRQUNOO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLENBQUMsSUFBQSwrQkFBd0IsRUFBQyw0Q0FBMEIsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsNkNBQTZDO1lBQ3RELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNqQixXQUFXLEVBQUUsQ0FBQyxJQUFBLCtCQUF3QixFQUFDLDRDQUEwQixDQUFDLENBQUM7U0FDcEU7UUFDRDtZQUNFLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxDQUFDLElBQUEsK0JBQXdCLEVB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
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.0",
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.21.0"
91
+ "@hartl-services/medusa-food-supplements-contracts": "^0.24.0"
92
92
  },
93
93
  "devDependencies": {
94
94
  "@medusajs/admin-sdk": "2.19.0",