tupay 0.15.0 → 0.16.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/dist/cjs/client.d.ts +16 -0
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +4 -0
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/index.d.ts +40 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +53 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/resources/accounts.d.ts +93 -0
- package/dist/cjs/resources/accounts.d.ts.map +1 -0
- package/dist/cjs/resources/accounts.js +106 -0
- package/dist/cjs/resources/accounts.js.map +1 -0
- package/dist/cjs/resources/balance-transactions.d.ts +44 -0
- package/dist/cjs/resources/balance-transactions.d.ts.map +1 -0
- package/dist/cjs/resources/balance-transactions.js +40 -0
- package/dist/cjs/resources/balance-transactions.js.map +1 -0
- package/dist/cjs/resources/balance.d.ts +21 -0
- package/dist/cjs/resources/balance.d.ts.map +1 -0
- package/dist/cjs/resources/balance.js +31 -0
- package/dist/cjs/resources/balance.js.map +1 -0
- package/dist/cjs/resources/disputes.d.ts +71 -0
- package/dist/cjs/resources/disputes.d.ts.map +1 -0
- package/dist/cjs/resources/disputes.js +89 -0
- package/dist/cjs/resources/disputes.js.map +1 -0
- package/dist/cjs/resources/payment-intents.d.ts +30 -0
- package/dist/cjs/resources/payment-intents.d.ts.map +1 -1
- package/dist/cjs/resources/payment-intents.js.map +1 -1
- package/dist/cjs/resources/payouts.d.ts +53 -0
- package/dist/cjs/resources/payouts.d.ts.map +1 -0
- package/dist/cjs/resources/payouts.js +72 -0
- package/dist/cjs/resources/payouts.js.map +1 -0
- package/dist/cjs/types.d.ts +259 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/client.d.ts +16 -0
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +4 -0
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/index.d.ts +40 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +47 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resources/accounts.d.ts +93 -0
- package/dist/esm/resources/accounts.d.ts.map +1 -0
- package/dist/esm/resources/accounts.js +102 -0
- package/dist/esm/resources/accounts.js.map +1 -0
- package/dist/esm/resources/balance-transactions.d.ts +44 -0
- package/dist/esm/resources/balance-transactions.d.ts.map +1 -0
- package/dist/esm/resources/balance-transactions.js +36 -0
- package/dist/esm/resources/balance-transactions.js.map +1 -0
- package/dist/esm/resources/balance.d.ts +21 -0
- package/dist/esm/resources/balance.d.ts.map +1 -0
- package/dist/esm/resources/balance.js +27 -0
- package/dist/esm/resources/balance.js.map +1 -0
- package/dist/esm/resources/disputes.d.ts +71 -0
- package/dist/esm/resources/disputes.d.ts.map +1 -0
- package/dist/esm/resources/disputes.js +85 -0
- package/dist/esm/resources/disputes.js.map +1 -0
- package/dist/esm/resources/payment-intents.d.ts +30 -0
- package/dist/esm/resources/payment-intents.d.ts.map +1 -1
- package/dist/esm/resources/payment-intents.js.map +1 -1
- package/dist/esm/resources/payouts.d.ts +53 -0
- package/dist/esm/resources/payouts.d.ts.map +1 -0
- package/dist/esm/resources/payouts.js +68 -0
- package/dist/esm/resources/payouts.js.map +1 -0
- package/dist/esm/types.d.ts +259 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { TupayClient } from '../client.js';
|
|
2
|
+
import type { Balance } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Votre solde : ce que vous avez, et ce qui arrive.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const solde = await tupay.balance.retrieve()
|
|
8
|
+
* solde.available.amountXpf // encaissable, commission déduite
|
|
9
|
+
* solde.pending.amountXpf // pas encore
|
|
10
|
+
* solde.nextAvailableAt // quand la plus proche bascule
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* Le solde n'a ni identifiant ni date de création : c'est un état
|
|
14
|
+
* instantané, pas un objet stocké. Ce sont les écritures qui en ont.
|
|
15
|
+
*/
|
|
16
|
+
export declare class BalanceResource {
|
|
17
|
+
private readonly client;
|
|
18
|
+
constructor(client: TupayClient);
|
|
19
|
+
retrieve(): Promise<Balance>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=balance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../../src/resources/balance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;CAOnC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Votre solde : ce que vous avez, et ce qui arrive.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* const solde = await tupay.balance.retrieve()
|
|
6
|
+
* solde.available.amountXpf // encaissable, commission déduite
|
|
7
|
+
* solde.pending.amountXpf // pas encore
|
|
8
|
+
* solde.nextAvailableAt // quand la plus proche bascule
|
|
9
|
+
* ```
|
|
10
|
+
*
|
|
11
|
+
* Le solde n'a ni identifiant ni date de création : c'est un état
|
|
12
|
+
* instantané, pas un objet stocké. Ce sont les écritures qui en ont.
|
|
13
|
+
*/
|
|
14
|
+
export class BalanceResource {
|
|
15
|
+
client;
|
|
16
|
+
constructor(client) {
|
|
17
|
+
this.client = client;
|
|
18
|
+
}
|
|
19
|
+
async retrieve() {
|
|
20
|
+
const { data } = await this.client.request({
|
|
21
|
+
method: 'GET',
|
|
22
|
+
path: '/balance',
|
|
23
|
+
});
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=balance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.js","sourceRoot":"","sources":["../../../src/resources/balance.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,QAAQ;QACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAoB;YAC5D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;SACjB,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type ListParams } from '../liste.js';
|
|
2
|
+
import { TupayClient } from '../client.js';
|
|
3
|
+
import type { Dispute, DisputeEvidence, DisputeStatus, ListResult } from '../types.js';
|
|
4
|
+
export interface ListDisputesParams extends ListParams {
|
|
5
|
+
status?: DisputeStatus;
|
|
6
|
+
}
|
|
7
|
+
export interface SubmitDisputeEvidenceParams {
|
|
8
|
+
/**
|
|
9
|
+
* Ce que vous affirmez, en texte libre (5 000 signes au plus).
|
|
10
|
+
* Décrivez la commande, la livraison, et vos échanges avec le client.
|
|
11
|
+
*/
|
|
12
|
+
explanation: string;
|
|
13
|
+
/** Omise, le SDK génère un UUID v4 — la requête devient rejouable. */
|
|
14
|
+
idempotencyKey?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Les contestations ouvertes par vos clients auprès de leur banque.
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* const { data } = await tupay.disputes.list({ status: 'needs_response' })
|
|
21
|
+
* data[0].evidenceDueBy // la date limite
|
|
22
|
+
* data[0].responseStillPossible // est-il encore temps ?
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* ⚠️ **Un litige non traité est perdu par défaut.** Pas rejeté, pas mis
|
|
26
|
+
* en attente : perdu, avec l'argent qui part. Branchez
|
|
27
|
+
* `dispute.created` et `dispute.reminder`.
|
|
28
|
+
*
|
|
29
|
+
* Aucune méthode pour en créer : un litige vient du réseau. En mode
|
|
30
|
+
* test, `POST /test/simulate` avec `disputeReason` en ouvre un.
|
|
31
|
+
*
|
|
32
|
+
* Ce que vous POUVEZ écrire, en revanche, c'est votre réponse :
|
|
33
|
+
* `submitEvidence()`. C'est la seule chose d'un litige qui vous
|
|
34
|
+
* appartienne.
|
|
35
|
+
*/
|
|
36
|
+
export declare class Disputes {
|
|
37
|
+
private readonly client;
|
|
38
|
+
constructor(client: TupayClient);
|
|
39
|
+
retrieve(id: string): Promise<Dispute>;
|
|
40
|
+
list(params?: ListDisputesParams): Promise<ListResult<Dispute>>;
|
|
41
|
+
/**
|
|
42
|
+
* Répond à un litige, et le fait passer en examen.
|
|
43
|
+
*
|
|
44
|
+
* ```ts
|
|
45
|
+
* const preuve = await tupay.disputes.submitEvidence(dp.id, {
|
|
46
|
+
* explanation: 'Commande livrée le 12/09, signée par le client.',
|
|
47
|
+
* })
|
|
48
|
+
* preuve.dispute.status // 'under_review'
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* ⚠️ **Avant `evidenceDueBy`, jamais après.** Passée la date limite,
|
|
52
|
+
* l'appel rend `409` et cite la date : le litige est perdu par défaut,
|
|
53
|
+
* et le réseau n'accepte plus rien.
|
|
54
|
+
*
|
|
55
|
+
* Vous pouvez soumettre plusieurs fois tant que l'échéance n'est pas
|
|
56
|
+
* passée : chaque appel AJOUTE au journal, il n'écrase pas le
|
|
57
|
+
* précédent.
|
|
58
|
+
*/
|
|
59
|
+
submitEvidence(id: string, params: SubmitDisputeEvidenceParams): Promise<DisputeEvidence & {
|
|
60
|
+
dispute: Dispute;
|
|
61
|
+
}>;
|
|
62
|
+
/**
|
|
63
|
+
* Ce que vous avez transmis sur ce litige, le plus récent d'abord.
|
|
64
|
+
*
|
|
65
|
+
* Rien ne s'y écrase : vous relisez exactement ce qui est parti, et
|
|
66
|
+
* quand. Un litige sans réponse rend une liste vide ; un litige qui
|
|
67
|
+
* n'existe pas lève une erreur `404`.
|
|
68
|
+
*/
|
|
69
|
+
listEvidence(id: string, params?: ListParams): Promise<ListResult<DisputeEvidence>>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=disputes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disputes.d.ts","sourceRoot":"","sources":["../../../src/resources/disputes.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,aAAa,EACb,UAAU,EACX,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtC,IAAI,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAUzE;;;;;;;;;;;;;;;;;OAiBG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,2BAA2B,GAClC,OAAO,CAAC,eAAe,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAalD;;;;;;OAMG;IACG,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,UAAe,GACtB,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;CASxC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { normaliserListe, parametresListe, } from '../liste.js';
|
|
2
|
+
import { TupayClient } from '../client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Les contestations ouvertes par vos clients auprès de leur banque.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const { data } = await tupay.disputes.list({ status: 'needs_response' })
|
|
8
|
+
* data[0].evidenceDueBy // la date limite
|
|
9
|
+
* data[0].responseStillPossible // est-il encore temps ?
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* ⚠️ **Un litige non traité est perdu par défaut.** Pas rejeté, pas mis
|
|
13
|
+
* en attente : perdu, avec l'argent qui part. Branchez
|
|
14
|
+
* `dispute.created` et `dispute.reminder`.
|
|
15
|
+
*
|
|
16
|
+
* Aucune méthode pour en créer : un litige vient du réseau. En mode
|
|
17
|
+
* test, `POST /test/simulate` avec `disputeReason` en ouvre un.
|
|
18
|
+
*
|
|
19
|
+
* Ce que vous POUVEZ écrire, en revanche, c'est votre réponse :
|
|
20
|
+
* `submitEvidence()`. C'est la seule chose d'un litige qui vous
|
|
21
|
+
* appartienne.
|
|
22
|
+
*/
|
|
23
|
+
export class Disputes {
|
|
24
|
+
client;
|
|
25
|
+
constructor(client) {
|
|
26
|
+
this.client = client;
|
|
27
|
+
}
|
|
28
|
+
async retrieve(id) {
|
|
29
|
+
const { data } = await this.client.request({
|
|
30
|
+
method: 'GET',
|
|
31
|
+
path: `/disputes/${encodeURIComponent(id)}`,
|
|
32
|
+
});
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
async list(params = {}) {
|
|
36
|
+
return normaliserListe(await this.client.request({
|
|
37
|
+
method: 'GET',
|
|
38
|
+
path: '/disputes',
|
|
39
|
+
query: { ...parametresListe(params), status: params.status },
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Répond à un litige, et le fait passer en examen.
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* const preuve = await tupay.disputes.submitEvidence(dp.id, {
|
|
47
|
+
* explanation: 'Commande livrée le 12/09, signée par le client.',
|
|
48
|
+
* })
|
|
49
|
+
* preuve.dispute.status // 'under_review'
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* ⚠️ **Avant `evidenceDueBy`, jamais après.** Passée la date limite,
|
|
53
|
+
* l'appel rend `409` et cite la date : le litige est perdu par défaut,
|
|
54
|
+
* et le réseau n'accepte plus rien.
|
|
55
|
+
*
|
|
56
|
+
* Vous pouvez soumettre plusieurs fois tant que l'échéance n'est pas
|
|
57
|
+
* passée : chaque appel AJOUTE au journal, il n'écrase pas le
|
|
58
|
+
* précédent.
|
|
59
|
+
*/
|
|
60
|
+
async submitEvidence(id, params) {
|
|
61
|
+
const { idempotencyKey, ...body } = params;
|
|
62
|
+
const { data } = await this.client.request({
|
|
63
|
+
method: 'POST',
|
|
64
|
+
path: `/disputes/${encodeURIComponent(id)}/evidence`,
|
|
65
|
+
body,
|
|
66
|
+
idempotencyKey: idempotencyKey ?? TupayClient.idempotencyKey(),
|
|
67
|
+
});
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Ce que vous avez transmis sur ce litige, le plus récent d'abord.
|
|
72
|
+
*
|
|
73
|
+
* Rien ne s'y écrase : vous relisez exactement ce qui est parti, et
|
|
74
|
+
* quand. Un litige sans réponse rend une liste vide ; un litige qui
|
|
75
|
+
* n'existe pas lève une erreur `404`.
|
|
76
|
+
*/
|
|
77
|
+
async listEvidence(id, params = {}) {
|
|
78
|
+
return normaliserListe(await this.client.request({
|
|
79
|
+
method: 'GET',
|
|
80
|
+
path: `/disputes/${encodeURIComponent(id)}/evidence`,
|
|
81
|
+
query: parametresListe(params),
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=disputes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"disputes.js","sourceRoot":"","sources":["../../../src/resources/disputes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,GAGhB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAsB1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,QAAQ;IACU;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAoB;YAC5D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,kBAAkB,CAAC,EAAE,CAAC,EAAE;SAC5C,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAA6B,EAAE;QACxC,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAsB;YAC7C,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,WAAW;YACjB,KAAK,EAAE,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;SAC7D,CAAC,CACH,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,cAAc,CAClB,EAAU,EACV,MAAmC;QAEnC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAEvC;YACD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa,kBAAkB,CAAC,EAAE,CAAC,WAAW;YACpD,IAAI;YACJ,cAAc,EAAE,cAAc,IAAI,WAAW,CAAC,cAAc,EAAE;SAC/D,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAChB,EAAU,EACV,SAAqB,EAAE;QAEvB,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA8B;YACrD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,kBAAkB,CAAC,EAAE,CAAC,WAAW;YACpD,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC;SAC/B,CAAC,CACH,CAAA;IACH,CAAC;CACF"}
|
|
@@ -40,6 +40,36 @@ export interface CreatePaymentIntentParams {
|
|
|
40
40
|
*/
|
|
41
41
|
offSession?: boolean;
|
|
42
42
|
metadata?: Record<string, string>;
|
|
43
|
+
/**
|
|
44
|
+
* **Encaisser pour un compte connecté** — `<uuid>` ou `acct_<uuid>`.
|
|
45
|
+
*
|
|
46
|
+
* Le paiement appartient alors au VENDEUR : son solde, ses écritures,
|
|
47
|
+
* ses virements, ses litiges. Vous n'êtes que celle qui a passé
|
|
48
|
+
* l'appel.
|
|
49
|
+
*
|
|
50
|
+
* ⚠️ En mode **live**, un compte dont la vérification d'activité n'est
|
|
51
|
+
* pas validée lève une erreur `account_not_ready`, dont `requirement`
|
|
52
|
+
* nomme ce qui manque. En mode test rien n'est bridé — branchez tout
|
|
53
|
+
* votre parcours avant d'avoir fait valider votre premier vendeur.
|
|
54
|
+
*/
|
|
55
|
+
onBehalfOf?: string;
|
|
56
|
+
/**
|
|
57
|
+
* **La commission que vous prélevez** sur ce paiement, en francs
|
|
58
|
+
* entiers. Exige `onBehalfOf`.
|
|
59
|
+
*
|
|
60
|
+
* Le net va au vendeur, la commission à vous, et deux écritures
|
|
61
|
+
* distinctes sont créées — une dans chaque journal de solde.
|
|
62
|
+
*
|
|
63
|
+
* ⚠️ Refusée si elle dépasse le montant, et refusée aussi si,
|
|
64
|
+
* **commission Tupay déduite**, elle laisserait votre vendeur en
|
|
65
|
+
* négatif. La seconde règle est plus stricte : notre commission se
|
|
66
|
+
* prélève aussi, et vous ne connaissez pas le barème de votre vendeur.
|
|
67
|
+
*
|
|
68
|
+
* ⚠️ **Elle n'est pas rendue sur un remboursement.** Même règle que
|
|
69
|
+
* la commission Tupay : elle paie un apport d'affaires, et l'affaire
|
|
70
|
+
* a eu lieu.
|
|
71
|
+
*/
|
|
72
|
+
applicationFeeXpf?: number;
|
|
43
73
|
/**
|
|
44
74
|
* Clé d'idempotence. Omise, le SDK en génère une (UUID v4) : la requête
|
|
45
75
|
* devient rejouable sans risque de double débit. Fournissez la vôtre si
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-intents.d.ts","sourceRoot":"","sources":["../../../src/resources/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,MAAM,WAAW,yBAAyB;IACxC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC;CAUxE"}
|
|
1
|
+
{"version":3,"file":"payment-intents.d.ts","sourceRoot":"","sources":["../../../src/resources/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,MAAM,WAAW,yBAAyB;IACxC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;;;;;;;;;OAeG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC;CAUxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-intents.js","sourceRoot":"","sources":["../../../src/resources/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"payment-intents.js","sourceRoot":"","sources":["../../../src/resources/payment-intents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAkF1C,MAAM,OAAO,cAAc;IACI;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,MAAM,CAAC,MAAiC;QAC5C,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA0B;YAClE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,kBAAkB;YACxB,IAAI;YACJ,cAAc,EAAE,cAAc,IAAI,WAAW,CAAC,cAAc,EAAE;SAC/D,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { TupayClient } from '../client.js';
|
|
2
|
+
import { type ListParams } from '../liste.js';
|
|
3
|
+
import type { ListResult, Payout, PayoutStatus } from '../types.js';
|
|
4
|
+
export interface ListPayoutsParams extends ListParams {
|
|
5
|
+
/** N'obtenir que les virements dans cet état. */
|
|
6
|
+
status?: PayoutStatus;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Vos virements vers votre compte bancaire.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const { data } = await tupay.payouts.list({ status: 'failed' })
|
|
13
|
+
* data[0].failureMessage // la cause, en français
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ **Aucun virement n'est émis aujourd'hui** : Tupay n'a pas encore
|
|
17
|
+
* de prestataire capable de transférer des fonds. La liste est vide, et
|
|
18
|
+
* c'est la vérité — pas une panne.
|
|
19
|
+
*
|
|
20
|
+
* Un virement **débite votre solde à l'émission**, pas à l'arrivée.
|
|
21
|
+
* S'il échoue, les fonds reviennent : une seconde écriture les rend,
|
|
22
|
+
* sans effacer la première.
|
|
23
|
+
*
|
|
24
|
+
* Aucune méthode pour en créer : un virement part du calendrier, pas
|
|
25
|
+
* d'un appel.
|
|
26
|
+
*/
|
|
27
|
+
export declare class Payouts {
|
|
28
|
+
private readonly client;
|
|
29
|
+
constructor(client: TupayClient);
|
|
30
|
+
retrieve(id: string): Promise<Payout>;
|
|
31
|
+
/**
|
|
32
|
+
* Le détail d'un virement, en **CSV** : le fichier que vous posez à
|
|
33
|
+
* côté de votre relevé bancaire.
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* const csv = await tupay.payouts.export(virement.id)
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* Une ligne par écriture, puis deux lignes de contrôle — le TOTAL des
|
|
40
|
+
* écritures et le montant VIRÉ. S'ils ne coïncident pas, le fichier
|
|
41
|
+
* est incomplet.
|
|
42
|
+
*
|
|
43
|
+
* BOM UTF-8 et séparateur `;` : Excel en français l'ouvre sans
|
|
44
|
+
* assistant d'importation. Montants en francs entiers, sans
|
|
45
|
+
* séparateur de milliers — c'est ce qu'un tableur sait additionner.
|
|
46
|
+
*
|
|
47
|
+
* Les mêmes lignes en JSON :
|
|
48
|
+
* `balanceTransactions.list({ payout: id })`.
|
|
49
|
+
*/
|
|
50
|
+
export(id: string): Promise<string>;
|
|
51
|
+
list(params?: ListPayoutsParams): Promise<ListResult<Payout>>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=payouts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payouts.d.ts","sourceRoot":"","sources":["../../../src/resources/payouts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAEnE,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,iDAAiD;IACjD,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ3C;;;;;;;;;;;;;;;;;;OAkBG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASnC,IAAI,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;CASxE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { normaliserListe, parametresListe, } from '../liste.js';
|
|
2
|
+
/**
|
|
3
|
+
* Vos virements vers votre compte bancaire.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* const { data } = await tupay.payouts.list({ status: 'failed' })
|
|
7
|
+
* data[0].failureMessage // la cause, en français
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ **Aucun virement n'est émis aujourd'hui** : Tupay n'a pas encore
|
|
11
|
+
* de prestataire capable de transférer des fonds. La liste est vide, et
|
|
12
|
+
* c'est la vérité — pas une panne.
|
|
13
|
+
*
|
|
14
|
+
* Un virement **débite votre solde à l'émission**, pas à l'arrivée.
|
|
15
|
+
* S'il échoue, les fonds reviennent : une seconde écriture les rend,
|
|
16
|
+
* sans effacer la première.
|
|
17
|
+
*
|
|
18
|
+
* Aucune méthode pour en créer : un virement part du calendrier, pas
|
|
19
|
+
* d'un appel.
|
|
20
|
+
*/
|
|
21
|
+
export class Payouts {
|
|
22
|
+
client;
|
|
23
|
+
constructor(client) {
|
|
24
|
+
this.client = client;
|
|
25
|
+
}
|
|
26
|
+
async retrieve(id) {
|
|
27
|
+
const { data } = await this.client.request({
|
|
28
|
+
method: 'GET',
|
|
29
|
+
path: `/payouts/${encodeURIComponent(id)}`,
|
|
30
|
+
});
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Le détail d'un virement, en **CSV** : le fichier que vous posez à
|
|
35
|
+
* côté de votre relevé bancaire.
|
|
36
|
+
*
|
|
37
|
+
* ```ts
|
|
38
|
+
* const csv = await tupay.payouts.export(virement.id)
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* Une ligne par écriture, puis deux lignes de contrôle — le TOTAL des
|
|
42
|
+
* écritures et le montant VIRÉ. S'ils ne coïncident pas, le fichier
|
|
43
|
+
* est incomplet.
|
|
44
|
+
*
|
|
45
|
+
* BOM UTF-8 et séparateur `;` : Excel en français l'ouvre sans
|
|
46
|
+
* assistant d'importation. Montants en francs entiers, sans
|
|
47
|
+
* séparateur de milliers — c'est ce qu'un tableur sait additionner.
|
|
48
|
+
*
|
|
49
|
+
* Les mêmes lignes en JSON :
|
|
50
|
+
* `balanceTransactions.list({ payout: id })`.
|
|
51
|
+
*/
|
|
52
|
+
async export(id) {
|
|
53
|
+
return this.client.request({
|
|
54
|
+
method: 'GET',
|
|
55
|
+
path: `/payouts/${encodeURIComponent(id)}/export`,
|
|
56
|
+
raw: true,
|
|
57
|
+
accept: 'text/csv',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async list(params = {}) {
|
|
61
|
+
return normaliserListe(await this.client.request({
|
|
62
|
+
method: 'GET',
|
|
63
|
+
path: '/payouts',
|
|
64
|
+
query: { ...parametresListe(params), status: params.status },
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=payouts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payouts.js","sourceRoot":"","sources":["../../../src/resources/payouts.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,eAAe,GAGhB,MAAM,aAAa,CAAA;AAQpB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,OAAO;IACW;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAmB;YAC3D,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,EAAE;SAC3C,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAS;YACjC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,EAAE,CAAC,SAAS;YACjD,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,UAAU;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAA4B,EAAE;QACvC,OAAO,eAAe,CACpB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAqB;YAC5C,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;SAC7D,CAAC,CACH,CAAA;IACH,CAAC;CACF"}
|
package/dist/esm/types.d.ts
CHANGED
|
@@ -426,6 +426,265 @@ export interface InvoicePaymentAttempt extends Invoice {
|
|
|
426
426
|
failureMessage: string | null;
|
|
427
427
|
};
|
|
428
428
|
}
|
|
429
|
+
/** Les régimes de TGC de Polynésie française. */
|
|
430
|
+
export type TgcRate = 'exempt' | '5' | '10' | '16';
|
|
431
|
+
/** Ce qui manque à un compte connecté pour servir. */
|
|
432
|
+
export type AccountRequirement = 'kyb.validation' | 'bank_account.iban_xpf';
|
|
433
|
+
/**
|
|
434
|
+
* Un vendeur hébergé par une plateforme (Connect).
|
|
435
|
+
*
|
|
436
|
+
* **C'est un marchand à part entière** : son solde, ses écritures, ses
|
|
437
|
+
* virements et ses litiges sont les mêmes objets que ceux de n'importe
|
|
438
|
+
* quel compte.
|
|
439
|
+
*/
|
|
440
|
+
export interface Account {
|
|
441
|
+
id: string;
|
|
442
|
+
object: 'account';
|
|
443
|
+
/** Secondes Unix. */
|
|
444
|
+
created: number;
|
|
445
|
+
name: string;
|
|
446
|
+
email: string;
|
|
447
|
+
/** La plateforme qui héberge ce compte — vous. */
|
|
448
|
+
platformId: string;
|
|
449
|
+
/**
|
|
450
|
+
* `true` quand ce compte peut encaisser **en mode live**. En mode
|
|
451
|
+
* test, rien n'est bridé quelle que soit sa valeur.
|
|
452
|
+
*/
|
|
453
|
+
chargesEnabled: boolean;
|
|
454
|
+
/** `true` quand un virement peut partir vers ce compte. */
|
|
455
|
+
payoutsEnabled: boolean;
|
|
456
|
+
/**
|
|
457
|
+
* Ce qui manque, dans l'ordre où il faut le traiter.
|
|
458
|
+
*
|
|
459
|
+
* ⚠️ Rendu **même quand `chargesEnabled` est vrai** : il peut rester
|
|
460
|
+
* une exigence de virement alors que l'encaissement est déjà ouvert.
|
|
461
|
+
*/
|
|
462
|
+
requirements: AccountRequirement[];
|
|
463
|
+
/** La phrase française de chaque exigence, dans le même ordre. */
|
|
464
|
+
requirementsDescriptions: string[];
|
|
465
|
+
livemode: boolean;
|
|
466
|
+
/** @deprecated Lisez `created`. */
|
|
467
|
+
createdAt: string;
|
|
468
|
+
}
|
|
469
|
+
export type DisputeStatus = 'needs_response' | 'under_review' | 'won' | 'lost';
|
|
470
|
+
/**
|
|
471
|
+
* Une contestation de paiement par le porteur.
|
|
472
|
+
*
|
|
473
|
+
* **Le montant, le motif et la date limite viennent du réseau** : ils ne
|
|
474
|
+
* se réécrivent pas.
|
|
475
|
+
*/
|
|
476
|
+
export interface Dispute {
|
|
477
|
+
id: string;
|
|
478
|
+
object: 'dispute';
|
|
479
|
+
/** Secondes Unix. Même instant que `createdAt`. */
|
|
480
|
+
created: number;
|
|
481
|
+
status: DisputeStatus;
|
|
482
|
+
/** Le paiement contesté. Développable — `expand[]=transaction`. */
|
|
483
|
+
transactionId: string;
|
|
484
|
+
transaction?: Transaction;
|
|
485
|
+
/**
|
|
486
|
+
* Ce qui est contesté, en francs entiers. Peut être **inférieur** au
|
|
487
|
+
* paiement : un porteur conteste parfois une partie de sa commande.
|
|
488
|
+
*/
|
|
489
|
+
amountXpf: number;
|
|
490
|
+
currency: 'XPF';
|
|
491
|
+
/**
|
|
492
|
+
* Le motif tel que le réseau le qualifie, **non traduit** : le
|
|
493
|
+
* traduire ferait perdre le terme que vous retrouverez dans la lettre
|
|
494
|
+
* de votre banque.
|
|
495
|
+
*/
|
|
496
|
+
reason: string;
|
|
497
|
+
/**
|
|
498
|
+
* Secondes Unix : la **date limite de réponse**.
|
|
499
|
+
*
|
|
500
|
+
* ⚠️ Passée, le litige est perdu par défaut. C'est le champ le plus
|
|
501
|
+
* important de cet objet.
|
|
502
|
+
*/
|
|
503
|
+
evidenceDueBy: number;
|
|
504
|
+
/** `true` tant qu'il est encore temps de répondre. */
|
|
505
|
+
responseStillPossible: boolean;
|
|
506
|
+
/**
|
|
507
|
+
* Secondes Unix de votre **dernière** soumission de preuves, `null` si
|
|
508
|
+
* vous n'avez rien transmis. Le détail de ce qui est parti se lit par
|
|
509
|
+
* `disputes.listEvidence(id)` — ce champ n'en est que la date.
|
|
510
|
+
*/
|
|
511
|
+
evidenceSubmittedAt: number | null;
|
|
512
|
+
livemode: boolean;
|
|
513
|
+
createdAt: string;
|
|
514
|
+
updatedAt: string;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Une soumission de preuves sur un litige.
|
|
518
|
+
*
|
|
519
|
+
* **Elle ne se réécrit pas** : pour compléter votre réponse, soumettez-en
|
|
520
|
+
* une autre, le journal conserve les deux. C'est pour ça qu'il n'y a ni
|
|
521
|
+
* `updatedAt` ni `createdAt` ici — le premier promettrait une révision
|
|
522
|
+
* qui n'existe pas, le second est déprécié partout ailleurs.
|
|
523
|
+
*/
|
|
524
|
+
export interface DisputeEvidence {
|
|
525
|
+
id: string;
|
|
526
|
+
object: 'dispute_evidence';
|
|
527
|
+
/** Secondes Unix de la soumission. */
|
|
528
|
+
created: number;
|
|
529
|
+
/** Le litige auquel cette preuve répond. */
|
|
530
|
+
disputeId: string;
|
|
531
|
+
/** Ce que vous avez affirmé, tel que vous l'avez écrit. */
|
|
532
|
+
explanation: string;
|
|
533
|
+
livemode: boolean;
|
|
534
|
+
}
|
|
535
|
+
export type PayoutStatus = 'pending' | 'in_transit' | 'paid' | 'failed';
|
|
536
|
+
/**
|
|
537
|
+
* Un ordre de versement vers votre compte bancaire.
|
|
538
|
+
*
|
|
539
|
+
* Le montant, la destination et la date d'arrivée sont **figés** à
|
|
540
|
+
* l'émission.
|
|
541
|
+
*/
|
|
542
|
+
export interface Payout {
|
|
543
|
+
id: string;
|
|
544
|
+
object: 'payout';
|
|
545
|
+
/** Secondes Unix. Même instant que `createdAt`. */
|
|
546
|
+
created: number;
|
|
547
|
+
status: PayoutStatus;
|
|
548
|
+
/** Ce qui part, en francs entiers. **Toujours positif.** */
|
|
549
|
+
amountXpf: number;
|
|
550
|
+
currency: 'XPF';
|
|
551
|
+
/**
|
|
552
|
+
* Les **quatre derniers** caractères de votre IBAN, et rien d'autre.
|
|
553
|
+
* Assez pour reconnaître le compte ; pas assez pour que nos journaux
|
|
554
|
+
* portent vos coordonnées bancaires.
|
|
555
|
+
*/
|
|
556
|
+
destinationLast4: string | null;
|
|
557
|
+
/**
|
|
558
|
+
* Secondes Unix : l'arrivée **estimée**, figée à l'émission.
|
|
559
|
+
* Distincte de `created` — l'ordre part un jour, l'argent arrive un
|
|
560
|
+
* autre.
|
|
561
|
+
*/
|
|
562
|
+
arrivalEstimate: number;
|
|
563
|
+
/** Code machine de l'échec. `null` si tout va bien. */
|
|
564
|
+
failureCode: string | null;
|
|
565
|
+
/** Le même échec, en français, à montrer tel quel. */
|
|
566
|
+
failureMessage: string | null;
|
|
567
|
+
livemode: boolean;
|
|
568
|
+
createdAt: string;
|
|
569
|
+
updatedAt: string;
|
|
570
|
+
}
|
|
571
|
+
export type BalanceTransactionType = 'payment' | 'refund' | 'fee' | 'payout' | 'dispute' | 'adjustment'
|
|
572
|
+
/** La commission qu'une plateforme a gagnée sur la vente d'un tiers. */
|
|
573
|
+
| 'application_fee';
|
|
574
|
+
/**
|
|
575
|
+
* Une ligne du journal de votre solde.
|
|
576
|
+
*
|
|
577
|
+
* **Immuable** : elle naît d'un mouvement réel et ne se corrige qu'en
|
|
578
|
+
* écrivant un ajustement.
|
|
579
|
+
*/
|
|
580
|
+
export interface BalanceTransaction {
|
|
581
|
+
id: string;
|
|
582
|
+
object: 'balance_transaction';
|
|
583
|
+
/** Secondes Unix. Même instant que `createdAt`. */
|
|
584
|
+
created: number;
|
|
585
|
+
/**
|
|
586
|
+
* Numéro séquentiel par compte, par mode et par année, **sans
|
|
587
|
+
* rupture**. Une ligne manquante laisse un trou visible.
|
|
588
|
+
*/
|
|
589
|
+
sequence: number;
|
|
590
|
+
type: BalanceTransactionType;
|
|
591
|
+
/** Le paiement à l'origine. Développable — `expand[]=transaction`. */
|
|
592
|
+
transactionId: string | null;
|
|
593
|
+
transaction?: Transaction;
|
|
594
|
+
refundId: string | null;
|
|
595
|
+
refund?: Refund;
|
|
596
|
+
/** Le virement à l'origine. Développable — `expand[]=payout`. */
|
|
597
|
+
payoutId: string | null;
|
|
598
|
+
payout?: Payout;
|
|
599
|
+
/** Ce que le client a payé, **TTC**. **Négatif** sur un remboursement. */
|
|
600
|
+
grossXpf: number;
|
|
601
|
+
/** Notre commission. **Zéro** sur un remboursement : elle n'est pas rendue. */
|
|
602
|
+
feeXpf: number;
|
|
603
|
+
/**
|
|
604
|
+
* Part allée à la **plateforme**, sur un paiement encaissé pour un
|
|
605
|
+
* compte connecté. Zéro partout ailleurs.
|
|
606
|
+
*
|
|
607
|
+
* Séparée de `feeXpf` à dessein : fondues, vous liriez un montant de
|
|
608
|
+
* frais sans pouvoir dire ce qui est allé à Tupay et ce qui est allé
|
|
609
|
+
* à votre plateforme.
|
|
610
|
+
*/
|
|
611
|
+
applicationFeeXpf: number;
|
|
612
|
+
/**
|
|
613
|
+
* La vente **d'un autre marchand** qui a produit cette écriture — le
|
|
614
|
+
* paiement de votre vendeur, vu depuis votre journal. Renseignée
|
|
615
|
+
* uniquement sur `type: application_fee`.
|
|
616
|
+
*/
|
|
617
|
+
sourceTransactionId: string | null;
|
|
618
|
+
/** `grossXpf − feeXpf − applicationFeeXpf`. C'est lui qui rejoint votre solde. */
|
|
619
|
+
netXpf: number;
|
|
620
|
+
/** La TGC transportée, de même signe que le brut. **Indicative**. */
|
|
621
|
+
tgcXpf: number;
|
|
622
|
+
/** Le taux **figé** au moment de l'écriture. */
|
|
623
|
+
tgcRate: 'exempt' | '5' | '10' | '16';
|
|
624
|
+
/** « TGC 10 % incluse : 4 091 XPF », ou l'exonération. */
|
|
625
|
+
tgcLabel: string;
|
|
626
|
+
/** Le barème appliqué, **figé**. 250 = 2,5 %. */
|
|
627
|
+
feeBps: number;
|
|
628
|
+
feeFixedXpf: number;
|
|
629
|
+
/** Secondes Unix : quand ce montant bascule en `available`. Figée. */
|
|
630
|
+
availableAt: number;
|
|
631
|
+
currency: 'XPF';
|
|
632
|
+
livemode: boolean;
|
|
633
|
+
createdAt: string;
|
|
634
|
+
}
|
|
635
|
+
/** Une part du solde — disponible, ou en attente. */
|
|
636
|
+
export interface PartDeSolde {
|
|
637
|
+
/** Ce qui vous revient, **commission déduite**, en francs entiers. */
|
|
638
|
+
amountXpf: number;
|
|
639
|
+
/**
|
|
640
|
+
* La TGC contenue dans `amountXpf`.
|
|
641
|
+
*
|
|
642
|
+
* ⚠️ **Indication, pas déclaration.** Tupay applique le taux déclaré
|
|
643
|
+
* sur votre compte ; si vous vendez à plusieurs taux, ce chiffre ne
|
|
644
|
+
* peut pas être exact.
|
|
645
|
+
*/
|
|
646
|
+
tgcXpf: number;
|
|
647
|
+
/** `amountXpf − tgcXpf` — ce qui reste une fois la taxe réservée. */
|
|
648
|
+
netOfTgcXpf: number;
|
|
649
|
+
/** Nombre d'écritures dans cette part. */
|
|
650
|
+
count: number;
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Le solde, à l'instant de l'appel.
|
|
654
|
+
*
|
|
655
|
+
* Ni `id` ni `created` : c'est un état instantané, la somme de vos
|
|
656
|
+
* écritures, pas un objet stocké.
|
|
657
|
+
*/
|
|
658
|
+
export interface Balance {
|
|
659
|
+
object: 'balance';
|
|
660
|
+
available: PartDeSolde;
|
|
661
|
+
pending: PartDeSolde;
|
|
662
|
+
/**
|
|
663
|
+
* Secondes Unix : quand la plus proche écriture en attente bascule.
|
|
664
|
+
* `null` quand rien n'est en attente.
|
|
665
|
+
*/
|
|
666
|
+
nextAvailableAt: number | null;
|
|
667
|
+
currency: 'XPF';
|
|
668
|
+
livemode: boolean;
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* Le solde d'un de vos vendeurs (Connect).
|
|
672
|
+
*
|
|
673
|
+
* Le même objet que votre propre solde, avec deux champs de plus : de
|
|
674
|
+
* QUI il est, et s'il peut partir.
|
|
675
|
+
*/
|
|
676
|
+
export interface AccountBalance extends Balance {
|
|
677
|
+
/** Le compte dont ce solde est le solde. */
|
|
678
|
+
account: string;
|
|
679
|
+
/**
|
|
680
|
+
* `true` quand un virement peut partir vers ce compte. Exige la
|
|
681
|
+
* validation **et** des coordonnées bancaires.
|
|
682
|
+
*
|
|
683
|
+
* Rendu ici parce que c'est la question qui suit immédiatement
|
|
684
|
+
* « combien a-t-il ? ».
|
|
685
|
+
*/
|
|
686
|
+
payoutsEnabled: boolean;
|
|
687
|
+
}
|
|
429
688
|
export interface Invoice {
|
|
430
689
|
id: string;
|
|
431
690
|
object: 'invoice';
|