Thursday, December 26, 2013

Conga Composer for Beginers

Hello Accolades,

I am working on one of the best App on AppExchange i.e Conga Composer from last couple of weeks. Conga Composer is basically used to create Contracts, Presentations, Reports. When I searched about the core functionality I didn't find some simple tutorials, So I am writing this blog to simplify the way to handle your requirement with Conga Composer.

Installing Conga Composer in your Org :
Click on the following link & Click on "Get It now"
 Conga Composer AppExchange Package Link

Create a Custom button on Opportunity :
When you install the Conga Composer, you will get Standard button named "Conga Composer" However If your Client want some custom name like "Create Contract", "Create Presentation" So You need to create a Custom button or Link & Add this button on Page Layout.

On button you should write the following basic code to redirect request to Conga Composer.

https://www.appextremes.com/apps/Conga/Composer.aspx
?sessionId={!API.Session_ID}
&serverUrl={!API.Partner_Server_URL_80}
&id={!Opportunity.Id}




To add the Custom parameters to your link, Please follow the link :
Conga Composer Custom Parameter
Your can use the Custom parameter on the link for additional functionality like Background Mode, Email the Merge Document, Logging the Activity, Set SCHP parameters etc.

Till, you have successfully created a basic stuff around Conga Composer.


Create Conga Merge Formulas:
Now, we will move towards to create the Conga Merge formulas:

Click on the Custom/Standard button that you added on Opportunity then a window will be popup 



Click on Template Builder - Click a field name to copy it to the clipboard, then paste it into a Word, Excel, PowerPoint or PDF merge field. The data would come up from Master Dataset or Report Dataset.


You have successfully created your basic document. Now click on "Choose a template from your local computer" radio button, browse your document & click on Merge button.
It will populate the data in your document.

That's about the basics of Conga Composer, If you have any query, Please feel free to drop me a mail at shingavi.a@gmail.com.




Email Template Example

Hello Accolades,

The following code will explain you how to display Email Templates on VF page & re-render with respect to folder selection.

VF Page :
<apex:page controller="EmailTemplateController">
     <apex:form>
        <apex:pageBlock title="View Email Template" id="emailTemplateBlock">
            Select Email Template Folder:
            <apex:selectList value="{!selectedEmailTemplateFolder}" multiselect="false" size="1">
                <apex:selectOptions value="{!emailTemplateFolderOpts}" />
                <apex:actionSupport event="onchange" action="{!refreshEmailTemplateSection}" rerender="emailTemplateBlock" />
            </apex:selectList>
            <br/><br/>
            Select Email Template:
            <apex:selectList value="{!selectedEmailTemplate}" multiselect="false" size="1">
                <apex:selectOptions value="{!emailTemplateOpts}" />
                <apex:actionSupport event="onchange" action="{!refreshEmailTemplateSection}" rerender="emailTemplateBlock" />
            </apex:selectList>
            <br/><br/>
            <apex:outputPanel id="emailTemplateContentPanel" rendered="{!NOT(ISNULL(chosenEmailTemplate))}">
                <p><b>{!chosenEmailTemplate.Name} - Subject:</b> {!chosenEmailTemplate.Subject}</p>
                <pre>{!chosenEmailTemplate.Body}</pre>
            </apex:outputPanel>
        </apex:pageBlock>
    </apex:form>
</apex:page>

Controller : 
public class EmailTemplateController{

    private List<EmailTemplate> allEmailTemplates;
    private List<Folder> allEmailTemplateFolders;
    public String selectedEmailTemplateFolder {public get; public set;}
    public String selectedEmailTemplate {public get; public set;}
    public EmailTemplate chosenEmailTemplate {public get; private set;}

    public SomeController() {
        allEmailTemplates = [select Id, Name, Subject, Body, FolderId from EmailTemplate order by Name asc];
        allEmailTemplateFolders = [select Id, Name from Folder where Type = 'Email' order by Name asc];
        System.debug(allEmailTemplates+'======='+allEmailTemplateFolders);
    }

    public List<SelectOption> getEmailTemplateFolderOpts() {
        List<SelectOption> opts = new List<SelectOption>();
        opts.add(new SelectOption('null', ' - Select - '));
        for ( Folder f : allEmailTemplateFolders )
            opts.add(new SelectOption(f.Id, f.Name));
        // add an option for templates in the Unfiled Public folder
        opts.add(new SelectOption(UserInfo.getOrganizationId(), 'Unfiled Public'));
        return opts;
    }

    public List<SelectOption> getEmailTemplateOpts() {
        List<SelectOption> opts = new List<SelectOption>();
        if ( selectedEmailTemplateFolder != null ) {
            opts.add(new SelectOption('null', ' - Select - '));
            Id selectedId = (Id) selectedEmailTemplateFolder;
            for ( EmailTemplate et : allEmailTemplates ) {
                if ( et.FolderId == selectedId )
                    opts.add(new SelectOption(et.Id, et.Name));
            }
        }
        return opts;
    }

    public PageReference refreshEmailTemplateSection() {
        // this is a bit ugly, but a consequence of not being able to set a SelectOption's value to null
        if ( selectedEmailTemplateFolder == null || selectedEmailTemplateFolder == 'null' ) {
            selectedEmailTemplateFolder = null;
            selectedEmailTemplate = null;
        }
        if ( selectedEmailTemplate == null || selectedEmailTemplate == 'null' ) {
            selectedEmailTemplate = null;
            chosenEmailTemplate = null;
        } else {
            Id selectedId = (Id) selectedEmailTemplate;
            for ( EmailTemplate et : allEmailTemplates ) {
                if ( et.Id == selectedId ) {
                    chosenEmailTemplate = et;
                    break;
                }
            }
        }
        return null;
    }
}

Happy Coding!!