in workmail-salesforce-python/src/sf_utils.py [0:0]
def process_email(sf_client, parsed_email, event):
from_address = event['envelope']['mailFrom']['address']
contact_id, account_id = process_contact_and_account_id(sf_client, parsed_email, event, from_address)
# Fetch or create Salesforce opportunity
subject = event['subject'] if event['subject'] is not None else ''
date = parsed_email['Date']
case_id = email_utils.extract_case_id(subject)
opportunity_id = None
is_new_case = False
if case_id is None:
# Generate a new 8 digit alphanumeric caseId
case_id = ''.join(secrets.choice(string.ascii_uppercase + string.digits) for i in range(8))
is_new_case = True
subject = f"[CaseId:{case_id}] {subject}"
logger.info(f"Could not find exisiting case, generated new CaseId: {case_id}")
else:
opportunity_id = run_sf_query(sf_client, f"SELECT Id FROM Opportunity WHERE TrackingNumber__c='{case_id}'", 'Id')
if opportunity_id is None:
close_date = dateutil.parser.parse(date) + default_case_duration
opportunity_id = sf_client.Opportunity.create({'Name':subject, 'StageName':'Qualification', 'TrackingNumber__c':case_id , 'AccountId':account_id, 'CloseDate':close_date.strftime('%Y-%m-%d')})['id']
logger.info(f"Opportunity: {opportunity_id} created for CaseId: {case_id}")
else:
logger.info(f"CaseId: {case_id} is already related to Opportunity: {opportunity_id}")
# Associate contact with opportunity if they aren't associated already
if run_sf_query(sf_client, f"SELECT Id FROM OpportunityContactRole WHERE ContactId='{contact_id}'", 'Id') is None:
sf_client.OpportunityContactRole.create({'ContactId':contact_id, 'OpportunityId': opportunity_id})
# Finally, add the the email to the opportunity
contents = email_utils.extract_text_body(parsed_email)
is_incoming_email = True if event['flowDirection'] == 'INBOUND' else False
sf_client.EmailMessage.create({'RelatedToId': opportunity_id, 'Subject': subject, 'TextBody': contents, 'FromAddress': from_address, 'MessageDate': date, 'Incoming': is_incoming_email, 'ToAddress': event['envelope']['recipients'][0]['address']})
logger.info(f"Associated email with Opportunity!")
return SalesforceCase(account_id, opportunity_id, contact_id, case_id, is_new_case)