@dalmore/api-contracts 0.0.0-dev.785b227 → 0.0.0-dev.801385

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 (60) hide show
  1. package/common/types/account-contact.types.ts +2 -1
  2. package/common/types/account-manager.types.ts +3 -7
  3. package/common/types/account-setting.types.ts +65 -0
  4. package/common/types/account.types.ts +1 -0
  5. package/common/types/activity.types.ts +1 -1
  6. package/common/types/auth.types.ts +7 -18
  7. package/common/types/bonus-tier.types.ts +33 -0
  8. package/common/types/cart.types.ts +4 -1
  9. package/common/types/common.types.ts +38 -6
  10. package/common/types/contact-us.types.ts +6 -2
  11. package/common/types/covered-person.types.ts +2 -1
  12. package/common/types/dashboard.types.ts +2 -9
  13. package/common/types/disbursements.types.ts +119 -3
  14. package/common/types/escrow-account.types.ts +3 -3
  15. package/common/types/file.types.ts +20 -4
  16. package/common/types/i-will-do-it-later.types.ts +68 -0
  17. package/common/types/index.ts +2 -0
  18. package/common/types/individuals.types.ts +5 -17
  19. package/common/types/investor-account.types.ts +2 -1
  20. package/common/types/invite.types.ts +27 -1
  21. package/common/types/issuer-offering.types.ts +13 -17
  22. package/common/types/issuer-payment-method.types.ts +41 -0
  23. package/common/types/issuer.types.ts +9 -0
  24. package/common/types/legal-entity.types.ts +3 -2
  25. package/common/types/note.types.ts +1 -1
  26. package/common/types/notification.types.ts +515 -29
  27. package/common/types/offering.types.ts +4 -9
  28. package/common/types/site-settings.types.ts +2 -1
  29. package/common/types/site.types.ts +2 -9
  30. package/common/types/{trade-line-item.type.ts → trade-line-item.types.ts} +2 -9
  31. package/common/types/trade.types.ts +48 -2
  32. package/common/types/transaction.types.ts +12 -1
  33. package/common/types/trusted-contact.types.ts +7 -7
  34. package/common/types/user.types.ts +17 -33
  35. package/contracts/clients/cart/index.ts +21 -1
  36. package/contracts/clients/index.ts +6 -0
  37. package/contracts/clients/issuer-payment-methods/index.ts +39 -0
  38. package/contracts/clients/payment-methods/index.ts +85 -0
  39. package/contracts/clients/trade-line-items/index.ts +1 -1
  40. package/contracts/clients/trades/index.ts +1 -1
  41. package/contracts/clients/transactions/index.ts +37 -0
  42. package/contracts/compliance/account-settings/index.ts +59 -0
  43. package/contracts/compliance/auth/index.ts +4 -3
  44. package/contracts/compliance/bonus-tiers/index.ts +21 -2
  45. package/contracts/compliance/index.ts +4 -0
  46. package/contracts/compliance/invites/index.ts +4 -12
  47. package/contracts/compliance/notification-channels/index.ts +251 -0
  48. package/contracts/compliance/trade-line-items/index.ts +1 -1
  49. package/contracts/compliance/trades/index.ts +19 -0
  50. package/contracts/compliance/users/index.ts +21 -0
  51. package/contracts/investors/bonus-tiers/index.ts +18 -0
  52. package/contracts/investors/individuals/index.ts +22 -0
  53. package/contracts/investors/trade-line-items/index.ts +1 -1
  54. package/contracts/issuers/account-settings/index.ts +36 -0
  55. package/contracts/issuers/auth/index.ts +4 -3
  56. package/contracts/issuers/bonus-tiers/index.ts +18 -0
  57. package/contracts/issuers/disbursements/index.ts +48 -12
  58. package/contracts/issuers/index.ts +4 -0
  59. package/contracts/issuers/notification-channels/index.ts +251 -0
  60. package/package.json +1 -1
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ import { PortalType, TargetTableEnum } from './common.types';
3
+ import { TaskPriority, TaskType } from './task.types';
4
+
5
+ export enum IWillDoItLaterType {
6
+ KYC = 'KYC',
7
+ // Future types can be added here:
8
+ // AIC = 'AIC',
9
+ // AML = 'AML',
10
+ }
11
+
12
+ export const IWillDoItLaterBodySchema = z.object({
13
+ type: z.nativeEnum(IWillDoItLaterType).default(IWillDoItLaterType.KYC),
14
+ });
15
+
16
+ export type IWillDoItLaterBodyType = z.infer<typeof IWillDoItLaterBodySchema>;
17
+
18
+ export const IWillDoItLaterResponseSchema = z.object({
19
+ message: z.string(),
20
+ });
21
+
22
+ export type IWillDoItLaterResponseType = z.infer<
23
+ typeof IWillDoItLaterResponseSchema
24
+ >;
25
+
26
+ /**
27
+ * @description Context required for processing "I'll do it later" actions.
28
+ */
29
+ export interface IWillDoItLaterContext {
30
+ /** The ID of the target entity */
31
+ targetId: string;
32
+ /** The table name of the target entity */
33
+ targetTable: (typeof TargetTableEnum)[number];
34
+ /** The account ID associated with the action */
35
+ accountId: string;
36
+ /** The user ID who will be assigned the task */
37
+ assigneeId: string;
38
+ }
39
+
40
+ /**
41
+ * @description Configuration for each "I'll do it later" action type.
42
+ * Maps action types to their corresponding task configuration.
43
+ */
44
+ export interface IWillDoItLaterTaskConfig {
45
+ taskType: TaskType;
46
+ portalType: PortalType;
47
+ title: string;
48
+ description: string;
49
+ priority: TaskPriority;
50
+ }
51
+
52
+ /**
53
+ * @description Mapping of "I'll do it later" types to their task configurations.
54
+ * This allows for easy extension of new action types without modifying the service logic.
55
+ */
56
+ export const IWillDoItLaterTaskConfigMap: Record<
57
+ IWillDoItLaterType,
58
+ IWillDoItLaterTaskConfig
59
+ > = {
60
+ [IWillDoItLaterType.KYC]: {
61
+ taskType: TaskType.COMPLETE_KYC,
62
+ portalType: PortalType.INVESTOR,
63
+ title: 'Complete KYC',
64
+ description:
65
+ 'We are unable to verify your KYC information. Please complete your KYC.',
66
+ priority: TaskPriority.HIGH,
67
+ },
68
+ };
@@ -42,6 +42,8 @@ export * from './domain-filter.types';
42
42
  export * from './aic.types';
43
43
  export * from './default-theme-config.types';
44
44
  export * from './offering-reports.types';
45
+ export * from './i-will-do-it-later.types';
46
+ export * from './payment-methods.types';
45
47
 
46
48
  export enum Versions {
47
49
  V1 = 'v1',
@@ -12,12 +12,11 @@ import {
12
12
  InvestorAccountType,
13
13
  SetupStatusType,
14
14
  SetupStepType,
15
- ComplianceReview,
16
15
  RetirementAccountType,
17
- TradeStatus,
18
16
  EmploymentStatus,
19
17
  SourceOfIncome,
20
18
  AMLProvider,
19
+ EmailSchema,
21
20
  } from './common.types';
22
21
  import { IBaseEntity } from './entity.types';
23
22
  import { IInvestorAccount } from './investor-account.types';
@@ -60,8 +59,8 @@ export enum aicQuestionnaireQuestionType {
60
59
  }
61
60
 
62
61
  export enum FilterBy {
63
- TRADE = 'TRADE',
64
- INVESTOR = 'INVESTOR',
62
+ ALL = 'ALL',
63
+ PENDING_TRADES = 'PENDING_TRADES',
65
64
  }
66
65
 
67
66
  export const aicQuestionnaireQuestion = z.object({
@@ -243,17 +242,6 @@ export const IndividualFiltersZod = z.object({
243
242
 
244
243
  export const ComplianceIndividualFiltersZod = IndividualFiltersZod.extend({
245
244
  filterBy: z.nativeEnum(FilterBy).optional(),
246
- tradeStatus: z.nativeEnum(TradeStatus).optional(),
247
- complianceReview: z.nativeEnum(ComplianceReview).optional(),
248
- hasPendingTrades: z.preprocess(
249
- (val) =>
250
- val === 'true' || val === '1'
251
- ? true
252
- : val === 'false' || val === '0'
253
- ? false
254
- : val,
255
- z.boolean().optional(),
256
- ),
257
245
  });
258
246
 
259
247
  /**
@@ -301,7 +289,7 @@ export const PostIndividualBodySchema = z
301
289
  .string()
302
290
  .length(3, 'currencyCode must be 3 digits')
303
291
  .optional(),
304
- email: z.string().email().optional(),
292
+ email: EmailSchema.optional(),
305
293
  role: z.nativeEnum(IndividualRole),
306
294
  phone: PhoneZodSchema.openapi({ example: '+12124567890' }).optional(),
307
295
  ownership: z.coerce
@@ -400,7 +388,7 @@ export const UpdateIndividualBodySchema = z
400
388
  .length(3, 'currencyCode must be 3 digits')
401
389
  .optional(),
402
390
  phone: PhoneZodSchema.openapi({ example: '+12124567890' }).optional(),
403
- email: z.string().email().optional(),
391
+ email: EmailSchema.optional(),
404
392
  ownership: z.coerce
405
393
  .number()
406
394
  .min(0, 'Ownership is less than 0')
@@ -24,6 +24,7 @@ import {
24
24
  SortBy,
25
25
  SortOrder,
26
26
  AMLProvider,
27
+ EmailSchema,
27
28
  } from './common.types';
28
29
  import { accountIdSchema } from './account.types';
29
30
  import { SaStatus, tradeIdSchema, TradeZod } from './trade.types';
@@ -131,7 +132,7 @@ export type PostClientInvestorAccountBody = z.infer<
131
132
 
132
133
  export const UpdateInvestorAccountBodySchema = z.object({
133
134
  name: z.string().optional(),
134
- email: z.string().email().optional(),
135
+ email: EmailSchema.optional(),
135
136
  });
136
137
  export type UpdateInvestorAccountBody = z.infer<
137
138
  typeof UpdateInvestorAccountBodySchema
@@ -3,7 +3,9 @@ import {
3
3
  AccountZod,
4
4
  IPaginationMeta,
5
5
  IssuerRole,
6
+ PortalType,
6
7
  UserRole,
8
+ EmailSchema,
7
9
  } from './common.types';
8
10
  import { extendZodWithOpenApi } from '@anatine/zod-openapi';
9
11
  import { TypeID } from 'typeid-js';
@@ -48,7 +50,7 @@ export const InviteWithUrl = InviteWithoutSecretZod.extend({
48
50
  export type InviteWithUrl = z.infer<typeof InviteWithUrl>;
49
51
 
50
52
  export const PostIssuerInviteZod = z.object({
51
- email: z.string().email(),
53
+ email: EmailSchema,
52
54
  role: z.nativeEnum(IssuerRole),
53
55
  });
54
56
 
@@ -131,3 +133,27 @@ export const PatchInviteForComplianceZod = PatchInviteRoleZod.extend({
131
133
  export type PatchInviteForComplianceZod = z.infer<
132
134
  typeof PatchInviteForComplianceZod
133
135
  >;
136
+
137
+ export const PostInviteZod = z.object({
138
+ email: EmailSchema,
139
+ role: z.nativeEnum(UserRole).openapi({
140
+ example: UserRole.ADMIN,
141
+ }),
142
+ accountId: z.string().optional().openapi({
143
+ example: 'account_01j5y5ghx5fg68d663j1fvy2x7',
144
+ }),
145
+ portalType: z.nativeEnum(PortalType).optional().openapi({
146
+ example: PortalType.ISSUER,
147
+ }),
148
+ });
149
+
150
+ export type PostInviteZod = z.infer<typeof PostInviteZod>;
151
+
152
+ export const CompliancePostInviteZod = z.object({
153
+ email: EmailSchema,
154
+ role: z.nativeEnum(UserRole).openapi({
155
+ example: UserRole.ADMIN,
156
+ }),
157
+ });
158
+
159
+ export type CompliancePostInviteZod = z.infer<typeof CompliancePostInviteZod>;
@@ -10,6 +10,7 @@ import {
10
10
  ComplianceReview,
11
11
  DurationType,
12
12
  AssetType,
13
+ StringToBooleanSchema,
13
14
  } from './common.types';
14
15
  import { IBaseEntity } from './entity.types';
15
16
  import { IIssuer, issuerIdSchema } from './issuer.types';
@@ -168,6 +169,7 @@ export const PostIssuerOffering = z
168
169
  .default(AssetTemplateType.STANDARD)
169
170
  .openapi({ example: AssetTemplateType.STANDARD }),
170
171
  tiers: z.array(z.number().positive()).nullable().optional(),
172
+ enableBonus: z.boolean().default(false).optional(),
171
173
  })
172
174
  .superRefine((data, ctx) => {
173
175
  // Check if both values are present, and if so, ensure minInvestment is less than maxInvestment
@@ -192,38 +194,39 @@ export const PatchIssuerOffering = z.object({
192
194
  .max(100)
193
195
  .optional()
194
196
  .openapi({ example: 'Airbnb IPO' }),
197
+ type: z
198
+ .nativeEnum(OfferingType)
199
+ .optional()
200
+ .openapi({ example: OfferingType.REG_D }),
195
201
  targetAmount: z
196
202
  .number()
197
203
  .min(0)
198
204
  .max(10000000000)
199
205
  .optional()
200
206
  .openapi({ example: 120000 }),
201
- raiseAmount: z
202
- .number()
203
- .min(0)
204
- .max(10000000000)
205
- .optional()
206
- .openapi({ example: 200000 }),
207
207
  minInvestment: z
208
208
  .number()
209
209
  .min(0)
210
210
  .max(10000000000)
211
+ .nullable()
211
212
  .optional()
212
213
  .openapi({ example: 1000 }),
213
214
  maxInvestment: z
214
215
  .number()
215
216
  .min(0)
216
217
  .max(10000000000)
218
+ .nullable()
217
219
  .optional()
218
220
  .openapi({ example: 20000 }),
219
221
  contingencyAmount: z
220
222
  .number()
221
223
  .min(0)
222
224
  .max(10000000000)
225
+ .nullable()
223
226
  .optional()
224
227
  .openapi({ example: 5000 }),
225
- startAt: dateSchema.optional().openapi({ example: '10/20/2024' }),
226
- endAt: dateSchema.optional().openapi({ example: '10/27/2024' }),
228
+ startAt: dateSchema.nullable().optional().openapi({ example: '10/20/2024' }),
229
+ endAt: dateSchema.nullable().optional().openapi({ example: '10/27/2024' }),
227
230
  cancellationPeriod: z
228
231
  .number()
229
232
  .min(1)
@@ -299,6 +302,7 @@ export const PatchIssuerOffering = z.object({
299
302
  .optional(),
300
303
  tiers: z.array(z.number().positive()).nullable().optional(),
301
304
  enabled: z.boolean().optional(),
305
+ enableBonus: z.boolean().optional(),
302
306
  });
303
307
  export type PatchIssuerOffering = z.infer<typeof PatchIssuerOffering>;
304
308
 
@@ -368,15 +372,7 @@ export const IssuerOfferingsFilterZod = z.object({
368
372
  issuerId: z.lazy(() => issuerIdSchema).optional(),
369
373
  type: z.nativeEnum(OfferingType).optional(),
370
374
  status: z.nativeEnum(ComplianceReview).optional(),
371
- enabled: z.preprocess(
372
- (val) =>
373
- val === 'true' || val === '1'
374
- ? true
375
- : val === 'false' || val === '0'
376
- ? false
377
- : val,
378
- z.boolean().optional(),
379
- ),
375
+ enabled: StringToBooleanSchema.optional(),
380
376
  managedBy: z.nativeEnum(ManagedByType).optional(),
381
377
  versioningType: z.nativeEnum(OfferingVersioningType).optional(),
382
378
  combinedStatus: z.nativeEnum(OfferingStatus).optional(),
@@ -222,10 +222,51 @@ export type IPaginatedIssuerPaymentMethod = z.infer<
222
222
  typeof IPaginatedIssuerPaymentMethod
223
223
  >;
224
224
 
225
+ const issuerPaymentMethodsInclude = z.enum(['issuer', 'integration']);
226
+
227
+ /**
228
+ * @description Query parameters for including related entities
229
+ * @example in contract use as -> query: PaginationOptionsZod.merge(GetIssuerPaymentMethodZod).merge(IssuerPaymentMethodsIncludeQuery)
230
+ */
231
+ export const IssuerPaymentMethodsIncludeQuery = z.object({
232
+ include: z
233
+ .string()
234
+ .optional()
235
+ .transform((str) => (str ? str.split(',') : []))
236
+ .refine(
237
+ (includes) =>
238
+ includes.every((include) =>
239
+ issuerPaymentMethodsInclude.options.includes(include as any),
240
+ ),
241
+ {
242
+ message: `Invalid include option provided. Valid options are: ${issuerPaymentMethodsInclude.options.join(',')}`,
243
+ },
244
+ )
245
+ .openapi({
246
+ example: `${issuerPaymentMethodsInclude.options.join(',')}`,
247
+ }),
248
+ });
249
+ export type IssuerPaymentMethodsIncludeQuery = z.infer<
250
+ typeof IssuerPaymentMethodsIncludeQuery
251
+ >;
252
+
225
253
  export const GetIssuerPaymentMethodZod = z.object({
226
254
  issuerId: issuerIdSchema.openapi({
227
255
  example: 'issuer_01jdq2crwke8xskjd840cj79pw',
228
256
  }),
257
+ enabled: z
258
+ .string()
259
+ .optional()
260
+ .refine((v) => !v || v === 'true' || v === 'false', {
261
+ message: 'enabled must be a boolean string',
262
+ })
263
+ .transform((v) => {
264
+ if (!v) return undefined;
265
+ return v === 'true';
266
+ })
267
+ .openapi({
268
+ example: 'true',
269
+ }),
229
270
  });
230
271
  export type GetIssuerPaymentMethodZod = z.infer<
231
272
  typeof GetIssuerPaymentMethodZod
@@ -152,6 +152,10 @@ export const PutIssuerZod = z
152
152
  .lazy(() => fileIdSchema)
153
153
  .optional()
154
154
  .nullable(),
155
+ formationDocumentFileId: z
156
+ .lazy(() => fileIdSchema)
157
+ .optional()
158
+ .nullable(),
155
159
  coverArtId: z
156
160
  .lazy(() => fileIdSchema)
157
161
  .optional()
@@ -188,6 +192,11 @@ export const IIssuer = IBaseEntity.extend({
188
192
  accountId: z.string(),
189
193
  account: AccountZod.optional().nullable(),
190
194
  ss4LetterFileId: z.string().nullable(),
195
+ formationDocumentFileId: z.string().nullable(),
196
+ formationDocument: z
197
+ .lazy(() => FileZod)
198
+ .nullable()
199
+ .optional(),
191
200
  status: z
192
201
  .nativeEnum(IssuerStatus)
193
202
  .openapi({ example: IssuerStatus.SUBMITTED }),
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { IBaseEntity } from './entity.types';
3
3
  import {
4
4
  dateSchema,
5
+ EmailSchema,
5
6
  IPaginationMeta,
6
7
  KYBStatus,
7
8
  SanctionsStatus,
@@ -138,7 +139,7 @@ export const PostLegalEntitySchema = z
138
139
  investorAccountId: investorAccountIdSchema,
139
140
  name: CompanyNameSchema,
140
141
  ein: EINSchema,
141
- email: z.string().email().optional(),
142
+ email: EmailSchema.optional(),
142
143
  companyType: CompanyTypeSchema.optional(),
143
144
  phone: PhoneZodSchema.openapi({ example: '+12124567890' }).optional(),
144
145
  dateOfIncorporation: z.lazy(() => dateSchema).optional(),
@@ -153,7 +154,7 @@ export const UpdateLegalEntitySchema = z
153
154
  id: legalEntityIdSchema.optional(),
154
155
  name: CompanyNameSchema.optional(),
155
156
  ein: EINSchema,
156
- email: z.string().email().optional(),
157
+ email: EmailSchema.optional(),
157
158
  companyType: CompanyTypeSchema.optional(),
158
159
  phone: PhoneZodSchema.openapi({ example: '+12124567890' }).optional(),
159
160
  dateOfIncorporation: z.lazy(() => dateSchema).optional(),
@@ -79,7 +79,7 @@ export const PostNoteBody = z.object({
79
79
  export type PostNoteBody = z.infer<typeof PostNoteBody>;
80
80
 
81
81
  export const CompliancePostNoteBody = PostNoteBody.extend({
82
- accountId: accountIdSchema,
82
+ accountId: accountIdSchema.nullable().default(null),
83
83
  });
84
84
 
85
85
  export type CompliancePostNoteBody = z.infer<typeof CompliancePostNoteBody>;