cata-centavo 0.1.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/LICENSE +21 -0
- package/README.md +159 -0
- package/dist/bin/cata-centavo.js +226 -0
- package/dist/bin/cata-centavo.js.map +1 -0
- package/dist/cli/dispatch.js +67 -0
- package/dist/cli/dispatch.js.map +1 -0
- package/dist/cli/doctor.js +178 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/init.js +125 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/progress.js +85 -0
- package/dist/cli/progress.js.map +1 -0
- package/dist/cli/sync.js +26 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/config.js +119 -0
- package/dist/config.js.map +1 -0
- package/dist/core/account.js +12 -0
- package/dist/core/account.js.map +1 -0
- package/dist/core/accounts.js +91 -0
- package/dist/core/accounts.js.map +1 -0
- package/dist/core/aggregate.js +83 -0
- package/dist/core/aggregate.js.map +1 -0
- package/dist/core/balance.js +68 -0
- package/dist/core/balance.js.map +1 -0
- package/dist/core/bill-rows.js +132 -0
- package/dist/core/bill-rows.js.map +1 -0
- package/dist/core/bill.js +103 -0
- package/dist/core/bill.js.map +1 -0
- package/dist/core/category-source.js +26 -0
- package/dist/core/category-source.js.map +1 -0
- package/dist/core/category.js +72 -0
- package/dist/core/category.js.map +1 -0
- package/dist/core/consent.js +19 -0
- package/dist/core/consent.js.map +1 -0
- package/dist/core/contracts.js +9 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/counterparty.js +69 -0
- package/dist/core/counterparty.js.map +1 -0
- package/dist/core/date.js +25 -0
- package/dist/core/date.js.map +1 -0
- package/dist/core/description.js +58 -0
- package/dist/core/description.js.map +1 -0
- package/dist/core/diagnose.js +32 -0
- package/dist/core/diagnose.js.map +1 -0
- package/dist/core/mcc.js +124 -0
- package/dist/core/mcc.js.map +1 -0
- package/dist/core/refresh.js +142 -0
- package/dist/core/refresh.js.map +1 -0
- package/dist/core/self-transfer.js +22 -0
- package/dist/core/self-transfer.js.map +1 -0
- package/dist/core/taxonomy-tree.js +148 -0
- package/dist/core/taxonomy-tree.js.map +1 -0
- package/dist/core/taxonomy.js +70 -0
- package/dist/core/taxonomy.js.map +1 -0
- package/dist/core/transaction.js +2 -0
- package/dist/core/transaction.js.map +1 -0
- package/dist/core/transactions.js +46 -0
- package/dist/core/transactions.js.map +1 -0
- package/dist/logging.js +93 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp/cursor.js +64 -0
- package/dist/mcp/cursor.js.map +1 -0
- package/dist/mcp/format.js +38 -0
- package/dist/mcp/format.js.map +1 -0
- package/dist/mcp/server.js +50 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/source.js +2 -0
- package/dist/mcp/source.js.map +1 -0
- package/dist/mcp/tools/accounts.js +144 -0
- package/dist/mcp/tools/accounts.js.map +1 -0
- package/dist/mcp/tools/balance.js +96 -0
- package/dist/mcp/tools/balance.js.map +1 -0
- package/dist/mcp/tools/bill-summary-format.js +161 -0
- package/dist/mcp/tools/bill-summary-format.js.map +1 -0
- package/dist/mcp/tools/bill-summary.js +105 -0
- package/dist/mcp/tools/bill-summary.js.map +1 -0
- package/dist/mcp/tools/bills.js +144 -0
- package/dist/mcp/tools/bills.js.map +1 -0
- package/dist/mcp/tools/closing-days.js +90 -0
- package/dist/mcp/tools/closing-days.js.map +1 -0
- package/dist/mcp/tools/list-transactions.js +122 -0
- package/dist/mcp/tools/list-transactions.js.map +1 -0
- package/dist/mcp/tools/result.js +12 -0
- package/dist/mcp/tools/result.js.map +1 -0
- package/dist/mcp/tools/set-category.js +74 -0
- package/dist/mcp/tools/set-category.js.map +1 -0
- package/dist/mcp/tools/sources.js +73 -0
- package/dist/mcp/tools/sources.js.map +1 -0
- package/dist/mcp/tools/transaction-details.js +146 -0
- package/dist/mcp/tools/transaction-details.js.map +1 -0
- package/dist/mcp/tools/transaction-input.js +51 -0
- package/dist/mcp/tools/transaction-input.js.map +1 -0
- package/dist/mcp/tools/transactions.js +186 -0
- package/dist/mcp/tools/transactions.js.map +1 -0
- package/dist/pluggy/client.js +123 -0
- package/dist/pluggy/client.js.map +1 -0
- package/dist/pluggy/errors.js +152 -0
- package/dist/pluggy/errors.js.map +1 -0
- package/dist/pluggy/mapper.js +155 -0
- package/dist/pluggy/mapper.js.map +1 -0
- package/dist/pluggy/money.js +53 -0
- package/dist/pluggy/money.js.map +1 -0
- package/dist/pluggy/transaction-mapper.js +124 -0
- package/dist/pluggy/transaction-mapper.js.map +1 -0
- package/dist/pluggy/transport.js +170 -0
- package/dist/pluggy/transport.js.map +1 -0
- package/dist/pluggy/wire.js +207 -0
- package/dist/pluggy/wire.js.map +1 -0
- package/dist/storage/categories.js +101 -0
- package/dist/storage/categories.js.map +1 -0
- package/dist/storage/category-sql.js +37 -0
- package/dist/storage/category-sql.js.map +1 -0
- package/dist/storage/closing-days.js +27 -0
- package/dist/storage/closing-days.js.map +1 -0
- package/dist/storage/db.js +162 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/diagnostics.js +57 -0
- package/dist/storage/diagnostics.js.map +1 -0
- package/dist/storage/harvest.js +87 -0
- package/dist/storage/harvest.js.map +1 -0
- package/dist/storage/migrations.js +125 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/transaction-row.js +74 -0
- package/dist/storage/transaction-row.js.map +1 -0
- package/dist/storage/transactions.js +213 -0
- package/dist/storage/transactions.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { consentState } from "./consent.js";
|
|
2
|
+
/**
|
|
3
|
+
* The connection status and the consent behind it, for every configured id.
|
|
4
|
+
*
|
|
5
|
+
* The two requests per connection fire together and settle independently: a
|
|
6
|
+
* consent lookup that fails must not take the item status with it, and the
|
|
7
|
+
* reverse holds too. One bad id does not abort the rest, and output order
|
|
8
|
+
* follows `connectionIds` so the report lines up with what the user
|
|
9
|
+
* configured.
|
|
10
|
+
*/
|
|
11
|
+
export async function diagnose(bank, connectionIds, toFailure, clock) {
|
|
12
|
+
return Promise.all(connectionIds.map((id) => diagnoseOne(bank, id, toFailure, clock)));
|
|
13
|
+
}
|
|
14
|
+
async function diagnoseOne(bank, id, toFailure, clock) {
|
|
15
|
+
const [connectionResult, consentResult] = await Promise.allSettled([bank.getConnection(id), bank.getConsent(id)]);
|
|
16
|
+
const { connection, failure } = readConnection(connectionResult, toFailure);
|
|
17
|
+
const consent = readConsent(consentResult);
|
|
18
|
+
return { id, connection, failure, consent, state: consentState(consent, clock.now()) };
|
|
19
|
+
}
|
|
20
|
+
function readConnection(result, toFailure) {
|
|
21
|
+
if (result.status === "fulfilled") {
|
|
22
|
+
return { connection: result.value, failure: null };
|
|
23
|
+
}
|
|
24
|
+
return { connection: null, failure: toFailure(result.reason) };
|
|
25
|
+
}
|
|
26
|
+
function readConsent(result) {
|
|
27
|
+
if (result.status === "fulfilled") {
|
|
28
|
+
return result.value;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/core/diagnose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,cAAc,CAAC;AAW/D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAU,EACV,aAAgC,EAChC,SAA0C,EAC1C,KAAY;IAEZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAU,EACV,EAAU,EACV,SAA0C,EAC1C,KAAY;IAEZ,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAElH,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;IAE3C,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,cAAc,CACrB,MAAwC,EACxC,SAA0C;IAE1C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,WAAW,CAAC,MAA4C;IAC/D,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/core/mcc.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { CATEGORIES } from "./category.js";
|
|
2
|
+
/**
|
|
3
|
+
* ISO 18245 merchant category code → category, for the codes that show up in
|
|
4
|
+
* real statements. ADR §12.4 step 3 asks for exactly this and says so: cover
|
|
5
|
+
* "the codes that actually show up in real statements. All 1000 are not needed
|
|
6
|
+
* up front." This table is the reason the mapping waited for data.
|
|
7
|
+
*
|
|
8
|
+
* The signal matters because the free tier is expected to stop returning
|
|
9
|
+
* `category` on transactions. When it does, `creditCardMetadata.payeeMCC` is
|
|
10
|
+
* the only categorization left on a card transaction (ADR §12.1's asymmetry).
|
|
11
|
+
*
|
|
12
|
+
* **Provenance, stated honestly.** Derived on 2026-07-26 from one wallet, three
|
|
13
|
+
* institutions, 1123 card transactions carrying both an MCC and a category.
|
|
14
|
+
* Each observed category was rolled up to its top-level ancestor and the most
|
|
15
|
+
* frequent ancestor won. That is 87 of the roughly 1000 ISO 18245 codes: it
|
|
16
|
+
* covers what one person spends on, not the code space.
|
|
17
|
+
*
|
|
18
|
+
* **The winner is a plurality, not always a majority.** 78 of the 87 rows are
|
|
19
|
+
* unanimous; the weakest is MCC 5968 at 12 of 25. Those rows are mapped by the
|
|
20
|
+
* same rule as the rest, deliberately — but `samples` and `agreeing` are there
|
|
21
|
+
* so nobody mistakes one for a 192-sample unanimous mapping.
|
|
22
|
+
*
|
|
23
|
+
* Seeded into `cache.db.mcc_categories` rather than consulted from JavaScript,
|
|
24
|
+
* because `getTransactions`' `categories` filter runs in SQL (ADR §12.2).
|
|
25
|
+
*/
|
|
26
|
+
export const MCC_CATEGORIES = [
|
|
27
|
+
{ mcc: 780, category: CATEGORIES.transfers.id, samples: 2, agreeing: 2 },
|
|
28
|
+
{ mcc: 1740, category: CATEGORIES.housing.id, samples: 1, agreeing: 1 },
|
|
29
|
+
{ mcc: 2741, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
|
|
30
|
+
{ mcc: 3247, category: CATEGORIES.travel.id, samples: 1, agreeing: 1 },
|
|
31
|
+
{ mcc: 3300, category: CATEGORIES.travel.id, samples: 2, agreeing: 2 },
|
|
32
|
+
{ mcc: 4111, category: CATEGORIES.transportation.id, samples: 1, agreeing: 1 },
|
|
33
|
+
{ mcc: 4121, category: CATEGORIES.transportation.id, samples: 192, agreeing: 192 },
|
|
34
|
+
{ mcc: 4131, category: CATEGORIES.transportation.id, samples: 17, agreeing: 17 },
|
|
35
|
+
{ mcc: 4722, category: CATEGORIES.travel.id, samples: 36, agreeing: 32 },
|
|
36
|
+
{ mcc: 4812, category: CATEGORIES.services.id, samples: 4, agreeing: 4 },
|
|
37
|
+
{ mcc: 4814, category: CATEGORIES.services.id, samples: 11, agreeing: 11 },
|
|
38
|
+
{ mcc: 4816, category: CATEGORIES.digitalServices.id, samples: 4, agreeing: 4 },
|
|
39
|
+
{ mcc: 4899, category: CATEGORIES.digitalServices.id, samples: 12, agreeing: 12 },
|
|
40
|
+
{ mcc: 5131, category: CATEGORIES.shopping.id, samples: 3, agreeing: 3 },
|
|
41
|
+
{ mcc: 5139, category: CATEGORIES.shopping.id, samples: 3, agreeing: 3 },
|
|
42
|
+
{ mcc: 5199, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
43
|
+
{ mcc: 5211, category: CATEGORIES.housing.id, samples: 1, agreeing: 1 },
|
|
44
|
+
{ mcc: 5300, category: CATEGORIES.groceries.id, samples: 11, agreeing: 11 },
|
|
45
|
+
{ mcc: 5309, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
46
|
+
{ mcc: 5310, category: CATEGORIES.shopping.id, samples: 10, agreeing: 10 },
|
|
47
|
+
{ mcc: 5311, category: CATEGORIES.shopping.id, samples: 9, agreeing: 7 },
|
|
48
|
+
{ mcc: 5331, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
|
|
49
|
+
{ mcc: 5411, category: CATEGORIES.groceries.id, samples: 46, agreeing: 46 },
|
|
50
|
+
{ mcc: 5422, category: CATEGORIES.groceries.id, samples: 44, agreeing: 44 },
|
|
51
|
+
{ mcc: 5441, category: CATEGORIES.groceries.id, samples: 4, agreeing: 4 },
|
|
52
|
+
{ mcc: 5451, category: CATEGORIES.groceries.id, samples: 1, agreeing: 1 },
|
|
53
|
+
{ mcc: 5462, category: CATEGORIES.groceries.id, samples: 75, agreeing: 75 },
|
|
54
|
+
{ mcc: 5499, category: CATEGORIES.foodAndDrinks.id, samples: 27, agreeing: 16 },
|
|
55
|
+
{ mcc: 5541, category: CATEGORIES.transportation.id, samples: 1, agreeing: 1 },
|
|
56
|
+
{ mcc: 5611, category: CATEGORIES.shopping.id, samples: 5, agreeing: 5 },
|
|
57
|
+
{ mcc: 5651, category: CATEGORIES.shopping.id, samples: 16, agreeing: 16 },
|
|
58
|
+
{ mcc: 5655, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
59
|
+
{ mcc: 5661, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
60
|
+
{ mcc: 5691, category: CATEGORIES.shopping.id, samples: 4, agreeing: 4 },
|
|
61
|
+
{ mcc: 5697, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
62
|
+
{ mcc: 5698, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
|
|
63
|
+
{ mcc: 5699, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
64
|
+
{ mcc: 5714, category: CATEGORIES.housing.id, samples: 1, agreeing: 1 },
|
|
65
|
+
{ mcc: 5722, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
|
|
66
|
+
{ mcc: 5732, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
67
|
+
{ mcc: 5734, category: CATEGORIES.shopping.id, samples: 35, agreeing: 28 },
|
|
68
|
+
{ mcc: 5812, category: CATEGORIES.foodAndDrinks.id, samples: 105, agreeing: 94 },
|
|
69
|
+
{ mcc: 5813, category: CATEGORIES.foodAndDrinks.id, samples: 20, agreeing: 20 },
|
|
70
|
+
{ mcc: 5814, category: CATEGORIES.foodAndDrinks.id, samples: 90, agreeing: 84 },
|
|
71
|
+
{ mcc: 5815, category: CATEGORIES.digitalServices.id, samples: 43, agreeing: 43 },
|
|
72
|
+
{ mcc: 5818, category: CATEGORIES.digitalServices.id, samples: 1, agreeing: 1 },
|
|
73
|
+
{ mcc: 5912, category: CATEGORIES.healthcare.id, samples: 55, agreeing: 55 },
|
|
74
|
+
{ mcc: 5921, category: CATEGORIES.groceries.id, samples: 5, agreeing: 5 },
|
|
75
|
+
{ mcc: 5942, category: CATEGORIES.shopping.id, samples: 24, agreeing: 24 },
|
|
76
|
+
{ mcc: 5943, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
|
|
77
|
+
{ mcc: 5944, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
|
|
78
|
+
{ mcc: 5947, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
79
|
+
{ mcc: 5962, category: CATEGORIES.travel.id, samples: 7, agreeing: 7 },
|
|
80
|
+
{ mcc: 5963, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
81
|
+
{ mcc: 5968, category: CATEGORIES.shopping.id, samples: 25, agreeing: 12 },
|
|
82
|
+
{ mcc: 5977, category: CATEGORIES.shopping.id, samples: 4, agreeing: 3 },
|
|
83
|
+
{ mcc: 5992, category: CATEGORIES.shopping.id, samples: 2, agreeing: 2 },
|
|
84
|
+
{ mcc: 5999, category: CATEGORIES.shopping.id, samples: 3, agreeing: 3 },
|
|
85
|
+
{ mcc: 6010, category: CATEGORIES.transfers.id, samples: 6, agreeing: 6 },
|
|
86
|
+
{ mcc: 7011, category: CATEGORIES.travel.id, samples: 5, agreeing: 5 },
|
|
87
|
+
{ mcc: 7216, category: CATEGORIES.services.id, samples: 36, agreeing: 36 },
|
|
88
|
+
{ mcc: 7221, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
|
|
89
|
+
{ mcc: 7230, category: CATEGORIES.services.id, samples: 2, agreeing: 2 },
|
|
90
|
+
{ mcc: 7299, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
91
|
+
{ mcc: 7338, category: CATEGORIES.services.id, samples: 2, agreeing: 2 },
|
|
92
|
+
{ mcc: 7349, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
|
|
93
|
+
{ mcc: 7372, category: CATEGORIES.digitalServices.id, samples: 3, agreeing: 3 },
|
|
94
|
+
{ mcc: 7379, category: CATEGORIES.services.id, samples: 9, agreeing: 9 },
|
|
95
|
+
{ mcc: 7392, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
|
|
96
|
+
{ mcc: 7395, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
|
|
97
|
+
{ mcc: 7399, category: CATEGORIES.services.id, samples: 3, agreeing: 3 },
|
|
98
|
+
{ mcc: 7622, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
|
|
99
|
+
{ mcc: 7996, category: CATEGORIES.leisure.id, samples: 1, agreeing: 1 },
|
|
100
|
+
{ mcc: 7997, category: CATEGORIES.services.id, samples: 6, agreeing: 6 },
|
|
101
|
+
{ mcc: 7999, category: CATEGORIES.leisure.id, samples: 1, agreeing: 1 },
|
|
102
|
+
{ mcc: 8011, category: CATEGORIES.healthcare.id, samples: 5, agreeing: 5 },
|
|
103
|
+
{ mcc: 8021, category: CATEGORIES.healthcare.id, samples: 7, agreeing: 7 },
|
|
104
|
+
{ mcc: 8043, category: CATEGORIES.healthcare.id, samples: 3, agreeing: 3 },
|
|
105
|
+
{ mcc: 8220, category: CATEGORIES.services.id, samples: 14, agreeing: 14 },
|
|
106
|
+
{ mcc: 8299, category: CATEGORIES.services.id, samples: 13, agreeing: 13 },
|
|
107
|
+
{ mcc: 8398, category: CATEGORIES.donations.id, samples: 1, agreeing: 1 },
|
|
108
|
+
{ mcc: 8661, category: CATEGORIES.donations.id, samples: 2, agreeing: 2 },
|
|
109
|
+
{ mcc: 8699, category: CATEGORIES.services.id, samples: 1, agreeing: 1 },
|
|
110
|
+
{ mcc: 8931, category: CATEGORIES.services.id, samples: 3, agreeing: 3 },
|
|
111
|
+
{ mcc: 8999, category: CATEGORIES.services.id, samples: 6, agreeing: 4 },
|
|
112
|
+
{ mcc: 9399, category: CATEGORIES.services.id, samples: 4, agreeing: 4 },
|
|
113
|
+
{ mcc: 9994, category: CATEGORIES.shopping.id, samples: 1, agreeing: 1 },
|
|
114
|
+
];
|
|
115
|
+
const BY_MCC = new Map(MCC_CATEGORIES.map((entry) => [entry.mcc, entry]));
|
|
116
|
+
/**
|
|
117
|
+
* The category an MCC defaults to, or `undefined` when we have never seen the
|
|
118
|
+
* code. There is no fallback category on purpose: an unknown MCC has no answer,
|
|
119
|
+
* and ADR §12.3's `COALESCE` chain is built to fall through to no category.
|
|
120
|
+
*/
|
|
121
|
+
export function categoryForMcc(mcc) {
|
|
122
|
+
return BY_MCC.get(mcc)?.category;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=mcc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcc.js","sourceRoot":"","sources":["../../src/core/mcc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 2s doubling to a 30s ceiling over 40 attempts is a little over eighteen
|
|
3
|
+
* minutes of patience, chosen against the documented five-minute worst case for
|
|
4
|
+
* the login step alone.
|
|
5
|
+
*/
|
|
6
|
+
export const POLL = { firstDelayMs: 2_000, maxDelayMs: 30_000, attempts: 40 };
|
|
7
|
+
export const PHASES = {
|
|
8
|
+
updating: "updating",
|
|
9
|
+
refreshed: "refreshed",
|
|
10
|
+
needsUser: "needs-user",
|
|
11
|
+
loginError: "login-error",
|
|
12
|
+
failed: "failed",
|
|
13
|
+
};
|
|
14
|
+
export async function refresh(deps, id) {
|
|
15
|
+
try {
|
|
16
|
+
const start = await deps.bank.refreshConnection(id);
|
|
17
|
+
if (start.kind === "too-soon") {
|
|
18
|
+
return { kind: "already-fresh", everyHours: start.everyHours, lastUpdatedAt: start.lastUpdatedAt };
|
|
19
|
+
}
|
|
20
|
+
if (start.kind === "not-refreshable") {
|
|
21
|
+
return { kind: "not-refreshable" };
|
|
22
|
+
}
|
|
23
|
+
return await poll(deps, id, start.connection);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return { kind: "failed", reason: error instanceof Error ? error.message : String(error) };
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
deps.report({ kind: "settled", id });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function poll(deps, id, first) {
|
|
33
|
+
let connection = first;
|
|
34
|
+
let stage = null;
|
|
35
|
+
/** Silent while the stage repeats, so a long sync reports a handful of times. */
|
|
36
|
+
const announce = (current) => {
|
|
37
|
+
if (phaseOf(current) !== PHASES.updating) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const label = stageLabel(current.executionStatus);
|
|
41
|
+
if (label !== stage) {
|
|
42
|
+
stage = label;
|
|
43
|
+
deps.report({ kind: "stage", id, label });
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
announce(connection);
|
|
47
|
+
let delay = POLL.firstDelayMs;
|
|
48
|
+
for (let attempt = 0; attempt < POLL.attempts; attempt += 1) {
|
|
49
|
+
const phase = phaseOf(connection);
|
|
50
|
+
if (phase !== PHASES.updating) {
|
|
51
|
+
return settled(phase, connection);
|
|
52
|
+
}
|
|
53
|
+
await deps.sleep(delay);
|
|
54
|
+
delay = Math.min(delay * 2, POLL.maxDelayMs);
|
|
55
|
+
connection = await deps.bank.getConnection(id);
|
|
56
|
+
announce(connection);
|
|
57
|
+
}
|
|
58
|
+
const phase = phaseOf(connection);
|
|
59
|
+
// Running out of patience is not a failure. The sync continues at Pluggy, and
|
|
60
|
+
// the next `init` will find it finished.
|
|
61
|
+
return phase === PHASES.updating ? { kind: "still-updating", connection } : settled(phase, connection);
|
|
62
|
+
}
|
|
63
|
+
function settled(phase, connection) {
|
|
64
|
+
switch (phase) {
|
|
65
|
+
case PHASES.refreshed:
|
|
66
|
+
return { kind: "refreshed", connection };
|
|
67
|
+
case PHASES.needsUser:
|
|
68
|
+
return { kind: "needs-user", connection };
|
|
69
|
+
case PHASES.loginError:
|
|
70
|
+
return { kind: "login-error", connection };
|
|
71
|
+
default:
|
|
72
|
+
return {
|
|
73
|
+
kind: "failed",
|
|
74
|
+
reason: `Pluggy ended the sync as ${connection.status} / ${connection.executionStatus ?? "no execution status"}`,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const SUCCEEDED = new Set(["SUCCESS", "PARTIAL_SUCCESS"]);
|
|
79
|
+
/**
|
|
80
|
+
* Every status whose phase `status` alone decides. `UPDATED` is the one that
|
|
81
|
+
* needs a second look and so is missing here.
|
|
82
|
+
*/
|
|
83
|
+
const PHASE_BY_STATUS = {
|
|
84
|
+
UPDATING: PHASES.updating,
|
|
85
|
+
MERGING: PHASES.updating,
|
|
86
|
+
// Undocumented as a `status`, yet Pluggy's own rate-limit page shows an item
|
|
87
|
+
// carrying it. Treated as the success it describes.
|
|
88
|
+
PARTIAL_SUCCESS: PHASES.refreshed,
|
|
89
|
+
WAITING_USER_INPUT: PHASES.needsUser,
|
|
90
|
+
WAITING_USER_ACTION: PHASES.needsUser,
|
|
91
|
+
LOGIN_ERROR: PHASES.loginError,
|
|
92
|
+
};
|
|
93
|
+
export function phaseOf(connection) {
|
|
94
|
+
if (connection.status === "UPDATED") {
|
|
95
|
+
return updatedPhase(connection.executionStatus);
|
|
96
|
+
}
|
|
97
|
+
return PHASE_BY_STATUS[connection.status] ?? PHASES.failed;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* `status` is authoritative here: a missing `executionStatus` on an item Pluggy
|
|
101
|
+
* calls UPDATED is not a reason to call the sync broken.
|
|
102
|
+
*/
|
|
103
|
+
function updatedPhase(executionStatus) {
|
|
104
|
+
return executionStatus === null || SUCCEEDED.has(executionStatus) ? PHASES.refreshed : PHASES.failed;
|
|
105
|
+
}
|
|
106
|
+
// Stryker disable StringLiteral: spinner text, not behaviour — asserting each label would pin wording no caller reads
|
|
107
|
+
const STAGES = {
|
|
108
|
+
CREATED: "starting",
|
|
109
|
+
CREATING: "starting",
|
|
110
|
+
LOGIN_IN_PROGRESS: "logging in",
|
|
111
|
+
LOGIN_MFA_IN_PROGRESS: "sending the second factor",
|
|
112
|
+
WAITING_USER_INPUT: "waiting for your token",
|
|
113
|
+
WAITING_USER_ACTION: "waiting for you at the bank",
|
|
114
|
+
USER_AUTHORIZATION_PENDING: "waiting for the bank to authorize us",
|
|
115
|
+
ACCOUNTS_IN_PROGRESS: "reading accounts",
|
|
116
|
+
CREDITCARDS_IN_PROGRESS: "reading credit cards",
|
|
117
|
+
TRANSACTIONS_IN_PROGRESS: "reading transactions",
|
|
118
|
+
INVESTMENTS_IN_PROGRESS: "reading investments",
|
|
119
|
+
INVESTMENT_TRANSACTIONS_IN_PROGRESS: "reading investment transactions",
|
|
120
|
+
INVESTMENTS_TRANSACTIONS_IN_PROGRESS: "reading investment transactions",
|
|
121
|
+
LOANS_IN_PROGRESS: "reading loans",
|
|
122
|
+
IDENTITY_IN_PROGRESS: "reading identity",
|
|
123
|
+
PAYMENT_DATA_IN_PROGRESS: "reading payment data",
|
|
124
|
+
ACCOUNT_STATEMENTS_IN_PROGRESS: "reading statements",
|
|
125
|
+
BROKERAGE_NOTE_IN_PROGRESS: "reading brokerage notes",
|
|
126
|
+
MERGING: "merging what changed",
|
|
127
|
+
SUCCESS: "done",
|
|
128
|
+
PARTIAL_SUCCESS: "done, with warnings",
|
|
129
|
+
};
|
|
130
|
+
// Stryker restore StringLiteral
|
|
131
|
+
/**
|
|
132
|
+
* What to put next to the spinner. An unrecognised stage is shown in the
|
|
133
|
+
* roughest possible English rather than dropped, because the two enums Pluggy
|
|
134
|
+
* publishes do not agree with each other and neither is closed.
|
|
135
|
+
*/
|
|
136
|
+
export function stageLabel(executionStatus) {
|
|
137
|
+
if (executionStatus === null) {
|
|
138
|
+
return "starting";
|
|
139
|
+
}
|
|
140
|
+
return STAGES[executionStatus] ?? executionStatus.toLowerCase().replaceAll("_", " ");
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/core/refresh.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moving money between your own accounts is not spending, and paying a card
|
|
3
|
+
* bill is not spending twice.
|
|
4
|
+
*
|
|
5
|
+
* These are leaves rather than groups because the distinction lives below the
|
|
6
|
+
* 22: `05100000` (credit card payment) is excluded while its parent `05000000`
|
|
7
|
+
* (Transfers) is ordinary spending. They are matched against the *durable*
|
|
8
|
+
* leaf — `DerivedTransaction.categoryId`, which falls back to the snapshot —
|
|
9
|
+
* so the exclusion outlives the enrichment.
|
|
10
|
+
*/
|
|
11
|
+
const SELF_TRANSFER_LEAVES = new Set([
|
|
12
|
+
"04000000", "04010000", "04020000", "04030000", "05100000",
|
|
13
|
+
]);
|
|
14
|
+
/** A manual correction to Same person transfer excludes the row too. */
|
|
15
|
+
const SELF_TRANSFER_GROUP = "04000000";
|
|
16
|
+
export function isSelfTransfer(row) {
|
|
17
|
+
if (row.category === SELF_TRANSFER_GROUP) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return row.categoryId !== null && SELF_TRANSFER_LEAVES.has(row.categoryId);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=self-transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-transfer.js","sourceRoot":"","sources":["../../src/core/self-transfer.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACxD,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU;CAC3D,CAAC,CAAC;AAEH,wEAAwE;AACxE,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAEvC,MAAM,UAAU,cAAc,CAAC,GAAuB;IACpD,IAAI,GAAG,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pluggy's category tree, as returned by `GET /categories` on 2026-07-26 and
|
|
3
|
+
* recorded in `docs/research/2026-07-26-phase-0-5-recon.md`.
|
|
4
|
+
*
|
|
5
|
+
* It ships as code rather than as a `cache.db` seed because `GET /categories`
|
|
6
|
+
* is exposed to the same plan change as the transaction enrichment, and a
|
|
7
|
+
* roll-up that stops working is an aggregate that stops working (design D3).
|
|
8
|
+
*
|
|
9
|
+
* Only `id` and `parentId` are here. The labels the user reads belong to the 22
|
|
10
|
+
* top-level categories and already live in `category.ts`.
|
|
11
|
+
*
|
|
12
|
+
* `02030001`, `02030002` and `02030003` carry `parentId: "02000000"` while
|
|
13
|
+
* their ids and their `parentDescription` both point at `02030000`. Pluggy
|
|
14
|
+
* contradicts itself there; `parentId` is what we build from.
|
|
15
|
+
*/
|
|
16
|
+
export const TAXONOMY = [
|
|
17
|
+
{ id: "01000000", parentId: null },
|
|
18
|
+
{ id: "01010000", parentId: "01000000" },
|
|
19
|
+
{ id: "01020000", parentId: "01000000" },
|
|
20
|
+
{ id: "01030000", parentId: "01000000" },
|
|
21
|
+
{ id: "01040000", parentId: "01000000" },
|
|
22
|
+
{ id: "01050000", parentId: "01000000" },
|
|
23
|
+
{ id: "02000000", parentId: null },
|
|
24
|
+
{ id: "02010000", parentId: "02000000" },
|
|
25
|
+
{ id: "02020000", parentId: "02000000" },
|
|
26
|
+
{ id: "02030000", parentId: "02000000" },
|
|
27
|
+
{ id: "02030001", parentId: "02000000" },
|
|
28
|
+
{ id: "02030002", parentId: "02000000" },
|
|
29
|
+
{ id: "02030003", parentId: "02000000" },
|
|
30
|
+
{ id: "02040000", parentId: "02000000" },
|
|
31
|
+
{ id: "03000000", parentId: null },
|
|
32
|
+
{ id: "03010000", parentId: "03000000" },
|
|
33
|
+
{ id: "03020000", parentId: "03000000" },
|
|
34
|
+
{ id: "03030000", parentId: "03000000" },
|
|
35
|
+
{ id: "03040000", parentId: "03000000" },
|
|
36
|
+
{ id: "03050000", parentId: "03000000" },
|
|
37
|
+
{ id: "03060000", parentId: "03000000" },
|
|
38
|
+
{ id: "03070000", parentId: "03000000" },
|
|
39
|
+
{ id: "04000000", parentId: null },
|
|
40
|
+
{ id: "04010000", parentId: "04000000" },
|
|
41
|
+
{ id: "04020000", parentId: "04000000" },
|
|
42
|
+
{ id: "04030000", parentId: "04000000" },
|
|
43
|
+
{ id: "05000000", parentId: null },
|
|
44
|
+
{ id: "05010000", parentId: "05000000" },
|
|
45
|
+
{ id: "05020000", parentId: "05000000" },
|
|
46
|
+
{ id: "05030000", parentId: "05000000" },
|
|
47
|
+
{ id: "05040000", parentId: "05000000" },
|
|
48
|
+
{ id: "05050000", parentId: "05000000" },
|
|
49
|
+
{ id: "05060000", parentId: "05000000" },
|
|
50
|
+
{ id: "05070000", parentId: "05000000" },
|
|
51
|
+
{ id: "05080000", parentId: "05000000" },
|
|
52
|
+
{ id: "05090000", parentId: "05000000" },
|
|
53
|
+
{ id: "05090001", parentId: "05090000" },
|
|
54
|
+
{ id: "05090002", parentId: "05090000" },
|
|
55
|
+
{ id: "05090003", parentId: "05090000" },
|
|
56
|
+
{ id: "05090004", parentId: "05090000" },
|
|
57
|
+
{ id: "05090005", parentId: "05090000" },
|
|
58
|
+
{ id: "05100000", parentId: "05000000" },
|
|
59
|
+
{ id: "06000000", parentId: null },
|
|
60
|
+
{ id: "06010000", parentId: "06000000" },
|
|
61
|
+
{ id: "06020000", parentId: "06000000" },
|
|
62
|
+
{ id: "07000000", parentId: null },
|
|
63
|
+
{ id: "07010000", parentId: "07000000" },
|
|
64
|
+
{ id: "07010001", parentId: "07010000" },
|
|
65
|
+
{ id: "07010002", parentId: "07010000" },
|
|
66
|
+
{ id: "07010003", parentId: "07010000" },
|
|
67
|
+
{ id: "07020000", parentId: "07000000" },
|
|
68
|
+
{ id: "07020001", parentId: "07020000" },
|
|
69
|
+
{ id: "07020002", parentId: "07020000" },
|
|
70
|
+
{ id: "07020003", parentId: "07020000" },
|
|
71
|
+
{ id: "07020004", parentId: "07020000" },
|
|
72
|
+
{ id: "07030000", parentId: "07000000" },
|
|
73
|
+
{ id: "07030001", parentId: "07030000" },
|
|
74
|
+
{ id: "07030002", parentId: "07030000" },
|
|
75
|
+
{ id: "07030003", parentId: "07030000" },
|
|
76
|
+
{ id: "07040000", parentId: "07000000" },
|
|
77
|
+
{ id: "07040001", parentId: "07040000" },
|
|
78
|
+
{ id: "07040002", parentId: "07040000" },
|
|
79
|
+
{ id: "07040003", parentId: "07040000" },
|
|
80
|
+
{ id: "08000000", parentId: null },
|
|
81
|
+
{ id: "08010000", parentId: "08000000" },
|
|
82
|
+
{ id: "08020000", parentId: "08000000" },
|
|
83
|
+
{ id: "08030000", parentId: "08000000" },
|
|
84
|
+
{ id: "08040000", parentId: "08000000" },
|
|
85
|
+
{ id: "08050000", parentId: "08000000" },
|
|
86
|
+
{ id: "08060000", parentId: "08000000" },
|
|
87
|
+
{ id: "08070000", parentId: "08000000" },
|
|
88
|
+
{ id: "08080000", parentId: "08000000" },
|
|
89
|
+
{ id: "08090000", parentId: "08000000" },
|
|
90
|
+
{ id: "09000000", parentId: null },
|
|
91
|
+
{ id: "09010000", parentId: "09000000" },
|
|
92
|
+
{ id: "09020000", parentId: "09000000" },
|
|
93
|
+
{ id: "09030000", parentId: "09000000" },
|
|
94
|
+
{ id: "10000000", parentId: null },
|
|
95
|
+
{ id: "11000000", parentId: null },
|
|
96
|
+
{ id: "11010000", parentId: "11000000" },
|
|
97
|
+
{ id: "11020000", parentId: "11000000" },
|
|
98
|
+
{ id: "12000000", parentId: null },
|
|
99
|
+
{ id: "12010000", parentId: "12000000" },
|
|
100
|
+
{ id: "12020000", parentId: "12000000" },
|
|
101
|
+
{ id: "12030000", parentId: "12000000" },
|
|
102
|
+
{ id: "12040000", parentId: "12000000" },
|
|
103
|
+
{ id: "13000000", parentId: null },
|
|
104
|
+
{ id: "14000000", parentId: null },
|
|
105
|
+
{ id: "14010000", parentId: "14000000" },
|
|
106
|
+
{ id: "14020000", parentId: "14000000" },
|
|
107
|
+
{ id: "15000000", parentId: null },
|
|
108
|
+
{ id: "15010000", parentId: "15000000" },
|
|
109
|
+
{ id: "15020000", parentId: "15000000" },
|
|
110
|
+
{ id: "15030000", parentId: "15000000" },
|
|
111
|
+
{ id: "16000000", parentId: null },
|
|
112
|
+
{ id: "16010000", parentId: "16000000" },
|
|
113
|
+
{ id: "16020000", parentId: "16000000" },
|
|
114
|
+
{ id: "16030000", parentId: "16000000" },
|
|
115
|
+
{ id: "17000000", parentId: null },
|
|
116
|
+
{ id: "17010000", parentId: "17000000" },
|
|
117
|
+
{ id: "17020000", parentId: "17000000" },
|
|
118
|
+
{ id: "17020001", parentId: "17020000" },
|
|
119
|
+
{ id: "17020002", parentId: "17020000" },
|
|
120
|
+
{ id: "17020003", parentId: "17020000" },
|
|
121
|
+
{ id: "17030000", parentId: "17000000" },
|
|
122
|
+
{ id: "17040000", parentId: "17000000" },
|
|
123
|
+
{ id: "18000000", parentId: null },
|
|
124
|
+
{ id: "18010000", parentId: "18000000" },
|
|
125
|
+
{ id: "18020000", parentId: "18000000" },
|
|
126
|
+
{ id: "18030000", parentId: "18000000" },
|
|
127
|
+
{ id: "18040000", parentId: "18000000" },
|
|
128
|
+
{ id: "19000000", parentId: null },
|
|
129
|
+
{ id: "19010000", parentId: "19000000" },
|
|
130
|
+
{ id: "19020000", parentId: "19000000" },
|
|
131
|
+
{ id: "19030000", parentId: "19000000" },
|
|
132
|
+
{ id: "19040000", parentId: "19000000" },
|
|
133
|
+
{ id: "19050000", parentId: "19000000" },
|
|
134
|
+
{ id: "19050001", parentId: "19050000" },
|
|
135
|
+
{ id: "19050002", parentId: "19050000" },
|
|
136
|
+
{ id: "19050003", parentId: "19050000" },
|
|
137
|
+
{ id: "19050004", parentId: "19050000" },
|
|
138
|
+
{ id: "19050005", parentId: "19050000" },
|
|
139
|
+
{ id: "19050006", parentId: "19050000" },
|
|
140
|
+
{ id: "20000000", parentId: null },
|
|
141
|
+
{ id: "200100000", parentId: "20000000" },
|
|
142
|
+
{ id: "200200000", parentId: "20000000" },
|
|
143
|
+
{ id: "200300000", parentId: "20000000" },
|
|
144
|
+
{ id: "200400000", parentId: "20000000" },
|
|
145
|
+
{ id: "21000000", parentId: null },
|
|
146
|
+
{ id: "99999999", parentId: null },
|
|
147
|
+
];
|
|
148
|
+
//# sourceMappingURL=taxonomy-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxonomy-tree.js","sourceRoot":"","sources":["../../src/core/taxonomy-tree.ts"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,QAAQ,GAA6B;IAEhD,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IACzC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IACzC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IACzC,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;IACzC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;IAClC,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE;CACnC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { isCategoryId } from "./category.js";
|
|
2
|
+
import { TAXONOMY } from "./taxonomy-tree.js";
|
|
3
|
+
function parentOf(id, parents) {
|
|
4
|
+
if (!parents.has(id)) {
|
|
5
|
+
throw new Error(`Category points to missing parent ${id}`);
|
|
6
|
+
}
|
|
7
|
+
const parentId = parents.get(id);
|
|
8
|
+
if (parentId === undefined) {
|
|
9
|
+
throw new Error(`Category points to missing parent ${id}`);
|
|
10
|
+
}
|
|
11
|
+
return parentId;
|
|
12
|
+
}
|
|
13
|
+
function rootOf(id, parents) {
|
|
14
|
+
const seen = new Set();
|
|
15
|
+
let current = id;
|
|
16
|
+
while (true) {
|
|
17
|
+
if (seen.has(current)) {
|
|
18
|
+
throw new Error(`Category tree contains a cycle at ${current}`);
|
|
19
|
+
}
|
|
20
|
+
seen.add(current);
|
|
21
|
+
const parentId = parentOf(current, parents);
|
|
22
|
+
if (parentId === undefined) {
|
|
23
|
+
throw new Error(`Category ${id} points to missing parent ${current}`);
|
|
24
|
+
}
|
|
25
|
+
if (parentId === null) {
|
|
26
|
+
if (!isCategoryId(current)) {
|
|
27
|
+
throw new Error(`Category tree root ${current} is not a top-level category`);
|
|
28
|
+
}
|
|
29
|
+
return current;
|
|
30
|
+
}
|
|
31
|
+
current = parentId;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Maps every category id to its top-level ancestor, transitively. */
|
|
35
|
+
export function buildRollup(entries) {
|
|
36
|
+
const parents = new Map();
|
|
37
|
+
for (const entry of entries) {
|
|
38
|
+
if (parents.has(entry.id)) {
|
|
39
|
+
throw new Error(`Category tree contains duplicate id ${entry.id}`);
|
|
40
|
+
}
|
|
41
|
+
parents.set(entry.id, entry.parentId);
|
|
42
|
+
}
|
|
43
|
+
const rollup = new Map();
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
rollup.set(entry.id, rootOf(entry.id, parents));
|
|
46
|
+
}
|
|
47
|
+
return rollup;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Built once at module load. `buildRollup` throws on a duplicate id, a missing
|
|
51
|
+
* parent, a cycle or a root that is not top-level — so a defect in the shipped
|
|
52
|
+
* constant fails the suite rather than a user's walk.
|
|
53
|
+
*/
|
|
54
|
+
const ROLLUP = buildRollup(TAXONOMY);
|
|
55
|
+
/**
|
|
56
|
+
* The top-level ancestor of a Pluggy category id, or `null` when we do not know
|
|
57
|
+
* the id.
|
|
58
|
+
*
|
|
59
|
+
* Returning `null` rather than throwing is the whole point: the tree ships as
|
|
60
|
+
* code, so a category Pluggy adds tomorrow is absent by construction. An
|
|
61
|
+
* unknown leaf must cost that one row its group, not take a whole account's
|
|
62
|
+
* walk down with it (design D3).
|
|
63
|
+
*/
|
|
64
|
+
export function topCategoryOf(categoryId) {
|
|
65
|
+
if (categoryId === null) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return ROLLUP.get(categoryId) ?? null;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=taxonomy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../../src/core/taxonomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmB,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAsB,MAAM,oBAAoB,CAAC;AAKlE,SAAS,QAAQ,CAAC,EAAU,EAAE,OAA2C;IACvE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,EAAU,EAAE,OAA2C;IACrE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAElB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,YAAY,EAAE,6BAA6B,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,8BAA8B,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAC,OAAiC;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;AAErC;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB;IACrD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/core/transaction.ts"],"names":[],"mappings":""}
|