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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Precomputed analytics views over invoice data. The aggregation functions are
|
|
2
|
+
// pure (invoice rows in, summary out) so they can be unit-tested without the
|
|
3
|
+
// API; the exported get* functions fetch via listInvoices and delegate.
|
|
4
|
+
//
|
|
5
|
+
// Amounts are summed in the invoice currency as returned by Fortnox (no FX
|
|
6
|
+
// conversion) — for single-currency (SEK) tenants the totals are exact.
|
|
7
|
+
import { listInvoices } from './invoices.js';
|
|
8
|
+
import { generateTaxReport } from './tax.js';
|
|
9
|
+
function num(value) {
|
|
10
|
+
const n = typeof value === 'number' ? value : parseFloat(String(value ?? ''));
|
|
11
|
+
return Number.isFinite(n) ? n : 0;
|
|
12
|
+
}
|
|
13
|
+
function isCancelled(inv) {
|
|
14
|
+
return inv.Cancelled === true;
|
|
15
|
+
}
|
|
16
|
+
function isOpen(inv) {
|
|
17
|
+
return !isCancelled(inv) && num(inv.Balance) > 0;
|
|
18
|
+
}
|
|
19
|
+
function isOverdue(inv, today) {
|
|
20
|
+
return isOpen(inv) && String(inv.DueDate ?? '') < today;
|
|
21
|
+
}
|
|
22
|
+
export function summarizeOverdue(invoices, today) {
|
|
23
|
+
const overdue = invoices
|
|
24
|
+
.filter((inv) => isOverdue(inv, today))
|
|
25
|
+
.sort((a, b) => String(a.DueDate ?? '').localeCompare(String(b.DueDate ?? '')));
|
|
26
|
+
return {
|
|
27
|
+
count: overdue.length,
|
|
28
|
+
totalBalance: overdue.reduce((sum, inv) => sum + num(inv.Balance), 0),
|
|
29
|
+
oldestDueDate: overdue.length > 0 ? String(overdue[0].DueDate) : null,
|
|
30
|
+
invoices: overdue,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function summarizeUnpaid(invoices, today) {
|
|
34
|
+
const open = invoices.filter(isOpen);
|
|
35
|
+
const overdue = open.filter((inv) => isOverdue(inv, today));
|
|
36
|
+
return {
|
|
37
|
+
count: open.length,
|
|
38
|
+
totalBalance: open.reduce((sum, inv) => sum + num(inv.Balance), 0),
|
|
39
|
+
overdueCount: overdue.length,
|
|
40
|
+
overdueBalance: overdue.reduce((sum, inv) => sum + num(inv.Balance), 0),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function topCustomersFrom(invoices, limit) {
|
|
44
|
+
const byCustomer = new Map();
|
|
45
|
+
for (const inv of invoices) {
|
|
46
|
+
if (isCancelled(inv))
|
|
47
|
+
continue;
|
|
48
|
+
const key = String(inv.CustomerNumber ?? '');
|
|
49
|
+
const entry = byCustomer.get(key) ?? {
|
|
50
|
+
CustomerNumber: key,
|
|
51
|
+
CustomerName: String(inv.CustomerName ?? ''),
|
|
52
|
+
total: 0,
|
|
53
|
+
invoiceCount: 0,
|
|
54
|
+
};
|
|
55
|
+
entry.total += num(inv.Total);
|
|
56
|
+
entry.invoiceCount += 1;
|
|
57
|
+
byCustomer.set(key, entry);
|
|
58
|
+
}
|
|
59
|
+
return [...byCustomer.values()].sort((a, b) => b.total - a.total).slice(0, limit);
|
|
60
|
+
}
|
|
61
|
+
export function monthlyRevenueFrom(invoices) {
|
|
62
|
+
const byMonth = new Map();
|
|
63
|
+
for (const inv of invoices) {
|
|
64
|
+
if (isCancelled(inv))
|
|
65
|
+
continue;
|
|
66
|
+
const month = String(inv.InvoiceDate ?? '').slice(0, 7);
|
|
67
|
+
if (!/^\d{4}-\d{2}$/.test(month))
|
|
68
|
+
continue;
|
|
69
|
+
const entry = byMonth.get(month) ?? { month, total: 0, invoiceCount: 0 };
|
|
70
|
+
entry.total += num(inv.Total);
|
|
71
|
+
entry.invoiceCount += 1;
|
|
72
|
+
byMonth.set(month, entry);
|
|
73
|
+
}
|
|
74
|
+
return [...byMonth.values()].sort((a, b) => a.month.localeCompare(b.month));
|
|
75
|
+
}
|
|
76
|
+
// Format a Date as YYYY-MM-DD using LOCAL calendar fields. Using toISOString()
|
|
77
|
+
// here would format in UTC, so between local midnight and the UTC offset (e.g.
|
|
78
|
+
// 00:00–02:00 in Sweden, UTC+1/+2) "today" would resolve to yesterday — skewing
|
|
79
|
+
// overdue classification and the dashboard window by a day.
|
|
80
|
+
export function localIsoDate(d) {
|
|
81
|
+
const y = d.getFullYear();
|
|
82
|
+
const m = String(d.getMonth() + 1).padStart(2, '0');
|
|
83
|
+
const day = String(d.getDate()).padStart(2, '0');
|
|
84
|
+
return `${y}-${m}-${day}`;
|
|
85
|
+
}
|
|
86
|
+
function todayIso() {
|
|
87
|
+
return localIsoDate(new Date());
|
|
88
|
+
}
|
|
89
|
+
// Start of the dashboard revenue window: the 1st of the month (months - 1)
|
|
90
|
+
// months before `today`, in local time. Built via the Date(year, monthIndex, 1)
|
|
91
|
+
// overload so a negative/overflowing month index rolls the year correctly, and
|
|
92
|
+
// pinning the day to 1 avoids end-of-month overflow — e.g. mutating a Jul-31
|
|
93
|
+
// Date with setMonth(1) would land on "Feb 31" → March, silently dropping a
|
|
94
|
+
// whole month from the window.
|
|
95
|
+
export function dashboardWindowStart(today, months) {
|
|
96
|
+
return localIsoDate(new Date(today.getFullYear(), today.getMonth() - (months - 1), 1));
|
|
97
|
+
}
|
|
98
|
+
export async function getOverdueSummary() {
|
|
99
|
+
const data = await listInvoices({ filter: 'unpaidoverdue', all: true });
|
|
100
|
+
return summarizeOverdue(data.Invoices ?? [], todayIso());
|
|
101
|
+
}
|
|
102
|
+
export async function getUnpaidTotals() {
|
|
103
|
+
const data = await listInvoices({ filter: 'unpaid', all: true });
|
|
104
|
+
return summarizeUnpaid(data.Invoices ?? [], todayIso());
|
|
105
|
+
}
|
|
106
|
+
export async function getTopCustomers(params = {}) {
|
|
107
|
+
const data = await listInvoices({ fromDate: params.fromDate, toDate: params.toDate, all: true });
|
|
108
|
+
return {
|
|
109
|
+
period: { from: params.fromDate, to: params.toDate },
|
|
110
|
+
customers: topCustomersFrom(data.Invoices ?? [], params.limit ?? 10),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// Net VAT position across the report's VAT accounts: sum of (debit - credit).
|
|
114
|
+
// Negative = net VAT owed to Skatteverket; positive = a refund is due.
|
|
115
|
+
export function netVatFromVatAccounts(vatAccounts) {
|
|
116
|
+
let netVat = 0;
|
|
117
|
+
for (const acct of Object.values(vatAccounts ?? {})) {
|
|
118
|
+
netVat += (acct.debit ?? 0) - (acct.credit ?? 0);
|
|
119
|
+
}
|
|
120
|
+
return netVat;
|
|
121
|
+
}
|
|
122
|
+
// Thin wrapper over the tax report adding the bottom line scripted callers
|
|
123
|
+
// usually want: net VAT position (negative = owed to Skatteverket).
|
|
124
|
+
export async function getVatSummary(params) {
|
|
125
|
+
const report = await generateTaxReport(params);
|
|
126
|
+
return { ...report, netVat: netVatFromVatAccounts(report.vatAccounts) };
|
|
127
|
+
}
|
|
128
|
+
// At-a-glance summary composed from a single full invoice fetch (plus one
|
|
129
|
+
// filtered fetch would be redundant — overdue/unpaid are derived locally).
|
|
130
|
+
export async function getDashboard(options = {}) {
|
|
131
|
+
const months = options.months ?? 6;
|
|
132
|
+
const now = new Date();
|
|
133
|
+
const today = localIsoDate(now);
|
|
134
|
+
const from = dashboardWindowStart(now, months);
|
|
135
|
+
// Two fetches: the windowed one for revenue/recent, and the unpaid filter
|
|
136
|
+
// (which is date-independent — an old unpaid invoice may predate the window).
|
|
137
|
+
const [windowed, unpaidData] = await Promise.all([
|
|
138
|
+
listInvoices({ fromDate: from, toDate: today, all: true }),
|
|
139
|
+
listInvoices({ filter: 'unpaid', all: true }),
|
|
140
|
+
]);
|
|
141
|
+
const windowedRows = windowed.Invoices ?? [];
|
|
142
|
+
const unpaidRows = unpaidData.Invoices ?? [];
|
|
143
|
+
const recentInvoices = [...windowedRows]
|
|
144
|
+
.filter((inv) => !isCancelled(inv))
|
|
145
|
+
.sort((a, b) => String(b.InvoiceDate ?? '').localeCompare(String(a.InvoiceDate ?? '')))
|
|
146
|
+
.slice(0, 5);
|
|
147
|
+
return {
|
|
148
|
+
unpaid: summarizeUnpaid(unpaidRows, today),
|
|
149
|
+
overdue: summarizeOverdue(unpaidRows, today),
|
|
150
|
+
recentInvoices,
|
|
151
|
+
monthlyRevenue: monthlyRevenueFrom(windowedRows),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/operations/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface AttendanceTransactionsResponse {
|
|
2
|
+
AttendanceTransactions: Record<string, unknown>[];
|
|
3
|
+
MetaInformation?: {
|
|
4
|
+
'@TotalResources': number;
|
|
5
|
+
'@TotalPages': number;
|
|
6
|
+
'@CurrentPage': number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface ListAttendanceTransactionsParams {
|
|
10
|
+
employeeId?: string;
|
|
11
|
+
date?: string;
|
|
12
|
+
page?: number;
|
|
13
|
+
limit?: number;
|
|
14
|
+
all?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function listAttendanceTransactions(params?: ListAttendanceTransactionsParams): Promise<AttendanceTransactionsResponse>;
|
|
17
|
+
export declare function getAttendanceTransaction(id: string): Promise<Record<string, unknown>>;
|
|
18
|
+
export declare function createAttendanceTransaction(params: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
19
|
+
export declare function deleteAttendanceTransaction(id: string): Promise<void>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=attendancetransactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attendancetransactions.d.ts","sourceRoot":"","sources":["../../src/operations/attendancetransactions.ts"],"names":[],"mappings":"AAMA,UAAU,8BAA8B;IACtC,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAClD,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,gCAAgC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,GAAE,gCAAqC,GAC5C,OAAO,CAAC,8BAA8B,CAAC,CA0BzC;AAED,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAK3F;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC;AAED,wBAAsB,2BAA2B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
|
|
2
|
+
export async function listAttendanceTransactions(params = {}) {
|
|
3
|
+
if (params.all) {
|
|
4
|
+
// The Fortnox attendance list endpoint names its filter params "employeeid"
|
|
5
|
+
// (all lowercase) and "date" — the filters must survive pagination, so pass
|
|
6
|
+
// them through to fetchAllPages too (not just the single-page branch below).
|
|
7
|
+
const { items, totalResources } = await fetchAllPages('attendancetransactions', 'AttendanceTransactions', { employeeid: params.employeeId, date: params.date });
|
|
8
|
+
return {
|
|
9
|
+
AttendanceTransactions: items,
|
|
10
|
+
MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// The Fortnox attendance list endpoint names its filter params "employeeid"
|
|
14
|
+
// (all lowercase) and "date" — map employeeId onto the lowercase key.
|
|
15
|
+
return fortnoxRequest('attendancetransactions', {
|
|
16
|
+
params: {
|
|
17
|
+
employeeid: params.employeeId,
|
|
18
|
+
date: params.date,
|
|
19
|
+
page: params.page || 1,
|
|
20
|
+
limit: params.limit || 100,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export async function getAttendanceTransaction(id) {
|
|
25
|
+
const data = await fortnoxRequest(`attendancetransactions/${encodeURIComponent(id)}`);
|
|
26
|
+
return data.AttendanceTransaction;
|
|
27
|
+
}
|
|
28
|
+
export async function createAttendanceTransaction(params) {
|
|
29
|
+
const data = await fortnoxRequest('attendancetransactions', {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
body: { AttendanceTransaction: params },
|
|
32
|
+
});
|
|
33
|
+
return data.AttendanceTransaction;
|
|
34
|
+
}
|
|
35
|
+
export async function deleteAttendanceTransaction(id) {
|
|
36
|
+
await fortnoxRequest(`attendancetransactions/${encodeURIComponent(id)}`, {
|
|
37
|
+
method: 'DELETE',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=attendancetransactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attendancetransactions.js","sourceRoot":"","sources":["../../src/operations/attendancetransactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAmBrE,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,SAA2C,EAAE;IAE7C,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,4EAA4E;QAC5E,4EAA4E;QAC5E,6EAA6E;QAC7E,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,wBAAwB,EACxB,wBAAwB,EACxB,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CACrD,CAAC;QACF,OAAO;YACL,sBAAsB,EAAE,KAAK;YAC7B,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,sEAAsE;IACtE,OAAO,cAAc,CAAiC,wBAAwB,EAAE;QAC9E,MAAM,EAAE;YACN,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;YACtB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG;SAC3B;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,EAAU;IACvD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,0BAA0B,kBAAkB,CAAC,EAAE,CAAC,EAAE,CACnD,CAAC;IACF,OAAO,IAAI,CAAC,qBAAqB,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAAgC,wBAAwB,EAAE;QACzF,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE;KACxC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,qBAAqB,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,EAAU;IAC1D,MAAM,cAAc,CAAC,0BAA0B,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;QACvE,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface ContractsResponse {
|
|
2
|
+
Contracts: Record<string, unknown>[];
|
|
3
|
+
MetaInformation?: {
|
|
4
|
+
'@TotalResources': number;
|
|
5
|
+
'@TotalPages': number;
|
|
6
|
+
'@CurrentPage': number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface ListContractsParams {
|
|
10
|
+
filter?: string;
|
|
11
|
+
page?: number;
|
|
12
|
+
limit?: number;
|
|
13
|
+
all?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function listContracts(params?: ListContractsParams): Promise<ContractsResponse>;
|
|
16
|
+
export declare function getContract(documentNumber: string): Promise<Record<string, unknown>>;
|
|
17
|
+
export declare function createContract(params: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
18
|
+
export declare function updateContract(documentNumber: string, fields: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
19
|
+
export declare function finishContract(documentNumber: string): Promise<Record<string, unknown>>;
|
|
20
|
+
export declare function createInvoiceFromContract(documentNumber: string): Promise<Record<string, unknown>>;
|
|
21
|
+
export declare function increaseInvoiceCount(documentNumber: string): Promise<Record<string, unknown>>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/operations/contracts.ts"],"names":[],"mappings":"AAWA,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;AAGD,wBAAsB,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAM7F;AAGD,wBAAsB,yBAAyB,CAC7C,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC;AAGD,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC"}
|
|
@@ -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;
|
|
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;
|
|
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,19 @@
|
|
|
1
|
+
interface EmployeesResponse {
|
|
2
|
+
Employees: Record<string, unknown>[];
|
|
3
|
+
MetaInformation?: {
|
|
4
|
+
'@TotalResources': number;
|
|
5
|
+
'@TotalPages': number;
|
|
6
|
+
'@CurrentPage': number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface ListEmployeesParams {
|
|
10
|
+
page?: number;
|
|
11
|
+
limit?: number;
|
|
12
|
+
all?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function listEmployees(params?: ListEmployeesParams): Promise<EmployeesResponse>;
|
|
15
|
+
export declare function getEmployee(employeeId: string): Promise<Record<string, unknown>>;
|
|
16
|
+
export declare function createEmployee(params: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
17
|
+
export declare function updateEmployee(employeeId: string, fields: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=employees.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"employees.d.ts","sourceRoot":"","sources":["../../src/operations/employees.ts"],"names":[],"mappings":"AAMA,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,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,CAehG;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKtF;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,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
|
|
2
|
+
export async function listEmployees(params = {}) {
|
|
3
|
+
if (params.all) {
|
|
4
|
+
const { items, totalResources } = await fetchAllPages('employees', 'Employees');
|
|
5
|
+
return {
|
|
6
|
+
Employees: items,
|
|
7
|
+
MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
return fortnoxRequest('employees', {
|
|
11
|
+
params: { page: params.page || 1, limit: params.limit || 100 },
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export async function getEmployee(employeeId) {
|
|
15
|
+
const data = await fortnoxRequest(`employees/${encodeURIComponent(employeeId)}`);
|
|
16
|
+
return data.Employee;
|
|
17
|
+
}
|
|
18
|
+
export async function createEmployee(params) {
|
|
19
|
+
const data = await fortnoxRequest('employees', {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
body: { Employee: params },
|
|
22
|
+
});
|
|
23
|
+
return data.Employee;
|
|
24
|
+
}
|
|
25
|
+
export async function updateEmployee(employeeId, fields) {
|
|
26
|
+
// EmployeeId is the path key — never send it in the PUT body.
|
|
27
|
+
const { EmployeeId: _, ...body } = fields;
|
|
28
|
+
const data = await fortnoxRequest(`employees/${encodeURIComponent(employeeId)}`, {
|
|
29
|
+
method: 'PUT',
|
|
30
|
+
body: { Employee: body },
|
|
31
|
+
});
|
|
32
|
+
return data.Employee;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=employees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"employees.js","sourceRoot":"","sources":["../../src/operations/employees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAiBrE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAA8B,EAAE;IAClE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,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,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE;KAC/D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB;IAClD,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAC9C,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,UAAkB,EAClB,MAA+B;IAE/B,8DAA8D;IAC9D,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,aAAa,kBAAkB,CAAC,UAAU,CAAC,EAAE,EAC7C;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;KACzB,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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
interface SalaryTransactionsResponse {
|
|
2
|
+
SalaryTransactions: Record<string, unknown>[];
|
|
3
|
+
MetaInformation?: {
|
|
4
|
+
'@TotalResources': number;
|
|
5
|
+
'@TotalPages': number;
|
|
6
|
+
'@CurrentPage': number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export interface ListSalaryTransactionsParams {
|
|
10
|
+
employeeId?: string;
|
|
11
|
+
date?: string;
|
|
12
|
+
page?: number;
|
|
13
|
+
limit?: number;
|
|
14
|
+
all?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function listSalaryTransactions(params?: ListSalaryTransactionsParams): Promise<SalaryTransactionsResponse>;
|
|
17
|
+
export declare function getSalaryTransaction(salaryRow: string): Promise<Record<string, unknown>>;
|
|
18
|
+
export declare function createSalaryTransaction(params: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
19
|
+
export declare function deleteSalaryTransaction(salaryRow: string): Promise<void>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=salarytransactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"salarytransactions.d.ts","sourceRoot":"","sources":["../../src/operations/salarytransactions.ts"],"names":[],"mappings":"AAMA,UAAU,0BAA0B;IAClC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;CAChG;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,GAAE,4BAAiC,GACxC,OAAO,CAAC,0BAA0B,CAAC,CAoBrC;AAED,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAK9F;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAMlC;AAED,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { fortnoxRequest, fetchAllPages } from '../fortnox-client.js';
|
|
2
|
+
export async function listSalaryTransactions(params = {}) {
|
|
3
|
+
const filters = {};
|
|
4
|
+
if (params.employeeId !== undefined)
|
|
5
|
+
filters.employeeId = params.employeeId;
|
|
6
|
+
if (params.date !== undefined)
|
|
7
|
+
filters.date = params.date;
|
|
8
|
+
if (params.all) {
|
|
9
|
+
const { items, totalResources } = await fetchAllPages('salarytransactions', 'SalaryTransactions', filters);
|
|
10
|
+
return {
|
|
11
|
+
SalaryTransactions: items,
|
|
12
|
+
MetaInformation: { '@TotalResources': totalResources, '@TotalPages': 1, '@CurrentPage': 1 },
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return fortnoxRequest('salarytransactions', {
|
|
16
|
+
params: { page: params.page || 1, limit: params.limit || 100, ...filters },
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export async function getSalaryTransaction(salaryRow) {
|
|
20
|
+
const data = await fortnoxRequest(`salarytransactions/${encodeURIComponent(String(salaryRow))}`);
|
|
21
|
+
return data.SalaryTransaction;
|
|
22
|
+
}
|
|
23
|
+
export async function createSalaryTransaction(params) {
|
|
24
|
+
const data = await fortnoxRequest('salarytransactions', {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
body: { SalaryTransaction: params },
|
|
27
|
+
});
|
|
28
|
+
return data.SalaryTransaction;
|
|
29
|
+
}
|
|
30
|
+
export async function deleteSalaryTransaction(salaryRow) {
|
|
31
|
+
await fortnoxRequest(`salarytransactions/${encodeURIComponent(String(salaryRow))}`, {
|
|
32
|
+
method: 'DELETE',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=salarytransactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"salarytransactions.js","sourceRoot":"","sources":["../../src/operations/salarytransactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAmBrE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,SAAuC,EAAE;IAEzC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC5E,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAE1D,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CACnD,oBAAoB,EACpB,oBAAoB,EACpB,OAAO,CACR,CAAC;QACF,OAAO;YACL,kBAAkB,EAAE,KAAK;YACzB,eAAe,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;SAC5F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAA6B,oBAAoB,EAAE;QACtE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE;KAC3E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IAC1D,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAC9D,CAAC;IACF,OAAO,IAAI,CAAC,iBAAiB,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,cAAc,CAA4B,oBAAoB,EAAE;QACjF,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE;KACpC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,iBAAiB,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAAiB;IAC7D,MAAM,cAAc,CAAC,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE;QAClF,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function getScheduleTime(employeeId: string, date: string): Promise<Record<string, unknown>>;
|
|
2
|
+
export declare function updateScheduleTime(employeeId: string, date: string, fields: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
3
|
+
export declare function resetScheduleTimeDay(employeeId: string, date: string, fields: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
4
|
+
//# sourceMappingURL=scheduletimes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduletimes.d.ts","sourceRoot":"","sources":["../../src/operations/scheduletimes.ts"],"names":[],"mappings":"AAMA,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAWlC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { fortnoxRequest } from '../fortnox-client.js';
|
|
2
|
+
export async function getScheduleTime(employeeId, date) {
|
|
3
|
+
const data = await fortnoxRequest(`scheduletimes/${encodeURIComponent(employeeId)}/${encodeURIComponent(date)}`);
|
|
4
|
+
return data.ScheduleTime;
|
|
5
|
+
}
|
|
6
|
+
export async function updateScheduleTime(employeeId, date, fields) {
|
|
7
|
+
// EmployeeId and Date are the path keys — never send them in the PUT body.
|
|
8
|
+
const { EmployeeId: _employeeId, Date: _date, ...body } = fields;
|
|
9
|
+
const data = await fortnoxRequest(`scheduletimes/${encodeURIComponent(employeeId)}/${encodeURIComponent(date)}`, {
|
|
10
|
+
method: 'PUT',
|
|
11
|
+
body: { ScheduleTime: body },
|
|
12
|
+
});
|
|
13
|
+
return data.ScheduleTime;
|
|
14
|
+
}
|
|
15
|
+
export async function resetScheduleTimeDay(employeeId, date, fields) {
|
|
16
|
+
// EmployeeId and Date are the path keys — never send them in the PUT body.
|
|
17
|
+
const { EmployeeId: _employeeId, Date: _date, ...body } = fields;
|
|
18
|
+
const data = await fortnoxRequest(`scheduletimes/${encodeURIComponent(employeeId)}/${encodeURIComponent(date)}/resetday`, {
|
|
19
|
+
method: 'PUT',
|
|
20
|
+
body: { ScheduleTime: body },
|
|
21
|
+
});
|
|
22
|
+
return data.ScheduleTime;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=scheduletimes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduletimes.js","sourceRoot":"","sources":["../../src/operations/scheduletimes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMtD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,IAAY;IAEZ,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,iBAAiB,kBAAkB,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;IACF,OAAO,IAAI,CAAC,YAAY,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,IAAY,EACZ,MAA+B;IAE/B,2EAA2E;IAC3E,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IACjE,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,iBAAiB,kBAAkB,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC7E;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KAC7B,CACF,CAAC;IACF,OAAO,IAAI,CAAC,YAAY,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,IAAY,EACZ,MAA+B;IAE/B,2EAA2E;IAC3E,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IACjE,MAAM,IAAI,GAAG,MAAM,cAAc,CAC/B,iBAAiB,kBAAkB,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,WAAW,EACtF;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KAC7B,CACF,CAAC;IACF,OAAO,IAAI,CAAC,YAAY,CAAC;AAC3B,CAAC"}
|