feat: add Copayment and Adjustment columns to payments table

- Added copayment and adjustment fields (Decimal, default 0) to Payment
  model in schema and directly to DB via ALTER TABLE
- Added PATCH /api/payments/:id/copayment and /adjustment routes
- Added inline-editable Copayment and Adjustment columns after MH Paid
  with same click-to-edit format; Copayment in blue, Adjustment in orange

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Gitead
2026-05-06 21:14:00 -04:00
parent c5af6c1fa6
commit 4bd501250d
250 changed files with 4656 additions and 185 deletions

View File

@@ -9,6 +9,9 @@ export const PaymentAggregateResultSchema = z.object({ _count: z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number(),
copayment: z.number(),
adjustment: z.number(),
status: z.number(),
notes: z.number(),
icn: z.number(),
@@ -29,7 +32,10 @@ export const PaymentAggregateResultSchema = z.object({ _count: z.object({
totalBilled: z.number().nullable(),
totalPaid: z.number().nullable(),
totalAdjusted: z.number().nullable(),
totalDue: z.number().nullable()
totalDue: z.number().nullable(),
mhPaidAmount: z.number().nullable(),
copayment: z.number().nullable(),
adjustment: z.number().nullable()
}).nullable().optional(),
_avg: z.object({
id: z.number().nullable(),
@@ -40,7 +46,10 @@ export const PaymentAggregateResultSchema = z.object({ _count: z.object({
totalBilled: z.number().nullable(),
totalPaid: z.number().nullable(),
totalAdjusted: z.number().nullable(),
totalDue: z.number().nullable()
totalDue: z.number().nullable(),
mhPaidAmount: z.number().nullable(),
copayment: z.number().nullable(),
adjustment: z.number().nullable()
}).nullable().optional(),
_min: z.object({
id: z.number().int().nullable(),
@@ -52,6 +61,9 @@ export const PaymentAggregateResultSchema = z.object({ _count: z.object({
totalPaid: z.number().nullable(),
totalAdjusted: z.number().nullable(),
totalDue: z.number().nullable(),
mhPaidAmount: z.number().nullable(),
copayment: z.number().nullable(),
adjustment: z.number().nullable(),
notes: z.string().nullable(),
icn: z.string().nullable(),
createdAt: z.date().nullable(),
@@ -67,6 +79,9 @@ export const PaymentAggregateResultSchema = z.object({ _count: z.object({
totalPaid: z.number().nullable(),
totalAdjusted: z.number().nullable(),
totalDue: z.number().nullable(),
mhPaidAmount: z.number().nullable(),
copayment: z.number().nullable(),
adjustment: z.number().nullable(),
notes: z.string().nullable(),
icn: z.string().nullable(),
createdAt: z.date().nullable(),

View File

@@ -9,6 +9,9 @@ export const PaymentCreateResultSchema = z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number().optional(),
copayment: z.number(),
adjustment: z.number(),
status: z.unknown(),
notes: z.string().optional(),
icn: z.string().optional(),

View File

@@ -9,6 +9,9 @@ export const PaymentDeleteResultSchema = z.nullable(z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number().optional(),
copayment: z.number(),
adjustment: z.number(),
status: z.unknown(),
notes: z.string().optional(),
icn: z.string().optional(),

View File

@@ -9,6 +9,9 @@ export const PaymentFindFirstResultSchema = z.nullable(z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number().optional(),
copayment: z.number(),
adjustment: z.number(),
status: z.unknown(),
notes: z.string().optional(),
icn: z.string().optional(),

View File

@@ -10,6 +10,9 @@ export const PaymentFindManyResultSchema = z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number().optional(),
copayment: z.number(),
adjustment: z.number(),
status: z.unknown(),
notes: z.string().optional(),
icn: z.string().optional(),

View File

@@ -9,6 +9,9 @@ export const PaymentFindUniqueResultSchema = z.nullable(z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number().optional(),
copayment: z.number(),
adjustment: z.number(),
status: z.unknown(),
notes: z.string().optional(),
icn: z.string().optional(),

View File

@@ -9,6 +9,9 @@ export const PaymentGroupByResultSchema = z.array(z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number(),
copayment: z.number(),
adjustment: z.number(),
notes: z.string(),
icn: z.string(),
createdAt: z.date(),
@@ -23,6 +26,9 @@ export const PaymentGroupByResultSchema = z.array(z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number(),
copayment: z.number(),
adjustment: z.number(),
status: z.number(),
notes: z.number(),
icn: z.number(),
@@ -43,7 +49,10 @@ export const PaymentGroupByResultSchema = z.array(z.object({
totalBilled: z.number().nullable(),
totalPaid: z.number().nullable(),
totalAdjusted: z.number().nullable(),
totalDue: z.number().nullable()
totalDue: z.number().nullable(),
mhPaidAmount: z.number().nullable(),
copayment: z.number().nullable(),
adjustment: z.number().nullable()
}).nullable().optional(),
_avg: z.object({
id: z.number().nullable(),
@@ -54,7 +63,10 @@ export const PaymentGroupByResultSchema = z.array(z.object({
totalBilled: z.number().nullable(),
totalPaid: z.number().nullable(),
totalAdjusted: z.number().nullable(),
totalDue: z.number().nullable()
totalDue: z.number().nullable(),
mhPaidAmount: z.number().nullable(),
copayment: z.number().nullable(),
adjustment: z.number().nullable()
}).nullable().optional(),
_min: z.object({
id: z.number().int().nullable(),
@@ -66,6 +78,9 @@ export const PaymentGroupByResultSchema = z.array(z.object({
totalPaid: z.number().nullable(),
totalAdjusted: z.number().nullable(),
totalDue: z.number().nullable(),
mhPaidAmount: z.number().nullable(),
copayment: z.number().nullable(),
adjustment: z.number().nullable(),
notes: z.string().nullable(),
icn: z.string().nullable(),
createdAt: z.date().nullable(),
@@ -81,6 +96,9 @@ export const PaymentGroupByResultSchema = z.array(z.object({
totalPaid: z.number().nullable(),
totalAdjusted: z.number().nullable(),
totalDue: z.number().nullable(),
mhPaidAmount: z.number().nullable(),
copayment: z.number().nullable(),
adjustment: z.number().nullable(),
notes: z.string().nullable(),
icn: z.string().nullable(),
createdAt: z.date().nullable(),

View File

@@ -9,6 +9,9 @@ export const PaymentUpdateResultSchema = z.nullable(z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number().optional(),
copayment: z.number(),
adjustment: z.number(),
status: z.unknown(),
notes: z.string().optional(),
icn: z.string().optional(),

View File

@@ -9,6 +9,9 @@ export const PaymentUpsertResultSchema = z.object({
totalPaid: z.number(),
totalAdjusted: z.number(),
totalDue: z.number(),
mhPaidAmount: z.number().optional(),
copayment: z.number(),
adjustment: z.number(),
status: z.unknown(),
notes: z.string().optional(),
icn: z.string().optional(),

View File

@@ -0,0 +1,23 @@
import * as z from 'zod';
export const ProcedureTimeslotAggregateResultSchema = z.object({ _count: z.object({
id: z.number(),
userId: z.number(),
data: z.number(),
user: z.number()
}).optional(),
_sum: z.object({
id: z.number().nullable(),
userId: z.number().nullable()
}).nullable().optional(),
_avg: z.object({
id: z.number().nullable(),
userId: z.number().nullable()
}).nullable().optional(),
_min: z.object({
id: z.number().int().nullable(),
userId: z.number().int().nullable()
}).nullable().optional(),
_max: z.object({
id: z.number().int().nullable(),
userId: z.number().int().nullable()
}).nullable().optional()});

View File

@@ -0,0 +1,2 @@
import * as z from 'zod';
export const ProcedureTimeslotCountResultSchema = z.number();

View File

@@ -0,0 +1,4 @@
import * as z from 'zod';
export const ProcedureTimeslotCreateManyResultSchema = z.object({
count: z.number()
});

View File

@@ -0,0 +1,7 @@
import * as z from 'zod';
export const ProcedureTimeslotCreateResultSchema = z.object({
id: z.number().int(),
userId: z.number().int(),
data: z.unknown(),
user: z.unknown()
});

View File

@@ -0,0 +1,4 @@
import * as z from 'zod';
export const ProcedureTimeslotDeleteManyResultSchema = z.object({
count: z.number()
});

View File

@@ -0,0 +1,7 @@
import * as z from 'zod';
export const ProcedureTimeslotDeleteResultSchema = z.nullable(z.object({
id: z.number().int(),
userId: z.number().int(),
data: z.unknown(),
user: z.unknown()
}));

View File

@@ -0,0 +1,7 @@
import * as z from 'zod';
export const ProcedureTimeslotFindFirstResultSchema = z.nullable(z.object({
id: z.number().int(),
userId: z.number().int(),
data: z.unknown(),
user: z.unknown()
}));

View File

@@ -0,0 +1,17 @@
import * as z from 'zod';
export const ProcedureTimeslotFindManyResultSchema = z.object({
data: z.array(z.object({
id: z.number().int(),
userId: z.number().int(),
data: z.unknown(),
user: z.unknown()
})),
pagination: z.object({
page: z.number().int().min(1),
pageSize: z.number().int().min(1),
total: z.number().int().min(0),
totalPages: z.number().int().min(0),
hasNext: z.boolean(),
hasPrev: z.boolean()
})
});

View File

@@ -0,0 +1,7 @@
import * as z from 'zod';
export const ProcedureTimeslotFindUniqueResultSchema = z.nullable(z.object({
id: z.number().int(),
userId: z.number().int(),
data: z.unknown(),
user: z.unknown()
}));

View File

@@ -0,0 +1,28 @@
import * as z from 'zod';
export const ProcedureTimeslotGroupByResultSchema = z.array(z.object({
id: z.number().int(),
userId: z.number().int(),
data: z.unknown(),
_count: z.object({
id: z.number(),
userId: z.number(),
data: z.number(),
user: z.number()
}).optional(),
_sum: z.object({
id: z.number().nullable(),
userId: z.number().nullable()
}).nullable().optional(),
_avg: z.object({
id: z.number().nullable(),
userId: z.number().nullable()
}).nullable().optional(),
_min: z.object({
id: z.number().int().nullable(),
userId: z.number().int().nullable()
}).nullable().optional(),
_max: z.object({
id: z.number().int().nullable(),
userId: z.number().int().nullable()
}).nullable().optional()
}));

View File

@@ -0,0 +1,4 @@
import * as z from 'zod';
export const ProcedureTimeslotUpdateManyResultSchema = z.object({
count: z.number()
});

View File

@@ -0,0 +1,7 @@
import * as z from 'zod';
export const ProcedureTimeslotUpdateResultSchema = z.nullable(z.object({
id: z.number().int(),
userId: z.number().int(),
data: z.unknown(),
user: z.unknown()
}));

View File

@@ -0,0 +1,7 @@
import * as z from 'zod';
export const ProcedureTimeslotUpsertResultSchema = z.object({
id: z.number().int(),
userId: z.number().int(),
data: z.unknown(),
user: z.unknown()
});

View File

@@ -21,7 +21,8 @@ export const UserAggregateResultSchema = z.object({ _count: z.object({
twilioSettings: z.number(),
aiSettings: z.number(),
officeHours: z.number(),
officeContact: z.number()
officeContact: z.number(),
procedureTimeslot: z.number()
}).optional(),
_sum: z.object({
id: z.number().nullable()

View File

@@ -21,5 +21,6 @@ export const UserCreateResultSchema = z.object({
twilioSettings: z.unknown().optional(),
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional()
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional()
});

View File

@@ -21,5 +21,6 @@ export const UserDeleteResultSchema = z.nullable(z.object({
twilioSettings: z.unknown().optional(),
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional()
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional()
}));

View File

@@ -21,5 +21,6 @@ export const UserFindFirstResultSchema = z.nullable(z.object({
twilioSettings: z.unknown().optional(),
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional()
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional()
}));

View File

@@ -22,7 +22,8 @@ export const UserFindManyResultSchema = z.object({
twilioSettings: z.unknown().optional(),
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional()
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional()
})),
pagination: z.object({
page: z.number().int().min(1),

View File

@@ -21,5 +21,6 @@ export const UserFindUniqueResultSchema = z.nullable(z.object({
twilioSettings: z.unknown().optional(),
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional()
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional()
}));

View File

@@ -27,7 +27,8 @@ export const UserGroupByResultSchema = z.array(z.object({
twilioSettings: z.number(),
aiSettings: z.number(),
officeHours: z.number(),
officeContact: z.number()
officeContact: z.number(),
procedureTimeslot: z.number()
}).optional(),
_sum: z.object({
id: z.number().nullable()

View File

@@ -21,5 +21,6 @@ export const UserUpdateResultSchema = z.nullable(z.object({
twilioSettings: z.unknown().optional(),
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional()
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional()
}));

View File

@@ -21,5 +21,6 @@ export const UserUpsertResultSchema = z.object({
twilioSettings: z.unknown().optional(),
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional()
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional()
});

View File

@@ -362,3 +362,16 @@ export { OfficeContactDeleteManyResultSchema } from './OfficeContactDeleteManyRe
export { OfficeContactAggregateResultSchema } from './OfficeContactAggregateResult.schema';
export { OfficeContactGroupByResultSchema } from './OfficeContactGroupByResult.schema';
export { OfficeContactCountResultSchema } from './OfficeContactCountResult.schema';
export { ProcedureTimeslotFindUniqueResultSchema } from './ProcedureTimeslotFindUniqueResult.schema';
export { ProcedureTimeslotFindFirstResultSchema } from './ProcedureTimeslotFindFirstResult.schema';
export { ProcedureTimeslotFindManyResultSchema } from './ProcedureTimeslotFindManyResult.schema';
export { ProcedureTimeslotCreateResultSchema } from './ProcedureTimeslotCreateResult.schema';
export { ProcedureTimeslotCreateManyResultSchema } from './ProcedureTimeslotCreateManyResult.schema';
export { ProcedureTimeslotUpdateResultSchema } from './ProcedureTimeslotUpdateResult.schema';
export { ProcedureTimeslotUpdateManyResultSchema } from './ProcedureTimeslotUpdateManyResult.schema';
export { ProcedureTimeslotUpsertResultSchema } from './ProcedureTimeslotUpsertResult.schema';
export { ProcedureTimeslotDeleteResultSchema } from './ProcedureTimeslotDeleteResult.schema';
export { ProcedureTimeslotDeleteManyResultSchema } from './ProcedureTimeslotDeleteManyResult.schema';
export { ProcedureTimeslotAggregateResultSchema } from './ProcedureTimeslotAggregateResult.schema';
export { ProcedureTimeslotGroupByResultSchema } from './ProcedureTimeslotGroupByResult.schema';
export { ProcedureTimeslotCountResultSchema } from './ProcedureTimeslotCountResult.schema';