noxctl 0.2.0 → 0.4.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 +149 -6
- package/dist/auth.d.ts +7 -3
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +24 -7
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1118 -95
- package/dist/cli.js.map +1 -1
- package/dist/completions.d.ts +13 -0
- package/dist/completions.d.ts.map +1 -0
- package/dist/completions.js +150 -0
- package/dist/completions.js.map +1 -0
- package/dist/credentials-store.d.ts.map +1 -1
- package/dist/credentials-store.js +45 -16
- package/dist/credentials-store.js.map +1 -1
- package/dist/date-periods.d.ts +14 -0
- package/dist/date-periods.d.ts.map +1 -0
- package/dist/date-periods.js +103 -0
- package/dist/date-periods.js.map +1 -0
- package/dist/formatter.d.ts +11 -2
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +27 -4
- package/dist/formatter.js.map +1 -1
- package/dist/fortnox-client.d.ts +1 -0
- package/dist/fortnox-client.d.ts.map +1 -1
- package/dist/fortnox-client.js +26 -3
- package/dist/fortnox-client.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/keychain-target.d.ts +32 -0
- package/dist/keychain-target.d.ts.map +1 -0
- package/dist/keychain-target.js +349 -0
- package/dist/keychain-target.js.map +1 -0
- package/dist/operations/absencetransactions.d.ts +21 -0
- package/dist/operations/absencetransactions.d.ts.map +1 -0
- package/dist/operations/absencetransactions.js +36 -0
- package/dist/operations/absencetransactions.js.map +1 -0
- package/dist/operations/analytics.d.ts +84 -0
- package/dist/operations/analytics.d.ts.map +1 -0
- package/dist/operations/analytics.js +154 -0
- package/dist/operations/analytics.js.map +1 -0
- package/dist/operations/attendancetransactions.d.ts +21 -0
- package/dist/operations/attendancetransactions.d.ts.map +1 -0
- package/dist/operations/attendancetransactions.js +40 -0
- package/dist/operations/attendancetransactions.js.map +1 -0
- package/dist/operations/contracts.d.ts +23 -0
- package/dist/operations/contracts.d.ts.map +1 -0
- package/dist/operations/contracts.js +52 -0
- package/dist/operations/contracts.js.map +1 -0
- package/dist/operations/customers.d.ts.map +1 -1
- package/dist/operations/customers.js +12 -2
- package/dist/operations/customers.js.map +1 -1
- package/dist/operations/employees.d.ts +19 -0
- package/dist/operations/employees.d.ts.map +1 -0
- package/dist/operations/employees.js +34 -0
- package/dist/operations/employees.js.map +1 -0
- package/dist/operations/financial-years.d.ts +16 -0
- package/dist/operations/financial-years.d.ts.map +1 -0
- package/dist/operations/financial-years.js +32 -0
- package/dist/operations/financial-years.js.map +1 -0
- package/dist/operations/salarytransactions.d.ts +21 -0
- package/dist/operations/salarytransactions.d.ts.map +1 -0
- package/dist/operations/salarytransactions.js +35 -0
- package/dist/operations/salarytransactions.js.map +1 -0
- package/dist/operations/scheduletimes.d.ts +4 -0
- package/dist/operations/scheduletimes.d.ts.map +1 -0
- package/dist/operations/scheduletimes.js +24 -0
- package/dist/operations/scheduletimes.js.map +1 -0
- package/dist/operations/vouchers.d.ts +15 -0
- package/dist/operations/vouchers.d.ts.map +1 -1
- package/dist/operations/vouchers.js +97 -0
- package/dist/operations/vouchers.js.map +1 -1
- package/dist/tools/absencetransactions.d.ts +3 -0
- package/dist/tools/absencetransactions.d.ts.map +1 -0
- package/dist/tools/absencetransactions.js +66 -0
- package/dist/tools/absencetransactions.js.map +1 -0
- package/dist/tools/analytics.d.ts +3 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +52 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/attendancetransactions.d.ts +3 -0
- package/dist/tools/attendancetransactions.d.ts.map +1 -0
- package/dist/tools/attendancetransactions.js +63 -0
- package/dist/tools/attendancetransactions.js.map +1 -0
- package/dist/tools/bookkeeping.d.ts.map +1 -1
- package/dist/tools/bookkeeping.js +38 -2
- package/dist/tools/bookkeeping.js.map +1 -1
- package/dist/tools/contracts.d.ts +3 -0
- package/dist/tools/contracts.d.ts.map +1 -0
- package/dist/tools/contracts.js +136 -0
- package/dist/tools/contracts.js.map +1 -0
- package/dist/tools/employees.d.ts +3 -0
- package/dist/tools/employees.d.ts.map +1 -0
- package/dist/tools/employees.js +107 -0
- package/dist/tools/employees.js.map +1 -0
- package/dist/tools/financial-years.d.ts +3 -0
- package/dist/tools/financial-years.d.ts.map +1 -0
- package/dist/tools/financial-years.js +33 -0
- package/dist/tools/financial-years.js.map +1 -0
- package/dist/tools/salarytransactions.d.ts +3 -0
- package/dist/tools/salarytransactions.d.ts.map +1 -0
- package/dist/tools/salarytransactions.js +70 -0
- package/dist/tools/salarytransactions.js.map +1 -0
- package/dist/tools/scheduletimes.d.ts +3 -0
- package/dist/tools/scheduletimes.d.ts.map +1 -0
- package/dist/tools/scheduletimes.js +62 -0
- package/dist/tools/scheduletimes.js.map +1 -0
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +10 -3
- package/dist/tools/status.js.map +1 -1
- package/dist/views.d.ts +17 -0
- package/dist/views.d.ts.map +1 -1
- package/dist/views.js +154 -0
- package/dist/views.js.map +1 -1
- package/package.json +2 -1
|
@@ -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":"
|
|
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;
|
|
1
|
+
{"version":3,"file":"vouchers.js","sourceRoot":"","sources":["../../src/operations/vouchers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"absencetransactions.d.ts","sourceRoot":"","sources":["../../src/tools/absencetransactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBpE,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4FvE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { listAbsenceTransactions, getAbsenceTransaction, createAbsenceTransaction, deleteAbsenceTransaction, } from '../operations/absencetransactions.js';
|
|
3
|
+
import { absenceTransactionListColumns, absenceTransactionDetailColumns } from '../views.js';
|
|
4
|
+
import { detailResponse, dryRunResponse, listResponse, requireConfirmation, textResponse, } from '../tool-output.js';
|
|
5
|
+
export function registerAbsenceTransactionTools(server) {
|
|
6
|
+
server.tool('fortnox_list_absencetransactions', 'Lista frånvarotransaktioner i Fortnox (kräver Lön-behörigheten). Returnerar: id, EmployeeId, CauseCode, Date, Hours.', {
|
|
7
|
+
employeeId: z.string().optional().describe('Filtrera på EmployeeId'),
|
|
8
|
+
date: z.string().optional().describe('Filtrera på datum (YYYY-MM-DD)'),
|
|
9
|
+
page: z.number().optional().describe('Sidnummer (default 1)'),
|
|
10
|
+
limit: z.number().optional().describe('Antal per sida (default 100)'),
|
|
11
|
+
all: z.boolean().optional().describe('Hämta alla sidor (ignorerar page/limit)'),
|
|
12
|
+
includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
|
|
13
|
+
}, async ({ employeeId, date, page, limit, all, includeRaw }) => {
|
|
14
|
+
const data = await listAbsenceTransactions({ employeeId, date, page, limit, all });
|
|
15
|
+
return listResponse(data.AbsenceTransactions ?? [], absenceTransactionListColumns, data, data.MetaInformation, includeRaw);
|
|
16
|
+
});
|
|
17
|
+
server.tool('fortnox_get_absencetransaction', 'Hämta en enskild frånvarotransaktion från Fortnox (kräver Lön-behörigheten).', {
|
|
18
|
+
id: z.string().describe('id (UUID) för frånvarotransaktionen'),
|
|
19
|
+
includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
|
|
20
|
+
}, async ({ id, includeRaw }) => {
|
|
21
|
+
const data = await getAbsenceTransaction(id);
|
|
22
|
+
return detailResponse(data, absenceTransactionDetailColumns, data, includeRaw);
|
|
23
|
+
});
|
|
24
|
+
server.tool('fortnox_create_absencetransaction', 'Skapa en ny frånvarotransaktion i Fortnox (kräver Lön-behörigheten). EmployeeId, CauseCode och Date krävs.', {
|
|
25
|
+
EmployeeId: z.string().describe('EmployeeId för den anställde'),
|
|
26
|
+
CauseCode: z
|
|
27
|
+
.string()
|
|
28
|
+
.describe('Frånvarokod. Giltiga koder: ASK, FPE, FRA, HAV, KOM, MIL, NAR, OS1, OS2, OS3, OS4, OS5, PAP, PEM, PER, SEM, SJK, SMB, SVE, TJL, UTB, VAB'),
|
|
29
|
+
Date: z.string().describe('Datum (YYYY-MM-DD)'),
|
|
30
|
+
Hours: z.number().optional().describe('Antal timmar (tal, t.ex. 8)'),
|
|
31
|
+
Extent: z.number().optional().describe('Omfattning i procent (tal, t.ex. 50)'),
|
|
32
|
+
HolidayEntitling: z.boolean().optional().describe('Semestergrundande'),
|
|
33
|
+
CostCenter: z.string().optional().describe('Kostnadsställe'),
|
|
34
|
+
Project: z.string().optional().describe('Projekt'),
|
|
35
|
+
confirm: z.boolean().optional().describe('Bekräfta att frånvarotransaktionen ska skapas'),
|
|
36
|
+
dryRun: z.boolean().optional().describe('Visa vad som skulle skickas utan att skapa'),
|
|
37
|
+
includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
|
|
38
|
+
}, async ({ confirm, dryRun, includeRaw, ...params }) => {
|
|
39
|
+
if (dryRun) {
|
|
40
|
+
return dryRunResponse(`create absence transaction for employee ${params.EmployeeId}`, {
|
|
41
|
+
AbsenceTransaction: params,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (!confirm)
|
|
45
|
+
requireConfirmation(`create absence transaction for employee ${params.EmployeeId}`);
|
|
46
|
+
const data = await createAbsenceTransaction(params);
|
|
47
|
+
return detailResponse(data, absenceTransactionDetailColumns, data, includeRaw);
|
|
48
|
+
});
|
|
49
|
+
server.tool('fortnox_delete_absencetransaction', 'Ta bort en frånvarotransaktion från Fortnox (kräver Lön-behörigheten).', {
|
|
50
|
+
id: z.string().describe('id (UUID) för frånvarotransaktionen att ta bort'),
|
|
51
|
+
confirm: z.boolean().optional().describe('Bekräfta att frånvarotransaktionen ska tas bort'),
|
|
52
|
+
dryRun: z
|
|
53
|
+
.boolean()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe('Visa vad som skulle göras utan att ta bort frånvarotransaktionen'),
|
|
56
|
+
}, async ({ id, confirm, dryRun }) => {
|
|
57
|
+
if (dryRun) {
|
|
58
|
+
return dryRunResponse(`delete absence transaction ${id}`);
|
|
59
|
+
}
|
|
60
|
+
if (!confirm)
|
|
61
|
+
requireConfirmation(`delete absence transaction ${id}`);
|
|
62
|
+
await deleteAbsenceTransaction(id);
|
|
63
|
+
return textResponse(`Absence transaction ${id} deleted.`);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=absencetransactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"absencetransactions.js","sourceRoot":"","sources":["../../src/tools/absencetransactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,6BAA6B,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EACL,cAAc,EACd,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,+BAA+B,CAAC,MAAiB;IAC/D,MAAM,CAAC,IAAI,CACT,kCAAkC,EAClC,sHAAsH,EACtH;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACtE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACrE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAC/E,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC9E,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACnF,OAAO,YAAY,CACjB,IAAI,CAAC,mBAAmB,IAAI,EAAE,EAC9B,6BAA6B,EAC7B,IAAI,EACJ,IAAI,CAAC,eAAe,EACpB,UAAU,CACX,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gCAAgC,EAChC,8EAA8E,EAC9E;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC9D,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC9E,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC7C,OAAO,cAAc,CAAC,IAAI,EAAE,+BAA+B,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACjF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mCAAmC,EACnC,4GAA4G,EAC5G;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC/D,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,CACP,0IAA0I,CAC3I;QACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QACpE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC9E,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACtE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC5D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAClD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QACzF,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QACrF,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KAC9E,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;QACnD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,cAAc,CAAC,2CAA2C,MAAM,CAAC,UAAU,EAAE,EAAE;gBACpF,kBAAkB,EAAE,MAAM;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,OAAO;YACV,mBAAmB,CAAC,2CAA2C,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAEtF,MAAM,IAAI,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,cAAc,CAAC,IAAI,EAAE,+BAA+B,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACjF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mCAAmC,EACnC,wEAAwE,EACxE;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC1E,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC3F,MAAM,EAAE,CAAC;aACN,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,kEAAkE,CAAC;KAChF,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QAChC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,cAAc,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,mBAAmB,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;QAEtE,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,YAAY,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attendancetransactions.d.ts","sourceRoot":"","sources":["../../src/tools/attendancetransactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBpE,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8F1E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { listAttendanceTransactions, getAttendanceTransaction, createAttendanceTransaction, deleteAttendanceTransaction, } from '../operations/attendancetransactions.js';
|
|
3
|
+
import { attendanceTransactionListColumns, attendanceTransactionDetailColumns } from '../views.js';
|
|
4
|
+
import { detailResponse, dryRunResponse, listResponse, requireConfirmation, textResponse, } from '../tool-output.js';
|
|
5
|
+
export function registerAttendanceTransactionTools(server) {
|
|
6
|
+
server.tool('fortnox_list_attendancetransactions', 'Lista närvarotransaktioner i Fortnox (kräver Lön-behörigheten). Returnerar: id, EmployeeId, CauseCode, Date, Hours.', {
|
|
7
|
+
employeeId: z.string().optional().describe('Filtrera på EmployeeId'),
|
|
8
|
+
date: z.string().optional().describe('Filtrera på datum (YYYY-MM-DD)'),
|
|
9
|
+
page: z.number().optional().describe('Sidnummer (default 1)'),
|
|
10
|
+
limit: z.number().optional().describe('Antal per sida (default 100)'),
|
|
11
|
+
all: z.boolean().optional().describe('Hämta alla sidor (ignorerar page/limit)'),
|
|
12
|
+
includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
|
|
13
|
+
}, async ({ employeeId, date, page, limit, all, includeRaw }) => {
|
|
14
|
+
const data = await listAttendanceTransactions({ employeeId, date, page, limit, all });
|
|
15
|
+
return listResponse(data.AttendanceTransactions ?? [], attendanceTransactionListColumns, data, data.MetaInformation, includeRaw);
|
|
16
|
+
});
|
|
17
|
+
server.tool('fortnox_get_attendancetransaction', 'Hämta en enskild närvarotransaktion från Fortnox (kräver Lön-behörigheten).', {
|
|
18
|
+
id: z.string().describe('id (UUID) för närvarotransaktionen'),
|
|
19
|
+
includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
|
|
20
|
+
}, async ({ id, includeRaw }) => {
|
|
21
|
+
const data = await getAttendanceTransaction(id);
|
|
22
|
+
return detailResponse(data, attendanceTransactionDetailColumns, data, includeRaw);
|
|
23
|
+
});
|
|
24
|
+
server.tool('fortnox_create_attendancetransaction', 'Skapa en ny närvarotransaktion i Fortnox (kräver Lön-behörigheten). EmployeeId, CauseCode och Date krävs.', {
|
|
25
|
+
EmployeeId: z.string().describe('EmployeeId för den anställde'),
|
|
26
|
+
CauseCode: z
|
|
27
|
+
.string()
|
|
28
|
+
.describe('Orsakskod. Giltiga koder: ARB, BE2, BER, FLX, HLG, JO2, JOR, MER, OB1, OB2, OB3, OB4, OB5, OK0, OK1, OK2, OK3, OK4, OK5, OT1, OT2, OT3, OT4, OT5, RES, TID'),
|
|
29
|
+
Date: z.string().describe('Datum (YYYY-MM-DD)'),
|
|
30
|
+
Hours: z.string().optional().describe('Antal timmar'),
|
|
31
|
+
CostCenter: z.string().optional().describe('Kostnadsställe'),
|
|
32
|
+
Project: z.string().optional().describe('Projekt'),
|
|
33
|
+
confirm: z.boolean().optional().describe('Bekräfta att närvarotransaktionen ska skapas'),
|
|
34
|
+
dryRun: z.boolean().optional().describe('Visa vad som skulle skickas utan att skapa'),
|
|
35
|
+
includeRaw: z.boolean().optional().describe('Inkludera rå JSON från Fortnox'),
|
|
36
|
+
}, async ({ confirm, dryRun, includeRaw, ...params }) => {
|
|
37
|
+
if (dryRun) {
|
|
38
|
+
return dryRunResponse(`create attendance transaction for employee ${params.EmployeeId} (${params.CauseCode} ${params.Date})`, { AttendanceTransaction: params });
|
|
39
|
+
}
|
|
40
|
+
if (!confirm) {
|
|
41
|
+
requireConfirmation(`create attendance transaction for employee ${params.EmployeeId} (${params.CauseCode} ${params.Date})`);
|
|
42
|
+
}
|
|
43
|
+
const data = await createAttendanceTransaction(params);
|
|
44
|
+
return detailResponse(data, attendanceTransactionDetailColumns, data, includeRaw);
|
|
45
|
+
});
|
|
46
|
+
server.tool('fortnox_delete_attendancetransaction', 'Ta bort en närvarotransaktion från Fortnox (kräver Lön-behörigheten).', {
|
|
47
|
+
id: z.string().describe('id (UUID) för närvarotransaktionen att ta bort'),
|
|
48
|
+
confirm: z.boolean().optional().describe('Bekräfta att närvarotransaktionen ska tas bort'),
|
|
49
|
+
dryRun: z
|
|
50
|
+
.boolean()
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('Visa vad som skulle göras utan att ta bort närvarotransaktionen'),
|
|
53
|
+
}, async ({ id, confirm, dryRun }) => {
|
|
54
|
+
if (dryRun) {
|
|
55
|
+
return dryRunResponse(`delete attendance transaction ${id}`);
|
|
56
|
+
}
|
|
57
|
+
if (!confirm)
|
|
58
|
+
requireConfirmation(`delete attendance transaction ${id}`);
|
|
59
|
+
await deleteAttendanceTransaction(id);
|
|
60
|
+
return textResponse(`Attendance transaction ${id} deleted.`);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=attendancetransactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attendancetransactions.js","sourceRoot":"","sources":["../../src/tools/attendancetransactions.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;
|
|
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":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"bookkeeping.js","sourceRoot":"","sources":["../../src/tools/bookkeeping.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|