noxctl 0.2.0 → 0.3.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.
Files changed (76) hide show
  1. package/README.md +93 -0
  2. package/dist/auth.d.ts +1 -1
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +7 -2
  5. package/dist/auth.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +729 -91
  8. package/dist/cli.js.map +1 -1
  9. package/dist/completions.d.ts +13 -0
  10. package/dist/completions.d.ts.map +1 -0
  11. package/dist/completions.js +150 -0
  12. package/dist/completions.js.map +1 -0
  13. package/dist/credentials-store.d.ts.map +1 -1
  14. package/dist/credentials-store.js +45 -16
  15. package/dist/credentials-store.js.map +1 -1
  16. package/dist/date-periods.d.ts +14 -0
  17. package/dist/date-periods.d.ts.map +1 -0
  18. package/dist/date-periods.js +103 -0
  19. package/dist/date-periods.js.map +1 -0
  20. package/dist/formatter.d.ts +11 -2
  21. package/dist/formatter.d.ts.map +1 -1
  22. package/dist/formatter.js +27 -4
  23. package/dist/formatter.js.map +1 -1
  24. package/dist/fortnox-client.d.ts +1 -0
  25. package/dist/fortnox-client.d.ts.map +1 -1
  26. package/dist/fortnox-client.js +14 -3
  27. package/dist/fortnox-client.js.map +1 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +7 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/keychain-target.d.ts +32 -0
  32. package/dist/keychain-target.d.ts.map +1 -0
  33. package/dist/keychain-target.js +349 -0
  34. package/dist/keychain-target.js.map +1 -0
  35. package/dist/operations/analytics.d.ts +84 -0
  36. package/dist/operations/analytics.d.ts.map +1 -0
  37. package/dist/operations/analytics.js +154 -0
  38. package/dist/operations/analytics.js.map +1 -0
  39. package/dist/operations/contracts.d.ts +23 -0
  40. package/dist/operations/contracts.d.ts.map +1 -0
  41. package/dist/operations/contracts.js +52 -0
  42. package/dist/operations/contracts.js.map +1 -0
  43. package/dist/operations/customers.d.ts.map +1 -1
  44. package/dist/operations/customers.js +12 -2
  45. package/dist/operations/customers.js.map +1 -1
  46. package/dist/operations/financial-years.d.ts +16 -0
  47. package/dist/operations/financial-years.d.ts.map +1 -0
  48. package/dist/operations/financial-years.js +32 -0
  49. package/dist/operations/financial-years.js.map +1 -0
  50. package/dist/operations/vouchers.d.ts +15 -0
  51. package/dist/operations/vouchers.d.ts.map +1 -1
  52. package/dist/operations/vouchers.js +97 -0
  53. package/dist/operations/vouchers.js.map +1 -1
  54. package/dist/tools/analytics.d.ts +3 -0
  55. package/dist/tools/analytics.d.ts.map +1 -0
  56. package/dist/tools/analytics.js +52 -0
  57. package/dist/tools/analytics.js.map +1 -0
  58. package/dist/tools/bookkeeping.d.ts.map +1 -1
  59. package/dist/tools/bookkeeping.js +38 -2
  60. package/dist/tools/bookkeeping.js.map +1 -1
  61. package/dist/tools/contracts.d.ts +3 -0
  62. package/dist/tools/contracts.d.ts.map +1 -0
  63. package/dist/tools/contracts.js +136 -0
  64. package/dist/tools/contracts.js.map +1 -0
  65. package/dist/tools/financial-years.d.ts +3 -0
  66. package/dist/tools/financial-years.d.ts.map +1 -0
  67. package/dist/tools/financial-years.js +33 -0
  68. package/dist/tools/financial-years.js.map +1 -0
  69. package/dist/tools/status.d.ts.map +1 -1
  70. package/dist/tools/status.js +6 -1
  71. package/dist/tools/status.js.map +1 -1
  72. package/dist/views.d.ts +8 -0
  73. package/dist/views.d.ts.map +1 -1
  74. package/dist/views.js +57 -0
  75. package/dist/views.js.map +1 -1
  76. package/package.json +1 -1
@@ -0,0 +1,52 @@
1
+ import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
2
+ import { documentSegment } from '../identifiers.js';
3
+ export async function listContracts(params = {}) {
4
+ const queryParams = {
5
+ filter: params.filter,
6
+ };
7
+ if (params.all) {
8
+ const { items, totalResources } = await fetchAllPages('contracts', 'Contracts', queryParams);
9
+ return {
10
+ Contracts: items,
11
+ MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
12
+ };
13
+ }
14
+ return fortnoxRequest('contracts', {
15
+ params: { ...queryParams, page: params.page || 1, limit: params.limit || 100 },
16
+ });
17
+ }
18
+ export async function getContract(documentNumber) {
19
+ const data = await fortnoxRequest(`contracts/${documentSegment(documentNumber)}`);
20
+ return data.Contract;
21
+ }
22
+ export async function createContract(params) {
23
+ const data = await fortnoxRequest('contracts', {
24
+ method: 'POST',
25
+ body: { Contract: params },
26
+ });
27
+ return data.Contract;
28
+ }
29
+ export async function updateContract(documentNumber, fields) {
30
+ const { documentNumber: _, ...body } = fields;
31
+ const data = await fortnoxRequest(`contracts/${documentSegment(documentNumber)}`, {
32
+ method: 'PUT',
33
+ body: { Contract: body },
34
+ });
35
+ return data.Contract;
36
+ }
37
+ // Mark the contract as finished — no further invoices will be created.
38
+ export async function finishContract(documentNumber) {
39
+ const data = await fortnoxRequest(`contracts/${documentSegment(documentNumber)}/finish`, { method: 'PUT' });
40
+ return data?.Contract || {};
41
+ }
42
+ // Create the next invoice from the contract immediately. Returns the Invoice.
43
+ export async function createInvoiceFromContract(documentNumber) {
44
+ const data = await fortnoxRequest(`contracts/${documentSegment(documentNumber)}/createinvoice`, { method: 'PUT' });
45
+ return data?.Invoice || {};
46
+ }
47
+ // Extend a non-continuous contract by one invoice.
48
+ export async function increaseInvoiceCount(documentNumber) {
49
+ const data = await fortnoxRequest(`contracts/${documentSegment(documentNumber)}/increaseinvoicecount`, { method: 'PUT' });
50
+ return data?.Contract || {};
51
+ }
52
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/operations/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAsBpD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAA8B,EAAE;IAClE,MAAM,WAAW,GAAgD;QAC/D,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,WAAW,EACX,WAAW,EACX,WAAW,CACZ,CAAC;QACF,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAoB,WAAW,EAAE;QACpD,MAAM,EAAE,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,cAAsB;IACtD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,EAAE,CAC/C,CAAC;IACF,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAmB,WAAW,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;KAC3B,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,cAAsB,EACtB,MAA+B;IAE/B,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,EAAE,EAC9C;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KACzB,CACF,CAAC;IACF,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,cAAsB;IACzD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,SAAS,EACrD,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;IACF,OAAO,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,cAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,gBAAgB,EAC5D,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;IACF,OAAO,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,cAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,uBAAuB,EACnE,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;IACF,OAAO,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;AAC9B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"customers.d.ts","sourceRoot":"","sources":["../../src/operations/customers.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACrC,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,mBAAmB;IAClC,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,wBAAsB,aAAa,CAAC,MAAM,GAAE,mBAAwB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoBhG;AAED,wBAAsB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAK1F;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC;AAED,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC"}
1
+ {"version":3,"file":"customers.d.ts","sourceRoot":"","sources":["../../src/operations/customers.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACrC,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,mBAAmB;IAClC,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,wBAAsB,aAAa,CAAC,MAAM,GAAE,mBAAwB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoBhG;AAED,wBAAsB,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAK1F;AAaD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC;AAED,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC"}
@@ -19,10 +19,20 @@ export async function getCustomer(customerNumber) {
19
19
  const data = await fortnoxRequest(`customers/${customerSegment(customerNumber)}`);
20
20
  return data.Customer;
21
21
  }
22
+ // Server-derived display fields Fortnox rejects on write ("Fältet Country är
23
+ // endast läsbart"). Stripping them lets a `get` response be fed back into
24
+ // create/update unchanged; the *CountryCode fields remain the writable source.
25
+ const READ_ONLY_CUSTOMER_FIELDS = ['Country', 'DeliveryCountry', 'VisitingCountry'];
26
+ function stripReadOnlyFields(params) {
27
+ const writable = { ...params };
28
+ for (const field of READ_ONLY_CUSTOMER_FIELDS)
29
+ delete writable[field];
30
+ return writable;
31
+ }
22
32
  export async function createCustomer(params) {
23
33
  const data = await fortnoxRequest('customers', {
24
34
  method: 'POST',
25
- body: { Customer: params },
35
+ body: { Customer: stripReadOnlyFields(params) },
26
36
  });
27
37
  return data.Customer;
28
38
  }
@@ -30,7 +40,7 @@ export async function updateCustomer(customerNumber, fields) {
30
40
  const { customerNumber: _, ...body } = fields;
31
41
  const data = await fortnoxRequest(`customers/${customerSegment(customerNumber)}`, {
32
42
  method: 'PUT',
33
- body: { Customer: body },
43
+ body: { Customer: stripReadOnlyFields(body) },
34
44
  });
35
45
  return data.Customer;
36
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"customers.js","sourceRoot":"","sources":["../../src/operations/customers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkBpD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAA8B,EAAE;IAClE,MAAM,WAAW,GAAgD;QAC/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,WAAW,EACX,WAAW,EACX,WAAW,CACZ,CAAC;QACF,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAoB,WAAW,EAAE;QACpD,MAAM,EAAE,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,cAAsB;IACtD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,EAAE,CAC/C,CAAC;IACF,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAmB,WAAW,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;KAC3B,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,cAAsB,EACtB,MAA+B;IAE/B,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,EAAE,EAC9C;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KACzB,CACF,CAAC;IACF,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"customers.js","sourceRoot":"","sources":["../../src/operations/customers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAkBpD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAA8B,EAAE;IAClE,MAAM,WAAW,GAAgD;QAC/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,WAAW,EACX,WAAW,EACX,WAAW,CACZ,CAAC;QACF,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAoB,WAAW,EAAE;QACpD,MAAM,EAAE,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,cAAsB;IACtD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,EAAE,CAC/C,CAAC;IACF,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,6EAA6E;AAC7E,0EAA0E;AAC1E,+EAA+E;AAC/E,MAAM,yBAAyB,GAAG,CAAC,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,CAAU,CAAC;AAE7F,SAAS,mBAAmB,CAAC,MAA+B;IAC1D,MAAM,QAAQ,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,yBAAyB;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAmB,WAAW,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,QAAQ,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE;KAChD,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,cAAsB,EACtB,MAA+B;IAE/B,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,eAAe,CAAC,cAAc,CAAC,EAAE,EAC9C;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAE;KAC9C,CACF,CAAC;IACF,OAAO,IAAI,CAAC,QAAQ,CAAC;AACvB,CAAC"}
@@ -0,0 +1,16 @@
1
+ interface FinancialYearsResponse {
2
+ FinancialYears: Record<string, unknown>[];
3
+ MetaInformation?: {
4
+ '@TotalResources': number;
5
+ '@TotalPages': number;
6
+ '@CurrentPage': number;
7
+ };
8
+ }
9
+ export interface ListFinancialYearsParams {
10
+ date?: string;
11
+ }
12
+ export declare function listFinancialYears(params?: ListFinancialYearsParams): Promise<FinancialYearsResponse>;
13
+ export declare function getFinancialYear(id: number): Promise<Record<string, unknown>>;
14
+ export declare function getLockedPeriod(): Promise<Record<string, unknown>>;
15
+ export {};
16
+ //# sourceMappingURL=financial-years.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"financial-years.d.ts","sourceRoot":"","sources":["../../src/operations/financial-years.ts"],"names":[],"mappings":"AAMA,UAAU,sBAAsB;IAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC1C,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAMD,MAAM,WAAW,wBAAwB;IAEvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,sBAAsB,CAAC,CAcjC;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMnF;AAKD,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAGxE"}
@@ -0,0 +1,32 @@
1
+ import { fortnoxRequest } from '../fortnox-client.js';
2
+ export async function listFinancialYears(params = {}) {
3
+ // Fortnox's /3/financialyears does NOT support a date query filter — passing
4
+ // ?Date=... returns 400 "Ogiltig parameter" (error 2000588). So fetch all
5
+ // years and, when a date is given, filter locally to the year whose
6
+ // From/To-date range brackets it (YYYY-MM-DD compares lexicographically).
7
+ const data = await fortnoxRequest('financialyears');
8
+ if (!params.date)
9
+ return data;
10
+ const d = params.date;
11
+ const matching = (data.FinancialYears ?? []).filter((fy) => {
12
+ const from = String(fy.FromDate ?? '');
13
+ const to = String(fy.ToDate ?? '');
14
+ return from !== '' && to !== '' && from <= d && d <= to;
15
+ });
16
+ return { ...data, FinancialYears: matching };
17
+ }
18
+ export async function getFinancialYear(id) {
19
+ if (!Number.isInteger(id) || id < 0) {
20
+ throw new Error(`Invalid financial year id: ${id}`);
21
+ }
22
+ const data = await fortnoxRequest(`financialyears/${id}`);
23
+ return data.FinancialYear;
24
+ }
25
+ // The locked period (bokföring låst t.o.m.). An empty object means no period
26
+ // is locked. Useful as context before voucher/invoice writes to avoid
27
+ // "period is locked" API errors.
28
+ export async function getLockedPeriod() {
29
+ const data = await fortnoxRequest('settings/lockedperiod');
30
+ return data.LockedPeriod ?? {};
31
+ }
32
+ //# sourceMappingURL=financial-years.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"financial-years.js","sourceRoot":"","sources":["../../src/operations/financial-years.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAoBtD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAmC,EAAE;IAErC,6EAA6E;IAC7E,0EAA0E;IAC1E,oEAAoE;IACpE,0EAA0E;IAC1E,MAAM,IAAI,GAAG,MAAM,cAAc,CAAyB,gBAAgB,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IACtB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACnC,OAAO,IAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAU;IAC/C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAwB,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,aAAa,CAAC;AAC5B,CAAC;AAED,6EAA6E;AAC7E,sEAAsE;AACtE,iCAAiC;AACjC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAuB,uBAAuB,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;AACjC,CAAC"}
@@ -18,5 +18,20 @@ export interface ListVouchersParams {
18
18
  export declare function listVouchers(params?: ListVouchersParams): Promise<VouchersResponse>;
19
19
  export declare function getVoucher(series: string, voucherNumber: string, financialYear?: number): Promise<Record<string, unknown>>;
20
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
+ export interface AttachVoucherFilesParams {
24
+ series: string;
25
+ voucherNumber: string;
26
+ filePaths: string[];
27
+ financialYear?: number;
28
+ }
29
+ export interface VoucherFileAttachment {
30
+ fileName: string;
31
+ fileId: string;
32
+ voucherYear: number;
33
+ connection: Record<string, unknown>;
34
+ }
35
+ export declare function attachVoucherFiles(params: AttachVoucherFilesParams): Promise<VoucherFileAttachment[]>;
21
36
  export {};
22
37
  //# sourceMappingURL=vouchers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vouchers.d.ts","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"AAOA,UAAU,gBAAgB;IACxB,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,wBAAsB,YAAY,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwB7F;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQlC;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC"}
1
+ {"version":3,"file":"vouchers.d.ts","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"AAUA,UAAU,gBAAgB;IACxB,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,wBAAsB,YAAY,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwB7F;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQlC;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC;AA6BD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMxF;AAMD,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAalC;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;AACD,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;AAuBD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAyClC"}
@@ -1,5 +1,8 @@
1
+ import { readFileSync, existsSync, statSync } from 'node:fs';
2
+ import { basename, extname } from 'node:path';
1
3
  import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
2
4
  import { voucherSeriesSegment } from '../identifiers.js';
5
+ import { listFinancialYears } from './financial-years.js';
3
6
  export async function listVouchers(params = {}) {
4
7
  const subpath = params.series ? `sublist/${voucherSeriesSegment(params.series)}` : '';
5
8
  const endpoint = `vouchers/${subpath}`;
@@ -38,4 +41,98 @@ export async function createVoucher(params) {
38
41
  });
39
42
  return data.Voucher;
40
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,
81
+ },
82
+ },
83
+ params: financialYear !== undefined ? { financialyear: financialYear } : undefined,
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.`);
96
+ }
97
+ const fy = await listFinancialYears({ date });
98
+ const list = (fy.FinancialYears ?? []);
99
+ if (!list.length) {
100
+ throw new Error(`No financial year found for voucher date ${date}. Pass --year explicitly.`);
101
+ }
102
+ return Number(list[0].Id);
103
+ }
104
+ // Orchestrate: resolve year if omitted, then upload+connect each file in order.
105
+ export async function attachVoucherFiles(params) {
106
+ // Pre-flight: confirm every file exists before uploading any of them, so a
107
+ // typo in a later path can't leave earlier files orphaned in the inbox.
108
+ for (const filePath of params.filePaths) {
109
+ if (!existsSync(filePath)) {
110
+ throw new Error(`File not found: ${filePath}`);
111
+ }
112
+ if (!statSync(filePath).isFile()) {
113
+ throw new Error(`Not a file: ${filePath}`);
114
+ }
115
+ }
116
+ const year = params.financialYear ??
117
+ (await resolveVoucherFinancialYear(params.series, params.voucherNumber));
118
+ const results = [];
119
+ for (const filePath of params.filePaths) {
120
+ try {
121
+ const file = await uploadInboxFile(filePath);
122
+ // Per Fortnox docs (best-practices/vouchers): use the uploaded file's
123
+ // `Id` as the VoucherFileConnection FileId — NOT ArchiveFileId.
124
+ const fileId = String(file.Id);
125
+ const connection = await createVoucherFileConnection(params.series, params.voucherNumber, fileId, year);
126
+ results.push({ fileName: basename(filePath), fileId, voucherYear: year, connection });
127
+ }
128
+ catch (err) {
129
+ // Surface what already succeeded so the user can locate/clean up any files
130
+ // uploaded to the inbox before this failure.
131
+ const done = results.map((r) => r.fileName).join(', ') || 'none';
132
+ const detail = err instanceof Error ? err.message : String(err);
133
+ throw new Error(`Failed attaching "${basename(filePath)}" to voucher ${params.series}/${params.voucherNumber}: ${detail}. Files already attached this run: ${done}.`);
134
+ }
135
+ }
136
+ return results;
137
+ }
41
138
  //# sourceMappingURL=vouchers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vouchers.js","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAqBzD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAA6B,EAAE;IAChE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,MAAM,QAAQ,GAAG,YAAY,OAAO,EAAE,CAAC;IACvC,MAAM,WAAW,GAAgD;QAC/D,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,QAAQ,EACR,UAAU,EACV,WAAW,CACZ,CAAC;QACF,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAmB,QAAQ,EAAE;QAChD,MAAM,EAAE,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,aAAqB,EACrB,aAAsB;IAEtB,MAAM,MAAM,GAAgD,EAAE,CAAC;IAC/D,IAAI,aAAa;QAAE,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,YAAY,oBAAoB,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,aAAa,CAAC,EAAE,EAC/E,EAAE,MAAM,EAAE,CACX,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAkB,UAAU,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,IAAI,EAAE;YACJ,OAAO,EAAE;gBACP,GAAG,MAAM;gBACT,aAAa,EAAG,MAAM,CAAC,aAAwB,IAAI,GAAG;aACvD;SACF;KACF,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,OAAO,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"vouchers.js","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAnalyticsTools(server: McpServer): void;
3
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8E9D"}
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ import { getOverdueSummary, getUnpaidTotals, getTopCustomers, getVatSummary, } from '../operations/analytics.js';
3
+ import { invoiceListColumns, topCustomerColumns } from '../views.js';
4
+ import { formatTable, formatTaxReport } from '../formatter.js';
5
+ import { textResponse } from '../tool-output.js';
6
+ export function registerAnalyticsTools(server) {
7
+ server.tool('fortnox_overdue_invoices', 'Sammanfattning av förfallna obetalda fakturor: antal, totalt utestående belopp, äldsta förfallodatum och listan (äldst först). Användbart för snabb ekonomisk överblick.', {}, async () => {
8
+ const summary = await getOverdueSummary();
9
+ if (summary.count === 0) {
10
+ return textResponse('Inga förfallna fakturor.');
11
+ }
12
+ const lines = [
13
+ `Förfallna fakturor: ${summary.count} st, ${summary.totalBalance.toFixed(2)} utestående.`,
14
+ `Äldsta förfallodatum: ${summary.oldestDueDate}.`,
15
+ '',
16
+ formatTable(summary.invoices, invoiceListColumns),
17
+ ];
18
+ return textResponse(lines.join('\n'));
19
+ });
20
+ server.tool('fortnox_unpaid_totals', 'Totalt utestående kundfordringar: antal obetalda fakturor och summa, med förfallen andel separat.', {}, async () => {
21
+ const s = await getUnpaidTotals();
22
+ return textResponse([
23
+ `Obetalda fakturor: ${s.count} st, ${s.totalBalance.toFixed(2)} utestående.`,
24
+ `Varav förfallna: ${s.overdueCount} st, ${s.overdueBalance.toFixed(2)}.`,
25
+ ].join('\n'));
26
+ });
27
+ server.tool('fortnox_top_customers', 'Största kunder efter fakturerat belopp under en period. Returnerar kund, totalbelopp och antal fakturor.', {
28
+ fromDate: z.string().optional().describe('Från datum (YYYY-MM-DD)'),
29
+ toDate: z.string().optional().describe('Till datum (YYYY-MM-DD)'),
30
+ limit: z.number().optional().describe('Antal kunder (default 10)'),
31
+ }, async ({ fromDate, toDate, limit }) => {
32
+ const result = await getTopCustomers({ fromDate, toDate, limit });
33
+ if (result.customers.length === 0) {
34
+ return textResponse('Inga fakturor i perioden.');
35
+ }
36
+ const period = result.period.from || result.period.to
37
+ ? `Period: ${result.period.from ?? '…'} — ${result.period.to ?? '…'}\n\n`
38
+ : '';
39
+ return textResponse(period +
40
+ formatTable(result.customers.map((c) => ({ ...c })), topCustomerColumns));
41
+ });
42
+ server.tool('fortnox_vat_summary', 'Momssammanfattning för en period: momskonton med debet/kredit samt netto momsposition (negativt = att betala till Skatteverket).', {
43
+ fromDate: z.string().describe('Från datum (YYYY-MM-DD)'),
44
+ toDate: z.string().describe('Till datum (YYYY-MM-DD)'),
45
+ financialYear: z.number().optional().describe('Räkenskapsår (Id)'),
46
+ }, async ({ fromDate, toDate, financialYear }) => {
47
+ const summary = await getVatSummary({ fromDate, toDate, financialYear });
48
+ const netVat = summary.netVat;
49
+ return textResponse(formatTaxReport(summary) + `\n\nNetto moms: ${netVat.toFixed(2)} (negativt = att betala)`);
50
+ });
51
+ }
52
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bookkeeping.d.ts","sourceRoot":"","sources":["../../src/tools/bookkeeping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6BpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoGhE"}
1
+ {"version":3,"file":"bookkeeping.d.ts","sourceRoot":"","sources":["../../src/tools/bookkeeping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmJhE"}
@@ -1,8 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  import { listAccounts } from '../operations/accounts.js';
3
- import { listVouchers, getVoucher, createVoucher } from '../operations/vouchers.js';
3
+ import { listVouchers, getVoucher, createVoucher, attachVoucherFiles, } from '../operations/vouchers.js';
4
4
  import { accountListColumns, voucherDetailColumns, voucherListColumns, voucherRowColumns, } from '../views.js';
5
- import { detailResponse, dryRunResponse, listResponse, requireConfirmation, } from '../tool-output.js';
5
+ import { detailResponse, dryRunResponse, listResponse, requireConfirmation, textResponse, } from '../tool-output.js';
6
6
  const VoucherRowSchema = z.object({
7
7
  Account: z.number().describe('Kontonummer'),
8
8
  Debit: z.number().optional().describe('Debetbelopp'),
@@ -78,5 +78,41 @@ export function registerBookkeepingTools(server) {
78
78
  const data = await listAccounts(params);
79
79
  return listResponse(data.Accounts ?? [], accountListColumns, data, data.MetaInformation, includeRaw);
80
80
  });
81
+ server.tool('fortnox_attach_voucher_files', 'Ladda upp kvitto/underlagsfiler och koppla dem till en verifikation i Fortnox', {
82
+ series: z.string().describe('Verifikationsserie (t.ex. "A")'),
83
+ voucherNumber: z.string().describe('Verifikationsnummer'),
84
+ files: z.array(z.string()).describe('Sökvägar till filer som ska laddas upp och kopplas'),
85
+ year: z
86
+ .number()
87
+ .optional()
88
+ .describe('Räkenskapsår (härleds från verifikationsdatum om utelämnat)'),
89
+ confirm: z.boolean().optional().describe('Bekräfta att filerna ska kopplas'),
90
+ dryRun: z
91
+ .boolean()
92
+ .optional()
93
+ .describe('Visa vad som skulle skickas utan att ladda upp filerna'),
94
+ includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
95
+ }, async ({ series, voucherNumber, files, year, confirm, dryRun, includeRaw }) => {
96
+ if (dryRun) {
97
+ return dryRunResponse(`attach ${files.length} file(s) to voucher ${series}/${voucherNumber}`, {
98
+ series,
99
+ voucherNumber,
100
+ files,
101
+ year,
102
+ });
103
+ }
104
+ if (!confirm) {
105
+ requireConfirmation(`attach ${files.length} file(s) to voucher ${series}/${voucherNumber}`);
106
+ }
107
+ const results = await attachVoucherFiles({
108
+ series,
109
+ voucherNumber,
110
+ filePaths: files,
111
+ financialYear: year,
112
+ });
113
+ const ids = results.map((r) => r.fileId).join(', ');
114
+ const summary = `Kopplade ${results.length} fil(er) till verifikation ${series}/${voucherNumber}. Fil-ID: ${ids}`;
115
+ return textResponse(includeRaw ? `${summary}\n\n${JSON.stringify(results, null, 2)}` : summary);
116
+ });
81
117
  }
82
118
  //# sourceMappingURL=bookkeeping.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bookkeeping.js","sourceRoot":"","sources":["../../src/tools/bookkeeping.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bookkeeping.js","sourceRoot":"","sources":["../../src/tools/bookkeeping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerContractTools(server: McpServer): void;
3
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/tools/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+BpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsK7D"}
@@ -0,0 +1,136 @@
1
+ import { z } from 'zod';
2
+ import { listContracts, getContract, createContract, updateContract, finishContract, createInvoiceFromContract, increaseInvoiceCount, } from '../operations/contracts.js';
3
+ import { contractListColumns, contractDetailColumns, invoiceDetailColumns } from '../views.js';
4
+ import { detailResponse, dryRunResponse, listResponse, requireConfirmation, } from '../tool-output.js';
5
+ const invoiceRowSchema = z
6
+ .object({
7
+ ArticleNumber: z.string().optional().describe('Artikelnummer'),
8
+ Description: z.string().optional().describe('Beskrivning av raden'),
9
+ DeliveredQuantity: z.number().optional().describe('Antal'),
10
+ Price: z.number().optional().describe('Pris per enhet'),
11
+ AccountNumber: z.number().optional().describe('Bokföringskonto'),
12
+ VAT: z.number().optional().describe('Momssats (%)'),
13
+ Discount: z.number().optional().describe('Rabatt'),
14
+ })
15
+ .passthrough();
16
+ export function registerContractTools(server) {
17
+ server.tool('fortnox_list_contracts', 'Lista avtal (återkommande fakturering) i Fortnox. Returnerar: DocumentNumber, CustomerName, PeriodStart, PeriodEnd, InvoiceInterval, Continuous, Total.', {
18
+ filter: z
19
+ .enum(['active', 'inactive', 'finished'])
20
+ .optional()
21
+ .describe('Filtrera på avtalsstatus'),
22
+ page: z.number().optional().describe('Sidnummer (default 1)'),
23
+ limit: z.number().optional().describe('Antal per sida (default 100, max 500)'),
24
+ all: z.boolean().optional().describe('Hämta alla sidor (ignorerar page/limit)'),
25
+ includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
26
+ }, async ({ filter, page, limit, all, includeRaw }) => {
27
+ const data = await listContracts({ filter, page, limit, all });
28
+ return listResponse(data.Contracts ?? [], contractListColumns, data, data.MetaInformation, includeRaw);
29
+ });
30
+ server.tool('fortnox_get_contract', 'Hämta ett enskilt avtal från Fortnox, inklusive fakturarader.', {
31
+ documentNumber: z.string().describe('Avtalets dokumentnummer'),
32
+ includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
33
+ }, async ({ documentNumber, includeRaw }) => {
34
+ const data = await getContract(documentNumber);
35
+ return detailResponse(data, contractDetailColumns, data, includeRaw);
36
+ });
37
+ server.tool('fortnox_create_contract', 'Skapa ett nytt avtal i Fortnox för återkommande fakturering. Fakturor skapas automatiskt enligt InvoiceInterval.', {
38
+ CustomerNumber: z.string().describe('Kundnummer'),
39
+ InvoiceRows: z.array(invoiceRowSchema).describe('Fakturarader'),
40
+ PeriodStart: z.string().optional().describe('Avtalsperiodens start (YYYY-MM-DD)'),
41
+ PeriodEnd: z.string().optional().describe('Avtalsperiodens slut (YYYY-MM-DD)'),
42
+ InvoiceInterval: z
43
+ .number()
44
+ .optional()
45
+ .describe('Faktureringsintervall i månader (1, 3, 6, 12)'),
46
+ ContractLength: z.number().optional().describe('Avtalslängd i månader'),
47
+ Continuous: z.boolean().optional().describe('Löpande avtal (utan slutdatum)'),
48
+ Comments: z.string().optional().describe('Kommentar'),
49
+ confirm: z.boolean().optional().describe('Bekräfta att avtalet ska skapas'),
50
+ dryRun: z.boolean().optional().describe('Visa vad som skulle skickas utan att skapa avtalet'),
51
+ includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
52
+ }, async ({ confirm, dryRun, includeRaw, ...params }) => {
53
+ if (dryRun) {
54
+ return dryRunResponse(`create contract for customer ${params.CustomerNumber}`, {
55
+ Contract: params,
56
+ });
57
+ }
58
+ if (!confirm)
59
+ requireConfirmation(`create contract for customer ${params.CustomerNumber}`);
60
+ const data = await createContract(params);
61
+ return detailResponse(data, contractDetailColumns, data, includeRaw);
62
+ });
63
+ server.tool('fortnox_update_contract', 'Uppdatera ett befintligt avtal i Fortnox.', {
64
+ documentNumber: z.string().describe('Avtalets dokumentnummer'),
65
+ InvoiceRows: z
66
+ .array(invoiceRowSchema)
67
+ .optional()
68
+ .describe('Fakturarader (ersätter alla befintliga rader)'),
69
+ PeriodStart: z.string().optional().describe('Avtalsperiodens start (YYYY-MM-DD)'),
70
+ PeriodEnd: z.string().optional().describe('Avtalsperiodens slut (YYYY-MM-DD)'),
71
+ InvoiceInterval: z
72
+ .number()
73
+ .optional()
74
+ .describe('Faktureringsintervall i månader (1, 3, 6, 12)'),
75
+ ContractLength: z.number().optional().describe('Avtalslängd i månader'),
76
+ Continuous: z.boolean().optional().describe('Löpande avtal (utan slutdatum)'),
77
+ Comments: z.string().optional().describe('Kommentar'),
78
+ confirm: z.boolean().optional().describe('Bekräfta att avtalet ska uppdateras'),
79
+ dryRun: z
80
+ .boolean()
81
+ .optional()
82
+ .describe('Visa vad som skulle skickas utan att uppdatera avtalet'),
83
+ includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
84
+ }, async ({ documentNumber, confirm, dryRun, includeRaw, ...fields }) => {
85
+ if (dryRun) {
86
+ return dryRunResponse(`update contract ${documentNumber}`, { Contract: fields });
87
+ }
88
+ if (!confirm)
89
+ requireConfirmation(`update contract ${documentNumber}`);
90
+ const data = await updateContract(documentNumber, fields);
91
+ return detailResponse(data, contractDetailColumns, data, includeRaw);
92
+ });
93
+ server.tool('fortnox_finish_contract', 'Avsluta ett avtal i Fortnox — inga fler fakturor skapas.', {
94
+ documentNumber: z.string().describe('Avtalets dokumentnummer'),
95
+ confirm: z.boolean().optional().describe('Bekräfta att avtalet ska avslutas'),
96
+ dryRun: z.boolean().optional().describe('Visa vad som skulle göras utan att avsluta avtalet'),
97
+ includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
98
+ }, async ({ documentNumber, confirm, dryRun, includeRaw }) => {
99
+ if (dryRun) {
100
+ return dryRunResponse(`finish contract ${documentNumber}`);
101
+ }
102
+ if (!confirm)
103
+ requireConfirmation(`finish contract ${documentNumber}`);
104
+ const data = await finishContract(documentNumber);
105
+ return detailResponse(data, contractDetailColumns, data, includeRaw);
106
+ });
107
+ server.tool('fortnox_create_invoice_from_contract', 'Skapa nästa faktura från ett avtal direkt. Returnerar den skapade fakturan.', {
108
+ documentNumber: z.string().describe('Avtalets dokumentnummer'),
109
+ confirm: z.boolean().optional().describe('Bekräfta att fakturan ska skapas'),
110
+ dryRun: z.boolean().optional().describe('Visa vad som skulle göras utan att skapa fakturan'),
111
+ includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
112
+ }, async ({ documentNumber, confirm, dryRun, includeRaw }) => {
113
+ if (dryRun) {
114
+ return dryRunResponse(`create invoice from contract ${documentNumber}`);
115
+ }
116
+ if (!confirm)
117
+ requireConfirmation(`create invoice from contract ${documentNumber}`);
118
+ const data = await createInvoiceFromContract(documentNumber);
119
+ return detailResponse(data, invoiceDetailColumns, data, includeRaw);
120
+ });
121
+ server.tool('fortnox_increase_contract_invoice_count', 'Utöka ett tidsbegränsat avtal med en faktura (ökar InvoicesRemaining).', {
122
+ documentNumber: z.string().describe('Avtalets dokumentnummer'),
123
+ confirm: z.boolean().optional().describe('Bekräfta utökningen'),
124
+ dryRun: z.boolean().optional().describe('Visa vad som skulle göras utan att utöka avtalet'),
125
+ includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
126
+ }, async ({ documentNumber, confirm, dryRun, includeRaw }) => {
127
+ if (dryRun) {
128
+ return dryRunResponse(`increase invoice count for contract ${documentNumber}`);
129
+ }
130
+ if (!confirm)
131
+ requireConfirmation(`increase invoice count for contract ${documentNumber}`);
132
+ const data = await increaseInvoiceCount(documentNumber);
133
+ return detailResponse(data, contractDetailColumns, data, includeRaw);
134
+ });
135
+ }
136
+ //# sourceMappingURL=contracts.js.map