@pax2pay/model-banking 0.1.261 → 0.1.262

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.
@@ -0,0 +1,21 @@
1
+ import { isoly } from "isoly"
2
+ import { isly } from "isly"
3
+
4
+ export type Amount = {
5
+ net: number
6
+ fee: {
7
+ other: number
8
+ }
9
+ }
10
+ export namespace Amount {
11
+ export const type = isly.object<Amount>({
12
+ net: isly.number(),
13
+ fee: isly.object<Amount["fee"]>({ other: isly.number() }),
14
+ })
15
+ export function add(currency: isoly.Currency, addendee: Amount, addend: Partial<Amount>): Amount {
16
+ const result = { ...addendee }
17
+ result.net = isoly.Currency.add(currency, result.net, addend.net ?? 0)
18
+ result.fee.other = isoly.Currency.add(currency, result.fee.other, addend.fee?.other ?? 0)
19
+ return result
20
+ }
21
+ }
@@ -1,10 +1,10 @@
1
1
  import { isly } from "isly"
2
2
  import { Card } from "../Card"
3
3
  import { Batch } from "./Batch"
4
- import { Total } from "./Total"
4
+ import { Totals } from "./Totals"
5
5
 
6
6
  export interface Creatable {
7
- expected?: Total
7
+ totals: Totals
8
8
  processor: Card.Stack
9
9
  references?: string[] //File name
10
10
  batch: Batch
@@ -12,7 +12,7 @@ export interface Creatable {
12
12
 
13
13
  export namespace Creatable {
14
14
  export const type = isly.object<Creatable>({
15
- expected: Total.type.optional(),
15
+ totals: Totals.type,
16
16
  processor: Card.Stack.type,
17
17
  references: isly.string().array().optional(),
18
18
  batch: Batch.type,
@@ -19,7 +19,7 @@ export namespace Capture {
19
19
  export interface Creatable {
20
20
  type: "capture"
21
21
  authorization: Authorization
22
- reference: string
22
+ reference: string // card transaction
23
23
  batch: Batch
24
24
  fee: Fee
25
25
  amount: Amount
@@ -1,8 +1,6 @@
1
1
  import { gracely } from "gracely"
2
2
  import { isly } from "isly"
3
- import { Amount } from "../../Amount"
4
3
  import { Transaction } from "../../Transaction"
5
- import { Total } from "../Total"
6
4
  import { Cancel as EntryCancel } from "./Cancel"
7
5
  import { Capture as EntryCapture } from "./Capture"
8
6
  import { Creatable as EntryCreatable } from "./Creatable"
@@ -38,11 +36,6 @@ export namespace Entry {
38
36
  export const Summary = EntrySummary
39
37
  export type Creatable = EntryCreatable
40
38
  export const Creatable = EntryCreatable
41
- export function compile(entry: Entry): Total {
42
- return entry.type == "unknown"
43
- ? Total.initiate()
44
- : Total.initiate({ amount: Amount.toAmounts(entry.amount), fee: entry.fee })
45
- }
46
39
  export function from(creatable: Entry.Creatable, transaction: Transaction | gracely.Error | string): Entry {
47
40
  let result: Entry
48
41
  if (!Transaction.is(transaction) || transaction.status != "finalized")
@@ -1,34 +1,82 @@
1
+ import { isoly } from "isoly"
1
2
  import { isly } from "isly"
2
- import { Amounts } from "../Amounts"
3
- import { Transaction } from "../Transaction"
4
- import { Fee } from "./Fee"
3
+ import { Amount } from "./Amount"
5
4
 
6
- export type Total = {
7
- amount: Amounts
8
- fee: Fee
5
+ export interface Total {
6
+ expected: Amount
7
+ outcome?: Amount
8
+ collected?: Amount & { transactions: { net: string; fee: string } }
9
+ settled?: Total.Settled
9
10
  }
10
11
  export namespace Total {
11
- export function initiate(partial?: Partial<Total>): Total {
12
- return { amount: partial?.amount ?? {}, fee: partial?.fee ?? { other: {} } }
12
+ export type Settled = {
13
+ net: number
14
+ transactions: string[]
13
15
  }
14
- export function add(addendee: Total, addend: Total): Total {
15
- return { amount: Amounts.add(addendee.amount, addend.amount), fee: Fee.add(addendee.fee, addend.fee) }
16
+ export const Settled = isly.object<Settled>({ net: isly.number(), transactions: isly.string().array() })
17
+ export const type = isly.object<Total>({
18
+ expected: Amount.type,
19
+ outcome: Amount.type.optional(),
20
+ collected: Amount.type
21
+ .extend<Required<Total>["collected"]>({
22
+ transactions: isly.object<Required<Total>["collected"]["transactions"]>({
23
+ net: isly.string(),
24
+ fee: isly.string(),
25
+ }),
26
+ })
27
+ .optional(),
28
+ settled: Settled.optional(),
29
+ })
30
+ export function create(): Total {
31
+ return { expected: { net: 0, fee: { other: 0 } } }
16
32
  }
17
- export function compare(expected: Total, outcome: Total): boolean {
18
- return Amounts.compare(expected.amount, outcome.amount) && Amounts.compare(expected.fee.other, outcome.fee.other)
19
- }
20
- export function from(collect: Transaction.Collect, collected: Total = initiate()): Total {
21
- let result: Total = collected
22
- for (const [currency, counterbalance] of Object.entries(collect.counterbalances)) {
23
- for (const [entry, amount] of Object.entries(counterbalance))
24
- if (entry.startsWith("fee"))
25
- result = add(result, initiate({ fee: { other: { [currency]: amount } } }))
26
- else if (entry.startsWith("settle"))
27
- result = add(result, initiate({ amount: { [currency]: amount } }))
33
+ export function verify(total: Total, type: "outcome" | "collected" | "settled"): boolean {
34
+ let result: boolean
35
+ switch (type) {
36
+ case "outcome":
37
+ result = total.outcome?.net == total.expected.net && total.outcome.fee.other == total.expected.fee.other
38
+ break
39
+ case "collected":
40
+ result = total.collected?.net == total.outcome?.net && total.collected?.fee.other == total.outcome?.fee.other
41
+ break
42
+ case "settled":
43
+ result = total.settled?.net == total.collected?.net
44
+ break
28
45
  }
29
46
  return result
30
47
  }
31
- export const type = isly.object<Total>({ amount: Amounts.type, fee: Fee.type })
32
- export const is = type.is
33
- export const flaw = type.flaw
48
+ export function add(currency: isoly.Currency, addendee: Total, addend: Partial<Total>): Total {
49
+ const result: Total = { ...addendee }
50
+ addend.expected && (result.expected = Amount.add(currency, result.expected, addend.expected))
51
+ if (result.outcome || addend.outcome)
52
+ result.outcome = Amount.add(currency, result.outcome ?? { net: 0, fee: { other: 0 } }, addend.outcome ?? {})
53
+ if (result.collected || addend.collected)
54
+ result.collected = {
55
+ ...Amount.add(currency, result.collected ?? { net: 0, fee: { other: 0 } }, addend.collected ?? {}),
56
+ transactions: {
57
+ net: addend.collected?.transactions.net ?? result.collected?.transactions.net ?? "",
58
+ fee: addend.collected?.transactions.fee ?? result.collected?.transactions.fee ?? "",
59
+ },
60
+ }
61
+ if (result.settled || addend.settled)
62
+ result.settled = {
63
+ net: isoly.Currency.add(currency, result.settled?.net ?? 0, addend.settled?.net ?? 0),
64
+ transactions: (result.settled?.transactions ?? []).concat(addend.settled?.transactions ?? []),
65
+ }
66
+ return result
67
+ }
68
+ export function collect(
69
+ currency: isoly.Currency,
70
+ total: Total,
71
+ collected: Amount,
72
+ transactions: { net: string; fee: string }
73
+ ): Total {
74
+ const result = { ...total }
75
+ if (result.collected) {
76
+ result.collected.net = isoly.Currency.add(currency, result.collected.net, collected.net)
77
+ result.collected.fee.other = isoly.Currency.add(currency, result.collected.fee.other, collected.fee.other)
78
+ } else
79
+ result.collected = { ...collected, transactions }
80
+ return result
81
+ }
34
82
  }
@@ -0,0 +1,54 @@
1
+ import { isoly } from "isoly"
2
+ import { isly } from "isly"
3
+ import type { Collect } from "../Transaction/Collect"
4
+ import { Amount } from "./Amount"
5
+ import { Entry } from "./Entry"
6
+ import { Total } from "./Total"
7
+
8
+ export type Totals = Partial<Record<isoly.Currency, Total>>
9
+ export namespace Totals {
10
+ export const type = isly.record<isoly.Currency, Total>(isly.string(isoly.Currency.types), Total.type)
11
+ export function addEntry(totals: Totals, entry: Entry): Totals {
12
+ const result = { ...totals }
13
+ if (entry.status == "succeeded" && (entry.type == "capture" || entry.type == "refund")) {
14
+ result[entry.amount[0]] = Total.add(entry.amount[0], result[entry.amount[0]] ?? Total.create(), {
15
+ outcome: {
16
+ net: entry.amount[1],
17
+ // TODO: other currencies in fees
18
+ fee: { other: entry.fee.other[entry.amount[0]] ?? 0 },
19
+ },
20
+ })
21
+ }
22
+ return result
23
+ }
24
+ export function verify(totals: Totals, type: "outcome" | "collected" | "settled"): boolean {
25
+ return Object.values(totals).every(t => Total.verify(t, type))
26
+ }
27
+ export function add(addendee: Totals, addends: Partial<Record<isoly.Currency, Partial<Total>>>): Totals {
28
+ const result = { ...addendee }
29
+ for (const [currency, addend] of Object.entries(addends) as [isoly.Currency, Partial<Total>][]) {
30
+ result[currency] = Total.add(currency, result[currency] ?? Total.create(), addend)
31
+ }
32
+ return result
33
+ }
34
+ // TODO: update this for new collection method
35
+ export function collect(totals: Totals, collect: Collect): Totals {
36
+ const result: Totals = { ...totals }
37
+ for (const [currency, counterbalance] of Object.entries(collect.counterbalances)) {
38
+ const collected: Amount = { net: 0, fee: { other: 0 } }
39
+ for (const [entry, amount] of Object.entries(counterbalance)) {
40
+ if (entry.startsWith("fee"))
41
+ collected.fee.other = isoly.Currency.add(currency as isoly.Currency, collected.fee.other, amount ?? 0)
42
+ else if (entry.startsWith("settle"))
43
+ collected.net = isoly.Currency.add(currency as isoly.Currency, collected.net, amount ?? 0)
44
+ }
45
+ result[currency as isoly.Currency] = Total.collect(
46
+ currency as isoly.Currency,
47
+ result[currency as isoly.Currency] ?? Total.create(),
48
+ collected,
49
+ { net: "", fee: "" }
50
+ )
51
+ }
52
+ return result
53
+ }
54
+ }
@@ -1,30 +1,30 @@
1
1
  import { isoly } from "isoly"
2
2
  import { isly } from "isly"
3
- import { Card } from "../Card"
3
+ import { Amounts } from "../Amounts"
4
4
  import { Identifier } from "../Identifier"
5
+ import { Amount as SettlementAmount } from "./Amount"
5
6
  import { Batch as SettlementBatch } from "./Batch"
6
7
  import { Creatable as SettlementCreatable } from "./Creatable"
7
8
  import { Entry as SettlementEntry } from "./Entry"
8
9
  import { Fee as SettlementFee } from "./Fee"
9
- import { Settled as SettlementSettled } from "./Settled"
10
10
  import { Status } from "./Status"
11
11
  import { Total as SettlementTotal } from "./Total"
12
+ import { Totals as SettlementTotals } from "./Totals"
12
13
 
13
14
  export interface Settlement extends Settlement.Creatable {
14
15
  id: string
15
16
  by?: string
16
17
  created: isoly.DateTime
17
18
  status: Status
18
- collected?: Settlement.Total
19
- outcome: Settlement.Total
20
- settled?: Settlement.Settled
21
19
  entries: Settlement.Entry.Summary
22
20
  }
23
21
  export namespace Settlement {
24
- export type Settled = SettlementSettled
25
- export const Settled = SettlementSettled
26
22
  export const Total = SettlementTotal
27
23
  export type Total = SettlementTotal
24
+ export const Totals = SettlementTotals
25
+ export type Totals = SettlementTotals
26
+ export const Amount = SettlementAmount
27
+ export type Amount = SettlementAmount
28
28
  export const Fee = SettlementFee
29
29
  export type Fee = SettlementFee
30
30
  export type Creatable = SettlementCreatable
@@ -53,25 +53,11 @@ export namespace Settlement {
53
53
  export type Creatable = SettlementEntry.Unknown.Creatable
54
54
  }
55
55
  }
56
- export function initiate(id: string, by: string, batch: Batch, processor: Card.Stack): Settlement {
56
+ export function from(creatable: Settlement.Creatable, by: string): Settlement {
57
57
  return {
58
- id: id ?? Identifier.generate(),
59
- by,
60
- created: isoly.DateTime.now(),
61
- batch,
62
- processor,
63
- status: { collected: "pending", settled: "pending" },
64
- expected: Total.initiate(),
65
- outcome: Total.initiate(),
66
- entries: { count: 0 },
67
- }
68
- }
69
- export function from(id: string, creatable: Settlement.Creatable, by: string): Settlement {
70
- return {
71
- id,
58
+ id: Identifier.generate(),
72
59
  status: { collected: "pending", settled: "pending" },
73
60
  by,
74
- outcome: Total.initiate(),
75
61
  ...creatable,
76
62
  created: isoly.DateTime.now(),
77
63
  entries: { count: 0 },
@@ -82,7 +68,7 @@ export namespace Settlement {
82
68
  for (const entry of entries) {
83
69
  switch (entry.status) {
84
70
  case "succeeded":
85
- result.outcome = Total.add(result.outcome, Entry.compile(entry))
71
+ result.totals = Totals.addEntry(result.totals, entry)
86
72
  result.entries.count++
87
73
  break
88
74
  case "failed":
@@ -92,28 +78,52 @@ export namespace Settlement {
92
78
  }
93
79
  return result
94
80
  }
95
- export function toFailed(id: string, creatable: Settlement.Creatable, by: string, reason: string): Settlement {
96
- return {
97
- id,
98
- created: isoly.DateTime.now(),
99
- status: { collected: "failed", settled: "failed" }, // ["failed", reason],
100
- by,
101
- processor: creatable.processor,
102
- references: creatable.references,
103
- batch: creatable.batch,
104
- expected: Total.initiate(),
105
- outcome: Total.initiate(),
106
- entries: { count: 0 },
81
+ type OldTotal = { amount: Amounts; fee: Fee }
82
+ export type OldSettlement = Omit<Settlement, "totals"> & {
83
+ expected?: OldTotal
84
+ collected?: OldTotal
85
+ outcome: OldTotal
86
+ settled?: { paid: Amounts; transactions: string[] }
87
+ }
88
+ export type MaybeOld = Settlement | OldSettlement
89
+ export function fromLegacy(settlement: MaybeOld): Settlement {
90
+ let result: Settlement
91
+ if (!is(settlement)) {
92
+ const totalToAmount: (currency: isoly.Currency, total?: OldTotal) => Amount = (currency, oldTotal) => ({
93
+ net: oldTotal?.amount[currency] ?? 0,
94
+ fee: { other: oldTotal?.fee.other[currency] ?? 0 },
95
+ })
96
+ const { expected, collected, outcome, settled, ...partialSettlement } = settlement
97
+ const currencies = Array.from(
98
+ new Set<isoly.Currency>([
99
+ ...Object.keys(expected?.amount ?? {}),
100
+ ...Object.keys(collected?.amount ?? {}),
101
+ ...Object.keys(settled?.paid ?? {}),
102
+ ...Object.keys(outcome.amount),
103
+ ] as isoly.Currency[])
104
+ )
105
+ const totals = currencies.reduce((total, currency) => {
106
+ total[currency] = {
107
+ expected: totalToAmount(currency, expected),
108
+ ...(outcome ? { outcome: totalToAmount(currency, outcome) } : {}),
109
+ ...(collected
110
+ ? { collected: { ...totalToAmount(currency, collected), transactions: { net: "", fee: "" } } } //TODO: Find transactions?
111
+ : {}),
112
+ ...(settled ? { settled: { net: settled.paid[currency] ?? 0, transactions: settled.transactions } } : {}), //Find transactions?
113
+ }
114
+ return total
115
+ }, {} as Totals)
116
+ result = { ...partialSettlement, totals }
117
+ } else {
118
+ result = settlement
107
119
  }
120
+ return result
108
121
  }
109
122
  export const type = SettlementCreatable.type.extend<Settlement>({
110
123
  id: isly.string(),
111
124
  by: isly.string().optional(),
112
125
  created: isly.fromIs("isoly.DateTime", isoly.DateTime.is),
113
126
  status: Status.type,
114
- collected: Settlement.Total.type.optional(),
115
- outcome: Settlement.Total.type,
116
- settled: Settled.type.optional(),
117
127
  entries: Settlement.Entry.Summary.type,
118
128
  })
119
129
  export const is = type.is
@@ -0,0 +1,12 @@
1
+ import { isoly } from "isoly";
2
+ import { isly } from "isly";
3
+ export type Amount = {
4
+ net: number;
5
+ fee: {
6
+ other: number;
7
+ };
8
+ };
9
+ export declare namespace Amount {
10
+ const type: isly.object.ExtendableType<Amount>;
11
+ function add(currency: isoly.Currency, addendee: Amount, addend: Partial<Amount>): Amount;
12
+ }
@@ -0,0 +1,17 @@
1
+ import { isoly } from "isoly";
2
+ import { isly } from "isly";
3
+ export var Amount;
4
+ (function (Amount) {
5
+ Amount.type = isly.object({
6
+ net: isly.number(),
7
+ fee: isly.object({ other: isly.number() }),
8
+ });
9
+ function add(currency, addendee, addend) {
10
+ const result = { ...addendee };
11
+ result.net = isoly.Currency.add(currency, result.net, addend.net ?? 0);
12
+ result.fee.other = isoly.Currency.add(currency, result.fee.other, addend.fee?.other ?? 0);
13
+ return result;
14
+ }
15
+ Amount.add = add;
16
+ })(Amount || (Amount = {}));
17
+ //# sourceMappingURL=Amount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Amount.js","sourceRoot":"../","sources":["Settlement/Amount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAQ3B,MAAM,KAAW,MAAM,CAWtB;AAXD,WAAiB,MAAM;IACT,WAAI,GAAG,IAAI,CAAC,MAAM,CAAS;QACvC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE;QAClB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAgB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;KACzD,CAAC,CAAA;IACF,SAAgB,GAAG,CAAC,QAAwB,EAAE,QAAgB,EAAE,MAAuB;QACtF,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAA;QAC9B,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACtE,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;QACzF,OAAO,MAAM,CAAA;IACd,CAAC;IALe,UAAG,MAKlB,CAAA;AACF,CAAC,EAXgB,MAAM,KAAN,MAAM,QAWtB"}
@@ -1,9 +1,9 @@
1
1
  import { isly } from "isly";
2
2
  import { Card } from "../Card";
3
3
  import { Batch } from "./Batch";
4
- import { Total } from "./Total";
4
+ import { Totals } from "./Totals";
5
5
  export interface Creatable {
6
- expected?: Total;
6
+ totals: Totals;
7
7
  processor: Card.Stack;
8
8
  references?: string[];
9
9
  batch: Batch;
@@ -1,11 +1,11 @@
1
1
  import { isly } from "isly";
2
2
  import { Card } from "../Card";
3
3
  import { Batch } from "./Batch";
4
- import { Total } from "./Total";
4
+ import { Totals } from "./Totals";
5
5
  export var Creatable;
6
6
  (function (Creatable) {
7
7
  Creatable.type = isly.object({
8
- expected: Total.type.optional(),
8
+ totals: Totals.type,
9
9
  processor: Card.Stack.type,
10
10
  references: isly.string().array().optional(),
11
11
  batch: Batch.type,
@@ -1 +1 @@
1
- {"version":3,"file":"Creatable.js","sourceRoot":"../","sources":["Settlement/Creatable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAS/B,MAAM,KAAW,SAAS,CASzB;AATD,WAAiB,SAAS;IACZ,cAAI,GAAG,IAAI,CAAC,MAAM,CAAY;QAC1C,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;QAC/B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;QAC1B,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;QAC5C,KAAK,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC,CAAA;IACW,YAAE,GAAG,UAAA,IAAI,CAAC,EAAE,CAAA;IACZ,cAAI,GAAG,UAAA,IAAI,CAAC,IAAI,CAAA;AAC9B,CAAC,EATgB,SAAS,KAAT,SAAS,QASzB"}
1
+ {"version":3,"file":"Creatable.js","sourceRoot":"../","sources":["Settlement/Creatable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AASjC,MAAM,KAAW,SAAS,CASzB;AATD,WAAiB,SAAS;IACZ,cAAI,GAAG,IAAI,CAAC,MAAM,CAAY;QAC1C,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;QAC1B,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;QAC5C,KAAK,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC,CAAA;IACW,YAAE,GAAG,UAAA,IAAI,CAAC,EAAE,CAAA;IACZ,cAAI,GAAG,UAAA,IAAI,CAAC,IAAI,CAAA;AAC9B,CAAC,EATgB,SAAS,KAAT,SAAS,QASzB"}
@@ -1,7 +1,6 @@
1
1
  import { gracely } from "gracely";
2
2
  import { isly } from "isly";
3
3
  import { Transaction } from "../../Transaction";
4
- import { Total } from "../Total";
5
4
  import { Cancel as EntryCancel } from "./Cancel";
6
5
  import { Capture as EntryCapture } from "./Capture";
7
6
  import { Creatable as EntryCreatable } from "./Creatable";
@@ -35,7 +34,6 @@ export declare namespace Entry {
35
34
  const Summary: typeof EntrySummary;
36
35
  type Creatable = EntryCreatable;
37
36
  const Creatable: typeof EntryCreatable;
38
- function compile(entry: Entry): Total;
39
37
  function from(creatable: Entry.Creatable, transaction: Transaction | gracely.Error | string): Entry;
40
38
  const type: isly.Type<Entry>;
41
39
  const is: isly.Type.IsFunction<Entry>;
@@ -1,8 +1,6 @@
1
1
  import { gracely } from "gracely";
2
2
  import { isly } from "isly";
3
- import { Amount } from "../../Amount";
4
3
  import { Transaction } from "../../Transaction";
5
- import { Total } from "../Total";
6
4
  import { Cancel as EntryCancel } from "./Cancel";
7
5
  import { Capture as EntryCapture } from "./Capture";
8
6
  import { Creatable as EntryCreatable } from "./Creatable";
@@ -17,12 +15,6 @@ export var Entry;
17
15
  Entry.Unknown = EntryUnknown;
18
16
  Entry.Summary = EntrySummary;
19
17
  Entry.Creatable = EntryCreatable;
20
- function compile(entry) {
21
- return entry.type == "unknown"
22
- ? Total.initiate()
23
- : Total.initiate({ amount: Amount.toAmounts(entry.amount), fee: entry.fee });
24
- }
25
- Entry.compile = compile;
26
18
  function from(creatable, transaction) {
27
19
  let result;
28
20
  if (!Transaction.is(transaction) || transaction.status != "finalized")
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../","sources":["Settlement/Entry/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"../","sources":["Settlement/Entry/index.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,29 @@
1
+ import { isoly } from "isoly";
1
2
  import { isly } from "isly";
2
- import { Amounts } from "../Amounts";
3
- import { Transaction } from "../Transaction";
4
- import { Fee } from "./Fee";
5
- export type Total = {
6
- amount: Amounts;
7
- fee: Fee;
8
- };
3
+ import { Amount } from "./Amount";
4
+ export interface Total {
5
+ expected: Amount;
6
+ outcome?: Amount;
7
+ collected?: Amount & {
8
+ transactions: {
9
+ net: string;
10
+ fee: string;
11
+ };
12
+ };
13
+ settled?: Total.Settled;
14
+ }
9
15
  export declare namespace Total {
10
- function initiate(partial?: Partial<Total>): Total;
11
- function add(addendee: Total, addend: Total): Total;
12
- function compare(expected: Total, outcome: Total): boolean;
13
- function from(collect: Transaction.Collect, collected?: Total): Total;
16
+ type Settled = {
17
+ net: number;
18
+ transactions: string[];
19
+ };
20
+ const Settled: isly.object.ExtendableType<Settled>;
14
21
  const type: isly.object.ExtendableType<Total>;
15
- const is: isly.Type.IsFunction<Total>;
16
- const flaw: isly.Type.FlawFunction;
22
+ function create(): Total;
23
+ function verify(total: Total, type: "outcome" | "collected" | "settled"): boolean;
24
+ function add(currency: isoly.Currency, addendee: Total, addend: Partial<Total>): Total;
25
+ function collect(currency: isoly.Currency, total: Total, collected: Amount, transactions: {
26
+ net: string;
27
+ fee: string;
28
+ }): Total;
17
29
  }
@@ -1,34 +1,73 @@
1
+ import { isoly } from "isoly";
1
2
  import { isly } from "isly";
2
- import { Amounts } from "../Amounts";
3
- import { Fee } from "./Fee";
3
+ import { Amount } from "./Amount";
4
4
  export var Total;
5
5
  (function (Total) {
6
- function initiate(partial) {
7
- return { amount: partial?.amount ?? {}, fee: partial?.fee ?? { other: {} } };
6
+ Total.Settled = isly.object({ net: isly.number(), transactions: isly.string().array() });
7
+ Total.type = isly.object({
8
+ expected: Amount.type,
9
+ outcome: Amount.type.optional(),
10
+ collected: Amount.type
11
+ .extend({
12
+ transactions: isly.object({
13
+ net: isly.string(),
14
+ fee: isly.string(),
15
+ }),
16
+ })
17
+ .optional(),
18
+ settled: Total.Settled.optional(),
19
+ });
20
+ function create() {
21
+ return { expected: { net: 0, fee: { other: 0 } } };
8
22
  }
9
- Total.initiate = initiate;
10
- function add(addendee, addend) {
11
- return { amount: Amounts.add(addendee.amount, addend.amount), fee: Fee.add(addendee.fee, addend.fee) };
23
+ Total.create = create;
24
+ function verify(total, type) {
25
+ let result;
26
+ switch (type) {
27
+ case "outcome":
28
+ result = total.outcome?.net == total.expected.net && total.outcome.fee.other == total.expected.fee.other;
29
+ break;
30
+ case "collected":
31
+ result = total.collected?.net == total.outcome?.net && total.collected?.fee.other == total.outcome?.fee.other;
32
+ break;
33
+ case "settled":
34
+ result = total.settled?.net == total.collected?.net;
35
+ break;
36
+ }
37
+ return result;
12
38
  }
13
- Total.add = add;
14
- function compare(expected, outcome) {
15
- return Amounts.compare(expected.amount, outcome.amount) && Amounts.compare(expected.fee.other, outcome.fee.other);
39
+ Total.verify = verify;
40
+ function add(currency, addendee, addend) {
41
+ const result = { ...addendee };
42
+ addend.expected && (result.expected = Amount.add(currency, result.expected, addend.expected));
43
+ if (result.outcome || addend.outcome)
44
+ result.outcome = Amount.add(currency, result.outcome ?? { net: 0, fee: { other: 0 } }, addend.outcome ?? {});
45
+ if (result.collected || addend.collected)
46
+ result.collected = {
47
+ ...Amount.add(currency, result.collected ?? { net: 0, fee: { other: 0 } }, addend.collected ?? {}),
48
+ transactions: {
49
+ net: addend.collected?.transactions.net ?? result.collected?.transactions.net ?? "",
50
+ fee: addend.collected?.transactions.fee ?? result.collected?.transactions.fee ?? "",
51
+ },
52
+ };
53
+ if (result.settled || addend.settled)
54
+ result.settled = {
55
+ net: isoly.Currency.add(currency, result.settled?.net ?? 0, addend.settled?.net ?? 0),
56
+ transactions: (result.settled?.transactions ?? []).concat(addend.settled?.transactions ?? []),
57
+ };
58
+ return result;
16
59
  }
17
- Total.compare = compare;
18
- function from(collect, collected = initiate()) {
19
- let result = collected;
20
- for (const [currency, counterbalance] of Object.entries(collect.counterbalances)) {
21
- for (const [entry, amount] of Object.entries(counterbalance))
22
- if (entry.startsWith("fee"))
23
- result = add(result, initiate({ fee: { other: { [currency]: amount } } }));
24
- else if (entry.startsWith("settle"))
25
- result = add(result, initiate({ amount: { [currency]: amount } }));
60
+ Total.add = add;
61
+ function collect(currency, total, collected, transactions) {
62
+ const result = { ...total };
63
+ if (result.collected) {
64
+ result.collected.net = isoly.Currency.add(currency, result.collected.net, collected.net);
65
+ result.collected.fee.other = isoly.Currency.add(currency, result.collected.fee.other, collected.fee.other);
26
66
  }
67
+ else
68
+ result.collected = { ...collected, transactions };
27
69
  return result;
28
70
  }
29
- Total.from = from;
30
- Total.type = isly.object({ amount: Amounts.type, fee: Fee.type });
31
- Total.is = Total.type.is;
32
- Total.flaw = Total.type.flaw;
71
+ Total.collect = collect;
33
72
  })(Total || (Total = {}));
34
73
  //# sourceMappingURL=Total.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Total.js","sourceRoot":"../","sources":["Settlement/Total.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAM3B,MAAM,KAAW,KAAK,CAwBrB;AAxBD,WAAiB,KAAK;IACrB,SAAgB,QAAQ,CAAC,OAAwB;QAChD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAA;IAC7E,CAAC;IAFe,cAAQ,WAEvB,CAAA;IACD,SAAgB,GAAG,CAAC,QAAe,EAAE,MAAa;QACjD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACvG,CAAC;IAFe,SAAG,MAElB,CAAA;IACD,SAAgB,OAAO,CAAC,QAAe,EAAE,OAAc;QACtD,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAClH,CAAC;IAFe,aAAO,UAEtB,CAAA;IACD,SAAgB,IAAI,CAAC,OAA4B,EAAE,YAAmB,QAAQ,EAAE;QAC/E,IAAI,MAAM,GAAU,SAAS,CAAA;QAC7B,KAAK,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YAClF,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC;gBAC3D,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;oBAC1B,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;qBACtE,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAClC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;QACrE,CAAC;QACD,OAAO,MAAM,CAAA;IACd,CAAC;IAVe,UAAI,OAUnB,CAAA;IACY,UAAI,GAAG,IAAI,CAAC,MAAM,CAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;IAClE,QAAE,GAAG,MAAA,IAAI,CAAC,EAAE,CAAA;IACZ,UAAI,GAAG,MAAA,IAAI,CAAC,IAAI,CAAA;AAC9B,CAAC,EAxBgB,KAAK,KAAL,KAAK,QAwBrB"}
1
+ {"version":3,"file":"Total.js","sourceRoot":"../","sources":["Settlement/Total.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { isoly } from "isoly";
2
+ import { isly } from "isly";
3
+ import type { Collect } from "../Transaction/Collect";
4
+ import { Entry } from "./Entry";
5
+ import { Total } from "./Total";
6
+ export type Totals = Partial<Record<isoly.Currency, Total>>;
7
+ export declare namespace Totals {
8
+ const type: isly.Type<Record<"BTN" | "CHE" | "MKD" | "AED" | "AFN" | "ALL" | "AMD" | "ANG" | "AOA" | "ARS" | "AUD" | "AWG" | "AZN" | "BAM" | "BBD" | "BDT" | "BGN" | "BHD" | "BIF" | "BMD" | "BND" | "BOB" | "BOV" | "BRL" | "BSD" | "BWP" | "BYN" | "BZD" | "CAD" | "CDF" | "CHF" | "CHW" | "CLF" | "CLP" | "CNY" | "COP" | "COU" | "CRC" | "CUC" | "CUP" | "CVE" | "CZK" | "DJF" | "DKK" | "DOP" | "DZD" | "EGP" | "ERN" | "ETB" | "EUR" | "FJD" | "FKP" | "GBP" | "GEL" | "GHS" | "GIP" | "GMD" | "GNF" | "GTQ" | "GYD" | "HKD" | "HNL" | "HRK" | "HTG" | "HUF" | "IDR" | "ILS" | "INR" | "IQD" | "IRR" | "ISK" | "JMD" | "JOD" | "JPY" | "KES" | "KGS" | "KHR" | "KMF" | "KPW" | "KRW" | "KWD" | "KYD" | "KZT" | "LAK" | "LBP" | "LKR" | "LRD" | "LSL" | "LYD" | "MAD" | "MDL" | "MGA" | "MMK" | "MNT" | "MOP" | "MRU" | "MUR" | "MVR" | "MWK" | "MXN" | "MXV" | "MYR" | "MZN" | "NAD" | "NGN" | "NIO" | "NOK" | "NPR" | "NZD" | "OMR" | "PAB" | "PEN" | "PGK" | "PHP" | "PKR" | "PLN" | "PYG" | "QAR" | "RON" | "RSD" | "RUB" | "RWF" | "SAR" | "SBD" | "SCR" | "SDG" | "SEK" | "SGD" | "SHP" | "SLL" | "SOS" | "SRD" | "SSP" | "STN" | "SVC" | "SYP" | "SZL" | "THB" | "TJS" | "TMT" | "TND" | "TOP" | "TRY" | "TTD" | "TWD" | "TZS" | "UAH" | "UGX" | "USD" | "USN" | "UYI" | "UYU" | "UYW" | "UZS" | "VES" | "VND" | "VUV" | "WST" | "XAF" | "XAG" | "XAU" | "XBA" | "XBB" | "XBC" | "XBD" | "XCD" | "XDR" | "XOF" | "XPD" | "XPF" | "XPT" | "XSU" | "XTS" | "XUA" | "XXX" | "YER" | "ZAR" | "ZMW" | "ZWL", Total>>;
9
+ function addEntry(totals: Totals, entry: Entry): Totals;
10
+ function verify(totals: Totals, type: "outcome" | "collected" | "settled"): boolean;
11
+ function add(addendee: Totals, addends: Partial<Record<isoly.Currency, Partial<Total>>>): Totals;
12
+ function collect(totals: Totals, collect: Collect): Totals;
13
+ }
@@ -0,0 +1,48 @@
1
+ import { isoly } from "isoly";
2
+ import { isly } from "isly";
3
+ import { Total } from "./Total";
4
+ export var Totals;
5
+ (function (Totals) {
6
+ Totals.type = isly.record(isly.string(isoly.Currency.types), Total.type);
7
+ function addEntry(totals, entry) {
8
+ const result = { ...totals };
9
+ if (entry.status == "succeeded" && (entry.type == "capture" || entry.type == "refund")) {
10
+ result[entry.amount[0]] = Total.add(entry.amount[0], result[entry.amount[0]] ?? Total.create(), {
11
+ outcome: {
12
+ net: entry.amount[1],
13
+ fee: { other: entry.fee.other[entry.amount[0]] ?? 0 },
14
+ },
15
+ });
16
+ }
17
+ return result;
18
+ }
19
+ Totals.addEntry = addEntry;
20
+ function verify(totals, type) {
21
+ return Object.values(totals).every(t => Total.verify(t, type));
22
+ }
23
+ Totals.verify = verify;
24
+ function add(addendee, addends) {
25
+ const result = { ...addendee };
26
+ for (const [currency, addend] of Object.entries(addends)) {
27
+ result[currency] = Total.add(currency, result[currency] ?? Total.create(), addend);
28
+ }
29
+ return result;
30
+ }
31
+ Totals.add = add;
32
+ function collect(totals, collect) {
33
+ const result = { ...totals };
34
+ for (const [currency, counterbalance] of Object.entries(collect.counterbalances)) {
35
+ const collected = { net: 0, fee: { other: 0 } };
36
+ for (const [entry, amount] of Object.entries(counterbalance)) {
37
+ if (entry.startsWith("fee"))
38
+ collected.fee.other = isoly.Currency.add(currency, collected.fee.other, amount ?? 0);
39
+ else if (entry.startsWith("settle"))
40
+ collected.net = isoly.Currency.add(currency, collected.net, amount ?? 0);
41
+ }
42
+ result[currency] = Total.collect(currency, result[currency] ?? Total.create(), collected, { net: "", fee: "" });
43
+ }
44
+ return result;
45
+ }
46
+ Totals.collect = collect;
47
+ })(Totals || (Totals = {}));
48
+ //# sourceMappingURL=Totals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Totals.js","sourceRoot":"../","sources":["Settlement/Totals.ts"],"names":[],"mappings":"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"}
@@ -1,37 +1,37 @@
1
1
  import { isoly } from "isoly";
2
2
  import { isly } from "isly";
3
- import { Card } from "../Card";
3
+ import { Amounts } from "../Amounts";
4
+ import { Amount as SettlementAmount } from "./Amount";
4
5
  import { Batch as SettlementBatch } from "./Batch";
5
6
  import { Creatable as SettlementCreatable } from "./Creatable";
6
7
  import { Entry as SettlementEntry } from "./Entry";
7
8
  import { Fee as SettlementFee } from "./Fee";
8
- import { Settled as SettlementSettled } from "./Settled";
9
9
  import { Status } from "./Status";
10
10
  import { Total as SettlementTotal } from "./Total";
11
+ import { Totals as SettlementTotals } from "./Totals";
11
12
  export interface Settlement extends Settlement.Creatable {
12
13
  id: string;
13
14
  by?: string;
14
15
  created: isoly.DateTime;
15
16
  status: Status;
16
- collected?: Settlement.Total;
17
- outcome: Settlement.Total;
18
- settled?: Settlement.Settled;
19
17
  entries: Settlement.Entry.Summary;
20
18
  }
21
19
  export declare namespace Settlement {
22
- type Settled = SettlementSettled;
23
- const Settled: typeof SettlementSettled;
24
- const Total: typeof SettlementTotal;
25
- type Total = SettlementTotal;
26
- const Fee: typeof SettlementFee;
27
- type Fee = SettlementFee;
28
- type Creatable = SettlementCreatable;
29
- const Creatable: typeof SettlementCreatable;
30
- type Entry = SettlementEntry;
31
- const Entry: typeof SettlementEntry;
32
- type Batch = SettlementBatch;
33
- const Batch: typeof SettlementBatch;
34
- namespace Entry {
20
+ export const Total: typeof SettlementTotal;
21
+ export type Total = SettlementTotal;
22
+ export const Totals: typeof SettlementTotals;
23
+ export type Totals = SettlementTotals;
24
+ export const Amount: typeof SettlementAmount;
25
+ export type Amount = SettlementAmount;
26
+ export const Fee: typeof SettlementFee;
27
+ export type Fee = SettlementFee;
28
+ export type Creatable = SettlementCreatable;
29
+ export const Creatable: typeof SettlementCreatable;
30
+ export type Entry = SettlementEntry;
31
+ export const Entry: typeof SettlementEntry;
32
+ export type Batch = SettlementBatch;
33
+ export const Batch: typeof SettlementBatch;
34
+ export namespace Entry {
35
35
  type Summary = SettlementEntry.Summary;
36
36
  type Creatable = SettlementEntry.Creatable;
37
37
  type Refund = SettlementEntry.Refund;
@@ -51,11 +51,25 @@ export declare namespace Settlement {
51
51
  type Creatable = SettlementEntry.Unknown.Creatable;
52
52
  }
53
53
  }
54
- function initiate(id: string, by: string, batch: Batch, processor: Card.Stack): Settlement;
55
- function from(id: string, creatable: Settlement.Creatable, by: string): Settlement;
56
- function compile(settlement: Settlement, entries: Settlement.Entry[]): Settlement;
57
- function toFailed(id: string, creatable: Settlement.Creatable, by: string, reason: string): Settlement;
58
- const type: isly.object.ExtendableType<Settlement>;
59
- const is: isly.Type.IsFunction<Settlement>;
60
- const flaw: isly.Type.FlawFunction;
54
+ export function from(creatable: Settlement.Creatable, by: string): Settlement;
55
+ export function compile(settlement: Settlement, entries: Settlement.Entry[]): Settlement;
56
+ type OldTotal = {
57
+ amount: Amounts;
58
+ fee: Fee;
59
+ };
60
+ export type OldSettlement = Omit<Settlement, "totals"> & {
61
+ expected?: OldTotal;
62
+ collected?: OldTotal;
63
+ outcome: OldTotal;
64
+ settled?: {
65
+ paid: Amounts;
66
+ transactions: string[];
67
+ };
68
+ };
69
+ export type MaybeOld = Settlement | OldSettlement;
70
+ export function fromLegacy(settlement: MaybeOld): Settlement;
71
+ export const type: isly.object.ExtendableType<Settlement>;
72
+ export const is: isly.Type.IsFunction<Settlement>;
73
+ export const flaw: isly.Type.FlawFunction;
74
+ export {};
61
75
  }
@@ -1,41 +1,28 @@
1
1
  import { isoly } from "isoly";
2
2
  import { isly } from "isly";
3
3
  import { Identifier } from "../Identifier";
4
+ import { Amount as SettlementAmount } from "./Amount";
4
5
  import { Batch as SettlementBatch } from "./Batch";
5
6
  import { Creatable as SettlementCreatable } from "./Creatable";
6
7
  import { Entry as SettlementEntry } from "./Entry";
7
8
  import { Fee as SettlementFee } from "./Fee";
8
- import { Settled as SettlementSettled } from "./Settled";
9
9
  import { Status } from "./Status";
10
10
  import { Total as SettlementTotal } from "./Total";
11
+ import { Totals as SettlementTotals } from "./Totals";
11
12
  export var Settlement;
12
13
  (function (Settlement) {
13
- Settlement.Settled = SettlementSettled;
14
14
  Settlement.Total = SettlementTotal;
15
+ Settlement.Totals = SettlementTotals;
16
+ Settlement.Amount = SettlementAmount;
15
17
  Settlement.Fee = SettlementFee;
16
18
  Settlement.Creatable = SettlementCreatable;
17
19
  Settlement.Entry = SettlementEntry;
18
20
  Settlement.Batch = SettlementBatch;
19
- function initiate(id, by, batch, processor) {
21
+ function from(creatable, by) {
20
22
  return {
21
- id: id ?? Identifier.generate(),
22
- by,
23
- created: isoly.DateTime.now(),
24
- batch,
25
- processor,
26
- status: { collected: "pending", settled: "pending" },
27
- expected: Settlement.Total.initiate(),
28
- outcome: Settlement.Total.initiate(),
29
- entries: { count: 0 },
30
- };
31
- }
32
- Settlement.initiate = initiate;
33
- function from(id, creatable, by) {
34
- return {
35
- id,
23
+ id: Identifier.generate(),
36
24
  status: { collected: "pending", settled: "pending" },
37
25
  by,
38
- outcome: Settlement.Total.initiate(),
39
26
  ...creatable,
40
27
  created: isoly.DateTime.now(),
41
28
  entries: { count: 0 },
@@ -47,7 +34,7 @@ export var Settlement;
47
34
  for (const entry of entries) {
48
35
  switch (entry.status) {
49
36
  case "succeeded":
50
- result.outcome = Settlement.Total.add(result.outcome, Settlement.Entry.compile(entry));
37
+ result.totals = Settlement.Totals.addEntry(result.totals, entry);
51
38
  result.entries.count++;
52
39
  break;
53
40
  case "failed":
@@ -58,29 +45,44 @@ export var Settlement;
58
45
  return result;
59
46
  }
60
47
  Settlement.compile = compile;
61
- function toFailed(id, creatable, by, reason) {
62
- return {
63
- id,
64
- created: isoly.DateTime.now(),
65
- status: { collected: "failed", settled: "failed" },
66
- by,
67
- processor: creatable.processor,
68
- references: creatable.references,
69
- batch: creatable.batch,
70
- expected: Settlement.Total.initiate(),
71
- outcome: Settlement.Total.initiate(),
72
- entries: { count: 0 },
73
- };
48
+ function fromLegacy(settlement) {
49
+ let result;
50
+ if (!Settlement.is(settlement)) {
51
+ const totalToAmount = (currency, oldTotal) => ({
52
+ net: oldTotal?.amount[currency] ?? 0,
53
+ fee: { other: oldTotal?.fee.other[currency] ?? 0 },
54
+ });
55
+ const { expected, collected, outcome, settled, ...partialSettlement } = settlement;
56
+ const currencies = Array.from(new Set([
57
+ ...Object.keys(expected?.amount ?? {}),
58
+ ...Object.keys(collected?.amount ?? {}),
59
+ ...Object.keys(settled?.paid ?? {}),
60
+ ...Object.keys(outcome.amount),
61
+ ]));
62
+ const totals = currencies.reduce((total, currency) => {
63
+ total[currency] = {
64
+ expected: totalToAmount(currency, expected),
65
+ ...(outcome ? { outcome: totalToAmount(currency, outcome) } : {}),
66
+ ...(collected
67
+ ? { collected: { ...totalToAmount(currency, collected), transactions: { net: "", fee: "" } } }
68
+ : {}),
69
+ ...(settled ? { settled: { net: settled.paid[currency] ?? 0, transactions: settled.transactions } } : {}),
70
+ };
71
+ return total;
72
+ }, {});
73
+ result = { ...partialSettlement, totals };
74
+ }
75
+ else {
76
+ result = settlement;
77
+ }
78
+ return result;
74
79
  }
75
- Settlement.toFailed = toFailed;
80
+ Settlement.fromLegacy = fromLegacy;
76
81
  Settlement.type = SettlementCreatable.type.extend({
77
82
  id: isly.string(),
78
83
  by: isly.string().optional(),
79
84
  created: isly.fromIs("isoly.DateTime", isoly.DateTime.is),
80
85
  status: Status.type,
81
- collected: Settlement.Total.type.optional(),
82
- outcome: Settlement.Total.type,
83
- settled: Settlement.Settled.type.optional(),
84
86
  entries: Settlement.Entry.Summary.type,
85
87
  });
86
88
  Settlement.is = Settlement.type.is;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../","sources":["Settlement/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"../","sources":["Settlement/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pax2pay/model-banking",
3
- "version": "0.1.261",
3
+ "version": "0.1.262",
4
4
  "description": "Library containing data model types and functions for the Pax2Pay Banking API.",
5
5
  "author": "Pax2Pay Ltd",
6
6
  "license": "MIT",
@@ -1,16 +0,0 @@
1
- import { isly } from "isly"
2
- import { Amounts } from "../Amounts"
3
-
4
- export interface Settled {
5
- paid: Amounts
6
- transactions: string[]
7
- }
8
-
9
- export namespace Settled {
10
- export const type = isly.object<Settled>({
11
- paid: Amounts.type,
12
- transactions: isly.string().array(),
13
- })
14
- export const is = type.is
15
- export const flaw = type.flaw
16
- }
@@ -1,11 +0,0 @@
1
- import { isly } from "isly";
2
- import { Amounts } from "../Amounts";
3
- export interface Settled {
4
- paid: Amounts;
5
- transactions: string[];
6
- }
7
- export declare namespace Settled {
8
- const type: isly.object.ExtendableType<Settled>;
9
- const is: isly.Type.IsFunction<Settled>;
10
- const flaw: isly.Type.FlawFunction;
11
- }
@@ -1,12 +0,0 @@
1
- import { isly } from "isly";
2
- import { Amounts } from "../Amounts";
3
- export var Settled;
4
- (function (Settled) {
5
- Settled.type = isly.object({
6
- paid: Amounts.type,
7
- transactions: isly.string().array(),
8
- });
9
- Settled.is = Settled.type.is;
10
- Settled.flaw = Settled.type.flaw;
11
- })(Settled || (Settled = {}));
12
- //# sourceMappingURL=Settled.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Settled.js","sourceRoot":"../","sources":["Settlement/Settled.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAOpC,MAAM,KAAW,OAAO,CAOvB;AAPD,WAAiB,OAAO;IACV,YAAI,GAAG,IAAI,CAAC,MAAM,CAAU;QACxC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;KACnC,CAAC,CAAA;IACW,UAAE,GAAG,QAAA,IAAI,CAAC,EAAE,CAAA;IACZ,YAAI,GAAG,QAAA,IAAI,CAAC,IAAI,CAAA;AAC9B,CAAC,EAPgB,OAAO,KAAP,OAAO,QAOvB"}