mirror of
https://dev.azure.com/globalhealthx/EMR/_git/helix-engage
synced 2026-04-11 18:28:15 +00:00
feat: define entity types for Lead, Campaign, Ad, LeadActivity, FollowUp, Message, WhatsAppTemplate
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
244
src/types/entities.ts
Normal file
244
src/types/entities.ts
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
// Lead domain
|
||||||
|
export type LeadSource =
|
||||||
|
| 'WEBSITE'
|
||||||
|
| 'FACEBOOK_AD'
|
||||||
|
| 'GOOGLE_AD'
|
||||||
|
| 'INSTAGRAM'
|
||||||
|
| 'GOOGLE_MY_BUSINESS'
|
||||||
|
| 'REFERRAL'
|
||||||
|
| 'WALK_IN'
|
||||||
|
| 'WHATSAPP'
|
||||||
|
| 'PHONE'
|
||||||
|
| 'OTHER';
|
||||||
|
|
||||||
|
export type LeadStatus =
|
||||||
|
| 'NEW'
|
||||||
|
| 'CONTACTED'
|
||||||
|
| 'QUALIFIED'
|
||||||
|
| 'NURTURING'
|
||||||
|
| 'APPOINTMENT_SET'
|
||||||
|
| 'CONVERTED'
|
||||||
|
| 'LOST';
|
||||||
|
|
||||||
|
export type Priority = 'LOW' | 'NORMAL' | 'HIGH' | 'URGENT';
|
||||||
|
|
||||||
|
// Campaign domain
|
||||||
|
export type CampaignType =
|
||||||
|
| 'OUTBOUND_CALL'
|
||||||
|
| 'WHATSAPP'
|
||||||
|
| 'SMS'
|
||||||
|
| 'EMAIL'
|
||||||
|
| 'FACEBOOK_AD'
|
||||||
|
| 'GOOGLE_AD'
|
||||||
|
| 'INSTAGRAM_AD';
|
||||||
|
|
||||||
|
export type CampaignStatus = 'DRAFT' | 'ACTIVE' | 'PAUSED' | 'COMPLETED';
|
||||||
|
|
||||||
|
export type CampaignPlatform = 'FACEBOOK' | 'GOOGLE' | 'INSTAGRAM' | 'YOUTUBE' | 'MANUAL';
|
||||||
|
|
||||||
|
// Ad domain
|
||||||
|
export type AdStatus = 'DRAFT' | 'ACTIVE' | 'PAUSED' | 'ENDED';
|
||||||
|
|
||||||
|
export type AdFormat = 'IMAGE' | 'VIDEO' | 'CAROUSEL' | 'TEXT' | 'LEAD_FORM';
|
||||||
|
|
||||||
|
// Activity domain
|
||||||
|
export type LeadActivityType =
|
||||||
|
| 'STATUS_CHANGE'
|
||||||
|
| 'CALL_MADE'
|
||||||
|
| 'CALL_RECEIVED'
|
||||||
|
| 'WHATSAPP_SENT'
|
||||||
|
| 'WHATSAPP_RECEIVED'
|
||||||
|
| 'SMS_SENT'
|
||||||
|
| 'EMAIL_SENT'
|
||||||
|
| 'EMAIL_RECEIVED'
|
||||||
|
| 'NOTE_ADDED'
|
||||||
|
| 'ASSIGNED'
|
||||||
|
| 'APPOINTMENT_BOOKED'
|
||||||
|
| 'FOLLOW_UP_CREATED'
|
||||||
|
| 'CONVERTED'
|
||||||
|
| 'MARKED_SPAM'
|
||||||
|
| 'DUPLICATE_DETECTED';
|
||||||
|
|
||||||
|
export type Channel = 'PHONE' | 'WHATSAPP' | 'SMS' | 'EMAIL' | 'IN_PERSON' | 'SYSTEM';
|
||||||
|
|
||||||
|
export type ActivityOutcome =
|
||||||
|
| 'SUCCESSFUL'
|
||||||
|
| 'NO_ANSWER'
|
||||||
|
| 'BUSY'
|
||||||
|
| 'NOT_INTERESTED'
|
||||||
|
| 'CALLBACK_REQUESTED'
|
||||||
|
| 'INFORMATION_SENT';
|
||||||
|
|
||||||
|
// Follow-up domain
|
||||||
|
export type FollowUpType = 'CALLBACK' | 'APPOINTMENT_REMINDER' | 'POST_VISIT' | 'MARKETING' | 'REVIEW_REQUEST';
|
||||||
|
|
||||||
|
export type FollowUpStatus = 'PENDING' | 'COMPLETED' | 'CANCELLED' | 'OVERDUE';
|
||||||
|
|
||||||
|
// Messaging domain
|
||||||
|
export type MessageDirection = 'CLINIC_TO_PATIENT' | 'PATIENT_TO_CLINIC';
|
||||||
|
|
||||||
|
export type MessageChannel = 'WHATSAPP' | 'SMS' | 'EMAIL' | 'IN_APP';
|
||||||
|
|
||||||
|
export type MessageStatus = 'SENT' | 'DELIVERED' | 'READ' | 'FAILED';
|
||||||
|
|
||||||
|
export type TemplateApprovalStatus = 'APPROVED' | 'PENDING' | 'REJECTED';
|
||||||
|
|
||||||
|
// System
|
||||||
|
export type HealthStatus = 'HEALTHY' | 'WARNING' | 'UNHEALTHY';
|
||||||
|
|
||||||
|
// Shared sub-types
|
||||||
|
type CurrencyAmount = {
|
||||||
|
amountMicros: number;
|
||||||
|
currencyCode: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Entity types
|
||||||
|
export type Lead = {
|
||||||
|
id: string;
|
||||||
|
createdAt: string | null;
|
||||||
|
updatedAt: string | null;
|
||||||
|
leadSource: LeadSource | null;
|
||||||
|
leadStatus: LeadStatus | null;
|
||||||
|
priority: Priority | null;
|
||||||
|
contactName: { firstName: string; lastName: string } | null;
|
||||||
|
contactPhone: { number: string; callingCode: string }[] | null;
|
||||||
|
contactEmail: { address: string }[] | null;
|
||||||
|
interestedService: string | null;
|
||||||
|
assignedAgent: string | null;
|
||||||
|
utmSource: string | null;
|
||||||
|
utmMedium: string | null;
|
||||||
|
utmCampaign: string | null;
|
||||||
|
utmContent: string | null;
|
||||||
|
utmTerm: string | null;
|
||||||
|
landingPageUrl: string | null;
|
||||||
|
referrerUrl: string | null;
|
||||||
|
leadScore: number | null;
|
||||||
|
spamScore: number | null;
|
||||||
|
isSpam: boolean | null;
|
||||||
|
isDuplicate: boolean | null;
|
||||||
|
duplicateOfLeadId: string | null;
|
||||||
|
firstContactedAt: string | null;
|
||||||
|
lastContactedAt: string | null;
|
||||||
|
contactAttempts: number | null;
|
||||||
|
convertedAt: string | null;
|
||||||
|
patientId: string | null;
|
||||||
|
campaignId: string | null;
|
||||||
|
adId: string | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Campaign = {
|
||||||
|
id: string;
|
||||||
|
createdAt: string | null;
|
||||||
|
updatedAt: string | null;
|
||||||
|
campaignName: string | null;
|
||||||
|
campaignType: CampaignType | null;
|
||||||
|
campaignStatus: CampaignStatus | null;
|
||||||
|
platform: CampaignPlatform | null;
|
||||||
|
startDate: string | null;
|
||||||
|
endDate: string | null;
|
||||||
|
budget: CurrencyAmount | null;
|
||||||
|
amountSpent: CurrencyAmount | null;
|
||||||
|
impressionCount: number | null;
|
||||||
|
clickCount: number | null;
|
||||||
|
targetCount: number | null;
|
||||||
|
contactedCount: number | null;
|
||||||
|
convertedCount: number | null;
|
||||||
|
leadCount: number | null;
|
||||||
|
externalCampaignId: string | null;
|
||||||
|
platformUrl: string | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Ad = {
|
||||||
|
id: string;
|
||||||
|
createdAt: string | null;
|
||||||
|
updatedAt: string | null;
|
||||||
|
adName: string | null;
|
||||||
|
externalAdId: string | null;
|
||||||
|
adStatus: AdStatus | null;
|
||||||
|
adFormat: AdFormat | null;
|
||||||
|
headline: string | null;
|
||||||
|
adDescription: string | null;
|
||||||
|
destinationUrl: string | null;
|
||||||
|
previewUrl: string | null;
|
||||||
|
impressions: number | null;
|
||||||
|
clicks: number | null;
|
||||||
|
conversions: number | null;
|
||||||
|
spend: CurrencyAmount | null;
|
||||||
|
campaignId: string | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type LeadActivity = {
|
||||||
|
id: string;
|
||||||
|
createdAt: string | null;
|
||||||
|
activityType: LeadActivityType | null;
|
||||||
|
summary: string | null;
|
||||||
|
occurredAt: string | null;
|
||||||
|
performedBy: string | null;
|
||||||
|
previousValue: string | null;
|
||||||
|
newValue: string | null;
|
||||||
|
channel: Channel | null;
|
||||||
|
durationSeconds: number | null;
|
||||||
|
outcome: ActivityOutcome | null;
|
||||||
|
leadId: string | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type FollowUp = {
|
||||||
|
id: string;
|
||||||
|
createdAt: string | null;
|
||||||
|
followUpType: FollowUpType | null;
|
||||||
|
followUpStatus: FollowUpStatus | null;
|
||||||
|
scheduledAt: string | null;
|
||||||
|
completedAt: string | null;
|
||||||
|
priority: Priority | null;
|
||||||
|
assignedAgent: string | null;
|
||||||
|
patientId: string | null;
|
||||||
|
callId: string | null;
|
||||||
|
// Denormalized fields
|
||||||
|
patientName?: string;
|
||||||
|
patientPhone?: string;
|
||||||
|
description?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type PatientMessage = {
|
||||||
|
id: string;
|
||||||
|
createdAt: string | null;
|
||||||
|
subject: string | null;
|
||||||
|
body: string | null;
|
||||||
|
direction: MessageDirection | null;
|
||||||
|
channel: MessageChannel | null;
|
||||||
|
priority: Priority | null;
|
||||||
|
sentAt: string | null;
|
||||||
|
readAt: string | null;
|
||||||
|
senderName: string | null;
|
||||||
|
patientId: string | null;
|
||||||
|
// Optional fields
|
||||||
|
status?: MessageStatus;
|
||||||
|
recipientName?: string;
|
||||||
|
recipientPhone?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type WhatsAppTemplate = {
|
||||||
|
id: string;
|
||||||
|
name: string | null;
|
||||||
|
body: string | null;
|
||||||
|
variables: string[];
|
||||||
|
linkedCampaignId: string | null;
|
||||||
|
linkedCampaignName: string | null;
|
||||||
|
approvalStatus: TemplateApprovalStatus | null;
|
||||||
|
language: string[];
|
||||||
|
sendCount: number | null;
|
||||||
|
deliveredCount: number | null;
|
||||||
|
readCount: number | null;
|
||||||
|
clickedCount: number | null;
|
||||||
|
failedCount: number | null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Agent = {
|
||||||
|
id: string;
|
||||||
|
name: string | null;
|
||||||
|
initials: string | null;
|
||||||
|
isOnShift: boolean | null;
|
||||||
|
shiftNote: string | null;
|
||||||
|
avgResponseHours: number | null;
|
||||||
|
activeLeadCount: number | null;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user