@pax2pay/model-banking 0.1.207 → 0.1.209

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.
@@ -9,7 +9,7 @@ import { Fee } from "../Fee"
9
9
  export interface Refund extends Refund.Creatable {
10
10
  status: "succeeded" | "failed"
11
11
  reason?: string
12
- transaction?: string
12
+ transaction?: Transaction
13
13
  }
14
14
 
15
15
  export namespace Refund {
@@ -25,7 +25,7 @@ export namespace Refund {
25
25
  amount: Amount
26
26
  }
27
27
  export function from(refund: Refund.Creatable, transaction: Transaction): Refund {
28
- return { ...refund, status: "succeeded", transaction: transaction.id }
28
+ return { ...refund, status: "succeeded", transaction }
29
29
  }
30
30
  export namespace Creatable {
31
31
  export const type = isly.object<Creatable>({
@@ -45,7 +45,7 @@ export namespace Refund {
45
45
  export const type = Creatable.type.extend<Refund>({
46
46
  status: isly.string(["succeeded", "failed"]),
47
47
  reason: isly.string().optional(),
48
- transaction: isly.string().optional(),
48
+ transaction: Transaction.type.optional(),
49
49
  })
50
50
  export const is = type.is
51
51
  export const flaw = type.flaw
@@ -42,7 +42,7 @@ export namespace Entry {
42
42
  ? Total.initiate()
43
43
  : Total.initiate({ amount: Amount.toAmounts(entry.amount), fee: entry.fee })
44
44
  }
45
- export function from(creatable: Entry.Creatable, transaction?: Transaction | gracely.Error): Entry {
45
+ export function from(creatable: Entry.Creatable, transaction: Transaction | gracely.Error | string): Entry {
46
46
  let result: Entry
47
47
  if (!Transaction.is(transaction) || transaction.status != "finalized")
48
48
  result = {
@@ -65,11 +65,17 @@ export namespace Entry {
65
65
  }
66
66
  return result
67
67
  }
68
- function reason(creatable: Entry.Creatable, transaction?: Transaction | gracely.Error): string {
68
+ function reason(creatable: Entry.Creatable, transaction: Transaction | gracely.Error | string): string {
69
69
  const result = []
70
70
  !creatable.authorization && result.push("Missing authorization.")
71
- !transaction && result.push("Missing transaction.")
72
- gracely.Error.is(transaction) && result.push(`${transaction.status}: ${transaction.type}`)
71
+ if (gracely.Error.is(transaction))
72
+ result.push(
73
+ `gracely error: ${transaction.status}, ${transaction.type}, ${transaction.header}, ${transaction.body}`
74
+ )
75
+ else if (typeof transaction != "string")
76
+ result.push(`Transaction ${transaction.id} on account ${transaction.accountId} unable to be finalized.`)
77
+ else
78
+ result.push(transaction || "No reason provided")
73
79
  return result.join("\n")
74
80
  }
75
81
  export const type = isly.union<Entry, Entry.Cancel, Entry.Capture, Entry.Refund, Entry.Unknown>(
@@ -8,7 +8,7 @@ import { Fee } from "../Fee";
8
8
  export interface Refund extends Refund.Creatable {
9
9
  status: "succeeded" | "failed";
10
10
  reason?: string;
11
- transaction?: string;
11
+ transaction?: Transaction;
12
12
  }
13
13
  export declare namespace Refund {
14
14
  interface Creatable {
@@ -2,12 +2,13 @@ import { isly } from "isly";
2
2
  import { Acquirer } from "../../Acquirer";
3
3
  import { Amount } from "../../Amount";
4
4
  import { Merchant } from "../../Merchant";
5
+ import { Transaction } from "../../Transaction";
5
6
  import { Batch } from "../Batch";
6
7
  import { Fee } from "../Fee";
7
8
  export var Refund;
8
9
  (function (Refund) {
9
10
  function from(refund, transaction) {
10
- return { ...refund, status: "succeeded", transaction: transaction.id };
11
+ return { ...refund, status: "succeeded", transaction };
11
12
  }
12
13
  Refund.from = from;
13
14
  let Creatable;
@@ -29,7 +30,7 @@ export var Refund;
29
30
  Refund.type = Creatable.type.extend({
30
31
  status: isly.string(["succeeded", "failed"]),
31
32
  reason: isly.string().optional(),
32
- transaction: isly.string().optional(),
33
+ transaction: Transaction.type.optional(),
33
34
  });
34
35
  Refund.is = Refund.type.is;
35
36
  Refund.flaw = Refund.type.flaw;
@@ -1 +1 @@
1
- {"version":3,"file":"Refund.js","sourceRoot":"../","sources":["Settlement/Entry/Refund.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAQ5B,MAAM,KAAW,MAAM,CAqCtB;AArCD,WAAiB,MAAM;IAYtB,SAAgB,IAAI,CAAC,MAAwB,EAAE,WAAwB;QACtE,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,CAAA;IACvE,CAAC;IAFe,WAAI,OAEnB,CAAA;IACD,IAAiB,SAAS,CAczB;IAdD,WAAiB,SAAS;QACZ,cAAI,GAAG,IAAI,CAAC,MAAM,CAAY;YAC1C,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;YACnB,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACvC,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE;YACxB,GAAG,EAAE,GAAG,CAAC,IAAI;YACb,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,KAAK,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAA;QACW,YAAE,GAAG,UAAA,IAAI,CAAC,EAAE,CAAA;QACZ,cAAI,GAAG,UAAA,IAAI,CAAC,IAAI,CAAA;IAC9B,CAAC,EAdgB,SAAS,GAAT,gBAAS,KAAT,gBAAS,QAczB;IACY,WAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAS;QACjD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACrC,CAAC,CAAA;IACW,SAAE,GAAG,OAAA,IAAI,CAAC,EAAE,CAAA;IACZ,WAAI,GAAG,OAAA,IAAI,CAAC,IAAI,CAAA;AAC9B,CAAC,EArCgB,MAAM,KAAN,MAAM,QAqCtB"}
1
+ {"version":3,"file":"Refund.js","sourceRoot":"../","sources":["Settlement/Entry/Refund.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAQ5B,MAAM,KAAW,MAAM,CAqCtB;AArCD,WAAiB,MAAM;IAYtB,SAAgB,IAAI,CAAC,MAAwB,EAAE,WAAwB;QACtE,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,CAAA;IACvD,CAAC;IAFe,WAAI,OAEnB,CAAA;IACD,IAAiB,SAAS,CAczB;IAdD,WAAiB,SAAS;QACZ,cAAI,GAAG,IAAI,CAAC,MAAM,CAAY;YAC1C,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3B,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;YACnB,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACvC,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE;YACxB,GAAG,EAAE,GAAG,CAAC,IAAI;YACb,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,KAAK,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAA;QACW,YAAE,GAAG,UAAA,IAAI,CAAC,EAAE,CAAA;QACZ,cAAI,GAAG,UAAA,IAAI,CAAC,IAAI,CAAA;IAC9B,CAAC,EAdgB,SAAS,GAAT,gBAAS,KAAT,gBAAS,QAczB;IACY,WAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAS;QACjD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE;KACxC,CAAC,CAAA;IACW,SAAE,GAAG,OAAA,IAAI,CAAC,EAAE,CAAA;IACZ,WAAI,GAAG,OAAA,IAAI,CAAC,IAAI,CAAA;AAC9B,CAAC,EArCgB,MAAM,KAAN,MAAM,QAqCtB"}
@@ -35,7 +35,7 @@ export declare namespace Entry {
35
35
  type Creatable = EntryCreatable;
36
36
  const Creatable: typeof EntryCreatable;
37
37
  function compile(entry: Entry): Total;
38
- function from(creatable: Entry.Creatable, transaction?: Transaction | gracely.Error): Entry;
38
+ function from(creatable: Entry.Creatable, transaction: Transaction | gracely.Error | string): Entry;
39
39
  const type: isly.Type<Entry>;
40
40
  const is: isly.Type.IsFunction<Entry>;
41
41
  const flaw: isly.Type.FlawFunction;
@@ -50,8 +50,12 @@ export var Entry;
50
50
  function reason(creatable, transaction) {
51
51
  const result = [];
52
52
  !creatable.authorization && result.push("Missing authorization.");
53
- !transaction && result.push("Missing transaction.");
54
- gracely.Error.is(transaction) && result.push(`${transaction.status}: ${transaction.type}`);
53
+ if (gracely.Error.is(transaction))
54
+ result.push(`gracely error: ${transaction.status}, ${transaction.type}, ${transaction.header}, ${transaction.body}`);
55
+ else if (typeof transaction != "string")
56
+ result.push(`Transaction ${transaction.id} on account ${transaction.accountId} unable to be finalized.`);
57
+ else
58
+ result.push(transaction || "No reason provided");
55
59
  return result.join("\n");
56
60
  }
57
61
  Entry.type = isly.union(Entry.Cancel.type, Entry.Capture.type, Entry.Refund.type, Entry.Unknown.type);
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pax2pay/model-banking",
3
- "version": "0.1.207",
3
+ "version": "0.1.209",
4
4
  "description": "Library containing data model types and functions for the Pax2Pay Banking API.",
5
5
  "author": "Pax2Pay Ltd",
6
6
  "license": "MIT",