@temboplus/afloat 0.1.77-beta.8 → 0.1.77

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.
@@ -1,6 +1,119 @@
1
1
  import { PayoutDTO, PayoutStatus, PayoutApprovalStatus, PayoutAuthorizer } from "@/modules/payout/payout.dtos.js";
2
2
  import { Amount } from "@temboplus/frontend-core";
3
3
  import { ContactInfo } from "../contact/contact-info.model.js";
4
+ import z from "zod";
5
+ /**
6
+ * Zod schema for Payout JSON serialization
7
+ * This mirrors the PayoutDTO structure but is specifically for JSON serialization
8
+ */
9
+ export declare const PayoutJSONSchema: z.ZodObject<{
10
+ id: z.ZodString;
11
+ profileId: z.ZodString;
12
+ payeeName: z.ZodString;
13
+ channel: z.ZodString;
14
+ msisdn: z.ZodString;
15
+ amount: z.ZodNumber;
16
+ currencyCode: z.ZodString;
17
+ countryCode: z.ZodString;
18
+ description: z.ZodString;
19
+ notes: z.ZodOptional<z.ZodNullable<z.ZodString>>;
20
+ status: z.ZodNativeEnum<typeof PayoutStatus>;
21
+ statusMessage: z.ZodString;
22
+ partnerReference: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
+ createdAt: z.ZodString;
24
+ updatedAt: z.ZodString;
25
+ actionedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
26
+ approvalStatus: z.ZodOptional<z.ZodNullable<z.ZodNativeEnum<typeof PayoutApprovalStatus>>>;
27
+ createdBy: z.ZodOptional<z.ZodNullable<z.ZodObject<{
28
+ id: z.ZodString;
29
+ name: z.ZodString;
30
+ identity: z.ZodString;
31
+ }, "strip", z.ZodTypeAny, {
32
+ name: string;
33
+ id: string;
34
+ identity: string;
35
+ }, {
36
+ name: string;
37
+ id: string;
38
+ identity: string;
39
+ }>>>;
40
+ actionedBy: z.ZodOptional<z.ZodNullable<z.ZodObject<{
41
+ id: z.ZodString;
42
+ name: z.ZodString;
43
+ identity: z.ZodString;
44
+ }, "strip", z.ZodTypeAny, {
45
+ name: string;
46
+ id: string;
47
+ identity: string;
48
+ }, {
49
+ name: string;
50
+ id: string;
51
+ identity: string;
52
+ }>>>;
53
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
54
+ }, "strip", z.ZodTypeAny, {
55
+ status: PayoutStatus;
56
+ id: string;
57
+ version: string;
58
+ profileId: string;
59
+ createdAt: string;
60
+ updatedAt: string;
61
+ description: string;
62
+ channel: string;
63
+ countryCode: string;
64
+ currencyCode: string;
65
+ msisdn: string;
66
+ amount: number;
67
+ payeeName: string;
68
+ statusMessage: string;
69
+ notes?: string | null | undefined;
70
+ partnerReference?: string | null | undefined;
71
+ actionedAt?: string | null | undefined;
72
+ approvalStatus?: PayoutApprovalStatus | null | undefined;
73
+ createdBy?: {
74
+ name: string;
75
+ id: string;
76
+ identity: string;
77
+ } | null | undefined;
78
+ actionedBy?: {
79
+ name: string;
80
+ id: string;
81
+ identity: string;
82
+ } | null | undefined;
83
+ }, {
84
+ status: PayoutStatus;
85
+ id: string;
86
+ profileId: string;
87
+ createdAt: string;
88
+ updatedAt: string;
89
+ description: string;
90
+ channel: string;
91
+ countryCode: string;
92
+ currencyCode: string;
93
+ msisdn: string;
94
+ amount: number;
95
+ payeeName: string;
96
+ statusMessage: string;
97
+ version?: string | undefined;
98
+ notes?: string | null | undefined;
99
+ partnerReference?: string | null | undefined;
100
+ actionedAt?: string | null | undefined;
101
+ approvalStatus?: PayoutApprovalStatus | null | undefined;
102
+ createdBy?: {
103
+ name: string;
104
+ id: string;
105
+ identity: string;
106
+ } | null | undefined;
107
+ actionedBy?: {
108
+ name: string;
109
+ id: string;
110
+ identity: string;
111
+ } | null | undefined;
112
+ }>;
113
+ /**
114
+ * Infer the PayoutJSON type from the schema
115
+ */
116
+ export type PayoutJSON = z.infer<typeof PayoutJSONSchema>;
4
117
  /**
5
118
  * Payout class that wraps the Zod schema and provides additional functionality
6
119
  */
@@ -133,7 +246,134 @@ export declare class Payout {
133
246
  */
134
247
  static is(obj: unknown): obj is Payout;
135
248
  /**
136
- * Converts Payout instance to a plain object
249
+ * Serializes the Payout instance to a JSON-compatible object
250
+ *
251
+ * Converts all Date objects to ISO strings for proper JSON serialization.
252
+ * The resulting object can be safely stringified and stored or transmitted.
253
+ *
254
+ * @returns {PayoutJSON} A plain object containing all payout data
255
+ *
256
+ * @example
257
+ * ```typescript
258
+ * const payout = Payout.create(payoutData);
259
+ * const json = payout.toJSON();
260
+ * // {
261
+ * // id: "payout-123",
262
+ * // amount: 50000,
263
+ * // currencyCode: "TZS",
264
+ * // createdAt: "2024-01-15T10:30:00.000Z",
265
+ * // ...
266
+ * // }
267
+ * ```
268
+ */
269
+ toJSON(): PayoutJSON;
270
+ /**
271
+ * Serializes the Payout instance to a JSON string
272
+ *
273
+ * @returns {string} JSON string representation of the payout
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * const payout = Payout.create(payoutData);
278
+ * const jsonString = payout.toJSONString();
279
+ *
280
+ * // Store in localStorage
281
+ * localStorage.setItem('pendingPayout', jsonString);
282
+ *
283
+ * // Or send to server
284
+ * await fetch('/api/cache-payout', {
285
+ * method: 'POST',
286
+ * body: jsonString
287
+ * });
288
+ * ```
289
+ */
290
+ toJSONString(): string;
291
+ /**
292
+ * Creates a Payout instance from a JSON-compatible object or string
293
+ *
294
+ * This method reconstructs a Payout instance from data that was previously
295
+ * serialized using toJSON(). It validates the input data using Zod schema
296
+ * and converts ISO date strings back to Date objects.
297
+ *
298
+ * @param {PayoutJSON | string} json - Either a PayoutJSON object or a JSON string
299
+ * @returns {Payout | undefined} A Payout instance if valid, undefined otherwise
300
+ *
301
+ * @example
302
+ * ```typescript
303
+ * // From localStorage
304
+ * const stored = localStorage.getItem('pendingPayout');
305
+ * const payout = Payout.fromJSON(stored!);
306
+ *
307
+ * if (payout) {
308
+ * console.log(payout.amount.label); // "TSh 50,000.00"
309
+ * console.log(payout.status); // "PENDING"
310
+ * }
311
+ *
312
+ * // From object
313
+ * const payoutJson = {
314
+ * id: "payout-123",
315
+ * amount: 50000,
316
+ * currencyCode: "TZS",
317
+ * createdAt: "2024-01-15T10:30:00.000Z",
318
+ * ...
319
+ * };
320
+ * const payout = Payout.fromJSON(payoutJson);
321
+ * ```
322
+ */
323
+ static fromJSON(json: PayoutJSON | string): Payout | undefined;
324
+ /**
325
+ * Type guard using Zod schema validation
326
+ *
327
+ * Checks if an unknown value conforms to the PayoutJSON structure
328
+ * without attempting to create a Payout instance.
329
+ *
330
+ * @param {unknown} obj - The object to validate
331
+ * @returns {boolean} True if the object is a valid PayoutJSON
332
+ *
333
+ * @example
334
+ * ```typescript
335
+ * const data = JSON.parse(localStorage.getItem('payout'));
336
+ *
337
+ * if (Payout.isPayoutJSON(data)) {
338
+ * const payout = Payout.fromJSON(data);
339
+ * // TypeScript knows data is PayoutJSON here
340
+ * }
341
+ * ```
342
+ */
343
+ static isPayoutJSON(obj: unknown): obj is PayoutJSON;
344
+ /**
345
+ * Creates multiple Payout instances from a JSON array
346
+ *
347
+ * @param {PayoutJSON[] | string} jsonArray - Array of PayoutJSON objects or JSON string
348
+ * @returns {Payout[]} Array of Payout instances (invalid items are filtered out)
349
+ *
350
+ * @example
351
+ * ```typescript
352
+ * // From API response
353
+ * const response = await fetch('/api/payouts');
354
+ * const jsonArray = await response.json();
355
+ * const payouts = Payout.fromJSONArray(jsonArray);
356
+ *
357
+ * // From stored array
358
+ * const stored = localStorage.getItem('recentPayouts');
359
+ * const payouts = Payout.fromJSONArray(stored!);
360
+ * ```
361
+ */
362
+ static fromJSONArray(jsonArray: PayoutJSON[] | string): Payout[];
363
+ /**
364
+ * Serializes an array of Payout instances to JSON
365
+ *
366
+ * @param {Payout[]} payouts - Array of Payout instances to serialize
367
+ * @returns {PayoutJSON[]} Array of PayoutJSON objects
368
+ *
369
+ * @example
370
+ * ```typescript
371
+ * const payouts = [payout1, payout2, payout3];
372
+ * const jsonArray = Payout.toJSONArray(payouts);
373
+ *
374
+ * // Store or transmit
375
+ * localStorage.setItem('recentPayouts', JSON.stringify(jsonArray));
376
+ * ```
137
377
  */
138
- toJSON(): PayoutDTO;
378
+ static toJSONArray(payouts: Payout[]): PayoutJSON[];
139
379
  }
@@ -1,5 +1,6 @@
1
1
  import { QueryBuilder } from "@/lib/query/index.js";
2
2
  import { PayoutStatus, PayoutApprovalStatus, PayoutFilters } from "./payout.dtos.js";
3
+ import { Amount } from "@temboplus/frontend-core";
3
4
  /**
4
5
  * Payout-specific query builder that extends the base QueryBuilder
5
6
  * and handles all possible input conversions (DTOs, URL params, etc.)
@@ -41,7 +42,7 @@ export declare class PayoutQuery extends QueryBuilder {
41
42
  whereRejected(): this;
42
43
  wherePaid(): this;
43
44
  whereFailed(): this;
44
- whereAmountBetween(min: number, max: number): this;
45
+ whereAmountBetween(min: Amount, max: Amount): this;
45
46
  wherePayee(payeeName: string): this;
46
47
  whereMsisdn(msisdn: string): this;
47
48
  whereProfileId(profileId: string): this;
@@ -57,7 +58,7 @@ export declare class PayoutQuery extends QueryBuilder {
57
58
  */
58
59
  toFilters(): PayoutFilters;
59
60
  /**
60
- * Convert to URL-safe string parameters
61
+ * Convert to user-friendly URL parameters (for browser URLs)
61
62
  */
62
63
  toUrlParams(): Record<string, string>;
63
64
  /**
@@ -79,7 +80,7 @@ export declare class PayoutQuery extends QueryBuilder {
79
80
  /**
80
81
  * Create new instance with date range
81
82
  */
82
- withDateRange(startDate?: string, endDate?: string): PayoutQuery;
83
+ withDateRange(startDate?: string | Date, endDate?: string | Date): PayoutQuery;
83
84
  /**
84
85
  * Create new instance with status filter
85
86
  */
@@ -7,6 +7,29 @@ import { PayoutChannel } from "./payout.dtos.js";
7
7
  import { PayoutQuery } from "./payout.query.js";
8
8
  import { PayoutFilters } from "./payout.dtos.js";
9
9
  import { Paged } from "@/lib/query/index.js";
10
+ /**
11
+ * Input type for payout creation mutation
12
+ */
13
+ export interface CreatePayoutInput {
14
+ channel: PayoutChannel;
15
+ receiver: ContactInfo;
16
+ amount: Amount;
17
+ notes?: string;
18
+ }
19
+ /**
20
+ * Input type for payout approval mutation
21
+ */
22
+ export interface ApprovePayoutInput {
23
+ id: string;
24
+ notes?: string;
25
+ }
26
+ /**
27
+ * Input type for payout rejection mutation
28
+ */
29
+ export interface RejectPayoutInput {
30
+ id: string;
31
+ notes?: string;
32
+ }
10
33
  /**
11
34
  * Flexible query input type - supports the class, filters interface, URL params, etc.
12
35
  */
@@ -93,11 +116,11 @@ export declare class PayoutRepository extends BaseRepository<PayoutAPI> {
93
116
  /**
94
117
  * Creates a new payout with the provided input data.
95
118
  *
96
- * @param args - The payout creation data
97
- * @param args.channel - The payout channel to use
98
- * @param args.receiver - Contact information for the payout receiver
99
- * @param args.amount - The amount to pay out
100
- * @param args.notes - Optional notes for the payout
119
+ * @param input - The payout creation data
120
+ * @param input.channel - The payout channel to use
121
+ * @param input.receiver - Contact information for the payout receiver
122
+ * @param input.amount - The amount to pay out
123
+ * @param input.notes - Optional notes for the payout
101
124
  * @returns Promise that resolves to the created payout
102
125
  * @throws {APIError} If the input is invalid or if the creation operation fails
103
126
  *
@@ -111,18 +134,12 @@ export declare class PayoutRepository extends BaseRepository<PayoutAPI> {
111
134
  * });
112
135
  * ```
113
136
  */
114
- pay(args: {
115
- channel: PayoutChannel;
116
- receiver: ContactInfo;
117
- amount: Amount;
118
- notes?: string;
119
- }): Promise<Payout>;
137
+ pay(input: CreatePayoutInput): Promise<Payout>;
120
138
  /**
121
139
  * Approves a payout with optional notes.
122
140
  *
123
- * @param id - The ID of the payout to approve
124
- * @param args - Optional arguments
125
- * @param args.notes - Optional notes for the approval
141
+ * @param input.id - The ID of the payout to approve
142
+ * @param input.notes - Optional notes for the approval
126
143
  * @returns Promise that resolves to the approved payout
127
144
  * @throws {APIError} If payout is not found, already approved, or if the operation fails
128
145
  *
@@ -133,15 +150,12 @@ export declare class PayoutRepository extends BaseRepository<PayoutAPI> {
133
150
  * });
134
151
  * ```
135
152
  */
136
- approve(id: string, args?: {
137
- notes?: string;
138
- }): Promise<Payout>;
153
+ approve(input: ApprovePayoutInput): Promise<Payout>;
139
154
  /**
140
155
  * Rejects a payout with optional notes.
141
156
  *
142
- * @param id - The ID of the payout to reject
143
- * @param args - Optional arguments
144
- * @param args.notes - Optional notes for the rejection
157
+ * @param input.id - The ID of the payout to reject
158
+ * @param input.notes - Optional notes for the rejection
145
159
  * @returns Promise that resolves to the rejected payout
146
160
  * @throws {APIError} If payout is not found, already rejected, or if the operation fails
147
161
  *
@@ -152,9 +166,7 @@ export declare class PayoutRepository extends BaseRepository<PayoutAPI> {
152
166
  * });
153
167
  * ```
154
168
  */
155
- reject(id: string, args?: {
156
- notes?: string;
157
- }): Promise<Payout>;
169
+ reject(input: RejectPayoutInput): Promise<Payout>;
158
170
  /**
159
171
  * Retrieves a payout by its ID.
160
172
  *
@@ -1,4 +1,42 @@
1
- import { ProfileDTO } from "./profile.dtos.js";
1
+ import { z } from "zod";
2
+ /**
3
+ * Zod schema for Profile JSON serialization
4
+ */
5
+ export declare const ProfileJSONSchema: z.ZodObject<{
6
+ id: z.ZodString;
7
+ firstName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
8
+ lastName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
9
+ displayName: z.ZodString;
10
+ phone: z.ZodOptional<z.ZodNullable<z.ZodString>>;
11
+ accountNo: z.ZodString;
12
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
13
+ autoApprove: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
14
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ id: string;
17
+ displayName: string;
18
+ accountNo: string;
19
+ version: string;
20
+ firstName?: string | null | undefined;
21
+ lastName?: string | null | undefined;
22
+ phone?: string | null | undefined;
23
+ email?: string | null | undefined;
24
+ autoApprove?: boolean | null | undefined;
25
+ }, {
26
+ id: string;
27
+ displayName: string;
28
+ accountNo: string;
29
+ firstName?: string | null | undefined;
30
+ lastName?: string | null | undefined;
31
+ phone?: string | null | undefined;
32
+ email?: string | null | undefined;
33
+ autoApprove?: boolean | null | undefined;
34
+ version?: string | undefined;
35
+ }>;
36
+ /**
37
+ * Infer the ProfileJSON type from the schema
38
+ */
39
+ export type ProfileJSON = z.infer<typeof ProfileJSONSchema>;
2
40
  /**
3
41
  * Represents a user profile in the system.
4
42
  *
@@ -25,16 +63,16 @@ export declare class Profile {
25
63
  /**
26
64
  * Gets the profile schema used for validation.
27
65
  */
28
- static get schema(): import("zod").ZodObject<{
29
- id: import("zod").ZodString;
30
- firstName: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
31
- lastName: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
32
- displayName: import("zod").ZodString;
33
- phone: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
34
- accountNo: import("zod").ZodString;
35
- email: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
36
- autoApprove: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodBoolean>>;
37
- }, "strip", import("zod").ZodTypeAny, {
66
+ static get schema(): z.ZodObject<{
67
+ id: z.ZodString;
68
+ firstName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
69
+ lastName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
70
+ displayName: z.ZodString;
71
+ phone: z.ZodOptional<z.ZodNullable<z.ZodString>>;
72
+ accountNo: z.ZodString;
73
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
74
+ autoApprove: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
75
+ }, "strip", z.ZodTypeAny, {
38
76
  id: string;
39
77
  displayName: string;
40
78
  accountNo: string;
@@ -113,31 +151,12 @@ export declare class Profile {
113
151
  * Returns the display name if it exists, otherwise returns the first and last name combined.
114
152
  */
115
153
  getName(): string;
116
- /**
117
- * Creates a plain object representation of the profile for validation or serialization.
118
- *
119
- * @returns A plain object matching the ProfileType interface
120
- */
121
- toObject(): ProfileDTO;
122
- /**
123
- * Converts the profile to a JSON string.
124
- *
125
- * @returns A JSON string representation of the profile
126
- */
127
- toJSON(): string;
128
154
  /**
129
155
  * Validates the profile data against the Zod schema.
130
156
  *
131
157
  * @returns True if the profile is valid, false otherwise
132
158
  */
133
159
  validate(): boolean;
134
- /**
135
- * Creates a Profile instance from a JSON string.
136
- *
137
- * @param jsonString - JSON string containing profile data
138
- * @returns A new Profile instance, or undefined if parsing failed
139
- */
140
- static fromJSON(jsonString: string): Profile | undefined;
141
160
  /**
142
161
  * Creates a Profile instance from a plain object.
143
162
  *
@@ -152,4 +171,20 @@ export declare class Profile {
152
171
  * @returns Type predicate indicating if the object is a valid Profile
153
172
  */
154
173
  static is(obj: unknown): obj is Profile;
174
+ /**
175
+ * Serializes the Profile instance to a JSON-compatible object
176
+ */
177
+ toJSON(): ProfileJSON;
178
+ /**
179
+ * Serializes the Profile instance to a JSON string
180
+ */
181
+ toJSONString(): string;
182
+ /**
183
+ * Creates a Profile instance from a JSON-compatible object or string
184
+ */
185
+ static fromJSON(json: ProfileJSON | string): Profile | undefined;
186
+ /**
187
+ * Type guard using Zod schema validation
188
+ */
189
+ static isProfileJSON(obj: unknown): obj is ProfileJSON;
155
190
  }
@@ -1,4 +1,37 @@
1
+ import z from "zod";
1
2
  import { RoleDTO } from "./team-member.dtos.js";
3
+ /**
4
+ * Zod schema for Role JSON serialization
5
+ */
6
+ export declare const RoleJSONSchema: z.ZodObject<{
7
+ id: z.ZodString;
8
+ name: z.ZodString;
9
+ description: z.ZodOptional<z.ZodString>;
10
+ access: z.ZodArray<z.ZodString, "many">;
11
+ createdAt: z.ZodString;
12
+ updatedAt: z.ZodString;
13
+ version: z.ZodDefault<z.ZodOptional<z.ZodString>>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ name: string;
16
+ id: string;
17
+ version: string;
18
+ createdAt: string;
19
+ updatedAt: string;
20
+ access: string[];
21
+ description?: string | undefined;
22
+ }, {
23
+ name: string;
24
+ id: string;
25
+ createdAt: string;
26
+ updatedAt: string;
27
+ access: string[];
28
+ version?: string | undefined;
29
+ description?: string | undefined;
30
+ }>;
31
+ /**
32
+ * Infer the RoleJSON type from the schema
33
+ */
34
+ export type RoleJSON = z.infer<typeof RoleJSONSchema>;
2
35
  export declare class Role {
3
36
  readonly id: string;
4
37
  readonly name: string;
@@ -9,5 +42,20 @@ export declare class Role {
9
42
  constructor(data: RoleDTO);
10
43
  hasPermission(permission: string): boolean;
11
44
  static from(data: RoleDTO): Role | undefined;
12
- toJSON(): any;
45
+ /**
46
+ * Serializes the Role instance to a JSON-compatible object
47
+ */
48
+ toJSON(): RoleJSON;
49
+ /**
50
+ * Serializes the Role instance to a JSON string
51
+ */
52
+ toJSONString(): string;
53
+ /**
54
+ * Creates a Role instance from a JSON-compatible object or string
55
+ */
56
+ static fromJSON(json: RoleJSON | string): Role | undefined;
57
+ /**
58
+ * Type guard using Zod schema validation
59
+ */
60
+ static isRoleJSON(obj: unknown): obj is RoleJSON;
13
61
  }