@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.
Files changed (45) hide show
  1. package/dist/src/billing/Invoice.d.ts +8 -2
  2. package/dist/src/billing/Invoice.d.ts.map +1 -1
  3. package/dist/src/billing/Invoice.js +44 -9
  4. package/dist/src/billing/Invoice.js.map +1 -1
  5. package/dist/src/billing/Invoice.test.d.ts +2 -0
  6. package/dist/src/billing/Invoice.test.d.ts.map +1 -0
  7. package/dist/src/billing/Invoice.test.js +188 -0
  8. package/dist/src/billing/Invoice.test.js.map +1 -0
  9. package/dist/src/billing/InvoicedBalanceItem.d.ts +5 -3
  10. package/dist/src/billing/InvoicedBalanceItem.d.ts.map +1 -1
  11. package/dist/src/billing/InvoicedBalanceItem.js +15 -6
  12. package/dist/src/billing/InvoicedBalanceItem.js.map +1 -1
  13. package/dist/src/billing/InvoicedBalanceItem.test.js +31 -12
  14. package/dist/src/billing/InvoicedBalanceItem.test.js.map +1 -1
  15. package/dist/src/filters/PropertyFilter.d.ts +1 -0
  16. package/dist/src/filters/PropertyFilter.d.ts.map +1 -1
  17. package/dist/src/filters/PropertyFilter.js +97 -0
  18. package/dist/src/filters/PropertyFilter.js.map +1 -1
  19. package/dist/src/members/OrganizationRecordsConfiguration.d.ts.map +1 -1
  20. package/dist/src/members/OrganizationRecordsConfiguration.js +54 -9
  21. package/dist/src/members/OrganizationRecordsConfiguration.js.map +1 -1
  22. package/dist/src/members/PlatformMember.d.ts +4 -0
  23. package/dist/src/members/PlatformMember.d.ts.map +1 -1
  24. package/dist/src/members/PlatformMember.js +26 -2
  25. package/dist/src/members/PlatformMember.js.map +1 -1
  26. package/esm/dist/src/billing/Invoice.d.ts +8 -2
  27. package/esm/dist/src/billing/Invoice.d.ts.map +1 -1
  28. package/esm/dist/src/billing/Invoice.js +45 -10
  29. package/esm/dist/src/billing/Invoice.js.map +1 -1
  30. package/esm/dist/src/billing/InvoicedBalanceItem.d.ts +5 -3
  31. package/esm/dist/src/billing/InvoicedBalanceItem.d.ts.map +1 -1
  32. package/esm/dist/src/billing/InvoicedBalanceItem.js +15 -6
  33. package/esm/dist/src/billing/InvoicedBalanceItem.js.map +1 -1
  34. package/esm/dist/src/filters/PropertyFilter.d.ts +1 -0
  35. package/esm/dist/src/filters/PropertyFilter.d.ts.map +1 -1
  36. package/esm/dist/src/filters/PropertyFilter.js +98 -1
  37. package/esm/dist/src/filters/PropertyFilter.js.map +1 -1
  38. package/esm/dist/src/members/OrganizationRecordsConfiguration.d.ts.map +1 -1
  39. package/esm/dist/src/members/OrganizationRecordsConfiguration.js +54 -9
  40. package/esm/dist/src/members/OrganizationRecordsConfiguration.js.map +1 -1
  41. package/esm/dist/src/members/PlatformMember.d.ts +4 -0
  42. package/esm/dist/src/members/PlatformMember.d.ts.map +1 -1
  43. package/esm/dist/src/members/PlatformMember.js +26 -2
  44. package/esm/dist/src/members/PlatformMember.js.map +1 -1
  45. 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
- * In case this is null, VATExcempt should be set to explain why there is no VAT
9
+ * For tax ecempt items, this should be zero but it is ignored anyway
10
10
  */
11
- VATPercentage: number | null;
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,EAAqD,MAAM,6BAA6B,CAAC;AAE3H,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,GAAG,IAAI,CAAQ;IAGpC,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;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC;;;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;;;;;OAKG;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;IAExB,YAAY;CAmCf"}
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
- * In case this is null, VATExcempt should be set to explain why there is no VAT
16
+ * For tax ecempt items, this should be zero but it is ignored anyway
17
17
  */
18
- this.VATPercentage = null;
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, nullable: true })
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.VATPercentage !== null) {
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.VATPercentage !== null) {
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: Company_js_1.Company })
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":"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"}
1
+ {"version":3,"file":"Invoice.js","sourceRoot":"","sources":["../../../src/billing/Invoice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Invoice.test.d.ts.map
@@ -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":";;AAAA,sDAAkE;AAClE,6CAAuC;AACvC,qEAA+D;AAE/D,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,OAAO,GAAG,oBAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEnC,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;YACxC,WAAW,CAAC,SAAS,GAAG,IAAK,CAAC,CAAC,2BAA2B;YAC1D,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;YAC/B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAEhC,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,IAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAC/E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAK,CAAC,CAAC;QACpD,CAAC;QAED,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;YACxC,WAAW,CAAC,SAAS,GAAG,IAAK,CAAC,CAAC,2BAA2B;YAC1D,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;YAC/B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAEhC,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,IAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;QAChD,CAAC;QAED,oBAAoB;QACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAK,GAAG,IAAK,CAAC,CAAC;QAE3D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAK,GAAG,IAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAK,GAAG,IAAK,CAAC,CAAC;QACpE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAK,GAAG,IAAK,GAAG,GAAG,CAAC,CAAC;QAE9D,mBAAmB;QACnB,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,IAAK,GAAG,GAAG,GAAG,GAAG,GAAG,IAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU;QAC5E,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;QACvD,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,4DAA4D;QAC7F,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qGAAqG,EAAE,GAAG,EAAE;QAC7G,MAAM,OAAO,GAAG,oBAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEnC,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;YACxC,WAAW,CAAC,SAAS,GAAG,IAAK,CAAC,CAAC,2BAA2B;YAC1D,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;YAC/B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAEhC,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,IAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAC/E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAK,CAAC,CAAC;QACpD,CAAC;QAED,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,iBAAiB,CAAC;YAC5C,WAAW,CAAC,SAAS,GAAG,IAAK,CAAC;YAC9B,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;YAC/B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAChC,WAAW,CAAC,UAAU,GAAG,iCAAgB,CAAC,cAAc,CAAC;YAEzD,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,IAAK,CAAC,CAAC;YAC/D,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;QAChD,CAAC;QAED,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,iBAAiB,CAAC;YAC5C,WAAW,CAAC,SAAS,GAAG,KAAO,CAAC;YAChC,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,CAAC,CAAC;YAC9B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAChC,WAAW,CAAC,UAAU,GAAG,iCAAgB,CAAC,cAAc,CAAC;YAEzD,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,KAAO,CAAC,CAAC;YACjE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,KAAO,CAAC,CAAC;QAClD,CAAC;QAED,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,iBAAiB,CAAC;YAC5C,WAAW,CAAC,SAAS,GAAG,KAAO,CAAC;YAChC,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;YAC/B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAChC,WAAW,CAAC,UAAU,GAAG,iCAAgB,CAAC,cAAc,CAAC;YAEzD,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,KAAO,CAAC,CAAC;YACjE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,KAAO,CAAC,CAAC;QAClD,CAAC;QAED,oBAAoB;QACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAK,GAAG,IAAK,GAAG,KAAO,GAAG,KAAO,CAAC,CAAC;QAE/E,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAK,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAEzD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAEhE,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAE1C,MAAM,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,YAAY,CAAC,CAAC,OAAO,CAAC,IAAK,GAAG,KAAO,GAAG,KAAO,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEpC,MAAM,CAAC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAK,CAAC,CAAC;QACvD,MAAM,CAAC,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAExC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;QAEpE,mBAAmB;QACnB,oFAAoF;QACpF,uDAAuD;QACvD,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,OAAO,GAAG,oBAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEnC,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;YACxC,WAAW,CAAC,SAAS,GAAG,IAAK,CAAC,CAAC,2BAA2B;YAC1D,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;YAC/B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAEhC,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,IAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;QAChD,CAAC;QAED,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;YACxC,WAAW,CAAC,SAAS,GAAG,IAAK,CAAC,CAAC,2BAA2B;YAC1D,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;YAC/B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAEhC,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,IAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;QAChD,CAAC;QAED,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,SAAS,CAAC;YACpC,WAAW,CAAC,SAAS,GAAG,IAAK,CAAC;YAC9B,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,CAAC,CAAC;YAC9B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAEhC,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,IAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;QAChD,CAAC;QAED,CAAC;YACG,MAAM,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,SAAS,CAAC;YACpC,WAAW,CAAC,SAAS,GAAG,IAAK,CAAC;YAC9B,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;YACzB,WAAW,CAAC,aAAa,GAAG,CAAC,CAAC;YAC9B,WAAW,CAAC,WAAW,GAAG,KAAK,CAAC;YAEhC,MAAM,IAAI,GAAG,4CAAmB,CAAC,SAAS,CAAC,WAAW,EAAE,IAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;YAC3E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;QAChD,CAAC;QAED,oBAAoB;QACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,IAAK,CAAC,CAAC;QAEnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAK,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAK,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;QAExB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;QAElE,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEnC,MAAM,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,YAAY,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjC,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,CAAC,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAElC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;QAEpE,mBAAmB;QACnB,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,8GAA8G;IACtK,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -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. 3.33 euro of 10 euro was paid and is invoiced, then the amount would be 0.3333, stored as 3333
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
- * amount = paid (or to be paid) price, including VAT if there is VAT
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;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM;CAsC5D"}
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 = 1;
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. 3.33 euro of 10 euro was paid and is invoiced, then the amount would be 0.3333, stored as 3333
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
- * amount = paid (or to be paid) price, including VAT if there is VAT
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
- // Round unitPrice to 1 cent (= PEPPOL requirement)
99
- item.unitPrice = Math.round(item.unitPrice / 100) * 100;
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":"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"}
1
+ {"version":3,"file":"InvoicedBalanceItem.js","sourceRoot":"","sources":["../../../src/billing/InvoicedBalanceItem.ts"],"names":[],"mappings":"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"}
@@ -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(41300); // should be rounded to 1 cent
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(41300); // should be rounded to 1 cent
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(41300); // should be rounded to 1 cent
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(41300); // should be rounded to 1 cent
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(123900);
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(41300); // should be rounded to 1 cent
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(41300); // should be rounded to 1 cent
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