feat: office address, multi-template SMS manager, hardcoded defaults with auto-seed

- Add streetAddress/city/state/zipCode fields to OfficeContact (schema + storage + UI)
- Support {officeAddress} variable in batch reminder SMS
- Replace single SMS template field with full CRUD template list (add/rename/edit/delete)
- Store SMS template list under _sms_template_list; first template synced to batch reminder
- Hardcode all AI chat template defaults into codebase (reminder SMS, greetings, fallback)
- Add seed-templates.ts that auto-seeds default templates for all users on server boot
- Update README: note that templates are auto-configured on first boot

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Gitead
2026-05-11 23:18:04 -04:00
parent 11244ace7f
commit 7929dc6e19
56 changed files with 763 additions and 46 deletions

View File

@@ -11,6 +11,10 @@ const makeSchema = () => z.object({
phoneNumber: z.literal(true).optional(),
email: z.literal(true).optional(),
fax: z.literal(true).optional(),
streetAddress: z.literal(true).optional(),
city: z.literal(true).optional(),
state: z.literal(true).optional(),
zipCode: z.literal(true).optional(),
_all: z.literal(true).optional()
}).strict();
export const OfficeContactCountAggregateInputObjectSchema: z.ZodType<Prisma.OfficeContactCountAggregateInputType> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactCountAggregateInputType>;

View File

@@ -10,7 +10,11 @@ const makeSchema = () => z.object({
dentistName: SortOrderSchema.optional(),
phoneNumber: SortOrderSchema.optional(),
email: SortOrderSchema.optional(),
fax: SortOrderSchema.optional()
fax: SortOrderSchema.optional(),
streetAddress: SortOrderSchema.optional(),
city: SortOrderSchema.optional(),
state: SortOrderSchema.optional(),
zipCode: SortOrderSchema.optional()
}).strict();
export const OfficeContactCountOrderByAggregateInputObjectSchema: z.ZodType<Prisma.OfficeContactCountOrderByAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactCountOrderByAggregateInput>;
export const OfficeContactCountOrderByAggregateInputObjectZodSchema = makeSchema();

View File

@@ -9,6 +9,10 @@ const makeSchema = () => z.object({
phoneNumber: z.string().optional().nullable(),
email: z.string().optional().nullable(),
fax: z.string().optional().nullable(),
streetAddress: z.string().optional().nullable(),
city: z.string().optional().nullable(),
state: z.string().optional().nullable(),
zipCode: z.string().optional().nullable(),
user: z.lazy(() => UserCreateNestedOneWithoutOfficeContactInputObjectSchema)
}).strict();
export const OfficeContactCreateInputObjectSchema: z.ZodType<Prisma.OfficeContactCreateInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactCreateInput>;

View File

@@ -10,7 +10,11 @@ const makeSchema = () => z.object({
dentistName: z.string().optional().nullable(),
phoneNumber: z.string().optional().nullable(),
email: z.string().optional().nullable(),
fax: z.string().optional().nullable()
fax: z.string().optional().nullable(),
streetAddress: z.string().optional().nullable(),
city: z.string().optional().nullable(),
state: z.string().optional().nullable(),
zipCode: z.string().optional().nullable()
}).strict();
export const OfficeContactCreateManyInputObjectSchema: z.ZodType<Prisma.OfficeContactCreateManyInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactCreateManyInput>;
export const OfficeContactCreateManyInputObjectZodSchema = makeSchema();

View File

@@ -8,7 +8,11 @@ const makeSchema = () => z.object({
dentistName: z.string().optional().nullable(),
phoneNumber: z.string().optional().nullable(),
email: z.string().optional().nullable(),
fax: z.string().optional().nullable()
fax: z.string().optional().nullable(),
streetAddress: z.string().optional().nullable(),
city: z.string().optional().nullable(),
state: z.string().optional().nullable(),
zipCode: z.string().optional().nullable()
}).strict();
export const OfficeContactCreateWithoutUserInputObjectSchema: z.ZodType<Prisma.OfficeContactCreateWithoutUserInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactCreateWithoutUserInput>;
export const OfficeContactCreateWithoutUserInputObjectZodSchema = makeSchema();

View File

@@ -10,7 +10,11 @@ const makeSchema = () => z.object({
dentistName: z.literal(true).optional(),
phoneNumber: z.literal(true).optional(),
email: z.literal(true).optional(),
fax: z.literal(true).optional()
fax: z.literal(true).optional(),
streetAddress: z.literal(true).optional(),
city: z.literal(true).optional(),
state: z.literal(true).optional(),
zipCode: z.literal(true).optional()
}).strict();
export const OfficeContactMaxAggregateInputObjectSchema: z.ZodType<Prisma.OfficeContactMaxAggregateInputType> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactMaxAggregateInputType>;
export const OfficeContactMaxAggregateInputObjectZodSchema = makeSchema();

View File

@@ -10,7 +10,11 @@ const makeSchema = () => z.object({
dentistName: SortOrderSchema.optional(),
phoneNumber: SortOrderSchema.optional(),
email: SortOrderSchema.optional(),
fax: SortOrderSchema.optional()
fax: SortOrderSchema.optional(),
streetAddress: SortOrderSchema.optional(),
city: SortOrderSchema.optional(),
state: SortOrderSchema.optional(),
zipCode: SortOrderSchema.optional()
}).strict();
export const OfficeContactMaxOrderByAggregateInputObjectSchema: z.ZodType<Prisma.OfficeContactMaxOrderByAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactMaxOrderByAggregateInput>;
export const OfficeContactMaxOrderByAggregateInputObjectZodSchema = makeSchema();

View File

@@ -10,7 +10,11 @@ const makeSchema = () => z.object({
dentistName: z.literal(true).optional(),
phoneNumber: z.literal(true).optional(),
email: z.literal(true).optional(),
fax: z.literal(true).optional()
fax: z.literal(true).optional(),
streetAddress: z.literal(true).optional(),
city: z.literal(true).optional(),
state: z.literal(true).optional(),
zipCode: z.literal(true).optional()
}).strict();
export const OfficeContactMinAggregateInputObjectSchema: z.ZodType<Prisma.OfficeContactMinAggregateInputType> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactMinAggregateInputType>;
export const OfficeContactMinAggregateInputObjectZodSchema = makeSchema();

View File

@@ -10,7 +10,11 @@ const makeSchema = () => z.object({
dentistName: SortOrderSchema.optional(),
phoneNumber: SortOrderSchema.optional(),
email: SortOrderSchema.optional(),
fax: SortOrderSchema.optional()
fax: SortOrderSchema.optional(),
streetAddress: SortOrderSchema.optional(),
city: SortOrderSchema.optional(),
state: SortOrderSchema.optional(),
zipCode: SortOrderSchema.optional()
}).strict();
export const OfficeContactMinOrderByAggregateInputObjectSchema: z.ZodType<Prisma.OfficeContactMinOrderByAggregateInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactMinOrderByAggregateInput>;
export const OfficeContactMinOrderByAggregateInputObjectZodSchema = makeSchema();

View File

@@ -17,6 +17,10 @@ const makeSchema = () => z.object({
phoneNumber: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
email: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
fax: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
streetAddress: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
city: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
state: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
zipCode: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
_count: z.lazy(() => OfficeContactCountOrderByAggregateInputObjectSchema).optional(),
_avg: z.lazy(() => OfficeContactAvgOrderByAggregateInputObjectSchema).optional(),
_max: z.lazy(() => OfficeContactMaxOrderByAggregateInputObjectSchema).optional(),

View File

@@ -13,6 +13,10 @@ const makeSchema = () => z.object({
phoneNumber: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
email: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
fax: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
streetAddress: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
city: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
state: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
zipCode: z.union([SortOrderSchema, z.lazy(() => SortOrderInputObjectSchema)]).optional(),
user: z.lazy(() => UserOrderByWithRelationInputObjectSchema).optional()
}).strict();
export const OfficeContactOrderByWithRelationInputObjectSchema: z.ZodType<Prisma.OfficeContactOrderByWithRelationInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactOrderByWithRelationInput>;

View File

@@ -14,7 +14,11 @@ const officecontactscalarwherewithaggregatesinputSchema = z.object({
dentistName: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
phoneNumber: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
email: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
fax: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable()
fax: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
streetAddress: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
city: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
state: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable(),
zipCode: z.union([z.lazy(() => StringNullableWithAggregatesFilterObjectSchema), z.string()]).optional().nullable()
}).strict();
export const OfficeContactScalarWhereWithAggregatesInputObjectSchema: z.ZodType<Prisma.OfficeContactScalarWhereWithAggregatesInput> = officecontactscalarwherewithaggregatesinputSchema as unknown as z.ZodType<Prisma.OfficeContactScalarWhereWithAggregatesInput>;
export const OfficeContactScalarWhereWithAggregatesInputObjectZodSchema = officecontactscalarwherewithaggregatesinputSchema;

View File

@@ -11,6 +11,10 @@ const makeSchema = () => z.object({
phoneNumber: z.boolean().optional(),
email: z.boolean().optional(),
fax: z.boolean().optional(),
streetAddress: z.boolean().optional(),
city: z.boolean().optional(),
state: z.boolean().optional(),
zipCode: z.boolean().optional(),
user: z.union([z.boolean(), z.lazy(() => UserArgsObjectSchema)]).optional()
}).strict();
export const OfficeContactSelectObjectSchema: z.ZodType<Prisma.OfficeContactSelect> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactSelect>;

View File

@@ -10,7 +10,11 @@ const makeSchema = () => z.object({
dentistName: z.string().optional().nullable(),
phoneNumber: z.string().optional().nullable(),
email: z.string().optional().nullable(),
fax: z.string().optional().nullable()
fax: z.string().optional().nullable(),
streetAddress: z.string().optional().nullable(),
city: z.string().optional().nullable(),
state: z.string().optional().nullable(),
zipCode: z.string().optional().nullable()
}).strict();
export const OfficeContactUncheckedCreateInputObjectSchema: z.ZodType<Prisma.OfficeContactUncheckedCreateInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactUncheckedCreateInput>;
export const OfficeContactUncheckedCreateInputObjectZodSchema = makeSchema();

View File

@@ -9,7 +9,11 @@ const makeSchema = () => z.object({
dentistName: z.string().optional().nullable(),
phoneNumber: z.string().optional().nullable(),
email: z.string().optional().nullable(),
fax: z.string().optional().nullable()
fax: z.string().optional().nullable(),
streetAddress: z.string().optional().nullable(),
city: z.string().optional().nullable(),
state: z.string().optional().nullable(),
zipCode: z.string().optional().nullable()
}).strict();
export const OfficeContactUncheckedCreateWithoutUserInputObjectSchema: z.ZodType<Prisma.OfficeContactUncheckedCreateWithoutUserInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactUncheckedCreateWithoutUserInput>;
export const OfficeContactUncheckedCreateWithoutUserInputObjectZodSchema = makeSchema();

View File

@@ -11,7 +11,11 @@ const makeSchema = () => z.object({
dentistName: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
phoneNumber: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
email: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
streetAddress: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
city: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
state: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
zipCode: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
}).strict();
export const OfficeContactUncheckedUpdateInputObjectSchema: z.ZodType<Prisma.OfficeContactUncheckedUpdateInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactUncheckedUpdateInput>;
export const OfficeContactUncheckedUpdateInputObjectZodSchema = makeSchema();

View File

@@ -11,7 +11,11 @@ const makeSchema = () => z.object({
dentistName: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
phoneNumber: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
email: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
streetAddress: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
city: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
state: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
zipCode: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
}).strict();
export const OfficeContactUncheckedUpdateManyInputObjectSchema: z.ZodType<Prisma.OfficeContactUncheckedUpdateManyInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactUncheckedUpdateManyInput>;
export const OfficeContactUncheckedUpdateManyInputObjectZodSchema = makeSchema();

View File

@@ -10,7 +10,11 @@ const makeSchema = () => z.object({
dentistName: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
phoneNumber: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
email: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
streetAddress: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
city: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
state: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
zipCode: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
}).strict();
export const OfficeContactUncheckedUpdateWithoutUserInputObjectSchema: z.ZodType<Prisma.OfficeContactUncheckedUpdateWithoutUserInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactUncheckedUpdateWithoutUserInput>;
export const OfficeContactUncheckedUpdateWithoutUserInputObjectZodSchema = makeSchema();

View File

@@ -10,6 +10,10 @@ const makeSchema = () => z.object({
phoneNumber: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
email: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
streetAddress: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
city: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
state: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
zipCode: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
user: z.lazy(() => UserUpdateOneRequiredWithoutOfficeContactNestedInputObjectSchema).optional()
}).strict();
export const OfficeContactUpdateInputObjectSchema: z.ZodType<Prisma.OfficeContactUpdateInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactUpdateInput>;

View File

@@ -8,7 +8,11 @@ const makeSchema = () => z.object({
dentistName: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
phoneNumber: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
email: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
streetAddress: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
city: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
state: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
zipCode: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
}).strict();
export const OfficeContactUpdateManyMutationInputObjectSchema: z.ZodType<Prisma.OfficeContactUpdateManyMutationInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactUpdateManyMutationInput>;
export const OfficeContactUpdateManyMutationInputObjectZodSchema = makeSchema();

View File

@@ -8,7 +8,11 @@ const makeSchema = () => z.object({
dentistName: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
phoneNumber: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
email: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
fax: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
streetAddress: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
city: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
state: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable(),
zipCode: z.union([z.string(), z.lazy(() => NullableStringFieldUpdateOperationsInputObjectSchema)]).optional().nullable()
}).strict();
export const OfficeContactUpdateWithoutUserInputObjectSchema: z.ZodType<Prisma.OfficeContactUpdateWithoutUserInput> = makeSchema() as unknown as z.ZodType<Prisma.OfficeContactUpdateWithoutUserInput>;
export const OfficeContactUpdateWithoutUserInputObjectZodSchema = makeSchema();

View File

@@ -17,6 +17,10 @@ const officecontactwhereinputSchema = z.object({
phoneNumber: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
email: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
fax: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
streetAddress: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
city: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
state: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
zipCode: z.union([z.lazy(() => StringNullableFilterObjectSchema), z.string()]).optional().nullable(),
user: z.union([z.lazy(() => UserScalarRelationFilterObjectSchema), z.lazy(() => UserWhereInputObjectSchema)]).optional()
}).strict();
export const OfficeContactWhereInputObjectSchema: z.ZodType<Prisma.OfficeContactWhereInput> = officecontactwhereinputSchema as unknown as z.ZodType<Prisma.OfficeContactWhereInput>;