@stamhoofd/structures 2.109.0 → 2.111.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/dist/src/billing/Invoice.d.ts +8 -2
- package/dist/src/billing/Invoice.d.ts.map +1 -1
- package/dist/src/billing/Invoice.js +44 -9
- package/dist/src/billing/Invoice.js.map +1 -1
- package/dist/src/billing/Invoice.test.d.ts +2 -0
- package/dist/src/billing/Invoice.test.d.ts.map +1 -0
- package/dist/src/billing/Invoice.test.js +188 -0
- package/dist/src/billing/Invoice.test.js.map +1 -0
- package/dist/src/billing/InvoicedBalanceItem.d.ts +5 -3
- package/dist/src/billing/InvoicedBalanceItem.d.ts.map +1 -1
- package/dist/src/billing/InvoicedBalanceItem.js +15 -6
- package/dist/src/billing/InvoicedBalanceItem.js.map +1 -1
- package/dist/src/billing/InvoicedBalanceItem.test.js +31 -12
- package/dist/src/billing/InvoicedBalanceItem.test.js.map +1 -1
- package/dist/src/filters/PropertyFilter.d.ts +1 -0
- package/dist/src/filters/PropertyFilter.d.ts.map +1 -1
- package/dist/src/filters/PropertyFilter.js +97 -0
- package/dist/src/filters/PropertyFilter.js.map +1 -1
- package/dist/src/members/OrganizationRecordsConfiguration.d.ts.map +1 -1
- package/dist/src/members/OrganizationRecordsConfiguration.js +54 -9
- package/dist/src/members/OrganizationRecordsConfiguration.js.map +1 -1
- package/dist/src/members/PlatformMember.d.ts +4 -0
- package/dist/src/members/PlatformMember.d.ts.map +1 -1
- package/dist/src/members/PlatformMember.js +26 -2
- package/dist/src/members/PlatformMember.js.map +1 -1
- package/esm/dist/src/billing/Invoice.d.ts +8 -2
- package/esm/dist/src/billing/Invoice.d.ts.map +1 -1
- package/esm/dist/src/billing/Invoice.js +45 -10
- package/esm/dist/src/billing/Invoice.js.map +1 -1
- package/esm/dist/src/billing/InvoicedBalanceItem.d.ts +5 -3
- package/esm/dist/src/billing/InvoicedBalanceItem.d.ts.map +1 -1
- package/esm/dist/src/billing/InvoicedBalanceItem.js +15 -6
- package/esm/dist/src/billing/InvoicedBalanceItem.js.map +1 -1
- package/esm/dist/src/filters/PropertyFilter.d.ts +1 -0
- package/esm/dist/src/filters/PropertyFilter.d.ts.map +1 -1
- package/esm/dist/src/filters/PropertyFilter.js +98 -1
- package/esm/dist/src/filters/PropertyFilter.js.map +1 -1
- package/esm/dist/src/members/OrganizationRecordsConfiguration.d.ts.map +1 -1
- package/esm/dist/src/members/OrganizationRecordsConfiguration.js +54 -9
- package/esm/dist/src/members/OrganizationRecordsConfiguration.js.map +1 -1
- package/esm/dist/src/members/PlatformMember.d.ts +4 -0
- package/esm/dist/src/members/PlatformMember.d.ts.map +1 -1
- package/esm/dist/src/members/PlatformMember.js +26 -2
- package/esm/dist/src/members/PlatformMember.js.map +1 -1
- package/package.json +2 -2
|
@@ -6,9 +6,9 @@ import { InvoicedBalanceItem } from './InvoicedBalanceItem.js';
|
|
|
6
6
|
import { VATExcemptReason } from '../BalanceItem.js';
|
|
7
7
|
export declare class VATSubtotal extends AutoEncoder {
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* For tax ecempt items, this should be zero but it is ignored anyway
|
|
10
10
|
*/
|
|
11
|
-
VATPercentage: number
|
|
11
|
+
VATPercentage: number;
|
|
12
12
|
VATExcempt: VATExcemptReason | null;
|
|
13
13
|
/**
|
|
14
14
|
* Value on which the VAT is calculated (taxable amount)
|
|
@@ -67,6 +67,9 @@ export declare class Invoice extends AutoEncoder {
|
|
|
67
67
|
/**
|
|
68
68
|
* The difference between the totalWithVAT of the invoice and the sum of all balanceInvoicedAmount of the invoiced balance items.
|
|
69
69
|
* totalBalanceInvoicedAmount + balanceRoundingAmount = totalWithVAT
|
|
70
|
+
*
|
|
71
|
+
* Best viewed as a virtual extra balance item linked to the invoice to compensate.
|
|
72
|
+
*
|
|
70
73
|
* This is used to explain and report why there is a difference between the sum of the balance item's prices and the actually invoiced price, comparable with roundingAmount on payments.
|
|
71
74
|
* - Say we invoice 3 items of 0,242 euro. The sum would be 0,726. The invoice total price might be 0,73 because of rounding rules. Then the balanceRoundingAmount would be -0,004.
|
|
72
75
|
*/
|
|
@@ -93,6 +96,9 @@ export declare class Invoice extends AutoEncoder {
|
|
|
93
96
|
reference: string | null;
|
|
94
97
|
pdf: File | null;
|
|
95
98
|
xml: File | null;
|
|
99
|
+
negativeInvoiceId: string | null;
|
|
100
|
+
didSendPeppol: boolean;
|
|
96
101
|
calculateVAT(): void;
|
|
102
|
+
addItem(item: InvoicedBalanceItem): void;
|
|
97
103
|
}
|
|
98
104
|
//# sourceMappingURL=Invoice.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invoice.d.ts","sourceRoot":"","sources":["../../../src/billing/Invoice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,
|
|
1
|
+
{"version":3,"file":"Invoice.d.ts","sourceRoot":"","sources":["../../../src/billing/Invoice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAqE,MAAM,6BAA6B,CAAC;AAE3I,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,qBAAa,WAAY,SAAQ,WAAW;IACxC;;OAEG;IAEH,aAAa,EAAE,MAAM,CAAK;IAG1B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAE3C;;OAEG;IAEH,YAAY,EAAE,MAAM,CAAK;IAGzB,GAAG,EAAE,MAAM,CAAK;CACnB;AAED,qBAAa,OAAQ,SAAQ,WAAW;IAEpC,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IAEH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE7B;;OAEG;IAEH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IAEH,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C;;;OAGG;IAEH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IAEH,QAAQ,EAAE,eAAe,CAAC;IAE1B;;OAEG;IAEH,KAAK,EAAE,mBAAmB,EAAE,CAAM;IAElC,IAAI,eAAe,WAElB;IAED,IAAI,0BAA0B,WAE7B;IAED;;;;;;;;;;;;;;OAcG;IAEH,qBAAqB,EAAE,MAAM,CAAK;IAElC;;;;;;;;OAQG;IACH,IAAI,qBAAqB,WAExB;IAED;;OAEG;IAEH,QAAQ,EAAE,WAAW,EAAE,CAAM;IAE7B,IAAI,cAAc,WAEjB;IAED;;;;;;OAMG;IACH,IAAI,YAAY,WAEf;IAGD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGhC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEhC;;OAEG;IAEH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGhC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAQ;IAGxB,GAAG,EAAE,IAAI,GAAG,IAAI,CAAQ;IAGxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGxC,aAAa,UAAS;IAEtB,YAAY;IAoCZ,OAAO,CAAC,IAAI,EAAE,mBAAmB;CAIpC"}
|
|
@@ -13,9 +13,9 @@ class VATSubtotal extends simple_encoding_1.AutoEncoder {
|
|
|
13
13
|
constructor() {
|
|
14
14
|
super(...arguments);
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* For tax ecempt items, this should be zero but it is ignored anyway
|
|
17
17
|
*/
|
|
18
|
-
this.VATPercentage =
|
|
18
|
+
this.VATPercentage = 0;
|
|
19
19
|
this.VATExcempt = null;
|
|
20
20
|
/**
|
|
21
21
|
* Value on which the VAT is calculated (taxable amount)
|
|
@@ -26,7 +26,7 @@ class VATSubtotal extends simple_encoding_1.AutoEncoder {
|
|
|
26
26
|
}
|
|
27
27
|
exports.VATSubtotal = VATSubtotal;
|
|
28
28
|
tslib_1.__decorate([
|
|
29
|
-
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.IntegerDecoder
|
|
29
|
+
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.IntegerDecoder })
|
|
30
30
|
], VATSubtotal.prototype, "VATPercentage", void 0);
|
|
31
31
|
tslib_1.__decorate([
|
|
32
32
|
(0, simple_encoding_1.field)({ decoder: new simple_encoding_1.EnumDecoder(BalanceItem_js_1.VATExcemptReason), nullable: true })
|
|
@@ -40,6 +40,17 @@ tslib_1.__decorate([
|
|
|
40
40
|
class Invoice extends simple_encoding_1.AutoEncoder {
|
|
41
41
|
constructor() {
|
|
42
42
|
super(...arguments);
|
|
43
|
+
/**
|
|
44
|
+
* Set if the invoice number is official. This number is unique per seller
|
|
45
|
+
*/
|
|
46
|
+
this.number = null;
|
|
47
|
+
/**
|
|
48
|
+
* Can be null if it is not linked to an organization.
|
|
49
|
+
* This is only used to allow the payer to list their (incoming) invoices.
|
|
50
|
+
*
|
|
51
|
+
* In the future we could expand this with members, users, and/or orders
|
|
52
|
+
*/
|
|
53
|
+
this.payingOrganizationId = null;
|
|
43
54
|
/**
|
|
44
55
|
* The balance items that are invoiced, with their original price. This does not always correspond to the total price of the invoice, or the item prices on the invoice because prices are converted to prices excluding VAT and with PEPPOL rounding rules.
|
|
45
56
|
*/
|
|
@@ -73,6 +84,8 @@ class Invoice extends simple_encoding_1.AutoEncoder {
|
|
|
73
84
|
this.reference = null;
|
|
74
85
|
this.pdf = null;
|
|
75
86
|
this.xml = null;
|
|
87
|
+
this.negativeInvoiceId = null;
|
|
88
|
+
this.didSendPeppol = false;
|
|
76
89
|
}
|
|
77
90
|
get totalWithoutVAT() {
|
|
78
91
|
return this.items.reduce((sum, item) => sum + item.totalWithoutVAT, 0);
|
|
@@ -83,6 +96,9 @@ class Invoice extends simple_encoding_1.AutoEncoder {
|
|
|
83
96
|
/**
|
|
84
97
|
* The difference between the totalWithVAT of the invoice and the sum of all balanceInvoicedAmount of the invoiced balance items.
|
|
85
98
|
* totalBalanceInvoicedAmount + balanceRoundingAmount = totalWithVAT
|
|
99
|
+
*
|
|
100
|
+
* Best viewed as a virtual extra balance item linked to the invoice to compensate.
|
|
101
|
+
*
|
|
86
102
|
* This is used to explain and report why there is a difference between the sum of the balance item's prices and the actually invoiced price, comparable with roundingAmount on payments.
|
|
87
103
|
* - Say we invoice 3 items of 0,242 euro. The sum would be 0,726. The invoice total price might be 0,73 because of rounding rules. Then the balanceRoundingAmount would be -0,004.
|
|
88
104
|
*/
|
|
@@ -107,16 +123,16 @@ class Invoice extends simple_encoding_1.AutoEncoder {
|
|
|
107
123
|
const categories = new Map();
|
|
108
124
|
for (const item of this.items) {
|
|
109
125
|
let key;
|
|
110
|
-
if (item.
|
|
126
|
+
if (item.VATExcempt === null) {
|
|
111
127
|
key = `vat_${item.VATPercentage}`;
|
|
112
128
|
}
|
|
113
129
|
else {
|
|
114
|
-
key = `excempt_${item.VATExcempt}`;
|
|
130
|
+
key = `excempt_${item.VATExcempt}_${item.VATExcempt}`;
|
|
115
131
|
}
|
|
116
132
|
let category = categories.get(key);
|
|
117
133
|
if (!category) {
|
|
118
134
|
category = new VATSubtotal();
|
|
119
|
-
category.VATPercentage = item.VATPercentage;
|
|
135
|
+
category.VATPercentage = item.VATExcempt === null ? item.VATPercentage : 0;
|
|
120
136
|
category.VATExcempt = item.VATExcempt;
|
|
121
137
|
categories.set(key, category);
|
|
122
138
|
}
|
|
@@ -124,7 +140,7 @@ class Invoice extends simple_encoding_1.AutoEncoder {
|
|
|
124
140
|
}
|
|
125
141
|
// Calculate VAT amount for each category and round to 1 cent
|
|
126
142
|
for (const category of categories.values()) {
|
|
127
|
-
if (category.
|
|
143
|
+
if (!category.VATExcempt) {
|
|
128
144
|
category.VAT = Math.round(category.taxablePrice * category.VATPercentage / 10000) * 100;
|
|
129
145
|
}
|
|
130
146
|
else {
|
|
@@ -133,16 +149,29 @@ class Invoice extends simple_encoding_1.AutoEncoder {
|
|
|
133
149
|
}
|
|
134
150
|
this.VATTotal = Array.from(categories.values());
|
|
135
151
|
}
|
|
152
|
+
addItem(item) {
|
|
153
|
+
this.items.push(item);
|
|
154
|
+
this.calculateVAT();
|
|
155
|
+
}
|
|
136
156
|
}
|
|
137
157
|
exports.Invoice = Invoice;
|
|
138
158
|
tslib_1.__decorate([
|
|
139
159
|
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.StringDecoder, defaultValue: () => (0, uuid_1.v4)() })
|
|
140
160
|
], Invoice.prototype, "id", void 0);
|
|
141
161
|
tslib_1.__decorate([
|
|
142
|
-
(0, simple_encoding_1.field)({ decoder:
|
|
162
|
+
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.StringDecoder, nullable: true })
|
|
163
|
+
], Invoice.prototype, "number", void 0);
|
|
164
|
+
tslib_1.__decorate([
|
|
165
|
+
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.StringDecoder })
|
|
166
|
+
], Invoice.prototype, "organizationId", void 0);
|
|
167
|
+
tslib_1.__decorate([
|
|
168
|
+
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.StringDecoder, nullable: true })
|
|
169
|
+
], Invoice.prototype, "payingOrganizationId", void 0);
|
|
170
|
+
tslib_1.__decorate([
|
|
171
|
+
(0, simple_encoding_1.field)({ decoder: Company_js_1.Company, defaultValue: () => Company_js_1.Company.create({}) })
|
|
143
172
|
], Invoice.prototype, "seller", void 0);
|
|
144
173
|
tslib_1.__decorate([
|
|
145
|
-
(0, simple_encoding_1.field)({ decoder: PaymentCustomer_js_1.PaymentCustomer })
|
|
174
|
+
(0, simple_encoding_1.field)({ decoder: PaymentCustomer_js_1.PaymentCustomer, defaultValue: () => PaymentCustomer_js_1.PaymentCustomer.create({}) })
|
|
146
175
|
], Invoice.prototype, "customer", void 0);
|
|
147
176
|
tslib_1.__decorate([
|
|
148
177
|
(0, simple_encoding_1.field)({ decoder: new simple_encoding_1.ArrayDecoder(InvoicedBalanceItem_js_1.InvoicedBalanceItem) })
|
|
@@ -171,4 +200,10 @@ tslib_1.__decorate([
|
|
|
171
200
|
tslib_1.__decorate([
|
|
172
201
|
(0, simple_encoding_1.field)({ decoder: File_js_1.File, nullable: true })
|
|
173
202
|
], Invoice.prototype, "xml", void 0);
|
|
203
|
+
tslib_1.__decorate([
|
|
204
|
+
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.StringDecoder, nullable: true })
|
|
205
|
+
], Invoice.prototype, "negativeInvoiceId", void 0);
|
|
206
|
+
tslib_1.__decorate([
|
|
207
|
+
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.BooleanDecoder, optional: true })
|
|
208
|
+
], Invoice.prototype, "didSendPeppol", void 0);
|
|
174
209
|
//# sourceMappingURL=Invoice.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invoice.js","sourceRoot":"","sources":["../../../src/billing/Invoice.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"Invoice.js","sourceRoot":"","sources":["../../../src/billing/Invoice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Invoice.test.d.ts","sourceRoot":"","sources":["../../../src/billing/Invoice.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const BalanceItem_js_1 = require("../BalanceItem.js");
|
|
4
|
+
const Invoice_js_1 = require("./Invoice.js");
|
|
5
|
+
const InvoicedBalanceItem_js_1 = require("./InvoicedBalanceItem.js");
|
|
6
|
+
describe('Invoice', () => {
|
|
7
|
+
test('Multiple items with 21% VAT', () => {
|
|
8
|
+
const invoice = Invoice_js_1.Invoice.create({});
|
|
9
|
+
{
|
|
10
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
11
|
+
balanceItem.description = 'Test Item 1';
|
|
12
|
+
balanceItem.unitPrice = 2000; // 0,20 euro, excluding VAT
|
|
13
|
+
balanceItem.quantity = 5;
|
|
14
|
+
balanceItem.VATPercentage = 21;
|
|
15
|
+
balanceItem.VATIncluded = false;
|
|
16
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 5 * 2000 * 121 / 100);
|
|
17
|
+
invoice.addItem(item);
|
|
18
|
+
expect(item.totalWithoutVAT).toEqual(5 * 2000);
|
|
19
|
+
}
|
|
20
|
+
{
|
|
21
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
22
|
+
balanceItem.description = 'Test Item 2';
|
|
23
|
+
balanceItem.unitPrice = 2000; // 0,20 euro, excluding VAT
|
|
24
|
+
balanceItem.quantity = 1;
|
|
25
|
+
balanceItem.VATPercentage = 21;
|
|
26
|
+
balanceItem.VATIncluded = false;
|
|
27
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 2000 * 121 / 100);
|
|
28
|
+
invoice.addItem(item);
|
|
29
|
+
expect(item.totalWithoutVAT).toEqual(2000);
|
|
30
|
+
}
|
|
31
|
+
// Check total price
|
|
32
|
+
expect(invoice.items.length).toEqual(2);
|
|
33
|
+
expect(invoice.totalWithoutVAT).toEqual(5 * 2000 + 2000);
|
|
34
|
+
const VAT = Math.round((5 * 2000 + 2000) * 21 / 100 / 100) * 100;
|
|
35
|
+
expect(invoice.VATTotalAmount).toEqual(VAT);
|
|
36
|
+
expect(invoice.VATTotal.length).toEqual(1);
|
|
37
|
+
expect(invoice.VATTotal[0].VAT).toEqual(VAT);
|
|
38
|
+
expect(invoice.VATTotal[0].VATPercentage).toEqual(21);
|
|
39
|
+
expect(invoice.VATTotal[0].taxablePrice).toEqual(5 * 2000 + 2000);
|
|
40
|
+
expect(invoice.totalWithVAT).toEqual(5 * 2000 + 2000 + VAT);
|
|
41
|
+
// Check difference
|
|
42
|
+
const balanceTotal = (5 * 2000 * 121 / 100 + 2000 * 121 / 100); // 1_45_20
|
|
43
|
+
expect(invoice.totalBalanceInvoicedAmount).toEqual(balanceTotal);
|
|
44
|
+
const difference = invoice.totalWithVAT - balanceTotal;
|
|
45
|
+
expect(difference).toEqual(-20); // 0,002 can't be shown on the invoice and is the difference
|
|
46
|
+
expect(invoice.balanceRoundingAmount).toEqual(-20);
|
|
47
|
+
});
|
|
48
|
+
test('Combination of Tax excempt items with VAT applicable items should be grouped correctly per tax rate', () => {
|
|
49
|
+
const invoice = Invoice_js_1.Invoice.create({});
|
|
50
|
+
{
|
|
51
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
52
|
+
balanceItem.description = 'Test Item 1';
|
|
53
|
+
balanceItem.unitPrice = 2000; // 0,20 euro, excluding VAT
|
|
54
|
+
balanceItem.quantity = 5;
|
|
55
|
+
balanceItem.VATPercentage = 21;
|
|
56
|
+
balanceItem.VATIncluded = false;
|
|
57
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 5 * 2000 * 121 / 100);
|
|
58
|
+
invoice.addItem(item);
|
|
59
|
+
expect(item.totalWithoutVAT).toEqual(5 * 2000);
|
|
60
|
+
}
|
|
61
|
+
{
|
|
62
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
63
|
+
balanceItem.description = 'Tax free item 1';
|
|
64
|
+
balanceItem.unitPrice = 2000;
|
|
65
|
+
balanceItem.quantity = 1;
|
|
66
|
+
balanceItem.VATPercentage = 21;
|
|
67
|
+
balanceItem.VATIncluded = false;
|
|
68
|
+
balanceItem.VATExcempt = BalanceItem_js_1.VATExcemptReason.IntraCommunity;
|
|
69
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 2000);
|
|
70
|
+
invoice.addItem(item);
|
|
71
|
+
expect(item.totalWithoutVAT).toEqual(2000);
|
|
72
|
+
}
|
|
73
|
+
{
|
|
74
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
75
|
+
balanceItem.description = 'Tax free item 2';
|
|
76
|
+
balanceItem.unitPrice = 52300;
|
|
77
|
+
balanceItem.quantity = 1;
|
|
78
|
+
balanceItem.VATPercentage = 6;
|
|
79
|
+
balanceItem.VATIncluded = false;
|
|
80
|
+
balanceItem.VATExcempt = BalanceItem_js_1.VATExcemptReason.IntraCommunity;
|
|
81
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 52300);
|
|
82
|
+
invoice.addItem(item);
|
|
83
|
+
expect(item.totalWithoutVAT).toEqual(52300);
|
|
84
|
+
}
|
|
85
|
+
{
|
|
86
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
87
|
+
balanceItem.description = 'Tax free item 3';
|
|
88
|
+
balanceItem.unitPrice = 52300;
|
|
89
|
+
balanceItem.quantity = 1;
|
|
90
|
+
balanceItem.VATPercentage = 21;
|
|
91
|
+
balanceItem.VATIncluded = false;
|
|
92
|
+
balanceItem.VATExcempt = BalanceItem_js_1.VATExcemptReason.IntraCommunity;
|
|
93
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 52300);
|
|
94
|
+
invoice.addItem(item);
|
|
95
|
+
expect(item.totalWithoutVAT).toEqual(52300);
|
|
96
|
+
}
|
|
97
|
+
// Check total price
|
|
98
|
+
expect(invoice.items.length).toEqual(4);
|
|
99
|
+
expect(invoice.totalWithoutVAT).toEqual(5 * 2000 + 2000 + 52300 + 52300);
|
|
100
|
+
expect(invoice.VATTotal.length).toEqual(2); // 2 rates
|
|
101
|
+
const VAT = Math.round(5 * 2000 * 21 / 100 / 100) * 100;
|
|
102
|
+
const excemptItem = invoice.VATTotal.find(d => d.VATExcempt);
|
|
103
|
+
const notExemptItem = invoice.VATTotal.find(d => !d.VATExcempt);
|
|
104
|
+
expect(excemptItem).not.toBeUndefined();
|
|
105
|
+
expect(notExemptItem).not.toBeUndefined();
|
|
106
|
+
expect(excemptItem === null || excemptItem === void 0 ? void 0 : excemptItem.VATPercentage).toEqual(0);
|
|
107
|
+
expect(excemptItem === null || excemptItem === void 0 ? void 0 : excemptItem.taxablePrice).toEqual(2000 + 52300 + 52300);
|
|
108
|
+
expect(excemptItem === null || excemptItem === void 0 ? void 0 : excemptItem.VAT).toEqual(0);
|
|
109
|
+
expect(notExemptItem === null || notExemptItem === void 0 ? void 0 : notExemptItem.VATPercentage).toEqual(21);
|
|
110
|
+
expect(notExemptItem === null || notExemptItem === void 0 ? void 0 : notExemptItem.taxablePrice).toEqual(5 * 2000);
|
|
111
|
+
expect(notExemptItem === null || notExemptItem === void 0 ? void 0 : notExemptItem.VAT).toEqual(VAT);
|
|
112
|
+
expect(invoice.VATTotalAmount).toEqual(VAT);
|
|
113
|
+
expect(invoice.totalWithVAT).toEqual(invoice.totalWithoutVAT + VAT);
|
|
114
|
+
// Check difference
|
|
115
|
+
// const balanceTotal = 5_23_00 + 5_23_00 + 20_00 + 5 * 20_00 * 121 / 100; // 118700
|
|
116
|
+
// -> round number, so should not introduce differences
|
|
117
|
+
expect(invoice.balanceRoundingAmount).toEqual(0);
|
|
118
|
+
});
|
|
119
|
+
test('Combination of multiple tax rates are grouped', () => {
|
|
120
|
+
const invoice = Invoice_js_1.Invoice.create({});
|
|
121
|
+
{
|
|
122
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
123
|
+
balanceItem.description = 'Test Item 1';
|
|
124
|
+
balanceItem.unitPrice = 2000; // 0,20 euro, excluding VAT
|
|
125
|
+
balanceItem.quantity = 1;
|
|
126
|
+
balanceItem.VATPercentage = 21;
|
|
127
|
+
balanceItem.VATIncluded = false;
|
|
128
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 2000 * 121 / 100);
|
|
129
|
+
invoice.addItem(item);
|
|
130
|
+
expect(item.totalWithoutVAT).toEqual(2000);
|
|
131
|
+
}
|
|
132
|
+
{
|
|
133
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
134
|
+
balanceItem.description = 'Test Item 1';
|
|
135
|
+
balanceItem.unitPrice = 2000; // 0,20 euro, excluding VAT
|
|
136
|
+
balanceItem.quantity = 1;
|
|
137
|
+
balanceItem.VATPercentage = 21;
|
|
138
|
+
balanceItem.VATIncluded = false;
|
|
139
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 2000 * 121 / 100);
|
|
140
|
+
invoice.addItem(item);
|
|
141
|
+
expect(item.totalWithoutVAT).toEqual(2000);
|
|
142
|
+
}
|
|
143
|
+
{
|
|
144
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
145
|
+
balanceItem.description = 'Another';
|
|
146
|
+
balanceItem.unitPrice = 2000;
|
|
147
|
+
balanceItem.quantity = 1;
|
|
148
|
+
balanceItem.VATPercentage = 6;
|
|
149
|
+
balanceItem.VATIncluded = false;
|
|
150
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 2000 * 106 / 100);
|
|
151
|
+
invoice.addItem(item);
|
|
152
|
+
expect(item.totalWithoutVAT).toEqual(2000);
|
|
153
|
+
}
|
|
154
|
+
{
|
|
155
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
156
|
+
balanceItem.description = 'Another';
|
|
157
|
+
balanceItem.unitPrice = 2000;
|
|
158
|
+
balanceItem.quantity = 1;
|
|
159
|
+
balanceItem.VATPercentage = 6;
|
|
160
|
+
balanceItem.VATIncluded = false;
|
|
161
|
+
const item = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 2000 * 106 / 100);
|
|
162
|
+
invoice.addItem(item);
|
|
163
|
+
expect(item.totalWithoutVAT).toEqual(2000);
|
|
164
|
+
}
|
|
165
|
+
// Check total price
|
|
166
|
+
expect(invoice.items.length).toEqual(4);
|
|
167
|
+
expect(invoice.totalWithoutVAT).toEqual(4 * 2000);
|
|
168
|
+
expect(invoice.VATTotal.length).toEqual(2); // 2 rates
|
|
169
|
+
const VAT1 = Math.round(2 * 2000 * 21 / 100 / 100) * 100;
|
|
170
|
+
const VAT2 = Math.round(2 * 2000 * 6 / 100 / 100) * 100;
|
|
171
|
+
const VAT = VAT1 + VAT2;
|
|
172
|
+
const item6 = invoice.VATTotal.find(d => d.VATPercentage === 6);
|
|
173
|
+
const item21 = invoice.VATTotal.find(d => d.VATPercentage === 21);
|
|
174
|
+
expect(item6).not.toBeUndefined();
|
|
175
|
+
expect(item21).not.toBeUndefined();
|
|
176
|
+
expect(item6 === null || item6 === void 0 ? void 0 : item6.VATPercentage).toEqual(6);
|
|
177
|
+
expect(item6 === null || item6 === void 0 ? void 0 : item6.taxablePrice).toEqual(4000);
|
|
178
|
+
expect(item6 === null || item6 === void 0 ? void 0 : item6.VAT).toEqual(VAT2);
|
|
179
|
+
expect(item21 === null || item21 === void 0 ? void 0 : item21.VATPercentage).toEqual(21);
|
|
180
|
+
expect(item21 === null || item21 === void 0 ? void 0 : item21.taxablePrice).toEqual(4000);
|
|
181
|
+
expect(item21 === null || item21 === void 0 ? void 0 : item21.VAT).toEqual(VAT1);
|
|
182
|
+
expect(invoice.VATTotalAmount).toEqual(VAT);
|
|
183
|
+
expect(invoice.totalWithVAT).toEqual(invoice.totalWithoutVAT + VAT);
|
|
184
|
+
// Check difference
|
|
185
|
+
expect(invoice.balanceRoundingAmount).toEqual(-80); // const balanceTotal = 20_00 * 106 / 100 + 20_00 * 106 / 100 + 20_00 * 121 / 100 + 20_00 * 121 / 100; // 9080
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
//# sourceMappingURL=Invoice.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Invoice.test.js","sourceRoot":"","sources":["../../../src/billing/Invoice.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { AutoEncoder } from '@simonbackx/simple-encoding';
|
|
|
2
2
|
import { BalanceItem, VATExcemptReason } from '../BalanceItem.js';
|
|
3
3
|
export declare class InvoicedBalanceItem extends AutoEncoder {
|
|
4
4
|
id: string;
|
|
5
|
+
balanceItemId: string;
|
|
5
6
|
name: string;
|
|
6
7
|
description: string;
|
|
7
8
|
/**
|
|
@@ -17,9 +18,9 @@ export declare class InvoicedBalanceItem extends AutoEncoder {
|
|
|
17
18
|
*/
|
|
18
19
|
balanceInvoicedAmount: number;
|
|
19
20
|
/**
|
|
20
|
-
* quantity per ten thousand
|
|
21
|
+
* quantity per ten thousand
|
|
21
22
|
* We need to support 4 decimals in case of partial payments.
|
|
22
|
-
* E.g.
|
|
23
|
+
* E.g. 10 euro of 30 euro was paid and is invoiced, then the amount would be 0.3333, stored as 3333
|
|
23
24
|
* Mostly for legal reasons, to be able to say wat was actually bought without faking an amount
|
|
24
25
|
*/
|
|
25
26
|
quantity: number;
|
|
@@ -51,7 +52,8 @@ export declare class InvoicedBalanceItem extends AutoEncoder {
|
|
|
51
52
|
* Creates a default configuration for a balance item that needs to be invoiced. The result can still be adjusted to correct rounding issues, because
|
|
52
53
|
* a balanace item cannot always be perfectly represented on an invoice (on an invoice rounding happens on invoice level, while balance items can have any price that is not really rounded at any time unless when paid).
|
|
53
54
|
*
|
|
54
|
-
*
|
|
55
|
+
* @param balanceItem
|
|
56
|
+
* @param amount paid (or to be paid) price, should always include VAT if there is VAT
|
|
55
57
|
*/
|
|
56
58
|
static createFor(balanceItem: BalanceItem, amount: number): InvoicedBalanceItem;
|
|
57
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvoicedBalanceItem.d.ts","sourceRoot":"","sources":["../../../src/billing/InvoicedBalanceItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqE,MAAM,6BAA6B,CAAC;AAE7H,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGlE,qBAAa,mBAAoB,SAAQ,WAAW;IAEhD,EAAE,EAAE,MAAM,CAAC;IAGX,IAAI,SAAM;IAGV,WAAW,SAAM;IAEjB;;;;;;;;;;OAUG;IAEH,qBAAqB,SAAK;IAE1B;;;;;OAKG;IAEH,QAAQ,SAAW;IAEnB;;;OAGG;IAEH,SAAS,SAAK;IAEd;;;OAGG;IAEH,aAAa,EAAE,MAAM,CAAK;IAE1B;;OAEG;IAEH,WAAW,UAAS;IAEpB;;;OAGG;IAEH,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAE3C;;;OAGG;IACH,IAAI,eAAe,WAElB;IAED
|
|
1
|
+
{"version":3,"file":"InvoicedBalanceItem.d.ts","sourceRoot":"","sources":["../../../src/billing/InvoicedBalanceItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqE,MAAM,6BAA6B,CAAC;AAE7H,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGlE,qBAAa,mBAAoB,SAAQ,WAAW;IAEhD,EAAE,EAAE,MAAM,CAAC;IAGX,aAAa,SAAM;IAGnB,IAAI,SAAM;IAGV,WAAW,SAAM;IAEjB;;;;;;;;;;OAUG;IAEH,qBAAqB,SAAK;IAE1B;;;;;OAKG;IAEH,QAAQ,SAAW;IAEnB;;;OAGG;IAEH,SAAS,SAAK;IAEd;;;OAGG;IAEH,aAAa,EAAE,MAAM,CAAK;IAE1B;;OAEG;IAEH,WAAW,UAAS;IAEpB;;;OAGG;IAEH,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAE3C;;;OAGG;IACH,IAAI,eAAe,WAElB;IAED;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM;CA2C5D"}
|
|
@@ -9,6 +9,7 @@ const simple_errors_1 = require("@simonbackx/simple-errors");
|
|
|
9
9
|
class InvoicedBalanceItem extends simple_encoding_1.AutoEncoder {
|
|
10
10
|
constructor() {
|
|
11
11
|
super(...arguments);
|
|
12
|
+
this.balanceItemId = '';
|
|
12
13
|
this.name = '';
|
|
13
14
|
this.description = '';
|
|
14
15
|
/**
|
|
@@ -22,11 +23,11 @@ class InvoicedBalanceItem extends simple_encoding_1.AutoEncoder {
|
|
|
22
23
|
*
|
|
23
24
|
* Any rounding issues are fixed on the invoice level.
|
|
24
25
|
*/
|
|
25
|
-
this.balanceInvoicedAmount =
|
|
26
|
+
this.balanceInvoicedAmount = 0;
|
|
26
27
|
/**
|
|
27
|
-
* quantity per ten thousand
|
|
28
|
+
* quantity per ten thousand
|
|
28
29
|
* We need to support 4 decimals in case of partial payments.
|
|
29
|
-
* E.g.
|
|
30
|
+
* E.g. 10 euro of 30 euro was paid and is invoiced, then the amount would be 0.3333, stored as 3333
|
|
30
31
|
* Mostly for legal reasons, to be able to say wat was actually bought without faking an amount
|
|
31
32
|
*/
|
|
32
33
|
this.quantity = 10000;
|
|
@@ -61,7 +62,8 @@ class InvoicedBalanceItem extends simple_encoding_1.AutoEncoder {
|
|
|
61
62
|
* Creates a default configuration for a balance item that needs to be invoiced. The result can still be adjusted to correct rounding issues, because
|
|
62
63
|
* a balanace item cannot always be perfectly represented on an invoice (on an invoice rounding happens on invoice level, while balance items can have any price that is not really rounded at any time unless when paid).
|
|
63
64
|
*
|
|
64
|
-
*
|
|
65
|
+
* @param balanceItem
|
|
66
|
+
* @param amount paid (or to be paid) price, should always include VAT if there is VAT
|
|
65
67
|
*/
|
|
66
68
|
static createFor(balanceItem, amount) {
|
|
67
69
|
var _a;
|
|
@@ -73,6 +75,7 @@ class InvoicedBalanceItem extends simple_encoding_1.AutoEncoder {
|
|
|
73
75
|
});
|
|
74
76
|
}
|
|
75
77
|
const item = new InvoicedBalanceItem();
|
|
78
|
+
item.balanceItemId = balanceItem.id;
|
|
76
79
|
item.name = balanceItem.itemTitle;
|
|
77
80
|
item.description = (_a = balanceItem.itemDescription) !== null && _a !== void 0 ? _a : '';
|
|
78
81
|
item.balanceInvoicedAmount = amount;
|
|
@@ -95,8 +98,11 @@ class InvoicedBalanceItem extends simple_encoding_1.AutoEncoder {
|
|
|
95
98
|
if (!balanceItem.VATExcempt) {
|
|
96
99
|
item.unitPrice = item.unitPrice * 100 / (100 + balanceItem.VATPercentage);
|
|
97
100
|
}
|
|
98
|
-
//
|
|
99
|
-
|
|
101
|
+
// Rounding the unit price is not a peppol requirement normally,
|
|
102
|
+
// so this is disabled for now. Rounding will happen on line level though
|
|
103
|
+
// item.unitPrice = Math.round(item.unitPrice / 100) * 100;
|
|
104
|
+
// round as integer instead (0.0001):
|
|
105
|
+
item.unitPrice = Math.round(item.unitPrice);
|
|
100
106
|
return item;
|
|
101
107
|
}
|
|
102
108
|
}
|
|
@@ -104,6 +110,9 @@ exports.InvoicedBalanceItem = InvoicedBalanceItem;
|
|
|
104
110
|
tslib_1.__decorate([
|
|
105
111
|
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.StringDecoder, defaultValue: () => (0, uuid_1.v4)() })
|
|
106
112
|
], InvoicedBalanceItem.prototype, "id", void 0);
|
|
113
|
+
tslib_1.__decorate([
|
|
114
|
+
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.StringDecoder })
|
|
115
|
+
], InvoicedBalanceItem.prototype, "balanceItemId", void 0);
|
|
107
116
|
tslib_1.__decorate([
|
|
108
117
|
(0, simple_encoding_1.field)({ decoder: simple_encoding_1.StringDecoder })
|
|
109
118
|
], InvoicedBalanceItem.prototype, "name", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvoicedBalanceItem.js","sourceRoot":"","sources":["../../../src/billing/InvoicedBalanceItem.ts"],"names":[],"mappings":";;;;AAAA,iEAA6H;AAC7H,+BAAoC;AACpC,sDAAkE;AAClE,6DAAwD;AAExD,MAAa,mBAAoB,SAAQ,6BAAW;IAApD;;QAKI,SAAI,GAAG,EAAE,CAAC;QAGV,gBAAW,GAAG,EAAE,CAAC;QAEjB;;;;;;;;;;WAUG;QAEH,0BAAqB,GAAG,CAAC,CAAC;QAE1B;;;;;WAKG;QAEH,aAAQ,GAAG,KAAO,CAAC;QAEnB;;;WAGG;QAEH,cAAS,GAAG,CAAC,CAAC;QAEd;;;WAGG;QAEH,kBAAa,GAAW,CAAC,CAAC;QAE1B;;WAEG;QAEH,gBAAW,GAAG,KAAK,CAAC;QAEpB;;;WAGG;QAEH,eAAU,GAA4B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"InvoicedBalanceItem.js","sourceRoot":"","sources":["../../../src/billing/InvoicedBalanceItem.ts"],"names":[],"mappings":";;;;AAAA,iEAA6H;AAC7H,+BAAoC;AACpC,sDAAkE;AAClE,6DAAwD;AAExD,MAAa,mBAAoB,SAAQ,6BAAW;IAApD;;QAKI,kBAAa,GAAG,EAAE,CAAC;QAGnB,SAAI,GAAG,EAAE,CAAC;QAGV,gBAAW,GAAG,EAAE,CAAC;QAEjB;;;;;;;;;;WAUG;QAEH,0BAAqB,GAAG,CAAC,CAAC;QAE1B;;;;;WAKG;QAEH,aAAQ,GAAG,KAAO,CAAC;QAEnB;;;WAGG;QAEH,cAAS,GAAG,CAAC,CAAC;QAEd;;;WAGG;QAEH,kBAAa,GAAW,CAAC,CAAC;QAE1B;;WAEG;QAEH,gBAAW,GAAG,KAAK,CAAC;QAEpB;;;WAGG;QAEH,eAAU,GAA4B,IAAI,CAAC;IA4D/C,CAAC;IA1DG;;;OAGG;IACH,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,OAAU,CAAC,GAAG,GAAG,CAAC;IACzE,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,CAAC,WAAwB,EAAE,MAAc;;QACrD,IAAI,WAAW,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,2BAAW,CAAC;gBAClB,OAAO,EAAE,2EAA2E;gBACpF,KAAK,EAAE,EAAE,CAAC,sCAAsC,CAAC;gBACjD,IAAI,EAAE,qCAAqC;aAC9C,CAAC,CAAC;QACP,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,MAAA,WAAW,CAAC,eAAe,mCAAI,EAAE,CAAC;QACrD,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,aAAa,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;QAE3C,kCAAkC;QAClC,MAAM,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChG,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,GAAG,KAAO,GAAG,2BAA2B,CAAC,CAAC,CAAC,0BAA0B;QAC3H,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,2BAAW,CAAC;gBAClB,OAAO,EAAE,+DAA+D;gBACxE,KAAK,EAAE,EAAE,CAAC,sCAAsC,CAAC;gBACjD,IAAI,EAAE,yBAAyB;aAClC,CAAC,CAAC;QACP,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,KAAO,GAAG,QAAQ,CAAC;QAE7C,uCAAuC;QACvC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;QAC9E,CAAC;QAED,gEAAgE;QAChE,yEAAyE;QACzE,2DAA2D;QAC3D,qCAAqC;QACrC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE5C,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAzHD,kDAyHC;AAvHG;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,+BAAa,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,SAAM,GAAE,EAAE,CAAC;+CACrD;AAGX;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,+BAAa,EAAE,CAAC;0DACf;AAGnB;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,+BAAa,EAAE,CAAC;iDACxB;AAGV;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,+BAAa,EAAE,CAAC;wDACjB;AAcjB;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,gCAAc,EAAE,CAAC;kEACT;AAS1B;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,gCAAc,EAAE,CAAC;qDAChB;AAOnB;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,gCAAc,EAAE,CAAC;sDACrB;AAOd;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,gCAAc,EAAE,CAAC;0DACT;AAM1B;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,gCAAc,EAAE,CAAC;wDACf;AAOpB;IADC,IAAA,uBAAK,EAAC,EAAE,OAAO,EAAE,IAAI,6BAAW,CAAC,iCAAgB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;uDAC3B"}
|
|
@@ -18,11 +18,11 @@ describe('InvoicedBalanceItem', () => {
|
|
|
18
18
|
const invoicedItem = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 50000);
|
|
19
19
|
expect(invoicedItem.balanceInvoicedAmount).toBe(50000);
|
|
20
20
|
expect(invoicedItem.quantity).toBe(10000);
|
|
21
|
-
expect(invoicedItem.unitPrice).toBe(
|
|
21
|
+
expect(invoicedItem.unitPrice).toBe(41322); // should not be rounded to 1 cent
|
|
22
22
|
expect(invoicedItem.VATPercentage).toBe(21);
|
|
23
23
|
expect(invoicedItem.VATIncluded).toBe(true);
|
|
24
24
|
expect(invoicedItem.VATExcempt).toBeNull();
|
|
25
|
-
expect(invoicedItem.totalWithoutVAT).toBe(41300);
|
|
25
|
+
expect(invoicedItem.totalWithoutVAT).toBe(41300); // rounded
|
|
26
26
|
});
|
|
27
27
|
test('Create an invoice item for a balance item including VAT with quantity of 3', () => {
|
|
28
28
|
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
@@ -39,55 +39,55 @@ describe('InvoicedBalanceItem', () => {
|
|
|
39
39
|
const invoicedItem = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 50000);
|
|
40
40
|
expect(invoicedItem.balanceInvoicedAmount).toBe(50000);
|
|
41
41
|
expect(invoicedItem.quantity).toBe(10000);
|
|
42
|
-
expect(invoicedItem.unitPrice).toBe(
|
|
42
|
+
expect(invoicedItem.unitPrice).toBe(41322); // not rounded
|
|
43
43
|
expect(invoicedItem.VATPercentage).toBe(21);
|
|
44
44
|
expect(invoicedItem.VATIncluded).toBe(true);
|
|
45
45
|
expect(invoicedItem.VATExcempt).toBeNull();
|
|
46
|
-
expect(invoicedItem.totalWithoutVAT).toBe(41300);
|
|
46
|
+
expect(invoicedItem.totalWithoutVAT).toBe(41300); // rounded
|
|
47
47
|
}
|
|
48
48
|
// Create an invoiced balance item for two items
|
|
49
49
|
{
|
|
50
50
|
const invoicedItem = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 100000);
|
|
51
51
|
expect(invoicedItem.balanceInvoicedAmount).toBe(100000);
|
|
52
52
|
expect(invoicedItem.quantity).toBe(20000);
|
|
53
|
-
expect(invoicedItem.unitPrice).toBe(
|
|
53
|
+
expect(invoicedItem.unitPrice).toBe(41322); // not rounded
|
|
54
54
|
expect(invoicedItem.VATPercentage).toBe(21);
|
|
55
55
|
expect(invoicedItem.VATIncluded).toBe(true);
|
|
56
56
|
expect(invoicedItem.VATExcempt).toBeNull();
|
|
57
|
-
expect(invoicedItem.totalWithoutVAT).toBe(82600);
|
|
57
|
+
expect(invoicedItem.totalWithoutVAT).toBe(82600); // rounded
|
|
58
58
|
}
|
|
59
59
|
// Create an invoiced balance item for three items
|
|
60
60
|
{
|
|
61
61
|
const invoicedItem = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 150000);
|
|
62
62
|
expect(invoicedItem.balanceInvoicedAmount).toBe(150000);
|
|
63
63
|
expect(invoicedItem.quantity).toBe(30000);
|
|
64
|
-
expect(invoicedItem.unitPrice).toBe(
|
|
64
|
+
expect(invoicedItem.unitPrice).toBe(41322); // not rounded
|
|
65
65
|
expect(invoicedItem.VATPercentage).toBe(21);
|
|
66
66
|
expect(invoicedItem.VATIncluded).toBe(true);
|
|
67
67
|
expect(invoicedItem.VATExcempt).toBeNull();
|
|
68
|
-
expect(invoicedItem.totalWithoutVAT).toBe(
|
|
68
|
+
expect(invoicedItem.totalWithoutVAT).toBe(124000); // rounded
|
|
69
69
|
}
|
|
70
70
|
// Create an invoiced balance item for half an item
|
|
71
71
|
{
|
|
72
72
|
const invoicedItem = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 25000);
|
|
73
73
|
expect(invoicedItem.balanceInvoicedAmount).toBe(25000);
|
|
74
74
|
expect(invoicedItem.quantity).toBe(5000); // 50% of an item
|
|
75
|
-
expect(invoicedItem.unitPrice).toBe(
|
|
75
|
+
expect(invoicedItem.unitPrice).toBe(41322); // not rounded
|
|
76
76
|
expect(invoicedItem.VATPercentage).toBe(21);
|
|
77
77
|
expect(invoicedItem.VATIncluded).toBe(true);
|
|
78
78
|
expect(invoicedItem.VATExcempt).toBeNull();
|
|
79
|
-
expect(invoicedItem.totalWithoutVAT).toBe(20700);
|
|
79
|
+
expect(invoicedItem.totalWithoutVAT).toBe(20700); // rounded
|
|
80
80
|
}
|
|
81
81
|
// Create an invoiced balance item for 1/3 of an item
|
|
82
82
|
{
|
|
83
83
|
const invoicedItem = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 16666);
|
|
84
84
|
expect(invoicedItem.balanceInvoicedAmount).toBe(16666);
|
|
85
85
|
expect(invoicedItem.quantity).toBe(3333); // 33.33% of an item
|
|
86
|
-
expect(invoicedItem.unitPrice).toBe(
|
|
86
|
+
expect(invoicedItem.unitPrice).toBe(41325); // difference caused by rounding of quantity
|
|
87
87
|
expect(invoicedItem.VATPercentage).toBe(21);
|
|
88
88
|
expect(invoicedItem.VATIncluded).toBe(true);
|
|
89
89
|
expect(invoicedItem.VATExcempt).toBeNull();
|
|
90
|
-
expect(invoicedItem.totalWithoutVAT).toBe(13800);
|
|
90
|
+
expect(invoicedItem.totalWithoutVAT).toBe(13800); // rounded
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
93
|
test('Create an invoice item for a balance item excluding VAT with quantity of 1', () => {
|
|
@@ -190,6 +190,25 @@ describe('InvoicedBalanceItem', () => {
|
|
|
190
190
|
expect(invoicedItem.VATExcempt).toBe(BalanceItem_js_1.VATExcemptReason.IntraCommunity);
|
|
191
191
|
expect(invoicedItem.totalWithoutVAT).toBe(2000);
|
|
192
192
|
});
|
|
193
|
+
test('Paying 1/3 of a balance item causes 33.33% quantity', () => {
|
|
194
|
+
const balanceItem = new BalanceItem_js_1.BalanceItem();
|
|
195
|
+
balanceItem.description = 'Test Item';
|
|
196
|
+
balanceItem.unitPrice = 3000; // = 0,30 euro
|
|
197
|
+
balanceItem.quantity = 1;
|
|
198
|
+
balanceItem.VATPercentage = 21;
|
|
199
|
+
balanceItem.VATIncluded = false;
|
|
200
|
+
balanceItem.VATExcempt = BalanceItem_js_1.VATExcemptReason.IntraCommunity;
|
|
201
|
+
expect(balanceItem.priceWithVAT).toBe(3000);
|
|
202
|
+
expect(balanceItem.priceWithoutVAT).toBe(3000);
|
|
203
|
+
const invoicedItem = InvoicedBalanceItem_js_1.InvoicedBalanceItem.createFor(balanceItem, 1000);
|
|
204
|
+
expect(invoicedItem.balanceInvoicedAmount).toBe(1000);
|
|
205
|
+
expect(invoicedItem.quantity).toBe(3333);
|
|
206
|
+
expect(invoicedItem.unitPrice).toBe(3000); // = 0,30 euro
|
|
207
|
+
expect(invoicedItem.VATPercentage).toBe(21);
|
|
208
|
+
expect(invoicedItem.VATIncluded).toBe(false);
|
|
209
|
+
expect(invoicedItem.VATExcempt).toBe(BalanceItem_js_1.VATExcemptReason.IntraCommunity);
|
|
210
|
+
expect(invoicedItem.totalWithoutVAT).toBe(1000); // rounded
|
|
211
|
+
});
|
|
193
212
|
});
|
|
194
213
|
});
|
|
195
214
|
//# sourceMappingURL=InvoicedBalanceItem.test.js.map
|