noxctl 0.7.4 → 0.8.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/README.md +39 -2
- package/dist/auth.d.ts +17 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +122 -15
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -28
- package/dist/cli.js.map +1 -1
- package/dist/credentials-store.d.ts +3 -0
- package/dist/credentials-store.d.ts.map +1 -1
- package/dist/credentials-store.js +54 -10
- package/dist/credentials-store.js.map +1 -1
- package/dist/embedded.d.ts +15 -0
- package/dist/embedded.d.ts.map +1 -0
- package/dist/embedded.js +11 -0
- package/dist/embedded.js.map +1 -0
- package/dist/fortnox-client.d.ts +34 -25
- package/dist/fortnox-client.d.ts.map +1 -1
- package/dist/fortnox-client.js +130 -50
- package/dist/fortnox-client.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -35
- package/dist/index.js.map +1 -1
- package/dist/keychain-target.d.ts +3 -0
- package/dist/keychain-target.d.ts.map +1 -1
- package/dist/keychain-target.js +28 -7
- package/dist/keychain-target.js.map +1 -1
- package/dist/operations/absencetransactions.d.ts +9 -6
- package/dist/operations/absencetransactions.d.ts.map +1 -1
- package/dist/operations/absencetransactions.js +42 -33
- package/dist/operations/absencetransactions.js.map +1 -1
- package/dist/operations/accounts.d.ts +6 -3
- package/dist/operations/accounts.d.ts.map +1 -1
- package/dist/operations/accounts.js +28 -24
- package/dist/operations/accounts.js.map +1 -1
- package/dist/operations/analytics.d.ts +35 -0
- package/dist/operations/analytics.d.ts.map +1 -1
- package/dist/operations/analytics.js +59 -35
- package/dist/operations/analytics.js.map +1 -1
- package/dist/operations/articles.d.ts +9 -6
- package/dist/operations/articles.d.ts.map +1 -1
- package/dist/operations/articles.js +36 -32
- package/dist/operations/articles.js.map +1 -1
- package/dist/operations/attendancetransactions.d.ts +9 -6
- package/dist/operations/attendancetransactions.d.ts.map +1 -1
- package/dist/operations/attendancetransactions.js +45 -36
- package/dist/operations/attendancetransactions.js.map +1 -1
- package/dist/operations/company.d.ts +5 -1
- package/dist/operations/company.d.ts.map +1 -1
- package/dist/operations/company.js +8 -4
- package/dist/operations/company.js.map +1 -1
- package/dist/operations/contracts.d.ts +12 -9
- package/dist/operations/contracts.d.ts.map +1 -1
- package/dist/operations/contracts.js +59 -47
- package/dist/operations/contracts.js.map +1 -1
- package/dist/operations/costcenters.d.ts +10 -7
- package/dist/operations/costcenters.d.ts.map +1 -1
- package/dist/operations/costcenters.js +39 -35
- package/dist/operations/costcenters.js.map +1 -1
- package/dist/operations/customers.d.ts +9 -6
- package/dist/operations/customers.d.ts.map +1 -1
- package/dist/operations/customers.js +46 -42
- package/dist/operations/customers.js.map +1 -1
- package/dist/operations/employees.d.ts +9 -6
- package/dist/operations/employees.d.ts.map +1 -1
- package/dist/operations/employees.js +35 -31
- package/dist/operations/employees.js.map +1 -1
- package/dist/operations/financial-reports.d.ts +7 -2
- package/dist/operations/financial-reports.d.ts.map +1 -1
- package/dist/operations/financial-reports.js +169 -165
- package/dist/operations/financial-reports.js.map +1 -1
- package/dist/operations/financial-years.d.ts +8 -5
- package/dist/operations/financial-years.d.ts.map +1 -1
- package/dist/operations/financial-years.js +33 -29
- package/dist/operations/financial-years.js.map +1 -1
- package/dist/operations/index.d.ts +301 -0
- package/dist/operations/index.d.ts.map +1 -0
- package/dist/operations/index.js +64 -0
- package/dist/operations/index.js.map +1 -0
- package/dist/operations/invoice-payments.d.ts +10 -7
- package/dist/operations/invoice-payments.d.ts.map +1 -1
- package/dist/operations/invoice-payments.js +45 -35
- package/dist/operations/invoice-payments.js.map +1 -1
- package/dist/operations/invoices.d.ts +14 -30
- package/dist/operations/invoices.d.ts.map +1 -1
- package/dist/operations/invoices.js +131 -113
- package/dist/operations/invoices.js.map +1 -1
- package/dist/operations/offers.d.ts +11 -8
- package/dist/operations/offers.d.ts.map +1 -1
- package/dist/operations/offers.js +54 -43
- package/dist/operations/offers.js.map +1 -1
- package/dist/operations/orders.d.ts +10 -7
- package/dist/operations/orders.d.ts.map +1 -1
- package/dist/operations/orders.js +43 -39
- package/dist/operations/orders.js.map +1 -1
- package/dist/operations/pricelists.d.ts +16 -10
- package/dist/operations/pricelists.d.ts.map +1 -1
- package/dist/operations/pricelists.js +56 -48
- package/dist/operations/pricelists.js.map +1 -1
- package/dist/operations/projects.d.ts +9 -6
- package/dist/operations/projects.d.ts.map +1 -1
- package/dist/operations/projects.js +34 -30
- package/dist/operations/projects.js.map +1 -1
- package/dist/operations/recurrings.d.ts +14 -10
- package/dist/operations/recurrings.d.ts.map +1 -1
- package/dist/operations/recurrings.js +74 -59
- package/dist/operations/recurrings.js.map +1 -1
- package/dist/operations/salarytransactions.d.ts +9 -6
- package/dist/operations/salarytransactions.d.ts.map +1 -1
- package/dist/operations/salarytransactions.js +41 -32
- package/dist/operations/salarytransactions.js.map +1 -1
- package/dist/operations/scheduletimes.d.ts +7 -3
- package/dist/operations/scheduletimes.d.ts.map +1 -1
- package/dist/operations/scheduletimes.js +26 -22
- package/dist/operations/scheduletimes.js.map +1 -1
- package/dist/operations/supplier-invoice-payments.d.ts +9 -6
- package/dist/operations/supplier-invoice-payments.d.ts.map +1 -1
- package/dist/operations/supplier-invoice-payments.js +38 -29
- package/dist/operations/supplier-invoice-payments.js.map +1 -1
- package/dist/operations/supplier-invoices.d.ts +9 -6
- package/dist/operations/supplier-invoices.d.ts.map +1 -1
- package/dist/operations/supplier-invoices.js +41 -32
- package/dist/operations/supplier-invoices.js.map +1 -1
- package/dist/operations/suppliers.d.ts +9 -6
- package/dist/operations/suppliers.d.ts.map +1 -1
- package/dist/operations/suppliers.js +36 -32
- package/dist/operations/suppliers.js.map +1 -1
- package/dist/operations/tax.d.ts +5 -1
- package/dist/operations/tax.d.ts.map +1 -1
- package/dist/operations/tax.js +43 -39
- package/dist/operations/tax.js.map +1 -1
- package/dist/operations/taxreductions.d.ts +8 -5
- package/dist/operations/taxreductions.d.ts.map +1 -1
- package/dist/operations/taxreductions.js +28 -24
- package/dist/operations/taxreductions.js.map +1 -1
- package/dist/operations/vouchers.d.ts +11 -8
- package/dist/operations/vouchers.d.ts.map +1 -1
- package/dist/operations/vouchers.js +137 -122
- package/dist/operations/vouchers.js.map +1 -1
- package/dist/schema-audit-mappings.d.ts +9 -0
- package/dist/schema-audit-mappings.d.ts.map +1 -0
- package/dist/schema-audit-mappings.js +45 -0
- package/dist/schema-audit-mappings.js.map +1 -0
- package/dist/schema-audit.d.ts +45 -0
- package/dist/schema-audit.d.ts.map +1 -0
- package/dist/schema-audit.js +132 -0
- package/dist/schema-audit.js.map +1 -0
- package/dist/strict-mcp-server.d.ts +17 -0
- package/dist/strict-mcp-server.d.ts.map +1 -0
- package/dist/strict-mcp-server.js +35 -0
- package/dist/strict-mcp-server.js.map +1 -0
- package/dist/tools/absencetransactions.d.ts +2 -1
- package/dist/tools/absencetransactions.d.ts.map +1 -1
- package/dist/tools/absencetransactions.js +3 -2
- package/dist/tools/absencetransactions.js.map +1 -1
- package/dist/tools/analytics.d.ts +2 -1
- package/dist/tools/analytics.d.ts.map +1 -1
- package/dist/tools/analytics.js +3 -2
- package/dist/tools/analytics.js.map +1 -1
- package/dist/tools/articles.d.ts +2 -1
- package/dist/tools/articles.d.ts.map +1 -1
- package/dist/tools/articles.js +3 -2
- package/dist/tools/articles.js.map +1 -1
- package/dist/tools/attendancetransactions.d.ts +2 -1
- package/dist/tools/attendancetransactions.d.ts.map +1 -1
- package/dist/tools/attendancetransactions.js +3 -2
- package/dist/tools/attendancetransactions.js.map +1 -1
- package/dist/tools/bookkeeping.d.ts +2 -1
- package/dist/tools/bookkeeping.d.ts.map +1 -1
- package/dist/tools/bookkeeping.js +4 -4
- package/dist/tools/bookkeeping.js.map +1 -1
- package/dist/tools/company.d.ts +2 -1
- package/dist/tools/company.d.ts.map +1 -1
- package/dist/tools/company.js +3 -2
- package/dist/tools/company.js.map +1 -1
- package/dist/tools/contracts.d.ts +2 -1
- package/dist/tools/contracts.d.ts.map +1 -1
- package/dist/tools/contracts.js +3 -2
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/costcenters.d.ts +2 -1
- package/dist/tools/costcenters.d.ts.map +1 -1
- package/dist/tools/costcenters.js +3 -2
- package/dist/tools/costcenters.js.map +1 -1
- package/dist/tools/customers.d.ts +2 -1
- package/dist/tools/customers.d.ts.map +1 -1
- package/dist/tools/customers.js +3 -2
- package/dist/tools/customers.js.map +1 -1
- package/dist/tools/employees.d.ts +2 -1
- package/dist/tools/employees.d.ts.map +1 -1
- package/dist/tools/employees.js +3 -2
- package/dist/tools/employees.js.map +1 -1
- package/dist/tools/financial-reports.d.ts +2 -1
- package/dist/tools/financial-reports.d.ts.map +1 -1
- package/dist/tools/financial-reports.js +3 -2
- package/dist/tools/financial-reports.js.map +1 -1
- package/dist/tools/financial-years.d.ts +2 -1
- package/dist/tools/financial-years.d.ts.map +1 -1
- package/dist/tools/financial-years.js +3 -2
- package/dist/tools/financial-years.js.map +1 -1
- package/dist/tools/invoice-payments.d.ts +2 -1
- package/dist/tools/invoice-payments.d.ts.map +1 -1
- package/dist/tools/invoice-payments.js +3 -2
- package/dist/tools/invoice-payments.js.map +1 -1
- package/dist/tools/invoices.d.ts +2 -1
- package/dist/tools/invoices.d.ts.map +1 -1
- package/dist/tools/invoices.js +58 -19
- package/dist/tools/invoices.js.map +1 -1
- package/dist/tools/offers.d.ts +2 -1
- package/dist/tools/offers.d.ts.map +1 -1
- package/dist/tools/offers.js +50 -19
- package/dist/tools/offers.js.map +1 -1
- package/dist/tools/orders.d.ts +2 -1
- package/dist/tools/orders.d.ts.map +1 -1
- package/dist/tools/orders.js +58 -18
- package/dist/tools/orders.js.map +1 -1
- package/dist/tools/pricelists.d.ts +2 -1
- package/dist/tools/pricelists.d.ts.map +1 -1
- package/dist/tools/pricelists.js +3 -2
- package/dist/tools/pricelists.js.map +1 -1
- package/dist/tools/projects.d.ts +2 -1
- package/dist/tools/projects.d.ts.map +1 -1
- package/dist/tools/projects.js +3 -2
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/recurrings.d.ts +2 -1
- package/dist/tools/recurrings.d.ts.map +1 -1
- package/dist/tools/recurrings.js +3 -2
- package/dist/tools/recurrings.js.map +1 -1
- package/dist/tools/salarytransactions.d.ts +2 -1
- package/dist/tools/salarytransactions.d.ts.map +1 -1
- package/dist/tools/salarytransactions.js +3 -2
- package/dist/tools/salarytransactions.js.map +1 -1
- package/dist/tools/scheduletimes.d.ts +2 -1
- package/dist/tools/scheduletimes.d.ts.map +1 -1
- package/dist/tools/scheduletimes.js +3 -2
- package/dist/tools/scheduletimes.js.map +1 -1
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +5 -4
- package/dist/tools/status.js.map +1 -1
- package/dist/tools/supplier-invoice-payments.d.ts +2 -1
- package/dist/tools/supplier-invoice-payments.d.ts.map +1 -1
- package/dist/tools/supplier-invoice-payments.js +3 -2
- package/dist/tools/supplier-invoice-payments.js.map +1 -1
- package/dist/tools/supplier-invoices.d.ts +2 -1
- package/dist/tools/supplier-invoices.d.ts.map +1 -1
- package/dist/tools/supplier-invoices.js +47 -6
- package/dist/tools/supplier-invoices.js.map +1 -1
- package/dist/tools/suppliers.d.ts +2 -1
- package/dist/tools/suppliers.d.ts.map +1 -1
- package/dist/tools/suppliers.js +3 -2
- package/dist/tools/suppliers.js.map +1 -1
- package/dist/tools/tax.d.ts +2 -1
- package/dist/tools/tax.d.ts.map +1 -1
- package/dist/tools/tax.js +3 -2
- package/dist/tools/tax.js.map +1 -1
- package/dist/tools/taxreductions.d.ts +2 -1
- package/dist/tools/taxreductions.d.ts.map +1 -1
- package/dist/tools/taxreductions.js +3 -2
- package/dist/tools/taxreductions.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/docs/embedded.md +60 -0
- package/package.json +23 -4
package/dist/operations/tax.js
CHANGED
|
@@ -1,47 +1,51 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defaultFortnoxTransport } from '../fortnox-client.js';
|
|
2
2
|
const VAT_ACCOUNT_NUMBERS = [2610, 2620, 2630, 2640, 2641, 2645, 2650];
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
for (const
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
vatSummary[row.Account]
|
|
3
|
+
export function createTaxOperations(transport) {
|
|
4
|
+
async function generateTaxReport(params) {
|
|
5
|
+
const data = await transport.request('accounts', {
|
|
6
|
+
params: {
|
|
7
|
+
financialyear: params.financialYear,
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
const vatAccounts = data.Accounts.filter((a) => VAT_ACCOUNT_NUMBERS.includes(a.Number));
|
|
11
|
+
const voucherData = await transport.request('vouchers', {
|
|
12
|
+
params: {
|
|
13
|
+
fromdate: params.fromDate,
|
|
14
|
+
todate: params.toDate,
|
|
15
|
+
financialyear: params.financialYear,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
const vatSummary = {};
|
|
19
|
+
for (const voucher of voucherData.Vouchers || []) {
|
|
20
|
+
for (const row of voucher.VoucherRows || []) {
|
|
21
|
+
if (VAT_ACCOUNT_NUMBERS.includes(row.Account)) {
|
|
22
|
+
if (!vatSummary[row.Account]) {
|
|
23
|
+
vatSummary[row.Account] = { debit: 0, credit: 0, description: '' };
|
|
24
|
+
}
|
|
25
|
+
vatSummary[row.Account].debit += row.Debit || 0;
|
|
26
|
+
vatSummary[row.Account].credit += row.Credit || 0;
|
|
23
27
|
}
|
|
24
|
-
vatSummary[row.Account].debit += row.Debit || 0;
|
|
25
|
-
vatSummary[row.Account].credit += row.Credit || 0;
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
for (const account of vatAccounts) {
|
|
31
|
+
if (vatSummary[account.Number]) {
|
|
32
|
+
vatSummary[account.Number].description = account.Description;
|
|
33
|
+
}
|
|
32
34
|
}
|
|
35
|
+
return {
|
|
36
|
+
period: { from: params.fromDate, to: params.toDate },
|
|
37
|
+
vatAccounts: vatSummary,
|
|
38
|
+
accountBalances: vatAccounts.map((a) => ({
|
|
39
|
+
account: a.Number,
|
|
40
|
+
description: a.Description,
|
|
41
|
+
balance: a.BalanceCarriedForward,
|
|
42
|
+
})),
|
|
43
|
+
summary: {
|
|
44
|
+
note: 'Informativ sammanstallning. Kontrollera beloppen mot Fortnox momsrapport och bokforingen innan deklaration.',
|
|
45
|
+
},
|
|
46
|
+
};
|
|
33
47
|
}
|
|
34
|
-
return {
|
|
35
|
-
period: { from: params.fromDate, to: params.toDate },
|
|
36
|
-
vatAccounts: vatSummary,
|
|
37
|
-
accountBalances: vatAccounts.map((a) => ({
|
|
38
|
-
account: a.Number,
|
|
39
|
-
description: a.Description,
|
|
40
|
-
balance: a.BalanceCarriedForward,
|
|
41
|
-
})),
|
|
42
|
-
summary: {
|
|
43
|
-
note: 'Informativ sammanstallning. Kontrollera beloppen mot Fortnox momsrapport och bokforingen innan deklaration.',
|
|
44
|
-
},
|
|
45
|
-
};
|
|
48
|
+
return { generateTaxReport };
|
|
46
49
|
}
|
|
50
|
+
export const { generateTaxReport } = createTaxOperations(defaultFortnoxTransport);
|
|
47
51
|
//# sourceMappingURL=tax.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tax.js","sourceRoot":"","sources":["../../src/operations/tax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tax.js","sourceRoot":"","sources":["../../src/operations/tax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAyB,MAAM,sBAAsB,CAAC;AAyBtF,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAevE,MAAM,UAAU,mBAAmB,CAAC,SAA2B;IAC7D,KAAK,UAAU,iBAAiB,CAAC,MAA+B;QAC9D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAmB,UAAU,EAAE;YACjE,MAAM,EAAE;gBACN,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC;SACF,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAExF,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,OAAO,CAAmB,UAAU,EAAE;YACxE,MAAM,EAAE;gBACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC;SACF,CAAC,CAAC;QAEH,MAAM,UAAU,GAA2E,EAAE,CAAC;QAC9F,KAAK,MAAM,OAAO,IAAI,WAAW,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACjD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;gBAC5C,IAAI,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC7B,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;oBACrE,CAAC;oBACD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;oBAChD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE;YACpD,WAAW,EAAE,UAAU;YACvB,eAAe,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvC,OAAO,EAAE,CAAC,CAAC,MAAM;gBACjB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,OAAO,EAAE,CAAC,CAAC,qBAAqB;aACjC,CAAC,CAAC;YACH,OAAO,EAAE;gBACP,IAAI,EAAE,6GAA6G;aACpH;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,mBAAmB,CAAC,uBAAuB,CAAC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { type FortnoxTransport } from '../fortnox-client.js';
|
|
2
|
+
export interface TaxReductionsResponse {
|
|
2
3
|
TaxReductions: Record<string, unknown>[];
|
|
3
4
|
MetaInformation?: {
|
|
4
5
|
'@TotalResources': number;
|
|
@@ -12,8 +13,10 @@ export interface ListTaxReductionsParams {
|
|
|
12
13
|
limit?: number;
|
|
13
14
|
all?: boolean;
|
|
14
15
|
}
|
|
15
|
-
export declare function
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
export declare function createTaxReductionOperations(transport: FortnoxTransport): {
|
|
17
|
+
listTaxReductions: (params?: ListTaxReductionsParams) => Promise<TaxReductionsResponse>;
|
|
18
|
+
getTaxReduction: (id: number) => Promise<Record<string, unknown>>;
|
|
19
|
+
createTaxReduction: (params: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
20
|
+
};
|
|
21
|
+
export declare const listTaxReductions: (params?: ListTaxReductionsParams) => Promise<TaxReductionsResponse>, getTaxReduction: (id: number) => Promise<Record<string, unknown>>, createTaxReduction: (params: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
19
22
|
//# sourceMappingURL=taxreductions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taxreductions.d.ts","sourceRoot":"","sources":["../../src/operations/taxreductions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"taxreductions.d.ts","sourceRoot":"","sources":["../../src/operations/taxreductions.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAMtF,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACzC,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,gBAAgB;iCAE5D,uBAAuB,KAC9B,OAAO,CAAC,qBAAqB,CAAC;0BAsBE,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;iCAMlE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;EASpC;AAED,eAAO,MAAQ,iBAAiB,YAzCpB,uBAAuB,KAC9B,OAAO,CAAC,qBAAqB,CAAC,EAwCD,eAAe,OAlBZ,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAkB3B,kBAAkB,WAZzD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYmB,CAAC"}
|
|
@@ -1,28 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
if (params.all) {
|
|
7
|
-
const { items, totalResources } = await fetchAllPages('taxreductions', 'TaxReductions', queryParams);
|
|
8
|
-
return {
|
|
9
|
-
TaxReductions: items,
|
|
10
|
-
MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
|
|
1
|
+
import { defaultFortnoxTransport } from '../fortnox-client.js';
|
|
2
|
+
export function createTaxReductionOperations(transport) {
|
|
3
|
+
async function listTaxReductions(params = {}) {
|
|
4
|
+
const queryParams = {
|
|
5
|
+
...(params.filter ? { filter: params.filter } : {}),
|
|
11
6
|
};
|
|
7
|
+
if (params.all) {
|
|
8
|
+
const { items, totalResources } = await transport.fetchAllPages('taxreductions', 'TaxReductions', queryParams);
|
|
9
|
+
return {
|
|
10
|
+
TaxReductions: items,
|
|
11
|
+
MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return transport.request('taxreductions', {
|
|
15
|
+
params: { ...queryParams, page: params.page || 1, limit: params.limit || 100 },
|
|
16
|
+
});
|
|
12
17
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
});
|
|
26
|
-
return data.TaxReduction;
|
|
18
|
+
async function getTaxReduction(id) {
|
|
19
|
+
const data = await transport.request(`taxreductions/${id}`);
|
|
20
|
+
return data.TaxReduction;
|
|
21
|
+
}
|
|
22
|
+
async function createTaxReduction(params) {
|
|
23
|
+
const data = await transport.request('taxreductions', {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
body: { TaxReduction: params },
|
|
26
|
+
});
|
|
27
|
+
return data.TaxReduction;
|
|
28
|
+
}
|
|
29
|
+
return { listTaxReductions, getTaxReduction, createTaxReduction };
|
|
27
30
|
}
|
|
31
|
+
export const { listTaxReductions, getTaxReduction, createTaxReduction } = createTaxReductionOperations(defaultFortnoxTransport);
|
|
28
32
|
//# sourceMappingURL=taxreductions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taxreductions.js","sourceRoot":"","sources":["../../src/operations/taxreductions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"taxreductions.js","sourceRoot":"","sources":["../../src/operations/taxreductions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAyB,MAAM,sBAAsB,CAAC;AAkBtF,MAAM,UAAU,4BAA4B,CAAC,SAA2B;IACtE,KAAK,UAAU,iBAAiB,CAC9B,SAAkC,EAAE;QAEpC,MAAM,WAAW,GAAgD;YAC/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC;QAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,SAAS,CAAC,aAAa,CAC7D,eAAe,EACf,eAAe,EACf,WAAW,CACZ,CAAC;YACF,OAAO;gBACL,aAAa,EAAE,KAAK;gBACpB,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;aAC5F,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC,OAAO,CAAwB,eAAe,EAAE;YAC/D,MAAM,EAAE,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;SAC/E,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,eAAe,CAAC,EAAU;QACvC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAuB,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,KAAK,UAAU,kBAAkB,CAC/B,MAA+B;QAE/B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,CAAuB,eAAe,EAAE;YAC1E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE;SAC/B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,GACrE,4BAA4B,CAAC,uBAAuB,CAAC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { type FortnoxTransport } from '../fortnox-client.js';
|
|
2
|
+
export interface VouchersResponse {
|
|
2
3
|
Vouchers: Record<string, unknown>[];
|
|
3
4
|
MetaInformation?: {
|
|
4
5
|
'@TotalResources': number;
|
|
@@ -15,11 +16,6 @@ export interface ListVouchersParams {
|
|
|
15
16
|
limit?: number;
|
|
16
17
|
all?: boolean;
|
|
17
18
|
}
|
|
18
|
-
export declare function listVouchers(params?: ListVouchersParams): Promise<VouchersResponse>;
|
|
19
|
-
export declare function getVoucher(series: string, voucherNumber: string, financialYear?: number): Promise<Record<string, unknown>>;
|
|
20
|
-
export declare function createVoucher(params: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
21
|
-
export declare function uploadInboxFile(filePath: string): Promise<Record<string, unknown>>;
|
|
22
|
-
export declare function createVoucherFileConnection(series: string, voucherNumber: string, fileId: string, financialYear?: number): Promise<Record<string, unknown>>;
|
|
23
19
|
export interface AttachVoucherFilesParams {
|
|
24
20
|
series: string;
|
|
25
21
|
voucherNumber: string;
|
|
@@ -32,6 +28,13 @@ export interface VoucherFileAttachment {
|
|
|
32
28
|
voucherYear: number;
|
|
33
29
|
connection: Record<string, unknown>;
|
|
34
30
|
}
|
|
35
|
-
export declare function
|
|
36
|
-
|
|
31
|
+
export declare function createVoucherOperations(transport: FortnoxTransport): {
|
|
32
|
+
listVouchers: (params?: ListVouchersParams) => Promise<VouchersResponse>;
|
|
33
|
+
getVoucher: (series: string, voucherNumber: string, financialYear?: number) => Promise<Record<string, unknown>>;
|
|
34
|
+
createVoucher: (params: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
35
|
+
uploadInboxFile: (filePath: string) => Promise<Record<string, unknown>>;
|
|
36
|
+
createVoucherFileConnection: (series: string, voucherNumber: string, fileId: string, financialYear?: number) => Promise<Record<string, unknown>>;
|
|
37
|
+
attachVoucherFiles: (params: AttachVoucherFilesParams) => Promise<VoucherFileAttachment[]>;
|
|
38
|
+
};
|
|
39
|
+
export declare const listVouchers: (params?: ListVouchersParams) => Promise<VouchersResponse>, getVoucher: (series: string, voucherNumber: string, financialYear?: number) => Promise<Record<string, unknown>>, createVoucher: (params: Record<string, unknown>) => Promise<Record<string, unknown>>, uploadInboxFile: (filePath: string) => Promise<Record<string, unknown>>, createVoucherFileConnection: (series: string, voucherNumber: string, fileId: string, financialYear?: number) => Promise<Record<string, unknown>>, attachVoucherFiles: (params: AttachVoucherFilesParams) => Promise<VoucherFileAttachment[]>;
|
|
37
40
|
//# sourceMappingURL=vouchers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vouchers.d.ts","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vouchers.d.ts","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAQtF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACpC,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,gBAAgB;4BAG7B,kBAAkB,KAAQ,OAAO,CAAC,gBAAgB,CAAC;yBA2B7E,MAAM,iBACC,MAAM,kBACL,MAAM,KACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;4BAUE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gCAwCtD,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;0CAgBxE,MAAM,iBACC,MAAM,UACb,MAAM,kBACE,MAAM,KACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;iCAwCzB,wBAAwB,KAC/B,OAAO,CAAC,qBAAqB,EAAE,CAAC;EAmDpC;AAED,eAAO,MACL,YAAY,YAnMwB,kBAAkB,KAAQ,OAAO,CAAC,gBAAgB,CAAC,EAoMvF,UAAU,WAzKA,MAAM,iBACC,MAAM,kBACL,MAAM,KACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAuKnC,aAAa,WA7JwB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EA8J/F,eAAe,aAtH0B,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAuHlF,2BAA2B,WAvGjB,MAAM,iBACC,MAAM,UACb,MAAM,kBACE,MAAM,KACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAoGnC,kBAAkB,WA5DR,wBAAwB,KAC/B,OAAO,CAAC,qBAAqB,EAAE,CA4DgB,CAAC"}
|
|
@@ -1,138 +1,153 @@
|
|
|
1
1
|
import { readFileSync, existsSync, statSync } from 'node:fs';
|
|
2
2
|
import { basename, extname } from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { defaultFortnoxTransport } from '../fortnox-client.js';
|
|
4
4
|
import { voucherSeriesSegment } from '../identifiers.js';
|
|
5
|
-
import {
|
|
6
|
-
export
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const { items, totalResources } = await fetchAllPages(endpoint, 'Vouchers', queryParams);
|
|
16
|
-
return {
|
|
17
|
-
Vouchers: items,
|
|
18
|
-
MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
|
|
5
|
+
import { createFinancialYearOperations } from './financial-years.js';
|
|
6
|
+
export function createVoucherOperations(transport) {
|
|
7
|
+
const { listFinancialYears } = createFinancialYearOperations(transport);
|
|
8
|
+
async function listVouchers(params = {}) {
|
|
9
|
+
const subpath = params.series ? `sublist/${voucherSeriesSegment(params.series)}` : '';
|
|
10
|
+
const endpoint = `vouchers/${subpath}`;
|
|
11
|
+
const queryParams = {
|
|
12
|
+
financialyear: params.financialYear,
|
|
13
|
+
fromdate: params.fromDate,
|
|
14
|
+
todate: params.toDate,
|
|
19
15
|
};
|
|
16
|
+
if (params.all) {
|
|
17
|
+
const { items, totalResources } = await transport.fetchAllPages(endpoint, 'Vouchers', queryParams);
|
|
18
|
+
return {
|
|
19
|
+
Vouchers: items,
|
|
20
|
+
MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return transport.request(endpoint, {
|
|
24
|
+
params: { ...queryParams, page: params.page || 1, limit: params.limit || 100 },
|
|
25
|
+
});
|
|
20
26
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
Voucher: {
|
|
37
|
-
...params,
|
|
38
|
-
VoucherSeries: params.VoucherSeries || 'A',
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
return data.Voucher;
|
|
43
|
-
}
|
|
44
|
-
const MIME_BY_EXT = {
|
|
45
|
-
'.pdf': 'application/pdf',
|
|
46
|
-
'.png': 'image/png',
|
|
47
|
-
'.jpg': 'image/jpeg',
|
|
48
|
-
'.jpeg': 'image/jpeg',
|
|
49
|
-
'.gif': 'image/gif',
|
|
50
|
-
'.webp': 'image/webp',
|
|
51
|
-
'.heic': 'image/heic',
|
|
52
|
-
'.tif': 'image/tiff',
|
|
53
|
-
'.tiff': 'image/tiff',
|
|
54
|
-
'.txt': 'text/plain',
|
|
55
|
-
'.csv': 'text/csv',
|
|
56
|
-
'.xml': 'application/xml',
|
|
57
|
-
};
|
|
58
|
-
function mimeForFile(filePath) {
|
|
59
|
-
return MIME_BY_EXT[extname(filePath).toLowerCase()] ?? 'application/octet-stream';
|
|
60
|
-
}
|
|
61
|
-
// Upload a single file to the Fortnox inbox; returns the archived File object (has .Id).
|
|
62
|
-
export async function uploadInboxFile(filePath) {
|
|
63
|
-
const buf = readFileSync(filePath);
|
|
64
|
-
const form = new FormData();
|
|
65
|
-
form.append('file', new Blob([buf], { type: mimeForFile(filePath) }), basename(filePath));
|
|
66
|
-
const data = await fortnoxRequest('inbox', { method: 'POST', rawBody: form });
|
|
67
|
-
return data.File;
|
|
68
|
-
}
|
|
69
|
-
// Link an already-uploaded file (by id) to a voucher. The financial year goes in
|
|
70
|
-
// the `financialyear` query param, NOT the body: Fortnox treats VoucherYear in
|
|
71
|
-
// the body as read-only (rejects it with error 2000321) and derives it from the
|
|
72
|
-
// voucher itself.
|
|
73
|
-
export async function createVoucherFileConnection(series, voucherNumber, fileId, financialYear) {
|
|
74
|
-
const data = await fortnoxRequest('voucherfileconnections', {
|
|
75
|
-
method: 'POST',
|
|
76
|
-
body: {
|
|
77
|
-
VoucherFileConnection: {
|
|
78
|
-
FileId: fileId,
|
|
79
|
-
VoucherSeries: series,
|
|
80
|
-
VoucherNumber: voucherNumber,
|
|
27
|
+
async function getVoucher(series, voucherNumber, financialYear) {
|
|
28
|
+
const params = {};
|
|
29
|
+
if (financialYear)
|
|
30
|
+
params.financialyear = financialYear;
|
|
31
|
+
const data = await transport.request(`vouchers/${voucherSeriesSegment(series)}/${encodeURIComponent(voucherNumber)}`, { params });
|
|
32
|
+
return data.Voucher;
|
|
33
|
+
}
|
|
34
|
+
async function createVoucher(params) {
|
|
35
|
+
const data = await transport.request('vouchers', {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
body: {
|
|
38
|
+
Voucher: {
|
|
39
|
+
...params,
|
|
40
|
+
VoucherSeries: params.VoucherSeries || 'A',
|
|
41
|
+
},
|
|
81
42
|
},
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
});
|
|
85
|
-
return data.VoucherFileConnection;
|
|
86
|
-
}
|
|
87
|
-
// Resolve the financial year from the voucher's transaction date when not given.
|
|
88
|
-
// Throws (rather than silently leaving the year undefined) when it can't be
|
|
89
|
-
// determined, so the user knows to pass --year explicitly — e.g. for a voucher
|
|
90
|
-
// in a past financial year, which getVoucher can't fetch without the year.
|
|
91
|
-
async function resolveVoucherFinancialYear(series, voucherNumber) {
|
|
92
|
-
const voucher = await getVoucher(series, voucherNumber);
|
|
93
|
-
const date = voucher.TransactionDate;
|
|
94
|
-
if (!date) {
|
|
95
|
-
throw new Error(`Could not determine the financial year: voucher ${series}/${voucherNumber} has no TransactionDate. Pass --year explicitly.`);
|
|
43
|
+
});
|
|
44
|
+
return data.Voucher;
|
|
96
45
|
}
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
46
|
+
const MIME_BY_EXT = {
|
|
47
|
+
'.pdf': 'application/pdf',
|
|
48
|
+
'.png': 'image/png',
|
|
49
|
+
'.jpg': 'image/jpeg',
|
|
50
|
+
'.jpeg': 'image/jpeg',
|
|
51
|
+
'.gif': 'image/gif',
|
|
52
|
+
'.webp': 'image/webp',
|
|
53
|
+
'.heic': 'image/heic',
|
|
54
|
+
'.tif': 'image/tiff',
|
|
55
|
+
'.tiff': 'image/tiff',
|
|
56
|
+
'.txt': 'text/plain',
|
|
57
|
+
'.csv': 'text/csv',
|
|
58
|
+
'.xml': 'application/xml',
|
|
59
|
+
};
|
|
60
|
+
function mimeForFile(filePath) {
|
|
61
|
+
return MIME_BY_EXT[extname(filePath).toLowerCase()] ?? 'application/octet-stream';
|
|
101
62
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
63
|
+
// Upload a single file to the Fortnox inbox; returns the archived File object (has .Id).
|
|
64
|
+
async function uploadInboxFile(filePath) {
|
|
65
|
+
const buf = readFileSync(filePath);
|
|
66
|
+
const form = new FormData();
|
|
67
|
+
form.append('file', new Blob([buf], { type: mimeForFile(filePath) }), basename(filePath));
|
|
68
|
+
const data = await transport.request('inbox', {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
rawBody: form,
|
|
71
|
+
});
|
|
72
|
+
return data.File;
|
|
73
|
+
}
|
|
74
|
+
// Link an already-uploaded file (by id) to a voucher. The financial year goes in
|
|
75
|
+
// the `financialyear` query param, NOT the body: Fortnox treats VoucherYear in
|
|
76
|
+
// the body as read-only (rejects it with error 2000321) and derives it from the
|
|
77
|
+
// voucher itself.
|
|
78
|
+
async function createVoucherFileConnection(series, voucherNumber, fileId, financialYear) {
|
|
79
|
+
const data = await transport.request('voucherfileconnections', {
|
|
80
|
+
method: 'POST',
|
|
81
|
+
body: {
|
|
82
|
+
VoucherFileConnection: {
|
|
83
|
+
FileId: fileId,
|
|
84
|
+
VoucherSeries: series,
|
|
85
|
+
VoucherNumber: voucherNumber,
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
params: financialYear !== undefined ? { financialyear: financialYear } : undefined,
|
|
89
|
+
});
|
|
90
|
+
return data.VoucherFileConnection;
|
|
91
|
+
}
|
|
92
|
+
// Resolve the financial year from the voucher's transaction date when not given.
|
|
93
|
+
// Throws (rather than silently leaving the year undefined) when it can't be
|
|
94
|
+
// determined, so the user knows to pass --year explicitly — e.g. for a voucher
|
|
95
|
+
// in a past financial year, which getVoucher can't fetch without the year.
|
|
96
|
+
async function resolveVoucherFinancialYear(series, voucherNumber) {
|
|
97
|
+
const voucher = await getVoucher(series, voucherNumber);
|
|
98
|
+
const date = voucher.TransactionDate;
|
|
99
|
+
if (!date) {
|
|
100
|
+
throw new Error(`Could not determine the financial year: voucher ${series}/${voucherNumber} has no TransactionDate. Pass --year explicitly.`);
|
|
111
101
|
}
|
|
112
|
-
|
|
113
|
-
|
|
102
|
+
const fy = await listFinancialYears({ date });
|
|
103
|
+
const list = (fy.FinancialYears ?? []);
|
|
104
|
+
if (!list.length) {
|
|
105
|
+
throw new Error(`No financial year found for voucher date ${date}. Pass --year explicitly.`);
|
|
114
106
|
}
|
|
107
|
+
return Number(list[0].Id);
|
|
115
108
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
109
|
+
// Orchestrate: resolve year if omitted, then upload+connect each file in order.
|
|
110
|
+
async function attachVoucherFiles(params) {
|
|
111
|
+
// Pre-flight: confirm every file exists before uploading any of them, so a
|
|
112
|
+
// typo in a later path can't leave earlier files orphaned in the inbox.
|
|
113
|
+
for (const filePath of params.filePaths) {
|
|
114
|
+
if (!existsSync(filePath)) {
|
|
115
|
+
throw new Error(`File not found: ${filePath}`);
|
|
116
|
+
}
|
|
117
|
+
if (!statSync(filePath).isFile()) {
|
|
118
|
+
throw new Error(`Not a file: ${filePath}`);
|
|
119
|
+
}
|
|
127
120
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
121
|
+
const year = params.financialYear ??
|
|
122
|
+
(await resolveVoucherFinancialYear(params.series, params.voucherNumber));
|
|
123
|
+
const results = [];
|
|
124
|
+
for (const filePath of params.filePaths) {
|
|
125
|
+
try {
|
|
126
|
+
const file = await uploadInboxFile(filePath);
|
|
127
|
+
// Per Fortnox docs (best-practices/vouchers): use the uploaded file's
|
|
128
|
+
// `Id` as the VoucherFileConnection FileId — NOT ArchiveFileId.
|
|
129
|
+
const fileId = String(file.Id);
|
|
130
|
+
const connection = await createVoucherFileConnection(params.series, params.voucherNumber, fileId, year);
|
|
131
|
+
results.push({ fileName: basename(filePath), fileId, voucherYear: year, connection });
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
// Surface what already succeeded so the user can locate/clean up any files
|
|
135
|
+
// uploaded to the inbox before this failure.
|
|
136
|
+
const done = results.map((r) => r.fileName).join(', ') || 'none';
|
|
137
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
138
|
+
throw new Error(`Failed attaching "${basename(filePath)}" to voucher ${params.series}/${params.voucherNumber}: ${detail}. Files already attached this run: ${done}.`);
|
|
139
|
+
}
|
|
134
140
|
}
|
|
141
|
+
return results;
|
|
135
142
|
}
|
|
136
|
-
return
|
|
143
|
+
return {
|
|
144
|
+
listVouchers,
|
|
145
|
+
getVoucher,
|
|
146
|
+
createVoucher,
|
|
147
|
+
uploadInboxFile,
|
|
148
|
+
createVoucherFileConnection,
|
|
149
|
+
attachVoucherFiles,
|
|
150
|
+
};
|
|
137
151
|
}
|
|
152
|
+
export const { listVouchers, getVoucher, createVoucher, uploadInboxFile, createVoucherFileConnection, attachVoucherFiles, } = createVoucherOperations(defaultFortnoxTransport);
|
|
138
153
|
//# sourceMappingURL=vouchers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vouchers.js","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"vouchers.js","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SchemaAuditMapping } from './schema-audit.js';
|
|
2
|
+
/**
|
|
3
|
+
* First-wave write-schema coverage mappings.
|
|
4
|
+
*
|
|
5
|
+
* Component names are already part of the committed opaque API fingerprint. The
|
|
6
|
+
* OpenAPI document and its property names remain in the git-ignored local cache.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SCHEMA_AUDIT_MAPPINGS: readonly SchemaAuditMapping[];
|
|
9
|
+
//# sourceMappingURL=schema-audit-mappings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-audit-mappings.d.ts","sourceRoot":"","sources":["../src/schema-audit-mappings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAqC9D,CAAC"}
|