Create Contract API Endpoint Unclear "inputfields" Requirements

Create Contract API Endpoint Unclear "inputfields" Requirements

Hello,

I'm trying to create a Deluge function that accepts inputs from a form in Zoho Creator and creates a barebones contract of a given type. See below for the current code, cleaned of authentication information.
  1. // Fetch form data
  2. // Hidden field
  3. client_name = input.Client_Name;
  4. if(client_name == null || client_name == "")
  5. {
  6. client_name = "Testing Client";
  7. }
  8. // Dropdown field
  9. contract_type = input.Contract_Type;
  10. // Single line field
  11. title = input.Title;
  12. // Multi-line field
  13. description = input.Description;
  14. // Dropdown field
  15. signer_name = input.Signer_Name;
  16. //
  17. // Define the access token and refresh token
  18. accessToken = "ACCESS_TOKEN";
  19. refreshToken = "REFRESH_TOKEN";
  20. //
  21. // Define headers for token refresh request
  22. tokenRefreshHeaders = Map();
  23. tokenRefreshHeaders.put("Content-Type","application/x-www-form-urlencoded");
  24. tokenRefreshParameters = Map();
  25. tokenRefreshParameters.put("grant_type","refresh_token");
  26. tokenRefreshParameters.put("client_id","CLIENT_ID");
  27. tokenRefreshParameters.put("client_secret","CLIENT_SECRET");
  28. tokenRefreshParameters.put("refresh_token",refreshToken);
  29. //
  30. // Refresh the access token
  31. response = invokeurl
  32. [
  33. url :"https://accounts.zoho.com/oauth/v2/token"
  34. type :POST
  35. parameters:tokenRefreshParameters
  36. headers:tokenRefreshHeaders
  37. ];
  38. if(response.get("access_token") != null)
  39. {
  40. accessToken = response.get("access_token");
  41. }
  42. //
  43. // Define headers for Zoho Contracts API request
  44. contractsHeaders = Map();
  45. contractsHeaders.put("Authorization","Zoho-oauthtoken " + accessToken);
  46. contractsHeaders.put("Content-Type","application/json");
  47. //
  48. // Prepare contract data
  49. contract_type = lower(replaceAll(contract_type," ","-"));
  50. client_name = lower(replaceAll(client_name," ","-"));
  51. signerNameContainsTitle = signer_name.containsIgnoreCase(". ");
  52. signerFirstSpace = signer_name.find(" ");
  53. if(signerNameContainsTitle)
  54. {
  55. signerTitle = signer_name.left(signerFirstSpace);
  56. signerFullName = signer_name.remove(signerTitle).trim();
  57. signerFirstSpace = signerFullName.find(" ");
  58. signerFirstName = signerFullName.left(signerFirstSpace);
  59. signerLastName = signerFullName.remove(signerFirstName).trim();
  60. }
  61. else
  62. {
  63. signerFirstName = signer_name.left(signerFirstSpace);
  64. signerLastName = signer_name.remove(signerFirstName).trim();
  65. }
  66. signer_record = zoho.crm.searchRecords("Contacts","(First_Name:equals:" + signerFirstName + ") and (Last_Name:equals:" + signerLastName + ")");
  67. signer_email = signer_record.get(0).get("Email");
  68. //
  69. // Create nested maps/lists in the structure of the contracts API JSON
  70. contractDataMap = Map();
  71. contractDataMap.put("source",1);
  72. inputFieldsList = List();
  73. contractTypeInputFieldMap = Map();
  74. contractTypeInputFieldMap.put("metaApiName","contract-type");
  75. contractTypeInputsList = List();
  76. contractTypeInput = Map();
  77. contractTypeInput.put("inputApiName","contract-type");
  78. contractTypeInput.put("inputValue","non-disclosure-agreement");
  79. contractTypeInputsList.add(contractTypeInput);
  80. contractTypeInputFieldMap.put("inputs",contractTypeInputsList);
  81. inputFieldsList.add(contractTypeInputFieldMap);
  82. titleInputFieldMap = Map();
  83. titleInputFieldMap.put("metaApiName","title");
  84. titleInputsList = List();
  85. titleInput = Map();
  86. titleInput.put("inputApiName","title");
  87. titleInput.put("inputValue",title);
  88. titleInputsList.add(titleInput);
  89. titleInputFieldMap.put("inputs",titleInputsList);
  90. inputFieldsList.add(titleInputFieldMap);
  91. descriptionInputFieldMap = Map();
  92. descriptionInputFieldMap.put("metaApiName","description");
  93. descriptionInputsList = List();
  94. descriptionInput = Map();
  95. descriptionInput.put("inputApiName","description");
  96. descriptionInput.put("inputValue",description);
  97. descriptionInputsList.add(descriptionInput);
  98. descriptionInputFieldMap.put("inputs",descriptionInputsList);
  99. inputFieldsList.add(descriptionInputFieldMap);
  100. requesterNameInputFieldMap = Map();
  101. requesterNameInputFieldMap.put("metaApiName","requester-name");
  102. requesterNameInputsList = List();
  103. requesterNameInput = Map();
  104. requesterNameInput.put("inputApiName","requester-name");
  105. requesterNameInput.put("inputValue","Tom Rismeyer");
  106. requesterNameInputsList.add(requesterNameInput);
  107. requesterNameInputFieldMap.put("inputs",requesterNameInputsList);
  108. inputFieldsList.add(requesterNameInputFieldMap);
  109. requesterDepartmentInputFieldMap = Map();
  110. requesterDepartmentInputFieldMap.put("metaApiName","requester-department");
  111. requesterDepartmentInputsList = List();
  112. requesterDepartmentInput = Map();
  113. requesterDepartmentInput.put("inputApiName","requester-department");
  114. requesterDepartmentInput.put("inputValue","sales");
  115. requesterDepartmentInputsList.add(requesterDepartmentInput);
  116. requesterDepartmentInputFieldMap.put("inputs",requesterDepartmentInputsList);
  117. inputFieldsList.add(requesterDepartmentInputFieldMap);
  118. partyBNameInputFieldMap = Map();
  119. partyBNameInputFieldMap.put("metaApiName","party-b-name");
  120. partyBNameInputsList = List();
  121. partyBNameInput = Map();
  122. partyBNameInput.put("inputApiName","party-b-name");
  123. partyBNameInput.put("inputValue","guy-mcnobody);
  124. partyBNameInputsList.add(partyBNameInput);
  125. partyBNameInputFieldMap.put("inputs",partyBNameInputsList);
  126. inputFieldsList.add(partyBNameInputFieldMap);
  127. counterpartyPrimaryContactInputFieldMap = Map();
  128. counterpartyPrimaryContactInputFieldMap.put("metaApiName","counterparty-primary-contact");
  129. counterpartyPrimaryContactInputsList = List();
  130. counterpartyPrimaryContactInput = Map();
  131. counterpartyPrimaryContactInput.put("inputApiName","party-b-primary-contact-name");
  132. counterpartyPrimaryContactInput.put("inputValue",signer_email);
  133. counterpartyPrimaryContactInputsList.add(counterpartyPrimaryContactInput);
  134. counterpartyPrimaryContactInputFieldMap.put("inputs",counterpartyPrimaryContactInputsList);
  135. inputFieldsList.add(counterpartyPrimaryContactInputFieldMap);
  136. contractTermInputFieldMap = Map();
  137. contractTermInputFieldMap.put("metaApiName","contract-term");
  138. contractTermInputsList = List();
  139. contractTermInput = Map();
  140. contractTermInput.put("inputApiName","contract-term");
  141. contractTermInput.put("inputValue",false);
  142. contractTermInputsList.add(contractTermInput);
  143. contractTermInputFieldMap.put("inputs",contractTermInputsList);
  144. inputFieldsList.add(contractTermInputFieldMap);
  145. contractEffectiveDateInputFieldMap = Map();
  146. contractEffectiveDateInputFieldMap.put("metaApiName","contract-effective-date");
  147. contractEffectiveDateInputsList = List();
  148. contractEffectiveDateInput = Map();
  149. contractEffectiveDateInput.put("inputApiName","contract-effective-date");
  150. contractEffectiveDateInput.put("inputValue",1);
  151. contractEffectiveDateInputsList.add(contractEffectiveDateInput);
  152. contractEffectiveDateInputFieldMap.put("inputs",contractEffectiveDateInputsList);
  153. inputFieldsList.add(contractEffectiveDateInputFieldMap);
  154. renewalTypeInputFieldMap = Map();
  155. renewalTypeInputFieldMap.put("metaApiName","renewal-type");
  156. renewalTypeInputsList = List();
  157. renewalTypeInput = Map();
  158. renewalTypeInput.put("inputApiName","renewal-type");
  159. renewalTypeInput.put("inputValue",1);
  160. renewalTypeInputsList.add(renewalTypeInput);
  161. renewalTypeInputFieldMap.put("inputs",renewalTypeInputsList);
  162. inputFieldsList.add(renewalTypeInputFieldMap);
  163. contractDataMap.put("inputfields",inputFieldsList);
  164. //
  165. // Create the contract in Zoho Contracts
  166. response = invokeurl
  167. [
  168. url :"https://contracts.zoho.com/api/v1/contracts"
  169. type :POST
  170. parameters:contractDataMap
  171. headers:contractsHeaders
  172. ];
  173. if(response.get("code") == 201)
  174. {
  175. alert "Contract created successfully";
  176. }
  177. else
  178. {
  179. alert "Error in creating contract: " + response.toString();
  180. cancel submit;
  181. }

Here is the resulting JSON per logging:
  1. {
  2.   "source": 1,
  3.   "inputfields": [
  4.     {
  5.       "metaApiName": "contract-type",
  6.       "inputs": [
  7.         {
  8.           "inputApiName": "contract-type",
  9.           "inputValue": "non-disclosure-agreement"
  10.         }
  11.       ]
  12.     },
  13.     {
  14.       "metaApiName": "title",
  15.       "inputs": [
  16.         {
  17.           "inputApiName": "title",
  18.           "inputValue": "Test title"
  19.         }
  20.       ]
  21.     },
  22.     {
  23.       "metaApiName": "description",
  24.       "inputs": [
  25.         {
  26.           "inputApiName": "description",
  27.           "inputValue": ""
  28.         }
  29.       ]
  30.     },
  31.     {
  32.       "metaApiName": "requester-name",
  33.       "inputs": [
  34.         {
  35.           "inputApiName": "requester-name",
  36.           "inputValue": "Tom Rismeyer"
  37.         }
  38.       ]
  39.     },
  40.     {
  41.       "metaApiName": "requester-department",
  42.       "inputs": [
  43.         {
  44.           "inputApiName": "requester-department",
  45.           "inputValue": "sales"
  46.         }
  47.       ]
  48.     },
  49.     {
  50.       "metaApiName": "party-b-name",
  51.       "inputs": [
  52.         {
  53.           "inputApiName": "party-b-name",
  54.           "inputValue": "guy-mcnobody"
  55.         }
  56.       ]
  57.     },
  58.     {
  59.       "metaApiName": "counterparty-primary-contact",
  60.       "inputs": [
  61.         {
  62.           "inputApiName": "party-b-primary-contact-name",
  63.           "inputValue": "contact@mail.com"
  64.         }
  65.       ]
  66.     },
  67.     {
  68.       "metaApiName": "contract-term",
  69.       "inputs": [
  70.         {
  71.           "inputApiName": "contract-term",
  72.           "inputValue": false
  73.         }
  74.       ]
  75.     },
  76.     {
  77.       "metaApiName": "contract-effective-date",
  78.       "inputs": [
  79.         {
  80.           "inputApiName": "contract-effective-date",
  81.           "inputValue": 1
  82.         }
  83.       ]
  84.     },
  85.     {
  86.       "metaApiName": "renewal-type",
  87.       "inputs": [
  88.         {
  89.           "inputApiName": "renewal-type",
  90.           "inputValue": 1
  91.         }
  92.       ]
  93.     }
  94.   ]
  95. }

I'm getting this error when I submit the form, triggering the deluge function:
  1. Error in creating contract: {"Errors":{"ErrorCode":"ZSEC-JSON_PARSE_ERROR","ErrorMessage":"Sorry, unable to complete your action due to an unknown error. Please try again.","APIErrorMessage":"JSON_PARSE_ERROR"}}

The error message is not very helpful, as it does not specify where it has an issue when parsing the JSON. The API documentation does not specify which fields are required for the Create Contract Endpoint, so I'm either left posting here to request more info, or to just tinker with different combinations of fields included and excluded, so I'm posting here. Can anybody help determine exactly which fields I'm missing, using incorrectly, or other issues with the JSON?

      Zoho Developer Community









                                Zoho Desk Resources

                                • Desk Community Learning Series


                                • Digest


                                • Functions


                                • Meetups


                                • Kbase


                                • Resources


                                • Glossary


                                • Desk Marketplace


                                • MVP Corner


                                • Word of the Day



                                    Zoho Marketing Automation


                                            Manage your brands on social media



                                                  Zoho TeamInbox Resources

                                                    Zoho DataPrep Resources



                                                      Zoho CRM Plus Resources

                                                        Zoho Books Resources


                                                          Zoho Subscriptions Resources

                                                            Zoho Projects Resources


                                                              Zoho Sprints Resources


                                                                Qntrl Resources


                                                                  Zoho Creator Resources


                                                                    Zoho WorkDrive Resources



                                                                      Zoho Campaigns Resources


                                                                        Zoho CRM Resources

                                                                        • CRM Community Learning Series

                                                                          CRM Community Learning Series


                                                                        • Tips

                                                                          Tips

                                                                        • Functions

                                                                          Functions

                                                                        • Meetups

                                                                          Meetups

                                                                        • Kbase

                                                                          Kbase

                                                                        • Resources

                                                                          Resources

                                                                        • Digest

                                                                          Digest

                                                                        • CRM Marketplace

                                                                          CRM Marketplace

                                                                        • MVP Corner

                                                                          MVP Corner





                                                                            Design. Discuss. Deliver.

                                                                            Create visually engaging stories with Zoho Show.

                                                                            Get Started Now