bysquare 1.2.2 → 1.2.3
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 +25 -19
- package/lib/generate.d.ts +4 -3
- package/lib/generate.js +30 -15
- package/lib/index.js +5 -1
- package/lib/parse.js +145 -28
- package/lib/types.d.ts +2 -1
- package/lib/types.js +38 -37
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -21,6 +21,10 @@ your implementation. See [examples](examples).
|
|
|
21
21
|
|
|
22
22
|

|
|
23
23
|
|
|
24
|
+
[build]: https://img.shields.io/github/workflow/status/xseman/bysquare/tests
|
|
25
|
+
[version]: https://img.shields.io/npm/v/bysquare
|
|
26
|
+
[license]: https://img.shields.io/github/license/xseman/bysquare
|
|
27
|
+
|
|
24
28
|
## Install
|
|
25
29
|
|
|
26
30
|
Node.js
|
|
@@ -37,7 +41,13 @@ npm install --global bysquare
|
|
|
37
41
|
|
|
38
42
|
## API
|
|
39
43
|
|
|
40
|
-
|
|
44
|
+
```ts
|
|
45
|
+
generate(model: Model): Promise<string>
|
|
46
|
+
parse(qr: string): Promise<Model>
|
|
47
|
+
detect(qr: string): Boolean
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**generate(model: Model): Promise\<string>**
|
|
41
51
|
|
|
42
52
|
```ts
|
|
43
53
|
import { generate, Model, parse } from "bysquare"
|
|
@@ -52,31 +62,29 @@ const model: Model = {
|
|
|
52
62
|
BankAccounts: 1
|
|
53
63
|
}
|
|
54
64
|
|
|
55
|
-
generate(model).then((
|
|
56
|
-
// "0004G0005ES17OQ09C98Q7ME34TCR3V71LVKD2AE6EGHKR82DKS5NBJ3331VUFQIV0JGMR743UJCKSAKEM9QGVVVOIVH000"
|
|
65
|
+
generate(model).then((qr: string) => {
|
|
57
66
|
// your logic...
|
|
58
67
|
})
|
|
59
68
|
```
|
|
60
69
|
|
|
61
|
-
|
|
70
|
+
**parse(qr: string): Promise\<Model>**
|
|
62
71
|
|
|
63
72
|
```ts
|
|
64
73
|
import { Model, parse } from "bysquare"
|
|
65
74
|
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
parse(qrString).then((model: Model) => {
|
|
75
|
+
const qr = "0004A00090IFU27IV0J6HGGLIOTIBVHNQQJQ6LAVGNBT363HR13JC6C75G19O246KTT5G8LTLM67HOIATP4OOG8F8FDLJ6T26KFCB1690NEVPQVSG0"
|
|
76
|
+
parse(qr).then((model: Model) => {
|
|
69
77
|
// your logic...
|
|
70
78
|
})
|
|
71
79
|
```
|
|
72
80
|
|
|
73
|
-
|
|
81
|
+
**detect(qr: string): Boolean**
|
|
74
82
|
|
|
75
83
|
```ts
|
|
76
84
|
import { detect } from "bysquare"
|
|
77
85
|
|
|
78
|
-
const
|
|
79
|
-
const isBysquare = detect(
|
|
86
|
+
const qr = "0004A00090IFU27IV0J6HGGLIOTIBVHNQQJQ6LAVGNBT363HR13JC6C75G19O246KTT5G8LTLM67HOIATP4OOG8F8FDLJ6T26KFCB1690NEVPQVSG0"
|
|
87
|
+
const isBysquare = detect(qr)
|
|
80
88
|
|
|
81
89
|
// your logic...
|
|
82
90
|
```
|
|
@@ -88,6 +96,7 @@ You can use json file with valid model to generate qr-string.
|
|
|
88
96
|
```sh
|
|
89
97
|
# example.json
|
|
90
98
|
# {
|
|
99
|
+
# "InvoiceID: "random-id",
|
|
91
100
|
# "IBAN": "SK9611000000002918599669",
|
|
92
101
|
# "Amount": 100.0,
|
|
93
102
|
# "CurrencyCode": "EUR",
|
|
@@ -98,13 +107,14 @@ You can use json file with valid model to generate qr-string.
|
|
|
98
107
|
# }
|
|
99
108
|
|
|
100
109
|
$ npx bysquare ./example.json
|
|
101
|
-
$
|
|
110
|
+
$ 0004A00090IFU27IV0J6HGGLIOTIBVHNQQJQ6LAVGNBT363HR13JC6C75G19O246KTT5G8LTLM67HOIATP4OOG8F8FDLJ6T26KFCB1690NEVPQVSG0
|
|
102
111
|
```
|
|
103
112
|
|
|
104
113
|
You can also use stdin.
|
|
105
114
|
|
|
106
115
|
```sh
|
|
107
116
|
$ bysquare <<< '{
|
|
117
|
+
"InvoiceID": "random-id",
|
|
108
118
|
"IBAN": "SK9611000000002918599669",
|
|
109
119
|
"Amount": 100.0,
|
|
110
120
|
"CurrencyCode": "EUR",
|
|
@@ -113,7 +123,7 @@ $ bysquare <<< '{
|
|
|
113
123
|
"PaymentOptions": 1,
|
|
114
124
|
"BankAccounts": 1
|
|
115
125
|
}'
|
|
116
|
-
$
|
|
126
|
+
$ 0004A00090IFU27IV0J6HGGLIOTIBVHNQQJQ6LAVGNBT363HR13JC6C75G19O246KTT5G8LTLM67HOIATP4OOG8F8FDLJ6T26KFCB1690NEVPQVSG0
|
|
117
127
|
```
|
|
118
128
|
|
|
119
129
|
## Model
|
|
@@ -155,7 +165,7 @@ $ 0004G0005ES17OQ09C98Q7ME34TCR3V71LVKD2AE6EGHKR82DKS5NBJ3331VUFQIV0JGMR743UJCKS
|
|
|
155
165
|
| BeneficiaryAddressLine1 | `string` | no |
|
|
156
166
|
| BeneficiaryAddressLine2 | `string` | no |
|
|
157
167
|
|
|
158
|
-
##
|
|
168
|
+
## Related
|
|
159
169
|
|
|
160
170
|
- <https://bysquare.com/>
|
|
161
171
|
- <https://devel.cz/otazka/qr-kod-pay-by-square>
|
|
@@ -164,16 +174,12 @@ $ 0004G0005ES17OQ09C98Q7ME34TCR3V71LVKD2AE6EGHKR82DKS5NBJ3331VUFQIV0JGMR743UJCKS
|
|
|
164
174
|
- <https://www.sbaonline.sk/wp-content/uploads/2020/03/pay-by-square-specifications-1_1_0.pdf>
|
|
165
175
|
- <https://www.vutbr.cz/studenti/zav-prace/detail/78439>
|
|
166
176
|
|
|
167
|
-
<!-- Links -->
|
|
168
|
-
|
|
169
|
-
[build]: https://img.shields.io/github/workflow/status/xseman/bysquare/tests
|
|
170
|
-
[version]: https://img.shields.io/npm/v/bysquare
|
|
171
|
-
[license]: https://img.shields.io/github/license/xseman/bysquare
|
|
172
|
-
|
|
173
177
|
<!--
|
|
174
178
|
Versioning
|
|
175
179
|
----------
|
|
176
180
|
|
|
181
|
+
https://github.com/dherges/npm-version-git-flow
|
|
182
|
+
|
|
177
183
|
- Stash unfinished work
|
|
178
184
|
- Run tests and build app
|
|
179
185
|
- Run the `preversion` script
|
package/lib/generate.d.ts
CHANGED
|
@@ -26,9 +26,10 @@ export declare function createChecksum(tabbedInput: string): Buffer;
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function dataWithChecksum(model: Model): Buffer;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* Logic
|
|
30
|
+
* - Order keys by specification
|
|
31
|
+
* - Fill empty values
|
|
32
|
+
* - Transform to tabbed string
|
|
32
33
|
*/
|
|
33
34
|
export declare function createTabbedString(model: Model): string;
|
|
34
35
|
/**
|
package/lib/generate.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -80,26 +84,37 @@ exports.createChecksum = createChecksum;
|
|
|
80
84
|
function dataWithChecksum(model) {
|
|
81
85
|
const tabbedString = createTabbedString(model);
|
|
82
86
|
const checksum = createChecksum(tabbedString);
|
|
83
|
-
|
|
84
|
-
checksum,
|
|
85
|
-
Buffer.from(tabbedString, "utf-8")
|
|
86
|
-
]);
|
|
87
|
-
return merged;
|
|
87
|
+
return Buffer.concat([checksum, Buffer.from(tabbedString, "utf-8")]);
|
|
88
88
|
}
|
|
89
89
|
exports.dataWithChecksum = dataWithChecksum;
|
|
90
90
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
91
|
+
* Logic
|
|
92
|
+
* - Order keys by specification
|
|
93
|
+
* - Fill empty values
|
|
94
|
+
* - Transform to tabbed string
|
|
94
95
|
*/
|
|
95
96
|
function createTabbedString(model) {
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
acc[
|
|
97
|
+
const tabbed = Object.keys(model).reduce((acc, key) => {
|
|
98
|
+
const index = index_1.SequenceOrder[key];
|
|
99
|
+
acc[index] = String(model[key]);
|
|
99
100
|
return acc;
|
|
100
|
-
}, Array(33).fill(
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
}, Array(33).fill(undefined));
|
|
102
|
+
const notStandingOrder = tabbed[14] === undefined;
|
|
103
|
+
const notDirectDebit = tabbed[19] === undefined;
|
|
104
|
+
if (notStandingOrder) {
|
|
105
|
+
tabbed[14] = String(0);
|
|
106
|
+
tabbed.splice(15, 4);
|
|
107
|
+
if (notDirectDebit) {
|
|
108
|
+
tabbed[19 - 4] = String(0);
|
|
109
|
+
tabbed.splice(20 - 4, 10);
|
|
110
|
+
}
|
|
111
|
+
return tabbed.join("\t");
|
|
112
|
+
}
|
|
113
|
+
if (notDirectDebit) {
|
|
114
|
+
tabbed[19] = String(0);
|
|
115
|
+
tabbed.splice(20, 10);
|
|
116
|
+
}
|
|
117
|
+
return tabbed.join("\t");
|
|
103
118
|
}
|
|
104
119
|
exports.createTabbedString = createTabbedString;
|
|
105
120
|
/**
|
package/lib/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
package/lib/parse.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -21,41 +25,144 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
21
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
26
|
exports.detect = exports.inverseAlphanumericConversion = exports.parse = exports.createModel = void 0;
|
|
23
27
|
const lzma = __importStar(require("lzma-native"));
|
|
24
|
-
const _1 = require(".");
|
|
25
28
|
const generate_1 = require("./generate");
|
|
29
|
+
var DecodeSequenceMain;
|
|
30
|
+
(function (DecodeSequenceMain) {
|
|
31
|
+
DecodeSequenceMain[DecodeSequenceMain["InvoiceID"] = 0] = "InvoiceID";
|
|
32
|
+
DecodeSequenceMain[DecodeSequenceMain["Payments"] = 1] = "Payments";
|
|
33
|
+
DecodeSequenceMain[DecodeSequenceMain["PaymentOptions"] = 2] = "PaymentOptions";
|
|
34
|
+
DecodeSequenceMain[DecodeSequenceMain["Amount"] = 3] = "Amount";
|
|
35
|
+
DecodeSequenceMain[DecodeSequenceMain["CurrencyCode"] = 4] = "CurrencyCode";
|
|
36
|
+
DecodeSequenceMain[DecodeSequenceMain["PaymentDueDate"] = 5] = "PaymentDueDate";
|
|
37
|
+
DecodeSequenceMain[DecodeSequenceMain["VariableSymbol"] = 6] = "VariableSymbol";
|
|
38
|
+
DecodeSequenceMain[DecodeSequenceMain["ConstantSymbol"] = 7] = "ConstantSymbol";
|
|
39
|
+
DecodeSequenceMain[DecodeSequenceMain["SpecificSymbol"] = 8] = "SpecificSymbol";
|
|
40
|
+
DecodeSequenceMain[DecodeSequenceMain["OriginatorsReferenceInformation"] = 9] = "OriginatorsReferenceInformation";
|
|
41
|
+
DecodeSequenceMain[DecodeSequenceMain["PaymentNote"] = 10] = "PaymentNote";
|
|
42
|
+
DecodeSequenceMain[DecodeSequenceMain["BankAccounts"] = 11] = "BankAccounts";
|
|
43
|
+
DecodeSequenceMain[DecodeSequenceMain["IBAN"] = 12] = "IBAN";
|
|
44
|
+
DecodeSequenceMain[DecodeSequenceMain["BIC"] = 13] = "BIC";
|
|
45
|
+
DecodeSequenceMain[DecodeSequenceMain["StandingOrderExt"] = 14] = "StandingOrderExt";
|
|
46
|
+
DecodeSequenceMain[DecodeSequenceMain["DirectDebitExt"] = 15] = "DirectDebitExt";
|
|
47
|
+
DecodeSequenceMain[DecodeSequenceMain["BeneficiaryName"] = 16] = "BeneficiaryName";
|
|
48
|
+
DecodeSequenceMain[DecodeSequenceMain["BeneficiaryAddressLine1"] = 17] = "BeneficiaryAddressLine1";
|
|
49
|
+
DecodeSequenceMain[DecodeSequenceMain["BeneficiaryAddressLine2"] = 18] = "BeneficiaryAddressLine2";
|
|
50
|
+
})(DecodeSequenceMain || (DecodeSequenceMain = {}));
|
|
51
|
+
var DecodeSequenceStandingOrder;
|
|
52
|
+
(function (DecodeSequenceStandingOrder) {
|
|
53
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["InvoiceID"] = 0] = "InvoiceID";
|
|
54
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["Payments"] = 1] = "Payments";
|
|
55
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["PaymentOptions"] = 2] = "PaymentOptions";
|
|
56
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["Amount"] = 3] = "Amount";
|
|
57
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["CurrencyCode"] = 4] = "CurrencyCode";
|
|
58
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["PaymentDueDate"] = 5] = "PaymentDueDate";
|
|
59
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["VariableSymbol"] = 6] = "VariableSymbol";
|
|
60
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["ConstantSymbol"] = 7] = "ConstantSymbol";
|
|
61
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["SpecificSymbol"] = 8] = "SpecificSymbol";
|
|
62
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["OriginatorsReferenceInformation"] = 9] = "OriginatorsReferenceInformation";
|
|
63
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["PaymentNote"] = 10] = "PaymentNote";
|
|
64
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["BankAccounts"] = 11] = "BankAccounts";
|
|
65
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["IBAN"] = 12] = "IBAN";
|
|
66
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["BIC"] = 13] = "BIC";
|
|
67
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["StandingOrderExt"] = 14] = "StandingOrderExt";
|
|
68
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["Day"] = 15] = "Day";
|
|
69
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["Month"] = 16] = "Month";
|
|
70
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["Periodicity"] = 17] = "Periodicity";
|
|
71
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["LastDate"] = 18] = "LastDate";
|
|
72
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["DirectDebitExt"] = 19] = "DirectDebitExt";
|
|
73
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["BeneficiaryName"] = 20] = "BeneficiaryName";
|
|
74
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["BeneficiaryAddressLine1"] = 21] = "BeneficiaryAddressLine1";
|
|
75
|
+
DecodeSequenceStandingOrder[DecodeSequenceStandingOrder["BeneficiaryAddressLine2"] = 22] = "BeneficiaryAddressLine2";
|
|
76
|
+
})(DecodeSequenceStandingOrder || (DecodeSequenceStandingOrder = {}));
|
|
77
|
+
var DecodeOrderSequenceDirectDebit;
|
|
78
|
+
(function (DecodeOrderSequenceDirectDebit) {
|
|
79
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["InvoiceID"] = 0] = "InvoiceID";
|
|
80
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["Payments"] = 1] = "Payments";
|
|
81
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["PaymentOptions"] = 2] = "PaymentOptions";
|
|
82
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["Amount"] = 3] = "Amount";
|
|
83
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["CurrencyCode"] = 4] = "CurrencyCode";
|
|
84
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["PaymentDueDate"] = 5] = "PaymentDueDate";
|
|
85
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["VariableSymbol"] = 6] = "VariableSymbol";
|
|
86
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["ConstantSymbol"] = 7] = "ConstantSymbol";
|
|
87
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["SpecificSymbol"] = 8] = "SpecificSymbol";
|
|
88
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["OriginatorsReferenceInformation"] = 9] = "OriginatorsReferenceInformation";
|
|
89
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["PaymentNote"] = 10] = "PaymentNote";
|
|
90
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["BankAccounts"] = 11] = "BankAccounts";
|
|
91
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["IBAN"] = 12] = "IBAN";
|
|
92
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["BIC"] = 13] = "BIC";
|
|
93
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["StandingOrderExt"] = 14] = "StandingOrderExt";
|
|
94
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["DirectDebitExt"] = 15] = "DirectDebitExt";
|
|
95
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["DirectDebitScheme"] = 16] = "DirectDebitScheme";
|
|
96
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["DirectDebitType"] = 17] = "DirectDebitType";
|
|
97
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["VariableSymbol_"] = 18] = "VariableSymbol_";
|
|
98
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["SpecificSymbol_"] = 19] = "SpecificSymbol_";
|
|
99
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["OriginatorsReferenceInformation_"] = 20] = "OriginatorsReferenceInformation_";
|
|
100
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["MandateID"] = 21] = "MandateID";
|
|
101
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["CreditorID"] = 22] = "CreditorID";
|
|
102
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["ContractID"] = 23] = "ContractID";
|
|
103
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["MaxAmount"] = 24] = "MaxAmount";
|
|
104
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["ValidTillDate"] = 25] = "ValidTillDate";
|
|
105
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["BeneficiaryName"] = 26] = "BeneficiaryName";
|
|
106
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["BeneficiaryAddressLine1"] = 27] = "BeneficiaryAddressLine1";
|
|
107
|
+
DecodeOrderSequenceDirectDebit[DecodeOrderSequenceDirectDebit["BeneficiaryAddressLine2"] = 28] = "BeneficiaryAddressLine2";
|
|
108
|
+
})(DecodeOrderSequenceDirectDebit || (DecodeOrderSequenceDirectDebit = {}));
|
|
26
109
|
/**
|
|
27
110
|
* Generating by square Code
|
|
28
111
|
*
|
|
29
112
|
* @see {spec 3.14.}
|
|
30
113
|
*/
|
|
31
114
|
function createModel(tabbedString) {
|
|
32
|
-
const
|
|
115
|
+
const splitted = tabbedString
|
|
33
116
|
.split("\t")
|
|
34
|
-
|
|
35
|
-
.
|
|
36
|
-
|
|
117
|
+
/** The end of the qr-string might contain a NULL-terminated string */
|
|
118
|
+
.map((entry) => entry.replace("\x00", ""));
|
|
119
|
+
/** The model should contain information if it is extended */
|
|
120
|
+
const isStandingOrder = splitted[14] === "1";
|
|
121
|
+
const istDirectDebit = splitted[19] === "1";
|
|
122
|
+
const numericKeys = [
|
|
123
|
+
"Payments",
|
|
124
|
+
"PaymentOptions",
|
|
125
|
+
"Amount",
|
|
126
|
+
"BankAccounts",
|
|
127
|
+
"StandingOrderExt",
|
|
128
|
+
"Day",
|
|
129
|
+
"Month",
|
|
130
|
+
"DirectDebitExt",
|
|
131
|
+
"DirectDebitScheme",
|
|
132
|
+
"DirectDebitType",
|
|
133
|
+
"MaxAmount"
|
|
134
|
+
];
|
|
135
|
+
const model = splitted.reduce((acc, value, i) => {
|
|
37
136
|
if (value === "") {
|
|
38
137
|
return acc;
|
|
39
138
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
139
|
+
if (!isStandingOrder && !istDirectDebit) {
|
|
140
|
+
const key = DecodeSequenceMain[i];
|
|
141
|
+
if (numericKeys.includes(key)) {
|
|
142
|
+
acc[key] = Number(value);
|
|
143
|
+
return acc;
|
|
144
|
+
}
|
|
145
|
+
acc[key] = value;
|
|
146
|
+
return acc;
|
|
147
|
+
}
|
|
148
|
+
if (isStandingOrder) {
|
|
149
|
+
const key = DecodeSequenceStandingOrder[i];
|
|
150
|
+
if (numericKeys.includes(key)) {
|
|
151
|
+
acc[key] = Number(value);
|
|
152
|
+
return acc;
|
|
153
|
+
}
|
|
154
|
+
acc[key] = value;
|
|
155
|
+
return acc;
|
|
156
|
+
}
|
|
157
|
+
if (istDirectDebit) {
|
|
158
|
+
const key = DecodeOrderSequenceDirectDebit[i];
|
|
159
|
+
if (numericKeys.includes(key)) {
|
|
160
|
+
acc[key] = Number(value);
|
|
161
|
+
return acc;
|
|
162
|
+
}
|
|
163
|
+
acc[key] = value;
|
|
55
164
|
return acc;
|
|
56
165
|
}
|
|
57
|
-
acc[key] = value;
|
|
58
|
-
return acc;
|
|
59
166
|
}, {});
|
|
60
167
|
return model;
|
|
61
168
|
}
|
|
@@ -67,8 +174,8 @@ exports.createModel = createModel;
|
|
|
67
174
|
*/
|
|
68
175
|
function parse(qr) {
|
|
69
176
|
const inversed = inverseAlphanumericConversion(qr);
|
|
70
|
-
const
|
|
71
|
-
const
|
|
177
|
+
const _headerBysquare = inversed.slice(0, 2);
|
|
178
|
+
const _headerCompression = inversed.slice(2, 4);
|
|
72
179
|
const compressedData = inversed.slice(4);
|
|
73
180
|
// @ts-ignore: Missing decored types
|
|
74
181
|
const decoder = lzma.createStream("rawDecoder", {
|
|
@@ -112,6 +219,17 @@ function inverseAlphanumericConversion(qr) {
|
|
|
112
219
|
return Buffer.from(bytes);
|
|
113
220
|
}
|
|
114
221
|
exports.inverseAlphanumericConversion = inverseAlphanumericConversion;
|
|
222
|
+
var Version;
|
|
223
|
+
(function (Version) {
|
|
224
|
+
/**
|
|
225
|
+
* Created this document from original by square specifications
|
|
226
|
+
*/
|
|
227
|
+
Version[Version["2013-02-22"] = 0] = "2013-02-22";
|
|
228
|
+
/**
|
|
229
|
+
* Added fields for beneficiary name and address
|
|
230
|
+
*/
|
|
231
|
+
Version[Version["2015-06-24"] = 1] = "2015-06-24";
|
|
232
|
+
})(Version || (Version = {}));
|
|
115
233
|
/**
|
|
116
234
|
* Simple binary header detector
|
|
117
235
|
*
|
|
@@ -127,9 +245,8 @@ function detect(qr) {
|
|
|
127
245
|
return [...headerBysquare.toString("hex")]
|
|
128
246
|
.map((nibble) => parseInt(nibble, 16))
|
|
129
247
|
.every((nibble, index) => {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return nibble <= 2;
|
|
248
|
+
if (index === 1 /** version */) {
|
|
249
|
+
return 0 >= nibble && nibble <= 1;
|
|
133
250
|
}
|
|
134
251
|
return 0 <= nibble && nibble <= 15;
|
|
135
252
|
});
|
package/lib/types.d.ts
CHANGED
|
@@ -184,9 +184,10 @@ export interface Model {
|
|
|
184
184
|
/**
|
|
185
185
|
* Atributes must follow specific order
|
|
186
186
|
* Based on Table 15. PAY by square sequence data model (page 30.)
|
|
187
|
+
*
|
|
187
188
|
* @see{./docs/specification_v1.1.0.pdf}
|
|
188
189
|
*/
|
|
189
|
-
export declare enum
|
|
190
|
+
export declare enum SequenceOrder {
|
|
190
191
|
InvoiceID = 0,
|
|
191
192
|
Payments = 1,
|
|
192
193
|
PaymentOptions = 2,
|
package/lib/types.js
CHANGED
|
@@ -1,47 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CurrencyCode = exports.
|
|
3
|
+
exports.CurrencyCode = exports.SequenceOrder = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Atributes must follow specific order
|
|
6
6
|
* Based on Table 15. PAY by square sequence data model (page 30.)
|
|
7
|
+
*
|
|
7
8
|
* @see{./docs/specification_v1.1.0.pdf}
|
|
8
9
|
*/
|
|
9
|
-
var
|
|
10
|
-
(function (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
})(
|
|
10
|
+
var SequenceOrder;
|
|
11
|
+
(function (SequenceOrder) {
|
|
12
|
+
SequenceOrder[SequenceOrder["InvoiceID"] = 0] = "InvoiceID";
|
|
13
|
+
SequenceOrder[SequenceOrder["Payments"] = 1] = "Payments";
|
|
14
|
+
SequenceOrder[SequenceOrder["PaymentOptions"] = 2] = "PaymentOptions";
|
|
15
|
+
SequenceOrder[SequenceOrder["Amount"] = 3] = "Amount";
|
|
16
|
+
SequenceOrder[SequenceOrder["CurrencyCode"] = 4] = "CurrencyCode";
|
|
17
|
+
SequenceOrder[SequenceOrder["PaymentDueDate"] = 5] = "PaymentDueDate";
|
|
18
|
+
SequenceOrder[SequenceOrder["VariableSymbol"] = 6] = "VariableSymbol";
|
|
19
|
+
SequenceOrder[SequenceOrder["ConstantSymbol"] = 7] = "ConstantSymbol";
|
|
20
|
+
SequenceOrder[SequenceOrder["SpecificSymbol"] = 8] = "SpecificSymbol";
|
|
21
|
+
SequenceOrder[SequenceOrder["OriginatorsReferenceInformation"] = 9] = "OriginatorsReferenceInformation";
|
|
22
|
+
SequenceOrder[SequenceOrder["PaymentNote"] = 10] = "PaymentNote";
|
|
23
|
+
SequenceOrder[SequenceOrder["BankAccounts"] = 11] = "BankAccounts";
|
|
24
|
+
SequenceOrder[SequenceOrder["IBAN"] = 12] = "IBAN";
|
|
25
|
+
SequenceOrder[SequenceOrder["BIC"] = 13] = "BIC";
|
|
26
|
+
SequenceOrder[SequenceOrder["StandingOrderExt"] = 14] = "StandingOrderExt";
|
|
27
|
+
SequenceOrder[SequenceOrder["Day"] = 15] = "Day";
|
|
28
|
+
SequenceOrder[SequenceOrder["Month"] = 16] = "Month";
|
|
29
|
+
SequenceOrder[SequenceOrder["Periodicity"] = 17] = "Periodicity";
|
|
30
|
+
SequenceOrder[SequenceOrder["LastDate"] = 18] = "LastDate";
|
|
31
|
+
SequenceOrder[SequenceOrder["DirectDebitExt"] = 19] = "DirectDebitExt";
|
|
32
|
+
SequenceOrder[SequenceOrder["DirectDebitScheme"] = 20] = "DirectDebitScheme";
|
|
33
|
+
SequenceOrder[SequenceOrder["DirectDebitType"] = 21] = "DirectDebitType";
|
|
34
|
+
SequenceOrder[SequenceOrder["VariableSymbol_"] = 22] = "VariableSymbol_";
|
|
35
|
+
SequenceOrder[SequenceOrder["SpecificSymbol_"] = 23] = "SpecificSymbol_";
|
|
36
|
+
SequenceOrder[SequenceOrder["OriginatorsReferenceInformation_"] = 24] = "OriginatorsReferenceInformation_";
|
|
37
|
+
SequenceOrder[SequenceOrder["MandateID"] = 25] = "MandateID";
|
|
38
|
+
SequenceOrder[SequenceOrder["CreditorID"] = 26] = "CreditorID";
|
|
39
|
+
SequenceOrder[SequenceOrder["ContractID"] = 27] = "ContractID";
|
|
40
|
+
SequenceOrder[SequenceOrder["MaxAmount"] = 28] = "MaxAmount";
|
|
41
|
+
SequenceOrder[SequenceOrder["ValidTillDate"] = 29] = "ValidTillDate";
|
|
42
|
+
SequenceOrder[SequenceOrder["BeneficiaryName"] = 30] = "BeneficiaryName";
|
|
43
|
+
SequenceOrder[SequenceOrder["BeneficiaryAddressLine1"] = 31] = "BeneficiaryAddressLine1";
|
|
44
|
+
SequenceOrder[SequenceOrder["BeneficiaryAddressLine2"] = 32] = "BeneficiaryAddressLine2";
|
|
45
|
+
})(SequenceOrder = exports.SequenceOrder || (exports.SequenceOrder = {}));
|
|
45
46
|
/**
|
|
46
47
|
* Currency codes based on ISO 4217
|
|
47
48
|
*/
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bysquare",
|
|
3
3
|
"description": "It's a national standard for payment QR codes adopted by Slovak Banking Association (SBA)",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.3",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Filip Seman <filip.seman@protonmail.com>",
|
|
7
7
|
"keywords": [
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/lzma-native": "^4.0.1",
|
|
41
|
-
"@types/node": ">=
|
|
42
|
-
"typescript": "4.
|
|
41
|
+
"@types/node": ">=14",
|
|
42
|
+
"typescript": "~4.7.0",
|
|
43
43
|
"vitest": "0.22.0"
|
|
44
44
|
},
|
|
45
45
|
"files": [
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"main": "lib/index.js",
|
|
51
51
|
"types": "lib/index.d.ts",
|
|
52
52
|
"engines": {
|
|
53
|
-
"node": ">=14
|
|
54
|
-
"npm": ">=
|
|
53
|
+
"node": ">=14",
|
|
54
|
+
"npm": ">=7.0"
|
|
55
55
|
},
|
|
56
56
|
"os": [
|
|
57
57
|
"darwin",
|