Send Merge Field data in new DocuSign Apex Toolkit - salesforce

Do you know how to send data to custom field (salesforce merge field) using new Apex Toolkit Docusign API?
I've been following this tutorial: salesforce-sending-signing-template
But there are not examples about filling custom fields with salesforce data.
I tried to use custom field class, but it has only read properties.
How can you send salesforce data to template document?

public class SampleMergeFields {
public static void sendMergeFieldTemplate() {
//create recipient
dfsle.Recipient myRecipient = dfsle.Recipient.fromSource(
'XXXXX', //name of recipient
'xxxx.xx#xxx.com', //email of the recipient
null,
'Signer 1', //match role value defined in the template
new dfsle.Entity(UserInfo.getUserId())); //pass in the ID of the source object here
//create document
dfsle.UUID myTemplateId = dfsle.UUID.parse('XXXXX-XXXX-XX'); //Docusign template Id
dfsle.Document myDocument =dfsle.Document.fromTemplate(
myTemplateId, // templateId in dfsle.UUID format
'myTemplate');
//create custom field
dfsle.CustomField myCustomField1 = new dfsle.CustomField(
'text', //type
'##SFStudent__c', //##SF+Salesforce API name of the object
'a0G5A00000TbNxVUAV', //Id of the record
null,
true,
true);
dfsle.Envelope myEnvelope = new dfsle.Envelope(
null,
null,
null,
null,
new List<dfsle.Document> { myDocument },
null,
new List<dfsle.CustomField> { myCustomField1 },
null,
'Hello from DocuSign',
'My Message',
null,
null);
myEnvelope = myEnvelope.withRecipients(new List<dfsle.Recipient> { myRecipient });
// Send the envelope
myEnvelope = dfsle.EnvelopeService.sendEnvelope(
myEnvelope, // The envelope to send
true); // Send now?
}
}
Hello Rene,
Using the above code you would be able to set merge fields data for the Salesforce merge fields defined in your DocuSign template using the Apex toolkit.
Note, that you have to pass RecordID of the Salesforce.com record that the template should pull up values from in the Custom field named '##SFStudent__c'. For instance if you have an custom object Student__c in your org having two fields a1__c and a2__c and considering both these fields are present on a template you are using for sending. The name of the custom field in this case should be '##SF'+API Name of the object and the value of the custom field should be Salesforce.com Id of the record.
You can define merge fields from multiple Salesforce.com objects as well. In that case you will have to define additional custom fields for the objects. Say you have a template which contains fields from Account as well as Contact. In that case you will have to create 2 custom fields named '##SFAccount' and '##SFContact' and populate their values accordingly.
Please note that Salesforce connect also needs to defined in the DocuSign account which you are using and should be pointing to the Salesforce.com org that has the toolkit installed in order for this to work correctly.
Can you try this at your end and check ?

I just discovered a way to do that, without even needing to create the field within the code.
What you can do is create your custom field within Salesforce/DocusignAppLauncher or within Docusign directly, then get in Docusign its UUID (visible in the URL - in the Document Custom Fields menu).
From that UUID, you can associate the salesforce merge field to your Code-created field (or "Tab" to use the docusign naming) as follows:
dfsle.Tab currentTab = new dfsle.TextTab()
.withRequired('true') // Signer must enter value
.withAnchor(new dfsle.Tab.Anchor('\\MyAnchorName\\'))
.withDataLabel('DataLabelName')
.withName('Name')
.withCustomTabID(dfsle.UUID.parse('MyMergeFieldDocusignUUID')); // THIS IS THE TRICK !!

Related

Dynamic change of field value using sObject

I'm trying to use sObject to dynamically change Name field objects across while organization.
I've tried using SomeId.getSObjectType().newSObject(SomeId) to create the sObject, but when I try to change the Name field I have error
Variable does not exist: Name
Map<Id, string> idsToUpdate = new Map<Id, string>();
// Put the Id's and associated name values in the map
List<SObject> sObjectsToUpdate = new List<SObject>();
foreach(Id idToUpdate : idsToUpdate.keySet) {
SObject o1 = idToUpdate.getSObjectType().newSObject(idToUpdate);
o1.Name = idsToUpdate.get(idToUpdate);
sObjectsToUpdate.add(o1);
}
update sObjectsToUpdate;
As I can see other posts, this is the way of creation dynamic update of objects.
Any idea why this happens?
Not all objects have a name field, you should check for the existence of the name field before trying to set the field also you must use the put method
Map <String, Schema.SObjectField> fieldMap = o1.getSobjectType().getDescribe().fields.getMap();
if(fieldMap.containsKey('Name')){
o1.put('Name', 'Test');
}

Unable to filter using ContentDocument id in query in trigger query not retrieving any results

I have a requirement to make to make a file private and be available to only the user whose role name consists the name of the file for a specific custom object. For this I am trying to retrieve from Content Document Link with the custom object name LinkedEntity.Type and ContentDocumentid as filters, when I hard code the ContentDocumentid it is working fine but when I try to dynamically provide the ContentDocumentId then the query is not returning any result. I am adding a snippet of my code. Please Help!!. Thanks
List<Id> listOfConDocuId = new List<Id>();
for(ContentVersion cv: Trigger.new){
if((!cv.Title.contains('product proposal')) || (!cv.Title.contains('final')) || (!cv.Title.contains('packet')))
listOfConDocuId.add(cv.ContentDocumentId);
}
Map<Id, Project__c> mapOfProjectId = new Map<Id, Project__c>([SELECT Id FROM Project__c]);
Set<Id> setOfProjectId = mapOfProjectId.keySet();
List<ContentDocumentLink> LinkedProject = [SELECT ContentDocumentId, LinkedEntityId, ContentDocument.Title FROM ContentDocumentLink where LinkedEntityId in :setOfProjectId and LinkedEntity.Type='Project__c' and ContentDocumentId IN :listOfConDocuId];`
I don't think it's necessary to add a WHERE clause for both ID and TYPE. Id should be enough. As far as restricting files to only users with certain roles, have you tried sharing the Custom Object (Project__c) with only those users and then simply linking the files to that Custom Object record with Inferred Permission?
Read more about the sharing types and visibility of Content Document Link here:
https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_contentdocumentlink.htm

AngularJS Dynamic email validation element, When I fill out the email check element, It's reset

I would like to create a form with several fields: name, last name, ... and add one or several email. The user should enter the first mandatory email address. After he should have the possibility to click on "Add email" for adding a new email address. He could add 4 others emails.
The system should be verify if the format is correct and register the data in a DB.
Could you tell me which is the best practice for doing that?
Kind Regards,
In the Database:
You should have separate table for storing email address's with foreign key that will be pointing to the main table
Table structure will look like this
ID,Email,Foreign-Key ID
In the Service layer you should have model class that will take email as array parameter
email class
class Email {
public int id,
public string email
}
in the main class
class Main {
email:Email[]
}
in the front end
you should clone the input type whenever the add email button is clicked and push the new element to an array and send it to the service layer

getting Value of a field by its Name in apex salesforce

in my visualforce page i have some campaign object first user select an object then there is a multi picklist. in this picklist there is Label for all the fields user selects some fields then i have to show the value of these fields in the selected campaign object
for showing multiple picklist my apex function is
public List<SelectOption> getOptionalFields(){
Map <String, Schema.SObjectField> fieldMap= Campaign.sObjectType.getDescribe().fields.getMap();
List<SelectOption> fieldsName =new List<SelectOption>();
for(Schema.SObjectField sfield : fieldMap.Values())
{
schema.describefieldresult dfield = sfield.getDescribe();
fieldsName.add(new SelectOption(dfield.getName(),dfield.getLabel()));
}
but i have no idea how to show value for the the field
for exmple i have object instance like
Campaign c;
now i have to get value of any field whose Name is in string form.how to get corresponding value for that field.one solution is just write like
say
String fieldName;
and use multiple if
if(fieldName=='Name')
c.Name=
if(fieldName=='Id')
c.Id=
is there any other convenient method??please explain!!
You need to read about "dynamic apex". Every "concrete" sObject (like Account, Contact, custom objects) can be cast down to generic sObject (or you can use the methods directly).
Object o = c.get(fieldName);
String returnValue = String.valueOf(o);
There are some useful examples on dynamic get and set methods on Salesforce-dedicated site: https://salesforce.stackexchange.com/questions/8325/retrieving-value-using-dynamic-soql https://salesforce.stackexchange.com/questions/4193/update-a-records-using-generic-fields (second question is a bit more advanced)
You'll still need to somehow decide when to return it as String, when as number, when as date... Just experiment with it and either do some simple mapping or use describe methods to learn the actual field type...

How can I get the name of the Lead Owner in a Lead custom formula field?

I've got an application that reads Lead records from Salesforce via the API and I want to link the Lead Owner field to an attribute in the application. The Lead Owner field doesn't up in the list of available fields but all the custom fields do.
So, my first attempt at a solution was to create a custom field that displayed the Lead Owner name. In the SF formula editor, as far as I can tell, it doesn't display the actual data field but instead displays the ID string. Which is pretty meaningless in the context that I need it for.
alt text http://skinny.fire-storm.net/forposting/insertfield.JPG
Is there a way that we can get at the data in the object that the ID string references?
alt text http://skinny.fire-storm.net/forposting/havewant.JPG
I have the RED BOX but need the GREEN BOX.
EDIT: I can't change the application code that calls the API. I can only change salesforce. So, this is more of a salesforce superuser / formula-writer question, not a question about writing code that calls the SF API.
Salesforce allows access to related data through what they call relationship queries. Instead of joining, you specify the query like this:
System.debug([SELECT Owner.Name FROM Lead WHERE Id = '00QS00000037lvv'].Owner.Name);
Try running that in the system log, just replace the lead ID with one that you're looking at.
When accessing the data through the API, the principle is the same, your proxy objects should allow you to access Lead.Owner.Name.
EDIT:
I agree with eyescream, since you can't change the application code, creating an Apex trigger would be the best way to go here. Here's some code to get you started:
trigger Lead_UpdateOwner on Lead(before insert, before update)
{
Map<Id, String> ownerMap = new Map<Id, String>();
for (Lead lead : Trigger.new)
{
ownerMap.put(lead.OwnerId, null);
}
if (ownerMap.size() > 0)
{
for (User[] users : [SELECT Id, Name FROM User WHERE Id IN :ownerMap.keySet()])
{
for (Integer i=0; i<users.size(); i++)
{
ownerMap.put(users[i].Id, users[i].Name);
}
}
for (Lead lead : Trigger.new)
{
lead.OwnerName__c = ownerMap.get(lead.OwnerId);
}
}
}
lead.OwnerName__c would need to be the name of your custom field on the lead object that will hold the owner name. Type Text, length 121.
I had a similar problem, but wanted all the current and future User fields available. Since a custom lookup field to the User is not restricted by formula fields, I created one named
OwnerLookup
on the Opportunity and Account objects, then used a triggers to populate it on creation or edit. For example the Opportunity trigger is this:
trigger OpportunityTrigger on Opportunity (before insert, after insert, before update, after update) {
if(trigger.isBefore && trigger.isInsert) {
OpportunityTriggerHandler.newOpportunity(Trigger.old, Trigger.new);
}
else if(trigger.isAfter && trigger.isInsert){
//OpportunityTriggerHandler.futureUse(Trigger.new);
}
else if(trigger.isBefore && trigger.isUpdate){
OpportunityTriggerHandler.updateOpportunity(Trigger.new, Trigger.oldMap);
}
else if(trigger.isAfter && trigger.isUpdate){
//OpportunityTriggerHandler.futureUse(Trigger.new, Trigger.oldMap);
}
}
and the OpportunityTriggerHandler class (Apex code) is:
public with sharing class OpportunityTriggerHandler {
public static void newOpportunity( List<Opportunity> oldOpportunitys, List<Opportunity> newOpportunitys ) {
for (Opportunity opp: newOpportunitys) {
updateOwnerData( opp );
}
}
public static void updateOpportunity( List<Opportunity> oldOpportunitys, Map<Id, Opportunity> newOpportunitys ) {
for (Opportunity opp: oldOpportunitys) {
updateOwnerData( opp );
}
}
public static void updateOwnerData( Opportunity opp ) {
opp.OwnerLookup__c = opp.OwnerId;
}
}
I then create Formula fields on the Opportunity/Account objects to get to any of the owner (User) object fields, such as Oppty Owner Name formula field:
OwnerLookup__r.FirstName & " " & OwnerLookup__r.LastName
VLOOKUP function would be a good try, but
it's available only in validation rules, not in field definitions
it can be used only on custom objects and you need data from User
I'd say you need to query from your application for
SELECT Owner.FirstName, Owner.LastName FROM Lead
Other than that... some "after insert, after update" trigger that would populate your custom field when owner changes?
Just posting for completeness sake (and for the Google searches): The issue arises with any object that can be queued, not just Lead, since the source of it is that the owner can refer to either a user (as usual) or a queue object.
This can be resolved using a formula field instead of triggers, like below:
BLANKVALUE(Owner:Queue.QueueName, Owner:User.FirstName & " " & Owner:User.LastName)
Basically, the BLANKVALUE function in the formula checks whether the owner.queuename is blank, and if so gives the name of the user.

Resources