kitsas-library 0.1.21 → 0.1.23
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 +33 -18
- package/lib/main/interfaces/index.d.ts +1 -0
- package/lib/main/interfaces/kitsasbook.interface.d.ts +54 -2
- package/lib/main/interfaces/kitsasconnection.interface.d.ts +32 -4
- package/lib/main/interfaces/kitsasoffice.interface.d.ts +75 -0
- package/lib/main/moc/mockitsasbook.d.ts +6 -3
- package/lib/main/moc/mockitsasbook.js +60 -5
- package/lib/main/moc/mockitsasoffice.d.ts +14 -0
- package/lib/main/moc/mockitsasoffice.js +120 -2
- package/lib/main/moc/mockkitsasconnection.d.ts +7 -2
- package/lib/main/moc/mockkitsasconnection.js +55 -28
- package/lib/main/services/kitsasbook.d.ts +8 -2
- package/lib/main/services/kitsasbook.js +27 -2
- package/lib/main/services/kitsasconnection.d.ts +7 -2
- package/lib/main/services/kitsasconnection.js +23 -3
- package/lib/main/services/kitsasoffice.d.ts +14 -0
- package/lib/main/services/kitsasoffice.js +86 -10
- package/lib/main/services/kitsasservice.d.ts +30 -0
- package/lib/main/services/kitsasservice.js +31 -1
- package/lib/main/types/books.d.ts +18 -0
- package/lib/main/types/books.js +8 -1
- package/lib/main/types/certificate.d.ts +24 -0
- package/lib/main/types/certificate.js +12 -0
- package/lib/main/types/index.d.ts +6 -0
- package/lib/main/types/index.js +7 -1
- package/lib/main/types/invoice.d.ts +142 -0
- package/lib/main/types/invoice.js +36 -0
- package/lib/main/types/office.d.ts +3 -0
- package/lib/main/types/product.d.ts +16 -0
- package/lib/main/types/product.js +3 -0
- package/lib/main/types/roles.d.ts +6 -0
- package/lib/main/types/roles.js +11 -0
- package/lib/main/types/transactions.d.ts +18 -0
- package/lib/main/types/transactions.js +3 -0
- package/lib/main/types/user.d.ts +19 -1
- package/lib/main/types/user.js +20 -1
- package/lib/module/interfaces/index.d.ts +1 -0
- package/lib/module/interfaces/kitsasbook.interface.d.ts +54 -2
- package/lib/module/interfaces/kitsasconnection.interface.d.ts +32 -4
- package/lib/module/interfaces/kitsasoffice.interface.d.ts +75 -0
- package/lib/module/moc/mockitsasbook.d.ts +6 -3
- package/lib/module/moc/mockitsasbook.js +62 -7
- package/lib/module/moc/mockitsasoffice.d.ts +14 -0
- package/lib/module/moc/mockitsasoffice.js +120 -2
- package/lib/module/moc/mockkitsasconnection.d.ts +7 -2
- package/lib/module/moc/mockkitsasconnection.js +55 -28
- package/lib/module/services/kitsasbook.d.ts +8 -2
- package/lib/module/services/kitsasbook.js +27 -2
- package/lib/module/services/kitsasconnection.d.ts +7 -2
- package/lib/module/services/kitsasconnection.js +23 -3
- package/lib/module/services/kitsasoffice.d.ts +14 -0
- package/lib/module/services/kitsasoffice.js +86 -10
- package/lib/module/services/kitsasservice.d.ts +30 -0
- package/lib/module/services/kitsasservice.js +31 -1
- package/lib/module/types/books.d.ts +18 -0
- package/lib/module/types/books.js +7 -2
- package/lib/module/types/certificate.d.ts +24 -0
- package/lib/module/types/certificate.js +9 -0
- package/lib/module/types/index.d.ts +6 -0
- package/lib/module/types/index.js +7 -1
- package/lib/module/types/invoice.d.ts +142 -0
- package/lib/module/types/invoice.js +33 -0
- package/lib/module/types/office.d.ts +3 -0
- package/lib/module/types/product.d.ts +16 -0
- package/lib/module/types/product.js +2 -0
- package/lib/module/types/roles.d.ts +6 -0
- package/lib/module/types/roles.js +8 -0
- package/lib/module/types/transactions.d.ts +18 -0
- package/lib/module/types/transactions.js +2 -0
- package/lib/module/types/user.d.ts +19 -1
- package/lib/module/types/user.js +19 -2
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
# Kitsas Library
|
|
2
2
|
|
|
3
|
+
Library to connect Kitsas Server. See also [template to Kitsas addon](https://github.com/Kitsas-Oy/kitsas-addon-template).
|
|
4
|
+
|
|
5
|
+
This typedoc documentation is available at [GitHub pages](https://kitsas-oy.github.io/kitsaslibrary/index.html)
|
|
6
|
+
|
|
3
7
|
## Installation
|
|
4
8
|
|
|
5
9
|
```bash
|
|
6
10
|
npm install kitsas-library
|
|
7
11
|
```
|
|
8
12
|
|
|
9
|
-
##
|
|
13
|
+
## Main components
|
|
14
|
+
|
|
15
|
+
| Component | Usage |
|
|
16
|
+
| --------------------------------- | ---------------------------------------- |
|
|
17
|
+
| {@link KitsasService} | Static class to connect server |
|
|
18
|
+
| {@link KitsasConnectionInterface} | General operations |
|
|
19
|
+
| {@link KitsasOfficeInterface} | Accounting office, bookshelves and roles |
|
|
20
|
+
| {@link KitsasBookInterface} | Accounting interface |
|
|
21
|
+
|
|
22
|
+
First create a connection with {@link KitsasService}.
|
|
23
|
+
|
|
24
|
+
## Some examples
|
|
10
25
|
|
|
11
26
|
### Login to Kitsas
|
|
12
27
|
|
|
@@ -19,23 +34,6 @@ const connection = await KitsasService.connect({
|
|
|
19
34
|
});
|
|
20
35
|
```
|
|
21
36
|
|
|
22
|
-
#### Using mock implementation
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
const connection = await KitsasService.connect({
|
|
26
|
-
username: 'test@kitsas.fi',
|
|
27
|
-
password: 'Test+12345',
|
|
28
|
-
mock: true,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
const connectionWith2FA = await KitsasService.connect({
|
|
32
|
-
username: 'use2fa@kitsas.fi',
|
|
33
|
-
password: 'Test+12345',
|
|
34
|
-
code: '123456',
|
|
35
|
-
mock: true,
|
|
36
|
-
});
|
|
37
|
-
```
|
|
38
|
-
|
|
39
37
|
### Get list of books
|
|
40
38
|
|
|
41
39
|
```typescript
|
|
@@ -54,3 +52,20 @@ const book = await connection.getBook('92e71a5d-1c33-4cc9-aa83-281c05c8e4c2');
|
|
|
54
52
|
const document : CreateVoucherDto = { ... } ;
|
|
55
53
|
await book.saveVoucher(document, []);
|
|
56
54
|
```
|
|
55
|
+
|
|
56
|
+
### Using mock implementation
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
const connection = await KitsasService.connect({
|
|
60
|
+
username: 'test@kitsas.fi',
|
|
61
|
+
password: 'Test+12345',
|
|
62
|
+
mock: true,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const connectionWith2FA = await KitsasService.connect({
|
|
66
|
+
username: 'use2fa@kitsas.fi',
|
|
67
|
+
password: 'Test+12345',
|
|
68
|
+
code: '123456',
|
|
69
|
+
mock: true,
|
|
70
|
+
});
|
|
71
|
+
```
|
|
@@ -1,8 +1,60 @@
|
|
|
1
|
-
import { Account, AttachmentDto, CreateVoucherDto, Dimension, FiscalYear } from '../types';
|
|
1
|
+
import { Account, AttachmentDto, CreateVoucherDto, CreateVoucherResponseDto, Dimension, FiscalYear } from '../types';
|
|
2
|
+
import { CreateInvoiceResponseDto, InvoiceDto } from '../types/invoice';
|
|
3
|
+
import { Product } from '../types/product';
|
|
4
|
+
import { TransactionEntryDto } from '../types/transactions';
|
|
5
|
+
/**
|
|
6
|
+
* Interface representing an accounting of the organization.
|
|
7
|
+
*
|
|
8
|
+
* You get KitsasBookInterface from {@link KitsasOfficeInterface.getBooks}
|
|
9
|
+
*/
|
|
2
10
|
export interface KitsasBookInterface {
|
|
11
|
+
/**
|
|
12
|
+
* Get the book ID.
|
|
13
|
+
* @returns The book ID as a string.
|
|
14
|
+
*/
|
|
3
15
|
getBookId(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Get the accounting accounts.
|
|
18
|
+
* @returns A promise that resolves to an array of Account objects.
|
|
19
|
+
*/
|
|
4
20
|
getAccounts(): Promise<Account[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Get the dimensions.
|
|
23
|
+
* @returns A promise that resolves to an array of Dimension objects.
|
|
24
|
+
*/
|
|
5
25
|
getDimensions(): Promise<Dimension[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Get the fiscal years.
|
|
28
|
+
* @returns A promise that resolves to an array of FiscalYear objects.
|
|
29
|
+
*/
|
|
6
30
|
getFiscalYears(): Promise<FiscalYear[]>;
|
|
7
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Save a voucher.
|
|
33
|
+
* @param voucher - The voucher to save.
|
|
34
|
+
* @param attachments - The attachments associated with the voucher.
|
|
35
|
+
* @returns A promise that resolves to a CreateVoucherResponseDto object.
|
|
36
|
+
*/
|
|
37
|
+
saveVoucher(voucher: CreateVoucherDto, attachments: AttachmentDto[]): Promise<CreateVoucherResponseDto>;
|
|
38
|
+
/**
|
|
39
|
+
* Save an invoice.
|
|
40
|
+
* @param invoice - The invoice to save.
|
|
41
|
+
* @param attachments - The attachments associated with the invoice.
|
|
42
|
+
* @returns A promise that resolves to a CreateInvoiceResponseDto object.
|
|
43
|
+
*/
|
|
44
|
+
saveInvoice(invoice: InvoiceDto, attachments: AttachmentDto[]): Promise<CreateInvoiceResponseDto>;
|
|
45
|
+
/**
|
|
46
|
+
* Save transactions.
|
|
47
|
+
* @param iban - The IBAN of the bank account.
|
|
48
|
+
* @param startDate - The start date of the transactions.
|
|
49
|
+
* @param endDate - The end date of the transactions.
|
|
50
|
+
* @param entries - The transaction entries.
|
|
51
|
+
* @param original - The original object.
|
|
52
|
+
* @returns A promise that resolves to a CreateVoucherResponseDto object.
|
|
53
|
+
*/
|
|
54
|
+
saveTransactions(iban: string, startDate: Date, endDate: Date, entries: TransactionEntryDto[], original: object): Promise<CreateVoucherResponseDto>;
|
|
55
|
+
/**
|
|
56
|
+
* Get the products.
|
|
57
|
+
* @returns A promise that resolves to an array of Product objects.
|
|
58
|
+
*/
|
|
59
|
+
getProducts(): Promise<Product[]>;
|
|
8
60
|
}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import { AddonCallInfo, AddonInfoDto, AddonListedDto, AddonLogDto, LanguageString, LogStatus, Notification, NotificationType, Right } from '../types';
|
|
2
|
-
import { AddBookResponse, BookListItem } from '../types/books';
|
|
2
|
+
import { AddBookResponse, BookListItem, BookOpenCountItem, OrganizationStatusResponse } from '../types/books';
|
|
3
3
|
import { OfficeInList, OfficeUser } from '../types/office';
|
|
4
4
|
import { PermissionPatch } from '../types/rights';
|
|
5
|
+
import { UserListItem } from '../types/user';
|
|
5
6
|
import { KitsasBookInterface } from './kitsasbook.interface';
|
|
6
7
|
import { KitsasOfficeInterface } from './kitsasoffice.interface';
|
|
8
|
+
/**
|
|
9
|
+
* Connection to Kitsas Server
|
|
10
|
+
*
|
|
11
|
+
* Use {@link KitsasConnection.login} to create a new connection
|
|
12
|
+
*
|
|
13
|
+
* You can get {@link KitsasOfficeInterface} from {@link getOffice}
|
|
14
|
+
* and {@link KitsasBookInterface} from {@link getBook}
|
|
15
|
+
*
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
7
18
|
export interface KitsasConnectionInterface {
|
|
8
19
|
/**
|
|
9
20
|
* Get current user's name
|
|
@@ -21,11 +32,12 @@ export interface KitsasConnectionInterface {
|
|
|
21
32
|
*/
|
|
22
33
|
getOffice(id: string): Promise<KitsasOfficeInterface>;
|
|
23
34
|
/**
|
|
24
|
-
* Get list of books
|
|
25
|
-
*
|
|
35
|
+
* Get list of books user has access to
|
|
36
|
+
* To list book of a specific office, use getOffice(id).getBooks()
|
|
37
|
+
* To list books of a specific bookshelf, use getOffice(id).getBooks(bookshelfId)
|
|
26
38
|
* @returns List of books
|
|
27
39
|
*/
|
|
28
|
-
getBooks(
|
|
40
|
+
getBooks(): Promise<BookListItem[]>;
|
|
29
41
|
/**
|
|
30
42
|
* Add a new book (organization for bookkeeping)
|
|
31
43
|
* @param bookshelfId
|
|
@@ -38,6 +50,16 @@ export interface KitsasConnectionInterface {
|
|
|
38
50
|
* @param bookId
|
|
39
51
|
*/
|
|
40
52
|
getBook(bookId: string): Promise<KitsasBookInterface>;
|
|
53
|
+
/**
|
|
54
|
+
* Delete a book
|
|
55
|
+
* @param bookId
|
|
56
|
+
*/
|
|
57
|
+
deleteBook(bookId: string): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Get organization status (FREE, ACTIVE, INVALID) and registered name
|
|
60
|
+
* @param businessId Business id
|
|
61
|
+
*/
|
|
62
|
+
getOrganizationStatus(businessId: string): Promise<OrganizationStatusResponse>;
|
|
41
63
|
/**
|
|
42
64
|
* List users and their roles
|
|
43
65
|
* @param target Office, bookshelf or book id
|
|
@@ -115,4 +137,10 @@ export interface KitsasConnectionInterface {
|
|
|
115
137
|
* @param addonId Addon id
|
|
116
138
|
*/
|
|
117
139
|
getNotifications(bookId: string, addonId?: string): Promise<Notification[]>;
|
|
140
|
+
/**
|
|
141
|
+
* Find user by email
|
|
142
|
+
* @param email Email address
|
|
143
|
+
*/
|
|
144
|
+
findUserByEmail(email: string): Promise<UserListItem | undefined>;
|
|
145
|
+
getBookOpenCounts(bookId: string): Promise<BookOpenCountItem[]>;
|
|
118
146
|
}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { BookListItem, LanguageString } from '../types';
|
|
2
|
+
import { CertificateFetchResult, CertificateStatusInformation } from '../types/certificate';
|
|
2
3
|
import { Bookshelf, OfficeRole } from '../types/office';
|
|
3
4
|
import { UserListItem } from '../types/user';
|
|
5
|
+
/**
|
|
6
|
+
* Interface to office, role and bookshelf management
|
|
7
|
+
*
|
|
8
|
+
* You get KitsasOfficeInterface from {@link KitsasConnectionInterface.getOffice}
|
|
9
|
+
*/
|
|
4
10
|
export interface KitsasOfficeInterface {
|
|
5
11
|
/**
|
|
6
12
|
* Get the ID of the office.
|
|
@@ -23,6 +29,10 @@ export interface KitsasOfficeInterface {
|
|
|
23
29
|
* Get roles of the office
|
|
24
30
|
*/
|
|
25
31
|
getRoles(): OfficeRole[];
|
|
32
|
+
/**
|
|
33
|
+
* Refresh office data
|
|
34
|
+
*/
|
|
35
|
+
refresh(): Promise<void>;
|
|
26
36
|
/**
|
|
27
37
|
* Add a role
|
|
28
38
|
*
|
|
@@ -46,8 +56,73 @@ export interface KitsasOfficeInterface {
|
|
|
46
56
|
* Get bookshelves of the office
|
|
47
57
|
*/
|
|
48
58
|
getBookshelves(): Bookshelf[];
|
|
59
|
+
/**
|
|
60
|
+
* Add new bookshelf
|
|
61
|
+
* @param name Name of bookshelf
|
|
62
|
+
* @param parentId Id of parent bookshelf, or undefined if top level
|
|
63
|
+
*/
|
|
64
|
+
addBookshelf(name: string, parentId?: string): Promise<Bookshelf>;
|
|
65
|
+
/**
|
|
66
|
+
* Remove bookshelf
|
|
67
|
+
* @param id Bookshelf id
|
|
68
|
+
*/
|
|
69
|
+
deleteBookshelf(id: string): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Rename bookshelf
|
|
72
|
+
* @param id Bookshelf id
|
|
73
|
+
* @param name New name for bookshelf
|
|
74
|
+
*/
|
|
75
|
+
renameBookshelf(id: string, name: string): Promise<Bookshelf>;
|
|
76
|
+
/**
|
|
77
|
+
* Move bookshef
|
|
78
|
+
* @param id
|
|
79
|
+
* @param newParentId
|
|
80
|
+
*/
|
|
81
|
+
moveBookShelf(id: string, newParentId: string): Promise<Bookshelf>;
|
|
49
82
|
/**
|
|
50
83
|
* Get users of the office
|
|
51
84
|
*/
|
|
52
85
|
getUsers(): Promise<UserListItem[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Add a new user
|
|
88
|
+
*
|
|
89
|
+
* User should not exist in the system
|
|
90
|
+
*
|
|
91
|
+
* @param name User's name
|
|
92
|
+
* @param email User's email address
|
|
93
|
+
* @param customer Is customer of accounting office
|
|
94
|
+
* @param invite Send invitation email to user
|
|
95
|
+
*/
|
|
96
|
+
addUser(name: string, email: string, customer: boolean, invite: boolean): Promise<UserListItem>;
|
|
97
|
+
/**
|
|
98
|
+
* Delete a user
|
|
99
|
+
* @param id
|
|
100
|
+
*/
|
|
101
|
+
deleteUser(id: string): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Move book to another bookshelf
|
|
104
|
+
* @param bookId Book id
|
|
105
|
+
* @param bookshelfId Destination bookshelf id
|
|
106
|
+
*/
|
|
107
|
+
moveBook(bookId: string, bookshelfId: string): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Change plan of a book
|
|
110
|
+
* @param bookId Book id
|
|
111
|
+
* @param planId Plan id
|
|
112
|
+
*/
|
|
113
|
+
changePlan(bookId: string, planId: number): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Get information about the certificate
|
|
116
|
+
*/
|
|
117
|
+
getCertificateInformation(): CertificateStatusInformation;
|
|
118
|
+
/**
|
|
119
|
+
* Fetch a new Tulorekisteri cetificate
|
|
120
|
+
* @param transferId
|
|
121
|
+
* @param password
|
|
122
|
+
*/
|
|
123
|
+
installCertificate(transferId: string, password: string): Promise<CertificateFetchResult>;
|
|
124
|
+
/**
|
|
125
|
+
* Remove the current Tulorekisteri cetificate
|
|
126
|
+
*/
|
|
127
|
+
removeCertificate(): Promise<void>;
|
|
53
128
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { KitsasBookInterface } from '../interfaces/kitsasbook.interface';
|
|
2
|
-
import { Account, CreateVoucherDto, Dimension, FiscalYear } from '../types';
|
|
2
|
+
import { Account, AttachmentDto, CreateInvoiceResponseDto, CreateVoucherDto, CreateVoucherResponseDto, Dimension, FiscalYear, InvoiceDto, Product, TransactionEntryDto } from '../types';
|
|
3
3
|
export declare class MockKitsasBook implements KitsasBookInterface {
|
|
4
4
|
constructor(id: string);
|
|
5
5
|
getDimensions(): Promise<Dimension[]>;
|
|
6
|
-
saveVoucher(_voucher: CreateVoucherDto): Promise<
|
|
7
|
-
|
|
6
|
+
saveVoucher(_voucher: CreateVoucherDto, _attachments: AttachmentDto[]): Promise<CreateVoucherResponseDto>;
|
|
7
|
+
saveInvoice(invoice: InvoiceDto, _attachments: AttachmentDto[]): Promise<CreateInvoiceResponseDto>;
|
|
8
|
+
saveTransactions(_iban: string, _startDate: Date, _endDate: Date, _entries: TransactionEntryDto[], _original: object): Promise<CreateVoucherResponseDto>;
|
|
8
9
|
getBookId(): string;
|
|
9
10
|
getAccounts(): Promise<Account[]>;
|
|
10
11
|
getFiscalYears(): Promise<FiscalYear[]>;
|
|
12
|
+
getProducts(): Promise<Product[]>;
|
|
13
|
+
private bookId;
|
|
11
14
|
}
|
|
@@ -34,9 +34,42 @@ class MockKitsasBook {
|
|
|
34
34
|
},
|
|
35
35
|
]);
|
|
36
36
|
}
|
|
37
|
+
saveVoucher(
|
|
37
38
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
_voucher,
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
41
|
+
_attachments) {
|
|
42
|
+
return Promise.resolve({
|
|
43
|
+
id: 'fb6a9d86-278d-4f69-8887-b4f0b587a7cd',
|
|
44
|
+
data: {},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
saveInvoice(invoice,
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
49
|
+
_attachments) {
|
|
50
|
+
return Promise.resolve({
|
|
51
|
+
voucher: {
|
|
52
|
+
id: 'fb6a9d86-278d-4f69-8887-b4f0b587a7cd',
|
|
53
|
+
data: {},
|
|
54
|
+
},
|
|
55
|
+
invoice,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
saveTransactions(
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
60
|
+
_iban,
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
62
|
+
_startDate,
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
64
|
+
_endDate,
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
66
|
+
_entries,
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
68
|
+
_original) {
|
|
69
|
+
return Promise.resolve({
|
|
70
|
+
id: 'fb6a9d86-278d-4f69-8887-b4f0b587a7cd',
|
|
71
|
+
data: {},
|
|
72
|
+
});
|
|
40
73
|
}
|
|
41
74
|
getBookId() {
|
|
42
75
|
return this.bookId;
|
|
@@ -51,7 +84,7 @@ class MockKitsasBook {
|
|
|
51
84
|
]);
|
|
52
85
|
}
|
|
53
86
|
async getFiscalYears() {
|
|
54
|
-
return [
|
|
87
|
+
return Promise.resolve([
|
|
55
88
|
{
|
|
56
89
|
id: '1',
|
|
57
90
|
startDate: new Date('2020-01-01'),
|
|
@@ -67,8 +100,30 @@ class MockKitsasBook {
|
|
|
67
100
|
startDate: new Date('2022-01-01'),
|
|
68
101
|
endDate: new Date('2022-12-31'),
|
|
69
102
|
},
|
|
70
|
-
];
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
async getProducts() {
|
|
106
|
+
return Promise.resolve([
|
|
107
|
+
{
|
|
108
|
+
id: '1',
|
|
109
|
+
code: 'PROD1',
|
|
110
|
+
name: { fi: 'Tuote 1', sv: 'Produkt 1', en: 'Product 1' },
|
|
111
|
+
unit: {
|
|
112
|
+
code: 'C62',
|
|
113
|
+
name: { fi: 'Kappale', sv: 'Stycke', en: 'Piece' },
|
|
114
|
+
},
|
|
115
|
+
vat: {
|
|
116
|
+
code: types_1.InvoiceVatCodeEnum.DOMESTIC,
|
|
117
|
+
percent: 24,
|
|
118
|
+
},
|
|
119
|
+
accounting: {
|
|
120
|
+
account: '31000',
|
|
121
|
+
dimensions: ['0'],
|
|
122
|
+
},
|
|
123
|
+
price: 100,
|
|
124
|
+
},
|
|
125
|
+
]);
|
|
71
126
|
}
|
|
72
127
|
}
|
|
73
128
|
exports.MockKitsasBook = MockKitsasBook;
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja2l0c2FzYm9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2MvbW9ja2l0c2FzYm9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxvQ0Fha0I7QUFFbEIsTUFBYSxjQUFjO0lBQ3pCLFlBQVksRUFBVTtRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBQ0QsYUFBYTtRQUNYLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNyQjtnQkFDRSxFQUFFLEVBQUUsR0FBRztnQkFDUCxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRTtnQkFDcEQsSUFBSSxFQUFFLHFCQUFhLENBQUMsT0FBTzthQUM1QjtZQUNEO2dCQUNFLEVBQUUsRUFBRSxHQUFHO2dCQUNQLElBQUksRUFBRTtvQkFDSixFQUFFLEVBQUUsaUJBQWlCO29CQUNyQixFQUFFLEVBQUUsZ0JBQWdCO29CQUNwQixFQUFFLEVBQUUsYUFBYTtpQkFDbEI7Z0JBQ0QsSUFBSSxFQUFFLHFCQUFhLENBQUMsV0FBVzthQUNoQztZQUNEO2dCQUNFLEVBQUUsRUFBRSxHQUFHO2dCQUNQLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFO2dCQUN0RCxJQUFJLEVBQUUscUJBQWEsQ0FBQyxPQUFPO2FBQzVCO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUU7Z0JBQ3pELElBQUksRUFBRSxxQkFBYSxDQUFDLE9BQU87YUFDNUI7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztJQUNULDZEQUE2RDtJQUM3RCxRQUEwQjtJQUMxQiw2REFBNkQ7SUFDN0QsWUFBNkI7UUFFN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3JCLEVBQUUsRUFBRSxzQ0FBc0M7WUFDMUMsSUFBSSxFQUFFLEVBQUU7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUNULE9BQW1CO0lBQ25CLDZEQUE2RDtJQUM3RCxZQUE2QjtRQUU3QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDckIsT0FBTyxFQUFFO2dCQUNQLEVBQUUsRUFBRSxzQ0FBc0M7Z0JBQzFDLElBQUksRUFBRSxFQUFFO2FBQ1Q7WUFDRCxPQUFPO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNkLDZEQUE2RDtJQUM3RCxLQUFhO0lBQ2IsNkRBQTZEO0lBQzdELFVBQWdCO0lBQ2hCLDZEQUE2RDtJQUM3RCxRQUFjO0lBQ2QsNkRBQTZEO0lBQzdELFFBQStCO0lBQy9CLDZEQUE2RDtJQUM3RCxTQUFpQjtRQUVqQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDckIsRUFBRSxFQUFFLHNDQUFzQztZQUMxQyxJQUFJLEVBQUUsRUFBRTtTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3JCO2dCQUNFLE1BQU0sRUFBRSxPQUFPO2dCQUNmLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFO2dCQUN0RCxRQUFRLEVBQUUsR0FBRzthQUNkO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjO1FBQ2xCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNyQjtnQkFDRSxFQUFFLEVBQUUsR0FBRztnQkFDUCxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2FBQ2hDO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDakMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQzthQUNoQztZQUNEO2dCQUNFLEVBQUUsRUFBRSxHQUFHO2dCQUNQLFNBQVMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDaEM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDZixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDckI7Z0JBQ0UsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUU7Z0JBQ3pELElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUUsS0FBSztvQkFDWCxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtpQkFDbkQ7Z0JBQ0QsR0FBRyxFQUFFO29CQUNILElBQUksRUFBRSwwQkFBa0IsQ0FBQyxRQUFRO29CQUNqQyxPQUFPLEVBQUUsRUFBRTtpQkFDWjtnQkFDRCxVQUFVLEVBQUU7b0JBQ1YsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQztpQkFDbEI7Z0JBQ0QsS0FBSyxFQUFFLEdBQUc7YUFDWDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FHRjtBQXZJRCx3Q0F1SUMifQ==
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { KitsasOfficeInterface } from '../interfaces/kitsasoffice.interface';
|
|
2
2
|
import { LanguageString, OfficeRole } from '../types';
|
|
3
3
|
import { BookListItem } from '../types/books';
|
|
4
|
+
import { CertificateFetchResult, CertificateStatusInformation } from '../types/certificate';
|
|
4
5
|
import { Bookshelf } from '../types/office';
|
|
5
6
|
import { UserListItem } from '../types/user';
|
|
6
7
|
export declare class MockKitsasOffice implements KitsasOfficeInterface {
|
|
@@ -11,11 +12,24 @@ export declare class MockKitsasOffice implements KitsasOfficeInterface {
|
|
|
11
12
|
getId(): string;
|
|
12
13
|
getName(): string;
|
|
13
14
|
getBusinessId(): string | undefined;
|
|
15
|
+
refresh(): Promise<void>;
|
|
14
16
|
getBooks(_bookshelfId?: string): Promise<BookListItem[]>;
|
|
15
17
|
getRoles(): OfficeRole[];
|
|
16
18
|
getBookshelves(): Bookshelf[];
|
|
19
|
+
private static findBookShelf;
|
|
20
|
+
addBookshelf(name: string, parentId?: string | undefined): Promise<Bookshelf>;
|
|
21
|
+
deleteBookshelf(id: string): Promise<void>;
|
|
22
|
+
renameBookshelf(id: string, name: string): Promise<Bookshelf>;
|
|
17
23
|
addRole(name: LanguageString, rights: string[]): Promise<OfficeRole>;
|
|
18
24
|
editRole(id: string, name: LanguageString, rights: string[]): Promise<OfficeRole>;
|
|
19
25
|
deleteRole(id: string): Promise<void>;
|
|
20
26
|
getUsers(): Promise<UserListItem[]>;
|
|
27
|
+
addUser(name: string, email: string, customer: boolean, _invite: boolean): Promise<UserListItem>;
|
|
28
|
+
deleteUser(id: string): Promise<void>;
|
|
29
|
+
moveBook(bookId: string, bookshelfId: string): Promise<void>;
|
|
30
|
+
changePlan(bookId: string, planId: number): Promise<void>;
|
|
31
|
+
moveBookShelf(id: string, newParentId: string): Promise<Bookshelf>;
|
|
32
|
+
getCertificateInformation(): CertificateStatusInformation;
|
|
33
|
+
installCertificate(transferId: string, password: string): Promise<CertificateFetchResult>;
|
|
34
|
+
removeCertificate(): Promise<void>;
|
|
21
35
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MockKitsasOffice = void 0;
|
|
4
|
+
const certificate_1 = require("../types/certificate");
|
|
5
|
+
const user_1 = require("../types/user");
|
|
4
6
|
class MockKitsasOffice {
|
|
5
7
|
constructor(id) {
|
|
6
8
|
this.roles = [
|
|
@@ -12,6 +14,7 @@ class MockKitsasOffice {
|
|
|
12
14
|
en: 'User',
|
|
13
15
|
sv: 'Användare',
|
|
14
16
|
},
|
|
17
|
+
system: false,
|
|
15
18
|
},
|
|
16
19
|
];
|
|
17
20
|
this.bookshelves = [
|
|
@@ -46,6 +49,11 @@ class MockKitsasOffice {
|
|
|
46
49
|
getBusinessId() {
|
|
47
50
|
return '1234567-8';
|
|
48
51
|
}
|
|
52
|
+
refresh() {
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
resolve();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
49
57
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
50
58
|
getBooks(_bookshelfId) {
|
|
51
59
|
return new Promise((resolve) => {
|
|
@@ -79,12 +87,62 @@ class MockKitsasOffice {
|
|
|
79
87
|
getBookshelves() {
|
|
80
88
|
return this.bookshelves;
|
|
81
89
|
}
|
|
90
|
+
static findBookShelf(id, bookshelves) {
|
|
91
|
+
for (const bookshelf of bookshelves) {
|
|
92
|
+
if (bookshelf.id === id) {
|
|
93
|
+
return bookshelf;
|
|
94
|
+
}
|
|
95
|
+
const sub = this.findBookShelf(id, bookshelf.subgroups);
|
|
96
|
+
if (sub) {
|
|
97
|
+
return sub;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
addBookshelf(name, parentId) {
|
|
103
|
+
return new Promise((resolve) => {
|
|
104
|
+
const bookshelf = {
|
|
105
|
+
id: '8c742657-5613-4065-8173-2ba01bd28f36',
|
|
106
|
+
name,
|
|
107
|
+
rights: ['A', 'O', 'OB', 'OD', 'OG', 'OL', 'OM', 'OP', 'OS', 'OT'],
|
|
108
|
+
subgroups: [],
|
|
109
|
+
};
|
|
110
|
+
if (parentId) {
|
|
111
|
+
const parent = MockKitsasOffice.findBookShelf(parentId, this.bookshelves);
|
|
112
|
+
if (parent) {
|
|
113
|
+
parent.subgroups.push(bookshelf);
|
|
114
|
+
this.bookshelves = this.bookshelves.map((shelf) => shelf.id === parentId ? parent : shelf);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this.bookshelves.push(bookshelf);
|
|
119
|
+
}
|
|
120
|
+
resolve(bookshelf);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
deleteBookshelf(id) {
|
|
124
|
+
return new Promise((resolve) => {
|
|
125
|
+
this.bookshelves = this.bookshelves.filter((shelf) => shelf.id !== id);
|
|
126
|
+
resolve();
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
renameBookshelf(id, name) {
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
const bookshelf = MockKitsasOffice.findBookShelf(id, this.bookshelves);
|
|
132
|
+
if (!bookshelf) {
|
|
133
|
+
throw new Error('Bookshelf not found');
|
|
134
|
+
}
|
|
135
|
+
bookshelf.name = name;
|
|
136
|
+
resolve(bookshelf);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
82
139
|
addRole(name, rights) {
|
|
83
140
|
return new Promise((resolve) => {
|
|
84
141
|
const role = {
|
|
85
142
|
id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
|
|
86
143
|
rights,
|
|
87
144
|
name,
|
|
145
|
+
system: false,
|
|
88
146
|
};
|
|
89
147
|
this.roles.push(role);
|
|
90
148
|
resolve(role);
|
|
@@ -113,11 +171,71 @@ class MockKitsasOffice {
|
|
|
113
171
|
{
|
|
114
172
|
id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
|
|
115
173
|
name: 'Katja Käyttäjä',
|
|
116
|
-
|
|
174
|
+
email: 'katja@testi.fi',
|
|
175
|
+
mode: user_1.UserMode.PRO,
|
|
117
176
|
},
|
|
118
177
|
]);
|
|
119
178
|
});
|
|
120
179
|
}
|
|
180
|
+
addUser(name, email, customer,
|
|
181
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
182
|
+
_invite) {
|
|
183
|
+
return new Promise((resolve) => {
|
|
184
|
+
resolve({
|
|
185
|
+
id: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
|
|
186
|
+
name,
|
|
187
|
+
email,
|
|
188
|
+
mode: customer ? user_1.UserMode.CUSTOMER : user_1.UserMode.PRO,
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
deleteUser(id) {
|
|
193
|
+
return new Promise((resolve) => {
|
|
194
|
+
console.log('Delete user', id);
|
|
195
|
+
resolve();
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
moveBook(bookId, bookshelfId) {
|
|
199
|
+
return new Promise((resolve) => {
|
|
200
|
+
console.log('Move book', bookId, bookshelfId);
|
|
201
|
+
resolve();
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
changePlan(bookId, planId) {
|
|
205
|
+
return new Promise((resolve) => {
|
|
206
|
+
console.log('Change plan', bookId, planId);
|
|
207
|
+
resolve();
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
moveBookShelf(id, newParentId) {
|
|
211
|
+
return new Promise((resolve) => {
|
|
212
|
+
console.log('Move bookshelf', id, newParentId);
|
|
213
|
+
const parent = MockKitsasOffice.findBookShelf(newParentId, this.bookshelves);
|
|
214
|
+
const shelf = MockKitsasOffice.findBookShelf(id, this.bookshelves);
|
|
215
|
+
parent === null || parent === void 0 ? void 0 : parent.subgroups.push(shelf);
|
|
216
|
+
resolve(shelf);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
getCertificateInformation() {
|
|
220
|
+
return {
|
|
221
|
+
status: certificate_1.CertificateStatus.MISSING,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
installCertificate(transferId, password) {
|
|
225
|
+
return new Promise((resolve) => {
|
|
226
|
+
console.log('Install certificate', transferId, password);
|
|
227
|
+
resolve({
|
|
228
|
+
status: certificate_1.CertificateStatus.ERROR,
|
|
229
|
+
error: 'Not implemented in mock',
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
removeCertificate() {
|
|
234
|
+
return new Promise((resolve) => {
|
|
235
|
+
console.log('Remove certificate');
|
|
236
|
+
resolve();
|
|
237
|
+
});
|
|
238
|
+
}
|
|
121
239
|
}
|
|
122
240
|
exports.MockKitsasOffice = MockKitsasOffice;
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja2l0c2Fzb2ZmaWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vYy9tb2NraXRzYXNvZmZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0Esc0RBSThCO0FBRTlCLHdDQUF1RDtBQUV2RCxNQUFhLGdCQUFnQjtJQUMzQixZQUFZLEVBQVU7UUFLZCxVQUFLLEdBQWlCO1lBQzVCO2dCQUNFLEVBQUUsRUFBRSxzQ0FBc0M7Z0JBQzFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQ3BCLElBQUksRUFBRTtvQkFDSixFQUFFLEVBQUUsVUFBVTtvQkFDZCxFQUFFLEVBQUUsTUFBTTtvQkFDVixFQUFFLEVBQUUsV0FBVztpQkFDaEI7Z0JBQ0QsTUFBTSxFQUFFLEtBQUs7YUFDZDtTQUNGLENBQUM7UUFFTSxnQkFBVyxHQUFnQjtZQUNqQztnQkFDRSxFQUFFLEVBQUUsc0NBQXNDO2dCQUMxQyxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2dCQUNsRSxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsRUFBRSxFQUFFLHNDQUFzQzt3QkFDMUMsSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQzt3QkFDbEUsU0FBUyxFQUFFLEVBQUU7cUJBQ2Q7aUJBQ0Y7YUFDRjtZQUNEO2dCQUNFLEVBQUUsRUFBRSxzQ0FBc0M7Z0JBQzFDLElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLE1BQU0sRUFBRSxDQUFDLEdBQUcs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
|