Including Case Comments in Case Assignment Email

Including case comments in the case assignment email allows the recipient to see exactly what is going on before even logging in to Salesforce.

You need a visualforce email template for this. You can use an apex:repeat component in your email template, but there is no sort order on those. Really, as best as I can find, its just random.

So I went ahead and created a custom component to select comments and sort. Now i can include just the last 3 comments to keep it simple, and its sorted by date, with most recent first.

Credit: This StackExchange post was hugely helpful in making this happen

I altered the solution a bit to use an apex:repeat in a table in the custom component, instead of a datalist, as i found the formatting better. The code for controller, component, test class, and vf email template is all copied below for your pleasure.

controller

public class SortedCaseCommentsController {
  public Id     AttributeCaseId    {get; set;}

  public List<CaseComment> getCaseComments() {
    return [
      SELECT CommentBody, CreatedById, CreatedBy.Name, CreatedDate
      FROM CaseComment
      WHERE ParentId = :this.AttributeCaseId
      ORDER BY CreatedDate DESC
    ];
  }
}

component:


<apex:component controller="SortedCaseCommentsController" access="global">
    <apex:attribute name="caseId" type="Id" assignTo="{!AttributeCaseId}" description="Case Id" />
    <table>
        <apex:repeat value="{!CaseComments}" var="caseComment">
            <tr>
                <th>Created Date</th>
                <th>Created By</th>
                <th>Comment</th>
            </tr>
            <tr>
                <td>
                    <apex:outputText value="{0, date, MMMM d','  yyyy}">
                        <apex:param value="{!caseComment.CreatedDate}" /> </apex:outputText>.
                </td>
                <td>
                    {!caseComment.CreatedBy.Name}
                </td>
                <td>{!caseComment.CommentBody}</td>
            </tr>
        </apex:repeat>
    </table>
</apex:component>

test class:

@istest

private class SortedCaseCommentsTest {

    static testmethod void validateSortedCaseComments() {
        case c = new
        case (Subject = 'Test Case', Status = 'New');
        insert c;

        caseComment cc = new CaseComment(CommentBody = 'abc', parentid = c.id);
        insert cc;

        SortedCaseCommentsController sc = new SortedCaseCommentsController();
        sc.AttributeCaseId = c.Id;
        sc.getCaseComments();
    }

}

visualforce email template
note that using apex outputfield on the description field is necessary for it to display properly. Using relatedTo.Description smushes it together into a single paragraph, no line breaks.

<messaging:emailTemplate subject="Case # {!relatedTo.CaseNumber}: {!relatedTo.Subject} has been assigned to {!relatedTo.Owner.Name}
 " recipientType="User" relatedToType="Case">
    <messaging:htmlEmailBody>
        <STYLE type="text/css">
            TH {
                font-size: 11px;
                font-face: arial;
                background: #CCCCCC;
                border-width: 1;
                text-align: center
            }

            TD {
                font-size: 11px;
                font-face: verdana
            }

            TABLE {
                border: solid #CCCCCC;
                border-width: 1;
                padding: 1 2 1 2;
            }

            TR {
                border: solid #CCCCCC;
                border-width: 1
            }

            CAPTION {
                font-size: 14px;
                font-face: verdana, text-decoration: underline
            }

            P {
                line-height: 150%;
                font face: arial;
                font-size: 12px;
            }
        </STYLE>

        <p>
            *** NEW CASE ASSIGNMENT NOTIFICATION ***
        </p>

        <p>
            <b><u>Case Details:</u></b>
            <br /> Assigned to {!relatedTo.Owner.Name}
            <br /> Created By: {!relatedTo.CreatedBy.Name}
            <br /> Case #: {!relatedTo.CaseNumber}
            <br /> Case status: {!relatedTo.Status}
            <br /> Case Priority: {!relatedTo.Priority}
            <br /> Subject: {!relatedTo.Subject}
            <br />
        </p>

        <p>
            <a href="{!LEFT($Api.Partner_Server_URL_140, FIND(" .com/ ",$Api.Partner_Server_URL_140)+3)}/{!relatedTo.Id}">
Click on the link to access the case. </a>
        </p>

        <p>
            <b><u>Description:</u></b>
            <br />
            <apex:outputField value="{!relatedTo.Description}"></apex:outputField>
        </p>

        <p><b><u>Case Comments</u></b>
            <br />
            <c:sortedCaseComments caseId="{!relatedTo.Id}" />
        </p>

    </messaging:htmlEmailBody>
</messaging:emailTemplate>```

 
13
Kudos
 
13
Kudos

Now read this

Determining which fields are used in a page layout (in less time than it takes to brew a cup of coffee)

There is a great app called FieldTrip that will let you know which fields are actually populated in records, but deep diving into eclipse, or using brute force, have been the only way that I am aware of to see which ones are actually... Continue →