Send mail merge document from crm to docu sign

PHOTO EMBED

Tue Aug 12 2025 06:08:01 GMT+0000 (Coordinated Universal Time)

Saved by @usman13

string button.send_doc_via_docu_sign()
{
	Ownership_Change_Request_id = "5971686000098845399";
	get_Details = zoho.crm.getRecordById("Ownership_Change_Request",Ownership_Change_Request_id);
	//info get_Details;
	customer_id = get_Details.get("Customer_Name").get("id");
	//info customer_id;
	contact_Details = zoho.crm.getRecordById("Contacts",customer_id);
	//info contact_Details;
	buyer_email = contact_Details.get("Email");
	info buyer_email;
	buyer_name = contact_Details.get("Full_Name");
	info buyer_name;

	// Step 1: Get Attachment from Ownership Change Request
	OCR_attachments = zoho.crm.getRelatedRecords("Attachments","Ownership_Change_Request",Ownership_Change_Request_id);
	if(OCR_attachments.size() > 0)
	{
		firstAttachment = OCR_attachments.get(0);
		attachmentId = firstAttachment.get("id");

		// Step 2: Download the document from CRM
		response1 = invokeurl
		[
			url :"https://www.zohoapis.com/crm/v8/Ownership_Change_Request/" + Ownership_Change_Request_id + "/Attachments/" + attachmentId
			type :GET
			connection:"newzohocrm"
		];

		// Step 3: Convert to Base64
		base64_pdf = zoho.encryption.base64Encode(response1);

		// Step 4: Prepare document map for DocuSign
		doc = Map();
		doc.put("documentBase64",base64_pdf);
		doc.put("name","Sale Purchase Agreement");
		doc.put("fileExtension","docx");
		doc.put("documentId","1");

		// Step 5: Signers' Info
		buyer_email = contact_Details.get("Email");
		buyer_name = contact_Details.get("Full_Name");

		// Joint Buyer
		joint_buyer_name = "Shahzad Joint";
		joint_buyer_email = "muhammad.kaleem@leosops.com";

		// Manager
		manager_name = "Leos";
		manager_email = "m.awais@leosuk.com";

		// ===== SIGNER 1: Buyer =====
		sign_here_buyer = List();
		sign_here_buyer.add({"anchorString":"Signed by Individual Purchaser","anchorUnits":"pixels","anchorXOffset":"170","anchorYOffset":"28"});
		sign_here_buyer.add({"anchorString":"Signed for and on behalf of the Purchaser","anchorUnits":"pixels","anchorXOffset":"175","anchorYOffset":"12"});

		// Initial field
		initial_here_buyer = List();
		initial_here_buyer.add({"anchorString":"Purchaser’s initials","anchorUnits":"pixels","anchorXOffset":"12","anchorYOffset":"-7"});

		// Date Signed field
		date_signed_buyer = List();
		date_signed_buyer.add({"anchorString":"Date signed:","anchorUnits":"pixels","anchorXOffset":"175","anchorYOffset":"10"});

		tabs_buyer = Map();
		tabs_buyer.put("signHereTabs",sign_here_buyer);
		tabs_buyer.put("initialHereTabs",initial_here_buyer);
		tabs_buyer.put("dateSignedTabs",date_signed_buyer);

		signer1 = Map();
		signer1.put("email",buyer_email);
		signer1.put("name",buyer_name);
		signer1.put("recipientId","1");
		signer1.put("routingOrder","1");
		signer1.put("tabs",tabs_buyer);

		// ===== SIGNER 2: Joint Buyer =====
		sign_here_joint = List();
		sign_here_joint.add({"anchorString":"Signed by Joint Individual Purchaser","anchorUnits":"pixels","anchorXOffset":"175","anchorYOffset":"28"});

		initial_here_joint = List();
		initial_here_joint.add({"anchorString":"Initial by Joint Individual Purchaser","anchorUnits":"pixels","anchorXOffset":"175","anchorYOffset":"28"});

		date_signed_joint = List();
		date_signed_joint.add({"anchorString":"Date Signed by Joint Individual Purchaser","anchorUnits":"pixels","anchorXOffset":"175","anchorYOffset":"28"});

		tabs_joint = Map();
		tabs_joint.put("signHereTabs",sign_here_joint);
		tabs_joint.put("initialHereTabs",initial_here_joint);
		tabs_joint.put("dateSignedTabs",date_signed_joint);

		signer2 = Map();
		signer2.put("email",joint_buyer_email);
		signer2.put("name",joint_buyer_name);
		signer2.put("recipientId","2");
		signer2.put("routingOrder","2");
		signer2.put("tabs",tabs_joint);

		// ===== SIGNER 3: Develper =====
		sign_here_manager = List();
		sign_here_manager.add({"anchorString":"Signed for and on behalf of Developer:","anchorUnits":"pixels","anchorXOffset":"175","anchorYOffset":"28"});

		initial_here_manager = List();
		initial_here_manager.add({"anchorString":"Seller’s initials","anchorUnits":"pixels","anchorXOffset":"175","anchorYOffset":"-3"});

		date_signed_manager = List();
		date_signed_manager.add({"anchorString":"Date Signed by Seller","anchorUnits":"pixels","anchorXOffset":"175","anchorYOffset":"28"});

		tabs_manager = Map();
		tabs_manager.put("signHereTabs",sign_here_manager);
		tabs_manager.put("initialHereTabs",initial_here_manager);
		tabs_manager.put("dateSignedTabs",date_signed_manager);

		signer3 = Map();
		signer3.put("email",manager_email);
		signer3.put("name",manager_name);
		signer3.put("recipientId","3");
		signer3.put("routingOrder","3");
		signer3.put("tabs",tabs_manager);

		// Step 6: Recipients map
		recipients = Map();
		recipients.put("signers",{signer1,signer2,signer3});

		// Step 7: Envelope
		envelope = Map();
		envelope.put("documents",{doc});
		envelope.put("emailSubject","Please Sign the Sale Purchase Agreement");
		envelope.put("status","sent");
		envelope.put("recipients",recipients);

		// Step 8: Get DocuSign Access Token from CRM Variable
		access_token_response = invokeurl
		[
			url :"https://www.zohoapis.com/crm/v6/settings/variables/5971686000102746225"
			type :GET
			connection:"newzohocrm"
		];
		access_token = access_token_response.get("variables").get(0).get("value");

		// Step 9: Send envelope via DocuSign
		headers = Map();
		headers.put("Authorization","Bearer " + access_token);
		headers.put("Content-Type","application/json");

		response = invokeurl
		[
			url :"https://demo.docusign.net/restapi/v2.1/accounts/60bf62d5-5696-443e-8b93-74f5da67f9b7/envelopes"
			type :POST
			parameters:envelope.toString()
			headers:headers
		];
		info response;
		envelopeId = response.get("envelopeId");

		update_map = Map();
		update_map.put("Envelope_ID", envelopeId);
		Update_Rec= zoho.crm.updateRecord("Reservation_", Ownership_Change_Request_id, update_map);
	}
	else
	{
		info "No attachments found on Ownership Change Request record.";
	}
	return "";
}
content_copyCOPY