@mostajs/payment 0.5.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -0
- package/dist/core/abstract-provider.d.ts +22 -0
- package/dist/core/abstract-provider.d.ts.map +1 -0
- package/dist/core/abstract-provider.js +54 -0
- package/dist/core/abstract-provider.js.map +1 -0
- package/dist/core/auto-register.d.ts +28 -0
- package/dist/core/auto-register.d.ts.map +1 -0
- package/dist/core/auto-register.js +99 -0
- package/dist/core/auto-register.js.map +1 -0
- package/dist/core/checkout-service.d.ts +70 -0
- package/dist/core/checkout-service.d.ts.map +1 -0
- package/dist/core/checkout-service.js +107 -0
- package/dist/core/checkout-service.js.map +1 -0
- package/dist/lib/webhook-helpers.d.ts +1 -1
- package/dist/lib/webhook-helpers.d.ts.map +1 -1
- package/dist/lib/webhook-helpers.js +10 -1
- package/dist/lib/webhook-helpers.js.map +1 -1
- package/dist/providers/chargily.provider.d.ts +5 -4
- package/dist/providers/chargily.provider.d.ts.map +1 -1
- package/dist/providers/chargily.provider.js +5 -3
- package/dist/providers/chargily.provider.js.map +1 -1
- package/dist/providers/guiddini.provider.d.ts +38 -0
- package/dist/providers/guiddini.provider.d.ts.map +1 -0
- package/dist/providers/guiddini.provider.js +126 -0
- package/dist/providers/guiddini.provider.js.map +1 -0
- package/dist/providers/manual.provider.d.ts +5 -4
- package/dist/providers/manual.provider.d.ts.map +1 -1
- package/dist/providers/manual.provider.js +14 -4
- package/dist/providers/manual.provider.js.map +1 -1
- package/dist/providers/paypal.provider.d.ts +5 -4
- package/dist/providers/paypal.provider.d.ts.map +1 -1
- package/dist/providers/paypal.provider.js +5 -3
- package/dist/providers/paypal.provider.js.map +1 -1
- package/dist/providers/satim.provider.d.ts +17 -4
- package/dist/providers/satim.provider.d.ts.map +1 -1
- package/dist/providers/satim.provider.js +82 -14
- package/dist/providers/satim.provider.js.map +1 -1
- package/dist/providers/slickpay.provider.d.ts +37 -0
- package/dist/providers/slickpay.provider.d.ts.map +1 -0
- package/dist/providers/slickpay.provider.js +121 -0
- package/dist/providers/slickpay.provider.js.map +1 -0
- package/dist/providers/stripe.provider.d.ts +5 -4
- package/dist/providers/stripe.provider.d.ts.map +1 -1
- package/dist/providers/stripe.provider.js +5 -3
- package/dist/providers/stripe.provider.js.map +1 -1
- package/dist/schemas/payment.schema.d.ts.map +1 -1
- package/dist/schemas/payment.schema.js +5 -0
- package/dist/schemas/payment.schema.js.map +1 -1
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -1
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/llms.txt +118 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chargily.provider.js","sourceRoot":"","sources":["../../src/providers/chargily.provider.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wCAAwC;AACxC,sDAAsD;AACtD,sCAAsC;AAGtC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAUxC,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"chargily.provider.js","sourceRoot":"","sources":["../../src/providers/chargily.provider.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,wCAAwC;AACxC,sDAAsD;AACtD,sCAAsC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAUxC,MAAM,OAAO,gBAAiB,SAAQ,uBAAuB;IAOvC;IANX,IAAI,GAAG,UAAU,CAAA;IACjB,mBAAmB,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7B,gBAAgB,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IAEvC,OAAO,CAAQ;IAEvB,YAAoB,MAAsB;QACxC,KAAK,EAAE,CAAA;QADW,WAAM,GAAN,MAAM,CAAgB;QAExC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ;YAC5B,CAAC,CAAC,sCAAsC;YACxC,CAAC,CAAC,iCAAiC,CAAA;IACvC,CAAC;IAEO,OAAO;QACb,OAAO;YACL,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAC/C,cAAc,EAAE,kBAAkB;SACnC,CAAA;IACH,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,MAAsB;QAC/C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,uDAAuD;gBAC9E,QAAQ,EAAE,KAAK;gBACf,WAAW,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;gBACxD,WAAW,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;gBACvD,gBAAgB,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;gBAC7D,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,YAAY,MAAM,CAAC,OAAO,EAAE;gBAC/D,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE;aAC1D,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC9C,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;QACjF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAsB;QACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,EAAE;YACnD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;QACpF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QAC/F,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;QACjF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAkB;QACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QAC/F,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;QAChF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAES,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,SAAiB;QAC7D,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACpF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzD,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAE5B,4DAA4D;QAC5D,wEAAwE;QACxE,+DAA+D;QAC/D,qCAAqC;QACrC,MAAM,cAAc,GAAG,GAAG,EAAE,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE,IAAI,CAAA;QAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;QAChD,MAAM,iBAAiB,GACrB,cAAc,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QAElE,mEAAmE;QACnE,4EAA4E;QAC5E,uDAAuD;QACvD,IAAI,IAAY,CAAA;QAChB,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,GAAG,iBAAiB,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB;gBACnD,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB;oBACjD,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,kBAAkB;wBACrD,CAAC,CAAC,iBAAiB,CAAA;QACvB,CAAC;QAED,OAAO;YACL,IAAI;YACJ,IAAI,EAAE;gBACJ,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO;aACpC;YACD,GAAG;SACJ,CAAA;IACH,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAgC;IACrE,OAAO,IAAI,gBAAgB,CAAC;QAC1B,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC,kBAAkB,EAAE,EAAE,CAAC;QACzF,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,oBAAoB,CAAC,KAAK,OAAO;QACtE,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;QACpF,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;QACnF,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,sBAAsB,CAAC;KACjE,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { CheckoutParams, CheckoutResult, WebhookEvent } from '../core/provider.interface.js';
|
|
2
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
3
|
+
export interface GuiddiniConfig {
|
|
4
|
+
appKey: string;
|
|
5
|
+
appSecret: string;
|
|
6
|
+
testMode?: boolean;
|
|
7
|
+
/** Base API (sans slash final). Pilotable par env. */
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
/** Chemin d'initiation de paiement. Défaut '/transactions/initiate'. */
|
|
10
|
+
initiatePath?: string;
|
|
11
|
+
/** Chemin de statut (avec {id}). Défaut '/transactions'. */
|
|
12
|
+
statusPath?: string;
|
|
13
|
+
returnUrl?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class GuiddiniProvider extends AbstractPaymentProvider {
|
|
16
|
+
private config;
|
|
17
|
+
readonly name = "guiddini";
|
|
18
|
+
readonly supportedCurrencies: string[];
|
|
19
|
+
readonly supportedMethods: string[];
|
|
20
|
+
private baseUrl;
|
|
21
|
+
private initiatePath;
|
|
22
|
+
private statusPath;
|
|
23
|
+
constructor(config: GuiddiniConfig);
|
|
24
|
+
private headers;
|
|
25
|
+
protected doCheckout(params: CheckoutParams): Promise<CheckoutResult>;
|
|
26
|
+
/** Statut d'une transaction Guiddini par id. */
|
|
27
|
+
getTransaction(id: string): Promise<Record<string, unknown>>;
|
|
28
|
+
/** Mappe un statut Guiddini/SATIM vers un type d'event normalisé (pur, testable). */
|
|
29
|
+
static mapStatus(raw: Record<string, any>): string;
|
|
30
|
+
protected doVerifyWebhook(body: string, _signature: string): Promise<WebhookEvent>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Crée un provider Guiddini depuis l'environnement (cascade @mostajs/config).
|
|
34
|
+
* Env : GUIDDINI_APP_KEY, GUIDDINI_APP_SECRET, GUIDDINI_TEST_MODE,
|
|
35
|
+
* GUIDDINI_BASE_URL, GUIDDINI_INITIATE_PATH, GUIDDINI_STATUS_PATH, GUIDDINI_RETURN_URL.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createGuiddiniProvider(config?: Partial<GuiddiniConfig>): GuiddiniProvider;
|
|
38
|
+
//# sourceMappingURL=guiddini.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guiddini.provider.d.ts","sourceRoot":"","sources":["../../src/providers/guiddini.provider.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAGtE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,gBAAiB,SAAQ,uBAAuB;IAS/C,OAAO,CAAC,MAAM;IAR1B,QAAQ,CAAC,IAAI,cAAa;IAC1B,QAAQ,CAAC,mBAAmB,WAAU;IACtC,QAAQ,CAAC,gBAAgB,WAAsB;IAE/C,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,UAAU,CAAQ;gBAEN,MAAM,EAAE,cAAc;IAS1C,OAAO,CAAC,OAAO;cASC,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IA0B3E,gDAAgD;IAC1C,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMlE,qFAAqF;IACrF,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;cAQlC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAyBzF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,gBAAgB,CAUzF"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// @mostajs/payment — Guiddini provider (agrégateur Algérie : CIB + EDAHABIA via SATIM)
|
|
2
|
+
// Author: Dr Hamid MADANI <drmdh@msn.com>
|
|
3
|
+
// Ref: https://guiddini.dz/docs/api/satim · >100 marchands certifiés SATIM
|
|
4
|
+
//
|
|
5
|
+
// Guiddini Pay : agrégateur SATIM (clé/secret applicatifs). Flux : initiation →
|
|
6
|
+
// redirection vers la page SATIM → confirmation par interrogation du statut.
|
|
7
|
+
// La doc publique étant rendue côté client, les chemins/URL sont PILOTABLES PAR
|
|
8
|
+
// ENV (corrigeables sans toucher au code, §10) — défauts provisoires à confirmer
|
|
9
|
+
// en certification GIE Monétique.
|
|
10
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
11
|
+
import { getEnv } from '@mostajs/config';
|
|
12
|
+
export class GuiddiniProvider extends AbstractPaymentProvider {
|
|
13
|
+
config;
|
|
14
|
+
name = 'guiddini';
|
|
15
|
+
supportedCurrencies = ['DZD'];
|
|
16
|
+
supportedMethods = ['cib', 'edahabia'];
|
|
17
|
+
baseUrl;
|
|
18
|
+
initiatePath;
|
|
19
|
+
statusPath;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
super();
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.baseUrl = config.baseUrl ?? (config.testMode
|
|
24
|
+
? 'https://epay.guiddini.dz/api/test'
|
|
25
|
+
: 'https://epay.guiddini.dz/api');
|
|
26
|
+
this.initiatePath = config.initiatePath ?? '/transactions/initiate';
|
|
27
|
+
this.statusPath = config.statusPath ?? '/transactions';
|
|
28
|
+
}
|
|
29
|
+
headers() {
|
|
30
|
+
return {
|
|
31
|
+
'x-app-key': this.config.appKey,
|
|
32
|
+
'x-app-secret': this.config.appSecret,
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
'Accept': 'application/json',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async doCheckout(params) {
|
|
38
|
+
const res = await fetch(`${this.baseUrl}${this.initiatePath}`, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: this.headers(),
|
|
41
|
+
body: JSON.stringify({
|
|
42
|
+
amount: params.amount, // DZD
|
|
43
|
+
order_number: params.orderId, // notre référence (matching)
|
|
44
|
+
return_url: params.successUrl ?? this.config.returnUrl,
|
|
45
|
+
fail_url: params.cancelUrl,
|
|
46
|
+
description: params.description ?? `Commande ${params.orderId}`,
|
|
47
|
+
meta: params.metadata,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
if (!res.ok) {
|
|
51
|
+
const err = await res.json().catch(() => ({}));
|
|
52
|
+
throw new Error(`[guiddini] Checkout failed: ${err.message ?? res.statusText}`);
|
|
53
|
+
}
|
|
54
|
+
const data = await res.json();
|
|
55
|
+
const d = data.data ?? data;
|
|
56
|
+
// { form_url|redirect_url|checkout_url, order_id|id }
|
|
57
|
+
return {
|
|
58
|
+
url: d.form_url ?? d.redirect_url ?? d.checkout_url ?? null,
|
|
59
|
+
sessionId: String(d.order_id ?? d.id ?? d.transaction_id ?? ''),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Statut d'une transaction Guiddini par id. */
|
|
63
|
+
async getTransaction(id) {
|
|
64
|
+
const res = await fetch(`${this.baseUrl}${this.statusPath}/${id}`, { headers: this.headers() });
|
|
65
|
+
if (!res.ok)
|
|
66
|
+
throw new Error(`[guiddini] Get transaction failed: ${res.statusText}`);
|
|
67
|
+
return res.json();
|
|
68
|
+
}
|
|
69
|
+
/** Mappe un statut Guiddini/SATIM vers un type d'event normalisé (pur, testable). */
|
|
70
|
+
static mapStatus(raw) {
|
|
71
|
+
const s = String(raw?.status ?? raw?.state ?? raw?.order_status ?? '').toLowerCase();
|
|
72
|
+
if (s === 'paid' || s === 'success' || s === 'completed' || s === 'confirmed' || raw?.order_status === 2)
|
|
73
|
+
return 'payment.success';
|
|
74
|
+
if (s === 'failed' || s === 'declined' || s === 'cancelled' || s === 'canceled')
|
|
75
|
+
return 'payment.failed';
|
|
76
|
+
if (s === 'refunded')
|
|
77
|
+
return 'payment.refunded';
|
|
78
|
+
return 'payment.pending';
|
|
79
|
+
}
|
|
80
|
+
async doVerifyWebhook(body, _signature) {
|
|
81
|
+
// Confirmation par retour + interrogation. Accepte un JSON déjà résolu
|
|
82
|
+
// ({order_number,status} — testable hors-ligne) ou un JSON {id} → interrogation.
|
|
83
|
+
let raw = {};
|
|
84
|
+
try {
|
|
85
|
+
raw = JSON.parse(body);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
raw = Object.fromEntries(new URLSearchParams(body));
|
|
89
|
+
}
|
|
90
|
+
const env = raw.data ?? raw;
|
|
91
|
+
let status = env;
|
|
92
|
+
const id = env.id ?? env.order_id ?? env.transaction_id;
|
|
93
|
+
if (env.status === undefined && env.order_status === undefined && id) {
|
|
94
|
+
const fetched = await this.getTransaction(String(id));
|
|
95
|
+
status = fetched.data ?? fetched;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
type: GuiddiniProvider.mapStatus(status),
|
|
99
|
+
data: {
|
|
100
|
+
orderId: env.order_number ?? status.order_number ?? status.orderId,
|
|
101
|
+
transactionId: id ?? status.id,
|
|
102
|
+
amount: status.amount,
|
|
103
|
+
currency: 'DZD',
|
|
104
|
+
status: status.status ?? status.order_status,
|
|
105
|
+
},
|
|
106
|
+
raw: status,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Crée un provider Guiddini depuis l'environnement (cascade @mostajs/config).
|
|
112
|
+
* Env : GUIDDINI_APP_KEY, GUIDDINI_APP_SECRET, GUIDDINI_TEST_MODE,
|
|
113
|
+
* GUIDDINI_BASE_URL, GUIDDINI_INITIATE_PATH, GUIDDINI_STATUS_PATH, GUIDDINI_RETURN_URL.
|
|
114
|
+
*/
|
|
115
|
+
export function createGuiddiniProvider(config) {
|
|
116
|
+
return new GuiddiniProvider({
|
|
117
|
+
appKey: config?.appKey ?? getEnv('GUIDDINI_APP_KEY', ''),
|
|
118
|
+
appSecret: config?.appSecret ?? getEnv('GUIDDINI_APP_SECRET', ''),
|
|
119
|
+
testMode: config?.testMode ?? getEnv('GUIDDINI_TEST_MODE') !== 'false',
|
|
120
|
+
baseUrl: config?.baseUrl ?? getEnv('GUIDDINI_BASE_URL'),
|
|
121
|
+
initiatePath: config?.initiatePath ?? getEnv('GUIDDINI_INITIATE_PATH'),
|
|
122
|
+
statusPath: config?.statusPath ?? getEnv('GUIDDINI_STATUS_PATH'),
|
|
123
|
+
returnUrl: config?.returnUrl ?? getEnv('GUIDDINI_RETURN_URL', '/payment/success'),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=guiddini.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guiddini.provider.js","sourceRoot":"","sources":["../../src/providers/guiddini.provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CheckoutParams, CheckoutResult, WebhookEvent } from '../core/provider.interface.js';
|
|
2
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
2
3
|
export interface ManualConfig {
|
|
3
4
|
bankInfo?: {
|
|
4
5
|
rib: string;
|
|
@@ -7,14 +8,14 @@ export interface ManualConfig {
|
|
|
7
8
|
};
|
|
8
9
|
confirmationUrl?: string;
|
|
9
10
|
}
|
|
10
|
-
export declare class ManualProvider
|
|
11
|
+
export declare class ManualProvider extends AbstractPaymentProvider {
|
|
11
12
|
private config;
|
|
12
13
|
readonly name = "manual";
|
|
13
14
|
readonly supportedCurrencies: string[];
|
|
14
15
|
readonly supportedMethods: string[];
|
|
15
16
|
constructor(config?: ManualConfig);
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
protected doCheckout(params: CheckoutParams): Promise<CheckoutResult>;
|
|
18
|
+
protected doVerifyWebhook(body: string, _signature: string): Promise<WebhookEvent>;
|
|
18
19
|
}
|
|
19
20
|
export declare function createManualProvider(config?: ManualConfig): ManualProvider;
|
|
20
21
|
//# sourceMappingURL=manual.provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual.provider.d.ts","sourceRoot":"","sources":["../../src/providers/manual.provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"manual.provider.d.ts","sourceRoot":"","sources":["../../src/providers/manual.provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAEtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,qBAAa,cAAe,SAAQ,uBAAuB;IAK7C,OAAO,CAAC,MAAM;IAJ1B,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,mBAAmB,WAAQ;IACpC,QAAQ,CAAC,gBAAgB,WAA8B;gBAEnC,MAAM,GAAE,YAAiB;cAE7B,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;cAQ3D,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAYzF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,cAAc,CAE1E"}
|
|
@@ -1,23 +1,33 @@
|
|
|
1
1
|
// @mostajs/payment — Manual provider (cash, bank transfer, TPE)
|
|
2
2
|
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
3
|
-
|
|
3
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
4
|
+
export class ManualProvider extends AbstractPaymentProvider {
|
|
4
5
|
config;
|
|
5
6
|
name = 'manual';
|
|
6
7
|
supportedCurrencies = ['*'];
|
|
7
8
|
supportedMethods = ['cash', 'transfer', 'tpe'];
|
|
8
9
|
constructor(config = {}) {
|
|
10
|
+
super();
|
|
9
11
|
this.config = config;
|
|
10
12
|
}
|
|
11
|
-
async
|
|
13
|
+
async doCheckout(params) {
|
|
12
14
|
// No external redirect — return confirmation page URL
|
|
13
15
|
const url = this.config.confirmationUrl
|
|
14
16
|
? `${this.config.confirmationUrl}?orderId=${params.orderId}`
|
|
15
17
|
: params.successUrl;
|
|
16
18
|
return { url, sessionId: `manual_${params.orderId}` };
|
|
17
19
|
}
|
|
18
|
-
async
|
|
20
|
+
async doVerifyWebhook(body, _signature) {
|
|
21
|
+
// Confirmation manuelle (caissier / virement validé) : un POST
|
|
22
|
+
// { orderId, status:'paid' } (ou { paid:true }) déclenche un event de
|
|
23
|
+
// succès normalisé. Sans marqueur de paiement → event neutre 'payment.manual'.
|
|
19
24
|
const data = JSON.parse(body);
|
|
20
|
-
|
|
25
|
+
const paid = data?.status === 'paid' || data?.paid === true || data?.event === 'paid';
|
|
26
|
+
const orderId = data?.orderId ?? data?.metadata?.orderId;
|
|
27
|
+
return {
|
|
28
|
+
type: paid ? 'payment.success' : 'payment.manual',
|
|
29
|
+
data: { ...data, ...(orderId ? { orderId } : {}) },
|
|
30
|
+
};
|
|
21
31
|
}
|
|
22
32
|
}
|
|
23
33
|
export function createManualProvider(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual.provider.js","sourceRoot":"","sources":["../../src/providers/manual.provider.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,wCAAwC;
|
|
1
|
+
{"version":3,"file":"manual.provider.js","sourceRoot":"","sources":["../../src/providers/manual.provider.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,wCAAwC;AAGxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAOtE,MAAM,OAAO,cAAe,SAAQ,uBAAuB;IAKrC;IAJX,IAAI,GAAG,QAAQ,CAAA;IACf,mBAAmB,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3B,gBAAgB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;IAEvD,YAAoB,SAAuB,EAAE;QAAI,KAAK,EAAE,CAAA;QAApC,WAAM,GAAN,MAAM,CAAmB;IAAY,CAAC;IAEhD,KAAK,CAAC,UAAU,CAAC,MAAsB;QAC/C,sDAAsD;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe;YACrC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,YAAY,MAAM,CAAC,OAAO,EAAE;YAC5D,CAAC,CAAC,MAAM,CAAC,UAAU,CAAA;QACrB,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,MAAM,CAAC,OAAO,EAAE,EAAE,CAAA;IACvD,CAAC;IAES,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,UAAkB;QAC9D,+DAA+D;QAC/D,sEAAsE;QACtE,+EAA+E;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,IAAI,GAAG,IAAI,EAAE,MAAM,KAAK,MAAM,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI,IAAI,EAAE,KAAK,KAAK,MAAM,CAAA;QACrF,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAA;QACxD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB;YACjD,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SACnD,CAAA;IACH,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CheckoutParams, CheckoutResult, RefundParams, RefundResult, WebhookEvent } from '../core/provider.interface.js';
|
|
2
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
2
3
|
export interface PayPalConfig {
|
|
3
4
|
clientId: string;
|
|
4
5
|
secret: string;
|
|
@@ -7,7 +8,7 @@ export interface PayPalConfig {
|
|
|
7
8
|
cancelUrl: string;
|
|
8
9
|
webhookId?: string;
|
|
9
10
|
}
|
|
10
|
-
export declare class PayPalProvider
|
|
11
|
+
export declare class PayPalProvider extends AbstractPaymentProvider {
|
|
11
12
|
private config;
|
|
12
13
|
readonly name = "paypal";
|
|
13
14
|
readonly supportedCurrencies: string[];
|
|
@@ -17,7 +18,7 @@ export declare class PayPalProvider implements PaymentProvider {
|
|
|
17
18
|
constructor(config: PayPalConfig);
|
|
18
19
|
private getAccessToken;
|
|
19
20
|
private api;
|
|
20
|
-
|
|
21
|
+
protected doCheckout(params: CheckoutParams): Promise<CheckoutResult>;
|
|
21
22
|
/**
|
|
22
23
|
* Capture a PayPal order after user approval.
|
|
23
24
|
* Call this when PayPal redirects back to returnUrl with ?token=ORDER_ID
|
|
@@ -31,7 +32,7 @@ export declare class PayPalProvider implements PaymentProvider {
|
|
|
31
32
|
*/
|
|
32
33
|
getOrder(orderId: string): Promise<Record<string, unknown>>;
|
|
33
34
|
createRefund(params: RefundParams): Promise<RefundResult>;
|
|
34
|
-
|
|
35
|
+
protected doVerifyWebhook(body: string, signature: string): Promise<WebhookEvent>;
|
|
35
36
|
/**
|
|
36
37
|
* Verify webhook signature via PayPal API (production).
|
|
37
38
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paypal.provider.d.ts","sourceRoot":"","sources":["../../src/providers/paypal.provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"paypal.provider.d.ts","sourceRoot":"","sources":["../../src/providers/paypal.provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC7H,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAGtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,cAAe,SAAQ,uBAAuB;IAQ7C,OAAO,CAAC,MAAM;IAP1B,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,mBAAmB,WAAoD;IAChF,QAAQ,CAAC,gBAAgB,WAAa;IAEtC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,UAAU,CAAoD;gBAElD,MAAM,EAAE,YAAY;YAO1B,cAAc;YAwBd,GAAG;cAiBD,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IA0B3E;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAK/F;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAI3D,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;cAgB/C,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAwBvF;;OAEG;IACG,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAa9F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,cAAc,CASnF"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// @mostajs/payment — PayPal REST API v2 provider
|
|
2
2
|
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
3
3
|
// Ref: https://developer.paypal.com/docs/api/orders/v2/
|
|
4
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
4
5
|
import { getEnv } from '@mostajs/config';
|
|
5
|
-
export class PayPalProvider {
|
|
6
|
+
export class PayPalProvider extends AbstractPaymentProvider {
|
|
6
7
|
config;
|
|
7
8
|
name = 'paypal';
|
|
8
9
|
supportedCurrencies = ['USD', 'EUR', 'GBP', 'CAD', 'AUD', 'JPY', 'CHF'];
|
|
@@ -10,6 +11,7 @@ export class PayPalProvider {
|
|
|
10
11
|
baseUrl;
|
|
11
12
|
tokenCache = null;
|
|
12
13
|
constructor(config) {
|
|
14
|
+
super();
|
|
13
15
|
this.config = config;
|
|
14
16
|
this.baseUrl = config.testMode
|
|
15
17
|
? 'https://api-m.sandbox.paypal.com'
|
|
@@ -53,7 +55,7 @@ export class PayPalProvider {
|
|
|
53
55
|
}
|
|
54
56
|
return res.status === 204 ? null : res.json();
|
|
55
57
|
}
|
|
56
|
-
async
|
|
58
|
+
async doCheckout(params) {
|
|
57
59
|
const currency = (params.currency ?? 'USD').toUpperCase();
|
|
58
60
|
const data = await this.api('POST', '/v2/checkout/orders', {
|
|
59
61
|
intent: 'CAPTURE',
|
|
@@ -106,7 +108,7 @@ export class PayPalProvider {
|
|
|
106
108
|
status: data.status,
|
|
107
109
|
};
|
|
108
110
|
}
|
|
109
|
-
async
|
|
111
|
+
async doVerifyWebhook(body, signature) {
|
|
110
112
|
// PayPal webhook verification requires calling their API
|
|
111
113
|
// For simplicity, parse the event and validate via API
|
|
112
114
|
const event = JSON.parse(body);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paypal.provider.js","sourceRoot":"","sources":["../../src/providers/paypal.provider.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,wCAAwC;AACxC,wDAAwD;AAGxD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"paypal.provider.js","sourceRoot":"","sources":["../../src/providers/paypal.provider.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,wCAAwC;AACxC,wDAAwD;AAGxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAWxC,MAAM,OAAO,cAAe,SAAQ,uBAAuB;IAQrC;IAPX,IAAI,GAAG,QAAQ,CAAA;IACf,mBAAmB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IACvE,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAA;IAE9B,OAAO,CAAQ;IACf,UAAU,GAAgD,IAAI,CAAA;IAEtE,YAAoB,MAAoB;QACtC,KAAK,EAAE,CAAA;QADW,WAAM,GAAN,MAAM,CAAc;QAEtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ;YAC5B,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,0BAA0B,CAAA;IAChC,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAA;QAC9B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC5F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,SAAS,IAAI,EAAE;gBAChC,cAAc,EAAE,mCAAmC;aACpD;YACD,IAAI,EAAE,+BAA+B;SACtC,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;QACxE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,IAAI,CAAC,UAAU,GAAG;YAChB,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,8BAA8B;SACtF,CAAA;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,IAAY,EAAE,IAAc;QAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;QACzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM;YACN,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,KAAK,EAAE;gBAClC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9C,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC9C,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,IAAI,IAAI,YAAY,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;QACrG,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAC/C,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,MAAsB;QAC/C,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;QACzD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE;YACzD,MAAM,EAAE,SAAS;YACjB,cAAc,EAAE,CAAC;oBACf,YAAY,EAAE,MAAM,CAAC,OAAO;oBAC5B,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,MAAM,EAAE;wBACN,aAAa,EAAE,QAAQ;wBACvB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;qBAChC;iBACF,CAAC;YACF,mBAAmB,EAAE;gBACnB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;gBACtD,UAAU,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;gBACrD,UAAU,EAAE,eAAe;gBAC3B,YAAY,EAAE,OAAO;gBACrB,WAAW,EAAE,SAAS;aACvB;YACD,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAA;QACrE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,IAAI,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAA;IAC/D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,uBAAuB,OAAO,UAAU,EAAE,EAAE,CAAC,CAAA;QACjF,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,uBAAuB,OAAO,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAoB;QACrC,8CAA8C;QAC9C,MAAM,IAAI,GAAQ,EAAE,CAAA;QACpB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;QACzE,CAAC;QACD,IAAI,MAAM,CAAC,MAAM;YAAE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAA;QAErD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,MAAM,CAAC,SAAS,SAAS,EAAE,IAAI,CAAC,CAAA;QAC7F,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,GAAG,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAA;IACH,CAAC;IAES,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,SAAiB;QAC7D,yDAAyD;QACzD,uDAAuD;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAE9B,4EAA4E;QAC5E,kCAAkC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,KAAK,yBAAyB,CAAC,CAAC,CAAC,kBAAkB;YAC9E,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,2BAA2B,CAAC,CAAC,CAAC,iBAAiB;gBACtE,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,wBAAwB,CAAC,CAAC,CAAC,gBAAgB;oBAClE,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,SAAS,CAAA;QAEjC,OAAO;YACL,IAAI;YACJ,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE;gBAC3B,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM;gBAC9B,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK;gBACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa;aAChD;YACD,GAAG,EAAE,KAAK;SACX,CAAA;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAAC,OAA+B,EAAE,IAAY;QACxE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,KAAK,CAAA;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,4CAA4C,EAAE;YAChF,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC;YACpC,eAAe,EAAE,OAAO,CAAC,wBAAwB,CAAC;YAClD,gBAAgB,EAAE,OAAO,CAAC,yBAAyB,CAAC;YACpD,iBAAiB,EAAE,OAAO,CAAC,0BAA0B,CAAC;YACtD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YACjC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SAChC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,mBAAmB,KAAK,SAAS,CAAA;IAC/C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA8B;IACjE,OAAO,IAAI,cAAc,CAAC;QACxB,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC5D,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC;QACrD,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,kBAAkB,CAAC,KAAK,OAAO;QACpE,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;QAC/E,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;QAChF,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,MAAM,CAAC,mBAAmB,CAAC;KAC5D,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CheckoutParams, CheckoutResult, WebhookEvent } from '../core/provider.interface.js';
|
|
2
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
2
3
|
export interface SatimConfig {
|
|
3
4
|
merchantId: string;
|
|
4
5
|
password: string;
|
|
@@ -8,14 +9,14 @@ export interface SatimConfig {
|
|
|
8
9
|
/** ISO 4217 currency code, default '012' (DZD) */
|
|
9
10
|
currencyCode?: string;
|
|
10
11
|
}
|
|
11
|
-
export declare class SatimProvider
|
|
12
|
+
export declare class SatimProvider extends AbstractPaymentProvider {
|
|
12
13
|
private config;
|
|
13
14
|
readonly name = "satim";
|
|
14
15
|
readonly supportedCurrencies: string[];
|
|
15
16
|
readonly supportedMethods: string[];
|
|
16
17
|
private baseUrl;
|
|
17
18
|
constructor(config: SatimConfig);
|
|
18
|
-
|
|
19
|
+
protected doCheckout(params: CheckoutParams): Promise<CheckoutResult>;
|
|
19
20
|
/**
|
|
20
21
|
* Confirm an order after redirect callback.
|
|
21
22
|
* Call this when Satim redirects back to returnUrl.
|
|
@@ -29,7 +30,19 @@ export declare class SatimProvider implements PaymentProvider {
|
|
|
29
30
|
* Get order status.
|
|
30
31
|
*/
|
|
31
32
|
getOrderStatus(orderId: string): Promise<Record<string, unknown>>;
|
|
32
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Statut SATIM/BPC enrichi par identifiant de commande SATIM (mdOrder).
|
|
35
|
+
* Champs clés : OrderStatus, OrderNumber (= notre orderId), Amount (centimes),
|
|
36
|
+
* actionCode, approvalCode, ErrorCode.
|
|
37
|
+
*/
|
|
38
|
+
getOrderStatusExtended(satimOrderId: string): Promise<Record<string, unknown>>;
|
|
39
|
+
/**
|
|
40
|
+
* Mappe un code OrderStatus BPC vers un type d'event normalisé.
|
|
41
|
+
* Codes BPC : 0 enregistré · 1 pré-autorisé · 2 **autorisé/payé** ·
|
|
42
|
+
* 3 annulé · 4 remboursé · 5 ACS/3-DS en cours · 6 refusé.
|
|
43
|
+
*/
|
|
44
|
+
static mapOrderStatus(code: number | string | undefined): string;
|
|
45
|
+
protected doVerifyWebhook(body: string, _signature: string): Promise<WebhookEvent>;
|
|
33
46
|
}
|
|
34
47
|
/**
|
|
35
48
|
* Create a Satim provider from environment variables.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"satim.provider.d.ts","sourceRoot":"","sources":["../../src/providers/satim.provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"satim.provider.d.ts","sourceRoot":"","sources":["../../src/providers/satim.provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAGtE,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,qBAAa,aAAc,SAAQ,uBAAuB;IAO5C,OAAO,CAAC,MAAM;IAN1B,QAAQ,CAAC,IAAI,WAAU;IACvB,QAAQ,CAAC,mBAAmB,WAAU;IACtC,QAAQ,CAAC,gBAAgB,WAAU;IAEnC,OAAO,CAAC,OAAO,CAAQ;gBAEH,MAAM,EAAE,WAAW;cAOvB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAiC3E;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAsB1G;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAiBvE;;;;OAIG;IACG,sBAAsB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAepF;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM;cAUhD,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAqCzF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,aAAa,CAQhF"}
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
// @mostajs/payment — Satim/GIE Monetique provider (CIB — Algerie)
|
|
2
2
|
// Author: Dr Hamid MADANI drmdh@msn.com
|
|
3
3
|
// Ref: https://test.satim.dz/payment/rest/ (sandbox)
|
|
4
|
+
import { AbstractPaymentProvider } from '../core/abstract-provider.js';
|
|
4
5
|
import { getEnv, getEnvBool } from '@mostajs/config';
|
|
5
|
-
export class SatimProvider {
|
|
6
|
+
export class SatimProvider extends AbstractPaymentProvider {
|
|
6
7
|
config;
|
|
7
8
|
name = 'satim';
|
|
8
9
|
supportedCurrencies = ['DZD'];
|
|
9
10
|
supportedMethods = ['cib'];
|
|
10
11
|
baseUrl;
|
|
11
12
|
constructor(config) {
|
|
13
|
+
super();
|
|
12
14
|
this.config = config;
|
|
13
15
|
this.baseUrl = config.testMode
|
|
14
16
|
? 'https://test.satim.dz/payment/rest'
|
|
15
17
|
: 'https://cib.satim.dz/payment/rest';
|
|
16
18
|
}
|
|
17
|
-
async
|
|
19
|
+
async doCheckout(params) {
|
|
18
20
|
const body = new URLSearchParams({
|
|
19
21
|
orderNumber: params.orderId,
|
|
20
22
|
amount: String(Math.round(params.amount * 100)), // centimes DZD
|
|
@@ -27,6 +29,10 @@ export class SatimProvider {
|
|
|
27
29
|
});
|
|
28
30
|
if (params.description)
|
|
29
31
|
body.set('description', params.description);
|
|
32
|
+
// jsonParams : champs libres (dont orderId) restitués dans getOrderStatusExtended
|
|
33
|
+
if (params.metadata && Object.keys(params.metadata).length) {
|
|
34
|
+
body.set('jsonParams', JSON.stringify(params.metadata));
|
|
35
|
+
}
|
|
30
36
|
const res = await fetch(`${this.baseUrl}/register.do`, {
|
|
31
37
|
method: 'POST',
|
|
32
38
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
@@ -78,19 +84,81 @@ export class SatimProvider {
|
|
|
78
84
|
});
|
|
79
85
|
return res.json();
|
|
80
86
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Statut SATIM/BPC enrichi par identifiant de commande SATIM (mdOrder).
|
|
89
|
+
* Champs clés : OrderStatus, OrderNumber (= notre orderId), Amount (centimes),
|
|
90
|
+
* actionCode, approvalCode, ErrorCode.
|
|
91
|
+
*/
|
|
92
|
+
async getOrderStatusExtended(satimOrderId) {
|
|
93
|
+
const body = new URLSearchParams({
|
|
94
|
+
orderId: satimOrderId,
|
|
95
|
+
userName: this.config.merchantId,
|
|
96
|
+
password: this.config.password,
|
|
97
|
+
language: 'FR',
|
|
98
|
+
});
|
|
99
|
+
const res = await fetch(`${this.baseUrl}/getOrderStatusExtended.do`, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
102
|
+
body,
|
|
103
|
+
});
|
|
104
|
+
return res.json();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Mappe un code OrderStatus BPC vers un type d'event normalisé.
|
|
108
|
+
* Codes BPC : 0 enregistré · 1 pré-autorisé · 2 **autorisé/payé** ·
|
|
109
|
+
* 3 annulé · 4 remboursé · 5 ACS/3-DS en cours · 6 refusé.
|
|
110
|
+
*/
|
|
111
|
+
static mapOrderStatus(code) {
|
|
112
|
+
switch (String(code)) {
|
|
113
|
+
case '2': return 'payment.success';
|
|
114
|
+
case '4': return 'payment.refunded';
|
|
115
|
+
case '3':
|
|
116
|
+
case '6': return 'payment.failed';
|
|
117
|
+
default: return 'payment.pending'; // 0,1,5 ou inconnu
|
|
92
118
|
}
|
|
93
|
-
|
|
119
|
+
}
|
|
120
|
+
async doVerifyWebhook(body, _signature) {
|
|
121
|
+
// SATIM = callback PAR REDIRECTION (pas de webhook signé) : le handler de
|
|
122
|
+
// retour reçoit l'orderId SATIM (mdOrder) ; on confirme le statut côté serveur
|
|
123
|
+
// via getOrderStatusExtended. Accepte : querystring de retour, JSON {orderId},
|
|
124
|
+
// ou JSON déjà résolu (OrderStatus présent → pas d'appel réseau, testable).
|
|
125
|
+
const trimmed = body.trim();
|
|
126
|
+
let raw = {};
|
|
127
|
+
if (trimmed.startsWith('{')) {
|
|
128
|
+
try {
|
|
129
|
+
raw = JSON.parse(trimmed);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
raw = {};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
raw = Object.fromEntries(new URLSearchParams(body));
|
|
137
|
+
}
|
|
138
|
+
const satimOrderId = raw.orderId ?? raw.mdOrder;
|
|
139
|
+
let status = raw;
|
|
140
|
+
if (raw.OrderStatus === undefined && raw.orderStatus === undefined && satimOrderId) {
|
|
141
|
+
status = await this.getOrderStatusExtended(String(satimOrderId));
|
|
142
|
+
}
|
|
143
|
+
const code = status.OrderStatus ?? status.orderStatus;
|
|
144
|
+
const orderNumber = status.OrderNumber ?? status.orderNumber ?? raw.orderNumber;
|
|
145
|
+
const amount = status.Amount !== undefined ? Number(status.Amount) / 100 : undefined;
|
|
146
|
+
const type = code !== undefined
|
|
147
|
+
? SatimProvider.mapOrderStatus(code)
|
|
148
|
+
: (String(raw.actionCode) === '0' ? 'payment.success' : 'payment.pending');
|
|
149
|
+
return {
|
|
150
|
+
type,
|
|
151
|
+
data: {
|
|
152
|
+
orderId: orderNumber ?? satimOrderId, // OrderNumber = notre orderId (matching)
|
|
153
|
+
satimOrderId,
|
|
154
|
+
orderStatus: code,
|
|
155
|
+
amount,
|
|
156
|
+
currency: 'DZD',
|
|
157
|
+
approvalCode: status.approvalCode ?? status.ApprovalCode,
|
|
158
|
+
errorCode: status.ErrorCode ?? status.errorCode,
|
|
159
|
+
},
|
|
160
|
+
raw: status,
|
|
161
|
+
};
|
|
94
162
|
}
|
|
95
163
|
}
|
|
96
164
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"satim.provider.js","sourceRoot":"","sources":["../../src/providers/satim.provider.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wCAAwC;AACxC,qDAAqD;AAGrD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAYpD,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"satim.provider.js","sourceRoot":"","sources":["../../src/providers/satim.provider.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wCAAwC;AACxC,qDAAqD;AAGrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAYpD,MAAM,OAAO,aAAc,SAAQ,uBAAuB;IAOpC;IANX,IAAI,GAAG,OAAO,CAAA;IACd,mBAAmB,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7B,gBAAgB,GAAG,CAAC,KAAK,CAAC,CAAA;IAE3B,OAAO,CAAQ;IAEvB,YAAoB,MAAmB;QACrC,KAAK,EAAE,CAAA;QADW,WAAM,GAAN,MAAM,CAAa;QAErC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ;YAC5B,CAAC,CAAC,oCAAoC;YACtC,CAAC,CAAC,mCAAmC,CAAA;IACzC,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,MAAsB;QAC/C,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,WAAW,EAAE,MAAM,CAAC,OAAO;YAC3B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,eAAe;YAChE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,KAAK,EAAE,eAAe;YAC5D,SAAS,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;YACrD,OAAO,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAChD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAChC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,IAAI,MAAM,CAAC,WAAW;YAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;QACnE,kFAAkF;QAClF,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACzD,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,cAAc,EAAE;YACrD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAE7B,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,IAAI,qBAAqB,WAAW,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QACpG,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,CAAA;IACvD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAChC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,kBAAkB,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG;YACtD,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YACnC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY;SACrD,CAAA;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAChC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,oBAAoB,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAA;QAEF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,sBAAsB,CAAC,YAAoB;QAC/C,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAChC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,4BAA4B,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI;SACL,CAAC,CAAA;QACF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,IAAiC;QACrD,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,KAAK,GAAG,CAAC,CAAC,OAAO,iBAAiB,CAAA;YAClC,KAAK,GAAG,CAAC,CAAC,OAAO,kBAAkB,CAAA;YACnC,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC,CAAC,OAAO,gBAAgB,CAAA;YACjC,OAAO,CAAC,CAAE,OAAO,iBAAiB,CAAA,CAAC,mBAAmB;QACxD,CAAC;IACH,CAAC;IAES,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,UAAkB;QAC9D,0EAA0E;QAC1E,+EAA+E;QAC/E,+EAA+E;QAC/E,4EAA4E;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3B,IAAI,GAAG,GAAwB,EAAE,CAAA;QACjC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC;gBAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,GAAG,GAAG,EAAE,CAAA;YAAC,CAAC;QAAC,CAAC;aAChF,CAAC;YAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;QAAC,CAAC;QAE5D,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAA;QAC/C,IAAI,MAAM,GAAwB,GAAG,CAAA;QACrC,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC;YACnF,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;QAClE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAA;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW,CAAA;QAC/E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;QACpF,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS;YAC7B,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC;YACpC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAA;QAE5E,OAAO;YACL,IAAI;YACJ,IAAI,EAAE;gBACJ,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,yCAAyC;gBAC/E,YAAY;gBACZ,WAAW,EAAE,IAAI;gBACjB,MAAM;gBACN,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY;gBACxD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS;aAChD;YACD,GAAG,EAAE,MAAM;SACZ,CAAA;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA6B;IAC/D,OAAO,IAAI,aAAa,CAAC;QACvB,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACjE,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC1D,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,UAAU,CAAC,iBAAiB,CAAC;QAC3D,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;QAC/E,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;KACxE,CAAC,CAAA;AACJ,CAAC"}
|