@equt/clis 0.1.5 → 0.1.7
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/bookkeeping/commands/sms-parse.d.ts +3 -0
- package/dist/bookkeeping/commands/sms-parse.d.ts.map +1 -0
- package/dist/bookkeeping/commands/sms-parse.js +111 -0
- package/dist/bookkeeping/commands/sms-parse.js.map +1 -0
- package/dist/bookkeeping/index.js +2 -0
- package/dist/bookkeeping/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sms-parse.d.ts","sourceRoot":"","sources":["../../../src/bookkeeping/commands/sms-parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqFxC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+CvD"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import process from 'node:process';
|
|
3
|
+
const RE_BOC = /信用卡(\d+)于[^在]+在([^消]+)消费(RMB|USD|JPY|人民币)([0-9,]+(?:\.\d+)?)元/;
|
|
4
|
+
const RE_SPDB = /转入([0-9,]+(?:\.\d+)?)元\[(工资|其他代发)\]/;
|
|
5
|
+
const RE_CMB = /您账户(\d+)于[^信]+信用卡还款交易人民币([0-9,]+(?:\.\d+)?)/;
|
|
6
|
+
const RE_BOS = /本期贷款已足额归还,当期还款本息合计([0-9,]+(?:\.\d+)?)元/;
|
|
7
|
+
const RE_COMMA = /,/g;
|
|
8
|
+
function normalizeCurrency(raw) {
|
|
9
|
+
if (raw === 'RMB' || raw === '人民币')
|
|
10
|
+
return 'CNY';
|
|
11
|
+
return raw;
|
|
12
|
+
}
|
|
13
|
+
function parseAmount(raw) {
|
|
14
|
+
return Number.parseFloat(raw.replace(RE_COMMA, ''));
|
|
15
|
+
}
|
|
16
|
+
function extractDate(createdAt) {
|
|
17
|
+
return createdAt.slice(0, 10);
|
|
18
|
+
}
|
|
19
|
+
function parse95566(text, createdAt) {
|
|
20
|
+
if (text.includes('交易失败'))
|
|
21
|
+
return null;
|
|
22
|
+
const m = RE_BOC.exec(text);
|
|
23
|
+
if (!m)
|
|
24
|
+
return null;
|
|
25
|
+
return {
|
|
26
|
+
date: extractDate(createdAt),
|
|
27
|
+
account: `BOC ${m[1]}`,
|
|
28
|
+
currency: normalizeCurrency(m[3]),
|
|
29
|
+
amount: parseAmount(m[4]),
|
|
30
|
+
merchant: m[2].trim(),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function parse95528(text, createdAt) {
|
|
34
|
+
const m = RE_SPDB.exec(text);
|
|
35
|
+
if (!m)
|
|
36
|
+
return null;
|
|
37
|
+
return {
|
|
38
|
+
date: extractDate(createdAt),
|
|
39
|
+
account: 'SPDB 6587',
|
|
40
|
+
currency: 'CNY',
|
|
41
|
+
amount: parseAmount(m[1]),
|
|
42
|
+
label: m[2],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function parse95555(text, createdAt) {
|
|
46
|
+
const m = RE_CMB.exec(text);
|
|
47
|
+
if (!m)
|
|
48
|
+
return null;
|
|
49
|
+
return {
|
|
50
|
+
date: extractDate(createdAt),
|
|
51
|
+
account: `CMB ${m[1]}`,
|
|
52
|
+
currency: 'CNY',
|
|
53
|
+
amount: parseAmount(m[2]),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function parse95594(text, createdAt) {
|
|
57
|
+
const m = RE_BOS.exec(text);
|
|
58
|
+
if (!m)
|
|
59
|
+
return null;
|
|
60
|
+
return {
|
|
61
|
+
date: extractDate(createdAt),
|
|
62
|
+
account: 'BOSC 5571',
|
|
63
|
+
currency: 'CNY',
|
|
64
|
+
amount: parseAmount(m[1]),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function registerSmsParse(program) {
|
|
68
|
+
program
|
|
69
|
+
.command('sms-parse')
|
|
70
|
+
.description('Parse a bank SMS from stdin into a structured transaction')
|
|
71
|
+
.action(() => {
|
|
72
|
+
let raw;
|
|
73
|
+
try {
|
|
74
|
+
raw = fs.readFileSync(0, 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
process.exit(0);
|
|
78
|
+
}
|
|
79
|
+
let msg;
|
|
80
|
+
try {
|
|
81
|
+
msg = JSON.parse(raw);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
const { sender, text, created_at: createdAt } = msg;
|
|
87
|
+
if (!sender || !text || !createdAt)
|
|
88
|
+
process.exit(0);
|
|
89
|
+
let result = null;
|
|
90
|
+
switch (sender) {
|
|
91
|
+
case '95566':
|
|
92
|
+
result = parse95566(text, createdAt);
|
|
93
|
+
break;
|
|
94
|
+
case '95528':
|
|
95
|
+
result = parse95528(text, createdAt);
|
|
96
|
+
break;
|
|
97
|
+
case '95555':
|
|
98
|
+
result = parse95555(text, createdAt);
|
|
99
|
+
break;
|
|
100
|
+
case '95594':
|
|
101
|
+
result = parse95594(text, createdAt);
|
|
102
|
+
break;
|
|
103
|
+
default:
|
|
104
|
+
result = null;
|
|
105
|
+
}
|
|
106
|
+
if (result === null)
|
|
107
|
+
process.exit(0);
|
|
108
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=sms-parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sms-parse.js","sourceRoot":"","sources":["../../../src/bookkeeping/commands/sms-parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { registerCurrencies } from './commands/currencies.js';
|
|
|
7
7
|
import { registerJournalInspect } from './commands/journal-inspect.js';
|
|
8
8
|
import { registerJournals } from './commands/journals.js';
|
|
9
9
|
import { registerLineAdd } from './commands/line-add.js';
|
|
10
|
+
import { registerSmsParse } from './commands/sms-parse.js';
|
|
10
11
|
import { registerUnitPrice } from './commands/unit-price.js';
|
|
11
12
|
program
|
|
12
13
|
.name('bookkeeping')
|
|
@@ -18,6 +19,7 @@ registerJournals(program);
|
|
|
18
19
|
registerJournalInspect(program);
|
|
19
20
|
registerLineAdd(program);
|
|
20
21
|
registerUnitPrice(program);
|
|
22
|
+
registerSmsParse(program);
|
|
21
23
|
program.parseAsync(process.argv).catch((err) => {
|
|
22
24
|
if (APIResponseError.isAPIResponseError(err)) {
|
|
23
25
|
console.error(`Notion API error ${err.status}: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bookkeeping/index.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAA;AAE7D,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACzB,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACzB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,eAAe,CAAC,OAAO,CAAC,CAAA;AACxB,iBAAiB,CAAC,OAAO,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bookkeeping/index.ts"],"names":[],"mappings":";AACA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC,CAAA;AAE7D,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACzB,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,gBAAgB,CAAC,OAAO,CAAC,CAAA;AACzB,sBAAsB,CAAC,OAAO,CAAC,CAAA;AAC/B,eAAe,CAAC,OAAO,CAAC,CAAA;AACxB,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC1B,gBAAgB,CAAC,OAAO,CAAC,CAAA;AAEzB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,IAAI,gBAAgB,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IACjE,CAAC;SACI,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;SACI,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|