mirror of
https://dev.azure.com/globalhealthx/EMR/_git/helix-engage-server
synced 2026-05-18 20:08:19 +00:00
fix: link patientId to appointment in WhatsApp booking
Appointments created via WhatsApp had null patientId — lookup_appointments couldn't find them. Now resolves patient before booking and includes patientId in the createAppointment mutation. Fixed in both flow tool registry and legacy messaging service. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -172,8 +172,10 @@ export class ToolRegistry {
|
|||||||
return { booked: false, message: `${doctorName} is fully booked at this time.` };
|
return { booked: false, message: `${doctorName} is fully booked at this time.` };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create lead/patient if new
|
// Resolve caller — creates lead/patient if new
|
||||||
const resolved = await this.caller.resolve(cleanPhone, ctx.auth).catch(() => null);
|
const resolved = await this.caller.resolve(cleanPhone, ctx.auth).catch(() => null);
|
||||||
|
let patientId = resolved?.patientId;
|
||||||
|
|
||||||
if (resolved?.isNew && patientName) {
|
if (resolved?.isNew && patientName) {
|
||||||
const firstName = patientName.split(' ')[0];
|
const firstName = patientName.split(' ')[0];
|
||||||
const lastName = patientName.split(' ').slice(1).join(' ') || '';
|
const lastName = patientName.split(' ').slice(1).join(' ') || '';
|
||||||
@@ -182,7 +184,7 @@ export class ToolRegistry {
|
|||||||
`mutation($data: PatientCreateInput!) { createPatient(data: $data) { id } }`,
|
`mutation($data: PatientCreateInput!) { createPatient(data: $data) { id } }`,
|
||||||
{ data: { fullName: { firstName, lastName }, phones: { primaryPhoneNumber: `+91${cleanPhone}` }, patientType: 'NEW' } },
|
{ data: { fullName: { firstName, lastName }, phones: { primaryPhoneNumber: `+91${cleanPhone}` }, patientType: 'NEW' } },
|
||||||
);
|
);
|
||||||
const patientId = p?.createPatient?.id;
|
patientId = p?.createPatient?.id;
|
||||||
await this.platform.query<any>(
|
await this.platform.query<any>(
|
||||||
`mutation($data: LeadCreateInput!) { createLead(data: $data) { id } }`,
|
`mutation($data: LeadCreateInput!) { createLead(data: $data) { id } }`,
|
||||||
{ data: { name: `WhatsApp — ${patientName}`, contactName: { firstName, lastName }, contactPhone: { primaryPhoneNumber: `+91${cleanPhone}` }, source: 'WHATSAPP', status: 'NEW', interestedService: department, ...(patientId ? { patientId } : {}) } },
|
{ data: { name: `WhatsApp — ${patientName}`, contactName: { firstName, lastName }, contactPhone: { primaryPhoneNumber: `+91${cleanPhone}` }, source: 'WHATSAPP', status: 'NEW', interestedService: department, ...(patientId ? { patientId } : {}) } },
|
||||||
@@ -190,10 +192,10 @@ export class ToolRegistry {
|
|||||||
} catch {}
|
} catch {}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Book
|
// Book — include patientId so appointment is linked to patient record
|
||||||
const result = await this.platform.query<any>(
|
const result = await this.platform.query<any>(
|
||||||
`mutation($data: AppointmentCreateInput!) { createAppointment(data: $data) { id } }`,
|
`mutation($data: AppointmentCreateInput!) { createAppointment(data: $data) { id } }`,
|
||||||
{ data: { name: `WhatsApp Booking — ${patientName} (${department})`, scheduledAt, status: 'SCHEDULED', doctorName, department, reasonForVisit: reason ?? 'General Consultation' } },
|
{ data: { name: `WhatsApp Booking — ${patientName} (${department})`, scheduledAt, status: 'SCHEDULED', doctorName, department, reasonForVisit: reason ?? 'General Consultation', ...(patientId ? { patientId } : {}) } },
|
||||||
);
|
);
|
||||||
const id = result?.createAppointment?.id;
|
const id = result?.createAppointment?.id;
|
||||||
if (id) {
|
if (id) {
|
||||||
|
|||||||
@@ -380,6 +380,7 @@ ${callerContext ? `\n${callerContext}` : ''}`;
|
|||||||
return { booked: false, message: `${doctorName} is fully booked at this time. Please choose a different slot.` };
|
return { booked: false, message: `${doctorName} is fully booked at this time. Please choose a different slot.` };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let patientId = resolved?.patientId;
|
||||||
if (resolved?.isNew) {
|
if (resolved?.isNew) {
|
||||||
const firstName = patientName.split(' ')[0];
|
const firstName = patientName.split(' ')[0];
|
||||||
const lastName = patientName.split(' ').slice(1).join(' ') || '';
|
const lastName = patientName.split(' ').slice(1).join(' ') || '';
|
||||||
@@ -400,7 +401,7 @@ ${callerContext ? `\n${callerContext}` : ''}`;
|
|||||||
|
|
||||||
const result = await platform.query<any>(
|
const result = await platform.query<any>(
|
||||||
`mutation($data: AppointmentCreateInput!) { createAppointment(data: $data) { id } }`,
|
`mutation($data: AppointmentCreateInput!) { createAppointment(data: $data) { id } }`,
|
||||||
{ data: { name: `WhatsApp Booking — ${patientName} (${department})`, scheduledAt, status: 'SCHEDULED', doctorName, department, reasonForVisit: reason } },
|
{ data: { name: `WhatsApp Booking — ${patientName} (${department})`, scheduledAt, status: 'SCHEDULED', doctorName, department, reasonForVisit: reason, ...(patientId ? { patientId } : {}) } },
|
||||||
);
|
);
|
||||||
const id = result?.createAppointment?.id;
|
const id = result?.createAppointment?.id;
|
||||||
if (id) {
|
if (id) {
|
||||||
|
|||||||
Reference in New Issue
Block a user