@zeeshan60/event-processor 1.0.144 → 1.0.146
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/AttachmentProcessEvents.d.ts +2 -0
- package/dist/AttachmentProcessEvents.d.ts.map +1 -1
- package/dist/AttachmentProcessEvents.js +2 -0
- package/dist/AttachmentProcessEvents.js.map +1 -1
- package/dist/EventProcessorSDK.d.ts.map +1 -1
- package/dist/EventProcessorSDK.js +1 -1
- package/dist/EventProcessorSDK.js.map +1 -1
- package/dist/ExpenseEventHandler.d.ts +16 -2
- package/dist/ExpenseEventHandler.d.ts.map +1 -1
- package/dist/ExpenseEventHandler.js +249 -16
- package/dist/ExpenseEventHandler.js.map +1 -1
- package/dist/ExpenseEvents.d.ts +6 -0
- package/dist/ExpenseEvents.d.ts.map +1 -1
- package/dist/ExpenseEvents.js +3 -0
- package/dist/ExpenseEvents.js.map +1 -1
- package/dist/TransactionEventHandler.d.ts +2 -0
- package/dist/TransactionEventHandler.d.ts.map +1 -1
- package/dist/TransactionEventHandler.js +91 -3
- package/dist/TransactionEventHandler.js.map +1 -1
- package/dist/TransactionEvents.d.ts +6 -0
- package/dist/TransactionEvents.d.ts.map +1 -1
- package/dist/TransactionEvents.js +3 -0
- package/dist/TransactionEvents.js.map +1 -1
- package/dist/__tests__/test-helpers/IMMetadataStore.d.ts +9 -0
- package/dist/__tests__/test-helpers/IMMetadataStore.d.ts.map +1 -0
- package/dist/__tests__/test-helpers/IMMetadataStore.js +17 -0
- package/dist/__tests__/test-helpers/IMMetadataStore.js.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringExpenseEventStore.d.ts +12 -0
- package/dist/__tests__/test-helpers/IMRecurringExpenseEventStore.d.ts.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringExpenseEventStore.js +28 -0
- package/dist/__tests__/test-helpers/IMRecurringExpenseEventStore.js.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringExpenseModelStore.d.ts +19 -0
- package/dist/__tests__/test-helpers/IMRecurringExpenseModelStore.d.ts.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringExpenseModelStore.js +57 -0
- package/dist/__tests__/test-helpers/IMRecurringExpenseModelStore.js.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringGroupTransactionEventStore.d.ts +12 -0
- package/dist/__tests__/test-helpers/IMRecurringGroupTransactionEventStore.d.ts.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringGroupTransactionEventStore.js +28 -0
- package/dist/__tests__/test-helpers/IMRecurringGroupTransactionEventStore.js.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringGroupTransactionModelStore.d.ts +19 -0
- package/dist/__tests__/test-helpers/IMRecurringGroupTransactionModelStore.d.ts.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringGroupTransactionModelStore.js +57 -0
- package/dist/__tests__/test-helpers/IMRecurringGroupTransactionModelStore.js.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringTransactionEventStore.d.ts +12 -0
- package/dist/__tests__/test-helpers/IMRecurringTransactionEventStore.d.ts.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringTransactionEventStore.js +28 -0
- package/dist/__tests__/test-helpers/IMRecurringTransactionEventStore.js.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringTransactionModelStore.d.ts +19 -0
- package/dist/__tests__/test-helpers/IMRecurringTransactionModelStore.d.ts.map +1 -0
- package/dist/__tests__/test-helpers/IMRecurringTransactionModelStore.js +59 -0
- package/dist/__tests__/test-helpers/IMRecurringTransactionModelStore.js.map +1 -0
- package/dist/client/controllers/BudgetController.d.ts +2 -7
- package/dist/client/controllers/BudgetController.d.ts.map +1 -1
- package/dist/client/controllers/BudgetController.js +12 -69
- package/dist/client/controllers/BudgetController.js.map +1 -1
- package/dist/client/controllers/ExpenseController.d.ts +4 -0
- package/dist/client/controllers/ExpenseController.d.ts.map +1 -1
- package/dist/client/controllers/ExpenseController.js +63 -1
- package/dist/client/controllers/ExpenseController.js.map +1 -1
- package/dist/client/controllers/ExportsController.d.ts.map +1 -1
- package/dist/client/controllers/ExportsController.js +26 -10
- package/dist/client/controllers/ExportsController.js.map +1 -1
- package/dist/client/controllers/GroupController.d.ts.map +1 -1
- package/dist/client/controllers/GroupController.js +4 -0
- package/dist/client/controllers/GroupController.js.map +1 -1
- package/dist/client/controllers/SuggestionController.js +1 -1
- package/dist/client/controllers/SuggestionController.js.map +1 -1
- package/dist/client/controllers/TransactionController.d.ts +4 -0
- package/dist/client/controllers/TransactionController.d.ts.map +1 -1
- package/dist/client/controllers/TransactionController.js +117 -15
- package/dist/client/controllers/TransactionController.js.map +1 -1
- package/dist/common/DomainEvents.d.ts +2 -0
- package/dist/common/DomainEvents.d.ts.map +1 -1
- package/dist/common/EventTypes.d.ts +1 -0
- package/dist/common/EventTypes.d.ts.map +1 -1
- package/dist/common/EventTypes.js +1 -0
- package/dist/common/EventTypes.js.map +1 -1
- package/dist/contracts/CurrencyConverter.d.ts +5 -0
- package/dist/contracts/CurrencyConverter.d.ts.map +1 -0
- package/dist/contracts/CurrencyConverter.js +11 -0
- package/dist/contracts/CurrencyConverter.js.map +1 -0
- package/dist/contracts/expenses/index.d.ts +2 -0
- package/dist/contracts/expenses/index.d.ts.map +1 -1
- package/dist/contracts/expenses/index.js.map +1 -1
- package/dist/contracts/index.d.ts +1 -0
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +1 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/transactions/index.d.ts +6 -0
- package/dist/contracts/transactions/index.d.ts.map +1 -1
- package/dist/contracts/transactions/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/BalanceUtil.d.ts +3 -3
- package/dist/utils/BalanceUtil.d.ts.map +1 -1
- package/dist/utils/BalanceUtil.js +2 -9
- package/dist/utils/BalanceUtil.js.map +1 -1
- package/dist/utils/GroupUtil.d.ts.map +1 -1
- package/dist/utils/GroupUtil.js +4 -11
- package/dist/utils/GroupUtil.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IMRecurringGroupTransactionModelStore = void 0;
|
|
4
|
+
class IMRecurringGroupTransactionModelStore {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.models = new Map();
|
|
7
|
+
}
|
|
8
|
+
async getByStreamId(streamId) {
|
|
9
|
+
return this.models.get(streamId);
|
|
10
|
+
}
|
|
11
|
+
async getByStreamIdWhereDeletedIsFalse(streamId) {
|
|
12
|
+
const model = this.models.get(streamId);
|
|
13
|
+
if (!model || model.deleted)
|
|
14
|
+
return undefined;
|
|
15
|
+
return model;
|
|
16
|
+
}
|
|
17
|
+
async getLatestByUpdatedAt() {
|
|
18
|
+
const models = Array.from(this.models.values());
|
|
19
|
+
if (models.length === 0)
|
|
20
|
+
return undefined;
|
|
21
|
+
return models.reduce((latest, current) => current.updatedAt > latest.updatedAt ? current : latest);
|
|
22
|
+
}
|
|
23
|
+
async save(model) {
|
|
24
|
+
this.models.set(model.streamId, model);
|
|
25
|
+
}
|
|
26
|
+
async saveAll(models) {
|
|
27
|
+
for (const model of models) {
|
|
28
|
+
await this.save(model);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async getByUserId(userId) {
|
|
32
|
+
return Array.from(this.models.values()).filter((m) => m.userId === userId);
|
|
33
|
+
}
|
|
34
|
+
async findAllByUserIdWhereDeletedIsFalse(userId) {
|
|
35
|
+
return Array.from(this.models.values()).filter((m) => m.userId === userId && !m.deleted);
|
|
36
|
+
}
|
|
37
|
+
async findAllByUserIdAndGroupIdWhereDeletedIsFalse(userId, groupId) {
|
|
38
|
+
return Array.from(this.models.values()).filter((m) => m.userId === userId && m.groupId === groupId && !m.deleted);
|
|
39
|
+
}
|
|
40
|
+
async findAllByStatusWhereDeletedIsFalse(userId, status) {
|
|
41
|
+
return Array.from(this.models.values()).filter((m) => m.userId === userId && m.status === status && !m.deleted);
|
|
42
|
+
}
|
|
43
|
+
async findAllActiveRecurringGroupTransactions() {
|
|
44
|
+
return Array.from(this.models.values()).filter((m) => m.status === "active" && !m.deleted);
|
|
45
|
+
}
|
|
46
|
+
getAll() {
|
|
47
|
+
return Array.from(this.models.values());
|
|
48
|
+
}
|
|
49
|
+
getAllWhereDeletedIsFalse() {
|
|
50
|
+
return Array.from(this.models.values()).filter((m) => !m.deleted);
|
|
51
|
+
}
|
|
52
|
+
clear() {
|
|
53
|
+
this.models.clear();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.IMRecurringGroupTransactionModelStore = IMRecurringGroupTransactionModelStore;
|
|
57
|
+
//# sourceMappingURL=IMRecurringGroupTransactionModelStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMRecurringGroupTransactionModelStore.js","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMRecurringGroupTransactionModelStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RecurringTransactionEventStore } from "../../stores/RecurringTransactionEventStore";
|
|
2
|
+
import { RecurringTransactionEvent } from "../../common/DomainEvents";
|
|
3
|
+
export declare class IMRecurringTransactionEventStore implements RecurringTransactionEventStore {
|
|
4
|
+
private events;
|
|
5
|
+
addEvent(event: RecurringTransactionEvent): Promise<void>;
|
|
6
|
+
addEvents(events: RecurringTransactionEvent[]): Promise<void>;
|
|
7
|
+
getAllEventsByStreamId(streamId: string): Promise<RecurringTransactionEvent[]>;
|
|
8
|
+
deleteEventsByStreamId(streamId: string): Promise<void>;
|
|
9
|
+
getAll(): RecurringTransactionEvent[];
|
|
10
|
+
clear(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=IMRecurringTransactionEventStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMRecurringTransactionEventStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMRecurringTransactionEventStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,qBAAa,gCACX,YAAW,8BAA8B;IAEzC,OAAO,CAAC,MAAM,CAAmC;IAE3C,QAAQ,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,SAAS,CAAC,MAAM,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,sBAAsB,CAC1B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAIjC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D,MAAM,IAAI,yBAAyB,EAAE;IAIrC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IMRecurringTransactionEventStore = void 0;
|
|
4
|
+
class IMRecurringTransactionEventStore {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.events = [];
|
|
7
|
+
}
|
|
8
|
+
async addEvent(event) {
|
|
9
|
+
this.events.push(event);
|
|
10
|
+
}
|
|
11
|
+
async addEvents(events) {
|
|
12
|
+
this.events.push(...events);
|
|
13
|
+
}
|
|
14
|
+
async getAllEventsByStreamId(streamId) {
|
|
15
|
+
return this.events.filter((e) => e.streamId === streamId);
|
|
16
|
+
}
|
|
17
|
+
async deleteEventsByStreamId(streamId) {
|
|
18
|
+
this.events = this.events.filter((e) => e.streamId !== streamId);
|
|
19
|
+
}
|
|
20
|
+
getAll() {
|
|
21
|
+
return this.events;
|
|
22
|
+
}
|
|
23
|
+
clear() {
|
|
24
|
+
this.events = [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.IMRecurringTransactionEventStore = IMRecurringTransactionEventStore;
|
|
28
|
+
//# sourceMappingURL=IMRecurringTransactionEventStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMRecurringTransactionEventStore.js","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMRecurringTransactionEventStore.ts"],"names":[],"mappings":";;;AAGA,MAAa,gCAAgC;IAA7C;QAGU,WAAM,GAAgC,EAAE,CAAC;IA2BnD,CAAC;IAzBC,KAAK,CAAC,QAAQ,CAAC,KAAgC;QAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAmC;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,QAAgB;QAEhB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,QAAgB;QAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACnE,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF;AA9BD,4EA8BC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { RecurringTransactionModelStore } from "../../stores/RecurringTransactionModelStore";
|
|
2
|
+
import { RecurringTransactionModel } from "../../RecurringTransactionEvents";
|
|
3
|
+
export declare class IMRecurringTransactionModelStore implements RecurringTransactionModelStore {
|
|
4
|
+
private models;
|
|
5
|
+
getByStreamId(streamId: string): Promise<RecurringTransactionModel | undefined>;
|
|
6
|
+
getByStreamIdWhereDeletedIsFalse(streamId: string): Promise<RecurringTransactionModel | undefined>;
|
|
7
|
+
getLatestByUpdatedAt(): Promise<RecurringTransactionModel | undefined>;
|
|
8
|
+
save(model: RecurringTransactionModel): Promise<void>;
|
|
9
|
+
saveAll(models: RecurringTransactionModel[]): Promise<void>;
|
|
10
|
+
getByUserId(userId: string): Promise<RecurringTransactionModel[]>;
|
|
11
|
+
findAllByUserIdWhereDeletedIsFalse(userId: string): Promise<RecurringTransactionModel[]>;
|
|
12
|
+
findAllByUserIdAndRecipientUserIdWhereDeletedIsFalse(userId: string, recipientUserId: string): Promise<RecurringTransactionModel[]>;
|
|
13
|
+
findAllByStatusWhereDeletedIsFalse(userId: string, status: string): Promise<RecurringTransactionModel[]>;
|
|
14
|
+
findAllActiveRecurringTransactions(): Promise<RecurringTransactionModel[]>;
|
|
15
|
+
getAll(): RecurringTransactionModel[];
|
|
16
|
+
getAllWhereDeletedIsFalse(): RecurringTransactionModel[];
|
|
17
|
+
clear(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=IMRecurringTransactionModelStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMRecurringTransactionModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMRecurringTransactionModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAE7E,qBAAa,gCACX,YAAW,8BAA8B;IAEzC,OAAO,CAAC,MAAM,CAAqD;IAE7D,aAAa,CACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAI3C,gCAAgC,CACpC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAM3C,oBAAoB,IAAI,OAAO,CACnC,yBAAyB,GAAG,SAAS,CACtC;IAQK,IAAI,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,OAAO,CAAC,MAAM,EAAE,yBAAyB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAMjE,kCAAkC,CACtC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAMjC,oDAAoD,CACxD,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,yBAAyB,EAAE,CAAC;IASjC,kCAAkC,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,EAAE,CAAC;IAMjC,kCAAkC,IAAI,OAAO,CACjD,yBAAyB,EAAE,CAC5B;IAMD,MAAM,IAAI,yBAAyB,EAAE;IAIrC,yBAAyB,IAAI,yBAAyB,EAAE;IAIxD,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IMRecurringTransactionModelStore = void 0;
|
|
4
|
+
class IMRecurringTransactionModelStore {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.models = new Map();
|
|
7
|
+
}
|
|
8
|
+
async getByStreamId(streamId) {
|
|
9
|
+
return this.models.get(streamId);
|
|
10
|
+
}
|
|
11
|
+
async getByStreamIdWhereDeletedIsFalse(streamId) {
|
|
12
|
+
const model = this.models.get(streamId);
|
|
13
|
+
if (!model || model.deleted)
|
|
14
|
+
return undefined;
|
|
15
|
+
return model;
|
|
16
|
+
}
|
|
17
|
+
async getLatestByUpdatedAt() {
|
|
18
|
+
const models = Array.from(this.models.values());
|
|
19
|
+
if (models.length === 0)
|
|
20
|
+
return undefined;
|
|
21
|
+
return models.reduce((latest, current) => current.updatedAt > latest.updatedAt ? current : latest);
|
|
22
|
+
}
|
|
23
|
+
async save(model) {
|
|
24
|
+
this.models.set(model.streamId, model);
|
|
25
|
+
}
|
|
26
|
+
async saveAll(models) {
|
|
27
|
+
for (const model of models) {
|
|
28
|
+
await this.save(model);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async getByUserId(userId) {
|
|
32
|
+
return Array.from(this.models.values()).filter((m) => m.userId === userId);
|
|
33
|
+
}
|
|
34
|
+
async findAllByUserIdWhereDeletedIsFalse(userId) {
|
|
35
|
+
return Array.from(this.models.values()).filter((m) => m.userId === userId && !m.deleted);
|
|
36
|
+
}
|
|
37
|
+
async findAllByUserIdAndRecipientUserIdWhereDeletedIsFalse(userId, recipientUserId) {
|
|
38
|
+
return Array.from(this.models.values()).filter((m) => m.userId === userId &&
|
|
39
|
+
m.recipientUserId === recipientUserId &&
|
|
40
|
+
!m.deleted);
|
|
41
|
+
}
|
|
42
|
+
async findAllByStatusWhereDeletedIsFalse(userId, status) {
|
|
43
|
+
return Array.from(this.models.values()).filter((m) => m.userId === userId && m.status === status && !m.deleted);
|
|
44
|
+
}
|
|
45
|
+
async findAllActiveRecurringTransactions() {
|
|
46
|
+
return Array.from(this.models.values()).filter((m) => m.status === "active" && !m.deleted);
|
|
47
|
+
}
|
|
48
|
+
getAll() {
|
|
49
|
+
return Array.from(this.models.values());
|
|
50
|
+
}
|
|
51
|
+
getAllWhereDeletedIsFalse() {
|
|
52
|
+
return Array.from(this.models.values()).filter((m) => !m.deleted);
|
|
53
|
+
}
|
|
54
|
+
clear() {
|
|
55
|
+
this.models.clear();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.IMRecurringTransactionModelStore = IMRecurringTransactionModelStore;
|
|
59
|
+
//# sourceMappingURL=IMRecurringTransactionModelStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMRecurringTransactionModelStore.js","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMRecurringTransactionModelStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { BudgetModel } from "../../BudgetEvents";
|
|
2
1
|
import { BudgetCreateRequest, BudgetUpdateRequest, BudgetResponse, BudgetsResponse } from "../../contracts/budgets";
|
|
3
2
|
import { EventProcessorSDK } from "../../EventProcessorSDK";
|
|
4
3
|
export declare class BudgetController {
|
|
@@ -7,8 +6,9 @@ export declare class BudgetController {
|
|
|
7
6
|
private get logger();
|
|
8
7
|
private get modelStore();
|
|
9
8
|
private get budgetEventHandler();
|
|
10
|
-
private get expenseModelStore();
|
|
11
9
|
private get expenseAccountModelStore();
|
|
10
|
+
private get currencyStore();
|
|
11
|
+
private get expenseEventHandler();
|
|
12
12
|
private derivePeriodFromAccount;
|
|
13
13
|
createBudget(userId: string, request: BudgetCreateRequest): Promise<string>;
|
|
14
14
|
updateBudget(userId: string, budgetId: string, request: BudgetUpdateRequest): Promise<void>;
|
|
@@ -16,11 +16,6 @@ export declare class BudgetController {
|
|
|
16
16
|
getBudget(userId: string, budgetId: string): Promise<BudgetResponse>;
|
|
17
17
|
getAllBudgets(userId: string): Promise<BudgetsResponse>;
|
|
18
18
|
getActiveBudgets(userId: string): Promise<BudgetsResponse>;
|
|
19
|
-
getBudgetSpentAmount(userId: string, budget: BudgetModel): Promise<number>;
|
|
20
|
-
getPeriodDateRange(budget: BudgetModel): {
|
|
21
|
-
startDate?: number;
|
|
22
|
-
endDate?: number;
|
|
23
|
-
};
|
|
24
19
|
private mapModelToResponse;
|
|
25
20
|
}
|
|
26
21
|
//# sourceMappingURL=BudgetController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BudgetController.d.ts","sourceRoot":"","sources":["../../../src/client/controllers/BudgetController.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BudgetController.d.ts","sourceRoot":"","sources":["../../../src/client/controllers/BudgetController.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,eAAe,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAI5D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;gBAE5B,GAAG,EAAE,iBAAiB;IAIlC,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,kBAAkB,GAE7B;IAED,OAAO,KAAK,wBAAwB,GAEnC;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,mBAAmB,GAE9B;YAEa,uBAAuB;IAuB/B,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC;IAsCZ,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC;IA8CV,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B7D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6BpE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAwBvD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2BhE,OAAO,CAAC,kBAAkB;CAiC3B"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BudgetController = void 0;
|
|
4
4
|
const BudgetEvents_1 = require("../../BudgetEvents");
|
|
5
|
-
const expenses_1 = require("../../contracts/expenses");
|
|
6
5
|
const ExpenseAccountEvents_1 = require("../../ExpenseAccountEvents");
|
|
7
6
|
const uuid_1 = require("uuid");
|
|
8
7
|
class BudgetController {
|
|
@@ -18,12 +17,15 @@ class BudgetController {
|
|
|
18
17
|
get budgetEventHandler() {
|
|
19
18
|
return this.sdk.getBudgetEventHandler();
|
|
20
19
|
}
|
|
21
|
-
get expenseModelStore() {
|
|
22
|
-
return this.sdk.getStoreConfig().expenseModelStore;
|
|
23
|
-
}
|
|
24
20
|
get expenseAccountModelStore() {
|
|
25
21
|
return this.sdk.getStoreConfig().expenseAccountModelStore;
|
|
26
22
|
}
|
|
23
|
+
get currencyStore() {
|
|
24
|
+
return this.sdk.getCurrencyStore();
|
|
25
|
+
}
|
|
26
|
+
get expenseEventHandler() {
|
|
27
|
+
return this.sdk.getExpenseEventHandler();
|
|
28
|
+
}
|
|
27
29
|
async derivePeriodFromAccount(userId, accountId) {
|
|
28
30
|
if (!accountId) {
|
|
29
31
|
return BudgetEvents_1.BudgetPeriodEnum.ALL_TIME;
|
|
@@ -128,7 +130,8 @@ class BudgetController {
|
|
|
128
130
|
if (!budgetModel) {
|
|
129
131
|
throw new Error(`Budget not found: ${budgetId}`);
|
|
130
132
|
}
|
|
131
|
-
const
|
|
133
|
+
const rates = (await this.currencyStore.getCurrencyRates())?.rates;
|
|
134
|
+
const spent = await this.expenseEventHandler.getBudgetSpentAmount(userId, budgetModel, rates);
|
|
132
135
|
const response = this.mapModelToResponse(budgetModel, spent);
|
|
133
136
|
this.logger.log("[BudgetController.getBudget] Returning budget", {
|
|
134
137
|
request: { userId, budgetId },
|
|
@@ -142,8 +145,9 @@ class BudgetController {
|
|
|
142
145
|
}
|
|
143
146
|
async getAllBudgets(userId) {
|
|
144
147
|
const budgets = await this.modelStore.findAllByUserIdAndDeletedIsFalse(userId);
|
|
148
|
+
const rates = (await this.currencyStore.getCurrencyRates())?.rates;
|
|
145
149
|
const budgetsWithSpent = await Promise.all(budgets.map(async (budget) => {
|
|
146
|
-
const spent = await this.getBudgetSpentAmount(userId, budget);
|
|
150
|
+
const spent = await this.expenseEventHandler.getBudgetSpentAmount(userId, budget, rates);
|
|
147
151
|
return this.mapModelToResponse(budget, spent);
|
|
148
152
|
}));
|
|
149
153
|
this.logger.log("[BudgetController.getAllBudgets] Returning budgets", {
|
|
@@ -154,8 +158,9 @@ class BudgetController {
|
|
|
154
158
|
}
|
|
155
159
|
async getActiveBudgets(userId) {
|
|
156
160
|
const budgets = await this.modelStore.findAllByUserIdAndIsActiveAndDeletedIsFalse(userId);
|
|
161
|
+
const rates = (await this.currencyStore.getCurrencyRates())?.rates;
|
|
157
162
|
const budgetsWithSpent = await Promise.all(budgets.map(async (budget) => {
|
|
158
|
-
const spent = await this.getBudgetSpentAmount(userId, budget);
|
|
163
|
+
const spent = await this.expenseEventHandler.getBudgetSpentAmount(userId, budget, rates);
|
|
159
164
|
return this.mapModelToResponse(budget, spent);
|
|
160
165
|
}));
|
|
161
166
|
this.logger.log("[BudgetController.getActiveBudgets] Returning active budgets", {
|
|
@@ -164,68 +169,6 @@ class BudgetController {
|
|
|
164
169
|
});
|
|
165
170
|
return { budgets: budgetsWithSpent };
|
|
166
171
|
}
|
|
167
|
-
async getBudgetSpentAmount(userId, budget) {
|
|
168
|
-
const { startDate, endDate } = this.getPeriodDateRange(budget);
|
|
169
|
-
const expenses = await this.expenseModelStore.queryExpenses(userId, {
|
|
170
|
-
transactionTypes: [expenses_1.TransactionType.EXPENSE],
|
|
171
|
-
dateFrom: startDate,
|
|
172
|
-
dateTo: endDate,
|
|
173
|
-
accountIds: budget.accountId ? [budget.accountId] : undefined,
|
|
174
|
-
categories: budget.category ? [budget.category] : undefined,
|
|
175
|
-
paymentMethods: budget.paymentMethod ? [budget.paymentMethod] : undefined,
|
|
176
|
-
});
|
|
177
|
-
const totalSpent = expenses.reduce((sum, expense) => sum + expense.amount, 0);
|
|
178
|
-
this.logger.log("[BudgetController.getBudgetSpentAmount] Calculated spent", {
|
|
179
|
-
budgetId: budget.budgetId,
|
|
180
|
-
period: budget.period,
|
|
181
|
-
startDate: startDate ? new Date(startDate).toISOString() : "ALL_TIME",
|
|
182
|
-
endDate: endDate ? new Date(endDate).toISOString() : "ALL_TIME",
|
|
183
|
-
expenseCount: expenses.length,
|
|
184
|
-
totalSpent,
|
|
185
|
-
});
|
|
186
|
-
return totalSpent;
|
|
187
|
-
}
|
|
188
|
-
getPeriodDateRange(budget) {
|
|
189
|
-
const now = new Date();
|
|
190
|
-
switch (budget.period) {
|
|
191
|
-
case BudgetEvents_1.BudgetPeriodEnum.WEEKLY: {
|
|
192
|
-
const dayOfWeek = now.getDay();
|
|
193
|
-
const startOfWeek = new Date(now);
|
|
194
|
-
startOfWeek.setDate(now.getDate() - dayOfWeek);
|
|
195
|
-
startOfWeek.setHours(0, 0, 0, 0);
|
|
196
|
-
const endOfWeek = new Date(startOfWeek);
|
|
197
|
-
endOfWeek.setDate(startOfWeek.getDate() + 6);
|
|
198
|
-
endOfWeek.setHours(23, 59, 59, 999);
|
|
199
|
-
return {
|
|
200
|
-
startDate: startOfWeek.getTime(),
|
|
201
|
-
endDate: endOfWeek.getTime(),
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
case BudgetEvents_1.BudgetPeriodEnum.MONTHLY: {
|
|
205
|
-
const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
206
|
-
startOfMonth.setHours(0, 0, 0, 0);
|
|
207
|
-
const endOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0);
|
|
208
|
-
endOfMonth.setHours(23, 59, 59, 999);
|
|
209
|
-
return {
|
|
210
|
-
startDate: startOfMonth.getTime(),
|
|
211
|
-
endDate: endOfMonth.getTime(),
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
case BudgetEvents_1.BudgetPeriodEnum.YEARLY: {
|
|
215
|
-
const startOfYear = new Date(now.getFullYear(), 0, 1);
|
|
216
|
-
startOfYear.setHours(0, 0, 0, 0);
|
|
217
|
-
const endOfYear = new Date(now.getFullYear(), 11, 31);
|
|
218
|
-
endOfYear.setHours(23, 59, 59, 999);
|
|
219
|
-
return {
|
|
220
|
-
startDate: startOfYear.getTime(),
|
|
221
|
-
endDate: endOfYear.getTime(),
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
case BudgetEvents_1.BudgetPeriodEnum.ALL_TIME:
|
|
225
|
-
default:
|
|
226
|
-
return { startDate: undefined, endDate: undefined };
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
172
|
mapModelToResponse(model, spent) {
|
|
230
173
|
const effectiveBudget = model.amount + (model.rollover ? model.rolloverAmount : 0);
|
|
231
174
|
const remaining = effectiveBudget - spent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BudgetController.js","sourceRoot":"","sources":["../../../src/client/controllers/BudgetController.ts"],"names":[],"mappings":";;;AAAA,qDAO4B;
|
|
1
|
+
{"version":3,"file":"BudgetController.js","sourceRoot":"","sources":["../../../src/client/controllers/BudgetController.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,10 @@ export declare class ExpenseController {
|
|
|
26
26
|
bulkCreate(userId: string, requests: ExpenseCreateRequest[]): Promise<BulkExpenseCreateResponse>;
|
|
27
27
|
updateExpense(userId: string, streamId: string, request: ExpenseUpdateRequest): Promise<void>;
|
|
28
28
|
deleteExpense(userId: string, streamId: string): Promise<void>;
|
|
29
|
+
bulkDeleteExpenses(userId: string, streamIds: string[]): Promise<{
|
|
30
|
+
successCount: number;
|
|
31
|
+
failedCount: number;
|
|
32
|
+
}>;
|
|
29
33
|
getExpense(userId: string, streamId: string): Promise<ExpenseResponse>;
|
|
30
34
|
getExpensesByAccountAndMonth(userId: string, accountId: string, timeZone: string, month?: string, search?: string, sortByAmountAscending?: boolean, filters?: ExpenseFilterType[], category?: string): Promise<ExpensesByMonthResponse>;
|
|
31
35
|
getExpensesByAccountMonthAndDay(userId: string, accountId: string, timeZone: string, month?: string, search?: string, sortByAmountAscending?: boolean, filters?: ExpenseFilterType[], category?: string): Promise<ExpensesByMonthAndDayResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpenseController.d.ts","sourceRoot":"","sources":["../../../src/client/controllers/ExpenseController.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,sBAAsB,EAItB,UAAU,EAEX,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,6BAA6B,EAK7B,iBAAiB,EAEjB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EAEzB,0BAA0B,EAC1B,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAUlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAS5D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoB;gBAE5B,GAAG,EAAE,iBAAiB;IAIlC,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,UAAU,GAErB;IAED,OAAO,KAAK,mBAAmB,GAE9B;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,wBAAwB,GAEnC;IAED,OAAO,KAAK,gBAAgB,GAE3B;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,KAAK,kBAAkB,GAE7B;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,2BAA2B,GAEtC;IAED,OAAO,KAAK,6BAA6B,GAExC;YAEa,qBAAqB;IAkDnC,OAAO,KAAK,YAAY,GAEvB;YAEa,gBAAgB;IAU9B,OAAO,CAAC,qBAAqB;YAaf,eAAe;IAwDvB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ExpenseController.d.ts","sourceRoot":"","sources":["../../../src/client/controllers/ExpenseController.ts"],"names":[],"mappings":"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"}
|
|
@@ -204,6 +204,7 @@ class ExpenseController {
|
|
|
204
204
|
streamId,
|
|
205
205
|
version: 1,
|
|
206
206
|
systemGenerated: false,
|
|
207
|
+
bulkOperationId: request.bulkOperationId,
|
|
207
208
|
});
|
|
208
209
|
await this.expenseEventHandler.handleEvent(event);
|
|
209
210
|
this.logger.log("[ExpenseController.createExpense] Expense created", {
|
|
@@ -226,6 +227,8 @@ class ExpenseController {
|
|
|
226
227
|
if (uniqueTags.length > 0) {
|
|
227
228
|
await this.ensureTagsExist(userId, uniqueTags);
|
|
228
229
|
}
|
|
230
|
+
const bulkOperationId = (0, uuid_1.v4)();
|
|
231
|
+
const accountCounts = new Map();
|
|
229
232
|
const events = [];
|
|
230
233
|
for (let i = 0; i < requests.length; i++) {
|
|
231
234
|
const request = requests[i];
|
|
@@ -262,9 +265,11 @@ class ExpenseController {
|
|
|
262
265
|
streamId,
|
|
263
266
|
version: 1,
|
|
264
267
|
systemGenerated: false,
|
|
268
|
+
bulkOperationId,
|
|
265
269
|
});
|
|
266
270
|
events.push(event);
|
|
267
271
|
expenseIds.push(expenseId);
|
|
272
|
+
accountCounts.set(request.accountId, (accountCounts.get(request.accountId) ?? 0) + 1);
|
|
268
273
|
}
|
|
269
274
|
catch (err) {
|
|
270
275
|
errors.push({
|
|
@@ -274,7 +279,15 @@ class ExpenseController {
|
|
|
274
279
|
}
|
|
275
280
|
}
|
|
276
281
|
if (events.length > 0) {
|
|
277
|
-
await this.expenseEventHandler.
|
|
282
|
+
await this.expenseEventHandler.bulkHandleClientEvents(events);
|
|
283
|
+
}
|
|
284
|
+
for (const [accountId, count] of accountCounts) {
|
|
285
|
+
try {
|
|
286
|
+
await this.expenseEventHandler.createBulkOperationSummary(userId, accountId, count, "created", bulkOperationId);
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
this.logger.log("[ExpenseController.bulkCreate] Failed to create bulk summary", { accountId, error: err });
|
|
290
|
+
}
|
|
278
291
|
}
|
|
279
292
|
const response = {
|
|
280
293
|
expenseIds,
|
|
@@ -328,6 +341,7 @@ class ExpenseController {
|
|
|
328
341
|
streamId: expenseModel.streamId,
|
|
329
342
|
version: expenseModel.version + 1,
|
|
330
343
|
systemGenerated: false,
|
|
344
|
+
bulkOperationId: request.bulkOperationId,
|
|
331
345
|
});
|
|
332
346
|
await this.expenseEventHandler.handleEvent(event);
|
|
333
347
|
this.logger.log("[ExpenseController.updateExpense] Expense updated", {
|
|
@@ -357,6 +371,54 @@ class ExpenseController {
|
|
|
357
371
|
request: { userId, streamId },
|
|
358
372
|
});
|
|
359
373
|
}
|
|
374
|
+
async bulkDeleteExpenses(userId, streamIds) {
|
|
375
|
+
const bulkOperationId = (0, uuid_1.v4)();
|
|
376
|
+
const accountCounts = new Map();
|
|
377
|
+
const events = [];
|
|
378
|
+
let failedCount = 0;
|
|
379
|
+
for (const streamId of streamIds) {
|
|
380
|
+
try {
|
|
381
|
+
const expenseModel = await this.modelStore.getByStreamIdWhereDeletedIsFalse(streamId);
|
|
382
|
+
if (!expenseModel) {
|
|
383
|
+
failedCount++;
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
if (expenseModel.userId !== userId) {
|
|
387
|
+
failedCount++;
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
const event = new ExpenseEvents_1.ExpenseDeleted({
|
|
391
|
+
eventId: (0, uuid_1.v4)(),
|
|
392
|
+
userId,
|
|
393
|
+
streamId: expenseModel.streamId,
|
|
394
|
+
version: expenseModel.version + 1,
|
|
395
|
+
createdAt: Date.now(),
|
|
396
|
+
createdBy: userId,
|
|
397
|
+
systemGenerated: false,
|
|
398
|
+
bulkOperationId,
|
|
399
|
+
});
|
|
400
|
+
events.push(event);
|
|
401
|
+
accountCounts.set(expenseModel.accountId, (accountCounts.get(expenseModel.accountId) ?? 0) + 1);
|
|
402
|
+
}
|
|
403
|
+
catch (err) {
|
|
404
|
+
this.logger.log("[ExpenseController.bulkDeleteExpenses] Failed to build delete event", { streamId, error: err });
|
|
405
|
+
failedCount++;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (events.length > 0) {
|
|
409
|
+
await this.expenseEventHandler.bulkHandleClientEvents(events);
|
|
410
|
+
}
|
|
411
|
+
for (const [accountId, count] of accountCounts) {
|
|
412
|
+
try {
|
|
413
|
+
await this.expenseEventHandler.createBulkOperationSummary(userId, accountId, count, "deleted", bulkOperationId);
|
|
414
|
+
}
|
|
415
|
+
catch (err) {
|
|
416
|
+
this.logger.log("[ExpenseController.bulkDeleteExpenses] Failed to create bulk summary", { accountId, error: err });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
this.logger.log("[ExpenseController.bulkDeleteExpenses] Bulk delete completed", { userId, total: streamIds.length, successCount: events.length, failedCount });
|
|
420
|
+
return { successCount: events.length, failedCount };
|
|
421
|
+
}
|
|
360
422
|
async getExpense(userId, streamId) {
|
|
361
423
|
const expenseModel = await this.modelStore.getByStreamId(streamId);
|
|
362
424
|
if (!expenseModel) {
|