@webbers/pay-payments-medusa 2.2.43 → 2.2.47
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/package.json +6 -2
- package/.medusa/server/src/admin/index.js +1 -1
- package/.medusa/server/src/admin/index.mjs +1 -1
- package/.medusa/server/src/api/hooks/pay/[provider]/route.d.ts.map +1 -1
- package/.medusa/server/src/api/hooks/pay/[provider]/route.js +29 -9
- package/.medusa/server/src/providers/pay/core/constants.d.ts +10 -1
- package/.medusa/server/src/providers/pay/core/constants.d.ts.map +1 -1
- package/.medusa/server/src/providers/pay/core/constants.js +16 -5
- package/.medusa/server/src/providers/pay/core/http-client.d.ts +0 -6
- package/.medusa/server/src/providers/pay/core/http-client.d.ts.map +1 -1
- package/.medusa/server/src/providers/pay/core/http-client.js +1 -19
- package/.medusa/server/src/providers/pay/core/pay-base.d.ts +9 -2
- package/.medusa/server/src/providers/pay/core/pay-base.d.ts.map +1 -1
- package/.medusa/server/src/providers/pay/core/pay-base.js +48 -11
- package/.medusa/server/src/providers/pay/core/pay-client.d.ts +18 -5
- package/.medusa/server/src/providers/pay/core/pay-client.d.ts.map +1 -1
- package/.medusa/server/src/providers/pay/core/pay-client.js +40 -12
- package/.medusa/server/src/providers/pay/services/pay-direct-debit.d.ts +47 -1
- package/.medusa/server/src/providers/pay/services/pay-direct-debit.d.ts.map +1 -1
- package/.medusa/server/src/providers/pay/services/pay-direct-debit.js +216 -1
- package/.medusa/server/src/providers/pay/types/order.d.ts +141 -72
- package/.medusa/server/src/providers/pay/types/order.d.ts.map +1 -1
- package/.medusa/server/src/subscribers/direct-debit-exchange.d.ts +12 -0
- package/.medusa/server/src/subscribers/direct-debit-exchange.d.ts.map +1 -0
- package/.medusa/server/src/subscribers/direct-debit-exchange.js +184 -0
- package/.medusa/server/src/subscribers/payment-canceled.d.ts.map +1 -1
- package/.medusa/server/src/subscribers/payment-canceled.js +17 -4
- package/.medusa/server/src/subscribers/payment-failed.d.ts +1 -0
- package/.medusa/server/src/subscribers/payment-failed.d.ts.map +1 -1
- package/.medusa/server/src/subscribers/payment-failed.js +13 -3
- package/.medusa/server/src/utils/directDebitExchange.d.ts +28 -0
- package/.medusa/server/src/utils/directDebitExchange.d.ts.map +1 -0
- package/.medusa/server/src/utils/directDebitExchange.js +108 -0
- package/package.json +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../../../../../src/providers/pay/types/order.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,oBAAoB,EACrB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../../../../../src/providers/pay/types/order.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,oBAAoB,EACrB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAGD,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,kBAAkB,CAAA;IACtB,GAAG,EAAE,wBAAwB,CAAA;IAC7B,IAAI,EAAE,mBAAmB,CAAA;CAC1B,CAAA;AAGD,MAAM,MAAM,gBAAgB,GACxB;KACG,CAAC,IAAI,MAAM,qBAAqB,GAAG;QAClC,EAAE,EAAE,CAAC,CAAA;QACL,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAA;KAChC;CACF,CAAC,MAAM,qBAAqB,CAAC,GAC9B;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAC,CAAA;AAE/B,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,IAAI,CAAA;IAClB,WAAW,EAAE,IAAI,CAAA;IACjB,eAAe,EAAE,UAAU,CAAA;IAC3B,cAAc,EAAE,UAAU,CAAA;IAC1B,QAAQ,EAAE,UAAU,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,cAAc,CAAA;IACtB,aAAa,CAAC,EAAE,gBAAgB,CAAA;IAChC,WAAW,CAAC,EAAE;QACZ,IAAI,CAAC,EAAE,OAAO,CAAA;KACf,CAAA;IACD,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,KAAK,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,eAAe,CAAC,EAAE,UAAU,CAAA;QAC5B,cAAc,CAAC,EAAE,UAAU,CAAA;QAC3B,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAA;KACxB,CAAA;IACD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CAAA;CACrE;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAA;IACzC,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;KACb,GAAG,IAAI,CAAA;IACR,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAA;QAC7B,oBAAoB,EAAE,MAAM,CAAA;KAC7B,CAAA;IACD,KAAK,EAAE,gBAAgB,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAA;IAC1C,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAAA;QACrE,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,QAAQ,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE;YACX,IAAI,EAAE,MAAM,CAAA;YACZ,GAAG,CAAC,EAAE,MAAM,CAAA;YACZ,KAAK,EAAE,MAAM,CAAA;SACd,CAAA;KACF,CAAA;IACD,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAA;IACzC,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;IACD,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE;YACX,IAAI,EAAE,MAAM,CAAA;YACZ,GAAG,EAAE,MAAM,CAAA;YACX,KAAK,EAAE,MAAM,CAAA;SACd,CAAA;KACF,CAAA;IACD,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,oBAAoB,EAAE,MAAM,CAAA;KAC7B,CAAA;IACD,KAAK,EAAE,gBAAgB,CAAA;IACvB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAA;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAA;QACZ,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;KACb,EAAE,CAAA;CACJ;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,oBAAoB,CAAA;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE;QACX,IAAI,EAAE,OAAO,CAAA;KACd,CAAA;IACD,MAAM,EAAE,cAAc,CAAA;IACtB,gBAAgB,EAAE,cAAc,CAAA;IAChC,cAAc,EAAE,cAAc,CAAA;IAC9B,YAAY,EAAE;QACZ,QAAQ,EAAE,WAAW,CAAA;QACrB,cAAc,EAAE,UAAU,CAAA;QAC1B,eAAe,EAAE,UAAU,CAAA;KAC5B,CAAA;IACD,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,EAAE,IAAI,CAAA;IACf,WAAW,EAAE,IAAI,CAAA;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,gBAAgB,CAAA;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,YAAY,EAAE,OAAO,CAAA;IACrB,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,MAAM,EAAE,oBAAoB,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,cAAc,CAAA;IACtB,gBAAgB,EAAE,cAAc,CAAA;IAChC,cAAc,EAAE,cAAc,CAAA;IAC9B,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAC9B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SubscriberArgs, SubscriberConfig } from "@medusajs/framework";
|
|
2
|
+
/**
|
|
3
|
+
* Handles the incasso exchanges Pay. sends for direct debits created via the
|
|
4
|
+
* mandate API, both the legacy incasso* actions and the flat Incasso
|
|
5
|
+
* transaction exchange. The exchange body is never trusted, the authoritative
|
|
6
|
+
* direct debit state is always re-fetched from Pay. before anything changes.
|
|
7
|
+
*/
|
|
8
|
+
export default function payDirectDebitExchangeHandler({ event: { data }, container, }: SubscriberArgs<{
|
|
9
|
+
payload: Record<string, any>;
|
|
10
|
+
}>): Promise<void>;
|
|
11
|
+
export declare const config: SubscriberConfig;
|
|
12
|
+
//# sourceMappingURL=direct-debit-exchange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-debit-exchange.d.ts","sourceRoot":"","sources":["../../../../src/subscribers/direct-debit-exchange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AA2DpE;;;;;GAKG;AACH,wBAA8B,6BAA6B,CAAC,EAC1D,KAAK,EAAE,EAAC,IAAI,EAAC,EACb,SAAS,GACV,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAC,CAAC,iBAiPhD;AAED,eAAO,MAAM,MAAM,EAAE,gBAEpB,CAAA"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = void 0;
|
|
7
|
+
exports.default = payDirectDebitExchangeHandler;
|
|
8
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
9
|
+
const core_flows_1 = require("@medusajs/core-flows");
|
|
10
|
+
const getPayPaymentSession_1 = __importDefault(require("../utils/getPayPaymentSession"));
|
|
11
|
+
const types_1 = require("../providers/pay/types");
|
|
12
|
+
const pay_client_1 = require("../providers/pay/core/pay-client");
|
|
13
|
+
const constants_1 = require("../providers/pay/core/constants");
|
|
14
|
+
const directDebitExchange_1 = require("../utils/directDebitExchange");
|
|
15
|
+
const getPayClient = (container, logger) => {
|
|
16
|
+
const configModule = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
|
|
17
|
+
const payModuleConfig = configModule.modules?.payment?.options
|
|
18
|
+
?.providers?.find((p) => p.id === "pay");
|
|
19
|
+
if (!payModuleConfig?.options) {
|
|
20
|
+
logger.warn("Pay. - Ignoring direct debit exchange: no Pay. provider options found");
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return new pay_client_1.PayClient(payModuleConfig.options, logger);
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Handles the incasso exchanges Pay. sends for direct debits created via the
|
|
27
|
+
* mandate API, both the legacy incasso* actions and the flat Incasso
|
|
28
|
+
* transaction exchange. The exchange body is never trusted, the authoritative
|
|
29
|
+
* direct debit state is always re-fetched from Pay. before anything changes.
|
|
30
|
+
*/
|
|
31
|
+
async function payDirectDebitExchangeHandler({ event: { data }, container, }) {
|
|
32
|
+
const logger = container.resolve("logger");
|
|
33
|
+
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
34
|
+
const payload = data.payload ?? {};
|
|
35
|
+
const action = (0, directDebitExchange_1.normalizeAction)(payload.action);
|
|
36
|
+
const client = getPayClient(container, logger);
|
|
37
|
+
if (!client) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let info = null;
|
|
41
|
+
let displayId = null;
|
|
42
|
+
if ((0, directDebitExchange_1.isLegacyDirectDebitAction)(action)) {
|
|
43
|
+
const referenceId = (0, directDebitExchange_1.readDirectDebitReferenceId)(payload);
|
|
44
|
+
const mandateId = (0, directDebitExchange_1.readDirectDebitMandateId)(payload);
|
|
45
|
+
if (referenceId) {
|
|
46
|
+
info = await client.getDirectDebitInfo(referenceId).catch((err) => {
|
|
47
|
+
logger.warn(`Pay. - Could not retrieve direct debit ${referenceId}: ${err.message ?? err}`);
|
|
48
|
+
return null;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (!(0, directDebitExchange_1.extractDirectDebit)(info) && mandateId) {
|
|
52
|
+
info = await client.getDirectDebitInfoByMandate(mandateId).catch((err) => {
|
|
53
|
+
logger.warn(`Pay. - Could not retrieve direct debit mandate ${mandateId}: ${err.message ?? err}`);
|
|
54
|
+
return null;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const directDebit = (0, directDebitExchange_1.extractDirectDebit)(info);
|
|
58
|
+
if (!directDebit) {
|
|
59
|
+
logger.warn(`Pay. - Ignoring direct debit exchange ${action}: direct debit not found`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
displayId = (0, directDebitExchange_1.extractDirectDebitReference)(info, directDebit);
|
|
63
|
+
if (!displayId) {
|
|
64
|
+
logger.warn(`Pay. - Ignoring direct debit exchange ${action}: order reference missing`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
displayId = (0, directDebitExchange_1.parseDirectDebitDisplayId)(payload);
|
|
70
|
+
if (!displayId) {
|
|
71
|
+
logger.warn(`Pay. - Ignoring direct debit exchange ${payload.id ?? ""}: could not determine order reference`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const { data: [order], } = await query.graph({
|
|
76
|
+
entity: "order",
|
|
77
|
+
fields: [
|
|
78
|
+
"id",
|
|
79
|
+
"payment_collections.id",
|
|
80
|
+
"payment_collections.status",
|
|
81
|
+
"payment_collections.payment_sessions.*",
|
|
82
|
+
"payment_collections.payment_sessions.payment.id",
|
|
83
|
+
"payment_collections.payment_sessions.payment.captured_at",
|
|
84
|
+
"payment_collections.payment_sessions.payment.data",
|
|
85
|
+
],
|
|
86
|
+
filters: {
|
|
87
|
+
display_id: displayId,
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
if (!order) {
|
|
91
|
+
logger.warn(`Pay. - Ignoring direct debit exchange for #${displayId}: order not found`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const payPaymentSession = (0, getPayPaymentSession_1.default)(order);
|
|
95
|
+
if (!payPaymentSession?.provider_id.includes(types_1.PaymentProviderKeys.DIRECTDEBIT)) {
|
|
96
|
+
logger.warn(`Pay. - Ignoring direct debit exchange for #${displayId}: no direct debit payment session found`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// The flat transaction exchange is resolved through the mandate stored on
|
|
100
|
+
// the order's own payment session, not through anything in the body
|
|
101
|
+
if (!info) {
|
|
102
|
+
const sessionData = (payPaymentSession.data ?? {});
|
|
103
|
+
const paymentData = (payPaymentSession.payment?.data ?? {});
|
|
104
|
+
const mandateId = (0, directDebitExchange_1.readPayloadString)(sessionData.code) ?? (0, directDebitExchange_1.readPayloadString)(paymentData.code);
|
|
105
|
+
if (!mandateId) {
|
|
106
|
+
logger.warn(`Pay. - Ignoring direct debit exchange for #${displayId}: mandate code missing on payment`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
info = await client.getDirectDebitInfoByMandate(mandateId).catch((err) => {
|
|
110
|
+
logger.warn(`Pay. - Could not retrieve direct debit mandate ${mandateId} for #${displayId}: ${err.message ?? err}`);
|
|
111
|
+
return null;
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const directDebit = (0, directDebitExchange_1.extractDirectDebit)(info);
|
|
115
|
+
if (!directDebit) {
|
|
116
|
+
logger.warn(`Pay. - Ignoring direct debit exchange for #${displayId}: no direct debit found`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const statusCode = Number(directDebit.status?.code);
|
|
120
|
+
const statusAction = (0, directDebitExchange_1.normalizeDirectDebitStatusAction)(action, directDebit.status?.action);
|
|
121
|
+
const declined = directDebit.declined === true;
|
|
122
|
+
const statusLabel = Number.isNaN(statusCode) ? "unknown" : statusCode;
|
|
123
|
+
logger.info(`Pay. - Process direct debit exchange for order ${order.id} - #${displayId} with status ${statusLabel}`);
|
|
124
|
+
const paymentModuleService = container.resolve(utils_1.Modules.PAYMENT);
|
|
125
|
+
const paymentCollectionId = payPaymentSession.payment_collection_id;
|
|
126
|
+
const payment = payPaymentSession.payment;
|
|
127
|
+
if (statusCode === constants_1.PayDirectDebitStatusCode.COLLECTED ||
|
|
128
|
+
statusAction === "collected") {
|
|
129
|
+
if (payment?.captured_at) {
|
|
130
|
+
logger.info(`Pay. - Direct debit for order ${order.id} is already captured, skipping`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!payment?.id) {
|
|
134
|
+
logger.warn(`Pay. - Cannot capture direct debit for #${displayId}: no payment found on the session`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
// The capture invokes the provider's capturePayment, which re-verifies
|
|
138
|
+
// with Pay. that the direct debit is collected
|
|
139
|
+
await (0, core_flows_1.capturePaymentWorkflow)(container).run({
|
|
140
|
+
input: {
|
|
141
|
+
payment_id: payment.id,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (directDebitExchange_1.DIRECT_DEBIT_FAILED_CODES.has(statusCode) ||
|
|
147
|
+
declined ||
|
|
148
|
+
statusAction === "storno") {
|
|
149
|
+
// A storno legitimately reverses a collected payment, so the collection is
|
|
150
|
+
// marked failed even when a captured payment exists
|
|
151
|
+
await paymentModuleService.updatePaymentCollections(paymentCollectionId, {
|
|
152
|
+
status: utils_1.PaymentCollectionStatus.FAILED,
|
|
153
|
+
});
|
|
154
|
+
// Same signal the order API chargeback path emits, so consuming projects
|
|
155
|
+
// can follow up on the order and subscription
|
|
156
|
+
const eventBusService = container.resolve(utils_1.Modules.EVENT_BUS);
|
|
157
|
+
await eventBusService.emit({
|
|
158
|
+
name: "pay_payment.failed",
|
|
159
|
+
data: {
|
|
160
|
+
id: displayId,
|
|
161
|
+
...(Number.isNaN(statusCode) ? {} : { statusCode }),
|
|
162
|
+
},
|
|
163
|
+
}, {});
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (directDebitExchange_1.DIRECT_DEBIT_AWAITING_CODES.has(statusCode) ||
|
|
167
|
+
statusAction === "pending" ||
|
|
168
|
+
statusAction === "send") {
|
|
169
|
+
const collection = order.payment_collections.find((pc) => pc.id === paymentCollectionId);
|
|
170
|
+
if (collection?.status === utils_1.PaymentCollectionStatus.COMPLETED ||
|
|
171
|
+
collection?.status === utils_1.PaymentCollectionStatus.FAILED) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
await paymentModuleService.updatePaymentCollections(paymentCollectionId, {
|
|
175
|
+
status: utils_1.PaymentCollectionStatus.AWAITING,
|
|
176
|
+
});
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
logger.warn(`Pay. - Ignoring direct debit exchange for #${displayId}: unsupported status ${statusLabel}`);
|
|
180
|
+
}
|
|
181
|
+
exports.config = {
|
|
182
|
+
event: directDebitExchange_1.PAY_DIRECT_DEBIT_EXCHANGE_EVENT,
|
|
183
|
+
};
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0LWRlYml0LWV4Y2hhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2RpcmVjdC1kZWJpdC1leGNoYW5nZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFpRUEsZ0RBb1BDO0FBblRELHFEQUlrQztBQUNsQyxxREFBMkQ7QUFPM0QseUZBQWdFO0FBQ2hFLGtEQUkrQjtBQUMvQixpRUFBMEQ7QUFFMUQsK0RBQXdFO0FBQ3hFLHNFQWFxQztBQUVyQyxNQUFNLFlBQVksR0FBRyxDQUNuQixTQUEwQixFQUMxQixNQUFjLEVBQ0ksRUFBRTtJQUNwQixNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUNwQyxpQ0FBeUIsQ0FBQyxhQUFhLENBQ3hDLENBQUE7SUFFRCxNQUFNLGVBQWUsR0FBSSxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQWUsRUFBRSxPQUFPO1FBQ3JFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQTtJQUUxQyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQ1QsdUVBQXVFLENBQ3hFLENBQUE7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxPQUFPLElBQUksc0JBQVMsQ0FBQyxlQUFlLENBQUMsT0FBMEIsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUMxRSxDQUFDLENBQUE7QUFFRDs7Ozs7R0FLRztBQUNZLEtBQUssVUFBVSw2QkFBNkIsQ0FBQyxFQUMxRCxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUMsRUFDYixTQUFTLEdBQ3NDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDMUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFD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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-canceled.d.ts","sourceRoot":"","sources":["../../../../src/subscribers/payment-canceled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAapE,wBAA8B,sBAAsB,CAAC,EACnD,KAAK,EAAE,EAAC,IAAI,EAAC,EACb,SAAS,GACV,EAAE,cAAc,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"payment-canceled.d.ts","sourceRoot":"","sources":["../../../../src/subscribers/payment-canceled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAapE,wBAA8B,sBAAsB,CAAC,EACnD,KAAK,EAAE,EAAC,IAAI,EAAC,EACb,SAAS,GACV,EAAE,cAAc,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,CAAC,iBAuE9B;AAED,eAAO,MAAM,MAAM,EAAE,gBAEpB,CAAA"}
|
|
@@ -16,7 +16,13 @@ async function paymentCapturedHandler({ event: { data }, container, }) {
|
|
|
16
16
|
try {
|
|
17
17
|
const { data: [order], } = await query.graph({
|
|
18
18
|
entity: "order",
|
|
19
|
-
fields: [
|
|
19
|
+
fields: [
|
|
20
|
+
"id",
|
|
21
|
+
"payment_collections.status",
|
|
22
|
+
"payment_collections.payments.captured_at",
|
|
23
|
+
"payment_collections.payment_sessions.provider_id",
|
|
24
|
+
"payment_collections.payment_sessions.payment_collection_id",
|
|
25
|
+
],
|
|
20
26
|
filters: {
|
|
21
27
|
display_id: data.id,
|
|
22
28
|
},
|
|
@@ -25,14 +31,21 @@ async function paymentCapturedHandler({ event: { data }, container, }) {
|
|
|
25
31
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `No associated order found for ID: ${data.id}`);
|
|
26
32
|
}
|
|
27
33
|
const payPaymentSession = (0, getPayPaymentSession_1.default)(order);
|
|
28
|
-
|
|
29
|
-
if (isDirectDebit && !!payPaymentSession) {
|
|
34
|
+
if (payPaymentSession?.provider_id.includes(types_1.PaymentProviderKeys.DIRECTDEBIT)) {
|
|
30
35
|
const paymentModuleService = container.resolve(utils_1.Modules.PAYMENT);
|
|
31
36
|
await paymentModuleService.updatePaymentCollections(payPaymentSession.payment_collection_id, {
|
|
32
37
|
status: utils_1.PaymentCollectionStatus.FAILED,
|
|
33
38
|
});
|
|
34
39
|
}
|
|
35
40
|
else {
|
|
41
|
+
// A cancel exchange can arrive after the order was paid through another
|
|
42
|
+
// attempt, never cancel an order that has a captured payment.
|
|
43
|
+
const hasCapturedPayment = (order.payment_collections ?? []).some((pc) => pc.status === utils_1.PaymentCollectionStatus.COMPLETED ||
|
|
44
|
+
(pc.payments ?? []).some((payment) => !!payment.captured_at));
|
|
45
|
+
if (hasCapturedPayment) {
|
|
46
|
+
logger.info(`Skipping cancel for order ${order.id}, a captured payment exists`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
36
49
|
await (0, core_flows_1.cancelOrderWorkflow)(container).run({
|
|
37
50
|
input: {
|
|
38
51
|
order_id: order.id,
|
|
@@ -48,4 +61,4 @@ async function paymentCapturedHandler({ event: { data }, container, }) {
|
|
|
48
61
|
exports.config = {
|
|
49
62
|
event: "pay_payment.canceled",
|
|
50
63
|
};
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1jYW5jZWxlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zdWJzY3JpYmVycy9wYXltZW50LWNhbmNlbGVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQWFBLHlDQTBFQztBQXJGRCxxREFLa0M7QUFDbEMscURBQXdEO0FBQ3hELGtEQUEwRDtBQUMxRCx5RkFBZ0U7QUFHakQsS0FBSyxVQUFVLHNCQUFzQixDQUFDLEVBQ25ELEtBQUssRUFBRSxFQUFDLElBQUksRUFBQyxFQUNiLFNBQVMsR0FDb0I7SUFDN0IsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMxQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhFLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQTtJQUU1QyxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQ0osSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQ2QsR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDcEIsTUFBTSxFQUFFLE9BQU87WUFDZixNQUFNLEVBQUU7Z0JBQ04sSUFBSTtnQkFDSiw0QkFBNEI7Z0JBQzVCLDBDQUEwQztnQkFDMUMsa0RBQWtEO2dCQUNsRCw0REFBNEQ7YUFDN0Q7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFO2FBQ3BCO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0IscUNBQXFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FDL0MsQ0FBQTtRQUNILENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUEsOEJBQW9CLEVBQUMsS0FBSyxDQUFDLENBQUE7UUFFckQsSUFDRSxpQkFBaUIsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLDJCQUFtQixDQUFDLFdBQVcsQ0FBQyxFQUN4RSxDQUFDO1lBQ0QsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUM1QyxlQUFPLENBQUMsT0FBTyxDQUNoQixDQUFBO1lBRUQsTUFBTSxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FDakQsaUJBQWlCLENBQUMscUJBQStCLEVBQ2pEO2dCQUNFLE1BQU0sRUFBRSwrQkFBdUIsQ0FBQyxNQUFNO2FBQ3ZDLENBQ0YsQ0FBQTtRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sd0VBQXdFO1lBQ3hFLDhEQUE4RDtZQUM5RCxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBSyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDL0QsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUNMLEVBQUUsQ0FBQyxNQUFNLEtBQUssK0JBQXVCLENBQUMsU0FBUztnQkFDL0MsQ0FBQyxFQUFFLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FDL0QsQ0FBQTtZQUVELElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FDVCw2QkFBNkIsS0FBSyxDQUFDLEVBQUUsNkJBQTZCLENBQ25FLENBQUE7Z0JBQ0QsT0FBTTtZQUNSLENBQUM7WUFFRCxNQUFNLElBQUEsZ0NBQW1CLEVBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUN2QyxLQUFLLEVBQUU7b0JBQ0wsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO2lCQUNuQjthQUNGLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDZixNQUFNLENBQUMsQ0FBQTtJQUNULENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSxzQkFBc0I7Q0FDOUIsQ0FBQSJ9
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { SubscriberArgs, SubscriberConfig } from "@medusajs/framework";
|
|
2
2
|
export default function payPaymentFailedHandler({ event: { data }, container, }: SubscriberArgs<{
|
|
3
3
|
id: string;
|
|
4
|
+
statusCode?: number;
|
|
4
5
|
}>): Promise<void>;
|
|
5
6
|
export declare const config: SubscriberConfig;
|
|
6
7
|
//# sourceMappingURL=payment-failed.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-failed.d.ts","sourceRoot":"","sources":["../../../../src/subscribers/payment-failed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAYpE,wBAA8B,uBAAuB,CAAC,EACpD,KAAK,EAAE,EAAC,IAAI,EAAC,EACb,SAAS,GACV,EAAE,cAAc,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"payment-failed.d.ts","sourceRoot":"","sources":["../../../../src/subscribers/payment-failed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAA;AAYpE,wBAA8B,uBAAuB,CAAC,EACpD,KAAK,EAAE,EAAC,IAAI,EAAC,EACb,SAAS,GACV,EAAE,cAAc,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,iBA6DnD;AAED,eAAO,MAAM,MAAM,EAAE,gBAEpB,CAAA"}
|
|
@@ -7,17 +7,19 @@ exports.config = void 0;
|
|
|
7
7
|
exports.default = payPaymentFailedHandler;
|
|
8
8
|
const utils_1 = require("@medusajs/framework/utils");
|
|
9
9
|
const getPayPaymentSession_1 = __importDefault(require("../utils/getPayPaymentSession"));
|
|
10
|
+
const constants_1 = require("../providers/pay/core/constants");
|
|
10
11
|
async function payPaymentFailedHandler({ event: { data }, container, }) {
|
|
11
12
|
const logger = container.resolve("logger");
|
|
12
13
|
const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
|
|
13
14
|
const paymentModuleService = container.resolve(utils_1.Modules.PAYMENT);
|
|
14
|
-
logger.info("Process
|
|
15
|
+
logger.info("Process failed Pay. payment");
|
|
15
16
|
try {
|
|
16
17
|
const { data: [order], } = await query.graph({
|
|
17
18
|
entity: "order",
|
|
18
19
|
fields: [
|
|
19
20
|
"id",
|
|
20
21
|
"payment_collections.*",
|
|
22
|
+
"payment_collections.payments.captured_at",
|
|
21
23
|
"payment_collections.payment_sessions.*",
|
|
22
24
|
],
|
|
23
25
|
filters: {
|
|
@@ -27,8 +29,16 @@ async function payPaymentFailedHandler({ event: { data }, container, }) {
|
|
|
27
29
|
if (!order) {
|
|
28
30
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `No associated order found for ID: ${data.id}`);
|
|
29
31
|
}
|
|
32
|
+
// A failure exchange for a stale attempt must not flip a paid collection.
|
|
33
|
+
// A chargeback is the exception, it legitimately reverses a captured payment.
|
|
34
|
+
const hasCapturedPayment = (order.payment_collections ?? []).some((pc) => pc.status === utils_1.PaymentCollectionStatus.COMPLETED ||
|
|
35
|
+
(pc.payments ?? []).some((payment) => !!payment.captured_at));
|
|
36
|
+
if (hasCapturedPayment && data.statusCode !== constants_1.PayPaymentStatus.CHARGEBACK) {
|
|
37
|
+
logger.info(`Skipping failed status for order ${order.id}, a captured payment exists`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
30
40
|
const payPaymentSession = (0, getPayPaymentSession_1.default)(order);
|
|
31
|
-
if (
|
|
41
|
+
if (payPaymentSession) {
|
|
32
42
|
await paymentModuleService.updatePaymentCollections(payPaymentSession.payment_collection_id, {
|
|
33
43
|
status: utils_1.PaymentCollectionStatus.FAILED,
|
|
34
44
|
});
|
|
@@ -42,4 +52,4 @@ async function payPaymentFailedHandler({ event: { data }, container, }) {
|
|
|
42
52
|
exports.config = {
|
|
43
53
|
event: ["pay_payment.failed"],
|
|
44
54
|
};
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1mYWlsZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc3Vic2NyaWJlcnMvcGF5bWVudC1mYWlsZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBWUEsMENBZ0VDO0FBMUVELHFEQUtrQztBQUVsQyx5RkFBZ0U7QUFDaEUsK0RBQWdFO0FBRWpELEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxFQUNwRCxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUMsRUFDYixTQUFTLEdBQ3lDO0lBQ2xELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDMUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQzVDLGVBQU8sQ0FBQyxPQUFPLENBQ2hCLENBQUE7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUE7SUFFMUMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUNKLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUNkLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsTUFBTSxFQUFFO2dCQUNOLElBQUk7Z0JBQ0osdUJBQXVCO2dCQUN2QiwwQ0FBMEM7Z0JBQzFDLHdDQUF3QzthQUN6QztZQUNELE9BQU8sRUFBRTtnQkFDUCxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUU7YUFDcEI7U0FDRixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUMzQixxQ0FBcUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUMvQyxDQUFBO1FBQ0gsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSw4RUFBOEU7UUFDOUUsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9ELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FDTCxFQUFFLENBQUMsTUFBTSxLQUFLLCtCQUF1QixDQUFDLFNBQVM7WUFDL0MsQ0FBQyxFQUFFLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FDL0QsQ0FBQTtRQUVELElBQUksa0JBQWtCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyw0QkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxRSxNQUFNLENBQUMsSUFBSSxDQUNULG9DQUFvQyxLQUFLLENBQUMsRUFBRSw2QkFBNkIsQ0FDMUUsQ0FBQTtZQUNELE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLDhCQUFvQixFQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXJELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixNQUFNLG9CQUFvQixDQUFDLHdCQUF3QixDQUNqRCxpQkFBaUIsQ0FBQyxxQkFBK0IsRUFDakQ7Z0JBQ0UsTUFBTSxFQUFFLCtCQUF1QixDQUFDLE1BQU07YUFDdkMsQ0FDRixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNmLE1BQU0sQ0FBQyxDQUFBO0lBQ1QsQ0FBQztBQUNILENBQUM7QUFFWSxRQUFBLE1BQU0sR0FBcUI7SUFDdEMsS0FBSyxFQUFFLENBQUMsb0JBQW9CLENBQUM7Q0FDOUIsQ0FBQSJ9
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DirectDebit, DirectDebitInfoResponse } from "../providers/pay/types";
|
|
2
|
+
export declare const PAY_DIRECT_DEBIT_EXCHANGE_EVENT = "pay_payment.direct_debit_exchange";
|
|
3
|
+
export declare const DIRECT_DEBIT_FAILED_CODES: Set<number>;
|
|
4
|
+
export declare const DIRECT_DEBIT_AWAITING_CODES: Set<number>;
|
|
5
|
+
export declare function normalizeAction(action: unknown): string;
|
|
6
|
+
export declare function readPayloadString(value: unknown): string | null;
|
|
7
|
+
export declare function isLegacyDirectDebitAction(action: unknown): boolean;
|
|
8
|
+
export declare function readDirectDebitReferenceId(payload: Record<string, any>): string | null;
|
|
9
|
+
export declare function readDirectDebitMandateId(payload: Record<string, any>): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Detects the one-off direct debit (Incasso) transaction exchange that Pay.
|
|
12
|
+
* sends for mandates created via /directdebits/mandates. Unlike the
|
|
13
|
+
* interactive checkout exchange it has no top-level type "order" and no
|
|
14
|
+
* action, it is a flat transaction payload with paymentMethod.name "Incasso"
|
|
15
|
+
* (method id 137) and the order display id only inside description
|
|
16
|
+
* ("Shop - #123"). The interactive type "order" exchange is handled by the
|
|
17
|
+
* regular webhook flow, so it is explicitly excluded here.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isDirectDebitTransactionExchange(payload: any): boolean;
|
|
20
|
+
export declare function parseDirectDebitDisplayId(payload: Record<string, any>): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* GET /directdebits/{id} returns a bare direct debit object while the mandate
|
|
23
|
+
* query returns a paginated envelope, this normalizes both to one direct debit.
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractDirectDebit(info?: DirectDebitInfoResponse | DirectDebit | Record<string, any> | null): DirectDebit | null;
|
|
26
|
+
export declare function extractDirectDebitReference(info: DirectDebitInfoResponse | DirectDebit | Record<string, any> | null, directDebit: DirectDebit | Record<string, any> | null): string | null;
|
|
27
|
+
export declare function normalizeDirectDebitStatusAction(payloadAction: string, statusAction?: string): string;
|
|
28
|
+
//# sourceMappingURL=directDebitExchange.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directDebitExchange.d.ts","sourceRoot":"","sources":["../../../../src/utils/directDebitExchange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,uBAAuB,EAAC,MAAM,wBAAwB,CAAA;AAG3E,eAAO,MAAM,+BAA+B,sCACP,CAAA;AASrC,eAAO,MAAM,yBAAyB,aAGpC,CAAA;AAEF,eAAO,MAAM,2BAA2B,aAItC,CAAA;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE/D;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAElE;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,MAAM,GAAG,IAAI,CAIf;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,MAAM,GAAG,IAAI,CAIf;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAgBtE;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,MAAM,GAAG,IAAI,CAYf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,CAAC,EAAE,uBAAuB,GAAG,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GACxE,WAAW,GAAG,IAAI,CAgBpB;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,uBAAuB,GAAG,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EACxE,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GACpD,MAAM,GAAG,IAAI,CASf;AAED,wBAAgB,gCAAgC,CAC9C,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAQR"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DIRECT_DEBIT_AWAITING_CODES = exports.DIRECT_DEBIT_FAILED_CODES = exports.PAY_DIRECT_DEBIT_EXCHANGE_EVENT = void 0;
|
|
4
|
+
exports.normalizeAction = normalizeAction;
|
|
5
|
+
exports.readPayloadString = readPayloadString;
|
|
6
|
+
exports.isLegacyDirectDebitAction = isLegacyDirectDebitAction;
|
|
7
|
+
exports.readDirectDebitReferenceId = readDirectDebitReferenceId;
|
|
8
|
+
exports.readDirectDebitMandateId = readDirectDebitMandateId;
|
|
9
|
+
exports.isDirectDebitTransactionExchange = isDirectDebitTransactionExchange;
|
|
10
|
+
exports.parseDirectDebitDisplayId = parseDirectDebitDisplayId;
|
|
11
|
+
exports.extractDirectDebit = extractDirectDebit;
|
|
12
|
+
exports.extractDirectDebitReference = extractDirectDebitReference;
|
|
13
|
+
exports.normalizeDirectDebitStatusAction = normalizeDirectDebitStatusAction;
|
|
14
|
+
const constants_1 = require("../providers/pay/core/constants");
|
|
15
|
+
exports.PAY_DIRECT_DEBIT_EXCHANGE_EVENT = "pay_payment.direct_debit_exchange";
|
|
16
|
+
const LEGACY_DIRECT_DEBIT_ACTIONS = new Set([
|
|
17
|
+
"incassopending",
|
|
18
|
+
"incassosend",
|
|
19
|
+
"incassocollected",
|
|
20
|
+
"incassostorno",
|
|
21
|
+
]);
|
|
22
|
+
exports.DIRECT_DEBIT_FAILED_CODES = new Set([
|
|
23
|
+
constants_1.PayDirectDebitStatusCode.FAILED,
|
|
24
|
+
constants_1.PayDirectDebitStatusCode.STORNO,
|
|
25
|
+
]);
|
|
26
|
+
exports.DIRECT_DEBIT_AWAITING_CODES = new Set([
|
|
27
|
+
constants_1.PayDirectDebitStatusCode.PENDING,
|
|
28
|
+
constants_1.PayDirectDebitStatusCode.SENT,
|
|
29
|
+
constants_1.PayDirectDebitStatusCode.PROCESSING,
|
|
30
|
+
]);
|
|
31
|
+
function normalizeAction(action) {
|
|
32
|
+
return typeof action === "string" ? action.trim().toLowerCase() : "";
|
|
33
|
+
}
|
|
34
|
+
function readPayloadString(value) {
|
|
35
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
36
|
+
}
|
|
37
|
+
function isLegacyDirectDebitAction(action) {
|
|
38
|
+
return LEGACY_DIRECT_DEBIT_ACTIONS.has(normalizeAction(action));
|
|
39
|
+
}
|
|
40
|
+
function readDirectDebitReferenceId(payload) {
|
|
41
|
+
return readPayloadString(payload?.referenceId ?? payload?.reference_id ?? payload?.referenceid);
|
|
42
|
+
}
|
|
43
|
+
function readDirectDebitMandateId(payload) {
|
|
44
|
+
return readPayloadString(payload?.mandateId ?? payload?.mandate_id ?? payload?.mandateid);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Detects the one-off direct debit (Incasso) transaction exchange that Pay.
|
|
48
|
+
* sends for mandates created via /directdebits/mandates. Unlike the
|
|
49
|
+
* interactive checkout exchange it has no top-level type "order" and no
|
|
50
|
+
* action, it is a flat transaction payload with paymentMethod.name "Incasso"
|
|
51
|
+
* (method id 137) and the order display id only inside description
|
|
52
|
+
* ("Shop - #123"). The interactive type "order" exchange is handled by the
|
|
53
|
+
* regular webhook flow, so it is explicitly excluded here.
|
|
54
|
+
*/
|
|
55
|
+
function isDirectDebitTransactionExchange(payload) {
|
|
56
|
+
if (!payload || typeof payload !== "object") {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (payload.type === "order" || payload.action) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
const paymentMethod = payload.paymentMethod;
|
|
63
|
+
const isIncasso = paymentMethod?.name === "Incasso" || paymentMethod?.id === 137;
|
|
64
|
+
const hasStatusCode = payload.status?.code !== undefined && payload.status?.code !== null;
|
|
65
|
+
return isIncasso && hasStatusCode;
|
|
66
|
+
}
|
|
67
|
+
function parseDirectDebitDisplayId(payload) {
|
|
68
|
+
const fromReference = readPayloadString(payload?.reference);
|
|
69
|
+
if (fromReference) {
|
|
70
|
+
return fromReference;
|
|
71
|
+
}
|
|
72
|
+
const description = typeof payload?.description === "string" ? payload.description : "";
|
|
73
|
+
const match = description.match(/#\s*(\d+)/);
|
|
74
|
+
return match ? match[1] : null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* GET /directdebits/{id} returns a bare direct debit object while the mandate
|
|
78
|
+
* query returns a paginated envelope, this normalizes both to one direct debit.
|
|
79
|
+
*/
|
|
80
|
+
function extractDirectDebit(info) {
|
|
81
|
+
if (!info) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const data = info;
|
|
85
|
+
if (Array.isArray(data.directdebits)) {
|
|
86
|
+
return data.directdebits[0] ?? null;
|
|
87
|
+
}
|
|
88
|
+
if (data.id || data.reference) {
|
|
89
|
+
return data;
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function extractDirectDebitReference(info, directDebit) {
|
|
94
|
+
const data = (info ?? {});
|
|
95
|
+
const reference = directDebit?.reference ??
|
|
96
|
+
directDebit?.mandate?.reference ??
|
|
97
|
+
data.reference ??
|
|
98
|
+
data.mandate?.reference;
|
|
99
|
+
return readPayloadString(reference);
|
|
100
|
+
}
|
|
101
|
+
function normalizeDirectDebitStatusAction(payloadAction, statusAction) {
|
|
102
|
+
const normalizedStatusAction = normalizeAction(statusAction);
|
|
103
|
+
if (normalizedStatusAction) {
|
|
104
|
+
return normalizedStatusAction;
|
|
105
|
+
}
|
|
106
|
+
return payloadAction.replace(/^incasso/, "");
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0RGViaXRFeGNoYW5nZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9kaXJlY3REZWJpdEV4Y2hhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdCQSwwQ0FFQztBQUVELDhDQUVDO0FBRUQsOERBRUM7QUFFRCxnRUFNQztBQUVELDREQU1DO0FBV0QsNEVBZ0JDO0FBRUQsOERBY0M7QUFNRCxnREFrQkM7QUFFRCxrRUFZQztBQUVELDRFQVdDO0FBL0lELCtEQUF3RTtBQUUzRCxRQUFBLCtCQUErQixHQUMxQyxtQ0FBbUMsQ0FBQTtBQUVyQyxNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFDLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2Isa0JBQWtCO0lBQ2xCLGVBQWU7Q0FDaEIsQ0FBQyxDQUFBO0FBRVcsUUFBQSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUN2RCxvQ0FBd0IsQ0FBQyxNQUFNO0lBQy9CLG9DQUF3QixDQUFDLE1BQU07Q0FDaEMsQ0FBQyxDQUFBO0FBRVcsUUFBQSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUN6RCxvQ0FBd0IsQ0FBQyxPQUFPO0lBQ2hDLG9DQUF3QixDQUFDLElBQUk7SUFDN0Isb0NBQXdCLENBQUMsVUFBVTtDQUNwQyxDQUFDLENBQUE7QUFFRixTQUFnQixlQUFlLENBQUMsTUFBZTtJQUM3QyxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7QUFDdEUsQ0FBQztBQUVELFNBQWdCLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FB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
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webbers/pay-payments-medusa",
|
|
3
3
|
"displayName": "Medusa v2 Pay. Plugin",
|
|
4
|
-
"version": "2.2.
|
|
4
|
+
"version": "2.2.47",
|
|
5
5
|
"description": "The Pay.nl payment provider plugin for Medusa v2",
|
|
6
6
|
"author": "Webbers B.V. <development@webbers.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
"scripts": {
|
|
38
38
|
"build": "medusa plugin:build",
|
|
39
39
|
"dev": "medusa plugin:develop",
|
|
40
|
-
"prepublishOnly": "medusa plugin:build"
|
|
40
|
+
"prepublishOnly": "medusa plugin:build",
|
|
41
|
+
"test": "jest src"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"@medusajs/admin-sdk": "^2.11.1",
|
|
@@ -49,13 +50,16 @@
|
|
|
49
50
|
"@medusajs/types": "^2.11.1",
|
|
50
51
|
"@medusajs/ui": "^4.0.23",
|
|
51
52
|
"@swc/core": "1.5.7",
|
|
53
|
+
"@types/jest": "^29.5.14",
|
|
52
54
|
"@types/node": "^20.19.19",
|
|
53
55
|
"@types/react": "^18.3.25",
|
|
54
56
|
"@types/react-dom": "^18.3.7",
|
|
57
|
+
"jest": "^29.7.0",
|
|
55
58
|
"prettier": "^3.6.2",
|
|
56
59
|
"prop-types": "^15.8.1",
|
|
57
60
|
"react": "^18.2.0",
|
|
58
61
|
"react-dom": "^18.2.0",
|
|
62
|
+
"ts-jest": "^29.2.5",
|
|
59
63
|
"ts-node": "^10.9.2",
|
|
60
64
|
"typescript": "^5.9.3",
|
|
61
65
|
"vite": "^5.4.20",
|