@stamhoofd/models 2.61.1 → 2.63.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 (49) hide show
  1. package/dist/src/helpers/WebshopCounter.d.ts +4 -2
  2. package/dist/src/helpers/WebshopCounter.d.ts.map +1 -1
  3. package/dist/src/helpers/WebshopCounter.js +18 -6
  4. package/dist/src/helpers/WebshopCounter.js.map +1 -1
  5. package/dist/src/migrations/1733909398-balance-items-due-at.sql +2 -0
  6. package/dist/src/migrations/1733909399-recalculate-at.sql +3 -0
  7. package/dist/src/migrations/1733994454-balance-item-price-open.sql +2 -0
  8. package/dist/src/migrations/1734084689-payment-type.sql +2 -0
  9. package/dist/src/migrations/1734084690-move-payment-column-order.sql +2 -0
  10. package/dist/src/migrations/1734084691-fill-payment-type-refunds.sql +1 -0
  11. package/dist/src/migrations/1734084692-fill-payment-type-reallocations.sql +15 -0
  12. package/dist/src/models/BalanceItem.d.ts +17 -4
  13. package/dist/src/models/BalanceItem.d.ts.map +1 -1
  14. package/dist/src/models/BalanceItem.js +59 -59
  15. package/dist/src/models/BalanceItem.js.map +1 -1
  16. package/dist/src/models/CachedBalance.d.ts +7 -0
  17. package/dist/src/models/CachedBalance.d.ts.map +1 -1
  18. package/dist/src/models/CachedBalance.js +70 -7
  19. package/dist/src/models/CachedBalance.js.map +1 -1
  20. package/dist/src/models/DocumentTemplate.js +1 -1
  21. package/dist/src/models/DocumentTemplate.js.map +1 -1
  22. package/dist/src/models/Order.d.ts +1 -0
  23. package/dist/src/models/Order.d.ts.map +1 -1
  24. package/dist/src/models/Order.js +7 -1
  25. package/dist/src/models/Order.js.map +1 -1
  26. package/dist/src/models/Payment.d.ts +11 -1
  27. package/dist/src/models/Payment.d.ts.map +1 -1
  28. package/dist/src/models/Payment.js +13 -0
  29. package/dist/src/models/Payment.js.map +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +2 -2
  32. package/src/helpers/WebshopCounter.ts +22 -6
  33. package/src/migrations/1733909398-balance-items-due-at.sql +2 -0
  34. package/src/migrations/1733909399-recalculate-at.sql +3 -0
  35. package/src/migrations/1733994454-balance-item-price-open.sql +2 -0
  36. package/src/migrations/1734084689-payment-type.sql +2 -0
  37. package/src/migrations/1734084690-move-payment-column-order.sql +2 -0
  38. package/src/migrations/1734084691-fill-payment-type-refunds.sql +1 -0
  39. package/src/migrations/1734084692-fill-payment-type-reallocations.sql +15 -0
  40. package/src/models/BalanceItem.ts +61 -70
  41. package/src/models/CachedBalance.ts +105 -30
  42. package/src/models/DocumentTemplate.ts +1 -1
  43. package/src/models/Order.ts +8 -1
  44. package/src/models/Payment.ts +13 -1
  45. package/dist/src/helpers/WebshopCounter.test.d.ts +0 -2
  46. package/dist/src/helpers/WebshopCounter.test.d.ts.map +0 -1
  47. package/dist/src/helpers/WebshopCounter.test.js +0 -17
  48. package/dist/src/helpers/WebshopCounter.test.js.map +0 -1
  49. package/src/helpers/WebshopCounter.test.ts +0 -16
@@ -1,6 +1,8 @@
1
- import { WebshopNumberingType } from '@stamhoofd/structures';
1
+ import { Webshop } from '../models';
2
2
  export declare class WebshopCounter {
3
3
  static numberCache: Map<string, number>;
4
- static getNextNumber(webshopId: string, numberingType: WebshopNumberingType): Promise<number>;
4
+ static getNextNumber(webshop: Webshop): Promise<number>;
5
+ static resetNumbers(webshopId: string): Promise<void>;
6
+ static clearAll(): void;
5
7
  }
6
8
  //# sourceMappingURL=WebshopCounter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebshopCounter.d.ts","sourceRoot":"","sources":["../../../src/helpers/WebshopCounter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,qBAAa,cAAc;IACvB,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;WAEvC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;CA6BtG"}
1
+ {"version":3,"file":"WebshopCounter.d.ts","sourceRoot":"","sources":["../../../src/helpers/WebshopCounter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,qBAAa,cAAc;IACvB,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;WAEvC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;WA+BhD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3D,MAAM,CAAC,QAAQ;CAGlB"}
@@ -6,10 +6,11 @@ const queues_1 = require("@stamhoofd/queues");
6
6
  const structures_1 = require("@stamhoofd/structures");
7
7
  class WebshopCounter {
8
8
  static numberCache = new Map();
9
- static async getNextNumber(webshopId, numberingType) {
10
- if (numberingType == structures_1.WebshopNumberingType.Random) {
11
- return Math.floor(Math.random() * 1000000000);
9
+ static async getNextNumber(webshop) {
10
+ if (webshop.privateMeta.numberingType == structures_1.WebshopNumberingType.Random) {
11
+ return Math.floor(Math.random() * 1000000000) + 100000000;
12
12
  }
13
+ const webshopId = webshop.id;
13
14
  // Prevent race conditions: create a queue
14
15
  // The queue can only run one at a time for the same webshop (so multiple webshops at the same time are allowed)
15
16
  return await queues_1.QueueHandler.schedule('webshop/numbers-' + webshopId, async () => {
@@ -18,19 +19,30 @@ class WebshopCounter {
18
19
  this.numberCache.set(webshopId, nextNumber + 1);
19
20
  return nextNumber;
20
21
  }
21
- const [rows] = await simple_database_1.Database.select(`select max(number) as previousNumber from webshop_orders where webshopId = ?`, [webshopId]);
22
+ const [rows] = await simple_database_1.Database.select(`select max(number) as previousNumber from webshop_orders where webshopId = ? AND number < 100000000`, [webshopId]);
22
23
  let nextNumber;
23
24
  if (rows.length == 0) {
24
- nextNumber = 1;
25
+ nextNumber = webshop.privateMeta.startNumber ?? 1;
25
26
  }
26
27
  else {
27
28
  const previousNumber = rows[0]['']['previousNumber'];
28
- nextNumber = (previousNumber ?? 0) + 1;
29
+ nextNumber = (previousNumber ?? ((webshop.privateMeta.startNumber ?? 1) - 1)) + 1;
29
30
  }
30
31
  this.numberCache.set(webshopId, nextNumber + 1);
31
32
  return nextNumber;
32
33
  });
33
34
  }
35
+ static async resetNumbers(webshopId) {
36
+ // Prevent race conditions: create a queue
37
+ // The queue can only run one at a time for the same webshop (so multiple webshops at the same time are allowed)
38
+ return await queues_1.QueueHandler.schedule('webshop/numbers-' + webshopId, async () => {
39
+ this.numberCache.delete(webshopId);
40
+ return Promise.resolve();
41
+ });
42
+ }
43
+ static clearAll() {
44
+ this.numberCache.clear();
45
+ }
34
46
  }
35
47
  exports.WebshopCounter = WebshopCounter;
36
48
  //# sourceMappingURL=WebshopCounter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebshopCounter.js","sourceRoot":"","sources":["../../../src/helpers/WebshopCounter.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;AACvD,8CAAiD;AACjD,sDAA6D;AAE7D,MAAa,cAAc;IACvB,MAAM,CAAC,WAAW,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEpD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,aAAmC;QAC7E,IAAI,aAAa,IAAI,iCAAoB,CAAC,MAAM,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC;QAClD,CAAC;QAED,0CAA0C;QAC1C,gHAAgH;QAChH,OAAO,MAAM,qBAAY,CAAC,QAAQ,CAAC,kBAAkB,GAAG,SAAS,EAAE,KAAK,IAAI,EAAE;YAC1E,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;gBAChD,OAAO,UAAU,CAAC;YACtB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,0BAAQ,CAAC,MAAM,CAAC,8EAA8E,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YAClI,IAAI,UAA8B,CAAC;YAEnC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACnB,UAAU,GAAG,CAAC,CAAC;YACnB,CAAC;iBACI,CAAC;gBACF,MAAM,cAAc,GAAkB,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAkB,CAAC;gBACrF,UAAU,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC;QACtB,CAAC,CAAC,CAAC;IACP,CAAC;;AA/BL,wCAgCC"}
1
+ {"version":3,"file":"WebshopCounter.js","sourceRoot":"","sources":["../../../src/helpers/WebshopCounter.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;AACvD,8CAAiD;AACjD,sDAA6D;AAI7D,MAAa,cAAc;IACvB,MAAM,CAAC,WAAW,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEpD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAgB;QACvC,IAAI,OAAO,CAAC,WAAW,CAAC,aAAa,IAAI,iCAAoB,CAAC,MAAM,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC;QAC9D,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAE7B,0CAA0C;QAC1C,gHAAgH;QAChH,OAAO,MAAM,qBAAY,CAAC,QAAQ,CAAC,kBAAkB,GAAG,SAAS,EAAE,KAAK,IAAI,EAAE;YAC1E,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;gBACpD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;gBAChD,OAAO,UAAU,CAAC;YACtB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,0BAAQ,CAAC,MAAM,CAAC,qGAAqG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YACzJ,IAAI,UAA8B,CAAC;YAEnC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACnB,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;YACtD,CAAC;iBACI,CAAC;gBACF,MAAM,cAAc,GAAkB,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAkB,CAAC;gBACrF,UAAU,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACtF,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC;QACtB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,SAAiB;QACvC,0CAA0C;QAC1C,gHAAgH;QAChH,OAAO,MAAM,qBAAY,CAAC,QAAQ,CAAC,kBAAkB,GAAG,SAAS,EAAE,KAAK,IAAI,EAAE;YAC1E,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACnC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,QAAQ;QACX,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;;AA7CL,wCA8CC"}
@@ -0,0 +1,2 @@
1
+ ALTER TABLE `balance_items`
2
+ ADD COLUMN `dueAt` datetime NULL;
@@ -0,0 +1,3 @@
1
+ ALTER TABLE `cached_outstanding_balances`
2
+ ADD COLUMN `nextDueAt` datetime NULL AFTER `amountPending`,
3
+ ADD INDEX `nextDueAt` (`nextDueAt`) USING BTREE;
@@ -0,0 +1,2 @@
1
+ ALTER TABLE `balance_items`
2
+ ADD COLUMN `priceOpen` int NOT NULL DEFAULT '0' AFTER `pricePending`;
@@ -0,0 +1,2 @@
1
+ ALTER TABLE `payments`
2
+ ADD COLUMN `type` varchar(36) NOT NULL DEFAULT 'Payment' AFTER `id`;
@@ -0,0 +1,2 @@
1
+ ALTER TABLE `payments`
2
+ CHANGE `paidAt` `paidAt` datetime NULL AFTER `price`;
@@ -0,0 +1 @@
1
+ UPDATE `payments` set `type` = 'Refund' where `price` < 0;
@@ -0,0 +1,15 @@
1
+ UPDATE payments
2
+ SET
3
+ `type` = 'Reallocation'
4
+ WHERE
5
+ price = 0
6
+ AND method = 'Unknown'
7
+ AND EXISTS (
8
+ SELECT
9
+ *
10
+ FROM
11
+ balance_item_payments
12
+ WHERE
13
+ balance_item_payments.paymentId = payments.id
14
+ AND balance_item_payments.price < 0
15
+ );
@@ -1,5 +1,5 @@
1
1
  import { Model } from '@simonbackx/simple-database';
2
- import { BalanceItemRelation, BalanceItemRelationType, BalanceItemStatus, BalanceItemType, BalanceItemWithPayments, BalanceItemWithPrivatePayments } from '@stamhoofd/structures';
2
+ import { BalanceItem as BalanceItemStruct, BalanceItemRelation, BalanceItemRelationType, BalanceItemStatus, BalanceItemType, BalanceItemWithPayments, BalanceItemWithPrivatePayments } from '@stamhoofd/structures';
3
3
  import { SQLSelect } from '@stamhoofd/sql';
4
4
  import { Payment } from './';
5
5
  /**
@@ -45,12 +45,24 @@ export declare class BalanceItem extends Model {
45
45
  * Cached value, for optimizations
46
46
  */
47
47
  pricePending: number;
48
+ /**
49
+ * Cached value, for optimizations
50
+ */
51
+ priceOpen: number;
52
+ /**
53
+ * todo: deprecate ('pending' and 'paid') + 'hidden' status and replace with 'due' + 'hidden'
54
+ * -> maybe add 'due' (due if dueAt is null or <= now), 'hidden' (never due), 'future' (= not due until dueAt - but not possible to pay earlier)
55
+ */
48
56
  status: BalanceItemStatus;
57
+ /**
58
+ * In case the balance item doesn't have to be paid immediately, we can set a due date.
59
+ * When the due date is reached, it is set to null and the cached balance is updated.
60
+ */
61
+ dueAt: Date | null;
49
62
  createdAt: Date;
50
63
  updatedAt: Date;
51
64
  get price(): number;
52
- get priceOpen(): number;
53
- updateStatus(): void;
65
+ get calculatedPriceOpen(): number;
54
66
  static deleteItems(items: BalanceItem[]): Promise<void>;
55
67
  static reactivateItems(items: BalanceItem[]): Promise<void>;
56
68
  static undoForDeletedOrders(orderIds: string[]): Promise<void>;
@@ -72,13 +84,14 @@ export declare class BalanceItem extends Model {
72
84
  */
73
85
  static updatePricePaid(balanceItemIds: string[] | 'all'): Promise<void>;
74
86
  /**
75
- * Call this after updating the pricePaid
87
+ * @deprecated
76
88
  */
77
89
  static updatePricePending(balanceItemIds: string[] | 'all'): Promise<void>;
78
90
  static loadPayments(items: BalanceItem[]): Promise<{
79
91
  payments: Payment[];
80
92
  balanceItemPayments: import("./BalanceItemPayment").BalanceItemPayment[];
81
93
  }>;
94
+ getStructure(): BalanceItemStruct;
82
95
  static getStructureWithPayments(items: BalanceItem[]): Promise<BalanceItemWithPayments[]>;
83
96
  static getStructureWithPrivatePayments(items: BalanceItem[]): Promise<BalanceItemWithPrivatePayments[]>;
84
97
  static balanceItemsForUsersAndMembers(organizationId: string | null, userIds: string[], memberIds: string[]): Promise<BalanceItem[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"BalanceItem.d.ts","sourceRoot":"","sources":["../../../src/models/BalanceItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAA0B,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EAAuE,mBAAmB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,uBAAuB,EAAE,8BAA8B,EAAyD,MAAM,uBAAuB,CAAC;AAK9S,OAAO,EAAO,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAA0B,OAAO,EAAW,MAAM,IAAI,CAAC;AAG9D;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAClC,MAAM,CAAC,KAAK,SAAmB;IAO/B,EAAE,EAAG,MAAM,CAAC;IAKZ,cAAc,EAAE,MAAM,CAAC;IAKvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C;;OAEG;IAEH,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAErC;;OAEG;IAEH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9B;;;;OAIG;IAEH,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG7C,IAAI,kBAAyB;IAG7B,SAAS,EAAE,GAAG,CAAC,uBAAuB,EAAE,mBAAmB,CAAC,CAAa;IAGzE,WAAW,SAAM;IAEjB;;OAEG;IAEH,MAAM,SAAK;IAEX;;OAEG;IAEH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IAEH,SAAS,SAAK;IAEd;;OAEG;IAEH,YAAY,SAAK;IAGjB,MAAM,oBAA6B;IAYnC,SAAS,EAAE,IAAI,CAAC;IAUhB,SAAS,EAAE,IAAI,CAAC;IAEhB,IAAI,KAAK,WAER;IAED,IAAI,SAAS,WAEZ;IAED,YAAY;WAIC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE;WAyChC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE;WAepC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE;WAQvC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE;WAQzC,sBAAsB,CAAC,QAAQ,EAAE,MAAM;WAKvC,4BAA4B,CAAC,cAAc,EAAE,MAAM;WAKnD,kBAAkB,CAAC,cAAc,EAAE,MAAM;;;;;IAQtD;;;OAGG;WACU,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE;IAuCnD;;OAEG;WACU,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,KAAK;IA6C7D;;OAEG;WACU,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,KAAK;WAyCnD,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE;;;;WAcjC,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;WAuBlF,+BAA+B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC;WAuBhG,8BAA8B,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;WAoD7H,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOxF;;OAEG;IACH,MAAM,CAAC,MAAM;CAchB"}
1
+ {"version":3,"file":"BalanceItem.d.ts","sourceRoot":"","sources":["../../../src/models/BalanceItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAA0B,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAuE,mBAAmB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,uBAAuB,EAAE,8BAA8B,EAAyD,MAAM,uBAAuB,CAAC;AAKhV,OAAO,EAAO,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAA0B,OAAO,EAAW,MAAM,IAAI,CAAC;AAG9D;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAClC,MAAM,CAAC,KAAK,SAAmB;IAO/B,EAAE,EAAG,MAAM,CAAC;IAKZ,cAAc,EAAE,MAAM,CAAC;IAKvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG7B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE3C;;OAEG;IAEH,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAErC;;OAEG;IAEH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE9B;;;;OAIG;IAEH,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG7C,IAAI,kBAAyB;IAG7B,SAAS,EAAE,GAAG,CAAC,uBAAuB,EAAE,mBAAmB,CAAC,CAAa;IAGzE,WAAW,SAAM;IAEjB;;OAEG;IAEH,MAAM,SAAK;IAEX;;OAEG;IAEH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IAEH,SAAS,SAAK;IAEd;;OAEG;IAEH,YAAY,SAAK;IAEjB;;OAEG;IAQH,SAAS,SAAK;IAEd;;;OAGG;IAEH,MAAM,oBAAyB;IAE/B;;;OAGG;IAEH,KAAK,EAAE,IAAI,GAAG,IAAI,CAAQ;IAY1B,SAAS,EAAE,IAAI,CAAC;IAUhB,SAAS,EAAE,IAAI,CAAC;IAEhB,IAAI,KAAK,WAER;IAED,IAAI,mBAAmB,WAKtB;WAEY,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE;WA8BhC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE;WAepC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE;WAQvC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE;WAQzC,sBAAsB,CAAC,QAAQ,EAAE,MAAM;WAKvC,4BAA4B,CAAC,cAAc,EAAE,MAAM;WAKnD,kBAAkB,CAAC,cAAc,EAAE,MAAM;;;;;IAQtD;;;OAGG;WACU,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE;IAsCnD;;OAEG;WACU,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,KAAK;IAyD7D;;OAEG;WACU,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,KAAK;WAInD,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE;;;;IAc9C,YAAY;WAMC,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;WAuBlF,+BAA+B,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,8BAA8B,EAAE,CAAC;WAuBhG,8BAA8B,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;WAoD7H,2BAA2B,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOxF;;OAEG;IACH,MAAM,CAAC,MAAM;CAchB"}
@@ -55,18 +55,31 @@ class BalanceItem extends simple_database_1.Model {
55
55
  * Cached value, for optimizations
56
56
  */
57
57
  pricePending = 0;
58
- status = structures_1.BalanceItemStatus.Pending;
58
+ /**
59
+ * Cached value, for optimizations
60
+ */
61
+ priceOpen = 0;
62
+ /**
63
+ * todo: deprecate ('pending' and 'paid') + 'hidden' status and replace with 'due' + 'hidden'
64
+ * -> maybe add 'due' (due if dueAt is null or <= now), 'hidden' (never due), 'future' (= not due until dueAt - but not possible to pay earlier)
65
+ */
66
+ status = structures_1.BalanceItemStatus.Due;
67
+ /**
68
+ * In case the balance item doesn't have to be paid immediately, we can set a due date.
69
+ * When the due date is reached, it is set to null and the cached balance is updated.
70
+ */
71
+ dueAt = null;
59
72
  createdAt;
60
73
  updatedAt;
61
74
  get price() {
62
75
  return this.unitPrice * this.amount;
63
76
  }
64
- get priceOpen() {
77
+ get calculatedPriceOpen() {
78
+ if (this.status !== structures_1.BalanceItemStatus.Due) {
79
+ return -this.pricePaid - this.pricePending;
80
+ }
65
81
  return this.price - this.pricePaid - this.pricePending;
66
82
  }
67
- updateStatus() {
68
- this.status = (this.pricePaid !== 0 || this.price === 0) && this.pricePaid >= this.price ? structures_1.BalanceItemStatus.Paid : (this.pricePaid !== 0 ? structures_1.BalanceItemStatus.Pending : (this.status === structures_1.BalanceItemStatus.Hidden ? structures_1.BalanceItemStatus.Hidden : structures_1.BalanceItemStatus.Pending));
69
- }
70
83
  static async deleteItems(items) {
71
84
  // Find depending items
72
85
  const dependingItemIds = utility_1.Formatter.uniqueArray(items.filter(i => !!i.dependingBalanceItemId).map(i => i.dependingBalanceItemId)).filter(id => !items.some(item => item.id === id));
@@ -75,26 +88,17 @@ class BalanceItem extends simple_database_1.Model {
75
88
  const dependingItems = await BalanceItem.getByIDs(...dependingItemIds);
76
89
  items = [...items, ...dependingItems];
77
90
  }
78
- const { balanceItemPayments } = await BalanceItem.loadPayments(items);
79
91
  // todo: in the future we could automatically delete payments that are not needed anymore and weren't paid yet -> to prevent leaving ghost payments
80
92
  // for now, an admin can manually cancel those payments
81
93
  let needsUpdate = false;
82
94
  // Set other items to zero (the balance item payments keep the real price)
83
95
  for (const item of items) {
84
- needsUpdate = true;
85
- // Don't change status of items that are already paid or are partially paid
86
- // Not using item.paidPrice, since this is cached
87
- const bip = balanceItemPayments.filter(p => p.balanceItemId === item.id);
88
- if (bip.length === 0) {
89
- // No payments associated with this item
90
- item.status = structures_1.BalanceItemStatus.Hidden;
91
- item.amount = 0;
92
- await item.save();
93
- }
94
- else {
95
- item.amount = 0;
96
- await item.save();
96
+ if (item.status !== structures_1.BalanceItemStatus.Due) {
97
+ continue;
97
98
  }
99
+ needsUpdate = true;
100
+ item.status = structures_1.BalanceItemStatus.Canceled;
101
+ await item.save();
98
102
  }
99
103
  if (needsUpdate) {
100
104
  await this.updateOutstanding(items);
@@ -104,7 +108,7 @@ class BalanceItem extends simple_database_1.Model {
104
108
  let needsUpdate = false;
105
109
  for (const item of items) {
106
110
  if (item.status === structures_1.BalanceItemStatus.Hidden) {
107
- item.status = structures_1.BalanceItemStatus.Pending;
111
+ item.status = structures_1.BalanceItemStatus.Due;
108
112
  needsUpdate = true;
109
113
  await item.save();
110
114
  }
@@ -149,7 +153,6 @@ class BalanceItem extends simple_database_1.Model {
149
153
  static async updateOutstanding(items) {
150
154
  console.log('Update outstanding balance for', items.length, 'items');
151
155
  await BalanceItem.updatePricePaid(items.map(i => i.id));
152
- await BalanceItem.updatePricePending(items.map(i => i.id));
153
156
  // Deprecated: the member balances have moved to CachedBalance
154
157
  // Update outstanding amount of related members and registrations
155
158
  const memberIds = utility_1.Formatter.uniqueArray(items.map(p => p.memberId).filter(id => id !== null));
@@ -177,7 +180,7 @@ class BalanceItem extends simple_database_1.Model {
177
180
  * Update the outstanding balance of multiple members in one go (or all members)
178
181
  */
179
182
  static async updatePricePaid(balanceItemIds) {
180
- if (balanceItemIds !== 'all' && balanceItemIds.length == 0) {
183
+ if (balanceItemIds !== 'all' && balanceItemIds.length === 0) {
181
184
  return;
182
185
  }
183
186
  const params = [];
@@ -186,11 +189,11 @@ class BalanceItem extends simple_database_1.Model {
186
189
  if (balanceItemIds !== 'all') {
187
190
  firstWhere = ` AND balanceItemId IN (?)`;
188
191
  params.push(balanceItemIds);
192
+ params.push(balanceItemIds);
189
193
  secondWhere = `WHERE balance_items.id IN (?)`;
190
194
  params.push(balanceItemIds);
191
195
  }
192
- // Note: we'll never mark a balance item as 'paid' via the database -> because we need to rigger the markPaid function manually, which will call the appropriate functions
193
- // this method will set the balance item to paid once, and only call the handlers once
196
+ // Note: this query only works in MySQL because of the SET assignment behaviour allowing to reference newly set values
194
197
  const query = `
195
198
  UPDATE
196
199
  balance_items
@@ -205,35 +208,7 @@ class BalanceItem extends simple_database_1.Model {
205
208
  payments.status = 'Succeeded'${firstWhere}
206
209
  GROUP BY
207
210
  balanceItemId
208
- ) i ON i.balanceItemId = balance_items.id
209
- SET balance_items.pricePaid = coalesce(i.price, 0), balance_items.status = (CASE
210
- WHEN balance_items.status = '${structures_1.BalanceItemStatus.Paid}' AND balance_items.pricePaid != 0 AND balance_items.pricePaid >= (balance_items.unitPrice * balance_items.amount) THEN '${structures_1.BalanceItemStatus.Paid}'
211
- WHEN balance_items.pricePaid != 0 THEN '${structures_1.BalanceItemStatus.Pending}'
212
- WHEN balance_items.status = '${structures_1.BalanceItemStatus.Hidden}' THEN '${structures_1.BalanceItemStatus.Hidden}'
213
- ELSE '${structures_1.BalanceItemStatus.Pending}'
214
- END)
215
- ${secondWhere}`;
216
- await simple_database_1.Database.update(query, params);
217
- }
218
- /**
219
- * Call this after updating the pricePaid
220
- */
221
- static async updatePricePending(balanceItemIds) {
222
- if (balanceItemIds !== 'all' && balanceItemIds.length == 0) {
223
- return;
224
- }
225
- const params = [];
226
- let firstWhere = '';
227
- let secondWhere = '';
228
- if (balanceItemIds !== 'all') {
229
- firstWhere = ` AND balanceItemId IN (?)`;
230
- params.push(balanceItemIds);
231
- secondWhere = `WHERE balance_items.id IN (?)`;
232
- params.push(balanceItemIds);
233
- }
234
- const query = `
235
- UPDATE
236
- balance_items
211
+ ) paid ON paid.balanceItemId = balance_items.id
237
212
  LEFT JOIN (
238
213
  SELECT
239
214
  balanceItemId,
@@ -245,14 +220,22 @@ class BalanceItem extends simple_database_1.Model {
245
220
  payments.status != 'Succeeded' AND payments.status != 'Failed'${firstWhere}
246
221
  GROUP BY
247
222
  balanceItemId
248
- ) i ON i.balanceItemId = balance_items.id
249
- SET balance_items.pricePending = LEAST(
250
- GREATEST(0, balance_items.unitPrice * balance_items.amount - balance_items.pricePaid),
251
- coalesce(i.price, 0)
252
- )
223
+ ) pending ON pending.balanceItemId = balance_items.id
224
+ SET balance_items.pricePaid = coalesce(paid.price, 0),
225
+ balance_items.pricePending = coalesce(pending.price, 0),
226
+ balance_items.priceOpen = (CASE
227
+ WHEN balance_items.status = '${structures_1.BalanceItemStatus.Due}' THEN (balance_items.unitPrice * balance_items.amount - balance_items.pricePaid - balance_items.pricePending)
228
+ ELSE (-balance_items.pricePaid - balance_items.pricePending)
229
+ END)
253
230
  ${secondWhere}`;
254
231
  await simple_database_1.Database.update(query, params);
255
232
  }
233
+ /**
234
+ * @deprecated
235
+ */
236
+ static async updatePricePending(balanceItemIds) {
237
+ // deprecated
238
+ }
256
239
  static async loadPayments(items) {
257
240
  if (items.length == 0) {
258
241
  return { balanceItemPayments: [], payments: [] };
@@ -263,8 +246,13 @@ class BalanceItem extends simple_database_1.Model {
263
246
  const payments = await _1.Payment.getByIDs(...balanceItemPayments.map(p => p.paymentId));
264
247
  return { payments, balanceItemPayments };
265
248
  }
249
+ getStructure() {
250
+ return structures_1.BalanceItem.create({
251
+ ...this,
252
+ });
253
+ }
266
254
  static async getStructureWithPayments(items) {
267
- if (items.length == 0) {
255
+ if (items.length === 0) {
268
256
  return [];
269
257
  }
270
258
  const { payments, balanceItemPayments } = await BalanceItem.loadPayments(items);
@@ -415,9 +403,21 @@ tslib_1.__decorate([
415
403
  tslib_1.__decorate([
416
404
  (0, simple_database_1.column)({ type: 'integer' })
417
405
  ], BalanceItem.prototype, "pricePending", void 0);
406
+ tslib_1.__decorate([
407
+ (0, simple_database_1.column)({
408
+ type: 'integer',
409
+ beforeSave: function () {
410
+ return this.calculatedPriceOpen;
411
+ },
412
+ skipUpdate: true,
413
+ })
414
+ ], BalanceItem.prototype, "priceOpen", void 0);
418
415
  tslib_1.__decorate([
419
416
  (0, simple_database_1.column)({ type: 'string' })
420
417
  ], BalanceItem.prototype, "status", void 0);
418
+ tslib_1.__decorate([
419
+ (0, simple_database_1.column)({ type: 'datetime', nullable: true })
420
+ ], BalanceItem.prototype, "dueAt", void 0);
421
421
  tslib_1.__decorate([
422
422
  (0, simple_database_1.column)({
423
423
  type: 'datetime', beforeSave(old) {
@@ -1 +1 @@
1
- {"version":3,"file":"BalanceItem.js","sourceRoot":"","sources":["../../../src/models/BalanceItem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BalanceItem.js","sourceRoot":"","sources":["../../../src/models/BalanceItem.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,14 @@ export declare class CachedBalance extends Model {
18
18
  */
19
19
  objectType: ReceivableBalanceType;
20
20
  amount: number;
21
+ /**
22
+ * The sum of unconfirmed payments
23
+ */
21
24
  amountPending: number;
25
+ /**
26
+ * This is the minimum `dueAt` that lies in the future of all **unpaid** balance items connected to this object.
27
+ */
28
+ nextDueAt: Date | null;
22
29
  createdAt: Date;
23
30
  updatedAt: Date;
24
31
  static getForObjects(objectIds: string[], limitOrganizationId?: string | null): Promise<CachedBalance[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"CachedBalance.d.ts","sourceRoot":"","sources":["../../../src/models/CachedBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAA0B,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAsE,SAAS,EAA+C,MAAM,gBAAgB,CAAC;AAC5J,OAAO,EAAqB,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACpC,MAAM,CAAC,KAAK,SAAiC;IAO7C,EAAE,EAAG,MAAM,CAAC;IAGZ,cAAc,EAAE,MAAM,CAAC;IAGvB,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IAEH,UAAU,EAAE,qBAAqB,CAAC;IAGlC,MAAM,SAAK;IAGX,aAAa,SAAK;IAYlB,SAAS,EAAE,IAAI,CAAC;IAUhB,SAAS,EAAE,IAAI,CAAC;WAEH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;WAWjG,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,qBAAqB;WAc/F,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,qBAAqB;mBAWxF,iBAAiB;mBA2BjB,eAAe;mBA6Ef,aAAa;WAqCrB,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE;WAQxE,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;WAQ5D,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;WAQxD,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE;WAOzE,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;WAO7D,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;IAOtE;;OAEG;IACH,MAAM,CAAC,MAAM;CAchB"}
1
+ {"version":3,"file":"CachedBalance.d.ts","sourceRoot":"","sources":["../../../src/models/CachedBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAA0B,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAA2F,SAAS,EAA+C,MAAM,gBAAgB,CAAC;AACjL,OAAO,EAAuD,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACpC,MAAM,CAAC,KAAK,SAAiC;IAO7C,EAAE,EAAG,MAAM,CAAC;IAGZ,cAAc,EAAE,MAAM,CAAC;IAGvB,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IAEH,UAAU,EAAE,qBAAqB,CAAC;IAGlC,MAAM,SAAK;IAEX;;OAEG;IAEH,aAAa,SAAK;IAElB;;OAEG;IAEH,SAAS,EAAE,IAAI,GAAG,IAAI,CAAQ;IAY9B,SAAS,EAAE,IAAI,CAAC;IAUhB,SAAS,EAAE,IAAI,CAAC;WAEH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;WAWjG,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,qBAAqB;WAc/F,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,qBAAqB;mBAWxF,iBAAiB;mBAiBjB,eAAe;mBAsJf,aAAa;WAwCrB,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE;WAQxE,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;WAQ5D,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;WAQxD,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE;WAOzE,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;WAO7D,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;IAOtE;;OAEG;IACH,MAAM,CAAC,MAAM;CAchB"}
@@ -23,7 +23,14 @@ class CachedBalance extends simple_database_1.Model {
23
23
  */
24
24
  objectType;
25
25
  amount = 0;
26
+ /**
27
+ * The sum of unconfirmed payments
28
+ */
26
29
  amountPending = 0;
30
+ /**
31
+ * This is the minimum `dueAt` that lies in the future of all **unpaid** balance items connected to this object.
32
+ */
33
+ nextDueAt = null;
27
34
  createdAt;
28
35
  updatedAt;
29
36
  static async getForObjects(objectIds, limitOrganizationId) {
@@ -62,7 +69,7 @@ class CachedBalance extends simple_database_1.Model {
62
69
  .where('organizationId', organizationId)
63
70
  .where(columnName, objectIds)
64
71
  .whereNot('status', structures_1.BalanceItemStatus.Hidden)
65
- .where(sql_1.SQL.where(new sql_1.SQLCalculation(new sql_1.SQLCalculation(sql_1.SQL.column('unitPrice'), new sql_1.SQLMultiplicationSign(), sql_1.SQL.column('amount')), new sql_1.SQLMinusSign(), sql_1.SQL.column('pricePaid')), sql_1.SQLWhereSign.NotEqual, 0)
72
+ .where(sql_1.SQL.where(sql_1.SQL.column('priceOpen'), sql_1.SQLWhereSign.NotEqual, 0)
66
73
  .or('pricePending', sql_1.SQLWhereSign.NotEqual, 0));
67
74
  if (customWhere) {
68
75
  query.where(customWhere);
@@ -70,16 +77,30 @@ class CachedBalance extends simple_database_1.Model {
70
77
  return await query.fetch();
71
78
  }
72
79
  static async fetchForObjects(organizationId, objectIds, columnName, customWhere) {
73
- const query = sql_1.SQL.select(sql_1.SQL.column(columnName), new sql_1.SQLSelectAs(new sql_1.SQLCalculation(new sql_1.SQLSum(new sql_1.SQLCalculation(sql_1.SQL.column('unitPrice'), new sql_1.SQLMultiplicationSign(), sql_1.SQL.column('amount'))), new sql_1.SQLMinusSign(), new sql_1.SQLSum(sql_1.SQL.column('pricePaid'))), new sql_1.SQLAlias('data__amount')), new sql_1.SQLSelectAs(new sql_1.SQLSum(sql_1.SQL.column('pricePending')), new sql_1.SQLAlias('data__amountPending')))
80
+ const dueOffset = structures_1.BalanceItem.getDueOffset();
81
+ const query = sql_1.SQL.select(sql_1.SQL.column(columnName), new sql_1.SQLSelectAs(new sql_1.SQLSum(sql_1.SQL.column('priceOpen')), new sql_1.SQLAlias('data__amount')), new sql_1.SQLSelectAs(new sql_1.SQLSum(sql_1.SQL.column('pricePending')), new sql_1.SQLAlias('data__amountPending')))
74
82
  .from(BalanceItem_1.BalanceItem.table)
75
83
  .where('organizationId', organizationId)
76
84
  .where(columnName, objectIds)
77
85
  .whereNot('status', structures_1.BalanceItemStatus.Hidden)
86
+ .where(sql_1.SQL.where('dueAt', null).or('dueAt', sql_1.SQLWhereSign.LessEqual, dueOffset))
78
87
  .groupBy(sql_1.SQL.column(columnName));
79
88
  if (customWhere) {
80
89
  query.where(customWhere);
81
90
  }
82
91
  const result = await query.fetch();
92
+ // Calculate future due
93
+ const dueQuery = sql_1.SQL.select(sql_1.SQL.column(columnName), new sql_1.SQLSelectAs(new sql_1.SQLMin(sql_1.SQL.column('dueAt')), new sql_1.SQLAlias('data__dueAt')),
94
+ // If the current amount_due is negative, we can ignore that negative part if there is a future due item
95
+ new sql_1.SQLSelectAs(new sql_1.SQLSum(sql_1.SQL.column('priceOpen')), new sql_1.SQLAlias('data__amount')), new sql_1.SQLSelectAs(new sql_1.SQLSum(sql_1.SQL.column('pricePending')), new sql_1.SQLAlias('data__amountPending')))
96
+ .from(BalanceItem_1.BalanceItem.table)
97
+ .where('organizationId', organizationId)
98
+ .where(columnName, objectIds)
99
+ .where('status', structures_1.BalanceItemStatus.Due)
100
+ .whereNot('dueAt', null)
101
+ .where('dueAt', sql_1.SQLWhereSign.Greater, dueOffset)
102
+ .groupBy(sql_1.SQL.column(columnName));
103
+ const dueResult = await dueQuery.fetch();
83
104
  const results = [];
84
105
  for (const row of result) {
85
106
  if (!row['data']) {
@@ -100,12 +121,50 @@ class CachedBalance extends simple_database_1.Model {
100
121
  if (typeof amountPending !== 'number') {
101
122
  throw new Error('Invalid amountPending');
102
123
  }
103
- results.push([objectId, { amount, amountPending }]);
124
+ results.push([objectId, { amount, amountPending, nextDueAt: null }]);
125
+ }
126
+ for (const row of dueResult) {
127
+ if (!row['data']) {
128
+ throw new Error('Invalid data namespace');
129
+ }
130
+ if (!row[BalanceItem_1.BalanceItem.table]) {
131
+ throw new Error('Invalid ' + BalanceItem_1.BalanceItem.table + ' namespace');
132
+ }
133
+ const objectId = row[BalanceItem_1.BalanceItem.table][columnName];
134
+ const dueAt = row['data']['dueAt'];
135
+ const amount = row['data']['amount'];
136
+ const amountPending = row['data']['amountPending'];
137
+ if (typeof objectId !== 'string') {
138
+ throw new Error('Invalid objectId');
139
+ }
140
+ if (!(dueAt instanceof Date)) {
141
+ throw new Error('Invalid dueAt');
142
+ }
143
+ if (typeof amount !== 'number') {
144
+ throw new Error('Invalid amount');
145
+ }
146
+ if (typeof amountPending !== 'number') {
147
+ throw new Error('Invalid amountPending');
148
+ }
149
+ const result = results.find(r => r[0] === objectId);
150
+ if (result) {
151
+ result[1].nextDueAt = dueAt;
152
+ if (result[1].amount < 0) {
153
+ if (amount > 0) {
154
+ // Let the future due amount fill in the gap until maximum 0
155
+ result[1].amount = Math.min(0, result[1].amount + amount);
156
+ }
157
+ }
158
+ result[1].amountPending += amountPending;
159
+ }
160
+ else {
161
+ results.push([objectId, { amount: 0, amountPending: amountPending, nextDueAt: dueAt }]);
162
+ }
104
163
  }
105
164
  // Add missing object ids (with 0 amount, otherwise we don't reset the amounts back to zero when all the balance items are hidden)
106
165
  for (const objectId of objectIds) {
107
166
  if (!results.find(([id]) => id === objectId)) {
108
- results.push([objectId, { amount: 0, amountPending: 0 }]);
167
+ results.push([objectId, { amount: 0, amountPending: 0, nextDueAt: null }]);
109
168
  }
110
169
  }
111
170
  return results;
@@ -115,8 +174,8 @@ class CachedBalance extends simple_database_1.Model {
115
174
  return;
116
175
  }
117
176
  const query = sql_1.SQL.insert(this.table)
118
- .columns('id', 'organizationId', 'objectId', 'objectType', 'amount', 'amountPending', 'createdAt', 'updatedAt')
119
- .values(...result.map(([objectId, { amount, amountPending }]) => {
177
+ .columns('id', 'organizationId', 'objectId', 'objectType', 'amount', 'amountPending', 'nextDueAt', 'createdAt', 'updatedAt')
178
+ .values(...result.map(([objectId, { amount, amountPending, nextDueAt }]) => {
120
179
  return [
121
180
  (0, uuid_1.v4)(),
122
181
  organizationId,
@@ -124,12 +183,13 @@ class CachedBalance extends simple_database_1.Model {
124
183
  objectType,
125
184
  amount,
126
185
  amountPending,
186
+ nextDueAt,
127
187
  new Date(),
128
188
  new Date(),
129
189
  ];
130
190
  }))
131
191
  .as('v')
132
- .onDuplicateKeyUpdate(sql_1.SQL.assignment('amount', sql_1.SQL.column('v', 'amount')), sql_1.SQL.assignment('amountPending', sql_1.SQL.column('v', 'amountPending')), sql_1.SQL.assignment('updatedAt', sql_1.SQL.column('v', 'updatedAt')));
192
+ .onDuplicateKeyUpdate(sql_1.SQL.assignment('amount', sql_1.SQL.column('v', 'amount')), sql_1.SQL.assignment('amountPending', sql_1.SQL.column('v', 'amountPending')), sql_1.SQL.assignment('nextDueAt', sql_1.SQL.column('v', 'nextDueAt')), sql_1.SQL.assignment('updatedAt', sql_1.SQL.column('v', 'updatedAt')));
133
193
  await query.insert();
134
194
  }
135
195
  static async updateForOrganizations(organizationId, organizationIds) {
@@ -209,6 +269,9 @@ tslib_1.__decorate([
209
269
  tslib_1.__decorate([
210
270
  (0, simple_database_1.column)({ type: 'integer' })
211
271
  ], CachedBalance.prototype, "amountPending", void 0);
272
+ tslib_1.__decorate([
273
+ (0, simple_database_1.column)({ type: 'datetime', nullable: true })
274
+ ], CachedBalance.prototype, "nextDueAt", void 0);
212
275
  tslib_1.__decorate([
213
276
  (0, simple_database_1.column)({
214
277
  type: 'datetime', beforeSave(old) {