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

File diff suppressed because one or more lines are too long

View File

@@ -440,7 +440,11 @@ exports.Prisma.OfficeContactScalarFieldEnum = {
dentistName: 'dentistName',
phoneNumber: 'phoneNumber',
email: 'email',
fax: 'fax'
fax: 'fax',
streetAddress: 'streetAddress',
city: 'city',
state: 'state',
zipCode: 'zipCode'
};
exports.Prisma.InsuranceContactScalarFieldEnum = {

View File

@@ -36884,6 +36884,10 @@ export namespace Prisma {
phoneNumber: string | null
email: string | null
fax: string | null
streetAddress: string | null
city: string | null
state: string | null
zipCode: string | null
}
export type OfficeContactMaxAggregateOutputType = {
@@ -36895,6 +36899,10 @@ export namespace Prisma {
phoneNumber: string | null
email: string | null
fax: string | null
streetAddress: string | null
city: string | null
state: string | null
zipCode: string | null
}
export type OfficeContactCountAggregateOutputType = {
@@ -36906,6 +36914,10 @@ export namespace Prisma {
phoneNumber: number
email: number
fax: number
streetAddress: number
city: number
state: number
zipCode: number
_all: number
}
@@ -36929,6 +36941,10 @@ export namespace Prisma {
phoneNumber?: true
email?: true
fax?: true
streetAddress?: true
city?: true
state?: true
zipCode?: true
}
export type OfficeContactMaxAggregateInputType = {
@@ -36940,6 +36956,10 @@ export namespace Prisma {
phoneNumber?: true
email?: true
fax?: true
streetAddress?: true
city?: true
state?: true
zipCode?: true
}
export type OfficeContactCountAggregateInputType = {
@@ -36951,6 +36971,10 @@ export namespace Prisma {
phoneNumber?: true
email?: true
fax?: true
streetAddress?: true
city?: true
state?: true
zipCode?: true
_all?: true
}
@@ -37049,6 +37073,10 @@ export namespace Prisma {
phoneNumber: string | null
email: string | null
fax: string | null
streetAddress: string | null
city: string | null
state: string | null
zipCode: string | null
_count: OfficeContactCountAggregateOutputType | null
_avg: OfficeContactAvgAggregateOutputType | null
_sum: OfficeContactSumAggregateOutputType | null
@@ -37079,6 +37107,10 @@ export namespace Prisma {
phoneNumber?: boolean
email?: boolean
fax?: boolean
streetAddress?: boolean
city?: boolean
state?: boolean
zipCode?: boolean
user?: boolean | UserDefaultArgs<ExtArgs>
}, ExtArgs["result"]["officeContact"]>
@@ -37091,6 +37123,10 @@ export namespace Prisma {
phoneNumber?: boolean
email?: boolean
fax?: boolean
streetAddress?: boolean
city?: boolean
state?: boolean
zipCode?: boolean
user?: boolean | UserDefaultArgs<ExtArgs>
}, ExtArgs["result"]["officeContact"]>
@@ -37103,6 +37139,10 @@ export namespace Prisma {
phoneNumber?: boolean
email?: boolean
fax?: boolean
streetAddress?: boolean
city?: boolean
state?: boolean
zipCode?: boolean
user?: boolean | UserDefaultArgs<ExtArgs>
}, ExtArgs["result"]["officeContact"]>
@@ -37115,9 +37155,13 @@ export namespace Prisma {
phoneNumber?: boolean
email?: boolean
fax?: boolean
streetAddress?: boolean
city?: boolean
state?: boolean
zipCode?: boolean
}
export type OfficeContactOmit<ExtArgs extends $Extensions.InternalArgs = $Extensions.DefaultArgs> = $Extensions.GetOmit<"id" | "userId" | "officeName" | "receptionistName" | "dentistName" | "phoneNumber" | "email" | "fax", ExtArgs["result"]["officeContact"]>
export type OfficeContactOmit<ExtArgs extends $Extensions.InternalArgs = $Extensions.DefaultArgs> = $Extensions.GetOmit<"id" | "userId" | "officeName" | "receptionistName" | "dentistName" | "phoneNumber" | "email" | "fax" | "streetAddress" | "city" | "state" | "zipCode", ExtArgs["result"]["officeContact"]>
export type OfficeContactInclude<ExtArgs extends $Extensions.InternalArgs = $Extensions.DefaultArgs> = {
user?: boolean | UserDefaultArgs<ExtArgs>
}
@@ -37142,6 +37186,10 @@ export namespace Prisma {
phoneNumber: string | null
email: string | null
fax: string | null
streetAddress: string | null
city: string | null
state: string | null
zipCode: string | null
}, ExtArgs["result"]["officeContact"]>
composites: {}
}
@@ -37574,6 +37622,10 @@ export namespace Prisma {
readonly phoneNumber: FieldRef<"OfficeContact", 'String'>
readonly email: FieldRef<"OfficeContact", 'String'>
readonly fax: FieldRef<"OfficeContact", 'String'>
readonly streetAddress: FieldRef<"OfficeContact", 'String'>
readonly city: FieldRef<"OfficeContact", 'String'>
readonly state: FieldRef<"OfficeContact", 'String'>
readonly zipCode: FieldRef<"OfficeContact", 'String'>
}
@@ -41686,7 +41738,11 @@ export namespace Prisma {
dentistName: 'dentistName',
phoneNumber: 'phoneNumber',
email: 'email',
fax: 'fax'
fax: 'fax',
streetAddress: 'streetAddress',
city: 'city',
state: 'state',
zipCode: 'zipCode'
};
export type OfficeContactScalarFieldEnum = (typeof OfficeContactScalarFieldEnum)[keyof typeof OfficeContactScalarFieldEnum]
@@ -44276,6 +44332,10 @@ export namespace Prisma {
phoneNumber?: StringNullableFilter<"OfficeContact"> | string | null
email?: StringNullableFilter<"OfficeContact"> | string | null
fax?: StringNullableFilter<"OfficeContact"> | string | null
streetAddress?: StringNullableFilter<"OfficeContact"> | string | null
city?: StringNullableFilter<"OfficeContact"> | string | null
state?: StringNullableFilter<"OfficeContact"> | string | null
zipCode?: StringNullableFilter<"OfficeContact"> | string | null
user?: XOR<UserScalarRelationFilter, UserWhereInput>
}
@@ -44288,6 +44348,10 @@ export namespace Prisma {
phoneNumber?: SortOrderInput | SortOrder
email?: SortOrderInput | SortOrder
fax?: SortOrderInput | SortOrder
streetAddress?: SortOrderInput | SortOrder
city?: SortOrderInput | SortOrder
state?: SortOrderInput | SortOrder
zipCode?: SortOrderInput | SortOrder
user?: UserOrderByWithRelationInput
}
@@ -44303,6 +44367,10 @@ export namespace Prisma {
phoneNumber?: StringNullableFilter<"OfficeContact"> | string | null
email?: StringNullableFilter<"OfficeContact"> | string | null
fax?: StringNullableFilter<"OfficeContact"> | string | null
streetAddress?: StringNullableFilter<"OfficeContact"> | string | null
city?: StringNullableFilter<"OfficeContact"> | string | null
state?: StringNullableFilter<"OfficeContact"> | string | null
zipCode?: StringNullableFilter<"OfficeContact"> | string | null
user?: XOR<UserScalarRelationFilter, UserWhereInput>
}, "id" | "userId">
@@ -44315,6 +44383,10 @@ export namespace Prisma {
phoneNumber?: SortOrderInput | SortOrder
email?: SortOrderInput | SortOrder
fax?: SortOrderInput | SortOrder
streetAddress?: SortOrderInput | SortOrder
city?: SortOrderInput | SortOrder
state?: SortOrderInput | SortOrder
zipCode?: SortOrderInput | SortOrder
_count?: OfficeContactCountOrderByAggregateInput
_avg?: OfficeContactAvgOrderByAggregateInput
_max?: OfficeContactMaxOrderByAggregateInput
@@ -44334,6 +44406,10 @@ export namespace Prisma {
phoneNumber?: StringNullableWithAggregatesFilter<"OfficeContact"> | string | null
email?: StringNullableWithAggregatesFilter<"OfficeContact"> | string | null
fax?: StringNullableWithAggregatesFilter<"OfficeContact"> | string | null
streetAddress?: StringNullableWithAggregatesFilter<"OfficeContact"> | string | null
city?: StringNullableWithAggregatesFilter<"OfficeContact"> | string | null
state?: StringNullableWithAggregatesFilter<"OfficeContact"> | string | null
zipCode?: StringNullableWithAggregatesFilter<"OfficeContact"> | string | null
}
export type InsuranceContactWhereInput = {
@@ -46755,6 +46831,10 @@ export namespace Prisma {
phoneNumber?: string | null
email?: string | null
fax?: string | null
streetAddress?: string | null
city?: string | null
state?: string | null
zipCode?: string | null
user: UserCreateNestedOneWithoutOfficeContactInput
}
@@ -46767,6 +46847,10 @@ export namespace Prisma {
phoneNumber?: string | null
email?: string | null
fax?: string | null
streetAddress?: string | null
city?: string | null
state?: string | null
zipCode?: string | null
}
export type OfficeContactUpdateInput = {
@@ -46776,6 +46860,10 @@ export namespace Prisma {
phoneNumber?: NullableStringFieldUpdateOperationsInput | string | null
email?: NullableStringFieldUpdateOperationsInput | string | null
fax?: NullableStringFieldUpdateOperationsInput | string | null
streetAddress?: NullableStringFieldUpdateOperationsInput | string | null
city?: NullableStringFieldUpdateOperationsInput | string | null
state?: NullableStringFieldUpdateOperationsInput | string | null
zipCode?: NullableStringFieldUpdateOperationsInput | string | null
user?: UserUpdateOneRequiredWithoutOfficeContactNestedInput
}
@@ -46788,6 +46876,10 @@ export namespace Prisma {
phoneNumber?: NullableStringFieldUpdateOperationsInput | string | null
email?: NullableStringFieldUpdateOperationsInput | string | null
fax?: NullableStringFieldUpdateOperationsInput | string | null
streetAddress?: NullableStringFieldUpdateOperationsInput | string | null
city?: NullableStringFieldUpdateOperationsInput | string | null
state?: NullableStringFieldUpdateOperationsInput | string | null
zipCode?: NullableStringFieldUpdateOperationsInput | string | null
}
export type OfficeContactCreateManyInput = {
@@ -46799,6 +46891,10 @@ export namespace Prisma {
phoneNumber?: string | null
email?: string | null
fax?: string | null
streetAddress?: string | null
city?: string | null
state?: string | null
zipCode?: string | null
}
export type OfficeContactUpdateManyMutationInput = {
@@ -46808,6 +46904,10 @@ export namespace Prisma {
phoneNumber?: NullableStringFieldUpdateOperationsInput | string | null
email?: NullableStringFieldUpdateOperationsInput | string | null
fax?: NullableStringFieldUpdateOperationsInput | string | null
streetAddress?: NullableStringFieldUpdateOperationsInput | string | null
city?: NullableStringFieldUpdateOperationsInput | string | null
state?: NullableStringFieldUpdateOperationsInput | string | null
zipCode?: NullableStringFieldUpdateOperationsInput | string | null
}
export type OfficeContactUncheckedUpdateManyInput = {
@@ -46819,6 +46919,10 @@ export namespace Prisma {
phoneNumber?: NullableStringFieldUpdateOperationsInput | string | null
email?: NullableStringFieldUpdateOperationsInput | string | null
fax?: NullableStringFieldUpdateOperationsInput | string | null
streetAddress?: NullableStringFieldUpdateOperationsInput | string | null
city?: NullableStringFieldUpdateOperationsInput | string | null
state?: NullableStringFieldUpdateOperationsInput | string | null
zipCode?: NullableStringFieldUpdateOperationsInput | string | null
}
export type InsuranceContactCreateInput = {
@@ -49197,6 +49301,10 @@ export namespace Prisma {
phoneNumber?: SortOrder
email?: SortOrder
fax?: SortOrder
streetAddress?: SortOrder
city?: SortOrder
state?: SortOrder
zipCode?: SortOrder
}
export type OfficeContactAvgOrderByAggregateInput = {
@@ -49213,6 +49321,10 @@ export namespace Prisma {
phoneNumber?: SortOrder
email?: SortOrder
fax?: SortOrder
streetAddress?: SortOrder
city?: SortOrder
state?: SortOrder
zipCode?: SortOrder
}
export type OfficeContactMinOrderByAggregateInput = {
@@ -49224,6 +49336,10 @@ export namespace Prisma {
phoneNumber?: SortOrder
email?: SortOrder
fax?: SortOrder
streetAddress?: SortOrder
city?: SortOrder
state?: SortOrder
zipCode?: SortOrder
}
export type OfficeContactSumOrderByAggregateInput = {
@@ -52999,6 +53115,10 @@ export namespace Prisma {
phoneNumber?: string | null
email?: string | null
fax?: string | null
streetAddress?: string | null
city?: string | null
state?: string | null
zipCode?: string | null
}
export type OfficeContactUncheckedCreateWithoutUserInput = {
@@ -53009,6 +53129,10 @@ export namespace Prisma {
phoneNumber?: string | null
email?: string | null
fax?: string | null
streetAddress?: string | null
city?: string | null
state?: string | null
zipCode?: string | null
}
export type OfficeContactCreateOrConnectWithoutUserInput = {
@@ -53581,6 +53705,10 @@ export namespace Prisma {
phoneNumber?: NullableStringFieldUpdateOperationsInput | string | null
email?: NullableStringFieldUpdateOperationsInput | string | null
fax?: NullableStringFieldUpdateOperationsInput | string | null
streetAddress?: NullableStringFieldUpdateOperationsInput | string | null
city?: NullableStringFieldUpdateOperationsInput | string | null
state?: NullableStringFieldUpdateOperationsInput | string | null
zipCode?: NullableStringFieldUpdateOperationsInput | string | null
}
export type OfficeContactUncheckedUpdateWithoutUserInput = {
@@ -53591,6 +53719,10 @@ export namespace Prisma {
phoneNumber?: NullableStringFieldUpdateOperationsInput | string | null
email?: NullableStringFieldUpdateOperationsInput | string | null
fax?: NullableStringFieldUpdateOperationsInput | string | null
streetAddress?: NullableStringFieldUpdateOperationsInput | string | null
city?: NullableStringFieldUpdateOperationsInput | string | null
state?: NullableStringFieldUpdateOperationsInput | string | null
zipCode?: NullableStringFieldUpdateOperationsInput | string | null
}
export type ProcedureTimeslotUpsertWithoutUserInput = {

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
{
"name": "prisma-client-bdc07eb887b3bb595b0151af876608d0c2dad5b625bc466303ffa3819c38e3ca",
"name": "prisma-client-7ab23aa0435ee62d1543cc6f3f10f1fac4ea741f94efe006ada0cea03090a0c9",
"main": "index.js",
"types": "index.d.ts",
"browser": "default.js",

View File

@@ -604,6 +604,10 @@ model OfficeContact {
phoneNumber String?
email String?
fax String?
streetAddress String?
city String?
state String?
zipCode String?
user User @relation(fields: [userId], references: [id], onDelete: Cascade)