@cranberry-money/shared-services 4.0.0 → 8.0.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 (100) hide show
  1. package/package.json +4 -3
  2. package/dist/api/functional-client.d.ts +0 -66
  3. package/dist/api/functional-client.d.ts.map +0 -1
  4. package/dist/api/functional-client.js +0 -165
  5. package/dist/auth/functional/auth-operations.d.ts +0 -116
  6. package/dist/auth/functional/auth-operations.d.ts.map +0 -1
  7. package/dist/auth/functional/auth-operations.js +0 -246
  8. package/dist/auth/functional/auth-state.d.ts +0 -38
  9. package/dist/auth/functional/auth-state.d.ts.map +0 -1
  10. package/dist/auth/functional/auth-state.js +0 -87
  11. package/dist/auth/functional/token-storage.d.ts +0 -44
  12. package/dist/auth/functional/token-storage.d.ts.map +0 -1
  13. package/dist/auth/functional/token-storage.js +0 -178
  14. package/dist/auth/react/AuthProvider.d.ts +0 -92
  15. package/dist/auth/react/AuthProvider.d.ts.map +0 -1
  16. package/dist/auth/react/AuthProvider.js +0 -207
  17. package/dist/integration/blueberry-integration.d.ts +0 -21
  18. package/dist/integration/blueberry-integration.d.ts.map +0 -1
  19. package/dist/integration/blueberry-integration.js +0 -109
  20. package/dist/integration/index.d.ts +0 -8
  21. package/dist/integration/index.d.ts.map +0 -1
  22. package/dist/integration/index.js +0 -18
  23. package/dist/services/accounts.d.ts +0 -220
  24. package/dist/services/accounts.d.ts.map +0 -1
  25. package/dist/services/accounts.js +0 -175
  26. package/dist/services/banks.d.ts +0 -123
  27. package/dist/services/banks.d.ts.map +0 -1
  28. package/dist/services/banks.js +0 -151
  29. package/dist/services/cash-accounts.d.ts +0 -112
  30. package/dist/services/cash-accounts.d.ts.map +0 -1
  31. package/dist/services/cash-accounts.js +0 -222
  32. package/dist/services/documents.d.ts +0 -143
  33. package/dist/services/documents.d.ts.map +0 -1
  34. package/dist/services/documents.js +0 -253
  35. package/dist/services/factories/account-factory.d.ts +0 -16
  36. package/dist/services/factories/account-factory.d.ts.map +0 -1
  37. package/dist/services/factories/account-factory.js +0 -79
  38. package/dist/services/factories/auth-factory.d.ts +0 -23
  39. package/dist/services/factories/auth-factory.d.ts.map +0 -1
  40. package/dist/services/factories/auth-factory.js +0 -75
  41. package/dist/services/factories/bank-factory.d.ts +0 -16
  42. package/dist/services/factories/bank-factory.d.ts.map +0 -1
  43. package/dist/services/factories/bank-factory.js +0 -72
  44. package/dist/services/factories/cash-account-factory.d.ts +0 -16
  45. package/dist/services/factories/cash-account-factory.d.ts.map +0 -1
  46. package/dist/services/factories/cash-account-factory.js +0 -74
  47. package/dist/services/factories/document-factory.d.ts +0 -16
  48. package/dist/services/factories/document-factory.d.ts.map +0 -1
  49. package/dist/services/factories/document-factory.js +0 -85
  50. package/dist/services/factories/index.d.ts +0 -21
  51. package/dist/services/factories/index.d.ts.map +0 -1
  52. package/dist/services/factories/index.js +0 -40
  53. package/dist/services/factories/instrument-factory.d.ts +0 -16
  54. package/dist/services/factories/instrument-factory.d.ts.map +0 -1
  55. package/dist/services/factories/instrument-factory.js +0 -68
  56. package/dist/services/factories/master-factory.d.ts +0 -74
  57. package/dist/services/factories/master-factory.d.ts.map +0 -1
  58. package/dist/services/factories/master-factory.js +0 -183
  59. package/dist/services/factories/portfolio-factory.d.ts +0 -16
  60. package/dist/services/factories/portfolio-factory.d.ts.map +0 -1
  61. package/dist/services/factories/portfolio-factory.js +0 -74
  62. package/dist/services/factories/portfolio-template-factory.d.ts +0 -16
  63. package/dist/services/factories/portfolio-template-factory.d.ts.map +0 -1
  64. package/dist/services/factories/portfolio-template-factory.js +0 -76
  65. package/dist/services/factories/reference-data-factory.d.ts +0 -16
  66. package/dist/services/factories/reference-data-factory.d.ts.map +0 -1
  67. package/dist/services/factories/reference-data-factory.js +0 -86
  68. package/dist/services/factories/tax-residency-factory.d.ts +0 -16
  69. package/dist/services/factories/tax-residency-factory.d.ts.map +0 -1
  70. package/dist/services/factories/tax-residency-factory.js +0 -73
  71. package/dist/services/factories/trade-factory.d.ts +0 -16
  72. package/dist/services/factories/trade-factory.d.ts.map +0 -1
  73. package/dist/services/factories/trade-factory.js +0 -79
  74. package/dist/services/factories/types.d.ts +0 -250
  75. package/dist/services/factories/types.d.ts.map +0 -1
  76. package/dist/services/factories/types.js +0 -32
  77. package/dist/services/factories/withdrawal-factory.d.ts +0 -16
  78. package/dist/services/factories/withdrawal-factory.d.ts.map +0 -1
  79. package/dist/services/factories/withdrawal-factory.js +0 -78
  80. package/dist/services/instruments.d.ts +0 -138
  81. package/dist/services/instruments.d.ts.map +0 -1
  82. package/dist/services/instruments.js +0 -178
  83. package/dist/services/portfolio-templates.d.ts +0 -142
  84. package/dist/services/portfolio-templates.d.ts.map +0 -1
  85. package/dist/services/portfolio-templates.js +0 -201
  86. package/dist/services/portfolios.d.ts +0 -157
  87. package/dist/services/portfolios.d.ts.map +0 -1
  88. package/dist/services/portfolios.js +0 -144
  89. package/dist/services/reference-data.d.ts +0 -185
  90. package/dist/services/reference-data.d.ts.map +0 -1
  91. package/dist/services/reference-data.js +0 -245
  92. package/dist/services/tax-residencies.d.ts +0 -83
  93. package/dist/services/tax-residencies.d.ts.map +0 -1
  94. package/dist/services/tax-residencies.js +0 -179
  95. package/dist/services/trades.d.ts +0 -190
  96. package/dist/services/trades.d.ts.map +0 -1
  97. package/dist/services/trades.js +0 -207
  98. package/dist/services/withdrawals.d.ts +0 -236
  99. package/dist/services/withdrawals.d.ts.map +0 -1
  100. package/dist/services/withdrawals.js +0 -345
@@ -1,179 +0,0 @@
1
- "use strict";
2
- /**
3
- * Tax Residency Services - Pure Functional Implementation
4
- *
5
- * Tax residency management operations as pure functions with explicit dependencies.
6
- * No global state, no side effects - everything is explicit and testable.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.canHaveMultipleResidencies = exports.validateTaxIdentificationNumber = exports.formatTaxResidencyPeriod = exports.isTaxResidencyActive = exports.getTaxResidenciesByCountry = exports.getPrimaryTaxResidency = exports.getActiveTaxResidencies = exports.getUserTaxResidencies = exports.setPrimaryTaxResidency = exports.deleteTaxResidency = exports.updateTaxResidency = exports.createTaxResidency = exports.getTaxResidency = exports.getTaxResidencies = void 0;
10
- // Tax residency operations with explicit dependencies
11
- const getTaxResidencies = async ({ apiClient }, filters) => {
12
- const params = {};
13
- if (filters?.userProfile)
14
- params.user_profile = filters.userProfile;
15
- if (filters?.country)
16
- params.country = filters.country;
17
- if (filters?.isPrimary !== undefined)
18
- params.is_primary = String(filters.isPrimary);
19
- if (filters?.isActive !== undefined)
20
- params.is_active = String(filters.isActive);
21
- if (filters?.ordering) {
22
- params.ordering = filters.ordering;
23
- }
24
- else {
25
- // Default ordering: primary first, then by country name
26
- params.ordering = '-is_primary,country';
27
- }
28
- return apiClient.get('/api/tax-residencies/', { params });
29
- };
30
- exports.getTaxResidencies = getTaxResidencies;
31
- const getTaxResidency = async ({ apiClient }, uuid) => {
32
- if (!uuid?.trim()) {
33
- throw new Error('Tax residency UUID is required');
34
- }
35
- return apiClient.get(`/api/tax-residencies/${uuid}/`);
36
- };
37
- exports.getTaxResidency = getTaxResidency;
38
- const createTaxResidency = async ({ apiClient }, data) => {
39
- // Validation
40
- if (!data.userProfile?.trim()) {
41
- throw new Error('User profile UUID is required');
42
- }
43
- if (!data.country?.trim()) {
44
- throw new Error('Country UUID is required');
45
- }
46
- if (!data.startDate?.trim()) {
47
- throw new Error('Start date is required');
48
- }
49
- // Validate date format (YYYY-MM-DD)
50
- const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
51
- if (!dateRegex.test(data.startDate)) {
52
- throw new Error('Start date must be in YYYY-MM-DD format');
53
- }
54
- if (data.endDate && !dateRegex.test(data.endDate)) {
55
- throw new Error('End date must be in YYYY-MM-DD format');
56
- }
57
- // Validate end date is after start date
58
- if (data.endDate && new Date(data.endDate) <= new Date(data.startDate)) {
59
- throw new Error('End date must be after start date');
60
- }
61
- return apiClient.post('/api/tax-residencies/', data);
62
- };
63
- exports.createTaxResidency = createTaxResidency;
64
- const updateTaxResidency = async ({ apiClient }, uuid, data) => {
65
- if (!uuid?.trim()) {
66
- throw new Error('Tax residency UUID is required');
67
- }
68
- // Validate date formats if provided
69
- const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
70
- if (data.startDate && !dateRegex.test(data.startDate)) {
71
- throw new Error('Start date must be in YYYY-MM-DD format');
72
- }
73
- if (data.endDate && !dateRegex.test(data.endDate)) {
74
- throw new Error('End date must be in YYYY-MM-DD format');
75
- }
76
- return apiClient.patch(`/api/tax-residencies/${uuid}/`, data);
77
- };
78
- exports.updateTaxResidency = updateTaxResidency;
79
- const deleteTaxResidency = async ({ apiClient }, uuid) => {
80
- if (!uuid?.trim()) {
81
- throw new Error('Tax residency UUID is required');
82
- }
83
- await apiClient.delete(`/api/tax-residencies/${uuid}/`);
84
- };
85
- exports.deleteTaxResidency = deleteTaxResidency;
86
- const setPrimaryTaxResidency = async ({ apiClient }, uuid) => {
87
- if (!uuid?.trim()) {
88
- throw new Error('Tax residency UUID is required');
89
- }
90
- return apiClient.post(`/api/tax-residencies/${uuid}/set-primary/`, {});
91
- };
92
- exports.setPrimaryTaxResidency = setPrimaryTaxResidency;
93
- // Helper functions
94
- const getUserTaxResidencies = async ({ apiClient }, userProfileUuid) => {
95
- if (!userProfileUuid?.trim()) {
96
- throw new Error('User profile UUID is required');
97
- }
98
- return (0, exports.getTaxResidencies)({ apiClient }, {
99
- userProfile: userProfileUuid,
100
- ordering: '-is_primary,start_date',
101
- });
102
- };
103
- exports.getUserTaxResidencies = getUserTaxResidencies;
104
- const getActiveTaxResidencies = async ({ apiClient }, userProfileUuid) => {
105
- return (0, exports.getTaxResidencies)({ apiClient }, {
106
- userProfile: userProfileUuid,
107
- isActive: true,
108
- ordering: '-is_primary,country',
109
- });
110
- };
111
- exports.getActiveTaxResidencies = getActiveTaxResidencies;
112
- const getPrimaryTaxResidency = async ({ apiClient }, userProfileUuid) => {
113
- if (!userProfileUuid?.trim()) {
114
- throw new Error('User profile UUID is required');
115
- }
116
- const response = await (0, exports.getTaxResidencies)({ apiClient }, {
117
- userProfile: userProfileUuid,
118
- isPrimary: true,
119
- isActive: true,
120
- });
121
- return response.results[0] || null;
122
- };
123
- exports.getPrimaryTaxResidency = getPrimaryTaxResidency;
124
- const getTaxResidenciesByCountry = async ({ apiClient }, countryUuid, userProfileUuid) => {
125
- if (!countryUuid?.trim()) {
126
- throw new Error('Country UUID is required');
127
- }
128
- return (0, exports.getTaxResidencies)({ apiClient }, {
129
- country: countryUuid,
130
- userProfile: userProfileUuid,
131
- ordering: '-is_primary,start_date',
132
- });
133
- };
134
- exports.getTaxResidenciesByCountry = getTaxResidenciesByCountry;
135
- // Utility functions
136
- const isTaxResidencyActive = (taxResidency) => {
137
- if (!taxResidency.endDate)
138
- return true;
139
- return new Date(taxResidency.endDate) >= new Date();
140
- };
141
- exports.isTaxResidencyActive = isTaxResidencyActive;
142
- const formatTaxResidencyPeriod = (taxResidency) => {
143
- const startDate = new Date(taxResidency.startDate).toLocaleDateString();
144
- if (!taxResidency.endDate) {
145
- return `Since ${startDate}`;
146
- }
147
- const endDate = new Date(taxResidency.endDate).toLocaleDateString();
148
- return `${startDate} - ${endDate}`;
149
- };
150
- exports.formatTaxResidencyPeriod = formatTaxResidencyPeriod;
151
- const validateTaxIdentificationNumber = (tin, countryCode) => {
152
- // Basic validation - can be enhanced with country-specific rules
153
- if (!tin?.trim())
154
- return false;
155
- // Remove spaces and special characters
156
- const cleanTin = tin.replace(/[\s-]/g, '');
157
- // Country-specific validation rules (examples)
158
- switch (countryCode) {
159
- case 'AU':
160
- // Australian TFN: 8 or 9 digits
161
- return /^\d{8,9}$/.test(cleanTin);
162
- case 'US':
163
- // US SSN: 9 digits (XXX-XX-XXXX format)
164
- return /^\d{9}$/.test(cleanTin);
165
- case 'GB':
166
- // UK NI Number: 2 letters, 6 digits, 1 letter
167
- return /^[A-Z]{2}\d{6}[A-Z]$/.test(cleanTin.toUpperCase());
168
- default:
169
- // Generic validation: at least 6 alphanumeric characters
170
- return /^[A-Z0-9]{6,}$/i.test(cleanTin);
171
- }
172
- };
173
- exports.validateTaxIdentificationNumber = validateTaxIdentificationNumber;
174
- const canHaveMultipleResidencies = (countryCode) => {
175
- // Some countries allow dual/multiple tax residencies
176
- const multiResidencyCountries = ['AU', 'CA', 'NZ', 'GB', 'IE'];
177
- return multiResidencyCountries.includes(countryCode);
178
- };
179
- exports.canHaveMultipleResidencies = canHaveMultipleResidencies;
@@ -1,190 +0,0 @@
1
- /**
2
- * Trade Services - Pure Functional Implementation
3
- *
4
- * Complete trading system including Target Trades and Trade Sheets workflow.
5
- * No global state, no side effects - everything is explicit and testable.
6
- */
7
- import type { ApiClient } from '../api/functional-client';
8
- export type TradeAction = 'BUY' | 'SELL';
9
- export type TargetTradeStatus = 'PENDING' | 'APPROVED' | 'SUBMITTED' | 'CANCELLED' | 'EXPIRED';
10
- export type TradeStatus = 'EXECUTED' | 'SETTLED' | 'CANCELLED' | 'FAILED';
11
- export interface TargetTrade {
12
- readonly uuid: string;
13
- readonly targetTradesheet: string;
14
- readonly instrument: string;
15
- readonly instrumentSymbol: string;
16
- readonly instrumentName: string;
17
- readonly quantity: number;
18
- readonly action: TradeAction;
19
- readonly targetPrice: string;
20
- readonly status: TargetTradeStatus;
21
- readonly expiresAt: string | null;
22
- readonly createdAt: string;
23
- readonly updatedAt: string;
24
- }
25
- export interface TargetTradeSheet {
26
- readonly uuid: string;
27
- readonly portfolio: string;
28
- readonly status: string;
29
- readonly submittedAt: string | null;
30
- readonly createdAt: string;
31
- readonly updatedAt: string;
32
- }
33
- export interface TradeSheet {
34
- readonly uuid: string;
35
- readonly portfolio: string;
36
- readonly target_sheet: string;
37
- readonly created_at: string;
38
- readonly updated_at: string;
39
- }
40
- export interface Trade {
41
- readonly uuid: string;
42
- readonly tradesheet: string;
43
- readonly targetTrade: string | null;
44
- readonly instrument: string;
45
- readonly instrumentSymbol: string;
46
- readonly instrumentName: string;
47
- readonly quantity: number;
48
- readonly action: TradeAction;
49
- readonly executedPrice: string;
50
- readonly executedDate: string;
51
- readonly status: TradeStatus;
52
- readonly settlementDate: string | null;
53
- readonly currency: string | null;
54
- readonly createdAt: string;
55
- readonly updatedAt: string;
56
- }
57
- export interface TargetTradePayload {
58
- readonly targetTradesheet: string;
59
- readonly instrument: string;
60
- readonly quantity: number;
61
- readonly action: TradeAction;
62
- readonly targetPrice: string | number;
63
- }
64
- export interface TargetTradeSheetPayload {
65
- readonly portfolio: string;
66
- }
67
- export interface TargetTradeFilters {
68
- readonly portfolio?: string;
69
- readonly instrument?: string;
70
- readonly action?: TradeAction;
71
- readonly status?: TargetTradeStatus;
72
- readonly start_date?: string;
73
- readonly end_date?: string;
74
- readonly min_price?: number;
75
- readonly max_price?: number;
76
- }
77
- export interface TargetTradeSheetFilters {
78
- readonly portfolio?: string;
79
- readonly startDate?: string;
80
- readonly endDate?: string;
81
- }
82
- export interface TradeFilters {
83
- readonly portfolio?: string;
84
- readonly instrument?: string;
85
- readonly action?: TradeAction;
86
- readonly status?: TradeStatus;
87
- readonly currency?: string;
88
- readonly start_date?: string;
89
- readonly end_date?: string;
90
- readonly settlement_start_date?: string;
91
- readonly settlement_end_date?: string;
92
- readonly min_price?: number;
93
- readonly max_price?: number;
94
- readonly tradesheet?: string;
95
- readonly target_trade?: string;
96
- }
97
- export interface TradeSheetFilters {
98
- readonly portfolio?: string;
99
- readonly start_date?: string;
100
- readonly end_date?: string;
101
- }
102
- export interface TargetTradeSheetApprovalResponse {
103
- readonly uuid: string;
104
- readonly status: string;
105
- readonly approvedAt: string;
106
- readonly approvedTradesCount: number;
107
- readonly message?: string;
108
- }
109
- export interface TargetTradeSheetCleanResponse {
110
- readonly uuid: string;
111
- readonly status: string;
112
- readonly deletedTradesCount: number;
113
- readonly message?: string;
114
- }
115
- export interface PaginatedTargetTrades {
116
- readonly results: TargetTrade[];
117
- readonly count: number;
118
- readonly next: string | null;
119
- readonly previous: string | null;
120
- }
121
- export interface PaginatedTargetTradeSheets {
122
- readonly results: TargetTradeSheet[];
123
- readonly count: number;
124
- readonly next: string | null;
125
- readonly previous: string | null;
126
- }
127
- export interface PaginatedTrades {
128
- readonly results: Trade[];
129
- readonly count: number;
130
- readonly next: string | null;
131
- readonly previous: string | null;
132
- }
133
- export interface PaginatedTradeSheets {
134
- readonly results: TradeSheet[];
135
- readonly count: number;
136
- readonly next: string | null;
137
- readonly previous: string | null;
138
- }
139
- export declare const getTargetTrades: ({ apiClient }: {
140
- apiClient: ApiClient;
141
- }, filters?: TargetTradeFilters) => Promise<PaginatedTargetTrades>;
142
- export declare const getTargetTrade: ({ apiClient }: {
143
- apiClient: ApiClient;
144
- }, uuid: string) => Promise<TargetTrade>;
145
- export declare const createTargetTrade: ({ apiClient }: {
146
- apiClient: ApiClient;
147
- }, data: TargetTradePayload) => Promise<TargetTrade>;
148
- export declare const updateTargetTrade: ({ apiClient }: {
149
- apiClient: ApiClient;
150
- }, uuid: string, data: Partial<TargetTradePayload>) => Promise<TargetTrade>;
151
- export declare const deleteTargetTrade: ({ apiClient }: {
152
- apiClient: ApiClient;
153
- }, uuid: string) => Promise<void>;
154
- export declare const getTargetTradeSheets: ({ apiClient }: {
155
- apiClient: ApiClient;
156
- }, filters?: TargetTradeSheetFilters) => Promise<PaginatedTargetTradeSheets>;
157
- export declare const getTargetTradeSheet: ({ apiClient }: {
158
- apiClient: ApiClient;
159
- }, uuid: string) => Promise<TargetTradeSheet>;
160
- export declare const createTargetTradeSheet: ({ apiClient }: {
161
- apiClient: ApiClient;
162
- }, data: TargetTradeSheetPayload) => Promise<TargetTradeSheet>;
163
- export declare const updateTargetTradeSheet: ({ apiClient }: {
164
- apiClient: ApiClient;
165
- }, uuid: string, data: Partial<TargetTradeSheetPayload>) => Promise<TargetTradeSheet>;
166
- export declare const deleteTargetTradeSheet: ({ apiClient }: {
167
- apiClient: ApiClient;
168
- }, uuid: string) => Promise<void>;
169
- export declare const approveTargetTradeSheet: ({ apiClient }: {
170
- apiClient: ApiClient;
171
- }, uuid: string) => Promise<TargetTradeSheetApprovalResponse>;
172
- export declare const cleanTargetTradeSheet: ({ apiClient }: {
173
- apiClient: ApiClient;
174
- }, uuid: string) => Promise<TargetTradeSheetCleanResponse>;
175
- export declare const getOrCreateDraftTargetTradeSheet: ({ apiClient }: {
176
- apiClient: ApiClient;
177
- }, portfolioUuid: string) => Promise<string>;
178
- export declare const getTrades: ({ apiClient }: {
179
- apiClient: ApiClient;
180
- }, filters?: TradeFilters) => Promise<PaginatedTrades>;
181
- export declare const getTrade: ({ apiClient }: {
182
- apiClient: ApiClient;
183
- }, uuid: string) => Promise<Trade>;
184
- export declare const getTradeSheets: ({ apiClient }: {
185
- apiClient: ApiClient;
186
- }, filters?: TradeSheetFilters) => Promise<PaginatedTradeSheets>;
187
- export declare const getTradeSheet: ({ apiClient }: {
188
- apiClient: ApiClient;
189
- }, uuid: string) => Promise<TradeSheet>;
190
- //# sourceMappingURL=trades.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trades.d.ts","sourceRoot":"","sources":["../../src/services/trades.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAO1D,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AACzC,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAC/F,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAG1E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAGD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAGD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAMD,eAAO,MAAM,eAAe,GAC1B,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,UAAU,kBAAkB,KAC3B,OAAO,CAAC,qBAAqB,CAa/B,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,KACX,OAAO,CAAC,WAAW,CAKrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,kBAAkB,KACvB,OAAO,CAAC,WAAW,CAiBrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,EACZ,MAAM,OAAO,CAAC,kBAAkB,CAAC,KAChC,OAAO,CAAC,WAAW,CAUrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,KACX,OAAO,CAAC,IAAI,CAKd,CAAC;AAMF,eAAO,MAAM,oBAAoB,GAC/B,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,UAAU,uBAAuB,KAChC,OAAO,CAAC,0BAA0B,CAQpC,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,KACX,OAAO,CAAC,gBAAgB,CAK1B,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,uBAAuB,KAC5B,OAAO,CAAC,gBAAgB,CAK1B,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,EACZ,MAAM,OAAO,CAAC,uBAAuB,CAAC,KACrC,OAAO,CAAC,gBAAgB,CAK1B,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,KACX,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,KACX,OAAO,CAAC,gCAAgC,CAQ1C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,KACX,OAAO,CAAC,6BAA6B,CAQvC,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,eAAe,MAAM,KACpB,OAAO,CAAC,MAAM,CAgBhB,CAAC;AAMF,eAAO,MAAM,SAAS,GACpB,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,UAAU,YAAY,KACrB,OAAO,CAAC,eAAe,CAkBzB,CAAC;AAEF,eAAO,MAAM,QAAQ,GACnB,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,KACX,OAAO,CAAC,KAAK,CAKf,CAAC;AAMF,eAAO,MAAM,cAAc,GACzB,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,UAAU,iBAAiB,KAC1B,OAAO,CAAC,oBAAoB,CAQ9B,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,eAAe;IAAE,SAAS,EAAE,SAAS,CAAA;CAAE,EACvC,MAAM,MAAM,KACX,OAAO,CAAC,UAAU,CAKpB,CAAC"}
@@ -1,207 +0,0 @@
1
- "use strict";
2
- /**
3
- * Trade Services - Pure Functional Implementation
4
- *
5
- * Complete trading system including Target Trades and Trade Sheets workflow.
6
- * No global state, no side effects - everything is explicit and testable.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.getTradeSheet = exports.getTradeSheets = exports.getTrade = exports.getTrades = exports.getOrCreateDraftTargetTradeSheet = exports.cleanTargetTradeSheet = exports.approveTargetTradeSheet = exports.deleteTargetTradeSheet = exports.updateTargetTradeSheet = exports.createTargetTradeSheet = exports.getTargetTradeSheet = exports.getTargetTradeSheets = exports.deleteTargetTrade = exports.updateTargetTrade = exports.createTargetTrade = exports.getTargetTrade = exports.getTargetTrades = void 0;
10
- // =============================================================================
11
- // TARGET TRADES OPERATIONS
12
- // =============================================================================
13
- const getTargetTrades = async ({ apiClient }, filters) => {
14
- const params = {};
15
- if (filters?.portfolio)
16
- params.portfolio = filters.portfolio;
17
- if (filters?.instrument)
18
- params.instrument = filters.instrument;
19
- if (filters?.action)
20
- params.action = filters.action;
21
- if (filters?.status)
22
- params.status = filters.status;
23
- if (filters?.start_date)
24
- params.start_date = filters.start_date;
25
- if (filters?.end_date)
26
- params.end_date = filters.end_date;
27
- if (filters?.min_price !== undefined)
28
- params.min_price = String(filters.min_price);
29
- if (filters?.max_price !== undefined)
30
- params.max_price = String(filters.max_price);
31
- return apiClient.get('/api/target-trades/', { params });
32
- };
33
- exports.getTargetTrades = getTargetTrades;
34
- const getTargetTrade = async ({ apiClient }, uuid) => {
35
- if (!uuid?.trim()) {
36
- throw new Error('Target trade UUID is required');
37
- }
38
- return apiClient.get(`/api/target-trades/${uuid}/`);
39
- };
40
- exports.getTargetTrade = getTargetTrade;
41
- const createTargetTrade = async ({ apiClient }, data) => {
42
- if (!data.targetTradesheet?.trim()) {
43
- throw new Error('Target trade sheet UUID is required');
44
- }
45
- if (!data.instrument?.trim()) {
46
- throw new Error('Instrument UUID is required');
47
- }
48
- if (!data.quantity || data.quantity <= 0) {
49
- throw new Error('Valid quantity is required');
50
- }
51
- const payload = {
52
- ...data,
53
- targetPrice: String(data.targetPrice),
54
- };
55
- return apiClient.post('/api/target-trades/', payload);
56
- };
57
- exports.createTargetTrade = createTargetTrade;
58
- const updateTargetTrade = async ({ apiClient }, uuid, data) => {
59
- if (!uuid?.trim()) {
60
- throw new Error('Target trade UUID is required');
61
- }
62
- const payload = data.targetPrice !== undefined
63
- ? { ...data, targetPrice: String(data.targetPrice) }
64
- : data;
65
- return apiClient.patch(`/api/target-trades/${uuid}/`, payload);
66
- };
67
- exports.updateTargetTrade = updateTargetTrade;
68
- const deleteTargetTrade = async ({ apiClient }, uuid) => {
69
- if (!uuid?.trim()) {
70
- throw new Error('Target trade UUID is required');
71
- }
72
- await apiClient.delete(`/api/target-trades/${uuid}/`);
73
- };
74
- exports.deleteTargetTrade = deleteTargetTrade;
75
- // =============================================================================
76
- // TARGET TRADE SHEETS OPERATIONS
77
- // =============================================================================
78
- const getTargetTradeSheets = async ({ apiClient }, filters) => {
79
- const params = {};
80
- if (filters?.portfolio)
81
- params.portfolio = filters.portfolio;
82
- if (filters?.startDate)
83
- params.start_date = filters.startDate;
84
- if (filters?.endDate)
85
- params.end_date = filters.endDate;
86
- return apiClient.get('/api/target-trade-sheets/', { params });
87
- };
88
- exports.getTargetTradeSheets = getTargetTradeSheets;
89
- const getTargetTradeSheet = async ({ apiClient }, uuid) => {
90
- if (!uuid?.trim()) {
91
- throw new Error('Target trade sheet UUID is required');
92
- }
93
- return apiClient.get(`/api/target-trade-sheets/${uuid}/`);
94
- };
95
- exports.getTargetTradeSheet = getTargetTradeSheet;
96
- const createTargetTradeSheet = async ({ apiClient }, data) => {
97
- if (!data.portfolio?.trim()) {
98
- throw new Error('Portfolio UUID is required');
99
- }
100
- return apiClient.post('/api/target-trade-sheets/', data);
101
- };
102
- exports.createTargetTradeSheet = createTargetTradeSheet;
103
- const updateTargetTradeSheet = async ({ apiClient }, uuid, data) => {
104
- if (!uuid?.trim()) {
105
- throw new Error('Target trade sheet UUID is required');
106
- }
107
- return apiClient.patch(`/api/target-trade-sheets/${uuid}/`, data);
108
- };
109
- exports.updateTargetTradeSheet = updateTargetTradeSheet;
110
- const deleteTargetTradeSheet = async ({ apiClient }, uuid) => {
111
- if (!uuid?.trim()) {
112
- throw new Error('Target trade sheet UUID is required');
113
- }
114
- await apiClient.delete(`/api/target-trade-sheets/${uuid}/`);
115
- };
116
- exports.deleteTargetTradeSheet = deleteTargetTradeSheet;
117
- const approveTargetTradeSheet = async ({ apiClient }, uuid) => {
118
- if (!uuid?.trim()) {
119
- throw new Error('Target trade sheet UUID is required');
120
- }
121
- return apiClient.post(`/api/target-trade-sheets/${uuid}/approve/`, {});
122
- };
123
- exports.approveTargetTradeSheet = approveTargetTradeSheet;
124
- const cleanTargetTradeSheet = async ({ apiClient }, uuid) => {
125
- if (!uuid?.trim()) {
126
- throw new Error('Target trade sheet UUID is required');
127
- }
128
- return apiClient.post(`/api/target-trade-sheets/${uuid}/clean/`, {});
129
- };
130
- exports.cleanTargetTradeSheet = cleanTargetTradeSheet;
131
- const getOrCreateDraftTargetTradeSheet = async ({ apiClient }, portfolioUuid) => {
132
- if (!portfolioUuid?.trim()) {
133
- throw new Error('Portfolio UUID is required');
134
- }
135
- // Check if there's already a draft target trade sheet
136
- const response = await (0, exports.getTargetTradeSheets)({ apiClient }, { portfolio: portfolioUuid });
137
- const draftSheet = response.results.find(sheet => sheet.status === 'DRAFT');
138
- if (draftSheet) {
139
- return draftSheet.uuid;
140
- }
141
- // Create new draft target trade sheet
142
- const newSheet = await (0, exports.createTargetTradeSheet)({ apiClient }, { portfolio: portfolioUuid });
143
- return newSheet.uuid;
144
- };
145
- exports.getOrCreateDraftTargetTradeSheet = getOrCreateDraftTargetTradeSheet;
146
- // =============================================================================
147
- // TRADES OPERATIONS (READ-ONLY)
148
- // =============================================================================
149
- const getTrades = async ({ apiClient }, filters) => {
150
- const params = {};
151
- if (filters?.portfolio)
152
- params.portfolio = filters.portfolio;
153
- if (filters?.instrument)
154
- params.instrument = filters.instrument;
155
- if (filters?.action)
156
- params.action = filters.action;
157
- if (filters?.status)
158
- params.status = filters.status;
159
- if (filters?.currency)
160
- params.currency = filters.currency;
161
- if (filters?.start_date)
162
- params.start_date = filters.start_date;
163
- if (filters?.end_date)
164
- params.end_date = filters.end_date;
165
- if (filters?.settlement_start_date)
166
- params.settlement_start_date = filters.settlement_start_date;
167
- if (filters?.settlement_end_date)
168
- params.settlement_end_date = filters.settlement_end_date;
169
- if (filters?.min_price !== undefined)
170
- params.min_price = String(filters.min_price);
171
- if (filters?.max_price !== undefined)
172
- params.max_price = String(filters.max_price);
173
- if (filters?.tradesheet)
174
- params.tradesheet = filters.tradesheet;
175
- if (filters?.target_trade)
176
- params.target_trade = filters.target_trade;
177
- return apiClient.get('/api/trades/', { params });
178
- };
179
- exports.getTrades = getTrades;
180
- const getTrade = async ({ apiClient }, uuid) => {
181
- if (!uuid?.trim()) {
182
- throw new Error('Trade UUID is required');
183
- }
184
- return apiClient.get(`/api/trades/${uuid}/`);
185
- };
186
- exports.getTrade = getTrade;
187
- // =============================================================================
188
- // TRADE SHEETS OPERATIONS (READ-ONLY)
189
- // =============================================================================
190
- const getTradeSheets = async ({ apiClient }, filters) => {
191
- const params = {};
192
- if (filters?.portfolio)
193
- params.portfolio = filters.portfolio;
194
- if (filters?.start_date)
195
- params.start_date = filters.start_date;
196
- if (filters?.end_date)
197
- params.end_date = filters.end_date;
198
- return apiClient.get('/api/trade-sheets/', { params });
199
- };
200
- exports.getTradeSheets = getTradeSheets;
201
- const getTradeSheet = async ({ apiClient }, uuid) => {
202
- if (!uuid?.trim()) {
203
- throw new Error('Trade sheet UUID is required');
204
- }
205
- return apiClient.get(`/api/trade-sheets/${uuid}/`);
206
- };
207
- exports.getTradeSheet = getTradeSheet;