botserver/templates/crm.gbai/crm.gbdialog/new_email.bas

321 lines
10 KiB
QBasic

' New Email Event Handler
' This script is triggered when a new email is received by the CRM system
' It handles email parsing, sender identification, automatic routing, and case creation
PARAM email_id AS STRING
PARAM from_address AS STRING
PARAM to_addresses AS ARRAY
PARAM cc_addresses AS ARRAY
PARAM subject AS STRING
PARAM body_text AS STRING
PARAM body_html AS STRING
PARAM attachments AS ARRAY
PARAM headers AS OBJECT
PARAM received_at AS DATETIME
' Initialize email context
email_context = {}
email_context.email_id = email_id
email_context.from = from_address
email_context.to = to_addresses
email_context.subject = subject
email_context.received_at = received_at
' Clean email address for lookup
clean_email = LOWERCASE(TRIM(from_address))
IF clean_email CONTAINS "<" THEN
clean_email = EXTRACT_BETWEEN(clean_email, "<", ">")
END IF
' Look up sender in CRM
contact = FIND "contacts", "email", clean_email
lead = NULL
account = NULL
IF contact IS NULL THEN
' Check if sender is a lead
lead = FIND "leads", "email", clean_email
IF lead IS NULL THEN
' Create new lead from email
lead = {}
lead.email = clean_email
lead.lead_source = "email"
lead.lead_status = "new"
lead.notes = "Auto-created from email: " + subject
' Try to extract name from email
IF from_address CONTAINS "<" THEN
display_name = TRIM(EXTRACT_BEFORE(from_address, "<"))
IF display_name != "" THEN
lead.contact_name = display_name
END IF
END IF
' Extract company domain
domain = EXTRACT_AFTER(clean_email, "@")
IF domain != "" AND NOT IS_PERSONAL_EMAIL(domain) THEN
lead.company_name = CAPITALIZE(EXTRACT_BEFORE(domain, "."))
lead.website = "https://" + domain
END IF
lead_id = SAVE "leads", lead
email_context.lead_id = lead_id
email_context.is_new_lead = TRUE
ELSE
email_context.lead_id = lead.id
END IF
ELSE
' Existing contact found
email_context.contact_id = contact.id
email_context.account_id = contact.account_id
IF contact.account_id IS NOT NULL THEN
account = FIND "accounts", "id", contact.account_id
email_context.account = account
END IF
END IF
' Check for email thread/conversation
thread_id = NULL
IF headers.references IS NOT NULL THEN
' Email is part of a thread
thread_references = SPLIT(headers.references, " ")
FOR ref IN thread_references DO
existing_email = FIND "email_tracking", "message_id", ref
IF existing_email IS NOT NULL THEN
thread_id = existing_email.thread_id OR existing_email.id
BREAK
END IF
END FOR
END IF
' Analyze email content
sentiment = ANALYZE_SENTIMENT(body_text)
urgency = DETECT_URGENCY(subject + " " + body_text)
intent = CLASSIFY_INTENT(body_text)
' Determine email category
category = "general"
IF subject CONTAINS "support" OR subject CONTAINS "help" OR subject CONTAINS "issue" OR subject CONTAINS "problem" THEN
category = "support"
ELSE IF subject CONTAINS "quote" OR subject CONTAINS "pricing" OR subject CONTAINS "cost" THEN
category = "sales"
ELSE IF subject CONTAINS "invoice" OR subject CONTAINS "payment" OR subject CONTAINS "billing" THEN
category = "billing"
ELSE IF subject CONTAINS "complaint" OR sentiment = "negative" THEN
category = "complaint"
END IF
' Check for existing open case with this email
existing_case = NULL
IF contact IS NOT NULL THEN
existing_case = FIND "cases" WHERE contact_id = contact.id AND status != "closed" ORDER BY created_at DESC LIMIT 1
ELSE IF lead IS NOT NULL THEN
' Check for case linked to lead's email in case description
existing_case = FIND "cases" WHERE description CONTAINS clean_email AND status != "closed" ORDER BY created_at DESC LIMIT 1
END IF
' Determine priority
priority = "medium"
IF urgency = "high" OR subject CONTAINS "urgent" OR subject CONTAINS "asap" THEN
priority = "high"
ELSE IF account IS NOT NULL AND (account.type = "vip" OR account.type = "enterprise") THEN
priority = "high"
ELSE IF sentiment = "negative" AND category = "complaint" THEN
priority = "high"
ELSE IF category = "billing" THEN
priority = "medium"
ELSE
priority = "low"
END IF
' Create or update case
IF existing_case IS NOT NULL THEN
' Add to existing case
case_update = {}
case_update.status = "updated"
case_update.updated_at = NOW()
IF priority = "high" AND existing_case.priority != "high" THEN
case_update.priority = "high"
END IF
UPDATE "cases", existing_case.id, case_update
' Add note to case
note = {}
note.entity_type = "case"
note.entity_id = existing_case.id
note.title = "Email received: " + subject
note.body = "From: " + from_address + "\n\n" + body_text
note.created_by = "email_system"
SAVE "notes", note
email_context.case_id = existing_case.id
email_context.case_action = "updated"
ELSE IF category = "support" OR category = "complaint" THEN
' Create new case
new_case = {}
new_case.subject = subject
new_case.description = body_text
new_case.status = "new"
new_case.priority = priority
new_case.origin = "email"
new_case.type = category
IF contact IS NOT NULL THEN
new_case.contact_id = contact.id
new_case.account_id = contact.account_id
END IF
' Auto-assign based on rules
assigned_to = NULL
IF category = "complaint" THEN
assigned_to = GET "config", "complaint_handler"
ELSE IF account IS NOT NULL AND account.owner_id IS NOT NULL THEN
assigned_to = account.owner_id
ELSE
' Round-robin assignment
assigned_to = GET_NEXT_AVAILABLE_AGENT()
END IF
new_case.assigned_to = assigned_to
new_case.case_number = GENERATE_CASE_NUMBER()
case_id = SAVE "cases", new_case
email_context.case_id = case_id
email_context.case_action = "created"
' Send notification to assigned agent
IF assigned_to IS NOT NULL THEN
NOTIFY AGENT assigned_to WITH "New case #" + new_case.case_number + " assigned: " + subject
END IF
END IF
' Save email tracking record
email_record = {}
email_record.message_id = email_id
email_record.from_address = from_address
email_record.to_addresses = to_addresses
email_record.cc_addresses = cc_addresses
email_record.subject = subject
email_record.body = body_text
email_record.html_body = body_html
IF email_context.contact_id IS NOT NULL THEN
email_record.contact_id = email_context.contact_id
END IF
IF email_context.lead_id IS NOT NULL THEN
email_record.lead_id = email_context.lead_id
END IF
IF email_context.account_id IS NOT NULL THEN
email_record.account_id = email_context.account_id
END IF
IF email_context.case_id IS NOT NULL THEN
email_record.case_id = email_context.case_id
END IF
email_record.sent_at = received_at
email_record.thread_id = thread_id
SAVE "email_tracking", email_record
' Create activity record
activity = {}
activity.type = "email_received"
activity.subject = "Email: " + subject
activity.description = body_text
activity.status = "completed"
activity.email_message_id = email_id
IF email_context.contact_id IS NOT NULL THEN
activity.contact_id = email_context.contact_id
END IF
IF email_context.lead_id IS NOT NULL THEN
activity.lead_id = email_context.lead_id
END IF
IF email_context.account_id IS NOT NULL THEN
activity.account_id = email_context.account_id
END IF
IF email_context.case_id IS NOT NULL THEN
activity.case_id = email_context.case_id
END IF
activity.assigned_to = assigned_to OR GET "config", "default_email_handler"
SAVE "activities", activity
' Handle attachments
IF attachments IS NOT NULL AND LENGTH(attachments) > 0 THEN
FOR attachment IN attachments DO
doc = {}
doc.name = attachment.filename
doc.file_path = attachment.path
doc.file_size = attachment.size
doc.mime_type = attachment.mime_type
doc.entity_type = "email"
doc.entity_id = email_record.id
doc.uploaded_by = "email_system"
SAVE "documents", doc
END FOR
END IF
' Auto-reply based on category and time
business_hours = GET "config", "business_hours"
current_hour = HOUR(NOW())
is_business_hours = current_hour >= business_hours.start AND current_hour <= business_hours.end
auto_reply = NULL
IF category = "support" AND email_context.case_action = "created" THEN
IF is_business_hours THEN
auto_reply = "Thank you for contacting support. Your case #" + new_case.case_number + " has been created and assigned to our team. We'll respond within 2 business hours."
ELSE
auto_reply = "Thank you for contacting support. Your case #" + new_case.case_number + " has been created. Our business hours are " + business_hours.start + " to " + business_hours.end + ". We'll respond as soon as possible."
END IF
ELSE IF category = "sales" THEN
auto_reply = "Thank you for your interest! A sales representative will contact you within 1 business day."
ELSE IF category = "complaint" THEN
auto_reply = "We've received your message and take your concerns seriously. A manager will contact you within 4 hours."
END IF
IF auto_reply IS NOT NULL AND NOT IS_AUTOREPLY(headers) THEN
SEND EMAIL TO from_address SUBJECT "RE: " + subject BODY auto_reply
END IF
' Update lead score if applicable
IF lead IS NOT NULL THEN
score_increase = 0
IF category = "sales" THEN
score_increase = 10
ELSE IF intent = "purchase_intent" THEN
score_increase = 15
ELSE
score_increase = 5
END IF
UPDATE "leads", lead.id, "score", lead.score + score_increase
' Check if lead should be converted
IF lead.score > 50 AND category = "sales" THEN
TRIGGER "lead_qualification", lead.id
END IF
END IF
' Log email processing
LOG "email_processed", {
"email_id": email_id,
"from": from_address,
"category": category,
"priority": priority,
"sentiment": sentiment,
"case_action": email_context.case_action,
"case_id": email_context.case_id,
"is_new_lead": email_context.is_new_lead,
"auto_replied": auto_reply IS NOT NULL,
"timestamp": NOW()
}
' Return processing result
RETURN email_context