From a8d8c992a490b8f9174b4b69eae1799aa4948ecd Mon Sep 17 00:00:00 2001 From: Peer Richelsen Date: Thu, 4 Apr 2024 12:57:43 +0100 Subject: [PATCH] chore: added email and company form to cal.ai form (#14306) * added email and company form * i18n * feat: add guest email and company * chore: update and format prompt * chore: hint var * chore: fix err message --------- Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Co-authored-by: Udit Takkar --- .../eventtype/AIEventController.tsx | 18 ++++++++- .../views/event-types-single-view.tsx | 39 +++++++++++++++++-- apps/web/public/static/locales/en/common.json | 2 + packages/features/eventtypes/lib/types.ts | 2 + .../sdk/src/endpoints/events/types.ts | 2 + .../migration.sql | 10 +++++ packages/prisma/schema.prisma | 4 +- packages/prisma/zod-utils.ts | 6 +++ .../server/routers/viewer/eventTypes/types.ts | 2 + .../organizations/createPhoneCall.handler.ts | 19 +++++++-- 10 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 packages/prisma/migrations/20240404092234_add_guest_company_and_email/migration.sql diff --git a/apps/web/components/eventtype/AIEventController.tsx b/apps/web/components/eventtype/AIEventController.tsx index fc4764e006..36451d101f 100644 --- a/apps/web/components/eventtype/AIEventController.tsx +++ b/apps/web/components/eventtype/AIEventController.tsx @@ -190,12 +190,28 @@ const AISettings = ({ eventType }: { eventType: EventTypeSetup }) => { + + + + @@ -256,6 +287,8 @@ const EventTypePage = (props: EventTypeSetupProps) => { enabled: eventType.aiPhoneCallConfig?.enabled, beginMessage: eventType.aiPhoneCallConfig?.beginMessage ?? DEFAULT_BEGIN_MESSAGE, guestName: eventType.aiPhoneCallConfig?.guestName, + guestEmail: eventType.aiPhoneCallConfig?.guestEmail, + guestCompany: eventType.aiPhoneCallConfig?.guestCompany, yourPhoneNumber: eventType.aiPhoneCallConfig?.yourPhoneNumber, numberToCall: eventType.aiPhoneCallConfig?.numberToCall, }, diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index efd4f87716..4b8c99e5b2 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -2256,6 +2256,8 @@ "troubleshooter": "Troubleshooter", "number_to_call": "Number to Call", "guest_name": "Guest Name", + "guest_email": "Guest Email", + "guest_company": "Guest Company", "please_install_a_calendar": "Please install a calendar", "instant_tab_title": "Instant Booking", "instant_event_tab_description": "Let people book immediately", diff --git a/packages/features/eventtypes/lib/types.ts b/packages/features/eventtypes/lib/types.ts index 8363cb2230..3acb0cad2f 100644 --- a/packages/features/eventtypes/lib/types.ts +++ b/packages/features/eventtypes/lib/types.ts @@ -65,6 +65,8 @@ export type FormValues = { yourPhoneNumber: string; numberToCall: string; guestName: string; + guestEmail: string; + guestCompany: string; }; customInputs: CustomInputParsed[]; schedule: number | null; diff --git a/packages/platform/sdk/src/endpoints/events/types.ts b/packages/platform/sdk/src/endpoints/events/types.ts index ddce411966..87edf50321 100644 --- a/packages/platform/sdk/src/endpoints/events/types.ts +++ b/packages/platform/sdk/src/endpoints/events/types.ts @@ -53,6 +53,8 @@ export type Event = { yourPhoneNumber: string; numberToCall: string; guestName: string; + guestEmail: string; + guestCompany: string; }; schedulingType: string; length: number; diff --git a/packages/prisma/migrations/20240404092234_add_guest_company_and_email/migration.sql b/packages/prisma/migrations/20240404092234_add_guest_company_and_email/migration.sql new file mode 100644 index 0000000000..273d5a512b --- /dev/null +++ b/packages/prisma/migrations/20240404092234_add_guest_company_and_email/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `guestCompany` to the `AIPhoneCallConfiguration` table without a default value. This is not possible if the table is not empty. + - Added the required column `guestEmail` to the `AIPhoneCallConfiguration` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "AIPhoneCallConfiguration" ADD COLUMN "guestCompany" TEXT NOT NULL, +ADD COLUMN "guestEmail" TEXT NOT NULL; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 0dcd8a371a..dd63a2cfd0 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -396,7 +396,7 @@ model OrganizationSettings { isOrganizationVerified Boolean @default(false) orgAutoAcceptEmail String lockEventTypeCreationForUsers Boolean @default(false) - // It decides if instance ADMIN has reviewed the organization or not. + // It decides if instance ADMIN has reviewed the organization or not. // It is used to allow super sensitive operations like 'impersonation of Org members by Org admin' isAdminReviewed Boolean @default(false) dSyncData DSyncData? @@ -919,6 +919,8 @@ model AIPhoneCallConfiguration { yourPhoneNumber String numberToCall String guestName String + guestEmail String + guestCompany String enabled Boolean @default(false) beginMessage String? llmId String? diff --git a/packages/prisma/zod-utils.ts b/packages/prisma/zod-utils.ts index f69a321d01..d6b7125589 100644 --- a/packages/prisma/zod-utils.ts +++ b/packages/prisma/zod-utils.ts @@ -702,6 +702,12 @@ export const AIPhoneSettingSchema = z.object({ guestName: z.string().trim().min(1, { message: "Please enter Guest Name", }), + guestEmail: z.string().trim().email().min(1, { + message: "Please enter Guest Email", + }), + guestCompany: z.string().trim().min(1, { + message: "Please enter Guest Company", + }), generalPrompt: z.string().trim().min(1, { message: "Please enter prompt", }), diff --git a/packages/trpc/server/routers/viewer/eventTypes/types.ts b/packages/trpc/server/routers/viewer/eventTypes/types.ts index 1244231152..4744d15949 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/types.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/types.ts @@ -16,6 +16,8 @@ export const EventTypeUpdateInput = _EventTypeModel yourPhoneNumber: z.string().default(""), numberToCall: z.string().default(""), guestName: z.string().default(""), + guestEmail: z.string().default(""), + guestCompany: z.string().default(""), }) .optional(), calAiPhoneScript: z.string().optional(), diff --git a/packages/trpc/server/routers/viewer/organizations/createPhoneCall.handler.ts b/packages/trpc/server/routers/viewer/organizations/createPhoneCall.handler.ts index c011a64e63..16dd03f7e3 100644 --- a/packages/trpc/server/routers/viewer/organizations/createPhoneCall.handler.ts +++ b/packages/trpc/server/routers/viewer/organizations/createPhoneCall.handler.ts @@ -60,8 +60,17 @@ const createPhoneCallHandler = async ({ input, ctx }: CreatePhoneCallProps) => { identifier: `createPhoneCall:${ctx.user.id}`, }); - const { yourPhoneNumber, numberToCall, guestName, eventTypeId, beginMessage, generalPrompt, calApiKey } = - input; + const { + yourPhoneNumber, + numberToCall, + guestName, + guestEmail, + guestCompany, + eventTypeId, + beginMessage, + generalPrompt, + calApiKey, + } = input; const aiPhoneCallConfig = await ctx.prisma.aIPhoneCallConfiguration.upsert({ where: { @@ -72,6 +81,8 @@ const createPhoneCallHandler = async ({ input, ctx }: CreatePhoneCallProps) => { generalPrompt, enabled: true, guestName, + guestEmail, + guestCompany, numberToCall, yourPhoneNumber, }, @@ -81,6 +92,8 @@ const createPhoneCallHandler = async ({ input, ctx }: CreatePhoneCallProps) => { generalPrompt, enabled: true, guestName, + guestEmail, + guestCompany, numberToCall, yourPhoneNumber, }, @@ -169,7 +182,7 @@ const createPhoneCallHandler = async ({ input, ctx }: CreatePhoneCallProps) => { body: JSON.stringify({ from_number: yourPhoneNumber, to_number: numberToCall, - retell_llm_dynamic_variables: { name: guestName }, + retell_llm_dynamic_variables: { name: guestName, company: guestCompany, email: guestEmail }, }), }).then(createPhoneSchema.parse);