From fea8cd3b2651f5a04626a9c3230e75336024ca8e Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Fri, 15 Jan 2021 11:33:06 -0800 Subject: [PATCH 001/462] Update settings.example.json --- config/settings.example.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/settings.example.json b/config/settings.example.json index 4b15c33..71d0a69 100644 --- a/config/settings.example.json +++ b/config/settings.example.json @@ -6,7 +6,7 @@ "SIGNER_NOT_CHECKED_EMAIL": "{SIGNER_NOT_CHECKED_EMAIL}", "CC_EMAIL": "{CC_EMAIL}", "CC_NAME": "{CC_NAME}", - "IMPERSONATION_USER_GUID": "{IMPERSONATED_USER}", + "IMPERSONATION_USER_GUID": "{IMPERSONATED_USER_ID}", "INTEGRATION_KEY_JWT": "{INTEGRATION_KEY_JWT}", "INTEGRATION_KEY_AUTH_CODE": "{INTEGRATION_KEY_AUTH_CODE}", "SECRET_KEY": "{SECRET_KEY}", From 8b3b17b08b2353d124518a48fe20abcd67502faf Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Thu, 28 Jan 2021 12:32:45 -0800 Subject: [PATCH 002/462] Update settings.example.json (#11) Co-authored-by: robert-knight From 3ed6266ff6148cbd06f5439fcd636ee253533004 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 29 Jan 2021 11:06:40 -0800 Subject: [PATCH 003/462] updated eSign35 source link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a2746e..e25c3a7 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/eSignature/eg034UseConditionalRecipients.ps1) This code example demonstrates how to create an envelope where the workflow is routed to different recipients based on the value of a transaction. 1. **Request a signature by SMS** - [Source.](./app/eSignature/examples/eg035SMSDelivery.ps1) + [Source.](./examples/eSignature/eg035SMSDelivery.ps1) This code example demonstrates how to send a signature request for a signer to read and sign via an SMS message. ## Rooms API From 129ee1444896f80a7ee5063f0d7a1959a117cf58 Mon Sep 17 00:00:00 2001 From: robert-knight Date: Fri, 29 Jan 2021 16:24:10 -0800 Subject: [PATCH 004/462] Moved description, name, and shared in the envelope definition to fix no-name template. --- examples/eSignature/eg008CreateTemplate.ps1 | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 6b41ec5..186d02d 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -63,6 +63,9 @@ Write-Output "Sending the template create request to DocuSign..." # Concatenate the different parts of the request @{ + description = "Example template created via the API"; + name = "Example Signer and CC template"; + shared = "false"; documents = @( @{ documentBase64 = "$(Get-Content $doc1Base64)"; @@ -72,11 +75,6 @@ Write-Output "Sending the template create request to DocuSign..." }; ); emailSubject = "Please sign this document"; - envelopeTemplateDefinition = @{ - description = "Example template created via the API"; - name = "Example Signer and CC template"; - shared = "false"; - }; recipients = @{ carbonCopies = @( @{recipientId = "2"; roleName = "cc"; routingOrder = "2"; }; From 2a8f93cdf8c6fb575f334c84d9ff9e0964ca0936 Mon Sep 17 00:00:00 2001 From: Robert Knight Date: Tue, 2 Feb 2021 09:57:33 -0800 Subject: [PATCH 005/462] Devdocs 3936 (#13) * Update settings.example.json * Moved description, name, and shared in the envelope definition to fix no-name template. Co-authored-by: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> --- examples/eSignature/eg008CreateTemplate.ps1 | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 6b41ec5..186d02d 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -63,6 +63,9 @@ Write-Output "Sending the template create request to DocuSign..." # Concatenate the different parts of the request @{ + description = "Example template created via the API"; + name = "Example Signer and CC template"; + shared = "false"; documents = @( @{ documentBase64 = "$(Get-Content $doc1Base64)"; @@ -72,11 +75,6 @@ Write-Output "Sending the template create request to DocuSign..." }; ); emailSubject = "Please sign this document"; - envelopeTemplateDefinition = @{ - description = "Example template created via the API"; - name = "Example Signer and CC template"; - shared = "false"; - }; recipients = @{ carbonCopies = @( @{recipientId = "2"; roleName = "cc"; routingOrder = "2"; }; From 977d7ff19394c94c5fd0b24fe6fb556110f87ca8 Mon Sep 17 00:00:00 2001 From: Serhii Ovsianikov Date: Tue, 2 Feb 2021 19:57:50 +0200 Subject: [PATCH 006/462] Feature/rooms add form (#10) * Updated launcher for adding Rooms form examples * Updated Form examples * Updated Readme.md * Replaces Write-Host to Write-Output * Removed unused spaces * Fixed name of form group * Update eg008AccessFormGroup.ps1 Co-authored-by: Serhii Ovsianikov Co-authored-by: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> --- README.md | 9 +++ examples/Rooms/eg007CreateFormGroup.ps1 | 42 ++++++++++++ examples/Rooms/eg008AccessFormGroup.ps1 | 68 +++++++++++++++++++ examples/Rooms/eg009AssignFormGroup.ps1 | 90 +++++++++++++++++++++++++ launcher.ps1 | 17 ++++- 5 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 examples/Rooms/eg007CreateFormGroup.ps1 create mode 100644 examples/Rooms/eg008AccessFormGroup.ps1 create mode 100644 examples/Rooms/eg009AssignFormGroup.ps1 diff --git a/README.md b/README.md index 3a2746e..47c9172 100644 --- a/README.md +++ b/README.md @@ -152,6 +152,15 @@ For more information about the scopes used for obtaining authorization to use th 1. **Create an external form fillable session.** [Source.](./examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1) This example create an external form that can be filled using DocuSign for a specific room in your DocuSign Rooms account. +1. **Create a form group.** + [Source.](./examples/Rooms/eg007CreateFormGroup.ps1) + This example demonstrates how to create a form group for your DocuSign Rooms for Real Estate account. +1. **Grant office access to a form group.** + [Source.](./examples/Rooms/eg008AccessFormGroup.ps1) + This example demonstrates how to assign an office to a form group for your DocuSign Rooms for Real Estate account. +1. **Assign a form to a form group.** + [Source.](./examples/Rooms/eg009AssignFormGroup.ps1) + This example demonstrates how to assign a form to a form group for your DocuSign Rooms for Real Estate account. ## Click API **Note:** To use the Click API include the click_manage scope. Review the [Click API 101 Auth Guide](https://developers.docusign.com/docs/click-api/click101/auth) for more details. diff --git a/examples/Rooms/eg007CreateFormGroup.ps1 b/examples/Rooms/eg007CreateFormGroup.ps1 new file mode 100644 index 0000000..90ca114 --- /dev/null +++ b/examples/Rooms/eg007CreateFormGroup.ps1 @@ -0,0 +1,42 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +# Construct the request body +$body = @" + { + "name": "Sample Room Form Group" + } +"@ + +# Call the Rooms API +$base_path = "https://demo.rooms.docusign.com" +$uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups" + +try { + Write-Output "Response:" + $response = Invoke-WebRequest -uri $uri -headers $headers -method POST -body $body + $response.Content + $obj = $response.Content | ConvertFrom-Json + $formGroupID = $obj.formGroupId + + # Store formGroupID into the file .\config\FORM_GROUP_ID + $formGroupID > .\config\FORM_GROUP_ID +} +catch { + Write-Output "Unable to create a form group" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 new file mode 100644 index 0000000..49d62c6 --- /dev/null +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -0,0 +1,68 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +# Get form group ID from the .\config\FORM_GROUP_ID file +if (Test-Path .\config\FORM_GROUP_ID) { + $formGroupID = Get-Content .\config\FORM_GROUP_ID +} +else { + Write-Output "A form group ID is needed. Fix: execute step 7 - Create a form group..." + exit 1 +} + +# Get an office ID +$base_path = "https://demo.rooms.docusign.com" +$uri = "$base_path/restapi/v2/accounts/$APIAccountId/offices" + +try { + Write-Output "Response:" + $response = Invoke-WebRequest -uri $uri -headers $headers -method GET + $response.Content + # Retrieve the form group ID + $obj = $response.Content | ConvertFrom-Json + $officeID = $obj[0].officeSummaries.officeId +} +catch { + Write-Output "Unable to retrieve an office ID" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} + +# Call the Rooms API +$uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/grant_office_access/$officeID" + +try { + Write-Output "Response:" + $response = Invoke-WebRequest -uri $uri -headers $headers -method POST -body $body + $response.StatusCode + + # check that we have got a 204 Status code response + if ($response.StatusCode -ne "204" ) { + Write-Output "Unable to assign the provided form group ID to the provided office ID!" + exit 1 + } +} +catch { + Write-Output "Unable to grant office access to a form group" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 new file mode 100644 index 0000000..16dd3dd --- /dev/null +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -0,0 +1,90 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +# Get form group ID from the .\config\FORM_GROUP_ID file +if (Test-Path .\config\FORM_GROUP_ID) { + $formGroupID = Get-Content .\config\FORM_GROUP_ID +} +else { + Write-Output "A form group ID is needed. Fix: execute step 7 - Create a form group..." + exit 1 +} + +# Call the Rooms API to look up your forms library ID +$base_path = "https://demo.rooms.docusign.com" +$uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_libraries" +try { + Write-Output "Response:" + $response = Invoke-WebRequest -uri $uri -headers $headers -method GET + $response.Content + # Retrieve a form library ID + $obj = $response.Content | ConvertFrom-Json + $formsLibraryID = $obj.formsLibrarySummaries[0].formsLibraryId +} +catch { + Write-Output "Unable to retrieve form library" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} + +# Call the Rooms API to look up a list of form IDs for the given forms library +$uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_libraries/$formsLibraryID/forms" + +try { + Write-Output "Response:" + $response = Invoke-WebRequest -uri $uri -headers $headers -method GET + # Retrieve the the first form ID provided + $response.Content + $obj = $response | ConvertFrom-Json + $formID = $obj.forms[0].libraryFormId +} +catch { + Write-Output "Unable to retrieve a form id" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} + +# Construct your request body +$body = +@" + {"formId": "$formID" } +"@ + +# Call the Rooms API +$uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/assign_form" + +try { + $response = Invoke-WebRequest -uri $uri -headers $headers -method POST -Body $body + Write-Output $response.Status + Write-Output "Response: No JSON response body returned when setting the default office ID in a form group" +} +catch { + Write-Output "Unable to assign the form to the form group" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} diff --git a/launcher.ps1 b/launcher.ps1 index 43d7284..dce97be 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -302,7 +302,10 @@ function startRooms { AddFormsToRoomController = 4; GetRoomsWithFiltersController = 5; CreateAnExternalFormFillSessionController = 6; - Home = 7; + CreateFormGroup = 7; + AccessFormGroup = 8; + AssignFormGroup = 9; + Home = 10; } $listRoomExamplesView = $null; do { @@ -314,6 +317,9 @@ function startRooms { Write-Output "$([int][listRoomExamples]::AddFormsToRoomController)) Add forms to room controller" Write-Output "$([int][listRoomExamples]::GetRoomsWithFiltersController)) Get rooms with filters controller" Write-Output "$([int][listRoomExamples]::CreateAnExternalFormFillSessionController)) Create an external form fill session controller" + Write-Output "$([int][listRoomExamples]::CreateFormGroup)) Create a form group" + Write-Output "$([int][listRoomExamples]::AccessFormGroup)) Grant office access to a form group" + Write-Output "$([int][listRoomExamples]::AssignFormGroup)) Assign a form to a form group" Write-Output "$([int][listRoomExamples]::Home)) Home" [int]$listRoomExamplesView = Read-Host "Select the action" } while (-not [listRoomExamples]::IsDefined([listRoomExamples], $listRoomExamplesView)); @@ -336,6 +342,15 @@ function startRooms { elseif ($listRoomExamplesView -eq [listRoomExamples]::CreateAnExternalFormFillSessionController) { powershell.exe -Command .\examples\Rooms\eg006CreateAnExternalFormFillSessionController.ps1 } + elseif ($listRoomExamplesView -eq [listRoomExamples]::CreateFormGroup) { + powershell.exe -Command .\examples\Rooms\eg007CreateFormGroup.ps1 + } + elseif ($listRoomExamplesView -eq [listRoomExamples]::AccessFormGroup) { + powershell.exe -Command .\examples\Rooms\eg008AccessFormGroup.ps1 + } + elseif ($listRoomExamplesView -eq [listRoomExamples]::AssignFormGroup) { + powershell.exe -Command .\examples\Rooms\eg009AssignFormGroup.ps1 + } } until ($listRoomExamplesView -eq [listRoomExamples]::Home) startLauncher } From d712b76a36f331751cc4bc667813c5c22f4a70fd Mon Sep 17 00:00:00 2001 From: robert-knight Date: Tue, 2 Feb 2021 10:20:17 -0800 Subject: [PATCH 007/462] Updated comment per PR suggestion. --- examples/eSignature/eg008CreateTemplate.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 186d02d..414b081 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -63,7 +63,7 @@ Write-Output "Sending the template create request to DocuSign..." # Concatenate the different parts of the request @{ - description = "Example template created via the API"; + description = "Example template created via the eSignature API"; name = "Example Signer and CC template"; shared = "false"; documents = @( From 418a327668cf4a946939eabae45f9014d709b51a Mon Sep 17 00:00:00 2001 From: robert-knight Date: Tue, 2 Feb 2021 10:26:34 -0800 Subject: [PATCH 008/462] Public merge --- config/API_ACCOUNT_ID | Bin 0 -> 78 bytes config/CLICKWRAP_ID | Bin 0 -> 78 bytes config/ds_access_token.txt | Bin 0 -> 1408 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 config/API_ACCOUNT_ID create mode 100644 config/CLICKWRAP_ID create mode 100644 config/ds_access_token.txt diff --git a/config/API_ACCOUNT_ID b/config/API_ACCOUNT_ID new file mode 100644 index 0000000000000000000000000000000000000000..ec6a8b9d7231d441cd50c7d8e412bc00f755635f GIT binary patch literal 78 zcmW-XQ3}8y3`5_yu%ifd&N8o4ruRR=won4eBgywR0;jR)a;I{0CRZ+|6xq3QiGoKz NV{3KgWT-O^3P1k~3iJQ~ literal 0 HcmV?d00001 diff --git a/config/CLICKWRAP_ID b/config/CLICKWRAP_ID new file mode 100644 index 0000000000000000000000000000000000000000..c2878be4beba8d9e3b3370751e2c11d10aa8c15c GIT binary patch literal 78 zcmWlP$qj%o5XAgOq7AwSl_c0pJvA#;CsE0&naL~B*CY`+YMT&KpW4)L@ Mr>{)44eso0{1@5_s{jB1 literal 0 HcmV?d00001 diff --git a/config/ds_access_token.txt b/config/ds_access_token.txt new file mode 100644 index 0000000000000000000000000000000000000000..495c8bf70bbbd38a7987c4a9603029afb5cbec59 GIT binary patch literal 1408 zcmchW+j81K5JcxWRrwUBxJV9qTo5;5WbOjJP?!)QAuu*zFdv`f%myb_`GAy4tafLn zr@MFf`C}#T5=cQ-G8H4KJn{w-%0z0?mILor8muvSZMo;oiI1c!nT(~xK9w`?g6~{5 z>@#_0AF?KL0nZ0(OMNDFIda~lu1Nimt_7J{x~TZ=qpERl^)6a`a9rv}tPa?!^8fWy_tfUFz`RW1oTJBB*LTcTg**9sPd+zh@Zx})cfM4Ak@&_=Xo^;kFC$OXPr&Lk4K?}B zcMrdcs!o24vajGq;9bDGT23K29{LU5xtu$ku2G_@=R7Ag9_eD(4>--~lCi3$ z3g-u#Kfs{|*&eYi9g1{)z{fSc)T=l0b1G8!pW)`hR9!FgTZHr3PPPNj4!%0%MqsIj zcjP+OsXeTGzK6K#f|If9z`B8l5eN=^o-De~_%l9e?=xBIWd-&f>r~86|D& Date: Tue, 2 Feb 2021 16:37:21 -0500 Subject: [PATCH 009/462] SMS update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 47c9172..5fd2078 100644 --- a/README.md +++ b/README.md @@ -124,9 +124,9 @@ For more information about the scopes used for obtaining authorization to use th 1. **Using conditional recipients** [Source.](./examples/eSignature/eg034UseConditionalRecipients.ps1) This code example demonstrates how to create an envelope where the workflow is routed to different recipients based on the value of a transaction. -1. **Request a signature by SMS** +1. **Request a signature by SMS delivery** [Source.](./app/eSignature/examples/eg035SMSDelivery.ps1) - This code example demonstrates how to send a signature request for a signer to read and sign via an SMS message. + This code example demonstrates how to send a signature request via an SMS message using the [Envelopes: create](https://developers.docusign.com/esign-rest-api/reference/Envelopes/Envelopes/create) method. ## Rooms API From b5d8551d3696fe5ec6c4841625bd6c2da62f9bde Mon Sep 17 00:00:00 2001 From: Serhii Ovsianikov Date: Thu, 18 Feb 2021 15:54:01 +0200 Subject: [PATCH 010/462] Add Monitor API --- OAuth/code_grant.ps1 | 3 + OAuth/jwt.ps1 | 13 ++- README.md | 11 +++ examples/Monitor/eg001GetMonitoringData.ps1 | 91 +++++++++++++++++++++ launcher.ps1 | 32 +++++++- 5 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 examples/Monitor/eg001GetMonitoringData.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 7a63b45..d71a184 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -23,6 +23,9 @@ elseif ($apiVersion -eq "eSignature") { elseif ($apiVersion -eq "click") { $scopes = "click.manage" } +elseif ($apiVersion -eq "monitor") { + $scopes = "signature impersonation" +} $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $redirectUri = "http://${IP}:${PORT}/authorization-code/callback" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 79de04e..d4878f8 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -13,8 +13,12 @@ Install-NugetPackage PemUtils '3.0.0.82' New-Item "config\ds_access_token.txt" -Force -$privateKeyPath = [System.IO.Path]::Combine($PSScriptRoot, "..\config\private.key") | Resolve-Path -$outputFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\ds_access_token.txt") | Resolve-Path +if (!(test-path "..\config\private.key")){ + Write-Error "`n Error: First create an RSA keypair on your integration key and copy the private_key into the file `config/private.key` and save it" -ErrorAction Stop + exit 1 +} +$privateKeyPath = [System.IO.Path]::Combine($PSScriptRoot, "..\config\private.key") | Resolve-Path +$outputFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\ds_access_token.txt") | Resolve-Path $accountIdFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\API_ACCOUNT_ID") # Get required variables from .\config\settings.json file @@ -29,7 +33,10 @@ if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "click") { $scopes = "click.manage" -} + } + elseif ($apiVersion -eq "monitor") { + $scopes = "signature impersonation" + } # Step 1. Request application consent $PORT = '8080' diff --git a/README.md b/README.md index 5fd2078..b03b99a 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,17 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/Click/eg005GetClickwrapResponses.ps1) Demonstrates how to get user responses to your clickwrap agreements. +## Monitor API + +For more information about the scopes used for obtaining authorization to use the Monitor API, see the [Required Scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/) + +**Note:** to use the Monitor API you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). + +1. **Get Monitoring Data.** + [Source.](./examples/Monitor/eg001GetMonitoringData.ps1) + This example get and display all of your organization’s monitoring data. + + ## Installation **Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to Running the examples, the next step has been automatically performed for you.** Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 new file mode 100644 index 0000000..3957300 --- /dev/null +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -0,0 +1,91 @@ +# Temp files: +$response = New-TemporaryFile + +# Step 1. Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt + +# Step 2. Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +# Declare variables +$complete=$false +$cursorValue="" +$iterations=0 +# You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint +if (($accessToken -eq "") -or ($accessToken -eq $null)) +{ + Write-Output "You must provide an access token" + $complete = $true +} + +# Step 3: Get monitoring data +# First call the endpoint with no cursor to get the first records. +# After each call, save the cursor and use it to make the next +# call from the point where the previous one left off when iterating through +# the monitoring records +DO{ + $iterations++ + + Write-Output "" + try{ + Invoke-RestMethod ` + -Uri "https://lens-d.docusign.net/api/v2.0/datasets/monitor/stream?cursor=${cursorValue}&limit=2000" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + ` + -OutFile $response + + # Display the data + Write-Output "Iteration:" + Write-Output $iterations + Write-Output "Results:" + Get-Content $response + + # Get the endCursor value from the response. This lets you resume + # getting records from the spot where this call left off + $endCursorValue = (Get-Content $response | ConvertFrom-Json).endCursor + Write-Output "endCursorValue is:" + Write-Output $endCursorValue + Write-Output "cursorValue is:" + Write-Output $cursorValue + + # If the endCursor from the response is the same as the one that you already have, + # it means that you have reached the + # end of the records + if ( $endCursorValue -eq $cursorValue ) + { + Write-Output 'After getting records, the cursor values are the same. This indicates that you have reached the end of your available records.' + $complete=$true + } + else + { + Write-Output "Updating the cursor value of $cursorValue to the new value of $endCursorValue" + $cursorValue=$endCursorValue + Start-Sleep -Second 5 + } + } + catch{ + $int = 0 + foreach($header in $_.Exception.Response.Headers){ + if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + $int++ + } + write-host "Error : "$_.ErrorDetails.Message + write-host "Command : "$_.InvocationInfo.Line + $complete = $true + } + +} While ($complete -eq $false ) + +Remove-Item $response + +Write-Output "" +Write-Output "" +Write-Output "Done." +Write-Output "" diff --git a/launcher.ps1 b/launcher.ps1 index dce97be..5482894 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -32,7 +32,8 @@ function startLauncher { eSignature = 1; Rooms = 2; Click = 3; - Exit = 4; + Monitor = 4; + Exit = 5; } $listApiView = $null; @@ -41,6 +42,7 @@ function startLauncher { Write-Output "$([int][listApi]::eSignature)) eSignature" Write-Output "$([int][listApi]::Rooms)) Rooms" Write-Output "$([int][listApi]::Click)) Click" + Write-Output "$([int][listApi]::Monitor)) Monitor" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); @@ -54,6 +56,9 @@ function startLauncher { elseif ($listApiView -eq [listApi]::Click) { startAuth "click" } + elseif ($listApiView -eq [listApi]::Monitor) { + startAuth "monitor" + } elseif ($listApiView -eq [listApi]::Exit) { exit 1 } @@ -97,6 +102,9 @@ function startAuth ($apiVersion) { elseif ($listApiView -eq [listApi]::Click) { startClick } + elseif ($listApiView -eq [listApi]::Monitor) { + startMonitor + } } function startSignature { @@ -397,5 +405,27 @@ function startClick { startLauncher } +function startMonitor { + do { + Enum listMonitorExamples { + getMonitoringData = 1; + Home = 2; + } + $listMonitorExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listMonitorExamples]::getMonitoringData)) Get Monitoring Data" + Write-Output "$([int][listMonitorExamples]::Home)) Home" + [int]$listMonitorExamplesView = Read-Host "Select the action" + } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); + + if ($listMonitorExamplesView -eq [listMonitorExamples]::getMonitoringData) { + powershell.exe -Command .\examples\Monitor\eg001getMonitoringData.ps1 + } + } until ($listMonitorExamplesView -eq [listMonitorExamples]::Home) + startLauncher +} + Write-Output "Welcome to the DocuSign PowerShell Launcher" startLauncher From 6997f7cd63e0d534b7a9ee0c984b78224e2368a5 Mon Sep 17 00:00:00 2001 From: Serhii Ovsianikov Date: Thu, 18 Feb 2021 16:24:12 +0200 Subject: [PATCH 011/462] Apply PSScriptAnalyzer suggestions --- OAuth/jwt.ps1 | 4 ++-- examples/Monitor/eg001GetMonitoringData.ps1 | 22 ++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index d4878f8..a202fbf 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -17,8 +17,8 @@ if (!(test-path "..\config\private.key")){ Write-Error "`n Error: First create an RSA keypair on your integration key and copy the private_key into the file `config/private.key` and save it" -ErrorAction Stop exit 1 } -$privateKeyPath = [System.IO.Path]::Combine($PSScriptRoot, "..\config\private.key") | Resolve-Path -$outputFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\ds_access_token.txt") | Resolve-Path +$privateKeyPath = [System.IO.Path]::Combine($PSScriptRoot, "..\config\private.key") | Resolve-Path +$outputFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\ds_access_token.txt") | Resolve-Path $accountIdFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\API_ACCOUNT_ID") # Get required variables from .\config\settings.json file diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index 3957300..670ca16 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -15,21 +15,21 @@ $complete=$false $cursorValue="" $iterations=0 # You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint -if (($accessToken -eq "") -or ($accessToken -eq $null)) +if (($accessToken -eq "") -or ($null -eq $accessToken)) { Write-Output "You must provide an access token" $complete = $true } - + # Step 3: Get monitoring data # First call the endpoint with no cursor to get the first records. -# After each call, save the cursor and use it to make the next +# After each call, save the cursor and use it to make the next # call from the point where the previous one left off when iterating through # the monitoring records DO{ $iterations++ - Write-Output "" + Write-Output "" try{ Invoke-RestMethod ` -Uri "https://lens-d.docusign.net/api/v2.0/datasets/monitor/stream?cursor=${cursorValue}&limit=2000" ` @@ -53,10 +53,10 @@ DO{ Write-Output "endCursorValue is:" Write-Output $endCursorValue Write-Output "cursorValue is:" - Write-Output $cursorValue - + Write-Output $cursorValue + # If the endCursor from the response is the same as the one that you already have, - # it means that you have reached the + # it means that you have reached the # end of the records if ( $endCursorValue -eq $cursorValue ) { @@ -73,13 +73,13 @@ DO{ catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ - if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + if($header -eq "X-DocuSign-TraceToken"){ Write-Output "TraceToken : " $_.Exception.Response.Headers[$int]} $int++ } - write-host "Error : "$_.ErrorDetails.Message - write-host "Command : "$_.InvocationInfo.Line + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line $complete = $true - } + } } While ($complete -eq $false ) From 9384ab1de478c45adb1bc482d69e0704e189d554 Mon Sep 17 00:00:00 2001 From: "yuliia.trehub" <43814744+juliatregub1@users.noreply.github.com> Date: Fri, 19 Feb 2021 12:28:00 +0200 Subject: [PATCH 012/462] Formatting eg001GetMonitoringData script --- examples/Monitor/eg001GetMonitoringData.ps1 | 118 ++++++++++---------- 1 file changed, 58 insertions(+), 60 deletions(-) diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index 670ca16..81c0bbc 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -15,71 +15,69 @@ $complete=$false $cursorValue="" $iterations=0 # You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint -if (($accessToken -eq "") -or ($null -eq $accessToken)) -{ - Write-Output "You must provide an access token" - $complete = $true +if (($accessToken -eq "") -or ($accessToken -eq $null)) { + Write-Output "You must provide an access token" + $complete = $true } - + # Step 3: Get monitoring data # First call the endpoint with no cursor to get the first records. -# After each call, save the cursor and use it to make the next +# After each call, save the cursor and use it to make the next # call from the point where the previous one left off when iterating through # the monitoring records -DO{ - $iterations++ - - Write-Output "" - try{ - Invoke-RestMethod ` - -Uri "https://lens-d.docusign.net/api/v2.0/datasets/monitor/stream?cursor=${cursorValue}&limit=2000" ` - -Method 'GET' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; - } ` - ` - -OutFile $response - - # Display the data - Write-Output "Iteration:" - Write-Output $iterations - Write-Output "Results:" - Get-Content $response - - # Get the endCursor value from the response. This lets you resume - # getting records from the spot where this call left off - $endCursorValue = (Get-Content $response | ConvertFrom-Json).endCursor - Write-Output "endCursorValue is:" - Write-Output $endCursorValue - Write-Output "cursorValue is:" - Write-Output $cursorValue - - # If the endCursor from the response is the same as the one that you already have, - # it means that you have reached the - # end of the records - if ( $endCursorValue -eq $cursorValue ) - { - Write-Output 'After getting records, the cursor values are the same. This indicates that you have reached the end of your available records.' - $complete=$true - } - else - { - Write-Output "Updating the cursor value of $cursorValue to the new value of $endCursorValue" - $cursorValue=$endCursorValue - Start-Sleep -Second 5 +DO { + $iterations++ + Write-Output "" + + try { + Invoke-RestMethod ` + -Uri "https://lens-d.docusign.net/api/v2.0/datasets/monitor/stream?cursor=${cursorValue}&limit=2000" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + + # Display the data + Write-Output "Iteration:" + Write-Output $iterations + Write-Output "Results:" + Get-Content $response + + # Get the endCursor value from the response. This lets you resume + # getting records from the spot where this call left off + $endCursorValue = (Get-Content $response | ConvertFrom-Json).endCursor + Write-Output "endCursorValue is:" + Write-Output $endCursorValue + Write-Output "cursorValue is:" + Write-Output $cursorValue + + # If the endCursor from the response is the same as the one that you already have, + # it means that you have reached the + # end of the records + if ($endCursorValue -eq $cursorValue) { + Write-Output 'After getting records, the cursor values are the same. This indicates that you have reached the end of your available records.' + $complete=$true + } + else { + Write-Output "Updating the cursor value of $cursorValue to the new value of $endCursorValue" + $cursorValue=$endCursorValue + Start-Sleep -Second 5 + } + } + catch { + $int = 0 + foreach($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } - } - catch{ - $int = 0 - foreach($header in $_.Exception.Response.Headers){ - if($header -eq "X-DocuSign-TraceToken"){ Write-Output "TraceToken : " $_.Exception.Response.Headers[$int]} - $int++ - } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line - $complete = $true - } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + $complete = $true + } } While ($complete -eq $false ) @@ -88,4 +86,4 @@ Remove-Item $response Write-Output "" Write-Output "" Write-Output "Done." -Write-Output "" +Write-Output "" \ No newline at end of file From 23681b060a4cce02bb6ceb64b0ce841965768acf Mon Sep 17 00:00:00 2001 From: Yuliia Trehub <43814744+yuliiatrehub@users.noreply.github.com> Date: Fri, 19 Feb 2021 12:31:13 +0200 Subject: [PATCH 013/462] Formatting eg001GetMonitoringData script --- examples/Monitor/eg001GetMonitoringData.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index 81c0bbc..dd68d3d 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -71,7 +71,7 @@ DO { foreach($header in $_.Exception.Response.Headers) { if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] - } + } $int++ } Write-Output "Error : "$_.ErrorDetails.Message @@ -86,4 +86,4 @@ Remove-Item $response Write-Output "" Write-Output "" Write-Output "Done." -Write-Output "" \ No newline at end of file +Write-Output "" From 87b2d08c288310443f9c9904ae614b82ab53be9a Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Fri, 19 Feb 2021 13:36:05 -0800 Subject: [PATCH 014/462] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5fd2078..6c722a3 100644 --- a/README.md +++ b/README.md @@ -182,8 +182,15 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/Click/eg005GetClickwrapResponses.ps1) Demonstrates how to get user responses to your clickwrap agreements. +## Prerequisites +1. A DocuSign developer account (email and password) on demo.docusign.net. Create a free account. +1. PowerShell 5 or later + +**Note:** The Quickstart creates and configures a new Integration Key to use in the resulting project. If you later intend to create and customize your own integration and eventually migrate to production using our Go-Live process, you would need to update the Quickstart’s configuration values. + + ## Installation -**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to Running the examples, the next step has been automatically performed for you.** +**Note:** If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to Running the examples, the next step has been automatically performed for you. Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. ## Collect your Integration information From b6a5e10893f95e1a9e7321526a8b81ef7715fb3e Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 22 Feb 2021 14:18:04 -0800 Subject: [PATCH 015/462] Updated Running the examples section --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e25c3a7..5bd5f7b 100644 --- a/README.md +++ b/README.md @@ -174,7 +174,7 @@ For more information about the scopes used for obtaining authorization to use th Demonstrates how to get user responses to your clickwrap agreements. ## Installation -**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to Running the examples, the next step has been automatically performed for you.** +**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to [Running the examples](#running-the-examples). The next step has been automatically performed for you.** Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. ## Collect your Integration information @@ -209,7 +209,7 @@ These OAuth scripts are integrated into the launcher and hardcode the location f Do not delete or change the name of the private.key file located in the config directory as this will cause problems with jwt authentication. ## Running the examples -You can see each of the various examples in action by running `powershell launcher.ps1` and pressing the number six to get to the option to edit your form data. To use the Rooms API, select Rooms API at the selection prompt just after running `powershell launcher.ps1`. +You can see each of the various examples in action by going to opening the extracted Quickstart folder or the code-examples-powershell folder, right-clicking on the **launcher** file, selecting **Run with PowerShell**, selecting **Open** when prompted by the dialog box, and selecting an API when prompted in Windows Powershell. Log in to your DocuSign account using either Authorization Code Grant or using JWT to gain an OAuth token. From there, you can pick the number that corresponds to a setting or feature you wish to try out. @@ -225,7 +225,7 @@ The source files for each example are located in the `/examples` directory. ### Payments code example To use the payments code example, first create a test payments gateway in your account. Follow the instructions in the -[PAYMENTS_INSTALLATION.md](https://github.com/docusign/code-examples-powershell/blob/master/PAYMENTS_INSTALLATION.md) +[PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) file. Then add the payment gateway id to the code example file. From 1509de1e8279f958802659c31e15d5f2f32b4122 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 22 Feb 2021 14:19:46 -0800 Subject: [PATCH 016/462] small wording edit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5bd5f7b..d6d8a51 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,7 @@ These OAuth scripts are integrated into the launcher and hardcode the location f Do not delete or change the name of the private.key file located in the config directory as this will cause problems with jwt authentication. ## Running the examples -You can see each of the various examples in action by going to opening the extracted Quickstart folder or the code-examples-powershell folder, right-clicking on the **launcher** file, selecting **Run with PowerShell**, selecting **Open** when prompted by the dialog box, and selecting an API when prompted in Windows Powershell. +You can see the code examples in action by going to opening the extracted Quickstart folder or the code-examples-powershell folder, right-clicking on the **launcher** file, selecting **Run with PowerShell**, selecting **Open** when prompted by the dialog box, and selecting an API when prompted in Windows Powershell. Log in to your DocuSign account using either Authorization Code Grant or using JWT to gain an OAuth token. From there, you can pick the number that corresponds to a setting or feature you wish to try out. From c97ee1d326303e898e20095ee4bb4d7d59c10590 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 22 Feb 2021 14:22:14 -0800 Subject: [PATCH 017/462] Sync updated sections with public README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6c722a3..b3c0590 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ For more information about the scopes used for obtaining authorization to use th ## Installation -**Note:** If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to Running the examples, the next step has been automatically performed for you. +**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to [Running the examples](#running-the-examples). The next step has been automatically performed for you.** Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. ## Collect your Integration information @@ -225,7 +225,7 @@ These OAuth scripts are integrated into the launcher and hardcode the location f Do not delete or change the name of the private.key file located in the config directory as this will cause problems with jwt authentication. ## Running the examples -You can see each of the various examples in action by running `powershell launcher.ps1` and pressing the number six to get to the option to edit your form data. To use the Rooms API, select Rooms API at the selection prompt just after running `powershell launcher.ps1`. +You can see the code examples in action by going to opening the extracted Quickstart folder or the code-examples-powershell folder, right-clicking on the **launcher** file, selecting **Run with PowerShell**, selecting **Open** when prompted by the dialog box, and selecting an API when prompted in Windows Powershell. Log in to your DocuSign account using either Authorization Code Grant or using JWT to gain an OAuth token. From there, you can pick the number that corresponds to a setting or feature you wish to try out. @@ -241,7 +241,7 @@ The source files for each example are located in the `/examples` directory. ### Payments code example To use the payments code example, first create a test payments gateway in your account. Follow the instructions in the -[PAYMENTS_INSTALLATION.md](https://github.com/docusign/code-examples-powershell/blob/master/PAYMENTS_INSTALLATION.md) +[PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) file. Then add the payment gateway id to the code example file. From 8d8eeeff8dcdfbccc15a09737984e91dc34b7d44 Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Fri, 26 Feb 2021 16:32:28 -0800 Subject: [PATCH 018/462] fixes to comments and added step 4 examples for rooms 8,9 (#15) --- examples/Rooms/eg007CreateFormGroup.ps1 | 7 +++++ examples/Rooms/eg008AccessFormGroup.ps1 | 36 ++++++++++++++++++------ examples/Rooms/eg009AssignFormGroup.ps1 | 37 +++++++++++++++++++------ launcher.ps1 | 2 +- 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/examples/Rooms/eg007CreateFormGroup.ps1 b/examples/Rooms/eg007CreateFormGroup.ps1 index 90ca114..f5e05cf 100644 --- a/examples/Rooms/eg007CreateFormGroup.ps1 +++ b/examples/Rooms/eg007CreateFormGroup.ps1 @@ -2,19 +2,25 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Step 2 Start # Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 End +# Step 3 Start # Construct the request body $body = @" { "name": "Sample Room Form Group" } "@ +# Step 3 End +# Step 4 Start # Call the Rooms API $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups" @@ -40,3 +46,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 4 End diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 49d62c6..8d3b879 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -2,21 +2,16 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID +# Step 2 Start # Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 End -# Get form group ID from the .\config\FORM_GROUP_ID file -if (Test-Path .\config\FORM_GROUP_ID) { - $formGroupID = Get-Content .\config\FORM_GROUP_ID -} -else { - Write-Output "A form group ID is needed. Fix: execute step 7 - Create a form group..." - exit 1 -} +# Step 3 Start # Get an office ID $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/offices" @@ -40,7 +35,31 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 3 End + +# Step 4 Start +# Get form group ID from the .\config\FORM_GROUP_ID file +if (Test-Path .\config\FORM_GROUP_ID) { + $formGroupID = Get-Content .\config\FORM_GROUP_ID +} +else { + # try { + # $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/D" + # Write-Output "Response:" + # $response = Invoke-WebRequest -uri $uri -headers $headers -method GET + # $response.Content + # } + # catch { + # Write-Output "Unable to select form group IDs" + # } + + Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." + exit 1 +} +# Step 4 End + +# Step 5 Start # Call the Rooms API $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/grant_office_access/$officeID" @@ -66,3 +85,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 5 End diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index 16dd3dd..94df972 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -2,21 +2,15 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID +# Step 2 Start # Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 End -# Get form group ID from the .\config\FORM_GROUP_ID file -if (Test-Path .\config\FORM_GROUP_ID) { - $formGroupID = Get-Content .\config\FORM_GROUP_ID -} -else { - Write-Output "A form group ID is needed. Fix: execute step 7 - Create a form group..." - exit 1 -} - +# Step 3 Start # Call the Rooms API to look up your forms library ID $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_libraries" @@ -62,13 +56,37 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 3 End + +# Step 4 Start +# Get form group ID from the .\config\FORM_GROUP_ID file +if (Test-Path .\config\FORM_GROUP_ID) { + $formGroupID = Get-Content .\config\FORM_GROUP_ID + } + else { + # try { + # $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/D" + # Write-Output "Response:" + # $response = Invoke-WebRequest -uri $uri -headers $headers -method GET + # $response.Content + # } + # catch { + # Write-Output "Unable to select form group IDs" + # } + Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." + exit 1 + } +# Step 4 End +# Step 5 Start # Construct your request body $body = @" {"formId": "$formID" } "@ +# Step 5 End +# Step 6 Start # Call the Rooms API $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/assign_form" @@ -88,3 +106,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 6 End \ No newline at end of file diff --git a/launcher.ps1 b/launcher.ps1 index dce97be..55935af 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -82,7 +82,7 @@ function startAuth ($apiVersion) { startLauncher } elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { - . .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) } elseif ($AuthTypeView -eq [AuthType]::JWT) { powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) From 8f47700c8746323344fcf7e7e6e2ce72974a7de3 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Sat, 27 Feb 2021 10:38:56 -0800 Subject: [PATCH 019/462] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b3c0590..4adc7ef 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/eSignature/eg034UseConditionalRecipients.ps1) This code example demonstrates how to create an envelope where the workflow is routed to different recipients based on the value of a transaction. 1. **Request a signature by SMS delivery** - [Source.](./app/eSignature/examples/eg035SMSDelivery.ps1) + [Source.](./app/examples/eSignature/eg035SMSDelivery.ps1) This code example demonstrates how to send a signature request via an SMS message using the [Envelopes: create](https://developers.docusign.com/esign-rest-api/reference/Envelopes/Envelopes/create) method. ## Rooms API From 4eb4ed1c14905d6083d2778fbed05dfc17526f39 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Sat, 27 Feb 2021 10:39:33 -0800 Subject: [PATCH 020/462] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4adc7ef..7bbe6c8 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/eSignature/eg034UseConditionalRecipients.ps1) This code example demonstrates how to create an envelope where the workflow is routed to different recipients based on the value of a transaction. 1. **Request a signature by SMS delivery** - [Source.](./app/examples/eSignature/eg035SMSDelivery.ps1) + [Source.](./examples/eSignature/eg035SMSDelivery.ps1) This code example demonstrates how to send a signature request via an SMS message using the [Envelopes: create](https://developers.docusign.com/esign-rest-api/reference/Envelopes/Envelopes/create) method. ## Rooms API From e8126952adb87a30e5758999e5f675d0df6432a5 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Sat, 27 Feb 2021 10:40:19 -0800 Subject: [PATCH 021/462] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b3c0590..7bbe6c8 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/eSignature/eg034UseConditionalRecipients.ps1) This code example demonstrates how to create an envelope where the workflow is routed to different recipients based on the value of a transaction. 1. **Request a signature by SMS delivery** - [Source.](./app/eSignature/examples/eg035SMSDelivery.ps1) + [Source.](./examples/eSignature/eg035SMSDelivery.ps1) This code example demonstrates how to send a signature request via an SMS message using the [Envelopes: create](https://developers.docusign.com/esign-rest-api/reference/Envelopes/Envelopes/create) method. ## Rooms API From 4334bdfd7a13c72b3875287c44f0919d4ee801b1 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 4 Mar 2021 12:50:01 -0800 Subject: [PATCH 022/462] moved Step 4 start/end comments --- examples/Rooms/eg008AccessFormGroup.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 8d3b879..c59cab2 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -37,11 +37,12 @@ catch { } # Step 3 End -# Step 4 Start # Get form group ID from the .\config\FORM_GROUP_ID file +# Step 4 Start if (Test-Path .\config\FORM_GROUP_ID) { $formGroupID = Get-Content .\config\FORM_GROUP_ID } +# Step 4 End else { # try { # $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/D" @@ -56,7 +57,6 @@ else { Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." exit 1 } -# Step 4 End # Step 5 Start From dd7a97370b6415592ebbfc6f2cfe2ca2b247f344 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 4 Mar 2021 12:50:45 -0800 Subject: [PATCH 023/462] moved Step 4 start/end comment --- examples/Rooms/eg008AccessFormGroup.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 8d3b879..c59cab2 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -37,11 +37,12 @@ catch { } # Step 3 End -# Step 4 Start # Get form group ID from the .\config\FORM_GROUP_ID file +# Step 4 Start if (Test-Path .\config\FORM_GROUP_ID) { $formGroupID = Get-Content .\config\FORM_GROUP_ID } +# Step 4 End else { # try { # $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/D" @@ -56,7 +57,6 @@ else { Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." exit 1 } -# Step 4 End # Step 5 Start From c28c1bfbdad14cfc826b91be29f30d246ceca550 Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Thu, 4 Mar 2021 13:12:08 -0800 Subject: [PATCH 024/462] Update eg009AssignFormGroup.ps1 --- examples/Rooms/eg009AssignFormGroup.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index 94df972..b23a59d 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -65,7 +65,7 @@ if (Test-Path .\config\FORM_GROUP_ID) { } else { # try { - # $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/D" + # $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups" # Write-Output "Response:" # $response = Invoke-WebRequest -uri $uri -headers $headers -method GET # $response.Content @@ -106,4 +106,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 6 End \ No newline at end of file +# Step 6 End From b5710986e0130a6de3eaa7e30970baaf73bd9ae5 Mon Sep 17 00:00:00 2001 From: Aaron JacksonWilde Date: Thu, 4 Mar 2021 13:46:27 -0800 Subject: [PATCH 025/462] remove stale code --- examples/Rooms/eg008AccessFormGroup.ps1 | 9 --------- examples/Rooms/eg009AssignFormGroup.ps1 | 10 +--------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 8d3b879..be0b2fc 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -43,15 +43,6 @@ if (Test-Path .\config\FORM_GROUP_ID) { $formGroupID = Get-Content .\config\FORM_GROUP_ID } else { - # try { - # $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/D" - # Write-Output "Response:" - # $response = Invoke-WebRequest -uri $uri -headers $headers -method GET - # $response.Content - # } - # catch { - # Write-Output "Unable to select form group IDs" - # } Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." exit 1 diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index 94df972..1d72a13 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -64,15 +64,7 @@ if (Test-Path .\config\FORM_GROUP_ID) { $formGroupID = Get-Content .\config\FORM_GROUP_ID } else { - # try { - # $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/D" - # Write-Output "Response:" - # $response = Invoke-WebRequest -uri $uri -headers $headers -method GET - # $response.Content - # } - # catch { - # Write-Output "Unable to select form group IDs" - # } + Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." exit 1 } From de90ce0f659466f7cd6279c73998e7ed41ebfd8c Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 4 Mar 2021 13:49:37 -0800 Subject: [PATCH 026/462] Removed Step 4 comments --- examples/Rooms/eg008AccessFormGroup.ps1 | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 489e0d3..1014510 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -38,13 +38,10 @@ catch { # Step 3 End # Get form group ID from the .\config\FORM_GROUP_ID file -# Step 4 Start if (Test-Path .\config\FORM_GROUP_ID) { $formGroupID = Get-Content .\config\FORM_GROUP_ID } -# Step 4 End else { - Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." exit 1 } From f6836ae05dcb005e6d6d900c221c89bef0910973 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 4 Mar 2021 13:49:59 -0800 Subject: [PATCH 027/462] Removed Step 4 comments --- examples/Rooms/eg008AccessFormGroup.ps1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 489e0d3..72e6ddf 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -38,11 +38,9 @@ catch { # Step 3 End # Get form group ID from the .\config\FORM_GROUP_ID file -# Step 4 Start if (Test-Path .\config\FORM_GROUP_ID) { $formGroupID = Get-Content .\config\FORM_GROUP_ID } -# Step 4 End else { Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." From d5d434e89a92c44a34568179dce3e8fc46e3ed22 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 4 Mar 2021 13:50:28 -0800 Subject: [PATCH 028/462] Removed blank line --- examples/Rooms/eg008AccessFormGroup.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 72e6ddf..1014510 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -42,7 +42,6 @@ if (Test-Path .\config\FORM_GROUP_ID) { $formGroupID = Get-Content .\config\FORM_GROUP_ID } else { - Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." exit 1 } From 1b9d780b404274e1a30d5d0c615603550cc6ad57 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 5 Mar 2021 10:17:20 -0800 Subject: [PATCH 029/462] for example 1 for Rooms - no need for OfficeId, it just uses the default. for example 8 - small fix to get the OfficeId found. --- examples/Rooms/eg001CreateRoomWithDataController.ps1 | 6 ------ examples/Rooms/eg008AccessFormGroup.ps1 | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/examples/Rooms/eg001CreateRoomWithDataController.ps1 b/examples/Rooms/eg001CreateRoomWithDataController.ps1 index 3fda371..a5d6046 100644 --- a/examples/Rooms/eg001CreateRoomWithDataController.ps1 +++ b/examples/Rooms/eg001CreateRoomWithDataController.ps1 @@ -13,18 +13,12 @@ $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/roles" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $roleId = $($response.Content | ConvertFrom-Json).roles[0].roleid -# Get Office ID -$uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/offices" -$response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET -$officeId = $($response.Content | ConvertFrom-Json).officeSummaries.officeId - # - Construct the request body for your room $body = @" { "name": "Sample Room Creation", "roleId": "$roleId", "transactionSideId": "listbuy", - "officeId": "$officeId", "fieldData": { "data" : { "address1": "123 EZ Street", diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 1014510..2470d0c 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -22,7 +22,7 @@ try { $response.Content # Retrieve the form group ID $obj = $response.Content | ConvertFrom-Json - $officeID = $obj[0].officeSummaries.officeId + $officeID = $obj.officeSummaries[0].officeId } catch { Write-Output "Unable to retrieve an office ID" From 36d34619e313fc62131b8e4e5d28c3d0b110d9c1 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 5 Mar 2021 17:55:39 -0800 Subject: [PATCH 030/462] Fixing a couple of issues with the Rooms API PowerShell code examples. --- examples/Rooms/eg001CreateRoomWithDataController.ps1 | 6 ------ examples/Rooms/eg008AccessFormGroup.ps1 | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/examples/Rooms/eg001CreateRoomWithDataController.ps1 b/examples/Rooms/eg001CreateRoomWithDataController.ps1 index 3fda371..a5d6046 100644 --- a/examples/Rooms/eg001CreateRoomWithDataController.ps1 +++ b/examples/Rooms/eg001CreateRoomWithDataController.ps1 @@ -13,18 +13,12 @@ $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/roles" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $roleId = $($response.Content | ConvertFrom-Json).roles[0].roleid -# Get Office ID -$uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/offices" -$response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET -$officeId = $($response.Content | ConvertFrom-Json).officeSummaries.officeId - # - Construct the request body for your room $body = @" { "name": "Sample Room Creation", "roleId": "$roleId", "transactionSideId": "listbuy", - "officeId": "$officeId", "fieldData": { "data" : { "address1": "123 EZ Street", diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 1014510..2470d0c 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -22,7 +22,7 @@ try { $response.Content # Retrieve the form group ID $obj = $response.Content | ConvertFrom-Json - $officeID = $obj[0].officeSummaries.officeId + $officeID = $obj.officeSummaries[0].officeId } catch { Write-Output "Unable to retrieve an office ID" From d2afc1f60ee9ff4d4198aed93ac2213babeba1bd Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 15 Mar 2021 12:23:04 -0700 Subject: [PATCH 031/462] Added Step 3 comments; remove other numbers in comments --- examples/eSignature/eg007EnvelopeGetDoc.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/eSignature/eg007EnvelopeGetDoc.ps1 b/examples/eSignature/eg007EnvelopeGetDoc.ps1 index 50297f5..8c38602 100644 --- a/examples/eSignature/eg007EnvelopeGetDoc.ps1 +++ b/examples/eSignature/eg007EnvelopeGetDoc.ps1 @@ -6,7 +6,7 @@ $apiUri = "https://demo.docusign.net/restapi" # can be manually created. -# Step 1. Obtain your Oauth access token +# Obtain your Oauth access token $accessToken = Get-Content .\config\ds_access_token.txt # Obtain your accountId from demo.docusign.net -- the account id is shown in @@ -22,7 +22,7 @@ if (Test-Path .\config\ENVELOPE_ID) { $envelopeId = Get-Content .\config\ENVELOPE_ID } else { - Write-Output "An envelope id is needed. Fix: execute step 2 - Signing_Via_Email" + Write-Output "An envelope id is needed. Fix: execute code example 2 - Signing_Via_Email" exit 1 } @@ -67,8 +67,8 @@ else { } Write-Output "Sending the EnvelopeDocuments::get request to DocuSign..." -# ***DS.snippet.0.start -# Step 3. Call the eSignature API +# Call the eSignature API +# Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/documents/${docChoice}" ` -Method 'GET' ` @@ -77,6 +77,6 @@ Invoke-RestMethod ` 'Content-Type' = "application/json"; } ` -OutFile ${outputFile}${outputFileExtension} -# ***DS.snippet.0.end +# Step 3 end Write-Output "The document(s) are stored in file ${outputFile}${outputFileExtension}" -Write-Output "Done." \ No newline at end of file +Write-Output "Done." From 770d2358a68d07e999a9dfb3020fb173f406d64d Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 16:38:11 -0700 Subject: [PATCH 032/462] updated README --- README.md | 90 ++++++++++++++++++++++++++----------------------------- 1 file changed, 42 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 7bbe6c8..7c89dbd 100644 --- a/README.md +++ b/README.md @@ -165,7 +165,6 @@ For more information about the scopes used for obtaining authorization to use th ## Click API **Note:** To use the Click API include the click_manage scope. Review the [Click API 101 Auth Guide](https://developers.docusign.com/docs/click-api/click101/auth) for more details. - 1. **Create clickwraps.** [Source.](./examples/Click/eg001CreateClickwrap.ps1) Creates a clickwrap that you can embed in your website or app. @@ -182,70 +181,65 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/Click/eg005GetClickwrapResponses.ps1) Demonstrates how to get user responses to your clickwrap agreements. -## Prerequisites -1. A DocuSign developer account (email and password) on demo.docusign.net. Create a free account. -1. PowerShell 5 or later - -**Note:** The Quickstart creates and configures a new Integration Key to use in the resulting project. If you later intend to create and customize your own integration and eventually migrate to production using our Go-Live process, you would need to update the Quickstart’s configuration values. - ## Installation -**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to [Running the examples](#running-the-examples). The next step has been automatically performed for you.** -Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. - -## Collect your Integration information - -* Create a [DocuSign developer account](https://account-d.docusign.com/#/username) if you have not yet done so. -* Once you have a DocuSign account created, make a new [**integration key**](https://admindemo.docusign.com/api-integrator-key). -* Add in the following **redirect uri** `http://localhost:8080/authorization-code/callback` -* Find your **API Account Id:** on the same page you used to setup your [**integration key**](https://admindemo.docusign.com/api-integrator-key). -* Update `config/settings.json` with the credentials from DocuSign developer account: - * `IMPERSONATION_USER_GUID` = API Account ID - * `INTEGRATION_KEY_JWT` = Integration Key - * `INTEGRATION_KEY_AUTH_CODE` = Integration Key - * `SECRET_KEY` = Secret Key - * `GATEWAY_ACCOUNT_ID` = Account ID -* **Signer name and email:** Remember to try the DocuSign signing using both a mobile phone and a regular - email client. +### Prerequisites +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip item 1 below as it was automatically performed for you. +1. A free [DocuSign developer account](https://go.docusign.com/o/sandbox/); create one if you don't already have one. +1. A DocuSign app and integration key that is configured for authentication to use either [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) or [JWT Grant](https://developers.docusign.com/platform/auth/jwt/). -## JWT Authentication +This [video](https://www.youtube.com/watch?v=eiRI4fe5HgM) demonstrates how to obtain an integration key. -* create an RSA KeyPair on your **integration key** and copy the **private_key** into the file `config/private.key` and save it. Use JWT authentication if you intend to run a system account integration or to impersonate a different user. -* OPTIONAL: If you intend to use JWT grant authentication, set **Impersonation_user_guid** by using your own **user_account_id** found on the same page used to set your [**integration key**](https://admindemo.docusign.com/api-integrator-key). + To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. -**Note:** Before you can make any API calls using JWT Grant, you must get your user’s consent for your app to impersonate them. To do this, the `impersonation` scope is added when requesting a JSON Web Token. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the **API Username** GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) below for details. -## OAuth Details + For both authentication flows: + + If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback -This launcher is a collection of powershell scripts with an included http listener script. The listener script works on **port 8080** in order to receive the redirect callback from successful authorization with DocuSign servers that include the Authorization code or an access token in the response payload. Confirm that port 8080 is not in use by other applications so that the OAuth mechanism functions properly. - -These OAuth scripts are integrated into the launcher and hardcode the location for the RSA private key in the case of the JWT php scripts. - -Do not delete or change the name of the private.key file located in the config directory as this will cause problems with jwt authentication. - -## Running the examples -You can see the code examples in action by going to opening the extracted Quickstart folder or the code-examples-powershell folder, right-clicking on the **launcher** file, selecting **Run with PowerShell**, selecting **Open** when prompted by the dialog box, and selecting an API when prompted in Windows Powershell. + If you host this launcher on a remote web server, set your redirect URI as: + + {base_url}/authorization-code/callback + + where {base_url} is the URL for the web app. + +1. PowerShell 5 or later -Log in to your DocuSign account using either Authorization Code Grant or using JWT to gain an OAuth token. From there, you can pick the number that corresponds to a setting or feature you wish to try out. -If you make a mistake, simply run the settings option again. Each code example is a standalone file, but can be reached using the launcher.ps1 file. +### Installation steps +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip Step 3 as it was automatically performed for you. -Use the powershell terminal to run the examples. +1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. +1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. +1. To configure the launcher, create a copy of the file config/settings.example.json and save the copy as config/settings.json. + 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/api-integrator-key) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. + 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. + 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. + 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. +**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. +1. Run the launcher: +In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. -The examples have been tested on Windows but can conceivably be used with MacOS and Linux systems. -The source files for each example are located in the `/examples` directory. +### Configure the launcher to use JWT Grant +1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/api-integrator-key) page, under **My Account Information**, copy the **API Username** and save it in config/settings.json as your `IMPERSONATION_USER_GUID`. + 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/api-integrator-key) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. + 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. + 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. + 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. +**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. +1. Run the launcher: +In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Select JSON Web Token when authenticating your account. ### Payments code example -To use the payments code example, first create a test payments gateway in your account. -Follow the instructions in the -[PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) -file. - -Then add the payment gateway id to the code example file. +To use the payments code example, create a test payments gateway in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) +for details. +Then add the payment gateway ID to settings.json. ## License and additional information From 0958c231a74d417bc43073657a32c08e16e8a193 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 16:39:54 -0700 Subject: [PATCH 033/462] fix spacing --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7c89dbd..eba6263 100644 --- a/README.md +++ b/README.md @@ -189,21 +189,21 @@ For more information about the scopes used for obtaining authorization to use th 1. A free [DocuSign developer account](https://go.docusign.com/o/sandbox/); create one if you don't already have one. 1. A DocuSign app and integration key that is configured for authentication to use either [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) or [JWT Grant](https://developers.docusign.com/platform/auth/jwt/). -This [video](https://www.youtube.com/watch?v=eiRI4fe5HgM) demonstrates how to obtain an integration key. + This [video](https://www.youtube.com/watch?v=eiRI4fe5HgM) demonstrates how to obtain an integration key. - To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. + To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the **API Username** GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) below for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the **API Username** GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) below for details. - For both authentication flows: + For both authentication flows: - If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback + If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback - If you host this launcher on a remote web server, set your redirect URI as: + If you host this launcher on a remote web server, set your redirect URI as: - {base_url}/authorization-code/callback - - where {base_url} is the URL for the web app. + {base_url}/authorization-code/callback + + where {base_url} is the URL for the web app. 1. PowerShell 5 or later From 18bf0524e59eb0afaff266df46a4e086ed53d445 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 16:42:41 -0700 Subject: [PATCH 034/462] remove "below" --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eba6263..f85f65c 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,7 @@ For more information about the scopes used for obtaining authorization to use th ## Installation ### Prerequisites -**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip item 1 below as it was automatically performed for you. +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip item 1 as it was automatically performed for you. 1. A free [DocuSign developer account](https://go.docusign.com/o/sandbox/); create one if you don't already have one. 1. A DocuSign app and integration key that is configured for authentication to use either [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) or [JWT Grant](https://developers.docusign.com/platform/auth/jwt/). @@ -209,7 +209,7 @@ For more information about the scopes used for obtaining authorization to use th ### Installation steps -**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip Step 3 as it was automatically performed for you. +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip Step 3 as it was automatically performed for you. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. 1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. From 6e5013bf50aa4dc6499f1a303294b2c880d9b6ec Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 16:45:19 -0700 Subject: [PATCH 035/462] de-bold, add period --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f85f65c..f098007 100644 --- a/README.md +++ b/README.md @@ -193,11 +193,11 @@ For more information about the scopes used for obtaining authorization to use th To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the **API Username** GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) below for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) below for details. For both authentication flows: - If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback + If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback. If you host this launcher on a remote web server, set your redirect URI as: From 3868ff5cc6d75c30ad43ceb26347518eacb5c94e Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 16:56:27 -0700 Subject: [PATCH 036/462] correct Apps and Keys link --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f098007..2b2b54a 100644 --- a/README.md +++ b/README.md @@ -214,7 +214,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. 1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. 1. To configure the launcher, create a copy of the file config/settings.example.json and save the copy as config/settings.json. - 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/api-integrator-key) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. + 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. @@ -224,7 +224,7 @@ In the root folder, right-click the launcher file and select **Run with PowerShe ### Configure the launcher to use JWT Grant -1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/api-integrator-key) page, under **My Account Information**, copy the **API Username** and save it in config/settings.json as your `IMPERSONATION_USER_GUID`. +1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in config/settings.json as your `IMPERSONATION_USER_GUID`. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/api-integrator-key) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. From 25bc1277f6a46e20ea4e67d55ec68374cb1aa132 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 16:58:46 -0700 Subject: [PATCH 037/462] Add space before Note --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2b2b54a..8e0ec56 100644 --- a/README.md +++ b/README.md @@ -217,8 +217,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. - 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. -**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. + 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher: In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. @@ -229,7 +228,7 @@ In the root folder, right-click the launcher file and select **Run with PowerShe 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. -**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. + **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher: In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select JSON Web Token when authenticating your account. From 28e8e3a260dfe7506ec5b0fe722031fbe395d5c2 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 16:59:41 -0700 Subject: [PATCH 038/462] break before Note --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8e0ec56..3afe748 100644 --- a/README.md +++ b/README.md @@ -217,7 +217,8 @@ For more information about the scopes used for obtaining authorization to use th 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. - 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. + 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. +**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher: In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. @@ -227,8 +228,8 @@ In the root folder, right-click the launcher file and select **Run with PowerShe 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/api-integrator-key) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. - 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. - **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. + 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. +**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher: In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select JSON Web Token when authenticating your account. From c9cec36aad0cb28a8d796d6bbb2244c6b2182d0c Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 17:01:00 -0700 Subject: [PATCH 039/462] run the launcher period --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3afe748..8a39f6a 100644 --- a/README.md +++ b/README.md @@ -219,8 +219,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. -1. Run the launcher: -In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Run the launcher. In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. ### Configure the launcher to use JWT Grant @@ -230,8 +229,7 @@ In the root folder, right-click the launcher file and select **Run with PowerShe 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. -1. Run the launcher: -In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Run the launcher. In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select JSON Web Token when authenticating your account. From 69a5062d38d2d505c7257e84e9ee1956f569b7ae Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 17:03:14 -0700 Subject: [PATCH 040/462] fix apps and keys link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a39f6a..fb3f9ff 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,7 @@ For more information about the scopes used for obtaining authorization to use th ### Configure the launcher to use JWT Grant 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in config/settings.json as your `IMPERSONATION_USER_GUID`. - 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/api-integrator-key) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. + 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. From b9fabeaad9f982488ab45c69b5cfb47a16d0a9ed Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 6 Apr 2021 17:11:22 -0700 Subject: [PATCH 041/462] correct payments code example section --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fb3f9ff..712a975 100644 --- a/README.md +++ b/README.md @@ -220,6 +220,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher. In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Select Authorization Code Grant when authenticating your account. ### Configure the launcher to use JWT Grant @@ -237,7 +238,7 @@ For more information about the scopes used for obtaining authorization to use th To use the payments code example, create a test payments gateway in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. -Then add the payment gateway ID to settings.json. +Then save the Gateway Account ID as `GATEWAY_ACCOUNT_ID` in settings.json. ## License and additional information From 88ede4d815b93633438e2cfbf94ef5e67d89b6d4 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 10:34:13 -0700 Subject: [PATCH 042/462] Update PAYMENTS_INSTALLATION --- PAYMENTS_INSTALLATION.md | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 425bf7f..078100a 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -1,24 +1,21 @@ -# Configuring a DocuSign payments gateway +# Configure a DocuSign payments gateway -DocuSign offers built-in connections to multiple payment -gateways. The payments example uses a demo account via the Stripe -gateway service. +DocuSign offers built-in connections to multiple payment gateways. The payments code example uses a developer account via the Stripe gateway service. -## Creating the payments gateway account -1. Login to demo.docusign.net and go to the Admin Tool. -1. On the Integrations / Payments screen, click Stripe. -1. For development, you can skip the Stripe account application - by using the `Skip this account form` link: +## Create a Stripe payment gateway + +1. Select the Stripe button on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. + +1. For development, you can skip the Stripe account application by using the **Skip this account form** link at the top of the page.
+ + ![Skipping the Stripe account form](docs/stripe_skip_account_form_link.png) + + An enabled Stripe payment gateway is now associated with your DocuSign developer account and is shown under **Payment Gateway**. + +1. Configure the code example launcher configuration file with the **Gateway Account ID**. - ![Skipping the Stripe account form](documentation/stripe_skip_account_form_link.png) -1. Next, the Admin Tool will show that an enabled Stripe - payment gateway account has been associated with your - DocuSign Developer account. -1. Configure the example launcher with the gateway account id shown in the Admin tool. ## Additional documentation -See the -[Managing Payment Gateways](https://support.docusign.com/en/guides/managing-payment-gateways) -documentation. - +* [Managing Payment Gateways](https://support.docusign.com/en/guides/managing-payment-gateways) +* [How to send a request for payment](https://developers.docusign.com/docs/esign-rest-api/how-to/request-a-payment) From 63b0c1ba9061b091c5b1890b882f63075fe53cd1 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 10:34:45 -0700 Subject: [PATCH 043/462] Update PAYMENTS_INSTALLATION --- PAYMENTS_INSTALLATION.md | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 425bf7f..078100a 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -1,24 +1,21 @@ -# Configuring a DocuSign payments gateway +# Configure a DocuSign payments gateway -DocuSign offers built-in connections to multiple payment -gateways. The payments example uses a demo account via the Stripe -gateway service. +DocuSign offers built-in connections to multiple payment gateways. The payments code example uses a developer account via the Stripe gateway service. -## Creating the payments gateway account -1. Login to demo.docusign.net and go to the Admin Tool. -1. On the Integrations / Payments screen, click Stripe. -1. For development, you can skip the Stripe account application - by using the `Skip this account form` link: +## Create a Stripe payment gateway + +1. Select the Stripe button on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. + +1. For development, you can skip the Stripe account application by using the **Skip this account form** link at the top of the page.
+ + ![Skipping the Stripe account form](docs/stripe_skip_account_form_link.png) + + An enabled Stripe payment gateway is now associated with your DocuSign developer account and is shown under **Payment Gateway**. + +1. Configure the code example launcher configuration file with the **Gateway Account ID**. - ![Skipping the Stripe account form](documentation/stripe_skip_account_form_link.png) -1. Next, the Admin Tool will show that an enabled Stripe - payment gateway account has been associated with your - DocuSign Developer account. -1. Configure the example launcher with the gateway account id shown in the Admin tool. ## Additional documentation -See the -[Managing Payment Gateways](https://support.docusign.com/en/guides/managing-payment-gateways) -documentation. - +* [Managing Payment Gateways](https://support.docusign.com/en/guides/managing-payment-gateways) +* [How to send a request for payment](https://developers.docusign.com/docs/esign-rest-api/how-to/request-a-payment) From be28924c81d1831bdb9f07ba7cc529fb7b9a52a0 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:08:37 -0700 Subject: [PATCH 044/462] update README --- README.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 712a975..0e22639 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,7 @@ For more information about the scopes used for obtaining authorization to use th ## Installation ### Prerequisites -**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip item 1 as it was automatically performed for you. +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip items 1 and 2 as they were automatically performed for you. 1. A free [DocuSign developer account](https://go.docusign.com/o/sandbox/); create one if you don't already have one. 1. A DocuSign app and integration key that is configured for authentication to use either [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) or [JWT Grant](https://developers.docusign.com/platform/auth/jwt/). @@ -193,7 +193,7 @@ For more information about the scopes used for obtaining authorization to use th To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) below for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) for details. For both authentication flows: @@ -209,36 +209,38 @@ For more information about the scopes used for obtaining authorization to use th ### Installation steps -**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip Step 3 as it was automatically performed for you. +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. 1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. -1. To configure the launcher, create a copy of the file config/settings.example.json and save the copy as config/settings.json. +1. To configure the launcher for [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher. In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. -1. Select Authorization Code Grant when authenticating your account. +1. Select **Authorization Code Grant** when authenticating your account. +1. Select your desired code example. ### Configure the launcher to use JWT Grant -1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in config/settings.json as your `IMPERSONATION_USER_GUID`. +1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. + 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in config/settings.json as your `IMPERSONATION_USER_GUID`. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher. In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. -1. Select JSON Web Token when authenticating your account. +1. Select **JSON Web Token** when authenticating your account. +1. Select your desired code example. ### Payments code example -To use the payments code example, create a test payments gateway in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) -for details. +To use the payments code example, create a test payments gateway in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. -Then save the Gateway Account ID as `GATEWAY_ACCOUNT_ID` in settings.json. +Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. ## License and additional information From 99639eedf22cebcb881b162bb92f976343bece5c Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:16:02 -0700 Subject: [PATCH 045/462] bolded "launcher" file --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0e22639..fd88e01 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. -1. Run the launcher. In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select **Authorization Code Grant** when authenticating your account. 1. Select your desired code example. @@ -232,7 +232,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. -1. Run the launcher. In the root folder, right-click the launcher file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select **JSON Web Token** when authenticating your account. 1. Select your desired code example. From a68a742dbc24557cbbcb328bb1c24a324fa6578c Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:17:49 -0700 Subject: [PATCH 046/462] delete 1 instance of "config" --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fd88e01..1afaf4a 100644 --- a/README.md +++ b/README.md @@ -226,7 +226,7 @@ For more information about the scopes used for obtaining authorization to use th ### Configure the launcher to use JWT Grant 1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. - 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in config/settings.json as your `IMPERSONATION_USER_GUID`. + 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in settings.json as your `IMPERSONATION_USER_GUID`. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. From 40e0e2f44a9c0e40f2699409fe6c712ba1e43bb4 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:24:25 -0700 Subject: [PATCH 047/462] add Payments link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1afaf4a..8dac96d 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,7 @@ For more information about the scopes used for obtaining authorization to use th ### Payments code example -To use the payments code example, create a test payments gateway in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. +To use the payments code example, create a test payments gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. From f17b5b3d736fc74ad3001d8d9073174d0ea4234e Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:39:33 -0700 Subject: [PATCH 048/462] add stripe image --- stripe_skip_account_form_link.png | Bin 0 -> 34547 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 stripe_skip_account_form_link.png diff --git a/stripe_skip_account_form_link.png b/stripe_skip_account_form_link.png new file mode 100644 index 0000000000000000000000000000000000000000..766a12a2a6d4523466183fed4beee3c71dd5dd00 GIT binary patch literal 34547 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 XvQawlc*Exz@~14X0jiL-`1t<-LJ*I! literal 0 HcmV?d00001 From a8fc5773d9d9a4e87214bfdbdf0568a46f0faef8 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:41:02 -0700 Subject: [PATCH 049/462] delete file --- stripe_skip_account_form_link.png | Bin 34547 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 stripe_skip_account_form_link.png diff --git a/stripe_skip_account_form_link.png b/stripe_skip_account_form_link.png deleted file mode 100644 index 766a12a2a6d4523466183fed4beee3c71dd5dd00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34547 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 XvQawlc*Exz@~14X0jiL-`1t<-LJ*I! From b2b960af84d535092b7cfcf291ccc3e3af0f5e52 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:42:09 -0700 Subject: [PATCH 050/462] create docs folder --- docs/stripe_skip_account_form_link | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/stripe_skip_account_form_link diff --git a/docs/stripe_skip_account_form_link b/docs/stripe_skip_account_form_link new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/stripe_skip_account_form_link @@ -0,0 +1 @@ + From a8145c10b31e6eefa4281b1756e8c8181cb0e3ca Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:42:27 -0700 Subject: [PATCH 051/462] add stripe image --- docs/stripe_skip_account_form_link.png | Bin 0 -> 34547 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/stripe_skip_account_form_link.png diff --git a/docs/stripe_skip_account_form_link.png b/docs/stripe_skip_account_form_link.png new file mode 100644 index 0000000000000000000000000000000000000000..766a12a2a6d4523466183fed4beee3c71dd5dd00 GIT binary patch literal 34547 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 XvQawlc*Exz@~14X0jiL-`1t<-LJ*I! literal 0 HcmV?d00001 From 24730b257f2a9a5ec028e04fd17ed13ff19c1964 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:42:44 -0700 Subject: [PATCH 052/462] delete file --- docs/stripe_skip_account_form_link | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/stripe_skip_account_form_link diff --git a/docs/stripe_skip_account_form_link b/docs/stripe_skip_account_form_link deleted file mode 100644 index 8b13789..0000000 --- a/docs/stripe_skip_account_form_link +++ /dev/null @@ -1 +0,0 @@ - From 3daa14fbcfb6875d747522ded4cebcf53077e20a Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:43:09 -0700 Subject: [PATCH 053/462] create docs folder --- docs/stripe | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/stripe diff --git a/docs/stripe b/docs/stripe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/stripe @@ -0,0 +1 @@ + From dc7802f655ec7c03c5f03a3d210f3ccf82463575 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:43:27 -0700 Subject: [PATCH 054/462] add stripe image --- docs/stripe_skip_account_form_link.png | Bin 0 -> 34547 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/stripe_skip_account_form_link.png diff --git a/docs/stripe_skip_account_form_link.png b/docs/stripe_skip_account_form_link.png new file mode 100644 index 0000000000000000000000000000000000000000..766a12a2a6d4523466183fed4beee3c71dd5dd00 GIT binary patch literal 34547 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 XvQawlc*Exz@~14X0jiL-`1t<-LJ*I! literal 0 HcmV?d00001 From 44ad10f726ab2e775a288dd55bcf7cb7e5a0a000 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:43:43 -0700 Subject: [PATCH 055/462] delete stripe --- docs/stripe | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/stripe diff --git a/docs/stripe b/docs/stripe deleted file mode 100644 index 8b13789..0000000 --- a/docs/stripe +++ /dev/null @@ -1 +0,0 @@ - From cdd3cf3dec908277f18723ef22d507dce34efc41 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 11:46:58 -0700 Subject: [PATCH 056/462] make payment singular --- PAYMENTS_INSTALLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 078100a..0c1d766 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -1,4 +1,4 @@ -# Configure a DocuSign payments gateway +# Configure a DocuSign payment gateway DocuSign offers built-in connections to multiple payment gateways. The payments code example uses a developer account via the Stripe gateway service. From e00999c144ecc6c250fe42b30284f3b716ccd4c7 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:27:50 -0700 Subject: [PATCH 057/462] Synced with private README --- README.md | 90 ++++++++++++++++++++++++++----------------------------- 1 file changed, 43 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 7bbe6c8..5289d17 100644 --- a/README.md +++ b/README.md @@ -182,70 +182,66 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/Click/eg005GetClickwrapResponses.ps1) Demonstrates how to get user responses to your clickwrap agreements. -## Prerequisites -1. A DocuSign developer account (email and password) on demo.docusign.net. Create a free account. -1. PowerShell 5 or later - -**Note:** The Quickstart creates and configures a new Integration Key to use in the resulting project. If you later intend to create and customize your own integration and eventually migrate to production using our Go-Live process, you would need to update the Quickstart’s configuration values. - ## Installation -**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to [Running the examples](#running-the-examples). The next step has been automatically performed for you.** -Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. - -## Collect your Integration information - -* Create a [DocuSign developer account](https://account-d.docusign.com/#/username) if you have not yet done so. -* Once you have a DocuSign account created, make a new [**integration key**](https://admindemo.docusign.com/api-integrator-key). -* Add in the following **redirect uri** `http://localhost:8080/authorization-code/callback` -* Find your **API Account Id:** on the same page you used to setup your [**integration key**](https://admindemo.docusign.com/api-integrator-key). -* Update `config/settings.json` with the credentials from DocuSign developer account: - * `IMPERSONATION_USER_GUID` = API Account ID - * `INTEGRATION_KEY_JWT` = Integration Key - * `INTEGRATION_KEY_AUTH_CODE` = Integration Key - * `SECRET_KEY` = Secret Key - * `GATEWAY_ACCOUNT_ID` = Account ID -* **Signer name and email:** Remember to try the DocuSign signing using both a mobile phone and a regular - email client. +### Prerequisites +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip items 1 and 2 as they were automatically performed for you. +1. A free [DocuSign developer account](https://go.docusign.com/o/sandbox/); create one if you don't already have one. +1. A DocuSign app and integration key that is configured for authentication to use either [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) or [JWT Grant](https://developers.docusign.com/platform/auth/jwt/). -## JWT Authentication + This [video](https://www.youtube.com/watch?v=eiRI4fe5HgM) demonstrates how to obtain an integration key. -* create an RSA KeyPair on your **integration key** and copy the **private_key** into the file `config/private.key` and save it. Use JWT authentication if you intend to run a system account integration or to impersonate a different user. -* OPTIONAL: If you intend to use JWT grant authentication, set **Impersonation_user_guid** by using your own **user_account_id** found on the same page used to set your [**integration key**](https://admindemo.docusign.com/api-integrator-key). + To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. -**Note:** Before you can make any API calls using JWT Grant, you must get your user’s consent for your app to impersonate them. To do this, the `impersonation` scope is added when requesting a JSON Web Token. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) for details. -## OAuth Details + For both authentication flows: + + If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback. -This launcher is a collection of powershell scripts with an included http listener script. The listener script works on **port 8080** in order to receive the redirect callback from successful authorization with DocuSign servers that include the Authorization code or an access token in the response payload. Confirm that port 8080 is not in use by other applications so that the OAuth mechanism functions properly. - -These OAuth scripts are integrated into the launcher and hardcode the location for the RSA private key in the case of the JWT php scripts. - -Do not delete or change the name of the private.key file located in the config directory as this will cause problems with jwt authentication. - -## Running the examples -You can see the code examples in action by going to opening the extracted Quickstart folder or the code-examples-powershell folder, right-clicking on the **launcher** file, selecting **Run with PowerShell**, selecting **Open** when prompted by the dialog box, and selecting an API when prompted in Windows Powershell. + If you host this launcher on a remote web server, set your redirect URI as: + + {base_url}/authorization-code/callback + + where {base_url} is the URL for the web app. + +1. PowerShell 5 or later -Log in to your DocuSign account using either Authorization Code Grant or using JWT to gain an OAuth token. From there, you can pick the number that corresponds to a setting or feature you wish to try out. -If you make a mistake, simply run the settings option again. Each code example is a standalone file, but can be reached using the launcher.ps1 file. +### Installation steps +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. -Use the powershell terminal to run the examples. +1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. +1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. +1. To configure the launcher for [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. + 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. + 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. + 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. + 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. +**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Select **Authorization Code Grant** when authenticating your account. +1. Select your desired code example. -The examples have been tested on Windows but can conceivably be used with MacOS and Linux systems. -The source files for each example are located in the `/examples` directory. +### Configure the launcher to use JWT Grant +1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. + 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in settings.json as your `IMPERSONATION_USER_GUID`. + 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. + 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. + 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. + 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. +**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Select **JSON Web Token** when authenticating your account. +1. Select your desired code example. ### Payments code example -To use the payments code example, first create a test payments gateway in your account. -Follow the instructions in the -[PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) -file. - -Then add the payment gateway id to the code example file. +To use the payments code example, create a test payments gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. +Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. ## License and additional information From 8b023aa7339fa9eff15bc8658920c73a114adec9 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:33:56 -0700 Subject: [PATCH 058/462] add address --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5289d17..ee7c8bd 100644 --- a/README.md +++ b/README.md @@ -231,7 +231,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. - 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. + 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select **JSON Web Token** when authenticating your account. From 1d9eee828048863a48da4487ed670f0a56008083 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:34:52 -0700 Subject: [PATCH 059/462] add address twice --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8dac96d..7cb8755 100644 --- a/README.md +++ b/README.md @@ -217,7 +217,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. - 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. + 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select **Authorization Code Grant** when authenticating your account. @@ -230,7 +230,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. - 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. + 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select **JSON Web Token** when authenticating your account. From 9f9824f4d428f575735fff1999840909e8126b94 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:35:16 -0700 Subject: [PATCH 060/462] add another address --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee7c8bd..c7b7b2b 100644 --- a/README.md +++ b/README.md @@ -218,7 +218,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. - 1. Set a name and email for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. + 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. 1. Select **Authorization Code Grant** when authenticating your account. From a8c1d47c0fd48f43e21c7782086989a8db76548f Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:37:53 -0700 Subject: [PATCH 061/462] add GUID --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7cb8755..7bb38c7 100644 --- a/README.md +++ b/README.md @@ -226,7 +226,7 @@ For more information about the scopes used for obtaining authorization to use th ### Configure the launcher to use JWT Grant 1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. - 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in settings.json as your `IMPERSONATION_USER_GUID`. + 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** GUID and save it in settings.json as your `IMPERSONATION_USER_GUID`. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. From 05ff8171db0995b4f3da4f09656d6d6d11d916e1 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:38:17 -0700 Subject: [PATCH 062/462] add guid --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c7b7b2b..5832972 100644 --- a/README.md +++ b/README.md @@ -227,7 +227,7 @@ For more information about the scopes used for obtaining authorization to use th ### Configure the launcher to use JWT Grant 1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. - 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** and save it in settings.json as your `IMPERSONATION_USER_GUID`. + 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** GUID and save it in settings.json as your `IMPERSONATION_USER_GUID`. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. From 29799d469e17890c9abc8069e265815649c4c58d Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:43:03 -0700 Subject: [PATCH 063/462] singular payment gateway --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5832972..1db8f7d 100644 --- a/README.md +++ b/README.md @@ -239,7 +239,7 @@ For more information about the scopes used for obtaining authorization to use th ### Payments code example -To use the payments code example, create a test payments gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. +To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. From f4b174e4f85a58106e8a91c34edaaf2c446e1a34 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:43:46 -0700 Subject: [PATCH 064/462] singular payment gateway --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7bb38c7..67d4450 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,7 @@ For more information about the scopes used for obtaining authorization to use th ### Payments code example -To use the payments code example, create a test payments gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. +To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. From 021630c31acd0f6d45804a0b2496e84b52902186 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:47:50 -0700 Subject: [PATCH 065/462] lowercase payment gateway --- PAYMENTS_INSTALLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 078100a..997b90a 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -1,4 +1,4 @@ -# Configure a DocuSign payments gateway +# Configure a payment gateway DocuSign offers built-in connections to multiple payment gateways. The payments code example uses a developer account via the Stripe gateway service. From b33ac5ceb5cf1378abafc9c900f57484efac7b72 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:49:37 -0700 Subject: [PATCH 066/462] remove DS --- PAYMENTS_INSTALLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 0c1d766..997b90a 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -1,4 +1,4 @@ -# Configure a DocuSign payment gateway +# Configure a payment gateway DocuSign offers built-in connections to multiple payment gateways. The payments code example uses a developer account via the Stripe gateway service. From 049f9616da26b77125002fb93d27d24ae0dae322 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:55:55 -0700 Subject: [PATCH 067/462] Configure a payment gateway --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 67d4450..e2aede2 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,7 @@ For more information about the scopes used for obtaining authorization to use th ### Payments code example -To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. +To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [Configure a payment gateway](./PAYMENTS_INSTALLATION.md) for details. Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. From 5e54aaa9f41f7d1b8f0b66b42fee60c86bf74410 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 13:56:18 -0700 Subject: [PATCH 068/462] Configure a payment gateway --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1db8f7d..38808e4 100644 --- a/README.md +++ b/README.md @@ -239,7 +239,7 @@ For more information about the scopes used for obtaining authorization to use th ### Payments code example -To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) for details. +To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [Configure a payment gateway](./PAYMENTS_INSTALLATION.md) for details. Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. From e6ee07e3c239f05fe5fd088e658d7a45625e8c70 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 14:01:14 -0700 Subject: [PATCH 069/462] edit step 3 --- PAYMENTS_INSTALLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 997b90a..6531b12 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -13,7 +13,7 @@ DocuSign offers built-in connections to multiple payment gateways. The payments An enabled Stripe payment gateway is now associated with your DocuSign developer account and is shown under **Payment Gateway**. -1. Configure the code example launcher configuration file with the **Gateway Account ID**. +1. Save the **Gateway Account ID** GUID to the code example launcher configuration file. ## Additional documentation From b62a1da4acb80ead53efb901303d99532c2c584c Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 14:01:39 -0700 Subject: [PATCH 070/462] edit step 3 --- PAYMENTS_INSTALLATION.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 997b90a..d575c2c 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -11,9 +11,9 @@ DocuSign offers built-in connections to multiple payment gateways. The payments ![Skipping the Stripe account form](docs/stripe_skip_account_form_link.png) - An enabled Stripe payment gateway is now associated with your DocuSign developer account and is shown under **Payment Gateway**. + An enabled Stripe payment gateway is now associated with your DocuSign developer account and is shown under **Payment Gateway**. -1. Configure the code example launcher configuration file with the **Gateway Account ID**. +1. Save the **Gateway Account ID** GUID to the code example launcher configuration file. ## Additional documentation From 2d9602cdbb04cb4dac1e6e44f2c8b86792516e28 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 14:02:51 -0700 Subject: [PATCH 071/462] to --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e2aede2..20448bd 100644 --- a/README.md +++ b/README.md @@ -240,7 +240,7 @@ For more information about the scopes used for obtaining authorization to use th ### Payments code example To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [Configure a payment gateway](./PAYMENTS_INSTALLATION.md) for details. -Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. +Once you've created a payment gateway, save the **Gateway Account ID** GUID to settings.json. ## License and additional information From 39c1d190d84c753a0a5436ea5a3075fdfe105e4e Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 14:03:12 -0700 Subject: [PATCH 072/462] to --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 38808e4..69339e6 100644 --- a/README.md +++ b/README.md @@ -241,7 +241,7 @@ For more information about the scopes used for obtaining authorization to use th ### Payments code example To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [Configure a payment gateway](./PAYMENTS_INSTALLATION.md) for details. -Once you've created a payment gateway, save the **Gateway Account ID** GUID in settings.json. +Once you've created a payment gateway, save the **Gateway Account ID** GUID to settings.json. ## License and additional information From 6f3e3bd6c3d8e341d8a7a35a633340b2c9b9a852 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 15:17:10 -0700 Subject: [PATCH 073/462] removed colon --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20448bd..ec1003f 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,7 @@ For more information about the scopes used for obtaining authorization to use th If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback. - If you host this launcher on a remote web server, set your redirect URI as: + If you host this launcher on a remote web server, set your redirect URI as {base_url}/authorization-code/callback From 12299e0e4535976c101087137ab54bb6a29c80a3 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 8 Apr 2021 15:28:32 -0700 Subject: [PATCH 074/462] split out Select an API step --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ec1003f..547e4de 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,8 @@ For more information about the scopes used for obtaining authorization to use th 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. -1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**. +1. Select an API when prompted in Windows PowerShell. 1. Select **Authorization Code Grant** when authenticating your account. 1. Select your desired code example. @@ -232,7 +233,8 @@ For more information about the scopes used for obtaining authorization to use th 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. -1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open** +1. Select an API when prompted in Windows PowerShell. 1. Select **JSON Web Token** when authenticating your account. 1. Select your desired code example. From 7e059ecf5361b402f5d6872d309dc6cdd164fff3 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:43:28 -0700 Subject: [PATCH 075/462] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 547e4de..6a8f77c 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,7 @@ For more information about the scopes used for obtaining authorization to use th To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant Authentication](#installation-steps-for-jwt- grant-authentication) for details. For both authentication flows: @@ -225,7 +225,11 @@ For more information about the scopes used for obtaining authorization to use th 1. Select your desired code example. -### Configure the launcher to use JWT Grant +### Installation steps for JWT Grant Authentication +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. + +1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. +1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. 1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** GUID and save it in settings.json as your `IMPERSONATION_USER_GUID`. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. From 33d504c4a7bc38700afb155e573c6582103f943d Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:45:09 -0700 Subject: [PATCH 076/462] delete space --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a8f77c..aef783e 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,7 @@ For more information about the scopes used for obtaining authorization to use th To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant Authentication](#installation-steps-for-jwt- grant-authentication) for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant Authentication](#installation-steps-for-jwt-grant-authentication) for details. For both authentication flows: From 911fba3214bc58649e72bcb33eda78e652ec6cfa Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:46:48 -0700 Subject: [PATCH 077/462] add line break --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index aef783e..11eadd6 100644 --- a/README.md +++ b/README.md @@ -197,7 +197,9 @@ For more information about the scopes used for obtaining authorization to use th For both authentication flows: - If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback. + If you use this launcher on your own workstation, the integration key must include a redirect URI of + +http://localhost:8080/authorization-code/callback. If you host this launcher on a remote web server, set your redirect URI as From 78ad893b22e9f07c900830e8c6d29e512b1d01c0 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:47:27 -0700 Subject: [PATCH 078/462] fix line break --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 11eadd6..01a1b27 100644 --- a/README.md +++ b/README.md @@ -197,9 +197,9 @@ For more information about the scopes used for obtaining authorization to use th For both authentication flows: - If you use this launcher on your own workstation, the integration key must include a redirect URI of + If you use this launcher on your own workstation, the integration key must include a redirect URI of -http://localhost:8080/authorization-code/callback. + http://localhost:8080/authorization-code/callback. If you host this launcher on a remote web server, set your redirect URI as From a7f757a6ba3e9d159950b12a89043d87d5340681 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:48:07 -0700 Subject: [PATCH 079/462] delete period --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 01a1b27..841179e 100644 --- a/README.md +++ b/README.md @@ -199,7 +199,7 @@ For more information about the scopes used for obtaining authorization to use th If you use this launcher on your own workstation, the integration key must include a redirect URI of - http://localhost:8080/authorization-code/callback. + http://localhost:8080/authorization-code/callback If you host this launcher on a remote web server, set your redirect URI as From ba0b78c4b1136bf826d2babbd75f7c42a3fef86c Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:52:43 -0700 Subject: [PATCH 080/462] Update README.md --- README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 69339e6..3c4a7db 100644 --- a/README.md +++ b/README.md @@ -194,13 +194,15 @@ For more information about the scopes used for obtaining authorization to use th To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Configure the launcher to use JWT Grant](#configure-the-launcher-to-use-jwt-grant) for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant Authentication](#installation-steps-for-jwt-grant-authentication) for details. For both authentication flows: - If you use this launcher on your own workstation, the integration key must include a redirect URI of http://localhost:8080/authorization-code/callback. + If you use this launcher on your own workstation, the integration key must include a redirect URI of - If you host this launcher on a remote web server, set your redirect URI as: + http://localhost:8080/authorization-code/callback + + If you host this launcher on a remote web server, set your redirect URI as {base_url}/authorization-code/callback @@ -220,12 +222,17 @@ For more information about the scopes used for obtaining authorization to use th 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. -1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**. +1. Select an API when prompted in Windows PowerShell. 1. Select **Authorization Code Grant** when authenticating your account. 1. Select your desired code example. -### Configure the launcher to use JWT Grant +### Installation steps for JWT Grant Authentication +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. + +1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. +1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. 1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** GUID and save it in settings.json as your `IMPERSONATION_USER_GUID`. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. @@ -233,7 +240,8 @@ For more information about the scopes used for obtaining authorization to use th 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. -1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**; then select an API when prompted in Windows PowerShell. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open** +1. Select an API when prompted in Windows PowerShell. 1. Select **JSON Web Token** when authenticating your account. 1. Select your desired code example. From ab9139b57bd5acdeb1b50656ff43993ccb4cecd6 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:57:09 -0700 Subject: [PATCH 081/462] lower case authentication, Payments code example underline --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3c4a7db..3af73cb 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ For more information about the scopes used for obtaining authorization to use th To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant Authentication](#installation-steps-for-jwt-grant-authentication) for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant authentication](#installation-steps-for-jwt-grant-authentication) for details. For both authentication flows: @@ -228,7 +228,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Select your desired code example. -### Installation steps for JWT Grant Authentication +### Installation steps for JWT Grant authentication **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. @@ -246,7 +246,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Select your desired code example. -### Payments code example +## Payments code example To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [Configure a payment gateway](./PAYMENTS_INSTALLATION.md) for details. Once you've created a payment gateway, save the **Gateway Account ID** GUID to settings.json. From 00f9aa9bf581494662870250f6203741325360c4 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 11:59:48 -0700 Subject: [PATCH 082/462] sync with public --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 841179e..0bd4a0a 100644 --- a/README.md +++ b/README.md @@ -193,7 +193,7 @@ For more information about the scopes used for obtaining authorization to use th To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant Authentication](#installation-steps-for-jwt-grant-authentication) for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant authentication](#installation-steps-for-jwt-grant-authentication) for details. For both authentication flows: @@ -227,7 +227,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Select your desired code example. -### Installation steps for JWT Grant Authentication +### Installation steps for JWT Grant authentication **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. @@ -245,7 +245,7 @@ For more information about the scopes used for obtaining authorization to use th 1. Select your desired code example. -### Payments code example +## Payments code example To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [Configure a payment gateway](./PAYMENTS_INSTALLATION.md) for details. Once you've created a payment gateway, save the **Gateway Account ID** GUID to settings.json. From fb46bfae44a63f0d1d6da7dec45260884ac6458d Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:13:02 -0700 Subject: [PATCH 083/462] format PowerShell --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bd4a0a..da87808 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # DocuSign PowerShell Code Examples ## Introduction -This repo includes a powershell command-line application to demonstrate: +This repo includes a PowerShell command-line application to demonstrate: ## eSignature API From 692e601727f58bbe75a055428f56b361caa5a135 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 12 Apr 2021 13:21:31 -0700 Subject: [PATCH 084/462] add license link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index da87808..ce40daf 100644 --- a/README.md +++ b/README.md @@ -254,7 +254,7 @@ Once you've created a payment gateway, save the **Gateway Account ID** GUID to s ## License and additional information ### License -This repository uses the MIT License. See the LICENSE file for more information. +This repository uses the MIT License. See [LICENSE](./LICENSE) for details. ### Pull Requests Pull requests are welcomed. Pull requests will only be considered if their content From 95a0a7e290d22f6aed878b35778616e93ef98851 Mon Sep 17 00:00:00 2001 From: Aaron JacksonWilde Date: Wed, 14 Apr 2021 19:20:35 -0700 Subject: [PATCH 085/462] apply timestamp fix from public PR and other minor fixes --- OAuth/jwt.ps1 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index a202fbf..112e352 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -13,10 +13,12 @@ Install-NugetPackage PemUtils '3.0.0.82' New-Item "config\ds_access_token.txt" -Force -if (!(test-path "..\config\private.key")){ + +if (!(test-path ".\config\private.key")){ Write-Error "`n Error: First create an RSA keypair on your integration key and copy the private_key into the file `config/private.key` and save it" -ErrorAction Stop exit 1 } + $privateKeyPath = [System.IO.Path]::Combine($PSScriptRoot, "..\config\private.key") | Resolve-Path $outputFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\ds_access_token.txt") | Resolve-Path $accountIdFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\API_ACCOUNT_ID") @@ -25,7 +27,7 @@ $accountIdFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\API_ACCOUNT $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json $userId = $variables.IMPERSONATION_USER_GUID $INTEGRATION_KEY_JWT = $variables.INTEGRATION_KEY_JWT -$timestamp = [int][double]::Parse((Get-Date -UFormat %s)) +$timestamp = [int][double]::Parse((Get-Date (Get-Date).ToUniversalTime() -UFormat %s)) if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation%20dtr.rooms.read%20dtr.rooms.write%20dtr.documents.read%20dtr.documents.write%20dtr.profile.read%20dtr.profile.write%20dtr.company.read%20dtr.company.write%20room_forms" @@ -35,7 +37,7 @@ if ($apiVersion -eq "rooms") { $scopes = "click.manage" } elseif ($apiVersion -eq "monitor") { - $scopes = "signature impersonation" + $scopes = "signature%20impersonation" } # Step 1. Request application consent @@ -95,7 +97,7 @@ while ($http.IsListening) { $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) # Stream HTML to browser $context.Response.OutputStream.Close() # Close the response - Start-Sleep 10 + Start-Sleep 4 $http.Stop() } } @@ -147,6 +149,7 @@ try { $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $tokenResponse = Invoke-WebRequest ` -Uri "$authorizationEndpoint/token" ` + -UseBasicParsing ` -Method "POST" ` -Body "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$jwtToken" $accessToken = ($tokenResponse | ConvertFrom-Json).access_token @@ -156,6 +159,7 @@ try { Write-Output "Getting an account id..." $userInfoResponse = Invoke-RestMethod ` -Uri "$authorizationEndpoint/userinfo" ` + -UseBasicParsing ` -Method "GET" ` -Headers @{ "Authorization" = "Bearer $accessToken" } $accountId = $userInfoResponse.accounts[0].account_id @@ -165,4 +169,4 @@ try { } catch { Write-Error $_ -} +} \ No newline at end of file From 885244456f563ae75f5d0dc19ccae2daaaacb045 Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Wed, 14 Apr 2021 19:33:56 -0700 Subject: [PATCH 086/462] Update settings.example.json needed for quickstart to populate the jwt required variable --- config/settings.example.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/settings.example.json b/config/settings.example.json index 1a51074..11245f3 100644 --- a/config/settings.example.json +++ b/config/settings.example.json @@ -6,9 +6,9 @@ "SIGNER_NOT_CHECKED_EMAIL": "{SIGNER_NOT_CHECKED_EMAIL}", "CC_EMAIL": "{CC_EMAIL}", "CC_NAME": "{CC_NAME}", - "IMPERSONATION_USER_GUID": "{IMPERSONATED_USER_GUID}", + "IMPERSONATION_USER_GUID": "{IMPERSONATED_USER_ID}", "INTEGRATION_KEY_JWT": "{INTEGRATION_KEY_JWT}", "INTEGRATION_KEY_AUTH_CODE": "{INTEGRATION_KEY_AUTH_CODE}", "SECRET_KEY": "{SECRET_KEY}", "GATEWAY_ACCOUNT_ID": "{DS_PAYMENT_GATEWAY_ID}" -} \ No newline at end of file +} From 97083e6920d5bb9e3fe283b303b8f7ced3afb37f Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 15 Apr 2021 15:44:11 -0700 Subject: [PATCH 087/462] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b03b99a..0772ccd 100644 --- a/README.md +++ b/README.md @@ -184,13 +184,14 @@ For more information about the scopes used for obtaining authorization to use th ## Monitor API -For more information about the scopes used for obtaining authorization to use the Monitor API, see the [Required Scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/) +**Note:** To use the Monitor API you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). -**Note:** to use the Monitor API you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). +For more information about the scopes used for obtaining authorization to use the Monitor API, see the [Required Scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). 1. **Get Monitoring Data.** [Source.](./examples/Monitor/eg001GetMonitoringData.ps1) - This example get and display all of your organization’s monitoring data. + + Demonstrates how to get and display all of your organization’s monitoring data. ## Installation From cc16c199fafa8ba94ebcd7cb0b09b1726e940b7d Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 15 Apr 2021 15:44:55 -0700 Subject: [PATCH 088/462] Monitor API - JWT only --- launcher.ps1 | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index 5482894..0e72345 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -74,14 +74,20 @@ function startAuth ($apiVersion) { } $AuthTypeView = $null; - do { - Write-Output "" - Write-Output 'Choose an OAuth Strategy: ' - Write-Output "$([int][AuthType]::CodeGrant)) Authorization Code Grant" - Write-Output "$([int][AuthType]::JWT)) Json Web Token" - Write-Output "$([int][AuthType]::Exit)) Exit" - [int]$AuthTypeView = Read-Host "Select an OAuth method to Authenticate with your DocuSign account" - } while (-not [AuthType]::IsDefined([AuthType], $AuthTypeView)); + if ($apiVersion -eq "monitor") + { + $AuthTypeView = [AuthType]::JWT; # Monitor API only supports JWT + } + else { + do { + Write-Output "" + Write-Output 'Choose an OAuth Strategy: ' + Write-Output "$([int][AuthType]::CodeGrant)) Authorization Code Grant" + Write-Output "$([int][AuthType]::JWT)) Json Web Token (JWT)" + Write-Output "$([int][AuthType]::Exit)) Exit" + [int]$AuthTypeView = Read-Host "Select an OAuth method to Authenticate with your DocuSign account" + } while (-not [AuthType]::IsDefined([AuthType], $AuthTypeView)); + } if ($AuthTypeView -eq [AuthType]::Exit) { startLauncher From a4e96758c55d1c3654b2b8974d809f7df0c11348 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 16 Apr 2021 10:36:44 -0700 Subject: [PATCH 089/462] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0772ccd..6eb69aa 100644 --- a/README.md +++ b/README.md @@ -186,7 +186,7 @@ For more information about the scopes used for obtaining authorization to use th **Note:** To use the Monitor API you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). -For more information about the scopes used for obtaining authorization to use the Monitor API, see the [Required Scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). +For more information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). 1. **Get Monitoring Data.** [Source.](./examples/Monitor/eg001GetMonitoringData.ps1) From 7b17f01b1ca1f2b2d58dad888fa861c41c13aa20 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 16 Apr 2021 10:43:51 -0700 Subject: [PATCH 090/462] Adding Monitor API --- OAuth/code_grant.ps1 | 3 + OAuth/jwt.ps1 | 19 +++++-- PAYMENTS_INSTALLATION.md | 33 +++++------ README.md | 107 +++++++++++++++++++++-------------- config/settings.example.json | 4 +- launcher.ps1 | 54 +++++++++++++++--- 6 files changed, 144 insertions(+), 76 deletions(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 7a63b45..d71a184 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -23,6 +23,9 @@ elseif ($apiVersion -eq "eSignature") { elseif ($apiVersion -eq "click") { $scopes = "click.manage" } +elseif ($apiVersion -eq "monitor") { + $scopes = "signature impersonation" +} $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $redirectUri = "http://${IP}:${PORT}/authorization-code/callback" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 79de04e..112e352 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -13,6 +13,12 @@ Install-NugetPackage PemUtils '3.0.0.82' New-Item "config\ds_access_token.txt" -Force + +if (!(test-path ".\config\private.key")){ + Write-Error "`n Error: First create an RSA keypair on your integration key and copy the private_key into the file `config/private.key` and save it" -ErrorAction Stop + exit 1 +} + $privateKeyPath = [System.IO.Path]::Combine($PSScriptRoot, "..\config\private.key") | Resolve-Path $outputFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\ds_access_token.txt") | Resolve-Path $accountIdFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\API_ACCOUNT_ID") @@ -21,7 +27,7 @@ $accountIdFile = [System.IO.Path]::Combine($PSScriptRoot, "..\config\API_ACCOUNT $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json $userId = $variables.IMPERSONATION_USER_GUID $INTEGRATION_KEY_JWT = $variables.INTEGRATION_KEY_JWT -$timestamp = [int][double]::Parse((Get-Date -UFormat %s)) +$timestamp = [int][double]::Parse((Get-Date (Get-Date).ToUniversalTime() -UFormat %s)) if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation%20dtr.rooms.read%20dtr.rooms.write%20dtr.documents.read%20dtr.documents.write%20dtr.profile.read%20dtr.profile.write%20dtr.company.read%20dtr.company.write%20room_forms" @@ -29,7 +35,10 @@ if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "click") { $scopes = "click.manage" -} + } + elseif ($apiVersion -eq "monitor") { + $scopes = "signature%20impersonation" + } # Step 1. Request application consent $PORT = '8080' @@ -88,7 +97,7 @@ while ($http.IsListening) { $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) # Stream HTML to browser $context.Response.OutputStream.Close() # Close the response - Start-Sleep 10 + Start-Sleep 4 $http.Stop() } } @@ -140,6 +149,7 @@ try { $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $tokenResponse = Invoke-WebRequest ` -Uri "$authorizationEndpoint/token" ` + -UseBasicParsing ` -Method "POST" ` -Body "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$jwtToken" $accessToken = ($tokenResponse | ConvertFrom-Json).access_token @@ -149,6 +159,7 @@ try { Write-Output "Getting an account id..." $userInfoResponse = Invoke-RestMethod ` -Uri "$authorizationEndpoint/userinfo" ` + -UseBasicParsing ` -Method "GET" ` -Headers @{ "Authorization" = "Bearer $accessToken" } $accountId = $userInfoResponse.accounts[0].account_id @@ -158,4 +169,4 @@ try { } catch { Write-Error $_ -} +} \ No newline at end of file diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 425bf7f..6531b12 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -1,24 +1,21 @@ -# Configuring a DocuSign payments gateway +# Configure a payment gateway -DocuSign offers built-in connections to multiple payment -gateways. The payments example uses a demo account via the Stripe -gateway service. +DocuSign offers built-in connections to multiple payment gateways. The payments code example uses a developer account via the Stripe gateway service. -## Creating the payments gateway account -1. Login to demo.docusign.net and go to the Admin Tool. -1. On the Integrations / Payments screen, click Stripe. -1. For development, you can skip the Stripe account application - by using the `Skip this account form` link: +## Create a Stripe payment gateway + +1. Select the Stripe button on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. + +1. For development, you can skip the Stripe account application by using the **Skip this account form** link at the top of the page.
+ + ![Skipping the Stripe account form](docs/stripe_skip_account_form_link.png) + + An enabled Stripe payment gateway is now associated with your DocuSign developer account and is shown under **Payment Gateway**. + +1. Save the **Gateway Account ID** GUID to the code example launcher configuration file. - ![Skipping the Stripe account form](documentation/stripe_skip_account_form_link.png) -1. Next, the Admin Tool will show that an enabled Stripe - payment gateway account has been associated with your - DocuSign Developer account. -1. Configure the example launcher with the gateway account id shown in the Admin tool. ## Additional documentation -See the -[Managing Payment Gateways](https://support.docusign.com/en/guides/managing-payment-gateways) -documentation. - +* [Managing Payment Gateways](https://support.docusign.com/en/guides/managing-payment-gateways) +* [How to send a request for payment](https://developers.docusign.com/docs/esign-rest-api/how-to/request-a-payment) diff --git a/README.md b/README.md index 7bbe6c8..16a90e5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # DocuSign PowerShell Code Examples ## Introduction -This repo includes a powershell command-line application to demonstrate: +This repo includes a PowerShell command-line application to demonstrate: ## eSignature API @@ -165,7 +165,6 @@ For more information about the scopes used for obtaining authorization to use th ## Click API **Note:** To use the Click API include the click_manage scope. Review the [Click API 101 Auth Guide](https://developers.docusign.com/docs/click-api/click101/auth) for more details. - 1. **Create clickwraps.** [Source.](./examples/Click/eg001CreateClickwrap.ps1) Creates a clickwrap that you can embed in your website or app. @@ -182,76 +181,98 @@ For more information about the scopes used for obtaining authorization to use th [Source.](./examples/Click/eg005GetClickwrapResponses.ps1) Demonstrates how to get user responses to your clickwrap agreements. -## Prerequisites -1. A DocuSign developer account (email and password) on demo.docusign.net. Create a free account. -1. PowerShell 5 or later +## Monitor API + +**Note:** To use the Monitor API you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). + +For more information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). -**Note:** The Quickstart creates and configures a new Integration Key to use in the resulting project. If you later intend to create and customize your own integration and eventually migrate to production using our Go-Live process, you would need to update the Quickstart’s configuration values. +1. **Get Monitoring Data.** + [Source.](./examples/Monitor/eg001GetMonitoringData.ps1) + + Demonstrates how to get and display all of your organization’s monitoring data. ## Installation -**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to [Running the examples](#running-the-examples). The next step has been automatically performed for you.** +**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to Running the examples, the next step has been automatically performed for you.** Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. ## Collect your Integration information +======= -* Create a [DocuSign developer account](https://account-d.docusign.com/#/username) if you have not yet done so. -* Once you have a DocuSign account created, make a new [**integration key**](https://admindemo.docusign.com/api-integrator-key). -* Add in the following **redirect uri** `http://localhost:8080/authorization-code/callback` -* Find your **API Account Id:** on the same page you used to setup your [**integration key**](https://admindemo.docusign.com/api-integrator-key). -* Update `config/settings.json` with the credentials from DocuSign developer account: - * `IMPERSONATION_USER_GUID` = API Account ID - * `INTEGRATION_KEY_JWT` = Integration Key - * `INTEGRATION_KEY_AUTH_CODE` = Integration Key - * `SECRET_KEY` = Secret Key - * `GATEWAY_ACCOUNT_ID` = Account ID -* **Signer name and email:** Remember to try the DocuSign signing using both a mobile phone and a regular - email client. - - -## JWT Authentication +## Installation +### Prerequisites +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip items 1 and 2 as they were automatically performed for you. -* create an RSA KeyPair on your **integration key** and copy the **private_key** into the file `config/private.key` and save it. Use JWT authentication if you intend to run a system account integration or to impersonate a different user. -* OPTIONAL: If you intend to use JWT grant authentication, set **Impersonation_user_guid** by using your own **user_account_id** found on the same page used to set your [**integration key**](https://admindemo.docusign.com/api-integrator-key). +1. A free [DocuSign developer account](https://go.docusign.com/o/sandbox/); create one if you don't already have one. +1. A DocuSign app and integration key that is configured for authentication to use either [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) or [JWT Grant](https://developers.docusign.com/platform/auth/jwt/). -**Note:** Before you can make any API calls using JWT Grant, you must get your user’s consent for your app to impersonate them. To do this, the `impersonation` scope is added when requesting a JSON Web Token. + This [video](https://www.youtube.com/watch?v=eiRI4fe5HgM) demonstrates how to obtain an integration key. -## OAuth Details + To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. -This launcher is a collection of powershell scripts with an included http listener script. The listener script works on **port 8080** in order to receive the redirect callback from successful authorization with DocuSign servers that include the Authorization code or an access token in the response payload. Confirm that port 8080 is not in use by other applications so that the OAuth mechanism functions properly. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant authentication](#installation-steps-for-jwt-grant-authentication) for details. -These OAuth scripts are integrated into the launcher and hardcode the location for the RSA private key in the case of the JWT php scripts. + For both authentication flows: + + If you use this launcher on your own workstation, the integration key must include a redirect URI of -Do not delete or change the name of the private.key file located in the config directory as this will cause problems with jwt authentication. + http://localhost:8080/authorization-code/callback -## Running the examples -You can see the code examples in action by going to opening the extracted Quickstart folder or the code-examples-powershell folder, right-clicking on the **launcher** file, selecting **Run with PowerShell**, selecting **Open** when prompted by the dialog box, and selecting an API when prompted in Windows Powershell. + If you host this launcher on a remote web server, set your redirect URI as + + {base_url}/authorization-code/callback + + where {base_url} is the URL for the web app. + +1. PowerShell 5 or later -Log in to your DocuSign account using either Authorization Code Grant or using JWT to gain an OAuth token. From there, you can pick the number that corresponds to a setting or feature you wish to try out. -If you make a mistake, simply run the settings option again. Each code example is a standalone file, but can be reached using the launcher.ps1 file. +### Installation steps +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. -Use the powershell terminal to run the examples. +1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. +1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. +1. To configure the launcher for [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. + 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. + 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. + 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. + 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. +**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**. +1. Select an API when prompted in Windows PowerShell. +1. Select **Authorization Code Grant** when authenticating your account. +1. Select your desired code example. -The examples have been tested on Windows but can conceivably be used with MacOS and Linux systems. -The source files for each example are located in the `/examples` directory. +### Installation steps for JWT Grant authentication +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. +1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. +1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. +1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. + 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** GUID and save it in settings.json as your `IMPERSONATION_USER_GUID`. + 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. + 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. + 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. + 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. +**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. +1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open** +1. Select an API when prompted in Windows PowerShell. +1. Select **JSON Web Token** when authenticating your account. +1. Select your desired code example. -### Payments code example -To use the payments code example, first create a test payments gateway in your account. -Follow the instructions in the -[PAYMENTS_INSTALLATION](./PAYMENTS_INSTALLATION.md) -file. -Then add the payment gateway id to the code example file. +## Payments code example +To use the payments code example, create a test payment gateway on the [**Payments**](https://admindemo.docusign.com/authenticate?goTo=payments) page in your developer account. See [Configure a payment gateway](./PAYMENTS_INSTALLATION.md) for details. +Once you've created a payment gateway, save the **Gateway Account ID** GUID to settings.json. ## License and additional information ### License -This repository uses the MIT License. See the LICENSE file for more information. +This repository uses the MIT License. See [LICENSE](./LICENSE) for details. ### Pull Requests Pull requests are welcomed. Pull requests will only be considered if their content diff --git a/config/settings.example.json b/config/settings.example.json index 1a51074..11245f3 100644 --- a/config/settings.example.json +++ b/config/settings.example.json @@ -6,9 +6,9 @@ "SIGNER_NOT_CHECKED_EMAIL": "{SIGNER_NOT_CHECKED_EMAIL}", "CC_EMAIL": "{CC_EMAIL}", "CC_NAME": "{CC_NAME}", - "IMPERSONATION_USER_GUID": "{IMPERSONATED_USER_GUID}", + "IMPERSONATION_USER_GUID": "{IMPERSONATED_USER_ID}", "INTEGRATION_KEY_JWT": "{INTEGRATION_KEY_JWT}", "INTEGRATION_KEY_AUTH_CODE": "{INTEGRATION_KEY_AUTH_CODE}", "SECRET_KEY": "{SECRET_KEY}", "GATEWAY_ACCOUNT_ID": "{DS_PAYMENT_GATEWAY_ID}" -} \ No newline at end of file +} diff --git a/launcher.ps1 b/launcher.ps1 index 55935af..ca51368 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -32,7 +32,8 @@ function startLauncher { eSignature = 1; Rooms = 2; Click = 3; - Exit = 4; + Monitor = 4; + Exit = 5; } $listApiView = $null; @@ -41,6 +42,7 @@ function startLauncher { Write-Output "$([int][listApi]::eSignature)) eSignature" Write-Output "$([int][listApi]::Rooms)) Rooms" Write-Output "$([int][listApi]::Click)) Click" + Write-Output "$([int][listApi]::Monitor)) Monitor" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); @@ -54,6 +56,9 @@ function startLauncher { elseif ($listApiView -eq [listApi]::Click) { startAuth "click" } + elseif ($listApiView -eq [listApi]::Monitor) { + startAuth "monitor" + } elseif ($listApiView -eq [listApi]::Exit) { exit 1 } @@ -69,14 +74,20 @@ function startAuth ($apiVersion) { } $AuthTypeView = $null; - do { - Write-Output "" - Write-Output 'Choose an OAuth Strategy: ' - Write-Output "$([int][AuthType]::CodeGrant)) Authorization Code Grant" - Write-Output "$([int][AuthType]::JWT)) Json Web Token" - Write-Output "$([int][AuthType]::Exit)) Exit" - [int]$AuthTypeView = Read-Host "Select an OAuth method to Authenticate with your DocuSign account" - } while (-not [AuthType]::IsDefined([AuthType], $AuthTypeView)); + if ($apiVersion -eq "monitor") + { + $AuthTypeView = [AuthType]::JWT; # Monitor API only supports JWT + } + else { + do { + Write-Output "" + Write-Output 'Choose an OAuth Strategy: ' + Write-Output "$([int][AuthType]::CodeGrant)) Authorization Code Grant" + Write-Output "$([int][AuthType]::JWT)) Json Web Token (JWT)" + Write-Output "$([int][AuthType]::Exit)) Exit" + [int]$AuthTypeView = Read-Host "Select an OAuth method to Authenticate with your DocuSign account" + } while (-not [AuthType]::IsDefined([AuthType], $AuthTypeView)); + } if ($AuthTypeView -eq [AuthType]::Exit) { startLauncher @@ -97,6 +108,9 @@ function startAuth ($apiVersion) { elseif ($listApiView -eq [listApi]::Click) { startClick } + elseif ($listApiView -eq [listApi]::Monitor) { + startMonitor + } } function startSignature { @@ -397,5 +411,27 @@ function startClick { startLauncher } +function startMonitor { + do { + Enum listMonitorExamples { + getMonitoringData = 1; + Home = 2; + } + $listMonitorExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listMonitorExamples]::getMonitoringData)) Get Monitoring Data" + Write-Output "$([int][listMonitorExamples]::Home)) Home" + [int]$listMonitorExamplesView = Read-Host "Select the action" + } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); + + if ($listMonitorExamplesView -eq [listMonitorExamples]::getMonitoringData) { + powershell.exe -Command .\examples\Monitor\eg001getMonitoringData.ps1 + } + } until ($listMonitorExamplesView -eq [listMonitorExamples]::Home) + startLauncher +} + Write-Output "Welcome to the DocuSign PowerShell Launcher" startLauncher From 35c6c52758e0b0010a53d3229ecba9e276e84885 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 16 Apr 2021 10:47:05 -0700 Subject: [PATCH 091/462] Adding Monitor API Example --- examples/Monitor/eg001GetMonitoringData.ps1 | 89 +++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 examples/Monitor/eg001GetMonitoringData.ps1 diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 new file mode 100644 index 0000000..dd68d3d --- /dev/null +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -0,0 +1,89 @@ +# Temp files: +$response = New-TemporaryFile + +# Step 1. Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt + +# Step 2. Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +# Declare variables +$complete=$false +$cursorValue="" +$iterations=0 +# You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint +if (($accessToken -eq "") -or ($accessToken -eq $null)) { + Write-Output "You must provide an access token" + $complete = $true +} + +# Step 3: Get monitoring data +# First call the endpoint with no cursor to get the first records. +# After each call, save the cursor and use it to make the next +# call from the point where the previous one left off when iterating through +# the monitoring records +DO { + $iterations++ + Write-Output "" + + try { + Invoke-RestMethod ` + -Uri "https://lens-d.docusign.net/api/v2.0/datasets/monitor/stream?cursor=${cursorValue}&limit=2000" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + + # Display the data + Write-Output "Iteration:" + Write-Output $iterations + Write-Output "Results:" + Get-Content $response + + # Get the endCursor value from the response. This lets you resume + # getting records from the spot where this call left off + $endCursorValue = (Get-Content $response | ConvertFrom-Json).endCursor + Write-Output "endCursorValue is:" + Write-Output $endCursorValue + Write-Output "cursorValue is:" + Write-Output $cursorValue + + # If the endCursor from the response is the same as the one that you already have, + # it means that you have reached the + # end of the records + if ($endCursorValue -eq $cursorValue) { + Write-Output 'After getting records, the cursor values are the same. This indicates that you have reached the end of your available records.' + $complete=$true + } + else { + Write-Output "Updating the cursor value of $cursorValue to the new value of $endCursorValue" + $cursorValue=$endCursorValue + Start-Sleep -Second 5 + } + } + catch { + $int = 0 + foreach($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + $complete = $true + } + +} While ($complete -eq $false ) + +Remove-Item $response + +Write-Output "" +Write-Output "" +Write-Output "Done." +Write-Output "" From ad82839cb53868385206d4761a54455211dae31f Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 19 Apr 2021 09:47:46 -0700 Subject: [PATCH 092/462] removed 4 lines --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 16a90e5..d44fd5a 100644 --- a/README.md +++ b/README.md @@ -193,13 +193,6 @@ For more information about the scopes used for obtaining authorization to use th Demonstrates how to get and display all of your organization’s monitoring data. -## Installation -**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to Running the examples, the next step has been automatically performed for you.** -Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. - -## Collect your Integration information -======= - ## Installation ### Prerequisites **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip items 1 and 2 as they were automatically performed for you. From 279afb31cdc38ec98c9f6ff6060052215692b210 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 19 Apr 2021 09:48:21 -0700 Subject: [PATCH 093/462] removed 4 lines --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 16a90e5..d44fd5a 100644 --- a/README.md +++ b/README.md @@ -193,13 +193,6 @@ For more information about the scopes used for obtaining authorization to use th Demonstrates how to get and display all of your organization’s monitoring data. -## Installation -**Note: If you downloaded this code using Quickstart from the DocuSign Developer Center, skip to Running the examples, the next step has been automatically performed for you.** -Download or clone this repository to your workstation. Open a PowerShell terminal window and navigate to this repo's folder. - -## Collect your Integration information -======= - ## Installation ### Prerequisites **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip items 1 and 2 as they were automatically performed for you. From 241b285619754218450796666f031cd84c6cc1b9 Mon Sep 17 00:00:00 2001 From: Aaron JacksonWilde Date: Mon, 19 Apr 2021 10:23:00 -0700 Subject: [PATCH 094/462] quickstart jump to ex1 after login --- launcher.ps1 | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index 55935af..08f11c9 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -23,8 +23,6 @@ if($config.CC_EMAIL -eq "{CC_EMAIL}" ){ } - - function startLauncher { do { # Preparing list of Api @@ -36,7 +34,24 @@ function startLauncher { } $listApiView = $null; + + # Load via Quickstart + if($config.QUICKSTART -eq "true" ){ + if ($null -eq $firstPassComplete){ + Write-Output '' + Write-Output "Quickstart Enabled, please wait" + write-Output '' + .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") | powershell.exe -Command .\eg001EmbeddedSigning.ps1 + + # This is to prevent getting stuck on the + # first example after trying it the first time + $firstPassComplete = "true" + startSignature + } + } + do { + Write-Output '' Write-Output 'Choose API: ' Write-Output "$([int][listApi]::eSignature)) eSignature" Write-Output "$([int][listApi]::Rooms)) Rooms" From 669b539885ce6810d52041b46291f67122e7b9a7 Mon Sep 17 00:00:00 2001 From: Aaron JacksonWilde Date: Mon, 19 Apr 2021 12:57:03 -0700 Subject: [PATCH 095/462] hides cc prompt unless needed by ex --- launcher.ps1 | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index 64fb38f..153504f 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -11,6 +11,8 @@ if ((Test-Path $configFile) -eq $False) { # Get required environment variables from .\config\settings.json file $config = Get-Content $configFile -Raw | ConvertFrom-Json +function checkCC{ + # Fill in Quickstart Carbon Copy config values if($config.CC_EMAIL -eq "{CC_EMAIL}" ){ Write-Output "It looks like this is your first time running the launcher from Quickstart. " @@ -20,6 +22,7 @@ if($config.CC_EMAIL -eq "{CC_EMAIL}" ){ $config.SIGNER_NOT_CHECKED_NAME = "Enter a name address to route to when the checkbox is not checked" Write-Output "" write-output $config | ConvertTo-Json | Set-Content $configFile + } } @@ -217,7 +220,7 @@ function startSignature { powershell.exe -Command .\eg001EmbeddedSigning.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email) { - powershell.exe -Command .\examples\eSignature\eg002SigningViaEmail.ps1 + checkCC | powershell.exe -Command .\examples\eSignature\eg002SigningViaEmail.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::List_Envelopes) { powershell.exe -Command .\examples\eSignature\eg003ListEnvelopes.ps1 @@ -238,22 +241,22 @@ function startSignature { powershell.exe .\examples\eSignature\eg008CreateTemplate.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Use_Template) { - powershell.exe .\examples\eSignature\eg009UseTemplate.ps1 + checkCC | powershell.exe .\examples\eSignature\eg009UseTemplate.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Send_Binary_Docs) { - powershell.exe .\examples\eSignature\eg010SendBinaryDocs.ps1 + checkCC | powershell.exe .\examples\eSignature\eg010SendBinaryDocs.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Sending) { - powershell.exe .\examples\eSignature\eg011EmbeddedSending.ps1 + checkCC | powershell.exe .\examples\eSignature\eg011EmbeddedSending.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Console) { powershell.exe .\examples\eSignature\eg012EmbeddedConsole.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Add_Doc_To_Template) { - powershell.exe .\examples\eSignature\eg013AddDocToTemplate.ps1 + checkCC | powershell.exe .\examples\eSignature\eg013AddDocToTemplate.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Collect_Payment) { - powershell.exe .\examples\eSignature\eg014CollectPayment.ps1 + checkCC | powershell.exe .\examples\eSignature\eg014CollectPayment.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Tab_Data) { powershell.exe .\examples\eSignature\eg015EnvelopeTabData.ps1 @@ -262,7 +265,7 @@ function startSignature { powershell.exe .\examples\eSignature\eg016SetTabValues.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Set_Template_Tab_Values) { - powershell.exe .\examples\eSignature\eg017SetTemplateTabValues.ps1 + checkCC | powershell.exe .\examples\eSignature\eg017SetTemplateTabValues.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Custom_Field_Data) { powershell.exe .\examples\eSignature\eg018EnvelopeCustomFieldData.ps1 @@ -301,22 +304,22 @@ function startSignature { powershell.exe .\examples\eSignature\eg029ApplyingBrandEnvelope.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Applying_Brand_Template) { - powershell.exe .\examples\eSignature\eg030ApplyingBrandTemplate.ps1 + checkCC | powershell.exe .\examples\eSignature\eg030ApplyingBrandTemplate.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Bulk_Sending) { - powershell.exe .\examples\eSignature\eg031BulkSending.ps1 + checkCC | powershell.exe .\examples\eSignature\eg031BulkSending.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Pause_Signature_Workflow) { - powershell.exe .\examples\eSignature\eg032PauseSignatureWorkflow.ps1 + checkCC | powershell.exe .\examples\eSignature\eg032PauseSignatureWorkflow.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Unpause_Signature_Workflow) { powershell.exe .\examples\eSignature\eg033UnpauseSignatureWorkflow.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Use_Conditional_Recipients) { - powershell.exe .\examples\eSignature\eg034UseConditionalRecipients.ps1 + checkCC | powershell.exe .\examples\eSignature\eg034UseConditionalRecipients.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::SMS_Delivery) { - powershell.exe .\examples\eSignature\eg035SMSDelivery.ps1 + checkCC | powershell.exe .\examples\eSignature\eg035SMSDelivery.ps1 } } until ($ApiExamplesView -eq [ApiExamples]::Home) startLauncher From f4978bb396c1f63f6c89cc2ca1689825b7094ff4 Mon Sep 17 00:00:00 2001 From: Aaron JacksonWilde Date: Mon, 19 Apr 2021 13:03:46 -0700 Subject: [PATCH 096/462] code linting --- examples/Monitor/eg001GetMonitoringData.ps1 | 20 ++++++++++---------- launcher.ps1 | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index dd68d3d..5088ed3 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -15,20 +15,20 @@ $complete=$false $cursorValue="" $iterations=0 # You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint -if (($accessToken -eq "") -or ($accessToken -eq $null)) { +if (($accessToken -eq "") -or ($null -eq $accessToken)) { Write-Output "You must provide an access token" $complete = $true } - + # Step 3: Get monitoring data # First call the endpoint with no cursor to get the first records. -# After each call, save the cursor and use it to make the next +# After each call, save the cursor and use it to make the next # call from the point where the previous one left off when iterating through # the monitoring records DO { $iterations++ Write-Output "" - + try { Invoke-RestMethod ` -Uri "https://lens-d.docusign.net/api/v2.0/datasets/monitor/stream?cursor=${cursorValue}&limit=2000" ` @@ -38,23 +38,23 @@ DO { 'Content-Type' = "application/json"; } ` -OutFile $response - + # Display the data Write-Output "Iteration:" Write-Output $iterations Write-Output "Results:" Get-Content $response - + # Get the endCursor value from the response. This lets you resume # getting records from the spot where this call left off $endCursorValue = (Get-Content $response | ConvertFrom-Json).endCursor Write-Output "endCursorValue is:" Write-Output $endCursorValue Write-Output "cursorValue is:" - Write-Output $cursorValue - + Write-Output $cursorValue + # If the endCursor from the response is the same as the one that you already have, - # it means that you have reached the + # it means that you have reached the # end of the records if ($endCursorValue -eq $cursorValue) { Write-Output 'After getting records, the cursor values are the same. This indicates that you have reached the end of your available records.' @@ -77,7 +77,7 @@ DO { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line $complete = $true - } + } } While ($complete -eq $false ) diff --git a/launcher.ps1 b/launcher.ps1 index 153504f..baa1580 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -45,9 +45,9 @@ function startLauncher { Write-Output '' Write-Output "Quickstart Enabled, please wait" write-Output '' - .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") | powershell.exe -Command .\eg001EmbeddedSigning.ps1 - - # This is to prevent getting stuck on the + .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") | powershell.exe -Command .\eg001EmbeddedSigning.ps1 + + # This is to prevent getting stuck on the # first example after trying it the first time $firstPassComplete = "true" startSignature From e2c0879319849dd7d174177c00c084eeaf544708 Mon Sep 17 00:00:00 2001 From: robert-knight Date: Wed, 21 Apr 2021 18:07:45 -0700 Subject: [PATCH 097/462] Updated sequence values for eg013. --- examples/eSignature/eg013AddDocToTemplate.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg013AddDocToTemplate.ps1 b/examples/eSignature/eg013AddDocToTemplate.ps1 index 1ea9854..8e654dd 100644 --- a/examples/eSignature/eg013AddDocToTemplate.ps1 +++ b/examples/eSignature/eg013AddDocToTemplate.ps1 @@ -63,7 +63,7 @@ Write-Output "added by using Composite Templates" }; ); }; - sequence = "1"; + sequence = "2"; }; ); serverTemplates = @( @@ -111,7 +111,7 @@ Write-Output "added by using Composite Templates" }; ); }; - sequence = "2"; + sequence = "1"; }; ); }; From 6eed178237c59fbd75ffe781b8173376e691833b Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 26 Apr 2021 15:20:17 -0700 Subject: [PATCH 098/462] add bypass prereq --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d44fd5a..490e8fe 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,9 @@ For more information about the scopes used for obtaining authorization to use th where {base_url} is the URL for the web app. 1. PowerShell 5 or later - +1. PowerShell script files (PS1) downloaded from the internet that are not digitally signed are considered a security risk. By default, PowerShell blocks execution of such scripts. To bypass this limitation, you will need to run the following command at the Windows PowerShell command line: `Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass` + After executing this command, you can run the downloaded PowerShell script. + ### Installation steps **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. From f308dbe54027bdd3a814b35b6581282ec5afd9ae Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 26 Apr 2021 15:22:08 -0700 Subject: [PATCH 099/462] add bypass --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d44fd5a..ad2904c 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,9 @@ For more information about the scopes used for obtaining authorization to use th where {base_url} is the URL for the web app. 1. PowerShell 5 or later - +1. PowerShell script files (PS1) downloaded from the internet that are not digitally signed are considered a security risk. By default, PowerShell blocks execution of such scripts. To bypass this limitation, you will need to run the following command at the Windows PowerShell command line: `Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass` + After executing this command, you can run the downloaded PowerShell script. + ### Installation steps **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. From 91022a58f6f75db9dda43396a632cef8529cb0d4 Mon Sep 17 00:00:00 2001 From: robert-knight Date: Mon, 3 May 2021 16:18:00 -0700 Subject: [PATCH 100/462] Added tabType to filters. --- examples/eSignature/eg034UseConditionalRecipients.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/eSignature/eg034UseConditionalRecipients.ps1 b/examples/eSignature/eg034UseConditionalRecipients.ps1 index 2f9cd20..917c0be 100644 --- a/examples/eSignature/eg034UseConditionalRecipients.ps1 +++ b/examples/eSignature/eg034UseConditionalRecipients.ps1 @@ -90,6 +90,7 @@ $response = New-TemporaryFile tabId = "ApprovalTab"; operator = "equals"; value = "false"; + tabType = "checkbox"; tabLabel = "ApproveWhenChecked" }; ); @@ -105,6 +106,7 @@ $response = New-TemporaryFile tabId = "ApprovalTab"; operator = "equals"; value = "true"; + tabType = "checkbox"; tabLabel = "ApproveWhenChecked" }; ); From 5a25eb01205082b24a5b764cd39f2bbba6a06803 Mon Sep 17 00:00:00 2001 From: Robert Knight Date: Wed, 5 May 2021 14:12:01 -0700 Subject: [PATCH 101/462] 4652, 4707 and 4674 (#17) * Added tabType to filters. * Fixed checkCC function call in launcher.ps1, added code to check for conditional recipient and fixed tabType regression in filters. * Fixed Read-Host issue for DEVDOCS-4707. * Update eg034UseConditionalRecipients.ps1 fix linting complaints Co-authored-by: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> --- .../eg034UseConditionalRecipients.ps1 | 15 +++++++- launcher.ps1 | 38 ++++++++++++------- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/examples/eSignature/eg034UseConditionalRecipients.ps1 b/examples/eSignature/eg034UseConditionalRecipients.ps1 index 2f9cd20..626edc2 100644 --- a/examples/eSignature/eg034UseConditionalRecipients.ps1 +++ b/examples/eSignature/eg034UseConditionalRecipients.ps1 @@ -8,6 +8,17 @@ $oAuthAccessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $APIAccountId = Get-Content .\config\API_ACCOUNT_ID +# Get required environment variables from .\config\settings.json file +$configFile = ".\config\settings.json" +$config = Get-Content $configFile -Raw | ConvertFrom-Json + +if($config.SIGNER_NOT_CHECKED_EMAIL -eq "{SIGNER_NOT_CHECKED_EMAIL}" ){ + $config.SIGNER_NOT_CHECKED_EMAIL = Read-Host "Enter an email address to route to when the checkbox is not checked" + $config.SIGNER_NOT_CHECKED_NAME = Read-Host "Enter a name to route to when the checkbox is not checked" + Write-Output "" + write-output $config | ConvertTo-Json | Set-Content $configFile + } + # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json $SIGNER1_EMAIL = $variables.CC_EMAIL @@ -90,6 +101,7 @@ $response = New-TemporaryFile tabId = "ApprovalTab"; operator = "equals"; value = "false"; + tabType = "checkbox"; tabLabel = "ApproveWhenChecked" }; ); @@ -105,6 +117,7 @@ $response = New-TemporaryFile tabId = "ApprovalTab"; operator = "equals"; value = "true"; + tabType = "checkbox"; tabLabel = "ApproveWhenChecked" }; ); @@ -213,4 +226,4 @@ catch { # Delete temp files Remove-Item $requestData -Remove-Item $response \ No newline at end of file +Remove-Item $response diff --git a/launcher.ps1 b/launcher.ps1 index baa1580..5379716 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -18,8 +18,6 @@ if($config.CC_EMAIL -eq "{CC_EMAIL}" ){ Write-Output "It looks like this is your first time running the launcher from Quickstart. " $config.CC_EMAIL = Read-Host "Enter a CC email address to receive copies of envelopes" $config.CC_NAME = Read-Host "Enter a name for your CC recipient" - $config.SIGNER_NOT_CHECKED_EMAIL = "Enter an email address to route to when the checkbox is not checked" - $config.SIGNER_NOT_CHECKED_NAME = "Enter a name address to route to when the checkbox is not checked" Write-Output "" write-output $config | ConvertTo-Json | Set-Content $configFile } @@ -220,7 +218,8 @@ function startSignature { powershell.exe -Command .\eg001EmbeddedSigning.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email) { - checkCC | powershell.exe -Command .\examples\eSignature\eg002SigningViaEmail.ps1 + checkCC + powershell.exe -Command .\examples\eSignature\eg002SigningViaEmail.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::List_Envelopes) { powershell.exe -Command .\examples\eSignature\eg003ListEnvelopes.ps1 @@ -241,22 +240,27 @@ function startSignature { powershell.exe .\examples\eSignature\eg008CreateTemplate.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Use_Template) { - checkCC | powershell.exe .\examples\eSignature\eg009UseTemplate.ps1 + checkCC + powershell.exe .\examples\eSignature\eg009UseTemplate.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Send_Binary_Docs) { - checkCC | powershell.exe .\examples\eSignature\eg010SendBinaryDocs.ps1 + checkCC + powershell.exe .\examples\eSignature\eg010SendBinaryDocs.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Sending) { - checkCC | powershell.exe .\examples\eSignature\eg011EmbeddedSending.ps1 + checkCC + powershell.exe .\examples\eSignature\eg011EmbeddedSending.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Console) { powershell.exe .\examples\eSignature\eg012EmbeddedConsole.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Add_Doc_To_Template) { - checkCC | powershell.exe .\examples\eSignature\eg013AddDocToTemplate.ps1 + checkCC + powershell.exe .\examples\eSignature\eg013AddDocToTemplate.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Collect_Payment) { - checkCC | powershell.exe .\examples\eSignature\eg014CollectPayment.ps1 + checkCC + powershell.exe .\examples\eSignature\eg014CollectPayment.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Tab_Data) { powershell.exe .\examples\eSignature\eg015EnvelopeTabData.ps1 @@ -265,7 +269,8 @@ function startSignature { powershell.exe .\examples\eSignature\eg016SetTabValues.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Set_Template_Tab_Values) { - checkCC | powershell.exe .\examples\eSignature\eg017SetTemplateTabValues.ps1 + checkCC + powershell.exe .\examples\eSignature\eg017SetTemplateTabValues.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Custom_Field_Data) { powershell.exe .\examples\eSignature\eg018EnvelopeCustomFieldData.ps1 @@ -304,22 +309,27 @@ function startSignature { powershell.exe .\examples\eSignature\eg029ApplyingBrandEnvelope.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Applying_Brand_Template) { - checkCC | powershell.exe .\examples\eSignature\eg030ApplyingBrandTemplate.ps1 + checkCC + powershell.exe .\examples\eSignature\eg030ApplyingBrandTemplate.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Bulk_Sending) { - checkCC | powershell.exe .\examples\eSignature\eg031BulkSending.ps1 + checkCC + powershell.exe .\examples\eSignature\eg031BulkSending.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Pause_Signature_Workflow) { - checkCC | powershell.exe .\examples\eSignature\eg032PauseSignatureWorkflow.ps1 + checkCC + powershell.exe .\examples\eSignature\eg032PauseSignatureWorkflow.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Unpause_Signature_Workflow) { powershell.exe .\examples\eSignature\eg033UnpauseSignatureWorkflow.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Use_Conditional_Recipients) { - checkCC | powershell.exe .\examples\eSignature\eg034UseConditionalRecipients.ps1 + checkCC + powershell.exe .\examples\eSignature\eg034UseConditionalRecipients.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::SMS_Delivery) { - checkCC | powershell.exe .\examples\eSignature\eg035SMSDelivery.ps1 + checkCC + powershell.exe .\examples\eSignature\eg035SMSDelivery.ps1 } } until ($ApiExamplesView -eq [ApiExamples]::Home) startLauncher From 1f9fbf2093f4f0a647ff81490911b675bb1aa44a Mon Sep 17 00:00:00 2001 From: Robert Knight Date: Wed, 5 May 2021 19:24:20 -0700 Subject: [PATCH 102/462] Devdocs 4719 (#18) * Added tabType to filters. * Changed SIGNER_1 email and name to SIGNER instead of CC_* --- examples/eSignature/eg034UseConditionalRecipients.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg034UseConditionalRecipients.ps1 b/examples/eSignature/eg034UseConditionalRecipients.ps1 index 626edc2..2c6383f 100644 --- a/examples/eSignature/eg034UseConditionalRecipients.ps1 +++ b/examples/eSignature/eg034UseConditionalRecipients.ps1 @@ -21,8 +21,8 @@ if($config.SIGNER_NOT_CHECKED_EMAIL -eq "{SIGNER_NOT_CHECKED_EMAIL}" ){ # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -$SIGNER1_EMAIL = $variables.CC_EMAIL -$SIGNER1_NAME = $variables.CC_NAME +$SIGNER1_EMAIL = $variables.SIGNER_EMAIL +$SIGNER1_NAME = $variables.SIGNER_NAME $SIGNER_WHEN_CHECKED_EMAIL = $variables.CC_EMAIL $SIGNER_WHEN_CHECKED_NAME = $variables.CC_NAME $SIGNER_NOT_CHECKED_EMAIL = $variables.SIGNER_NOT_CHECKED_EMAIL From b968681cc6d03bc16187ae03588fe82414d2344e Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Thu, 20 May 2021 09:00:14 -0700 Subject: [PATCH 103/462] Error handling to exit launcher when OAuth fails (#19) * initial commit * explicit error handling for port 8080 in use * linting for spaces * fix token location and add in coverage on jwt and non-QS execution * linting complaints --- OAuth/code_grant.ps1 | 8 +++++++- OAuth/jwt.ps1 | 10 ++++++++-- launcher.ps1 | 18 ++++++++++++++++-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index d71a184..483d87e 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -40,11 +40,17 @@ Write-Output $authorizationURL $http = New-Object System.Net.HttpListener # Hostname and port to listen on -$http.Prefixes.Add($redirectURI + "/") +$http.Prefixes.Add($redirectURI + "/") +try { # Start the Http Server $http.Start() +} +catch { + Write-Error "OAuth listener failed. Is port 8080 in use by another program?" -ErrorAction Stop +} + if ($http.IsListening) { Write-Output "Open the following URL in a browser to continue:" $authorizationURL Start-Process $authorizationURL diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 112e352..be9f66d 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -59,8 +59,14 @@ $http = New-Object System.Net.HttpListener # Hostname and port to listen on $http.Prefixes.Add($redirectURI + "/") -# Start the Http Server -$http.Start() +try { + # Start the Http Server + $http.Start() + + } + catch { + Write-Error "OAuth listener failed. Is port 8080 in use by another program?" -ErrorAction Stop + } if ($http.IsListening) { Write-Output "Open the following URL in a browser to continue:" $authorizationURL diff --git a/launcher.ps1 b/launcher.ps1 index 5379716..371afd0 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -43,15 +43,23 @@ function startLauncher { Write-Output '' Write-Output "Quickstart Enabled, please wait" write-Output '' - .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") | powershell.exe -Command .\eg001EmbeddedSigning.ps1 + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") + + + if ((Test-Path "./config/ds_access_token.txt") -eq $true) { + powershell.exe -Command .\eg001EmbeddedSigning.ps1 # This is to prevent getting stuck on the # first example after trying it the first time $firstPassComplete = "true" + startSignature } + else { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } } - + } do { Write-Output '' Write-Output 'Choose API: ' @@ -110,9 +118,15 @@ function startAuth ($apiVersion) { } elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) + if ((Test-Path "./config/ds_access_token.txt") -eq $false) { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } } elseif ($AuthTypeView -eq [AuthType]::JWT) { powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) + if ((Test-Path "./config/ds_access_token.txt") -eq $false) { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } } if ($listApiView -eq [listApi]::eSignature) { From 500a5d5aaeada5f9f0fd385d60690263d98443d3 Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Thu, 3 Jun 2021 13:10:24 -0700 Subject: [PATCH 104/462] update readme for DC links (#22) * Added tabType to filters. * initial commit Co-authored-by: robert-knight --- README.md | 222 +++++++++--------------------------------------------- 1 file changed, 35 insertions(+), 187 deletions(-) diff --git a/README.md b/README.md index 490e8fe..6a67487 100644 --- a/README.md +++ b/README.md @@ -1,197 +1,45 @@ -# DocuSign PowerShell Code Examples +# PowerShell Launcher Code Examples + +### GitHub repo: [code-examples-powershell](./) + +This GitHub repo includes code example bash scripts for the DocuSign eSignature REST API, Rooms API, Click API, and Monitor API. To switch between API code examples, select the desired option from the menu when prompted. + ## Introduction -This repo includes a PowerShell command-line application to demonstrate: + +This repo includes a PowerShell command-line that supports the following authentication workflows: + +* Authentication with DocuSign via [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode). +When the token expires, the user is asked to re-authenticate. The refresh token is not used. + +* Authentication with DocuSign via [JSON Web Token (JWT) Grant](https://developers.docusign.com/platform/auth/jwt/). +When the token expires, it updates automatically. + ## eSignature API -For more information about the scopes used for obtaining authorization to use the eSignature API, see the [Required Scopes section](https://developers.docusign.com/docs/esign-rest-api/esign101/auth) - -1. **Use embedded signing.** - [Source.](./eg001EmbeddedSigning.ps1) - This example sends an envelope, and then uses embedded signing for the first signer. - With embedded signing, the DocuSign signing is initiated from your website. -1. **Request a signature by email (Remote Signing).** - [Source.](./examples/eSignature/eg002SigningViaEmail.ps1) - The envelope includes a pdf, Word, and HTML document. - Anchor text ([AutoPlace](https://support.docusign.com/en/guides/AutoPlace-New-DocuSign-Experience)) is used to position the signing fields in the documents. -1. **List envelopes in the user's account.** - [Source.](./examples/eSignature/eg003ListEnvelopes.ps1) -1. **Get an envelope's basic information.** - [Source.](./examples/eSignature/eg004EnvelopeInfo.ps1) - The example lists the basic information about an envelope, including its overall status. -1. **List an envelope's recipients** - [Source.](./examples/eSignature/eg005EnvelopeRecipients.ps1) - Includes current recipient status. -1. **List an envelope's documents.** - [Source.](./examples/eSignature/eg006EnvelopeDocs.ps1) -1. **Download an envelope's documents.** - [Source.](./examples/eSignature/eg007EnvelopeGetDoc.ps1) - The example can download individual - documents, the documents concatenated together, or a zip file of the documents. -1. **Programmatically create a template.** - [Source.](./examples/eSignature/eg008CreateTemplate.ps1) -1. **Request a signature by email using a template.** - [Source.](./examples/eSignature/eg009UseTemplate.ps1) -1. **Send an envelope and upload its documents with multipart binary transfer.** - [Source.](./examples/eSignature/eg010SendBinaryDocs.ps1) - Binary transfer is 33% more efficient than using Base64 encoding. -1. **Use embedded sending.** - [Source.](./examples/eSignature/eg011EmbeddedSending.ps1) - Embeds the DocuSign web tool (NDSE) in your web app to finalize or update - the envelope and documents before they are sent. -1. **Embedded DocuSign web tool (NDSE).** - [Source.](./examples/eSignature/eg012EmbeddedConsole.ps1) -1. **Use embedded signing from a template with an added document.** - [Source.](./examples/eSignature/eg013AddDocToTemplate.ps1) - This example sends an envelope based on a template. - In addition to the template's document(s), the example adds an - additional document to the envelope by using the - [Composite Templates](https://developers.docusign.com/esign-rest-api/guides/features/templates#composite-templates) - feature. -1. **Payments Example.** - [Source.](./examples/eSignature/eg014CollectPayment.ps1) - An order form, with online payment by credit card. -1. **Get the envelope tab data.** - Retrieve the tab (field) values for all of the envelope's recipients. - [Source.](./examples/eSignature/eg015EnvelopeTabData.ps1) -1. **Set envelope tab values.** - The example creates an envelope and sets the initial values for its tabs (fields). Some of the tabs - are set to be read-only, others can be updated by the recipient. The example also stores - metadata with the envelope. - [Source.](./examples/eSignature/eg016SetTabValues.ps1) -1. **Set template tab values.** - The example creates an envelope using a template and sets the initial values for its tabs (fields). - The example also stores metadata with the envelope. - [Source.](./examples/eSignature/eg017SetTemplateTabValues.ps1) -1. **Get the envelope custom field data (metadata).** - The example retrieves the custom metadata (custom data fields) stored with the envelope. - [Source.](./examples/eSignature/eg018EnvelopeCustomFieldData.ps1) -1. **Requiring an Access Code for a Recipient** - [Source.](./examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1) - This example sends an envelope using remote (email) signing requiring the recipient to enter an access code. -1. **Send an envelope with a remote (email) signer using SMS authentication.** - [Source.](./examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1) - This example sends an envelope using remote (email) signing requiring the recipient to supply a verification code sent to them via SMS. -1. **Send an envelope with a remote (email) signer using Phone authentication.** - [Source.](./examples/eSignature/eg021SigningViaEmailWithPhoneAuthentication.ps1) - This example sends an envelope using remote (email) signing requiring the recipient to supply a verification code sent to them via a phone call. -1. **Send an envelope with a remote (email) signer using Knowledge-Based authentication.** - [Source.](./examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1) - This example sends an envelope using remote (email) signing requiring the recipient to validate their identity via Knowledge-Based authentication. -1. **Send an envelope with a remote (email) signer using Identity Verification.** - [Source.](./examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1) - This example sends an envelope using remote (email) signing requiring the recipient to validate their identity via a government issued ID. -1. **Creating a permission profile** - [Source.](./examples/eSignature/eg024CreatingPermissionProfiles.ps1) - This code example demonstrates how to create a permission profile using the [Create Permission Profile](https://developers.docusign.com/esign-rest-api/reference/Accounts/AccountPermissionProfiles/create) method. -1. **Setting a permission profile** - [Source.](./examples/eSignature/eg025SettingPermissionProfiles.ps1) - This code example demonstrates how to set a user group’s permission profile using the [Update Group](https://developers.docusign.com/esign-rest-api/reference/UserGroups/Groups/update) method. - You must have already created the permissions profile and the group of users. -1. **Updating individual permission settings** - [Source.](./examples/eSignature/eg026UpdatingIndividualPermission.ps1) - This code example demonstrates how to edit individual permission settings on a permissions profile using the [Update Permission Profile](https://developers.docusign.com/esign-rest-api/reference/Accounts/AccountPermissionProfiles/update) method. -1. **Deleting a permission profile** - [Source.](./examples/eSignature/eg027DeletingPermissions.ps1) - This code example demonstrates how to delete a permission profile using the [Delete Permission Profile](https://developers.docusign.com/esign-rest-api/reference/Accounts/AccountPermissionProfiles/create) method. -1. **Creating a brand** - [Source.](./examples/eSignature/eg028CreatingABrand.ps1) - This example creates brand profile for an account using the [Create Brand](https://developers.docusign.com/esign-rest-api/reference/Accounts/AccountBrands/create) method. -1. **Applying a brand to an envelope** - [Source.](./examples/eSignature/eg029ApplyingBrandEnvelope.ps1) - This code example demonstrates how to apply a brand you've created to an envelope using the [Create Envelope](https://developers.docusign.com/esign-rest-api/reference/Envelopes/Envelopes/create) method. - First, creates the envelope and then applies the brand to it. - Anchor text ([AutoPlace](https://support.docusign.com/en/guides/AutoPlace-New-DocuSign-Experience)) is used to position the signing fields in the documents. -1. **Applying a brand to a template** - [Source.](./examples/eSignature/eg030ApplyingBrandTemplate.ps1) - This code example demonstrates how to apply a brand you've created to a template using using the [Create Envelope](https://developers.docusign.com/esign-rest-api/reference/Envelopes/Envelopes/create) method. - You must have already created the template and the brand. - Anchor text ([AutoPlace](https://support.docusign.com/en/guides/AutoPlace-New-DocuSign-Experience)) is used to position the signing fields in the documents. -1. **Bulk sending envelopes to multiple recipients** - [Source.](./examples/eSignature/eg031BulkSending.ps1) - This code example demonstrates how to send envelopes in bulk to multiple recipients using these methods: - [Create Bulk Send List](https://developers.docusign.com/esign-rest-api/reference/BulkEnvelopes/BulkSend/createBulkSendList), - [Create Bulk Send Request](https://developers.docusign.com/esign-rest-api/reference/BulkEnvelopes/BulkSend/createBulkSendRequest). - Firstly, creates a bulk send recipients list, and then creates an envelope. - After that, initiates bulk envelope sending. -1. **Pausing a signature workflow Source.** - [Source.](./examples/eSignature/eg032PauseSignatureWorkflow.ps1) - This code example demonstrates how to create an envelope where the workflow is paused before the envelope is sent to a second recipient. -1. **Unpausing a signature workflow** - [Source.](./examples/eSignature/eg033UnpauseSignatureWorkflow.ps1) - This code example demonstrates how to resume an envelope workflow that has been paused -1. **Using conditional recipients** - [Source.](./examples/eSignature/eg034UseConditionalRecipients.ps1) - This code example demonstrates how to create an envelope where the workflow is routed to different recipients based on the value of a transaction. -1. **Request a signature by SMS delivery** - [Source.](./examples/eSignature/eg035SMSDelivery.ps1) - This code example demonstrates how to send a signature request via an SMS message using the [Envelopes: create](https://developers.docusign.com/esign-rest-api/reference/Envelopes/Envelopes/create) method. +For more information about the scopes used for obtaining authorization to use the eSignature API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). + +For a list of code examples that use the eSignature API, select the Python tab under [Examples and languages](https://developers.docusign.com/docs/esign-rest-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. + +## Rooms API + +**Note:** To use the Rooms API you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. +For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). + +For a list of code examples that use the Rooms API, select the Python tab under [Examples and languages](https://developers.docusign.com/docs/rooms-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. -## Rooms API - -For more information about the scopes used for obtaining authorization to use the Rooms API, see the [Required Scopes section](https://developers.docusign.com/docs/rooms-api/rooms101/auth/) - -**Note:** to use the Rooms API you must also [create your DocuSign Developer Account for Rooms](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). - -1. **Create room with Data.** - [Source.](./examples/Rooms/eg001CreateRoomWithDataController.ps1) - This example creates a new room in your DocuSign Rooms account to be used for a transaction. -1. **Create a room from a template.** - [Source.](./examples/Rooms/eg002CreateRoomWithTemplateController.ps1) - This example creates a new room using a template. -1. **Create room with Data.** - [Source.](./examples/Rooms/eg003ExportDataFromRoomController.ps1)) - This example exports all the avialalble data from a specific room in your DocuSign Rooms account. -1. **Add forms to a room.** - [Source.](./examples/Rooms/eg004AddFormsToRoomController.ps1) - This example adds a standard real estate related form to a specific room in your DocuSign Rooms account. -1. **How to search for rooms with filters.** - [Source.](./examples/Rooms/eg005GetRoomsWithFiltersController.ps1) - This example searches for rooms in your DocuSign Rooms account using a specific filter. -1. **Create an external form fillable session.** - [Source.](./examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1) - This example create an external form that can be filled using DocuSign for a specific room in your DocuSign Rooms account. -1. **Create a form group.** - [Source.](./examples/Rooms/eg007CreateFormGroup.ps1) - This example demonstrates how to create a form group for your DocuSign Rooms for Real Estate account. -1. **Grant office access to a form group.** - [Source.](./examples/Rooms/eg008AccessFormGroup.ps1) - This example demonstrates how to assign an office to a form group for your DocuSign Rooms for Real Estate account. -1. **Assign a form to a form group.** - [Source.](./examples/Rooms/eg009AssignFormGroup.ps1) - This example demonstrates how to assign a form to a form group for your DocuSign Rooms for Real Estate account. - -## Click API -**Note:** To use the Click API include the click_manage scope. Review the [Click API 101 Auth Guide](https://developers.docusign.com/docs/click-api/click101/auth) for more details. - -1. **Create clickwraps.** - [Source.](./examples/Click/eg001CreateClickwrap.ps1) - Creates a clickwrap that you can embed in your website or app. -1. **Activate clickwrap.** - [Source.](./examples/Click/eg002ActivateClickwrap.ps1) - Activates a new clickwrap. By default, new clickwraps are inactive. You must activate your clickwrap before you can use it. -1. **Clickwrap Versioning.** - [Source.](./examples/Click/eg003CreateNewClickwrapVersion.ps1) - Demonstrates how to use the Click API to create a new version of a clickwrap. -1. **Retrieve clickwraps.** - [Source.](./examples/Click/eg004GetListOfClickwraps.ps1) - Demonstrates how to get a list of clickwraps associated with a specific DocuSign user. -1. **Get clickwrap Responses.** - [Source.](./examples/Click/eg005GetClickwrapResponses.ps1) - Demonstrates how to get user responses to your clickwrap agreements. - -## Monitor API - -**Note:** To use the Monitor API you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). - -For more information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). - -1. **Get Monitoring Data.** - [Source.](./examples/Monitor/eg001GetMonitoringData.ps1) - - Demonstrates how to get and display all of your organization’s monitoring data. +## Click API + +For more information about the scopes used for obtaining authorization to use the Click API, see [Required scopes](https://developers.docusign.com/docs/click-api/click101/auth/#required-scopes). + +For a list of code examples that use the Click API, select the Python tab under [Examples and languages](https://developers.docusign.com/docs/click-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. + +## Monitor API +**Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). +For information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). +For a list of code examples that use the Monitor API, select the Python tab under [Examples and languages](https://developers.docusign.com/docs/monitor-api/how-to/code-launchers/#examples-and-languages) on the DocuSign Developer Center. ## Installation ### Prerequisites From 21bb7f18af0647eea4a5ab5c0f0dcbfec78a786a Mon Sep 17 00:00:00 2001 From: Aaron JacksonWilde Date: Thu, 3 Jun 2021 23:09:04 -0700 Subject: [PATCH 105/462] pr feedback changes --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6a67487..08c34fd 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # PowerShell Launcher Code Examples -### GitHub repo: [code-examples-powershell](./) +### GitHub repo: [code-examples-powershell](./README.md) This GitHub repo includes code example bash scripts for the DocuSign eSignature REST API, Rooms API, Click API, and Monitor API. To switch between API code examples, select the desired option from the menu when prompted. ## Introduction -This repo includes a PowerShell command-line that supports the following authentication workflows: +This repo includes a PowerShell command-line application that supports the following authentication workflows: * Authentication with DocuSign via [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode). When the token expires, the user is asked to re-authenticate. The refresh token is not used. @@ -20,26 +20,26 @@ When the token expires, it updates automatically. For more information about the scopes used for obtaining authorization to use the eSignature API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). -For a list of code examples that use the eSignature API, select the Python tab under [Examples and languages](https://developers.docusign.com/docs/esign-rest-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +For a list of code examples that use the eSignature API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/esign-rest-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. ## Rooms API **Note:** To use the Rooms API you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). -For a list of code examples that use the Rooms API, select the Python tab under [Examples and languages](https://developers.docusign.com/docs/rooms-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +For a list of code examples that use the Rooms API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/rooms-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. ## Click API For more information about the scopes used for obtaining authorization to use the Click API, see [Required scopes](https://developers.docusign.com/docs/click-api/click101/auth/#required-scopes). -For a list of code examples that use the Click API, select the Python tab under [Examples and languages](https://developers.docusign.com/docs/click-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +For a list of code examples that use the Click API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/click-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. ## Monitor API **Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). For information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). -For a list of code examples that use the Monitor API, select the Python tab under [Examples and languages](https://developers.docusign.com/docs/monitor-api/how-to/code-launchers/#examples-and-languages) on the DocuSign Developer Center. +For a list of code examples that use the Monitor API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/monitor-api/how-to/code-launchers/#examples-and-languages) on the DocuSign Developer Center. ## Installation ### Prerequisites From b01818e69831bf8527d1163613b767c5f84135bc Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Tue, 8 Jun 2021 16:51:04 -0700 Subject: [PATCH 106/462] Devdocs 4905 (#23) pr requested feedback --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 08c34fd..6c62b51 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ### GitHub repo: [code-examples-powershell](./README.md) -This GitHub repo includes code example bash scripts for the DocuSign eSignature REST API, Rooms API, Click API, and Monitor API. To switch between API code examples, select the desired option from the menu when prompted. +This GitHub repo includes code example PowerShell scripts for the DocuSign eSignature REST API, Rooms API, Click API, and Monitor API. To switch between API code examples, select the desired option from the menu when prompted. ## Introduction @@ -75,7 +75,8 @@ For a list of code examples that use the Monitor API, select the PowerShell tab **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. -1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. +1. In your command-line environment, switch to the folder: + `cd ` or `cd code-examples-powershell` 1. To configure the launcher for [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. @@ -89,7 +90,7 @@ For a list of code examples that use the Monitor API, select the PowerShell tab ### Installation steps for JWT Grant authentication -**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. Also, in order to select JSON Web Token authentication in the launcher, in config/settings.json, change the `quickstart` setting to `"false"`. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. 1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. @@ -103,6 +104,7 @@ For a list of code examples that use the Monitor API, select the PowerShell tab 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open** 1. Select an API when prompted in Windows PowerShell. 1. Select **JSON Web Token** when authenticating your account. +1. When prompted, log in to your DocuSign developer account. If this is your first time using the app, select **ACCEPT** at the consent window. 1. Select your desired code example. From dba50f13a5393e2e9cb6365b0cab9de5ffd4a04f Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Wed, 16 Jun 2021 18:13:39 -0700 Subject: [PATCH 107/462] small fixes after C# README --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6c62b51..e31bc84 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ For a list of code examples that use the Monitor API, select the PowerShell tab To use [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/), you will need an integration key and a secret key. See [Installation steps](#installation-steps) for details. - To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the API Username GUID of the impersonated user. See [Installation steps for JWT Grant authentication](#installation-steps-for-jwt-grant-authentication) for details. + To use [JWT Grant](https://developers.docusign.com/platform/auth/jwt/), you will need an integration key, an RSA key pair, and the User ID GUID of the impersonated user. See [Installation steps for JWT Grant authentication](#installation-steps-for-jwt-grant-authentication) for details. For both authentication flows: @@ -75,8 +75,7 @@ For a list of code examples that use the Monitor API, select the PowerShell tab **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. -1. In your command-line environment, switch to the folder: - `cd ` or `cd code-examples-powershell` +1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. 1. To configure the launcher for [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_AUTH_CODE`. 1. Generate a secret key, if you don’t already have one. Under **Authentication**, select **+ ADD SECRET KEY**. Copy the secret key and save it in settings.json as your `SECRET_KEY`. @@ -95,12 +94,12 @@ For a list of code examples that use the Monitor API, select the PowerShell tab 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. 1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. 1. To configure the launcher for [JWT Grant](https://developers.docusign.com/platform/auth/jwt/) authentication, create a copy of the file config/settings.example.json and save the copy as config/settings.json. - 1. Add your API Username. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **API Username** GUID and save it in settings.json as your `IMPERSONATION_USER_GUID`. + 1. Add your User ID. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **My Account Information**, copy the **User ID** GUID and save it in settings.json as your `IMPERSONATION_USER_GUID`. 1. Add your integration key. On the [Apps and Keys](https://admindemo.docusign.com/authenticate?goTo=apiIntegratorKey) page, under **Apps and Integration Keys**, choose the app to use, then select **Actions** > **Edit**. Under **General Info**, copy the **Integration Key** GUID and save it in settings.json as your `INTEGRATION_KEY_JWT`. 1. Generate an RSA key pair, if you don’t already have one. Under **Authentication**, select **+ GENERATE RSA**. Copy the private key and save it in a new file named config/private.key. 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. -**Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. +**Note:** Protect your personal information. Please make sure that your settings.json and private.key files will not be stored in your source code repository. 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open** 1. Select an API when prompted in Windows PowerShell. 1. Select **JSON Web Token** when authenticating your account. From d6b16056f6580e65ed90fe79eec6d0e2f861b3b2 Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Mon, 30 Aug 2021 17:59:14 -0700 Subject: [PATCH 108/462] Admin API Code Examples (#26) Co-authored-by: Karissa Jacobsen Co-authored-by: Paige Rossi Co-authored-by: Serhii Ovsianikov Co-authored-by: meihDS <70775251+meihDS@users.noreply.github.com> --- OAuth/code_grant.ps1 | 5 +- OAuth/jwt.ps1 | 5 +- README.md | 8 + bulkexport.csv | Bin 0 -> 692 bytes config/settings.example.json | 4 +- .../eg001CreateNewUserWithActiveStatus.ps1 | 97 ++++++++++ .../Admin/eg002CreateActiveCLMEsignUser.ps1 | 176 ++++++++++++++++++ examples/Admin/eg003BulkExportUserData.ps1 | 86 +++++++++ examples/Admin/eg004AddUsersViaBulkImport.ps1 | 51 +++++ examples/Admin/eg005AuditUsers.ps1 | 75 ++++++++ launcher.ps1 | 142 +++++++++++--- 11 files changed, 617 insertions(+), 32 deletions(-) create mode 100644 bulkexport.csv create mode 100644 examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 create mode 100644 examples/Admin/eg002CreateActiveCLMEsignUser.ps1 create mode 100644 examples/Admin/eg003BulkExportUserData.ps1 create mode 100644 examples/Admin/eg004AddUsersViaBulkImport.ps1 create mode 100644 examples/Admin/eg005AuditUsers.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 483d87e..667c4e7 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -26,14 +26,15 @@ elseif ($apiVersion -eq "click") { elseif ($apiVersion -eq "monitor") { $scopes = "signature impersonation" } +elseif ($apiVersion -eq "admin") { + $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read" +} $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $redirectUri = "http://${IP}:${PORT}/authorization-code/callback" $redirectUriEscaped = [Uri]::EscapeDataString($redirectURI) $authorizationURL = "${authorizationEndpoint}auth?response_type=code&scope=$scopes&client_id=$clientId&state=$state&redirect_uri=$redirectUriEscaped" -Write-Output "The authorization URL is:" -Write-Output $authorizationURL # Request the authorization code # Use Http Server diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index be9f66d..527d70c 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -37,7 +37,10 @@ if ($apiVersion -eq "rooms") { $scopes = "click.manage" } elseif ($apiVersion -eq "monitor") { - $scopes = "signature%20impersonation" + $scopes = "signature%20impersonation" + } + elseif ($apiVersion -eq "admin") { + $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read" } # Step 1. Request application consent diff --git a/README.md b/README.md index e31bc84..7b932bf 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,14 @@ For more information about the scopes used for obtaining authorization to use th For a list of code examples that use the Click API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/click-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +## Admin API + +**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). + +For more information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). + +For a list of code examples that use the Admin API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/admin-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. + ## Monitor API **Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). For information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). diff --git a/bulkexport.csv b/bulkexport.csv new file mode 100644 index 0000000000000000000000000000000000000000..be09de1168eaf30b94c40e3f71ad3a2aaf9f5ba9 GIT binary patch literal 692 zcma));ZB1<5QOJh`rAMH1`SqILk+R|0M~+*q)-FJgqK&pJ=hvBCgwsoW_IUhhx__m zXsc3Z65*j3s^pRL}|dMAT bulkexport.csv diff --git a/examples/Admin/eg004AddUsersViaBulkImport.ps1 b/examples/Admin/eg004AddUsersViaBulkImport.ps1 new file mode 100644 index 0000000..1ae1437 --- /dev/null +++ b/examples/Admin/eg004AddUsersViaBulkImport.ps1 @@ -0,0 +1,51 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# Construct your API headers +# Step 2 start +$headers1 = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers1.add("Authorization","Bearer ${accessToken}") +$headers1.add("Content-Disposition", "filename=bulkimport.csv") +$headers1.add("Content-Type","text/csv") + +$headers2 = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers2.add("Authorization","Bearer ${accessToken}") +# Step end + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# Check that we have an organization id in the settings.json config file +if (!$variables.ORGANIZATION_ID) { + Write-Output "Organization ID is needed. Please add the ORGANIZATION_ID variable to the settings.json" + exit -1 +} + +$base_path = "https://api-d.docusign.net/management" +$organizationId = $variables.ORGANIZATION_ID + +# Create the bulk import request +# Step 3 start +$body = @" +AccountID,AccountName,FirstName,LastName,UserEmail,eSignPermissionProfile,Group,Language,UserTitle,CompanyName,AddressLine1,AddressLine2,City,StateRegionProvince,PostalCode,Phone,LoginPolicy,AutoActivate +$accountId,Sample Account,John,Markson,user1email@example.com,Account Administrator,Everyone,en,Mr.,Some Division,123 4th St,Suite C1,Seattle,WA,8178,2065559999,fedAuthRequired,true +$accountId,Sample Account,Jill,Smith,user2email@example.com,Account Administrator,Everyone,en,Mr.,Some Division,123 4th St,Suite C1,Seattle,WA,8178,2065559999,fedAuthRequired,true +$accountId,Sample Account,James,Grayson,user3emailt@example.com,Account Administrator,Everyone,en,Mr.,Some Division,123 4th St,Suite C1,Seattle,WA,8178,2065559999,fedAuthRequired,true +"@ + +$uri1 = "${base_path}/v2/organizations/$organizationId/imports/bulk_users/add" +$result1 = Invoke-WebRequest -headers $headers1 -Uri $uri1 -body $body -Method POST +$result1.Content +$results = $result1 | ConvertFrom-Json +$importId = $results.id +# Step 3 end + +# Check the request status +Write-Output "Sleep 20 seconds..." +Start-Sleep 20 +# Step 4 start +$uri2 = "${base_path}/v2/organizations/$organizationId/imports/bulk_users/$importId" +$result2 = Invoke-WebRequest -headers $headers2 -Uri $uri2 -Method GET +$result2.Content +# Step 4 end diff --git a/examples/Admin/eg005AuditUsers.ps1 b/examples/Admin/eg005AuditUsers.ps1 new file mode 100644 index 0000000..8595eac --- /dev/null +++ b/examples/Admin/eg005AuditUsers.ps1 @@ -0,0 +1,75 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +$base_path = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +# Check that organizationId has been set +if($null -eq $organizationId) +{ + Write-Output "PROBLEM: Please add your ORGANIZATION_ID to settings.json." + Exit +} + +# Construct your API headers +# Step 2 start +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") +# Step 2 end + +# Step 3 Start +$modifiedSince = (Get-Date (Get-Date).AddDays(-10) -Format "yyyy-MM-dd") + +try { + # Display the JSON response + Write-Output "Response:" + $uri = "${base_path}/management/v2/organizations/${organizationId}/users?account_id=${APIAccountId}&last_modified_since=${modifiedSince}" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + $modifiedUsers = $($response.Content | ConvertFrom-Json).users +} +catch { + Write-Output "Error:" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} +# Step 3 end + +# Step 4 start +$userEmails = $modifiedUsers.email +# Step 4 end + +# Step 5 start +foreach ($emailAddress in $userEmails){ + try { + # Display the JSON response + Write-Output "Response:" + $uri = "${base_path}/management/v2/organizations/${organizationId}/users/profile?email=${emailAddress}" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + } + catch { + Write-Output "Error:" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 + } +} +# Step 5 end \ No newline at end of file diff --git a/launcher.ps1 b/launcher.ps1 index 371afd0..50e219e 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -11,19 +11,49 @@ if ((Test-Path $configFile) -eq $False) { # Get required environment variables from .\config\settings.json file $config = Get-Content $configFile -Raw | ConvertFrom-Json -function checkCC{ - -# Fill in Quickstart Carbon Copy config values -if($config.CC_EMAIL -eq "{CC_EMAIL}" ){ - Write-Output "It looks like this is your first time running the launcher from Quickstart. " - $config.CC_EMAIL = Read-Host "Enter a CC email address to receive copies of envelopes" - $config.CC_NAME = Read-Host "Enter a name for your CC recipient" - Write-Output "" - write-output $config | ConvertTo-Json | Set-Content $configFile +function checkCC { + + # Fill in Quickstart Carbon Copy config values + if ($config.CC_EMAIL -eq "{CC_EMAIL}" ) { + Write-Output "It looks like this is your first time running the launcher from Quickstart. " + $config.CC_EMAIL = Read-Host "Enter a CC email address to receive copies of envelopes" + $config.CC_NAME = Read-Host "Enter a name for your CC recipient" + Write-Output "" + write-output $config | ConvertTo-Json | Set-Content $configFile } } +function checkOrgId { + + if ($config.ORGANIZATION_ID -eq "{ORGANIZATION_ID}" ) { + Write-Output "No Organization Id in the config file. Looking for one via the API" + # Get required environment variables from .\config\settings.json file + $accessToken = Get-Content .\config\ds_access_token.txt + + $base_path = "https://api-d.docusign.net/management" + + $response = New-TemporaryFile + Invoke-RestMethod ` + -Uri "$base_path/v2/organizations" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + + $organizationId = $(Get-Content $response | ConvertFrom-Json).organizations[0].id + + $config.ORGANIZATION_ID = $organizationId + write-output $config | ConvertTo-Json | Set-Content $configFile + Write-Output "Organization id has been written to config file..." + Remove-Item $response + + } +} + + function startLauncher { do { # Preparing list of Api @@ -32,34 +62,35 @@ function startLauncher { Rooms = 2; Click = 3; Monitor = 4; - Exit = 5; + Admin = 5; + Exit = 6; } $listApiView = $null; # Load via Quickstart - if($config.QUICKSTART -eq "true" ){ - if ($null -eq $firstPassComplete){ - Write-Output '' - Write-Output "Quickstart Enabled, please wait" - write-Output '' - powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") + if ($config.QUICKSTART -eq "true" ) { + if ($null -eq $firstPassComplete) { + Write-Output '' + Write-Output "Quickstart Enabled, please wait" + write-Output '' + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") - if ((Test-Path "./config/ds_access_token.txt") -eq $true) { - powershell.exe -Command .\eg001EmbeddedSigning.ps1 + if ((Test-Path "./config/ds_access_token.txt") -eq $true) { + powershell.exe -Command .\eg001EmbeddedSigning.ps1 - # This is to prevent getting stuck on the - # first example after trying it the first time - $firstPassComplete = "true" + # This is to prevent getting stuck on the + # first example after trying it the first time + $firstPassComplete = "true" - startSignature - } - else { - Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + startSignature + } + else { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } } } - } do { Write-Output '' Write-Output 'Choose API: ' @@ -67,6 +98,7 @@ function startLauncher { Write-Output "$([int][listApi]::Rooms)) Rooms" Write-Output "$([int][listApi]::Click)) Click" Write-Output "$([int][listApi]::Monitor)) Monitor" + Write-Output "$([int][listApi]::Admin)) Admin" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); @@ -83,6 +115,9 @@ function startLauncher { elseif ($listApiView -eq [listApi]::Monitor) { startAuth "monitor" } + elseif ($listApiView -eq [listApi]::Admin) { + startAuth "admin" + } elseif ($listApiView -eq [listApi]::Exit) { exit 1 } @@ -98,8 +133,7 @@ function startAuth ($apiVersion) { } $AuthTypeView = $null; - if ($apiVersion -eq "monitor") - { + if ($apiVersion -eq "monitor") { $AuthTypeView = [AuthType]::JWT; # Monitor API only supports JWT } else { @@ -141,6 +175,9 @@ function startAuth ($apiVersion) { elseif ($listApiView -eq [listApi]::Monitor) { startMonitor } + elseif ($listApiView -eq [listApi]::Admin) { + startAdmin + } } function startSignature { @@ -475,5 +512,54 @@ function startMonitor { startLauncher } +function startAdmin { + do { + Enum listAdminExamples { + createNewUserWithActiveStatus = 1; + createActiveCLMEsignUser = 2; + bulkExportUserData = 3; + addUsersViaBulkImport = 4; + auditUsers = 5 + Home = 6; + } + $listAdminExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listAdminExamples]::createNewUserWithActiveStatus)) Create a new user with active status" + Write-Output "$([int][listAdminExamples]::createActiveCLMEsignUser)) Create an active CLM and ESign user" + Write-Output "$([int][listAdminExamples]::bulkExportUserData)) Bulk-export user data" + Write-Output "$([int][listAdminExamples]::addUsersViaBulkImport)) Add users via bulk import" + Write-Output "$([int][listAdminExamples]::auditUsers)) Audit users" + Write-Output "$([int][listAdminExamples]::Home)) Home" + [int]$listAdminExamplesView = Read-Host "Select the action" + } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); + + if ($listAdminExamplesView -eq [listAdminExamples]::createNewUserWithActiveStatus) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg001CreateNewUserWithActiveStatus.ps1 + + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::createActiveCLMEsignUser) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg002createActiveCLMEsignUser.ps1 + + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::bulkExportUserData) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg003BulkExportUserData.ps1 + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::addUsersViaBulkImport) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg004AddUsersViaBulkImport.ps1 + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::auditUsers) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg005AuditUsers.ps1 + } + } until ($listAdminExamplesView -eq [listAdminExamples]::Home) + startLauncher +} + Write-Output "Welcome to the DocuSign PowerShell Launcher" startLauncher From 773b8b15c1644da6bfcac83b2c1de35f93848852 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 14 Sep 2021 14:55:54 -0700 Subject: [PATCH 109/462] Unified recipient auth - updating by removing example 21 and making example 20 the new unified auth --- ...igningViaEmailWithPhoneAuthentication.ps1} | 29 +++--- ...20SigningViaEmailWithSmsAuthentication.ps1 | 94 ------------------- launcher.ps1 | 9 +- 3 files changed, 19 insertions(+), 113 deletions(-) rename examples/eSignature/{eg021SigningViaEmailWithPhoneAuthentication.ps1 => eg020SigningViaEmailWithPhoneAuthentication.ps1} (82%) delete mode 100644 examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1 diff --git a/examples/eSignature/eg021SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 similarity index 82% rename from examples/eSignature/eg021SigningViaEmailWithPhoneAuthentication.ps1 rename to examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index 2938a72..89a601e 100644 --- a/examples/eSignature/eg021SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -33,9 +33,9 @@ $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -$PHONE_NUMBER = $(Read-Host "Please enter a phone number for recipient authentication [415-555-1212]" -if ($PHONE_NUMBER) {$PHONE_NUMBER} else {'415-555-1212'} -) +$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country country code for recipient authentication for the signer" + +$SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" # Construct your envelope JSON body $body = @" { @@ -70,15 +70,20 @@ $body = @" "templateAccessCodeRequired": null, "deliveryMethod": "email", "recipientId": "1", - "phoneAuthentication": { - "recordVoicePrint": false, - "validateRecipProvidedNumber": false, - "recipMayProvideNumber": true, - "senderProvidedNumbers": ["$PHONE_NUMBER"] - }, - "smsAuthentication": null, - "idCheckConfigurationName": "Phone Auth $", - "requireIdLookup": true + "requireIdLookup": true, + "identityVerification":{ + "workflowId":"c368e411-1592-4001-a3df-dca94ac539ae", + "steps":null,"inputOptions":[ + {"name":"phone_number_list", + "valueType":"PhoneNumberList", + "phoneNumberList":[ + { + "countryCode":"$SIGNER_COUNTRY_CODE", + "number":"$SIGNER_PHONE_NUMBER" + } + ] + }] + } }] }, "status": "Sent" diff --git a/examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1 deleted file mode 100644 index a96f89b..0000000 --- a/examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1 +++ /dev/null @@ -1,94 +0,0 @@ -# https://developers.docusign.com/docs/esign-rest-api/how-to/sms-auth/ - -# Get required environment variables from .\config\settings.json file -$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -$SIGNER_EMAIL = $variables.SIGNER_EMAIL -$SIGNER_NAME = $variables.SIGNER_NAME - -# Get the envelope's custom field data -# This script uses the envelope ID stored in ../envelope_id. -# The envelope_id file is created by example eg016SetTabValues.ps1 or -# can be manually created. - -# Step 1: Obtain your OAuth token -# Note: Substitute these values with your own -$oAuthAccessToken = Get-Content .\config\ds_access_token.txt - -#Set up variables for full code example -# Note: Substitute these values with your own -$APIAccountId = Get-Content .\config\API_ACCOUNT_ID - -# Construct your API headers -$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" -$headers.add("Authorization", "Bearer $oAuthAccessToken") -$headers.add("Accept", "application/json") -$headers.add("Content-Type", "application/json") - -# temp files: -$docBase64 = New-TemporaryFile - -# Fetch docs and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 - -$PHONE_NUMBER = $(Read-Host "Please enter an SMS number for recipient authentication [415-555-1212]" -if ($PHONE_NUMBER){$PHONE_NUMBER} else {'415-555-1212'} -) -# Construct your envelope JSON body -$body = @" -{ - "documents": [{ - "documentBase64": "$(Get-Content $docBase64)", - "documentId": "1", - "fileExtension": "pdf", - "name": "Terms of Service" - }], - "emailBlurb": "Sample text for email body", - "emailSubject": "Please Sign", - "envelopeIdStamping": "true", - "recipients": { - "signers": [{ - "name": "$SIGNER_NAME", - "email": "$SIGNER_EMAIL", - "roleName": "", - "note": "", - "routingOrder": 3, - "status": "created", - "templateAccessCodeRequired": null, - "deliveryMethod": "email", - "recipientId": "1", - "accessCode": "", - "smsAuthentication": { - "senderProvidedNumbers": ["$PHONE_NUMBER"] - }, - "idCheckConfigurationName": "SMS Auth $", - "requireIdLookup": true - }] - }, - "status": "Sent" -} -"@ -Write-Output "" -Write-Output "Request: " -Write-Output $body - -$uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIAccountId}/envelopes" - -# a) Make a POST call to the createEnvelopes endpoint to create a new envelope. -# b) Display the JSON structure of the created envelope -try { - Write-Output "Response:" - $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST - $result.content -} -catch { - $int = 0 - foreach ($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } - $int++ - } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line -} - -# cleanup -Remove-Item $docBase64 \ No newline at end of file diff --git a/launcher.ps1 b/launcher.ps1 index 50e219e..670337e 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -203,8 +203,7 @@ function startSignature { Set_Template_Tab_Values = 17; Envelope_Custom_Field_Data = 18; Signing_Via_Email_With_Access_Code = 19; - Signing_Via_Email_With_Sms_Authentication = 20; - Signing_Via_Email_With_Phone_Authentication = 21; + Signing_Via_Email_With_Phone_Authentication = 20; Signing_Via_Email_With_Knowledge_Based_Authentication = 22; Signing_Via_Email_With_IDV_Authentication = 23; Creating_Permission_Profiles = 24; @@ -245,7 +244,6 @@ function startSignature { Write-Output "$([int][ApiExamples]::Set_Template_Tab_Values)) Set_Template_Tab_Values" Write-Output "$([int][ApiExamples]::Envelope_Custom_Field_Data)) Envelope_Custom_Field_Data" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Access_Code)) Signing_Via_Email_With_Access_Code" - Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Sms_Authentication)) Signing_Via_Email_With_Sms_Authentication" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Phone_Authentication)) Signing_Via_Email_With_Phone_Authentication" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication)) Signing_Via_Email_With_Knowledge_Based_Authentication" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_IDV_Authentication)) Signing_Via_Email_With_IDV_Authentication" @@ -329,11 +327,8 @@ function startSignature { elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Access_Code) { powershell.exe .\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1 } - elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Sms_Authentication) { - powershell.exe .\examples\eSignature\eg020SigningViaEmailWithSmsAuthentication.ps1 - } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Phone_Authentication) { - powershell.exe .\examples\eSignature\eg021SigningViaEmailWithPhoneAuthentication.ps1 + powershell.exe .\examples\eSignature\eg020SigningViaEmailWithPhoneAuthentication.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 From ff895f9796bd3436cedc7f1810f91628e2c5c568 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 14 Sep 2021 15:47:00 -0700 Subject: [PATCH 110/462] delete duplicate country --- .../eg020SigningViaEmailWithPhoneAuthentication.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index 89a601e..a88aea1 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -33,7 +33,7 @@ $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country country code for recipient authentication for the signer" +$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient authentication for the signer" $SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" # Construct your envelope JSON body @@ -112,4 +112,4 @@ catch { } # cleanup -Remove-Item $docBase64 \ No newline at end of file +Remove-Item $docBase64 From d87f8993c847c814783e180283dc1ac6ca984d6e Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 14 Sep 2021 16:15:13 -0700 Subject: [PATCH 111/462] Adding input fields for name and email address --- .../eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index 89a601e..d5e8aa8 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -32,6 +32,9 @@ $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +$SIGNER_NAME = Read-Host "Please enter name for the signer" + +$SIGNER_EMAIL = Read-Host "Please enter email address for the signer" $SIGNER_COUNTRY_CODE = Read-Host "Please enter a country country code for recipient authentication for the signer" From 05d8039d6a55e9a8c5ec8510a75094a49948530c Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 15 Sep 2021 11:05:31 -0700 Subject: [PATCH 112/462] Fixing "KBA" issue Mei found --- .../eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index 4091ec8..d2d45db 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -73,7 +73,6 @@ $body = @" "templateAccessCodeRequired": null, "deliveryMethod": "email", "recipientId": "1", - "requireIdLookup": true, "identityVerification":{ "workflowId":"c368e411-1592-4001-a3df-dca94ac539ae", "steps":null,"inputOptions":[ From 614f922a22720db18e67fccc57f33760451cfa3f Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 21 Sep 2021 17:07:37 -0700 Subject: [PATCH 113/462] updated examples api blurb --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7b932bf..4ba7a7f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ### GitHub repo: [code-examples-powershell](./README.md) -This GitHub repo includes code example PowerShell scripts for the DocuSign eSignature REST API, Rooms API, Click API, and Monitor API. To switch between API code examples, select the desired option from the menu when prompted. +This GitHub repo includes code examples for the DocuSign Admin API, Click API, eSignature REST API, Monitor API, and Rooms API. To switch between API code examples, select the desired option from the menu when prompted. ## Introduction @@ -37,7 +37,7 @@ For a list of code examples that use the Click API, select the PowerShell tab un ## Admin API -**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). +**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). For more information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). From 4f15d72d2cc07aefc9c379e5bda899a89f5a0d96 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 21 Sep 2021 17:08:15 -0700 Subject: [PATCH 114/462] updated examples api blurb --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7b932bf..c7453eb 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ### GitHub repo: [code-examples-powershell](./README.md) -This GitHub repo includes code example PowerShell scripts for the DocuSign eSignature REST API, Rooms API, Click API, and Monitor API. To switch between API code examples, select the desired option from the menu when prompted. +This GitHub repo includes code examples for the DocuSign Admin API, Click API, eSignature REST API, Monitor API, and Rooms API. To switch between API code examples, select the desired option from the menu when prompted. ## Introduction @@ -37,7 +37,7 @@ For a list of code examples that use the Click API, select the PowerShell tab un ## Admin API -**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). +**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). For more information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). From 03e8a174c778fbcd45cc0e11ec176e7e39b7921e Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Oct 2021 15:19:18 -0700 Subject: [PATCH 115/462] update step comments --- .../eg001CreateNewUserWithActiveStatus.ps1 | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 b/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 index 1c08178..6bdff70 100644 --- a/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 +++ b/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 @@ -22,11 +22,12 @@ $base_path = "https://api-d.docusign.net/management" $organizationId = $variables.ORGANIZATION_ID # Get groups and permission profile IDs - +# Step 3 start $uri = "${base_path}/v2/organizations/${organizationId}/accounts/${accountId}/permissions" $result = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $permissionsObj = $($result.Content | ConvertFrom-Json).permissions +# Step 3 end # Setup a temporary menu option to pick a permission profile $menu = @{} @@ -38,12 +39,12 @@ $menu = @{} } while ($selection -gt $permissionsObj.count -or $selection -lt 1); $permissionsId = $menu.Item($selection) - +# Step 4 start $uri = "${base_path}/v2/organizations/${organizationId}/accounts/${accountId}/groups" $result = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $groupsObj = $($result.Content | ConvertFrom-Json).groups - +# Step 4 end # Setup a temporary menu option to pick a group $menu = @{} @@ -55,15 +56,13 @@ $menu = @{} } while ($selection -gt $groupsObj.count -or $selection -lt 1); $groupId = $menu.Item($selection) - - $userName = Read-Host "Enter a username for the new user" $firstName = Read-Host "Enter the first name of the new user" $lastName = Read-Host "Enter the last name of the new user" $userEmail = Read-Host "Enter an email for the new user" # Construct the request body for the new user -# Step 3 start +# Step 5 start $body = @" { "user_name": "$userName", @@ -86,12 +85,12 @@ $body = @" ] } "@ -# Step 3 end +# Step 5 end $result = "" # Call the DocuSign Admin API -# Step 4 start +# Step 6 start $uri = "${base_path}/v2/organizations/${organizationId}/users" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method POST $result.Content -# Step 4 end +# Step 6 end From 6e77aeb383ea90d4930e5b5ebc5eeb9f4209c198 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 8 Oct 2021 16:44:32 -0700 Subject: [PATCH 116/462] Update the eSignature examples for the new Phone Auth that replaces Phone Call and SMS Recipient Auth code examples. --- README.md | 2 +- .../eg001CreateNewUserWithActiveStatus.ps1 | 17 ++-- ...igningViaEmailWithPhoneAuthentication.ps1} | 33 ++++--- ...20SigningViaEmailWithSmsAuthentication.ps1 | 94 ------------------- launcher.ps1 | 9 +- 5 files changed, 32 insertions(+), 123 deletions(-) rename examples/eSignature/{eg021SigningViaEmailWithPhoneAuthentication.ps1 => eg020SigningViaEmailWithPhoneAuthentication.ps1} (79%) delete mode 100644 examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1 diff --git a/README.md b/README.md index c7453eb..4ba7a7f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ### GitHub repo: [code-examples-powershell](./README.md) -This GitHub repo includes code examples for the DocuSign Admin API, Click API, eSignature REST API, Monitor API, and Rooms API. To switch between API code examples, select the desired option from the menu when prompted. +This GitHub repo includes code examples for the DocuSign Admin API, Click API, eSignature REST API, Monitor API, and Rooms API. To switch between API code examples, select the desired option from the menu when prompted. ## Introduction diff --git a/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 b/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 index 6bdff70..1c08178 100644 --- a/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 +++ b/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 @@ -22,12 +22,11 @@ $base_path = "https://api-d.docusign.net/management" $organizationId = $variables.ORGANIZATION_ID # Get groups and permission profile IDs -# Step 3 start + $uri = "${base_path}/v2/organizations/${organizationId}/accounts/${accountId}/permissions" $result = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $permissionsObj = $($result.Content | ConvertFrom-Json).permissions -# Step 3 end # Setup a temporary menu option to pick a permission profile $menu = @{} @@ -39,12 +38,12 @@ $menu = @{} } while ($selection -gt $permissionsObj.count -or $selection -lt 1); $permissionsId = $menu.Item($selection) -# Step 4 start + $uri = "${base_path}/v2/organizations/${organizationId}/accounts/${accountId}/groups" $result = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $groupsObj = $($result.Content | ConvertFrom-Json).groups -# Step 4 end + # Setup a temporary menu option to pick a group $menu = @{} @@ -56,13 +55,15 @@ $menu = @{} } while ($selection -gt $groupsObj.count -or $selection -lt 1); $groupId = $menu.Item($selection) + + $userName = Read-Host "Enter a username for the new user" $firstName = Read-Host "Enter the first name of the new user" $lastName = Read-Host "Enter the last name of the new user" $userEmail = Read-Host "Enter an email for the new user" # Construct the request body for the new user -# Step 5 start +# Step 3 start $body = @" { "user_name": "$userName", @@ -85,12 +86,12 @@ $body = @" ] } "@ -# Step 5 end +# Step 3 end $result = "" # Call the DocuSign Admin API -# Step 6 start +# Step 4 start $uri = "${base_path}/v2/organizations/${organizationId}/users" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method POST $result.Content -# Step 6 end +# Step 4 end diff --git a/examples/eSignature/eg021SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 similarity index 79% rename from examples/eSignature/eg021SigningViaEmailWithPhoneAuthentication.ps1 rename to examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index 2938a72..d2d45db 100644 --- a/examples/eSignature/eg021SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -32,10 +32,13 @@ $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +$SIGNER_NAME = Read-Host "Please enter name for the signer" -$PHONE_NUMBER = $(Read-Host "Please enter a phone number for recipient authentication [415-555-1212]" -if ($PHONE_NUMBER) {$PHONE_NUMBER} else {'415-555-1212'} -) +$SIGNER_EMAIL = Read-Host "Please enter email address for the signer" + +$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient authentication for the signer" + +$SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" # Construct your envelope JSON body $body = @" { @@ -70,15 +73,19 @@ $body = @" "templateAccessCodeRequired": null, "deliveryMethod": "email", "recipientId": "1", - "phoneAuthentication": { - "recordVoicePrint": false, - "validateRecipProvidedNumber": false, - "recipMayProvideNumber": true, - "senderProvidedNumbers": ["$PHONE_NUMBER"] - }, - "smsAuthentication": null, - "idCheckConfigurationName": "Phone Auth $", - "requireIdLookup": true + "identityVerification":{ + "workflowId":"c368e411-1592-4001-a3df-dca94ac539ae", + "steps":null,"inputOptions":[ + {"name":"phone_number_list", + "valueType":"PhoneNumberList", + "phoneNumberList":[ + { + "countryCode":"$SIGNER_COUNTRY_CODE", + "number":"$SIGNER_PHONE_NUMBER" + } + ] + }] + } }] }, "status": "Sent" @@ -107,4 +114,4 @@ catch { } # cleanup -Remove-Item $docBase64 \ No newline at end of file +Remove-Item $docBase64 diff --git a/examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1 deleted file mode 100644 index a96f89b..0000000 --- a/examples/eSignature/eg020SigningViaEmailWithSmsAuthentication.ps1 +++ /dev/null @@ -1,94 +0,0 @@ -# https://developers.docusign.com/docs/esign-rest-api/how-to/sms-auth/ - -# Get required environment variables from .\config\settings.json file -$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -$SIGNER_EMAIL = $variables.SIGNER_EMAIL -$SIGNER_NAME = $variables.SIGNER_NAME - -# Get the envelope's custom field data -# This script uses the envelope ID stored in ../envelope_id. -# The envelope_id file is created by example eg016SetTabValues.ps1 or -# can be manually created. - -# Step 1: Obtain your OAuth token -# Note: Substitute these values with your own -$oAuthAccessToken = Get-Content .\config\ds_access_token.txt - -#Set up variables for full code example -# Note: Substitute these values with your own -$APIAccountId = Get-Content .\config\API_ACCOUNT_ID - -# Construct your API headers -$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" -$headers.add("Authorization", "Bearer $oAuthAccessToken") -$headers.add("Accept", "application/json") -$headers.add("Content-Type", "application/json") - -# temp files: -$docBase64 = New-TemporaryFile - -# Fetch docs and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 - -$PHONE_NUMBER = $(Read-Host "Please enter an SMS number for recipient authentication [415-555-1212]" -if ($PHONE_NUMBER){$PHONE_NUMBER} else {'415-555-1212'} -) -# Construct your envelope JSON body -$body = @" -{ - "documents": [{ - "documentBase64": "$(Get-Content $docBase64)", - "documentId": "1", - "fileExtension": "pdf", - "name": "Terms of Service" - }], - "emailBlurb": "Sample text for email body", - "emailSubject": "Please Sign", - "envelopeIdStamping": "true", - "recipients": { - "signers": [{ - "name": "$SIGNER_NAME", - "email": "$SIGNER_EMAIL", - "roleName": "", - "note": "", - "routingOrder": 3, - "status": "created", - "templateAccessCodeRequired": null, - "deliveryMethod": "email", - "recipientId": "1", - "accessCode": "", - "smsAuthentication": { - "senderProvidedNumbers": ["$PHONE_NUMBER"] - }, - "idCheckConfigurationName": "SMS Auth $", - "requireIdLookup": true - }] - }, - "status": "Sent" -} -"@ -Write-Output "" -Write-Output "Request: " -Write-Output $body - -$uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIAccountId}/envelopes" - -# a) Make a POST call to the createEnvelopes endpoint to create a new envelope. -# b) Display the JSON structure of the created envelope -try { - Write-Output "Response:" - $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST - $result.content -} -catch { - $int = 0 - foreach ($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } - $int++ - } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line -} - -# cleanup -Remove-Item $docBase64 \ No newline at end of file diff --git a/launcher.ps1 b/launcher.ps1 index 50e219e..670337e 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -203,8 +203,7 @@ function startSignature { Set_Template_Tab_Values = 17; Envelope_Custom_Field_Data = 18; Signing_Via_Email_With_Access_Code = 19; - Signing_Via_Email_With_Sms_Authentication = 20; - Signing_Via_Email_With_Phone_Authentication = 21; + Signing_Via_Email_With_Phone_Authentication = 20; Signing_Via_Email_With_Knowledge_Based_Authentication = 22; Signing_Via_Email_With_IDV_Authentication = 23; Creating_Permission_Profiles = 24; @@ -245,7 +244,6 @@ function startSignature { Write-Output "$([int][ApiExamples]::Set_Template_Tab_Values)) Set_Template_Tab_Values" Write-Output "$([int][ApiExamples]::Envelope_Custom_Field_Data)) Envelope_Custom_Field_Data" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Access_Code)) Signing_Via_Email_With_Access_Code" - Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Sms_Authentication)) Signing_Via_Email_With_Sms_Authentication" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Phone_Authentication)) Signing_Via_Email_With_Phone_Authentication" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication)) Signing_Via_Email_With_Knowledge_Based_Authentication" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_IDV_Authentication)) Signing_Via_Email_With_IDV_Authentication" @@ -329,11 +327,8 @@ function startSignature { elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Access_Code) { powershell.exe .\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1 } - elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Sms_Authentication) { - powershell.exe .\examples\eSignature\eg020SigningViaEmailWithSmsAuthentication.ps1 - } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Phone_Authentication) { - powershell.exe .\examples\eSignature\eg021SigningViaEmailWithPhoneAuthentication.ps1 + powershell.exe .\examples\eSignature\eg020SigningViaEmailWithPhoneAuthentication.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 From 07c421654c7a79350edfdd21d3a5dd233dcccd68 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 4 Nov 2021 15:30:15 -0700 Subject: [PATCH 117/462] Updating both examples 20 (Phone Auth) and 23 (IDV) to correctly find the workflowID as needed (DEVDOCS-6118 and DEVDOCS-6127) --- ...SigningViaEmailWithPhoneAuthentication.ps1 | 27 +++++++++++++-- ...23SigningViaEmailWithIDVAuthentication.ps1 | 34 ++++++++----------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index d2d45db..c6c184c 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -27,10 +27,27 @@ $docBase64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 # Construct your API headers +# Step 2 start $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 end + +# - Obtain your workflow ID +# Step 3 start +$uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" + +Write-Output "Attempting to retrieve your account's workflow ID" + +Write-Output "Response:" +$result = Invoke-RestMethod -uri $uri -headers $headers -method GET +$result.content +#Obtain the workflow ID from the API response +$workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "Phone Authentication"}).workflowId +# Step 3 end + + $SIGNER_NAME = Read-Host "Please enter name for the signer" @@ -40,6 +57,7 @@ $SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient auth $SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" # Construct your envelope JSON body +# Step 4 start $body = @" { "documents": [{ @@ -66,15 +84,15 @@ $body = @" "pageNumber": "1", "recipientId": "1", "tabLabel": "SignHereTab", - "xPosition": "75", - "yPosition": "572" + "xPosition": "200", + "yPosition": "160" }] }, "templateAccessCodeRequired": null, "deliveryMethod": "email", "recipientId": "1", "identityVerification":{ - "workflowId":"c368e411-1592-4001-a3df-dca94ac539ae", + "workflowId":"$workflowId", "steps":null,"inputOptions":[ {"name":"phone_number_list", "valueType":"PhoneNumberList", @@ -91,12 +109,14 @@ $body = @" "status": "Sent" } "@ +# Step 4 end Write-Output "" Write-Output "Request: " Write-Output $body # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope +# Step 5 start $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -112,6 +132,7 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 5 end # cleanup Remove-Item $docBase64 diff --git a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 index 8df5d62..3171844 100644 --- a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 +++ b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -26,38 +26,31 @@ $docBase64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 # - Construct your API headers +# Step 2 start $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json, text/plain, */*") $headers.add("Content-Type", "application/json;charset=UTF-8") $headers.add("Accept-Encoding", "gzip, deflate, br") $headers.add("Accept-Language", "en-US,en;q=0.9") +# Step 2 end # - Obtain your workflow ID +# Step 3 start $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" Write-Output "Attempting to retrieve your account's workflow ID" -try { - Write-Output "Response:" - $result = Invoke-RestMethod -uri $uri -headers $headers -method GET - $result.content - #Obtain the workflow ID from the API response - $workflowId = $result.identityVerification.workflowId -} -catch { - $int = 0 - foreach ($header in $_.Exception.Response.Headers) { - #On error, display the error, the line that triggered the error, and the TraceToken - if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } - $int++ - } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line -} +Write-Output "Response:" +$result = Invoke-RestMethod -uri $uri -headers $headers -method GET +$result.content +#Obtain the workflow ID from the API response +$workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "DocuSign ID Verification"}).workflowId +# Step 3 end # - Construct your envelope JSON body # Note: If you did not successfully obtain your workflow ID, this step will fail. +# Step 4 start $body = @" { "documents": [{ @@ -82,8 +75,8 @@ $body = @" "pageNumber": "1", "recipientId":"1", "tabLabel": "SignHereTab", - "xPosition": "75", - "yPosition": "572" + "xPosition": "200", + "yPosition": "160" }] }, "templateAccessCodeRequired": null, @@ -100,12 +93,14 @@ $body = @" "status": "Sent" } "@ +# Step 4 end Write-Output "" Write-Output "Request: " Write-Output $body # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope +# Step 5 start $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -121,6 +116,7 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 5 end # cleanup Remove-Item $docBase64 \ No newline at end of file From 685dae0f8f67ed413df86cfc0bcfbf5de695681a Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 5 Nov 2021 11:15:42 -0700 Subject: [PATCH 118/462] Adding checks if you don't have IDV/Phone Auth enabled --- .../eg020SigningViaEmailWithPhoneAuthentication.ps1 | 5 ++++- .../eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index c6c184c..447211b 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -47,7 +47,10 @@ $result.content $workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "Phone Authentication"}).workflowId # Step 3 end - +if ($null -eq $workflowId) +{ + throw "Please contact https://support.docusign.com to enable recipient phone authentication in your account." +} $SIGNER_NAME = Read-Host "Please enter name for the signer" diff --git a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 index 3171844..d72969f 100644 --- a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 +++ b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -48,6 +48,11 @@ $result.content $workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "DocuSign ID Verification"}).workflowId # Step 3 end +if ($null -eq $workflowId) +{ + throw "Please contact https://support.docusign.com to enable IDV in your account." +} + # - Construct your envelope JSON body # Note: If you did not successfully obtain your workflow ID, this step will fail. # Step 4 start From f8c6c0a50b9349e0bfbcc9429ad0c26a889b7098 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 5 Nov 2021 11:32:07 -0700 Subject: [PATCH 119/462] Removing the workflow to check commits with PSScriptAnalyzer for now. We need to revise this and if we want - do it for all our repos --- .github/workflows/main.yml | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 2542f7b..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Code Analysis -on: [push] -jobs: - lint: - name: Run PSScriptAnalyzer - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Run PSScriptAnalyzer - uses: devblackops/github-action-psscriptanalyzer@master - with: - sendComment: false - failOnErrors: true - failOnWarnings: true - failOnInfos: true From 99bcb032f58e5cae3d039ea7edfcbb35385b7436 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 9 Nov 2021 13:24:22 -0800 Subject: [PATCH 120/462] Adding email/name for IDV code example --- .../eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 index d72969f..792c803 100644 --- a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 +++ b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -53,6 +53,10 @@ if ($null -eq $workflowId) throw "Please contact https://support.docusign.com to enable IDV in your account." } +$SIGNER_NAME = Read-Host "Please enter name for the signer" + +$SIGNER_EMAIL = Read-Host "Please enter email address for the signer" + # - Construct your envelope JSON body # Note: If you did not successfully obtain your workflow ID, this step will fail. # Step 4 start From f60c3128ca4b54b8a7e116fa378304af646830a4 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 19 Nov 2021 10:04:16 -0800 Subject: [PATCH 121/462] Updating IDV and Phone Auth code examples with code to obtain the workflowId --- ...SigningViaEmailWithPhoneAuthentication.ps1 | 30 ++++++++++++-- ...23SigningViaEmailWithIDVAuthentication.ps1 | 41 +++++++++++-------- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index d2d45db..447211b 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -27,10 +27,30 @@ $docBase64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 # Construct your API headers +# Step 2 start $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 end + +# - Obtain your workflow ID +# Step 3 start +$uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" + +Write-Output "Attempting to retrieve your account's workflow ID" + +Write-Output "Response:" +$result = Invoke-RestMethod -uri $uri -headers $headers -method GET +$result.content +#Obtain the workflow ID from the API response +$workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "Phone Authentication"}).workflowId +# Step 3 end + +if ($null -eq $workflowId) +{ + throw "Please contact https://support.docusign.com to enable recipient phone authentication in your account." +} $SIGNER_NAME = Read-Host "Please enter name for the signer" @@ -40,6 +60,7 @@ $SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient auth $SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" # Construct your envelope JSON body +# Step 4 start $body = @" { "documents": [{ @@ -66,15 +87,15 @@ $body = @" "pageNumber": "1", "recipientId": "1", "tabLabel": "SignHereTab", - "xPosition": "75", - "yPosition": "572" + "xPosition": "200", + "yPosition": "160" }] }, "templateAccessCodeRequired": null, "deliveryMethod": "email", "recipientId": "1", "identityVerification":{ - "workflowId":"c368e411-1592-4001-a3df-dca94ac539ae", + "workflowId":"$workflowId", "steps":null,"inputOptions":[ {"name":"phone_number_list", "valueType":"PhoneNumberList", @@ -91,12 +112,14 @@ $body = @" "status": "Sent" } "@ +# Step 4 end Write-Output "" Write-Output "Request: " Write-Output $body # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope +# Step 5 start $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -112,6 +135,7 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 5 end # cleanup Remove-Item $docBase64 diff --git a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 index 8df5d62..792c803 100644 --- a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 +++ b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -26,38 +26,40 @@ $docBase64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 # - Construct your API headers +# Step 2 start $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json, text/plain, */*") $headers.add("Content-Type", "application/json;charset=UTF-8") $headers.add("Accept-Encoding", "gzip, deflate, br") $headers.add("Accept-Language", "en-US,en;q=0.9") +# Step 2 end # - Obtain your workflow ID +# Step 3 start $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" Write-Output "Attempting to retrieve your account's workflow ID" -try { - Write-Output "Response:" - $result = Invoke-RestMethod -uri $uri -headers $headers -method GET - $result.content - #Obtain the workflow ID from the API response - $workflowId = $result.identityVerification.workflowId -} -catch { - $int = 0 - foreach ($header in $_.Exception.Response.Headers) { - #On error, display the error, the line that triggered the error, and the TraceToken - if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } - $int++ - } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line +Write-Output "Response:" +$result = Invoke-RestMethod -uri $uri -headers $headers -method GET +$result.content +#Obtain the workflow ID from the API response +$workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "DocuSign ID Verification"}).workflowId +# Step 3 end + +if ($null -eq $workflowId) +{ + throw "Please contact https://support.docusign.com to enable IDV in your account." } +$SIGNER_NAME = Read-Host "Please enter name for the signer" + +$SIGNER_EMAIL = Read-Host "Please enter email address for the signer" + # - Construct your envelope JSON body # Note: If you did not successfully obtain your workflow ID, this step will fail. +# Step 4 start $body = @" { "documents": [{ @@ -82,8 +84,8 @@ $body = @" "pageNumber": "1", "recipientId":"1", "tabLabel": "SignHereTab", - "xPosition": "75", - "yPosition": "572" + "xPosition": "200", + "yPosition": "160" }] }, "templateAccessCodeRequired": null, @@ -100,12 +102,14 @@ $body = @" "status": "Sent" } "@ +# Step 4 end Write-Output "" Write-Output "Request: " Write-Output $body # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope +# Step 5 start $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -121,6 +125,7 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +# Step 5 end # cleanup Remove-Item $docBase64 \ No newline at end of file From 717dbdce16b38ebc7e5831a99a9b1672fcc77daf Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 15 Dec 2021 11:03:53 -0800 Subject: [PATCH 122/462] DEVDOCS-5569 - updating PowerShell example 31 (bulk send) to work like our other langs, correctly --- examples/eSignature/eg031BulkSending.ps1 | 145 +++++++++-------------- 1 file changed, 58 insertions(+), 87 deletions(-) diff --git a/examples/eSignature/eg031BulkSending.ps1 b/examples/eSignature/eg031BulkSending.ps1 index 21a759a..6a07974 100644 --- a/examples/eSignature/eg031BulkSending.ps1 +++ b/examples/eSignature/eg031BulkSending.ps1 @@ -10,10 +10,18 @@ $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -$CC_EMAIL = $variables.CC_EMAIL -$CC_NAME = $variables.CC_NAME -$SIGNER_EMAIL = $variables.SIGNER_EMAIL -$SIGNER_NAME = $variables.SIGNER_NAME +$SIGNER1_EMAIL = Read-Host "Please enter Bulk copy #1 signer email address" +$SIGNER1_NAME = Read-Host "Please enter Bulk copy #1 signer name" +$CC1_EMAIL = Read-Host "Please enter Bulk copy #1 carbon copy email address" +$CC1_NAME = Read-Host "Please enter Bulk copy #1 carbon copy name" +$SIGNER2_EMAIL = Read-Host "Please enter Bulk copy #2 signer email address" +$SIGNER2_NAME = Read-Host "Please enter Bulk copy #2 signer name" +$CC2_EMAIL = Read-Host "Please enter Bulk copy #2 carbon copy email address" +$CC2_NAME = Read-Host "Please enter Bulk copy #2 carbon copy name" + +$doc1Base64 = New-TemporaryFile +# Fetch doc and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc1Base64 # Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" @@ -34,35 +42,27 @@ $body = @" "name": "sample.csv", "bulkCopies": [{ "recipients": [{ - "recipientId": "39542944", - "role": "signer", - "tabs": [], - "name": "${SIGNER_NAME}", - "email": "${SIGNER_EMAIL}" + "roleName": "signer", + "name": "${SIGNER1_NAME}", + "email": "${SIGNER1_EMAIL}" }, { - "recipientId": "84754526", - "role": "cc", - "tabs": [], - "name": "${CC_NAME}", - "email": "${CC_EMAIL}" + "roleName": "cc", + "name": "${CC1_NAME}", + "email": "${CC1_EMAIL}" }], "customFields": [] }, { "recipients": [{ - "recipientId": "39542944", - "role": "signer", - "tabs": [], - "name": "${SIGNER_NAME}", - "email": "${SIGNER_EMAIL}" + "roleName": "signer", + "name": "${SIGNER2_NAME}", + "email": "${SIGNER2_EMAIL}" }, { - "recipientId": "84754526", - "role": "cc", - "tabs": [], - "name": "${CC_NAME}", - "email": "${CC_EMAIL}" + "roleName": "cc", + "name": "${CC2_NAME}", + "email": "${CC2_EMAIL}" }], "customFields": [] }] @@ -99,20 +99,48 @@ catch { # Step 4. Create an envelope # Create your draft envelope -$base = "DQoNCg0KCQkJCXRleHQgZG9jDQoNCg0KDQoNCg0KUk0gIwlSTSAjCVJNICMNCg0KDQoNClxzMVwNCg0KLy9hbmNoMSANCgkvL2FuY2gyDQoJCS8vYW5jaDM=" $body = @" { "documents": [{ - "documentBase64": "$base", + "documentBase64": "$(Get-Content $doc1Base64)", "documentId": "1", "fileExtension": "txt", "name": "NDA" }], "envelopeIdStamping": "true", "emailSubject": "Please sign", - "cdse_mode": "true", "recipients": { - }, + "signers": [{ + "name": "Multi Bulk Recipient::signer", + "email": "multiBulkRecipients-signer@docusign.com", + "roleName": "signer", + "routingOrder": "1", + "recipientId" : "1", + "recipientType" : "signer", + "delieveryMethod" : "Email", + "status": "created", + "tabs": { + "signHereTabs": [{ + "documentId": "1", + "name": "SignHereTab", + "pageNumber": "1", + "recipientId": "1", + "tabLabel": "SignHereTab", + "xPosition": "200", + "yPosition": "160" + }]} + }], + "carbonCopies": [{ + "name": "Multi Bulk Recipient::cc", + "email": "multiBulkRecipients-cc@docusign.com", + "roleName": "cc", + "routingOrder": "2", + "recipientId" : "2", + "recipientType" : "cc", + "delieveryMethod" : "Email", + "status": "created" + }] + }, "status": "created" } "@ @@ -182,64 +210,7 @@ catch { Write-Output "Command : "$_.InvocationInfo.Line } -# Step 6. Add placeholder recipients -# Add placeholder recipients. -# Note: The name / email format used is: -# Name: Multi Bulk Recipients::{rolename} -# Email: MultiBulkRecipients-{rolename}@docusign.com -$body = @" -{ - "signers": [{ - "name": "Multi Bulk Recipient::cc", - "email": "multiBulkRecipients-cc@docusign.com", - "roleName": "cc", - "routingOrder": 1, - "status": "created", - "templateAccessCodeRequired": null, - "deliveryMethod": "email", - "recipientId": "84754526", - "recipientType": "signer" - }, - { - "name": "Multi Bulk Recipient::signer", - "email": "multiBulkRecipients-signer@docusign.com", - "roleName": "signer", - "routingOrder": 1, - "status": "created", - "templateAccessCodeRequired": null, - "deliveryMethod": "email", - "recipientId": "39542944", - "recipientType": "signer" - }] -} -"@ - -$uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes/$envelopeId/recipients" - -if ($continue -eq $true) { - try { - Write-Output @" - - Adding placeholder recipients to the envelope -"@ - $response = Invoke-RestMethod -uri $uri -headers $headers -body $body -method POST - $response | ConvertTo-Json - } - catch { - Write-Output "Adding placeholder recipients has failed" - #On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error #On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error - $continue = $false - $int = 0 - foreach ($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } - $int++ - } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line - } -} - -# Step 7. Initiate bulk send +# Step 6. Initiate bulk send # Initiate the Bulk Send # Target endpoint: {ACCOUNT_ID}/bulk_send_lists/{LIST_ID}/send $body = @" @@ -274,7 +245,7 @@ if ($continue -eq $true) { } } -# Step 8. Confirm successful batch send +# Step 7. Confirm successful batch send # Confirm successful batch send # Note: Depending on the number of Bulk Recipients, it may take some time for the Bulk Send to complete. For 2000 recipients this can take ~1 hour. $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/bulk_send_batch/$bulkBatchId" From 395aea477e49830ea054dad14dce59c0064fb33a Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 15 Dec 2021 11:06:22 -0800 Subject: [PATCH 123/462] Updating step comments --- examples/eSignature/eg031BulkSending.ps1 | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg031BulkSending.ps1 b/examples/eSignature/eg031BulkSending.ps1 index 6a07974..ecca201 100644 --- a/examples/eSignature/eg031BulkSending.ps1 +++ b/examples/eSignature/eg031BulkSending.ps1 @@ -23,6 +23,7 @@ $doc1Base64 = New-TemporaryFile # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc1Base64 +# Step 2 start # Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") @@ -30,9 +31,11 @@ $headers.add("Accept", "application/json, text/plain, */*") $headers.add("Content-Type", "application/json;charset=UTF-8") $headers.add("Accept-Encoding", "gzip, deflate, br") $headers.add("Accept-Language", "en-US,en;q=0.9") +# Step 2 end $continue = $true +# Step 3 start # Step 3. Submit a bulk list # Submit the Bulk List # Create a temporary file to store the JSON body @@ -96,7 +99,8 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } - +# Step 3 end +# Step 4 start # Step 4. Create an envelope # Create your draft envelope $body = @" @@ -171,7 +175,8 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } - +# Step 4 end +# Step 5 start # Step 5. Attach your bulk list ID to the envelope # Add an envelope custom field set to the value of your listId # This Custom Field is used for tracking your Bulk Send via the Envelopes::Get method @@ -209,7 +214,8 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } - +# Step 5 start +# Step 5 end # Step 6. Initiate bulk send # Initiate the Bulk Send # Target endpoint: {ACCOUNT_ID}/bulk_send_lists/{LIST_ID}/send @@ -244,7 +250,8 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } - +# Step 6 end +# Step 7 start # Step 7. Confirm successful batch send # Confirm successful batch send # Note: Depending on the number of Bulk Recipients, it may take some time for the Bulk Send to complete. For 2000 recipients this can take ~1 hour. @@ -271,3 +278,4 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } +# Step 7 end From ec64e5315538b92bad703ffdf9eaf2e3b28ac63d Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 16 Dec 2021 15:43:04 -0800 Subject: [PATCH 124/462] Updating Bulk Send (ex031) to latest update --- examples/eSignature/eg031BulkSending.ps1 | 161 ++++++++++------------- 1 file changed, 70 insertions(+), 91 deletions(-) diff --git a/examples/eSignature/eg031BulkSending.ps1 b/examples/eSignature/eg031BulkSending.ps1 index 21a759a..ecca201 100644 --- a/examples/eSignature/eg031BulkSending.ps1 +++ b/examples/eSignature/eg031BulkSending.ps1 @@ -10,11 +10,20 @@ $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -$CC_EMAIL = $variables.CC_EMAIL -$CC_NAME = $variables.CC_NAME -$SIGNER_EMAIL = $variables.SIGNER_EMAIL -$SIGNER_NAME = $variables.SIGNER_NAME +$SIGNER1_EMAIL = Read-Host "Please enter Bulk copy #1 signer email address" +$SIGNER1_NAME = Read-Host "Please enter Bulk copy #1 signer name" +$CC1_EMAIL = Read-Host "Please enter Bulk copy #1 carbon copy email address" +$CC1_NAME = Read-Host "Please enter Bulk copy #1 carbon copy name" +$SIGNER2_EMAIL = Read-Host "Please enter Bulk copy #2 signer email address" +$SIGNER2_NAME = Read-Host "Please enter Bulk copy #2 signer name" +$CC2_EMAIL = Read-Host "Please enter Bulk copy #2 carbon copy email address" +$CC2_NAME = Read-Host "Please enter Bulk copy #2 carbon copy name" +$doc1Base64 = New-TemporaryFile +# Fetch doc and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc1Base64 + +# Step 2 start # Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") @@ -22,9 +31,11 @@ $headers.add("Accept", "application/json, text/plain, */*") $headers.add("Content-Type", "application/json;charset=UTF-8") $headers.add("Accept-Encoding", "gzip, deflate, br") $headers.add("Accept-Language", "en-US,en;q=0.9") +# Step 2 end $continue = $true +# Step 3 start # Step 3. Submit a bulk list # Submit the Bulk List # Create a temporary file to store the JSON body @@ -34,35 +45,27 @@ $body = @" "name": "sample.csv", "bulkCopies": [{ "recipients": [{ - "recipientId": "39542944", - "role": "signer", - "tabs": [], - "name": "${SIGNER_NAME}", - "email": "${SIGNER_EMAIL}" + "roleName": "signer", + "name": "${SIGNER1_NAME}", + "email": "${SIGNER1_EMAIL}" }, { - "recipientId": "84754526", - "role": "cc", - "tabs": [], - "name": "${CC_NAME}", - "email": "${CC_EMAIL}" + "roleName": "cc", + "name": "${CC1_NAME}", + "email": "${CC1_EMAIL}" }], "customFields": [] }, { "recipients": [{ - "recipientId": "39542944", - "role": "signer", - "tabs": [], - "name": "${SIGNER_NAME}", - "email": "${SIGNER_EMAIL}" + "roleName": "signer", + "name": "${SIGNER2_NAME}", + "email": "${SIGNER2_EMAIL}" }, { - "recipientId": "84754526", - "role": "cc", - "tabs": [], - "name": "${CC_NAME}", - "email": "${CC_EMAIL}" + "roleName": "cc", + "name": "${CC2_NAME}", + "email": "${CC2_EMAIL}" }], "customFields": [] }] @@ -96,23 +99,52 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } - +# Step 3 end +# Step 4 start # Step 4. Create an envelope # Create your draft envelope -$base = "DQoNCg0KCQkJCXRleHQgZG9jDQoNCg0KDQoNCg0KUk0gIwlSTSAjCVJNICMNCg0KDQoNClxzMVwNCg0KLy9hbmNoMSANCgkvL2FuY2gyDQoJCS8vYW5jaDM=" $body = @" { "documents": [{ - "documentBase64": "$base", + "documentBase64": "$(Get-Content $doc1Base64)", "documentId": "1", "fileExtension": "txt", "name": "NDA" }], "envelopeIdStamping": "true", "emailSubject": "Please sign", - "cdse_mode": "true", "recipients": { - }, + "signers": [{ + "name": "Multi Bulk Recipient::signer", + "email": "multiBulkRecipients-signer@docusign.com", + "roleName": "signer", + "routingOrder": "1", + "recipientId" : "1", + "recipientType" : "signer", + "delieveryMethod" : "Email", + "status": "created", + "tabs": { + "signHereTabs": [{ + "documentId": "1", + "name": "SignHereTab", + "pageNumber": "1", + "recipientId": "1", + "tabLabel": "SignHereTab", + "xPosition": "200", + "yPosition": "160" + }]} + }], + "carbonCopies": [{ + "name": "Multi Bulk Recipient::cc", + "email": "multiBulkRecipients-cc@docusign.com", + "roleName": "cc", + "routingOrder": "2", + "recipientId" : "2", + "recipientType" : "cc", + "delieveryMethod" : "Email", + "status": "created" + }] + }, "status": "created" } "@ @@ -143,7 +175,8 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } - +# Step 4 end +# Step 5 start # Step 5. Attach your bulk list ID to the envelope # Add an envelope custom field set to the value of your listId # This Custom Field is used for tracking your Bulk Send via the Envelopes::Get method @@ -181,65 +214,9 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } - -# Step 6. Add placeholder recipients -# Add placeholder recipients. -# Note: The name / email format used is: -# Name: Multi Bulk Recipients::{rolename} -# Email: MultiBulkRecipients-{rolename}@docusign.com -$body = @" -{ - "signers": [{ - "name": "Multi Bulk Recipient::cc", - "email": "multiBulkRecipients-cc@docusign.com", - "roleName": "cc", - "routingOrder": 1, - "status": "created", - "templateAccessCodeRequired": null, - "deliveryMethod": "email", - "recipientId": "84754526", - "recipientType": "signer" - }, - { - "name": "Multi Bulk Recipient::signer", - "email": "multiBulkRecipients-signer@docusign.com", - "roleName": "signer", - "routingOrder": 1, - "status": "created", - "templateAccessCodeRequired": null, - "deliveryMethod": "email", - "recipientId": "39542944", - "recipientType": "signer" - }] -} -"@ - -$uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes/$envelopeId/recipients" - -if ($continue -eq $true) { - try { - Write-Output @" - - Adding placeholder recipients to the envelope -"@ - $response = Invoke-RestMethod -uri $uri -headers $headers -body $body -method POST - $response | ConvertTo-Json - } - catch { - Write-Output "Adding placeholder recipients has failed" - #On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error #On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error - $continue = $false - $int = 0 - foreach ($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } - $int++ - } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line - } -} - -# Step 7. Initiate bulk send +# Step 5 start +# Step 5 end +# Step 6. Initiate bulk send # Initiate the Bulk Send # Target endpoint: {ACCOUNT_ID}/bulk_send_lists/{LIST_ID}/send $body = @" @@ -273,8 +250,9 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } - -# Step 8. Confirm successful batch send +# Step 6 end +# Step 7 start +# Step 7. Confirm successful batch send # Confirm successful batch send # Note: Depending on the number of Bulk Recipients, it may take some time for the Bulk Send to complete. For 2000 recipients this can take ~1 hour. $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/bulk_send_batch/$bulkBatchId" @@ -300,3 +278,4 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } +# Step 7 end From 2bd9c8e4a9548cd271d1da5ff18e801829105e82 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 22 Feb 2022 15:10:50 -0800 Subject: [PATCH 125/462] Basic plumbing for adding 35, 36, renaming 35 to 37 --- ...Delivery.ps1 => eg035ScheduledSending.ps1} | 0 examples/eSignature/eg036DelayedRouting.ps1 | 155 ++++++++++++++++++ examples/eSignature/eg037SMSDelivery.ps1 | 155 ++++++++++++++++++ launcher.ps1 | 18 +- 4 files changed, 325 insertions(+), 3 deletions(-) rename examples/eSignature/{eg035SMSDelivery.ps1 => eg035ScheduledSending.ps1} (100%) create mode 100644 examples/eSignature/eg036DelayedRouting.ps1 create mode 100644 examples/eSignature/eg037SMSDelivery.ps1 diff --git a/examples/eSignature/eg035SMSDelivery.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 similarity index 100% rename from examples/eSignature/eg035SMSDelivery.ps1 rename to examples/eSignature/eg035ScheduledSending.ps1 diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 new file mode 100644 index 0000000..a5875b9 --- /dev/null +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -0,0 +1,155 @@ +#SMS Delivery +$apiUri = "https://demo.docusign.net/restapi" + +# Send an envelope with three documents + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +$accessToken = Get-Content .\config\ds_access_token.txt + +# Obtain your accountId from demo.docusign.net -- the account id is shown in +# the drop down on the upper right corner of the screen by your picture or +# the default picture. +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# ***DS.snippet.0.start +# document 1 (html) has tag **signature_1** +# document 2 (docx) has tag /sn1/ +# document 3 (pdf) has tag /sn1/ +# +# The envelope has two recipients. +# recipient 1 - signer +# recipient 2 - cc +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$doc1Base64 = New-TemporaryFile +$doc2Base64 = New-TemporaryFile +$doc3Base64 = New-TemporaryFile + +# Fetch docs and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 + +Write-Output "Sending the envelope request to DocuSign..." +Write-Output "The envelope has three documents. Processing time will be about 15 seconds." +Write-Output "Results:" + +# Step 2. Create the envelope definition +$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer" +$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer" +$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient" +$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient" + +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $doc1Base64)"; + name = "Order acknowledgement"; + fileExtension = "html"; + documentId = "1"; + }; + @{ + documentBase64 = "$(Get-Content $doc2Base64)"; + name = "Battle Plan"; + fileExtension = "docx"; + documentId = "2"; + }; + @{ + documentBase64 = "$(Get-Content $doc3Base64)"; + name = "Lorem Ipsum"; + fileExtension = "pdf"; + documentId = "3"; + }; ); + recipients = @{ + carbonCopies = @( + @{ + email = $variables.CC_EMAIL; + name = $variables.CC_NAME; + recipientId = "2"; + routingOrder = "2"; + additionalNotifications = @( + @{ + secondaryDeliveryMethod = "SMS"; + phoneNumber = @{ + countryCode = $SMSCCCountryPrefix; + number = $SMSNumberCC; + } + } + ); + }; + ); + + signers = @( + @{ + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "1"; + routingOrder = "1"; + additionalNotifications = @( + @{ + secondaryDeliveryMethod = "SMS"; + phoneNumber = @{ + countryCode = $SMSCountryPrefix; + number = $SMSNumber; + } + } + ); + tabs = @{ + signHereTabs = @( + @{ + anchorString = "**signature_1**"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +# Step 3. Create and send the envelope +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId + +# ***DS.snippet.0.end +# Save the envelope id for use by other scripts +Write-Output "EnvelopeId: $envelopeId" +Write-Output $envelopeId > .\config\ENVELOPE_ID + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $doc1Base64 +Remove-Item $doc2Base64 +Remove-Item $doc3Base64 + +Write-Output "Done." diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 new file mode 100644 index 0000000..a5875b9 --- /dev/null +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -0,0 +1,155 @@ +#SMS Delivery +$apiUri = "https://demo.docusign.net/restapi" + +# Send an envelope with three documents + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +$accessToken = Get-Content .\config\ds_access_token.txt + +# Obtain your accountId from demo.docusign.net -- the account id is shown in +# the drop down on the upper right corner of the screen by your picture or +# the default picture. +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# ***DS.snippet.0.start +# document 1 (html) has tag **signature_1** +# document 2 (docx) has tag /sn1/ +# document 3 (pdf) has tag /sn1/ +# +# The envelope has two recipients. +# recipient 1 - signer +# recipient 2 - cc +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$doc1Base64 = New-TemporaryFile +$doc2Base64 = New-TemporaryFile +$doc3Base64 = New-TemporaryFile + +# Fetch docs and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 + +Write-Output "Sending the envelope request to DocuSign..." +Write-Output "The envelope has three documents. Processing time will be about 15 seconds." +Write-Output "Results:" + +# Step 2. Create the envelope definition +$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer" +$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer" +$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient" +$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient" + +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $doc1Base64)"; + name = "Order acknowledgement"; + fileExtension = "html"; + documentId = "1"; + }; + @{ + documentBase64 = "$(Get-Content $doc2Base64)"; + name = "Battle Plan"; + fileExtension = "docx"; + documentId = "2"; + }; + @{ + documentBase64 = "$(Get-Content $doc3Base64)"; + name = "Lorem Ipsum"; + fileExtension = "pdf"; + documentId = "3"; + }; ); + recipients = @{ + carbonCopies = @( + @{ + email = $variables.CC_EMAIL; + name = $variables.CC_NAME; + recipientId = "2"; + routingOrder = "2"; + additionalNotifications = @( + @{ + secondaryDeliveryMethod = "SMS"; + phoneNumber = @{ + countryCode = $SMSCCCountryPrefix; + number = $SMSNumberCC; + } + } + ); + }; + ); + + signers = @( + @{ + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "1"; + routingOrder = "1"; + additionalNotifications = @( + @{ + secondaryDeliveryMethod = "SMS"; + phoneNumber = @{ + countryCode = $SMSCountryPrefix; + number = $SMSNumber; + } + } + ); + tabs = @{ + signHereTabs = @( + @{ + anchorString = "**signature_1**"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +# Step 3. Create and send the envelope +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId + +# ***DS.snippet.0.end +# Save the envelope id for use by other scripts +Write-Output "EnvelopeId: $envelopeId" +Write-Output $envelopeId > .\config\ENVELOPE_ID + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $doc1Base64 +Remove-Item $doc2Base64 +Remove-Item $doc3Base64 + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 670337e..44d1f7d 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -217,8 +217,10 @@ function startSignature { Pause_Signature_Workflow = 32; Unpause_Signature_Workflow = 33; Use_Conditional_Recipients = 34; - SMS_Delivery = 35; - Home = 36; + Scheduled_Sending = 35; + Delayed_Routing = 36; + SMS_Delivery = 37; + Home = 38; } $ApiExamplesView = $null; @@ -258,6 +260,8 @@ function startSignature { Write-Output "$([int][ApiExamples]::Pause_Signature_Workflow)) Pause_Signature_Workflow" Write-Output "$([int][ApiExamples]::Unpause_Signature_Workflow)) Unpause_Signature_Workflow" Write-Output "$([int][ApiExamples]::Use_Conditional_Recipients)) Use_Conditional_Recipients" + Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" + Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" Write-Output "$([int][ApiExamples]::Home)) Home" [int]$ApiExamplesView = Read-Host "Select the action" @@ -373,9 +377,17 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg034UseConditionalRecipients.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Scheduled_Sending) { + checkCC + powershell.exe .\examples\eSignature\eg036ScheduledSending.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Delayed_Routing) { + checkCC + powershell.exe .\examples\eSignature\eg036DelayedRouting.ps1 + } elseif ($ApiExamplesView -eq [ApiExamples]::SMS_Delivery) { checkCC - powershell.exe .\examples\eSignature\eg035SMSDelivery.ps1 + powershell.exe .\examples\eSignature\eg037SMSDelivery.ps1 } } until ($ApiExamplesView -eq [ApiExamples]::Home) startLauncher From f0b41a8af172a47d1f72007d2683ea7b9e961213 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 23 Feb 2022 10:30:58 -0800 Subject: [PATCH 126/462] Finished the work on SS --- examples/eSignature/eg035ScheduledSending.ps1 | 80 +++++-------------- launcher.ps1 | 2 +- 2 files changed, 20 insertions(+), 62 deletions(-) diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index a5875b9..557a77c 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -1,7 +1,7 @@ -#SMS Delivery +#Scheduled Sending $apiUri = "https://demo.docusign.net/restapi" -# Send an envelope with three documents +# Send an envelope with one document # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -14,13 +14,10 @@ $accessToken = Get-Content .\config\ds_access_token.txt $accountId = Get-Content .\config\API_ACCOUNT_ID # ***DS.snippet.0.start -# document 1 (html) has tag **signature_1** -# document 2 (docx) has tag /sn1/ -# document 3 (pdf) has tag /sn1/ +# document 1 (pdf) has tag /sn1/ # # The envelope has two recipients. # recipient 1 - signer -# recipient 2 - cc # The envelope will be sent first to the signer. # After it is signed, a copy is sent to the cc person. @@ -28,80 +25,43 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # temp files: $requestData = New-TemporaryFile $response = New-TemporaryFile -$doc1Base64 = New-TemporaryFile -$doc2Base64 = New-TemporaryFile -$doc3Base64 = New-TemporaryFile +$docBase64 = New-TemporaryFile # Fetch docs and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 Write-Output "Sending the envelope request to DocuSign..." -Write-Output "The envelope has three documents. Processing time will be about 15 seconds." +Write-Output "The envelope has one document. Processing time will be about 15 seconds." Write-Output "Results:" # Step 2. Create the envelope definition -$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer" -$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer" -$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient" -$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient" +$ResumeDate = Read-Host "Please enter the date you want to scheduled this envelope (Resume Date) " @{ emailSubject = "Please sign this document set"; documents = @( @{ - documentBase64 = "$(Get-Content $doc1Base64)"; - name = "Order acknowledgement"; - fileExtension = "html"; - documentId = "1"; - }; - @{ - documentBase64 = "$(Get-Content $doc2Base64)"; - name = "Battle Plan"; - fileExtension = "docx"; - documentId = "2"; - }; - @{ - documentBase64 = "$(Get-Content $doc3Base64)"; + documentBase64 = "$(Get-Content $docBase64)"; name = "Lorem Ipsum"; fileExtension = "pdf"; - documentId = "3"; + documentId = "1"; }; ); - recipients = @{ - carbonCopies = @( + workflow = @{ + scheduledSending = @{ + status = "pending"; + rules = @( @{ - email = $variables.CC_EMAIL; - name = $variables.CC_NAME; - recipientId = "2"; - routingOrder = "2"; - additionalNotifications = @( - @{ - secondaryDeliveryMethod = "SMS"; - phoneNumber = @{ - countryCode = $SMSCCCountryPrefix; - number = $SMSNumberCC; - } - } - ); - }; - ); - + resumeDate = $ResumeDate; + }; ); + }; + }; + recipients = @{ signers = @( @{ email = $variables.SIGNER_EMAIL; name = $variables.SIGNER_NAME; recipientId = "1"; routingOrder = "1"; - additionalNotifications = @( - @{ - secondaryDeliveryMethod = "SMS"; - phoneNumber = @{ - countryCode = $SMSCountryPrefix; - number = $SMSNumber; - } - } - ); tabs = @{ signHereTabs = @( @{ @@ -148,8 +108,6 @@ Write-Output $envelopeId > .\config\ENVELOPE_ID # cleanup Remove-Item $requestData Remove-Item $response -Remove-Item $doc1Base64 -Remove-Item $doc2Base64 -Remove-Item $doc3Base64 +Remove-Item $docBase64 Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 44d1f7d..1a37022 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -379,7 +379,7 @@ function startSignature { } elseif ($ApiExamplesView -eq [ApiExamples]::Scheduled_Sending) { checkCC - powershell.exe .\examples\eSignature\eg036ScheduledSending.ps1 + powershell.exe .\examples\eSignature\eg035ScheduledSending.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Delayed_Routing) { checkCC From de17721fed7ad93a88f0033542044b515f86bf25 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 23 Feb 2022 11:48:26 -0800 Subject: [PATCH 127/462] Finishing DR --- examples/eSignature/eg035ScheduledSending.ps1 | 5 +- examples/eSignature/eg036DelayedRouting.ps1 | 100 +++++++----------- 2 files changed, 42 insertions(+), 63 deletions(-) diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index 557a77c..adad427 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -16,10 +16,9 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # ***DS.snippet.0.start # document 1 (pdf) has tag /sn1/ # -# The envelope has two recipients. +# The envelope has one recipient. # recipient 1 - signer -# The envelope will be sent first to the signer. -# After it is signed, a copy is sent to the cc person. +# The envelope will be scheduled to go to the signer. # temp files: diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index a5875b9..f6c4ddb 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -1,7 +1,7 @@ #SMS Delivery $apiUri = "https://demo.docusign.net/restapi" -# Send an envelope with three documents +# Send an envelope with one document # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -14,13 +14,11 @@ $accessToken = Get-Content .\config\ds_access_token.txt $accountId = Get-Content .\config\API_ACCOUNT_ID # ***DS.snippet.0.start -# document 1 (html) has tag **signature_1** -# document 2 (docx) has tag /sn1/ -# document 3 (pdf) has tag /sn1/ +# document (pdf) has tag /sn1/ # # The envelope has two recipients. # recipient 1 - signer -# recipient 2 - cc +# recipient 2 - signer # The envelope will be sent first to the signer. # After it is signed, a copy is sent to the cc person. @@ -28,92 +26,76 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # temp files: $requestData = New-TemporaryFile $response = New-TemporaryFile -$doc1Base64 = New-TemporaryFile -$doc2Base64 = New-TemporaryFile -$doc3Base64 = New-TemporaryFile +$docBase64 = New-TemporaryFile -# Fetch docs and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 +# Fetch doc and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 Write-Output "Sending the envelope request to DocuSign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" # Step 2. Create the envelope definition -$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer" -$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer" -$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient" -$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient" +$Signer2Email = Read-Host "Please enter the email address for the second signer" +$Signer2Name = Read-Host "Please enter the name for the second signer" +$DelayInHours= Read-Host "Please enter the amount of delay (in hours)" +$DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 @{ emailSubject = "Please sign this document set"; documents = @( @{ - documentBase64 = "$(Get-Content $doc1Base64)"; - name = "Order acknowledgement"; - fileExtension = "html"; - documentId = "1"; - }; - @{ - documentBase64 = "$(Get-Content $doc2Base64)"; - name = "Battle Plan"; - fileExtension = "docx"; - documentId = "2"; - }; - @{ - documentBase64 = "$(Get-Content $doc3Base64)"; + documentBase64 = "$(Get-Content $docBase64)"; name = "Lorem Ipsum"; fileExtension = "pdf"; - documentId = "3"; + documentId = "1"; }; ); - recipients = @{ - carbonCopies = @( + workflow = @{ + workflowSteps = @( @{ - email = $variables.CC_EMAIL; - name = $variables.CC_NAME; - recipientId = "2"; - routingOrder = "2"; - additionalNotifications = @( - @{ - secondaryDeliveryMethod = "SMS"; - phoneNumber = @{ - countryCode = $SMSCCCountryPrefix; - number = $SMSNumberCC; - } - } - ); + action = "pause_before"; + triggerOnItem = "routing_order"; + itemId = "2"; + status = "pending"; + delayedRouting = @{ + rules = @( + @{ + delay = $DelayTimeSpan.ToString(); + }; + ); + }; }; ); - + }; + recipients = @{ signers = @( @{ email = $variables.SIGNER_EMAIL; name = $variables.SIGNER_NAME; recipientId = "1"; routingOrder = "1"; - additionalNotifications = @( - @{ - secondaryDeliveryMethod = "SMS"; - phoneNumber = @{ - countryCode = $SMSCountryPrefix; - number = $SMSNumber; - } - } - ); tabs = @{ signHereTabs = @( @{ - anchorString = "**signature_1**"; + anchorString = "/sn1/"; anchorUnits = "pixels"; anchorXOffset = "20"; anchorYOffset = "10"; }; + ); + }; + }; + @{ + email = $Signer2Email; + name = $Signer2Name; + recipientId = "2"; + routingOrder = "2"; + tabs = @{ + signHereTabs = @( @{ anchorString = "/sn1/"; anchorUnits = "pixels"; - anchorXOffset = "20"; + anchorXOffset = "120"; anchorYOffset = "10"; }; ); @@ -148,8 +130,6 @@ Write-Output $envelopeId > .\config\ENVELOPE_ID # cleanup Remove-Item $requestData Remove-Item $response -Remove-Item $doc1Base64 -Remove-Item $doc2Base64 -Remove-Item $doc3Base64 +Remove-Item $docBase64 Write-Output "Done." From 57992f1875e06dd1d560f7ce5f1755508fbf014a Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:55:32 -0800 Subject: [PATCH 128/462] updated prompt --- examples/eSignature/eg035ScheduledSending.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index adad427..5313c0b 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -34,7 +34,7 @@ Write-Output "The envelope has one document. Processing time will be about 15 se Write-Output "Results:" # Step 2. Create the envelope definition -$ResumeDate = Read-Host "Please enter the date you want to scheduled this envelope (Resume Date) " +$ResumeDate = Read-Host "Please enter the future date for when you want to schedule this envelope as YYYY-MM-DD: " @{ emailSubject = "Please sign this document set"; From 4b8a28727af1f872e78d3235fce0da288a89550b Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:58:20 -0800 Subject: [PATCH 129/462] Changed to time lapse --- examples/eSignature/eg036DelayedRouting.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index f6c4ddb..c83f374 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -38,7 +38,7 @@ Write-Output "Results:" # Step 2. Create the envelope definition $Signer2Email = Read-Host "Please enter the email address for the second signer" $Signer2Name = Read-Host "Please enter the name for the second signer" -$DelayInHours= Read-Host "Please enter the amount of delay (in hours)" +$DelayInHours= Read-Host "Please enter the time lapse (in hours)" $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 @{ From d0507d58f59d064bbb30dfcac966584950943c4f Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:59:34 -0800 Subject: [PATCH 130/462] added colons and a space --- examples/eSignature/eg036DelayedRouting.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index c83f374..8048d84 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -36,9 +36,9 @@ Write-Output "The envelope has three documents. Processing time will be about 15 Write-Output "Results:" # Step 2. Create the envelope definition -$Signer2Email = Read-Host "Please enter the email address for the second signer" -$Signer2Name = Read-Host "Please enter the name for the second signer" -$DelayInHours= Read-Host "Please enter the time lapse (in hours)" +$Signer2Email = Read-Host "Please enter the email address for the second signer: " +$Signer2Name = Read-Host "Please enter the name for the second signer: " +$DelayInHours= Read-Host "Please enter the time lapse (in hours): " $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 @{ From 5ee22b5f2b54917fb6e54a1ebd805623215e4ef5 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 1 Mar 2022 13:09:34 -0800 Subject: [PATCH 131/462] change to "delay" --- examples/eSignature/eg036DelayedRouting.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index 8048d84..84f4e87 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -38,7 +38,7 @@ Write-Output "Results:" # Step 2. Create the envelope definition $Signer2Email = Read-Host "Please enter the email address for the second signer: " $Signer2Name = Read-Host "Please enter the name for the second signer: " -$DelayInHours= Read-Host "Please enter the time lapse (in hours): " +$DelayInHours= Read-Host "Please enter the delay (in hours): " $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 @{ From 8b16c90c966c66cd8500e19722d627b44a1f4a3b Mon Sep 17 00:00:00 2001 From: Connor Lunsford Date: Mon, 7 Mar 2022 09:13:48 -0800 Subject: [PATCH 132/462] Removed Email from eg37 --- examples/eSignature/eg037SMSDelivery.ps1 | 28 +++++++----------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index a5875b9..74835f6 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -71,37 +71,25 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo recipients = @{ carbonCopies = @( @{ - email = $variables.CC_EMAIL; + phoneNumber = @{ + countryCode = $SMSCCCountryPrefix; + number = $SMSNumberCC; + } name = $variables.CC_NAME; recipientId = "2"; routingOrder = "2"; - additionalNotifications = @( - @{ - secondaryDeliveryMethod = "SMS"; - phoneNumber = @{ - countryCode = $SMSCCCountryPrefix; - number = $SMSNumberCC; - } - } - ); }; ); signers = @( @{ - email = $variables.SIGNER_EMAIL; + phoneNumber = @{ + countryCode = $SMSCountryPrefix; + number = $SMSNumber; + } name = $variables.SIGNER_NAME; recipientId = "1"; routingOrder = "1"; - additionalNotifications = @( - @{ - secondaryDeliveryMethod = "SMS"; - phoneNumber = @{ - countryCode = $SMSCountryPrefix; - number = $SMSNumber; - } - } - ); tabs = @{ signHereTabs = @( @{ From b4750619815aaf799002a0a890ac52ae2f7d8953 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 9 Mar 2022 10:42:53 -0800 Subject: [PATCH 133/462] Removing "pending" per product team --- examples/eSignature/eg035ScheduledSending.ps1 | 1 - examples/eSignature/eg036DelayedRouting.ps1 | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index 5313c0b..0922bbe 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -47,7 +47,6 @@ $ResumeDate = Read-Host "Please enter the future date for when you want to sched }; ); workflow = @{ scheduledSending = @{ - status = "pending"; rules = @( @{ resumeDate = $ResumeDate; diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index 84f4e87..f759db5 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -56,7 +56,6 @@ $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 action = "pause_before"; triggerOnItem = "routing_order"; itemId = "2"; - status = "pending"; delayedRouting = @{ rules = @( @{ From 74212c76d92d7abf0f6a83f97ef94b7f48d683ea Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 9 Mar 2022 12:07:44 -0800 Subject: [PATCH 134/462] adding step comments to SS/DR --- examples/eSignature/eg035ScheduledSending.ps1 | 4 ++++ examples/eSignature/eg036DelayedRouting.ps1 | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index 0922bbe..35acdbc 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -36,6 +36,7 @@ Write-Output "Results:" # Step 2. Create the envelope definition $ResumeDate = Read-Host "Please enter the future date for when you want to schedule this envelope as YYYY-MM-DD: " +# Step 2 start @{ emailSubject = "Please sign this document set"; documents = @( @@ -81,8 +82,10 @@ $ResumeDate = Read-Host "Please enter the future date for when you want to sched }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +# Step 2 end # Step 3. Create and send the envelope +# Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -94,6 +97,7 @@ Invoke-RestMethod ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" +# Step 3 end # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index f759db5..9dd63a3 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -41,6 +41,7 @@ $Signer2Name = Read-Host "Please enter the name for the second signer: " $DelayInHours= Read-Host "Please enter the delay (in hours): " $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 +# Step 2 start @{ emailSubject = "Please sign this document set"; documents = @( @@ -104,8 +105,10 @@ $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +# Step 2 end # Step 3. Create and send the envelope +# Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -115,6 +118,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +# Step 3 end Write-Output "Response: $(Get-Content -Raw $response)" From a990ffbb2e765760c5ce600759ef3b759b0beeef Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 10 Mar 2022 12:00:42 -0800 Subject: [PATCH 135/462] Sync updates --- examples/eSignature/eg035ScheduledSending.ps1 | 5 ++++- examples/eSignature/eg036DelayedRouting.ps1 | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index 5313c0b..35acdbc 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -36,6 +36,7 @@ Write-Output "Results:" # Step 2. Create the envelope definition $ResumeDate = Read-Host "Please enter the future date for when you want to schedule this envelope as YYYY-MM-DD: " +# Step 2 start @{ emailSubject = "Please sign this document set"; documents = @( @@ -47,7 +48,6 @@ $ResumeDate = Read-Host "Please enter the future date for when you want to sched }; ); workflow = @{ scheduledSending = @{ - status = "pending"; rules = @( @{ resumeDate = $ResumeDate; @@ -82,8 +82,10 @@ $ResumeDate = Read-Host "Please enter the future date for when you want to sched }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +# Step 2 end # Step 3. Create and send the envelope +# Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -95,6 +97,7 @@ Invoke-RestMethod ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" +# Step 3 end # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index 84f4e87..9dd63a3 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -41,6 +41,7 @@ $Signer2Name = Read-Host "Please enter the name for the second signer: " $DelayInHours= Read-Host "Please enter the delay (in hours): " $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 +# Step 2 start @{ emailSubject = "Please sign this document set"; documents = @( @@ -56,7 +57,6 @@ $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 action = "pause_before"; triggerOnItem = "routing_order"; itemId = "2"; - status = "pending"; delayedRouting = @{ rules = @( @{ @@ -105,8 +105,10 @@ $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +# Step 2 end # Step 3. Create and send the envelope +# Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -116,6 +118,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +# Step 3 end Write-Output "Response: $(Get-Content -Raw $response)" From cec2261c60c38bad3d3a71560325126c3229156b Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 11 Mar 2022 10:03:51 -0800 Subject: [PATCH 136/462] removing outdated step comments --- examples/eSignature/eg035ScheduledSending.ps1 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index 35acdbc..d31722e 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -13,7 +13,6 @@ $accessToken = Get-Content .\config\ds_access_token.txt # the default picture. $accountId = Get-Content .\config\API_ACCOUNT_ID -# ***DS.snippet.0.start # document 1 (pdf) has tag /sn1/ # # The envelope has one recipient. @@ -33,9 +32,9 @@ Write-Output "Sending the envelope request to DocuSign..." Write-Output "The envelope has one document. Processing time will be about 15 seconds." Write-Output "Results:" -# Step 2. Create the envelope definition $ResumeDate = Read-Host "Please enter the future date for when you want to schedule this envelope as YYYY-MM-DD: " +# Create the envelope definition # Step 2 start @{ emailSubject = "Please sign this document set"; @@ -84,7 +83,7 @@ $ResumeDate = Read-Host "Please enter the future date for when you want to sched } | ConvertTo-Json -Depth 32 > $requestData # Step 2 end -# Step 3. Create and send the envelope +# Create and send the envelope # Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -102,7 +101,6 @@ Write-Output "Response: $(Get-Content -Raw $response)" # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId -# ***DS.snippet.0.end # Save the envelope id for use by other scripts Write-Output "EnvelopeId: $envelopeId" Write-Output $envelopeId > .\config\ENVELOPE_ID From f74051e3312d92dc429342fa5683a1cbf64d5e65 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 11 Mar 2022 10:27:31 -0800 Subject: [PATCH 137/462] remove outdated Step comments --- examples/eSignature/eg036DelayedRouting.ps1 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index 9dd63a3..3ec869a 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -13,7 +13,6 @@ $accessToken = Get-Content .\config\ds_access_token.txt # the default picture. $accountId = Get-Content .\config\API_ACCOUNT_ID -# ***DS.snippet.0.start # document (pdf) has tag /sn1/ # # The envelope has two recipients. @@ -35,12 +34,12 @@ Write-Output "Sending the envelope request to DocuSign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" -# Step 2. Create the envelope definition $Signer2Email = Read-Host "Please enter the email address for the second signer: " $Signer2Name = Read-Host "Please enter the name for the second signer: " $DelayInHours= Read-Host "Please enter the delay (in hours): " $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 +# Create the envelope definition # Step 2 start @{ emailSubject = "Please sign this document set"; @@ -107,7 +106,7 @@ $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 } | ConvertTo-Json -Depth 32 > $requestData # Step 2 end -# Step 3. Create and send the envelope +# Create and send the envelope # Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -125,7 +124,6 @@ Write-Output "Response: $(Get-Content -Raw $response)" # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId -# ***DS.snippet.0.end # Save the envelope id for use by other scripts Write-Output "EnvelopeId: $envelopeId" Write-Output $envelopeId > .\config\ENVELOPE_ID From da622180916a86ec666a206e5232a438b8265f1a Mon Sep 17 00:00:00 2001 From: Connor Lunsford Date: Mon, 14 Mar 2022 17:16:34 -0700 Subject: [PATCH 138/462] Edited startup and Choose API screens --- launcher.ps1 | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index 1a37022..642a489 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -93,7 +93,7 @@ function startLauncher { } do { Write-Output '' - Write-Output 'Choose API: ' + Write-Output 'Choose an API: ' Write-Output "$([int][listApi]::eSignature)) eSignature" Write-Output "$([int][listApi]::Rooms)) Rooms" Write-Output "$([int][listApi]::Click)) Click" @@ -220,7 +220,7 @@ function startSignature { Scheduled_Sending = 35; Delayed_Routing = 36; SMS_Delivery = 37; - Home = 38; + Pick_An_API = 38; } $ApiExamplesView = $null; @@ -263,7 +263,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" - Write-Output "$([int][ApiExamples]::Home)) Home" + Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_Api" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -389,7 +389,7 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg037SMSDelivery.ps1 } - } until ($ApiExamplesView -eq [ApiExamples]::Home) + } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } @@ -405,7 +405,7 @@ function startRooms { CreateFormGroup = 7; AccessFormGroup = 8; AssignFormGroup = 9; - Home = 10; + Pick_An_API = 10; } $listRoomExamplesView = $null; do { @@ -420,7 +420,7 @@ function startRooms { Write-Output "$([int][listRoomExamples]::CreateFormGroup)) Create a form group" Write-Output "$([int][listRoomExamples]::AccessFormGroup)) Grant office access to a form group" Write-Output "$([int][listRoomExamples]::AssignFormGroup)) Assign a form to a form group" - Write-Output "$([int][listRoomExamples]::Home)) Home" + Write-Output "$([int][listRoomExamples]::Pick_An_API)) Pick_An_API" [int]$listRoomExamplesView = Read-Host "Select the action" } while (-not [listRoomExamples]::IsDefined([listRoomExamples], $listRoomExamplesView)); @@ -451,7 +451,7 @@ function startRooms { elseif ($listRoomExamplesView -eq [listRoomExamples]::AssignFormGroup) { powershell.exe -Command .\examples\Rooms\eg009AssignFormGroup.ps1 } - } until ($listRoomExamplesView -eq [listRoomExamples]::Home) + } until ($listRoomExamplesView -eq [listRoomExamples]::Pick_An_API) startLauncher } @@ -463,7 +463,7 @@ function startClick { clickwrapVersioning = 3; retrieveClickwraps = 4; getClickwrapResponses = 5; - Home = 6; + Pick_An_API = 6; } $listClickExamplesView = $null; do { @@ -474,7 +474,7 @@ function startClick { Write-Output "$([int][listClickExamples]::clickwrapVersioning)) clickwrap Versioning" Write-Output "$([int][listClickExamples]::retrieveClickwraps)) Retrieve clickwraps" Write-Output "$([int][listClickExamples]::getClickwrapResponses)) Get clickwrap Responses" - Write-Output "$([int][listClickExamples]::Home)) Home" + Write-Output "$([int][listClickExamples]::Pick_An_API)) Pick_An_API" [int]$listClickExamplesView = Read-Host "Select the action" } while (-not [listClickExamples]::IsDefined([listClickExamples], $listClickExamplesView)); @@ -493,7 +493,7 @@ function startClick { elseif ($listClickExamplesView -eq [listClickExamples]::getClickwrapResponses) { powershell.exe -Command .\examples\Click\eg005GetClickwrapResponses.ps1 } - } until ($listClickExamplesView -eq [listClickExamples]::Home) + } until ($listClickExamplesView -eq [listClickExamples]::Pick_An_API) startLauncher } @@ -501,21 +501,21 @@ function startMonitor { do { Enum listMonitorExamples { getMonitoringData = 1; - Home = 2; + Pick_An_API = 2; } $listMonitorExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMonitorExamples]::getMonitoringData)) Get Monitoring Data" - Write-Output "$([int][listMonitorExamples]::Home)) Home" + Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" [int]$listMonitorExamplesView = Read-Host "Select the action" } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); if ($listMonitorExamplesView -eq [listMonitorExamples]::getMonitoringData) { powershell.exe -Command .\examples\Monitor\eg001getMonitoringData.ps1 } - } until ($listMonitorExamplesView -eq [listMonitorExamples]::Home) + } until ($listMonitorExamplesView -eq [listMonitorExamples]::Pick_An_API) startLauncher } @@ -527,7 +527,7 @@ function startAdmin { bulkExportUserData = 3; addUsersViaBulkImport = 4; auditUsers = 5 - Home = 6; + Pick_An_API = 6; } $listAdminExamplesView = $null; do { @@ -538,7 +538,7 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::bulkExportUserData)) Bulk-export user data" Write-Output "$([int][listAdminExamples]::addUsersViaBulkImport)) Add users via bulk import" Write-Output "$([int][listAdminExamples]::auditUsers)) Audit users" - Write-Output "$([int][listAdminExamples]::Home)) Home" + Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -564,7 +564,7 @@ function startAdmin { checkOrgId powershell.exe -Command .\examples\Admin\eg005AuditUsers.ps1 } - } until ($listAdminExamplesView -eq [listAdminExamples]::Home) + } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } From 9d08ee1ffc9d3c165c4a3fddb684abfdd7b4ec9a Mon Sep 17 00:00:00 2001 From: Connor Lunsford Date: Wed, 16 Mar 2022 10:57:55 -0700 Subject: [PATCH 139/462] Text changes --- examples/eSignature/eg003ListEnvelopes.ps1 | 2 +- examples/eSignature/eg007EnvelopeGetDoc.ps1 | 4 ++-- examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 | 7 +++---- .../eg020SigningViaEmailWithPhoneAuthentication.ps1 | 4 ---- launcher.ps1 | 2 +- 5 files changed, 7 insertions(+), 12 deletions(-) diff --git a/examples/eSignature/eg003ListEnvelopes.ps1 b/examples/eSignature/eg003ListEnvelopes.ps1 index 4208133..8f3ae9e 100644 --- a/examples/eSignature/eg003ListEnvelopes.ps1 +++ b/examples/eSignature/eg003ListEnvelopes.ps1 @@ -29,4 +29,4 @@ $(Invoke-RestMethod ` } ` -Body @{ "from_date" = ${fromDate} }).envelopes -Write-Output "Done..." +Write-Output "Done." diff --git a/examples/eSignature/eg007EnvelopeGetDoc.ps1 b/examples/eSignature/eg007EnvelopeGetDoc.ps1 index 8c38602..14b828e 100644 --- a/examples/eSignature/eg007EnvelopeGetDoc.ps1 +++ b/examples/eSignature/eg007EnvelopeGetDoc.ps1 @@ -22,7 +22,7 @@ if (Test-Path .\config\ENVELOPE_ID) { $envelopeId = Get-Content .\config\ENVELOPE_ID } else { - Write-Output "An envelope id is needed. Fix: execute code example 2 - Signing_Via_Email" + Write-Output "PROBLEM: An envelope id is needed. Fix: execute code example 2 - Signing_Via_Email" exit 1 } @@ -40,7 +40,7 @@ Enum listDocs { $listDocsView = $null; do { - Write-Output 'Select the initial sending view: ' + Write-Output 'Select a document or document set to download:' Write-Output "$([int][listDocs]::Document1) - Document 1" Write-Output "$([int][listDocs]::Document2) - Document 2" Write-Output "$([int][listDocs]::Document3) - Document 3" diff --git a/examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 b/examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 index e65e025..4d6f0ed 100644 --- a/examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 +++ b/examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 @@ -1,9 +1,8 @@ # https://developers.docusign.com/docs/esign-rest-api/how-to/require-access-code-recipient/ -# Get required environment variables from .\config\settings.json file -$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -$SIGNER_EMAIL = $variables.SIGNER_EMAIL -$SIGNER_NAME = $variables.SIGNER_NAME +# Get email and name from the user +$SIGNER_EMAIL = Read-Host "Please enter a signer email address: " +$SIGNER_NAME = Read-Host "Please enter a signer name: " # Get the envelope's custom field data # This script uses the envelope ID stored in ../envelope_id. diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index 447211b..91100c8 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -52,10 +52,6 @@ if ($null -eq $workflowId) throw "Please contact https://support.docusign.com to enable recipient phone authentication in your account." } -$SIGNER_NAME = Read-Host "Please enter name for the signer" - -$SIGNER_EMAIL = Read-Host "Please enter email address for the signer" - $SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient authentication for the signer" $SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" diff --git a/launcher.ps1 b/launcher.ps1 index 642a489..00c3eb8 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -263,7 +263,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" - Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_Api" + Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); From 7819d5aab3d2c453f7301b211081758dcec55498 Mon Sep 17 00:00:00 2001 From: Connor Lunsford Date: Wed, 16 Mar 2022 15:28:40 -0700 Subject: [PATCH 140/462] Mostly text changes --- examples/Click/eg001CreateClickwrap.ps1 | 1 + examples/Click/eg002ActivateClickwrap.ps1 | 1 + .../Click/eg003CreateNewClickwrapVersion.ps1 | 1 + examples/Click/eg004GetListOfClickwraps.ps1 | 1 + examples/Click/eg005GetClickwrapResponses.ps1 | 1 + .../eg024CreatingPermissionProfiles.ps1 | 2 +- .../eg034UseConditionalRecipients.ps1 | 5 +++++ examples/eSignature/eg037SMSDelivery.ps1 | 17 +++++++++-------- 8 files changed, 20 insertions(+), 9 deletions(-) diff --git a/examples/Click/eg001CreateClickwrap.ps1 b/examples/Click/eg001CreateClickwrap.ps1 index 6c60997..5ab764e 100644 --- a/examples/Click/eg001CreateClickwrap.ps1 +++ b/examples/Click/eg001CreateClickwrap.ps1 @@ -41,6 +41,7 @@ $body = @" # b) Display the JSON structure of the created clickwrap $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method POST -Body $body +Write-Output "Response: " $result.Content # Store clickwrapId to the file for future reference diff --git a/examples/Click/eg002ActivateClickwrap.ps1 b/examples/Click/eg002ActivateClickwrap.ps1 index 11750f0..c041a08 100644 --- a/examples/Click/eg002ActivateClickwrap.ps1 +++ b/examples/Click/eg002ActivateClickwrap.ps1 @@ -31,4 +31,5 @@ $body = @" # b) Display the JSON structure of the created clickwrap $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/versions/$VersionNumber" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method PUT -Body $body +Write-Output "Response: " $result.Content diff --git a/examples/Click/eg003CreateNewClickwrapVersion.ps1 b/examples/Click/eg003CreateNewClickwrapVersion.ps1 index e75926d..fb67bbd 100644 --- a/examples/Click/eg003CreateNewClickwrapVersion.ps1 +++ b/examples/Click/eg003CreateNewClickwrapVersion.ps1 @@ -53,4 +53,5 @@ $body = @" # b) Display the returned JSON structure of the versioned clickwrap $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/versions" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -body $body -Method POST +Write-Output "Response: " $result.Content diff --git a/examples/Click/eg004GetListOfClickwraps.ps1 b/examples/Click/eg004GetListOfClickwraps.ps1 index 988bf76..39671d7 100644 --- a/examples/Click/eg004GetListOfClickwraps.ps1 +++ b/examples/Click/eg004GetListOfClickwraps.ps1 @@ -13,4 +13,5 @@ $headers.add("Content-Type", "application/json") # b) Display the JSON structure of the returned clickwraps $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method GET +Write-Output "Response: " $result.Content diff --git a/examples/Click/eg005GetClickwrapResponses.ps1 b/examples/Click/eg005GetClickwrapResponses.ps1 index 5ff769d..9fd9a3f 100644 --- a/examples/Click/eg005GetClickwrapResponses.ps1 +++ b/examples/Click/eg005GetClickwrapResponses.ps1 @@ -22,4 +22,5 @@ $headers.add("Content-Type", "application/json") # b) Display the returned JSON structure of the responses $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/users" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method GET +Write-Output "Response: " $result.Content \ No newline at end of file diff --git a/examples/eSignature/eg024CreatingPermissionProfiles.ps1 b/examples/eSignature/eg024CreatingPermissionProfiles.ps1 index fb7f5ca..dc973d6 100644 --- a/examples/eSignature/eg024CreatingPermissionProfiles.ps1 +++ b/examples/eSignature/eg024CreatingPermissionProfiles.ps1 @@ -8,7 +8,7 @@ $oAuthAccessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $APIAccountId = Get-Content .\config\API_ACCOUNT_ID -$PROFILE_NAME = Read-Host "Please enter a new permission profile name" +$PROFILE_NAME = Read-Host "Please enter a new permission profile name: " $PROFILE_NAME > .\config\PROFILE_NAME # Construct your API headers diff --git a/examples/eSignature/eg034UseConditionalRecipients.ps1 b/examples/eSignature/eg034UseConditionalRecipients.ps1 index 2c6383f..bda28ff 100644 --- a/examples/eSignature/eg034UseConditionalRecipients.ps1 +++ b/examples/eSignature/eg034UseConditionalRecipients.ps1 @@ -28,6 +28,9 @@ $SIGNER_WHEN_CHECKED_NAME = $variables.CC_NAME $SIGNER_NOT_CHECKED_EMAIL = $variables.SIGNER_NOT_CHECKED_EMAIL $SIGNER_NOT_CHECKED_NAME = $variables.SIGNER_NOT_CHECKED_NAME +Write-Output "SIGNER_NOT_CHECKED_EMAIL is $SIGNER_NOT_CHECKED_EMAIL" +Write-Output "SIGNER_NOT_CHECKED_NAME is $SIGNER_NOT_CHECKED_NAME" + # Step 2. Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") @@ -196,6 +199,8 @@ $response = New-TemporaryFile # Step 4. Call the eSignature API try { + Write-Output "Request: " + Write-Output $requestData $uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes" Invoke-RestMethod ` -Uri $uri ` diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index 74835f6..cdd001c 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -37,15 +37,11 @@ $doc3Base64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 -Write-Output "Sending the envelope request to DocuSign..." -Write-Output "The envelope has three documents. Processing time will be about 15 seconds." -Write-Output "Results:" - # Step 2. Create the envelope definition -$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer" -$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer" -$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient" -$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient" +$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer: " +$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer: " +$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient: " +$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient: " @{ emailSubject = "Please sign this document set"; @@ -112,6 +108,11 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +Write-Output "Sending the envelope request to DocuSign..." +Write-Output "The envelope has three documents. Processing time will be about 15 seconds." +Write-Output "Results:" +Write-Output $requestData + # Step 3. Create and send the envelope Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` From 79b24710a5ddc9f0438feb3f4f330646ae617125 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 22 Mar 2022 12:32:32 -0700 Subject: [PATCH 141/462] matched text to Bash; added step comments --- examples/eSignature/eg037SMSDelivery.ps1 | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index 74835f6..2d6dfc2 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -13,7 +13,6 @@ $accessToken = Get-Content .\config\ds_access_token.txt # the default picture. $accountId = Get-Content .\config\API_ACCOUNT_ID -# ***DS.snippet.0.start # document 1 (html) has tag **signature_1** # document 2 (docx) has tag /sn1/ # document 3 (pdf) has tag /sn1/ @@ -41,12 +40,13 @@ Write-Output "Sending the envelope request to DocuSign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" -# Step 2. Create the envelope definition -$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer" -$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer" -$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient" -$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient" +# Create the envelope definition +$SMSCountryPrefix = Read-Host "Enter signer phone country code (U.S. is 1): " +$SMSNumber = Read-Host "Enter signer phone number: " +$SMSCCCountryPrefix = Read-Host "Enter CC phone country code (U.S. is 1): " +$SMSNumberCC = Read-Host "Enter CC phone number: " +# Step 2 start @{ emailSubject = "Please sign this document set"; documents = @( @@ -111,8 +111,10 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +# Step 2 end -# Step 3. Create and send the envelope +# Create and send the envelope +# Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -124,11 +126,11 @@ Invoke-RestMethod ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" +# Step 3 end # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId -# ***DS.snippet.0.end # Save the envelope id for use by other scripts Write-Output "EnvelopeId: $envelopeId" Write-Output $envelopeId > .\config\ENVELOPE_ID From 9e659dfceeb2f46258c79cd22b6d47fce9ebf4fb Mon Sep 17 00:00:00 2001 From: Connor Lunsford Date: Tue, 22 Mar 2022 15:15:00 -0700 Subject: [PATCH 142/462] Fixed mustView bug with click1 and 3 --- examples/Click/eg001CreateClickwrap.ps1 | 1 - examples/Click/eg003CreateNewClickwrapVersion.ps1 | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/Click/eg001CreateClickwrap.ps1 b/examples/Click/eg001CreateClickwrap.ps1 index 6c60997..0864302 100644 --- a/examples/Click/eg001CreateClickwrap.ps1 +++ b/examples/Click/eg001CreateClickwrap.ps1 @@ -18,7 +18,6 @@ $body = @" "format": "modal", "hasAccept": true, "mustRead": true, - "mustView": true, "requireAccept": true, "size": "medium", "documentDisplay": "document" diff --git a/examples/Click/eg003CreateNewClickwrapVersion.ps1 b/examples/Click/eg003CreateNewClickwrapVersion.ps1 index e75926d..89083e0 100644 --- a/examples/Click/eg003CreateNewClickwrapVersion.ps1 +++ b/examples/Click/eg003CreateNewClickwrapVersion.ps1 @@ -25,7 +25,6 @@ $body = @" "displaySettings": { "displayName": "Terms of Service v2", "mustRead": true, - "mustView": false, "requireAccept": false, "downloadable": false, "sendToEmail": false, From d6561f10c8bbb29858d9a20d7c0dd1268f6f2e03 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Fri, 1 Apr 2022 14:03:03 +0300 Subject: [PATCH 143/462] added new example --- .../eSignature/eg038ResponsiveSigning.ps1 | 145 ++++++++++++++++++ launcher.ps1 | 8 +- 2 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg038ResponsiveSigning.ps1 diff --git a/examples/eSignature/eg038ResponsiveSigning.ps1 b/examples/eSignature/eg038ResponsiveSigning.ps1 new file mode 100644 index 0000000..c67a282 --- /dev/null +++ b/examples/eSignature/eg038ResponsiveSigning.ps1 @@ -0,0 +1,145 @@ +$apiUri = "https://demo.docusign.net/restapi" + +# Responsive signing + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# 1. Obtain your OAuth token +$accessToken = Get-Content .\config\ds_access_token.txt + +# Obtain your accountId from demo.docusign.net -- the account id is shown in +# the drop down on the upper right corner of the screen by your picture or +# the default picture. +$accountID = Get-Content .\config\API_ACCOUNT_ID + +# Step 2. Create the envelope definition. +# The signer recipient includes a clientUserId setting +# +# document 1 (PDF) has tag /sn1/ +# recipient 1 - signer +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$doc_html = New-TemporaryFile + +# Fetch doc +[IO.File]::ReadAllText(".\demo_documents\order_form.html") > $doc_html + +Write-Output "Sending the envelope request to DocuSign..." + +# Concatenate the different parts of the request +@{ + emailSubject = "Example Signing Document"; + documents = @( + @{ + name = "doc1.html"; + documentId = "1"; + htmlDefinition = @{ + source = "$(Get-Content $doc_html)"; + }; + }; + ); + recipients = @{ + signers = @( + @{ + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "1"; + routingOrder = "1"; + clientUserId = "1000"; + tabs = @{ + signHereTabs = @( + @{ + stampType = "signature"; + name = "SignHere"; + tabLabel = "signatureTab"; + scaleValue = "1"; + optional = "false"; + documentId = "1"; + recipientId = "1"; + pageNumber = "1"; + xPosition = "140"; + yPosition = "355"; + }; + ); + }; + }; + ); + carbonCopies = @( + @{ + email = $variables.CC_EMAIL; + name = $variables.CC_NAME; + recipientId = "2"; + routingOrder = "2"; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +# Step 3. Call DocuSign to create the envelope +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId +Write-Output "EnvelopeId: $envelopeId" + +# Step 4. Create a recipient view definition +# The signer will directly open this link from the browser to sign. +# +# The returnUrl is normally your own web app. DocuSign will redirect +# the signer to returnUrl when the signing completes. +# For this example, we'll use http://httpbin.org/get to show the +# query parameters passed back from DocuSign + +Write-Output "Requesting the url for the embedded signing..." + +$json = [ordered]@{ + 'returnUrl' = 'http://httpbin.org/get'; + 'authenticationMethod' = 'none'; + 'email' = $variables.SIGNER_EMAIL; + 'userName' = $variables.SIGNER_NAME; + 'clientUserId' = 1000 +} | ConvertTo-Json -Compress + + +# Step 5. Create the recipient view and begin the DocuSign signing +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -Body $json ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" +$signingUrl = $(Get-Content $response | ConvertFrom-Json).url + +# ***DS.snippet.0.end +Write-Output "The embedded signing URL is $signingUrl" +Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." + +Start-Process $signingUrl + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $doc_html + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 00c3eb8..33b8f01 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -220,7 +220,8 @@ function startSignature { Scheduled_Sending = 35; Delayed_Routing = 36; SMS_Delivery = 37; - Pick_An_API = 38; + Responsive_Signing = 38; + Pick_An_API = 39; } $ApiExamplesView = $null; @@ -263,6 +264,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" + Write-Output "$([int][ApiExamples]::Responsive_Signing)) Responsive_Signing" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -389,6 +391,10 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg037SMSDelivery.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Responsive_Signing) { + checkCC + powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } From 2160388e65081e10523674292ded4a898226ea91 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Mon, 4 Apr 2022 10:32:42 +0300 Subject: [PATCH 144/462] fixed comment --- examples/eSignature/eg038ResponsiveSigning.ps1 | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg038ResponsiveSigning.ps1 b/examples/eSignature/eg038ResponsiveSigning.ps1 index c67a282..268909a 100644 --- a/examples/eSignature/eg038ResponsiveSigning.ps1 +++ b/examples/eSignature/eg038ResponsiveSigning.ps1 @@ -16,10 +16,8 @@ $accountID = Get-Content .\config\API_ACCOUNT_ID # Step 2. Create the envelope definition. # The signer recipient includes a clientUserId setting # -# document 1 (PDF) has tag /sn1/ -# recipient 1 - signer -# The envelope will be sent first to the signer. -# After it is signed, a copy is sent to the cc person. +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. # temp files: $requestData = New-TemporaryFile From 0d3d7df438de9f588ff631c9d9eca3c7cf130c52 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Thu, 7 Apr 2022 11:14:48 +0300 Subject: [PATCH 145/462] updated tabs --- .../eSignature/eg038ResponsiveSigning.ps1 | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/examples/eSignature/eg038ResponsiveSigning.ps1 b/examples/eSignature/eg038ResponsiveSigning.ps1 index 268909a..8c5e132 100644 --- a/examples/eSignature/eg038ResponsiveSigning.ps1 +++ b/examples/eSignature/eg038ResponsiveSigning.ps1 @@ -27,6 +27,13 @@ $doc_html = New-TemporaryFile # Fetch doc [IO.File]::ReadAllText(".\demo_documents\order_form.html") > $doc_html +# Insert inner HTML + +((Get-Content $doc_html) ` + -replace '/sn1/', '' ` + -replace '/l1q/', '' ` + -replace '/l2q/', '') | Set-Content $doc_html + Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request @@ -49,22 +56,7 @@ Write-Output "Sending the envelope request to DocuSign..." recipientId = "1"; routingOrder = "1"; clientUserId = "1000"; - tabs = @{ - signHereTabs = @( - @{ - stampType = "signature"; - name = "SignHere"; - tabLabel = "signatureTab"; - scaleValue = "1"; - optional = "false"; - documentId = "1"; - recipientId = "1"; - pageNumber = "1"; - xPosition = "140"; - yPosition = "355"; - }; - ); - }; + roleName = "Signer"; }; ); carbonCopies = @( From 197b5de71f0b429ae71e38e54a7456eae0658d0b Mon Sep 17 00:00:00 2001 From: Connor Lunsford Date: Mon, 18 Apr 2022 14:08:17 -0700 Subject: [PATCH 146/462] Edited click1 to take user input for name --- examples/Click/eg001CreateClickwrap.ps1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/Click/eg001CreateClickwrap.ps1 b/examples/Click/eg001CreateClickwrap.ps1 index f5671fa..dd56830 100644 --- a/examples/Click/eg001CreateClickwrap.ps1 +++ b/examples/Click/eg001CreateClickwrap.ps1 @@ -2,6 +2,8 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID +$clickwrapName = Read-Host "Please input a name for the clickwrap: " + # Step 2. Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") @@ -30,7 +32,7 @@ $body = @" "order": 0 } ], - "name": "Terms of Service", + "name": "$clickwrapName", "requireReacceptance": true } "@ From b513986e203bf2c0f82d706bd5b9b6e57aae7044 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 21 Apr 2022 10:26:34 -0700 Subject: [PATCH 147/462] Minor text changes --- launcher.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index 33b8f01..ca9fa33 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -220,7 +220,7 @@ function startSignature { Scheduled_Sending = 35; Delayed_Routing = 36; SMS_Delivery = 37; - Responsive_Signing = 38; + Create_Signable_HTML_document = 38; Pick_An_API = 39; } @@ -264,7 +264,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" - Write-Output "$([int][ApiExamples]::Responsive_Signing)) Responsive_Signing" + Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -391,7 +391,7 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg037SMSDelivery.ps1 } - elseif ($ApiExamplesView -eq [ApiExamples]::Responsive_Signing) { + elseif ($ApiExamplesView -eq [ApiExamples]::Create_Signable_HTML_document) { checkCC powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 } From bd45919d8c433246dd1b23d7265beac1df23012b Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 21 Apr 2022 13:06:33 -0700 Subject: [PATCH 148/462] Adding new Create Signable HTML document code example --- .../eSignature/eg038ResponsiveSigning.ps1 | 135 ++++++++++++++++++ launcher.ps1 | 8 +- 2 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg038ResponsiveSigning.ps1 diff --git a/examples/eSignature/eg038ResponsiveSigning.ps1 b/examples/eSignature/eg038ResponsiveSigning.ps1 new file mode 100644 index 0000000..8c5e132 --- /dev/null +++ b/examples/eSignature/eg038ResponsiveSigning.ps1 @@ -0,0 +1,135 @@ +$apiUri = "https://demo.docusign.net/restapi" + +# Responsive signing + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# 1. Obtain your OAuth token +$accessToken = Get-Content .\config\ds_access_token.txt + +# Obtain your accountId from demo.docusign.net -- the account id is shown in +# the drop down on the upper right corner of the screen by your picture or +# the default picture. +$accountID = Get-Content .\config\API_ACCOUNT_ID + +# Step 2. Create the envelope definition. +# The signer recipient includes a clientUserId setting +# +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$doc_html = New-TemporaryFile + +# Fetch doc +[IO.File]::ReadAllText(".\demo_documents\order_form.html") > $doc_html + +# Insert inner HTML + +((Get-Content $doc_html) ` + -replace '/sn1/', '' ` + -replace '/l1q/', '' ` + -replace '/l2q/', '') | Set-Content $doc_html + +Write-Output "Sending the envelope request to DocuSign..." + +# Concatenate the different parts of the request +@{ + emailSubject = "Example Signing Document"; + documents = @( + @{ + name = "doc1.html"; + documentId = "1"; + htmlDefinition = @{ + source = "$(Get-Content $doc_html)"; + }; + }; + ); + recipients = @{ + signers = @( + @{ + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "1"; + routingOrder = "1"; + clientUserId = "1000"; + roleName = "Signer"; + }; + ); + carbonCopies = @( + @{ + email = $variables.CC_EMAIL; + name = $variables.CC_NAME; + recipientId = "2"; + routingOrder = "2"; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +# Step 3. Call DocuSign to create the envelope +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId +Write-Output "EnvelopeId: $envelopeId" + +# Step 4. Create a recipient view definition +# The signer will directly open this link from the browser to sign. +# +# The returnUrl is normally your own web app. DocuSign will redirect +# the signer to returnUrl when the signing completes. +# For this example, we'll use http://httpbin.org/get to show the +# query parameters passed back from DocuSign + +Write-Output "Requesting the url for the embedded signing..." + +$json = [ordered]@{ + 'returnUrl' = 'http://httpbin.org/get'; + 'authenticationMethod' = 'none'; + 'email' = $variables.SIGNER_EMAIL; + 'userName' = $variables.SIGNER_NAME; + 'clientUserId' = 1000 +} | ConvertTo-Json -Compress + + +# Step 5. Create the recipient view and begin the DocuSign signing +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -Body $json ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" +$signingUrl = $(Get-Content $response | ConvertFrom-Json).url + +# ***DS.snippet.0.end +Write-Output "The embedded signing URL is $signingUrl" +Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." + +Start-Process $signingUrl + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $doc_html + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 00c3eb8..ca9fa33 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -220,7 +220,8 @@ function startSignature { Scheduled_Sending = 35; Delayed_Routing = 36; SMS_Delivery = 37; - Pick_An_API = 38; + Create_Signable_HTML_document = 38; + Pick_An_API = 39; } $ApiExamplesView = $null; @@ -263,6 +264,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" + Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -389,6 +391,10 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg037SMSDelivery.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Create_Signable_HTML_document) { + checkCC + powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } From 4e46b1272aac1abfc6ed8415ebd8e46f0d25ae9e Mon Sep 17 00:00:00 2001 From: annahileta Date: Mon, 16 May 2022 17:02:02 +0300 Subject: [PATCH 149/462] added a post web query code example --- examples/Monitor/eg002WebQueryEndpoint.ps1 | 73 ++++++++++++++++++++++ launcher.ps1 | 6 +- 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 examples/Monitor/eg002WebQueryEndpoint.ps1 diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 new file mode 100644 index 0000000..6ee4a64 --- /dev/null +++ b/examples/Monitor/eg002WebQueryEndpoint.ps1 @@ -0,0 +1,73 @@ +# Step 1. Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# Step 2. Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +$BeginDate = Read-Host "Please enter the beginning date after which you want to query results as YYYY-MM-DD: " +$EndDate = Read-Host "Please enter the ending date before which you want to query results as YYYY-MM-DD: " + +# You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint +if (($accessToken -eq "") -or ($null -eq $accessToken)) { + Write-Output "You must provide an access token" +} + +# Step 3 start +# Filter parameters +$body = @" +{ + "filters": [ + { + "FilterName": "Time", + "BeginTime": "$BeginDate", + "EndTime": "$EndDate" + }, + { + "FilterName": "Has", + "ColumnName": "AccountId", + "Value": "$accountId" + } + ], + "aggregations": [ + { + "aggregationName": "Raw", + "limit": "1", + "orderby": [ + "Timestamp, desc" + ] + } + ] +} +"@ +# Step 3 end + +# a) Make a POST call to the postWebQuery endpoint to query the companies data. +# b) Display the JSON structure of the created envelope +# Step 4 start +$uri = "https://lens-d.docusign.net/api/v2.0/datasets/monitor/web_query" +try { + Write-Output "Response:" + $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $result.content +} +catch { + $int = 0 + foreach($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} +# Step 4 end + +Write-Output "" +Write-Output "" +Write-Output "Done." +Write-Output "" diff --git a/launcher.ps1 b/launcher.ps1 index ca9fa33..545065c 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -507,19 +507,23 @@ function startMonitor { do { Enum listMonitorExamples { getMonitoringData = 1; - Pick_An_API = 2; + postWebQuery = 2; + Pick_An_API = 3; } $listMonitorExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMonitorExamples]::getMonitoringData)) Get Monitoring Data" + Write-Output "$([int][listMonitorExamples]::postWebQuery)) Web query endpoint" Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" [int]$listMonitorExamplesView = Read-Host "Select the action" } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); if ($listMonitorExamplesView -eq [listMonitorExamples]::getMonitoringData) { powershell.exe -Command .\examples\Monitor\eg001getMonitoringData.ps1 + } elseif ($listMonitorExamplesView -eq [listMonitorExamples]::postWebQuery) { + powershell.exe -Command .\examples\Monitor\eg002WebQueryEndpoint.ps1 } } until ($listMonitorExamplesView -eq [listMonitorExamples]::Pick_An_API) startLauncher From 5552247f2849a830fae246d66162e3717a2998c2 Mon Sep 17 00:00:00 2001 From: annahileta Date: Fri, 20 May 2022 15:36:57 +0300 Subject: [PATCH 150/462] changed variable naming to lowercase --- examples/Monitor/eg002WebQueryEndpoint.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 index 6ee4a64..98d7799 100644 --- a/examples/Monitor/eg002WebQueryEndpoint.ps1 +++ b/examples/Monitor/eg002WebQueryEndpoint.ps1 @@ -8,8 +8,8 @@ $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -$BeginDate = Read-Host "Please enter the beginning date after which you want to query results as YYYY-MM-DD: " -$EndDate = Read-Host "Please enter the ending date before which you want to query results as YYYY-MM-DD: " +$beginDate = Read-Host "Please enter the beginning date after which you want to query results as YYYY-MM-DD: " +$endDate = Read-Host "Please enter the ending date before which you want to query results as YYYY-MM-DD: " # You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint if (($accessToken -eq "") -or ($null -eq $accessToken)) { @@ -23,8 +23,8 @@ $body = @" "filters": [ { "FilterName": "Time", - "BeginTime": "$BeginDate", - "EndTime": "$EndDate" + "BeginTime": "$beginDate", + "EndTime": "$endDate" }, { "FilterName": "Has", From ba4c9530a3ea3940da07ba00c7976775fa269012 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Mon, 30 May 2022 23:31:30 +0300 Subject: [PATCH 151/462] added new examples --- examples/Admin/eg006GetUserProfileByEmail.ps1 | 32 +++++++++++++++++++ .../Admin/eg007GetUserProfileByUserId.ps1 | 32 +++++++++++++++++++ launcher.ps1 | 16 ++++++++-- 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 examples/Admin/eg006GetUserProfileByEmail.ps1 create mode 100644 examples/Admin/eg007GetUserProfileByUserId.ps1 diff --git a/examples/Admin/eg006GetUserProfileByEmail.ps1 b/examples/Admin/eg006GetUserProfileByEmail.ps1 new file mode 100644 index 0000000..2e32d56 --- /dev/null +++ b/examples/Admin/eg006GetUserProfileByEmail.ps1 @@ -0,0 +1,32 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# Construct your API headers +# Step 2 start +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +# Step 2 end + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# Check that we have an organization id in the settings.json config file +if (!$variables.ORGANIZATION_ID) { + Write-Output "Organization ID is needed. Please add the ORGANIZATION_ID variable to the settings.json" + exit -1 +} + +$base_path = "https://api-d.docusign.net/management" +$organizationId = $variables.ORGANIZATION_ID + +$email = Read-Host "Enter an email of the user" + +$result = "" +# Call the DocuSign Admin API +# Step 3 start +$uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${email}" +$result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET +$result.Content +# Step 3 end diff --git a/examples/Admin/eg007GetUserProfileByUserId.ps1 b/examples/Admin/eg007GetUserProfileByUserId.ps1 new file mode 100644 index 0000000..67533c8 --- /dev/null +++ b/examples/Admin/eg007GetUserProfileByUserId.ps1 @@ -0,0 +1,32 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# Construct your API headers +# Step 2 start +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +# Step 2 end + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# Check that we have an organization id in the settings.json config file +if (!$variables.ORGANIZATION_ID) { + Write-Output "Organization ID is needed. Please add the ORGANIZATION_ID variable to the settings.json" + exit -1 +} + +$base_path = "https://api-d.docusign.net/management" +$organizationId = $variables.ORGANIZATION_ID + +$userId = Read-Host "Enter an ID(GUID) of the user" + +$result = "" +# Call the DocuSign Admin API +# Step 3 start +$uri = "${base_path}/v2.1/organizations/${organizationId}/users/${userId}/dsprofile" +$result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET +$result.Content +# Step 3 end diff --git a/launcher.ps1 b/launcher.ps1 index ca9fa33..d9452e5 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -532,8 +532,10 @@ function startAdmin { createActiveCLMEsignUser = 2; bulkExportUserData = 3; addUsersViaBulkImport = 4; - auditUsers = 5 - Pick_An_API = 6; + auditUsers = 5; + getUserDSProfilesByEmail = 6; + getUserProfileByUserId = 7; + Pick_An_API = 8; } $listAdminExamplesView = $null; do { @@ -544,6 +546,8 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::bulkExportUserData)) Bulk-export user data" Write-Output "$([int][listAdminExamples]::addUsersViaBulkImport)) Add users via bulk import" Write-Output "$([int][listAdminExamples]::auditUsers)) Audit users" + Write-Output "$([int][listAdminExamples]::getUserDSProfilesByEmail)) Get user profile by email" + Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Get user profile by ID" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -570,6 +574,14 @@ function startAdmin { checkOrgId powershell.exe -Command .\examples\Admin\eg005AuditUsers.ps1 } + elseif ($listAdminExamplesView -eq [listAdminExamples]::getUserDSProfilesByEmail) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg006GetUserProfileByEmail.ps1 + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::getUserProfileByUserId) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg007GetUserProfileByUserId.ps1 + } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } From d8566a6fb94dd62bdd1d07bf06d407504ba2565d Mon Sep 17 00:00:00 2001 From: annahileta Date: Fri, 3 Jun 2022 17:25:01 +0300 Subject: [PATCH 152/462] added a quick ACG project --- Quick_ACG/launcherACG.ps1 | 59 +++++++++++++++++++++++++++++++++++++++ eg001EmbeddedSigning.ps1 | 31 ++++++++++++++++---- 2 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 Quick_ACG/launcherACG.ps1 diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 new file mode 100644 index 0000000..862ed01 --- /dev/null +++ b/Quick_ACG/launcherACG.ps1 @@ -0,0 +1,59 @@ +$ErrorActionPreference = "Stop" # force stop on failure + +$configFile = "..\config\settings.json" + +if ((Test-Path $configFile) -eq $False) { + Write-Output "Error: " + Write-Output "First copy the file '..\config\settings.example.json' to '$configFile'." + Write-Output "Next, fill in your API credentials, Signer name and email to continue." +} + +# Get required environment variables from ..\config\settings.json file +$config = Get-Content $configFile -Raw | ConvertFrom-Json + +function startQuickACG { + Write-Output '' + Write-Output "Authentication in progress, please wait" + Write-Output '' + powershell.exe -Command ..\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") + Write-Output '' + + if ((Test-Path "../config/ds_access_token.txt") -eq $true) { + powershell.exe -Command ..\eg001EmbeddedSigning.ps1 + Write-Output '' + startSignature + } + else { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } +} + +function startSignature { + do { + # Preparing a list of menu options + Enum MenuOptions { + Embedded_Signing = 1; + Exit = 2; + } + + $MenuOptionsView = $null; + do { + Write-Output "" + Write-Output 'Pick the next action: ' + Write-Output "$([int][MenuOptions]::Embedded_Signing)) Rerun the embeddd signing code example" + Write-Output "$([int][MenuOptions]::Exit)) Exit" + [int]$MenuOptionsView = Read-Host "Pick the next action" + } while (-not [MenuOptions]::IsDefined([MenuOptions], $MenuOptionsView)); + + if ($MenuOptionsView -eq [MenuOptions]::Embedded_Signing) { + powershell.exe -Command ..\eg001EmbeddedSigning.ps1 + } + elseif ($MenuOptionsView -eq [MenuOptions]::Exit) { + exit 1 + } + } until ($MenuOptionsView -eq [MenuOptions]::Exit) + exit 1 +} + +Write-Output "Welcome to the DocuSign PowerShell Quick Authorization Code Grant Launcher" +startQuickACG diff --git a/eg001EmbeddedSigning.ps1 b/eg001EmbeddedSigning.ps1 index 01597ca..c475ab0 100644 --- a/eg001EmbeddedSigning.ps1 +++ b/eg001EmbeddedSigning.ps1 @@ -1,19 +1,31 @@ $apiUri = "https://demo.docusign.net/restapi" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $configPath) -eq $false) { + $configPath = "..\config\settings.json" +} +if ((Test-Path $tokenPath) -eq $false) { + $tokenPath = "..\config\ds_access_token.txt" +} +if ((Test-Path $accountIdPath) -eq $false) { + $accountIdPath = "..\config\API_ACCOUNT_ID" +} # Use embedded signing # Get required variables from .\config\settings.json file -$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json - - +$variables = Get-Content $configPath -Raw | ConvertFrom-Json # 1. Obtain your OAuth token -$accessToken = Get-Content .\config\ds_access_token.txt +$accessToken = Get-Content $tokenPath # Obtain your accountId from demo.docusign.net -- the account id is shown in # the drop down on the upper right corner of the screen by your picture or # the default picture. -$accountID = Get-Content .\config\API_ACCOUNT_ID +$accountID = Get-Content $accountIdPath # Step 2. Create the envelope definition. # The signer recipient includes a clientUserId setting @@ -28,8 +40,15 @@ $requestData = New-TemporaryFile $response = New-TemporaryFile $doc1Base64 = New-TemporaryFile +$docPath = ".\demo_documents\World_Wide_Corp_lorem.pdf" + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $docPath) -eq $false) { + $docPath = "..\demo_documents\World_Wide_Corp_lorem.pdf" +} + # Fetch doc and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc1Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $doc1Base64 Write-Output "Sending the envelope request to DocuSign..." From 6e1bf973396ddd0df79ff6c9b7c00a998dd99023 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 10 Jun 2022 10:58:09 -0700 Subject: [PATCH 153/462] Text changes --- examples/Admin/eg006GetUserProfileByEmail.ps1 | 3 +-- examples/Admin/eg007GetUserProfileByUserId.ps1 | 3 +-- launcher.ps1 | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/Admin/eg006GetUserProfileByEmail.ps1 b/examples/Admin/eg006GetUserProfileByEmail.ps1 index 2e32d56..f89cd78 100644 --- a/examples/Admin/eg006GetUserProfileByEmail.ps1 +++ b/examples/Admin/eg006GetUserProfileByEmail.ps1 @@ -1,6 +1,5 @@ # Get required environment variables from .\config\settings.json file $accessToken = Get-Content .\config\ds_access_token.txt -$accountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers # Step 2 start @@ -21,7 +20,7 @@ if (!$variables.ORGANIZATION_ID) { $base_path = "https://api-d.docusign.net/management" $organizationId = $variables.ORGANIZATION_ID -$email = Read-Host "Enter an email of the user" +$email = Read-Host "Enter the user's email address" $result = "" # Call the DocuSign Admin API diff --git a/examples/Admin/eg007GetUserProfileByUserId.ps1 b/examples/Admin/eg007GetUserProfileByUserId.ps1 index 67533c8..9d17051 100644 --- a/examples/Admin/eg007GetUserProfileByUserId.ps1 +++ b/examples/Admin/eg007GetUserProfileByUserId.ps1 @@ -1,6 +1,5 @@ # Get required environment variables from .\config\settings.json file $accessToken = Get-Content .\config\ds_access_token.txt -$accountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers # Step 2 start @@ -21,7 +20,7 @@ if (!$variables.ORGANIZATION_ID) { $base_path = "https://api-d.docusign.net/management" $organizationId = $variables.ORGANIZATION_ID -$userId = Read-Host "Enter an ID(GUID) of the user" +$userId = Read-Host "Enter the user's User ID" $result = "" # Call the DocuSign Admin API diff --git a/launcher.ps1 b/launcher.ps1 index d9452e5..95f1332 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -546,8 +546,8 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::bulkExportUserData)) Bulk-export user data" Write-Output "$([int][listAdminExamples]::addUsersViaBulkImport)) Add users via bulk import" Write-Output "$([int][listAdminExamples]::auditUsers)) Audit users" - Write-Output "$([int][listAdminExamples]::getUserDSProfilesByEmail)) Get user profile by email" - Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Get user profile by ID" + Write-Output "$([int][listAdminExamples]::getUserDSProfilesByEmail)) Retrieve the user's DocuSign profile using an email address" + Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Retrieve the user's DocuSign profile using a User ID" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); From 51137877b851b4c330ba6789a7a831dc5a8ad809 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 10 Jun 2022 13:16:30 -0700 Subject: [PATCH 154/462] Adding two new Admin API code examples --- examples/Admin/eg006GetUserProfileByEmail.ps1 | 31 +++++++++++++++++++ .../Admin/eg007GetUserProfileByUserId.ps1 | 31 +++++++++++++++++++ launcher.ps1 | 16 ++++++++-- 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 examples/Admin/eg006GetUserProfileByEmail.ps1 create mode 100644 examples/Admin/eg007GetUserProfileByUserId.ps1 diff --git a/examples/Admin/eg006GetUserProfileByEmail.ps1 b/examples/Admin/eg006GetUserProfileByEmail.ps1 new file mode 100644 index 0000000..f89cd78 --- /dev/null +++ b/examples/Admin/eg006GetUserProfileByEmail.ps1 @@ -0,0 +1,31 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt + +# Construct your API headers +# Step 2 start +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +# Step 2 end + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# Check that we have an organization id in the settings.json config file +if (!$variables.ORGANIZATION_ID) { + Write-Output "Organization ID is needed. Please add the ORGANIZATION_ID variable to the settings.json" + exit -1 +} + +$base_path = "https://api-d.docusign.net/management" +$organizationId = $variables.ORGANIZATION_ID + +$email = Read-Host "Enter the user's email address" + +$result = "" +# Call the DocuSign Admin API +# Step 3 start +$uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${email}" +$result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET +$result.Content +# Step 3 end diff --git a/examples/Admin/eg007GetUserProfileByUserId.ps1 b/examples/Admin/eg007GetUserProfileByUserId.ps1 new file mode 100644 index 0000000..9d17051 --- /dev/null +++ b/examples/Admin/eg007GetUserProfileByUserId.ps1 @@ -0,0 +1,31 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt + +# Construct your API headers +# Step 2 start +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +# Step 2 end + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# Check that we have an organization id in the settings.json config file +if (!$variables.ORGANIZATION_ID) { + Write-Output "Organization ID is needed. Please add the ORGANIZATION_ID variable to the settings.json" + exit -1 +} + +$base_path = "https://api-d.docusign.net/management" +$organizationId = $variables.ORGANIZATION_ID + +$userId = Read-Host "Enter the user's User ID" + +$result = "" +# Call the DocuSign Admin API +# Step 3 start +$uri = "${base_path}/v2.1/organizations/${organizationId}/users/${userId}/dsprofile" +$result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET +$result.Content +# Step 3 end diff --git a/launcher.ps1 b/launcher.ps1 index ca9fa33..95f1332 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -532,8 +532,10 @@ function startAdmin { createActiveCLMEsignUser = 2; bulkExportUserData = 3; addUsersViaBulkImport = 4; - auditUsers = 5 - Pick_An_API = 6; + auditUsers = 5; + getUserDSProfilesByEmail = 6; + getUserProfileByUserId = 7; + Pick_An_API = 8; } $listAdminExamplesView = $null; do { @@ -544,6 +546,8 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::bulkExportUserData)) Bulk-export user data" Write-Output "$([int][listAdminExamples]::addUsersViaBulkImport)) Add users via bulk import" Write-Output "$([int][listAdminExamples]::auditUsers)) Audit users" + Write-Output "$([int][listAdminExamples]::getUserDSProfilesByEmail)) Retrieve the user's DocuSign profile using an email address" + Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Retrieve the user's DocuSign profile using a User ID" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -570,6 +574,14 @@ function startAdmin { checkOrgId powershell.exe -Command .\examples\Admin\eg005AuditUsers.ps1 } + elseif ($listAdminExamplesView -eq [listAdminExamples]::getUserDSProfilesByEmail) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg006GetUserProfileByEmail.ps1 + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::getUserProfileByUserId) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg007GetUserProfileByUserId.ps1 + } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } From 4a16e7cb9ab062dd8543c2a482677b882ccfcd23 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 10 Jun 2022 16:40:01 -0700 Subject: [PATCH 155/462] updated prompt --- examples/Monitor/eg002WebQueryEndpoint.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 index 98d7799..0505550 100644 --- a/examples/Monitor/eg002WebQueryEndpoint.ps1 +++ b/examples/Monitor/eg002WebQueryEndpoint.ps1 @@ -8,8 +8,8 @@ $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -$beginDate = Read-Host "Please enter the beginning date after which you want to query results as YYYY-MM-DD: " -$endDate = Read-Host "Please enter the ending date before which you want to query results as YYYY-MM-DD: " +$beginDate = Read-Host "Please enter the start date as YYYY-MM-DD: " +$endDate = Read-Host "Please enter the end date as YYYY-MM-DD: " # You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint if (($accessToken -eq "") -or ($null -eq $accessToken)) { From e86677c416ef53de4a52fedfc89ad634bd3c45c2 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 13 Jun 2022 14:47:14 -0700 Subject: [PATCH 156/462] Updating Monitor2 from 1 to 100 events --- examples/Monitor/eg002WebQueryEndpoint.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 index 98d7799..2f2e5c9 100644 --- a/examples/Monitor/eg002WebQueryEndpoint.ps1 +++ b/examples/Monitor/eg002WebQueryEndpoint.ps1 @@ -35,7 +35,7 @@ $body = @" "aggregations": [ { "aggregationName": "Raw", - "limit": "1", + "limit": "100", "orderby": [ "Timestamp, desc" ] From f48e56895c92186f4296c378dcc64c0801214000 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 14 Jun 2022 10:14:47 -0700 Subject: [PATCH 157/462] deleting colons b/c they're showing up twice in the CLI --- examples/Monitor/eg002WebQueryEndpoint.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 index ab90700..819a51c 100644 --- a/examples/Monitor/eg002WebQueryEndpoint.ps1 +++ b/examples/Monitor/eg002WebQueryEndpoint.ps1 @@ -8,8 +8,8 @@ $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -$beginDate = Read-Host "Please enter the start date as YYYY-MM-DD: " -$endDate = Read-Host "Please enter the end date as YYYY-MM-DD: " +$beginDate = Read-Host "Please enter the start date as YYYY-MM-DD" +$endDate = Read-Host "Please enter the end date as YYYY-MM-DD" # You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint if (($accessToken -eq "") -or ($null -eq $accessToken)) { From 228e193dce50d69cb707ef1af3ac1c39c1a8cb53 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 14 Jun 2022 10:19:18 -0700 Subject: [PATCH 158/462] update Monitor 2 name in CLI --- launcher.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher.ps1 b/launcher.ps1 index 545065c..8819300 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -515,7 +515,7 @@ function startMonitor { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMonitorExamples]::getMonitoringData)) Get Monitoring Data" - Write-Output "$([int][listMonitorExamples]::postWebQuery)) Web query endpoint" + Write-Output "$([int][listMonitorExamples]::postWebQuery)) Query Monitoring Data with Filters" Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" [int]$listMonitorExamplesView = Read-Host "Select the action" } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); From 7b1a3e3f947be6b33a35efdcbddef6d30f884316 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 16 Jun 2022 10:55:47 -0700 Subject: [PATCH 159/462] Adding new Monitor API code example --- examples/Monitor/eg002WebQueryEndpoint.ps1 | 73 ++++++++++++++++++++++ launcher.ps1 | 6 +- 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 examples/Monitor/eg002WebQueryEndpoint.ps1 diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 new file mode 100644 index 0000000..819a51c --- /dev/null +++ b/examples/Monitor/eg002WebQueryEndpoint.ps1 @@ -0,0 +1,73 @@ +# Step 1. Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# Step 2. Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +$beginDate = Read-Host "Please enter the start date as YYYY-MM-DD" +$endDate = Read-Host "Please enter the end date as YYYY-MM-DD" + +# You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint +if (($accessToken -eq "") -or ($null -eq $accessToken)) { + Write-Output "You must provide an access token" +} + +# Step 3 start +# Filter parameters +$body = @" +{ + "filters": [ + { + "FilterName": "Time", + "BeginTime": "$beginDate", + "EndTime": "$endDate" + }, + { + "FilterName": "Has", + "ColumnName": "AccountId", + "Value": "$accountId" + } + ], + "aggregations": [ + { + "aggregationName": "Raw", + "limit": "100", + "orderby": [ + "Timestamp, desc" + ] + } + ] +} +"@ +# Step 3 end + +# a) Make a POST call to the postWebQuery endpoint to query the companies data. +# b) Display the JSON structure of the created envelope +# Step 4 start +$uri = "https://lens-d.docusign.net/api/v2.0/datasets/monitor/web_query" +try { + Write-Output "Response:" + $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $result.content +} +catch { + $int = 0 + foreach($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} +# Step 4 end + +Write-Output "" +Write-Output "" +Write-Output "Done." +Write-Output "" diff --git a/launcher.ps1 b/launcher.ps1 index 95f1332..624aed0 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -507,19 +507,23 @@ function startMonitor { do { Enum listMonitorExamples { getMonitoringData = 1; - Pick_An_API = 2; + postWebQuery = 2; + Pick_An_API = 3; } $listMonitorExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMonitorExamples]::getMonitoringData)) Get Monitoring Data" + Write-Output "$([int][listMonitorExamples]::postWebQuery)) Query Monitoring Data with Filters" Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" [int]$listMonitorExamplesView = Read-Host "Select the action" } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); if ($listMonitorExamplesView -eq [listMonitorExamples]::getMonitoringData) { powershell.exe -Command .\examples\Monitor\eg001getMonitoringData.ps1 + } elseif ($listMonitorExamplesView -eq [listMonitorExamples]::postWebQuery) { + powershell.exe -Command .\examples\Monitor\eg002WebQueryEndpoint.ps1 } } until ($listMonitorExamplesView -eq [listMonitorExamples]::Pick_An_API) startLauncher From 9f56e604c92f95841a341253d1a56c1f234fa361 Mon Sep 17 00:00:00 2001 From: annahileta Date: Tue, 21 Jun 2022 18:27:16 +0300 Subject: [PATCH 160/462] added the new admin code examples --- .../Admin/eg002CreateActiveCLMEsignUser.ps1 | 6 +- ...g008UpdateUserProductPermissionProfile.ps1 | 149 ++++++++++++++++++ ...g009DeleteUserProductPermissionProfile.ps1 | 112 +++++++++++++ launcher.ps1 | 14 +- 4 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 create mode 100644 examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 diff --git a/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 b/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 index 2ac0eb0..68970ed 100644 --- a/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 +++ b/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 @@ -159,7 +159,11 @@ try { Write-Output "Response:" $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/users/" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST - $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + + # Store user email to the file for future reference + $($response.Content | ConvertFrom-Json).email > .\config\ESIGN_CLM_USER_EMAIL + Write-Output "Done" } catch { diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 new file mode 100644 index 0000000..b25166f --- /dev/null +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -0,0 +1,149 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID +$emailAddressFile = ".\config\ESIGN_CLM_USER_EMAIL" + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json +$base_path = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +# Check that we have an email address of created user +if (Test-Path $emailAddressFile) { + $emailAddress = Get-Content $emailAddressFile + } + else { + Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" + exit 1 +} + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +try { + # Display the JSON response + Write-Output "Getting permission profiles..." + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + + Write-Output "" + Write-Output "Response:" + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + Write-Output "" + + $productProfiles = $($response.Content | ConvertFrom-Json).product_permission_profiles +} +catch { + Write-Output "Error:" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +$esignPermissionProfiles = $null +$clmPermissionProfiles = $null + +foreach ($productProfile in $productProfiles) { + if ($productProfile.product_name -eq "ESign") { + $esignPermissionProfiles = $productProfile.permission_profiles + $esignProductId = $productProfile.product_id + } else { + $clmPermissionProfiles = $productProfile.permission_profiles + $clmProductId = $productProfile.product_id + } +} + +Write-Output "" +Write-Output "Update user product permission profile for the following email: $emailAddress" +Write-Output "" + +Enum listProductChoices { + CLM = 1; + eSignature = 2; +} +$listProductChoicesView = $null; +do { + Write-Output "$([int][listProductChoices]::CLM)) CLM" + Write-Output "$([int][listProductChoices]::eSignature)) eSignature" + [int]$listProductChoicesView = Read-Host "Would you like to update the permission profile for the eSignature or CLM product?" +} while (-not [listProductChoices]::IsDefined([listProductChoices], $listProductChoicesView)); + +if ($listProductChoicesView -eq [listProductChoices]::CLM) { + $productId = $clmProductId + Write-Output "" + + $menu = @{} + for ($i=1;$i -le $clmPermissionProfiles.count; $i++) { + Write-Output "$i. $($clmPermissionProfiles[$i-1].permission_profile_name)" + $menu.Add($i,($clmPermissionProfiles[$i-1].permission_profile_id)) + } + + do { + [int]$selection = Read-Host 'Select an CLM permission profile to add: ' + } while ($selection -gt $clmPermissionProfiles.count -or $selection -lt 1); + + $permissionProfileId = $menu.Item($selection) +} else { + $productId = $esignProductId + Write-Output "" + + $menu = @{} + for ($i=1;$i -le $esignPermissionProfiles.count; $i++) { + Write-Output "$i. $($esignPermissionProfiles[$i-1].permission_profile_name)" + $menu.Add($i,($esignPermissionProfiles[$i-1].permission_profile_id)) + } + + do { + [int]$selection = Read-Host 'Select an eSignature permission profile to add: ' + } while ($selection -gt $esignPermissionProfiles.count -or $selection -lt 1); + + $permissionProfileId = $menu.Item($selection) +} + +# Construct the request body +$body = @" +{ + "email": "$emailAddress", + "product_permission_profiles": [ + { + "product_id": '$productId', + "permission_profile_id": '$permissionProfileId', + } + ] +} +"@ + +try { + # Display the JSON response + Write-Output "Response:" + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + + Write-Output "Done" +} +catch { + Write-Output "Unable to update the permission profiles." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} \ No newline at end of file diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 new file mode 100644 index 0000000..17cd513 --- /dev/null +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -0,0 +1,112 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID +$emailAddressFile = ".\config\ESIGN_CLM_USER_EMAIL" + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json +$base_path = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +# Check that we have an email address of created user +if (Test-Path $emailAddressFile) { + $emailAddress = Get-Content $emailAddressFile + } + else { + Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" + exit 1 +} + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +try { + # Display the JSON response + Write-Output "Getting permission profiles by email address..." + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users?email=${emailAddress}" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + + Write-Output "Response:" + Write-Output "" + Write-Output $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + Write-Output "" +} +catch { + Write-Output "Error:" + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +$clmProductId = "37f013eb-7012-4588-8028-357b39fdbd00" +$esignProductId = "f6406c68-225c-4e9b-9894-64152a26fa83" + +Write-Output "" +Write-Output "Delete user product permission profile for the following email: " $emailAddress +Write-Output "" + +Enum listProductChoices { + CLM = 1; + eSignature = 2; +} + +$listProductChoicesView = $null; +do { + Write-Output "$([int][listProductChoices]::CLM)) CLM" + Write-Output "$([int][listProductChoices]::eSignature)) eSignature" + [int]$listProductChoicesView = Read-Host "Which product permission profile would you like to delete?" +} while (-not [listProductChoices]::IsDefined([listProductChoices], $listProductChoicesView)); + +if ($listProductChoicesView -eq [listProductChoices]::CLM) { + $productId = $clmProductId +} else { + $productId = $esignProductId +} + +# Construct the request body +$body = @" +{ + "user_email": "$emailAddress", + "product_ids": [ + "$productId", + ] +} +"@ + +try { + # Display the JSON response + Write-Output "Response:" + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" + Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE + + Write-Output "Product permission profile has been deleted." + Write-Output "" + Write-Output "Done" +} +catch { + Write-Output "Unable to delete the permission profile." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} \ No newline at end of file diff --git a/launcher.ps1 b/launcher.ps1 index 624aed0..fb1edbb 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -539,7 +539,9 @@ function startAdmin { auditUsers = 5; getUserDSProfilesByEmail = 6; getUserProfileByUserId = 7; - Pick_An_API = 8; + updateUserProductPermissionProfile = 8; + deleteUserProductPermissionProfile = 9; + Pick_An_API = 10; } $listAdminExamplesView = $null; do { @@ -552,6 +554,8 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::auditUsers)) Audit users" Write-Output "$([int][listAdminExamples]::getUserDSProfilesByEmail)) Retrieve the user's DocuSign profile using an email address" Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Retrieve the user's DocuSign profile using a User ID" + Write-Output "$([int][listAdminExamples]::updateUserProductPermissionProfile)) Update user product permission profiles using an email address" + Write-Output "$([int][listAdminExamples]::deleteUserProductPermissionProfile)) Delete user product permission profiles using an email address" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -586,6 +590,14 @@ function startAdmin { checkOrgId powershell.exe -Command .\examples\Admin\eg007GetUserProfileByUserId.ps1 } + elseif ($listAdminExamplesView -eq [listAdminExamples]::updateUserProductPermissionProfile) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg008UpdateUserProductPermissionProfile.ps1 + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::deleteUserProductPermissionProfile) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg009DeleteUserProductPermissionProfile.ps1 + } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } From cde59b095c2e1a3b0474b9e3c69c5e631c0e38e8 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 22 Jun 2022 09:56:56 -0700 Subject: [PATCH 161/462] Adding validation for email address (CC) using a Regex --- launcher.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/launcher.ps1 b/launcher.ps1 index 624aed0..ad16703 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -14,9 +14,15 @@ $config = Get-Content $configFile -Raw | ConvertFrom-Json function checkCC { # Fill in Quickstart Carbon Copy config values - if ($config.CC_EMAIL -eq "{CC_EMAIL}" ) { + if (($config.CC_EMAIL -eq "{CC_EMAIL}" ) -or ($config.CC_EMAIL -eq "" )) { Write-Output "It looks like this is your first time running the launcher from Quickstart. " $config.CC_EMAIL = Read-Host "Enter a CC email address to receive copies of envelopes" + if (-not [system.Text.RegularExpressions.Regex]::IsMatch($config.CC_EMAIL, + "^(?("")("".+?(? Date: Fri, 1 Jul 2022 15:13:13 +0300 Subject: [PATCH 162/462] fixes for issues open by Mei --- ...g008UpdateUserProductPermissionProfile.ps1 | 29 ++++-- ...g009DeleteUserProductPermissionProfile.ps1 | 93 ++++++++++++------- launcher.ps1 | 7 ++ 3 files changed, 89 insertions(+), 40 deletions(-) diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 index b25166f..3c963f9 100644 --- a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -11,8 +11,20 @@ $organizationId=$variables.ORGANIZATION_ID # Check that we have an email address of created user if (Test-Path $emailAddressFile) { $emailAddress = Get-Content $emailAddressFile - } - else { + + try { + $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" + $headers.add("Authorization", "Bearer $accessToken") + $headers.add("Content-Type", "application/json") + + $uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${emailAddress}" + $response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET + } catch { + Write-Output "The user with stored email address is not present in the account." + Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" + exit 1 + } +} else { Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" exit 1 } @@ -24,17 +36,20 @@ $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") try { - # Display the JSON response + # Get all permission profiles Write-Output "Getting permission profiles..." $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + $productProfiles = $($response.Content | ConvertFrom-Json).product_permission_profiles + + # Get and showcase permission profiles that are currently added to the user + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users?email=${emailAddress}" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET - Write-Output "" Write-Output "Response:" - $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 Write-Output "" - - $productProfiles = $($response.Content | ConvertFrom-Json).product_permission_profiles + Write-Output $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + Write-Output "" } catch { Write-Output "Error:" diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 index 17cd513..2e59533 100644 --- a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -10,11 +10,23 @@ $organizationId=$variables.ORGANIZATION_ID # Check that we have an email address of created user if (Test-Path $emailAddressFile) { - $emailAddress = Get-Content $emailAddressFile - } - else { + $emailAddress = Get-Content $emailAddressFile + + try { + $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" + $headers.add("Authorization", "Bearer $accessToken") + $headers.add("Content-Type", "application/json") + + $uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${emailAddress}" + $response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET + } catch { + Write-Output "The user with stored email address is not present in the account." Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" exit 1 + } +} else { + Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" + exit 1 } # Construct your API headers @@ -28,13 +40,15 @@ try { Write-Output "Getting permission profiles by email address..." $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users?email=${emailAddress}" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + $productProfiles = $($response.Content | ConvertFrom-Json).product_permission_profiles Write-Output "Response:" Write-Output "" Write-Output $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 Write-Output "" } -catch { +catch +{ Write-Output "Error:" # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error @@ -75,38 +89,51 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { $productId = $esignProductId } -# Construct the request body -$body = @" -{ - "user_email": "$emailAddress", - "product_ids": [ - "$productId", - ] + +foreach ($productProfile in $productProfiles) { + if ($productProfile.product_id -eq $productId) { + $userHasProductPermissions = "true" + } } -"@ -try { - # Display the JSON response - Write-Output "Response:" - $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" - Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE - - Write-Output "Product permission profile has been deleted." +if ($null -eq $userHasProductPermissions) { Write-Output "" - Write-Output "Done" -} -catch { - Write-Output "Unable to delete the permission profile." + Write-Output "This user was already removed from this product." + Write-Output "Please, try another product or run example 2: 'Create an active CLM and ESign user' to create a user with both product accesses." + Write-Output "" +} else { + # Construct the request body + $body = @" + { + "user_email": "$emailAddress", + "product_ids": [ + "$productId", + ] + } +"@ - # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error - foreach ($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { - Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + try { + # Display the JSON response + Write-Output "Response:" + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" + Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE + + Write-Output "Product permission profile has been deleted." + Write-Output "" + Write-Output "Done" + } catch { + Write-Output "Unable to delete the permission profile." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ } - $int++ - } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line - exit 1 -} \ No newline at end of file + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 + } +} diff --git a/launcher.ps1 b/launcher.ps1 index fb1edbb..fd13483 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1,6 +1,7 @@ $ErrorActionPreference = "Stop" # force stop on failure $configFile = ".\config\settings.json" +$emailAddressFile = ".\config\ESIGN_CLM_USER_EMAIL" if ((Test-Path $configFile) -eq $False) { Write-Output "Error: " @@ -8,6 +9,12 @@ if ((Test-Path $configFile) -eq $False) { Write-Output "Next, fill in your API credentials, Signer name and email to continue." } +# Check that we have an email address stored after running the 2 Admin code example +# in case the file was created before - delete it +if (Test-Path $emailAddressFile) { + Remove-Item $emailAddressFile +} + # Get required environment variables from .\config\settings.json file $config = Get-Content $configFile -Raw | ConvertFrom-Json From 485837ee309a4891fab7ebdc07510d24218048cf Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 5 Jul 2022 13:25:13 -0700 Subject: [PATCH 163/462] removed duplicate colon --- examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 index 3c963f9..3377ffe 100644 --- a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -104,7 +104,7 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { } do { - [int]$selection = Read-Host 'Select an CLM permission profile to add: ' + [int]$selection = Read-Host 'Select a CLM permission profile to add' } while ($selection -gt $clmPermissionProfiles.count -or $selection -lt 1); $permissionProfileId = $menu.Item($selection) @@ -119,7 +119,7 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { } do { - [int]$selection = Read-Host 'Select an eSignature permission profile to add: ' + [int]$selection = Read-Host 'Select an eSignature permission profile to add' } while ($selection -gt $esignPermissionProfiles.count -or $selection -lt 1); $permissionProfileId = $menu.Item($selection) @@ -161,4 +161,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line exit 1 -} \ No newline at end of file +} From 1f13d0b4251728ac4dc6272b58341bc3cb3d4d55 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 5 Jul 2022 13:30:14 -0700 Subject: [PATCH 164/462] updated Admin 2 code example name in prompt --- examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 index 3377ffe..eb80450 100644 --- a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -21,11 +21,11 @@ if (Test-Path $emailAddressFile) { $response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET } catch { Write-Output "The user with stored email address is not present in the account." - Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" + Write-Output "Please run example 2: 'Create a new active CLM and eSignature user' before running this code example" exit 1 } } else { - Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" + Write-Output "Please run example 2: 'Create a new active CLM and eSignature user' before running this code example" exit 1 } From 8f015903f5a326ea7b2e71e79d01fdddb859832d Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 5 Jul 2022 13:32:29 -0700 Subject: [PATCH 165/462] updated Admin 2 name in prompt --- examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 index 2e59533..464cf37 100644 --- a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -21,11 +21,11 @@ if (Test-Path $emailAddressFile) { $response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET } catch { Write-Output "The user with stored email address is not present in the account." - Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" + Write-Output "Please run example 2: 'Create a new active CLM and eSignature user' before running this code example" exit 1 } } else { - Write-Output "Please run example 2: 'Create an active CLM and ESign user' before running this code example" + Write-Output "Please run example 2: 'Create a new active CLM and eSignature user' before running this code example" exit 1 } From 8d5944bee11de9ef8fc39dc9995bd7eefe09b1fb Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 5 Jul 2022 13:34:13 -0700 Subject: [PATCH 166/462] updated Admin 2 name in prompt --- examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 index 464cf37..069e888 100644 --- a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -99,7 +99,7 @@ foreach ($productProfile in $productProfiles) { if ($null -eq $userHasProductPermissions) { Write-Output "" Write-Output "This user was already removed from this product." - Write-Output "Please, try another product or run example 2: 'Create an active CLM and ESign user' to create a user with both product accesses." + Write-Output "Please, try another product or run example 2: 'Create a new active CLM and eSignature user' to create a user with both product accesses." Write-Output "" } else { # Construct the request body From 9be2d8efb1c8143af24d553a4caf6175cc91c4d3 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 5 Jul 2022 13:35:30 -0700 Subject: [PATCH 167/462] update Admin 2 name in prompt --- launcher.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher.ps1 b/launcher.ps1 index fd13483..f22de6f 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -555,7 +555,7 @@ function startAdmin { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listAdminExamples]::createNewUserWithActiveStatus)) Create a new user with active status" - Write-Output "$([int][listAdminExamples]::createActiveCLMEsignUser)) Create an active CLM and ESign user" + Write-Output "$([int][listAdminExamples]::createActiveCLMEsignUser)) Create a new active CLM and eSignature user" Write-Output "$([int][listAdminExamples]::bulkExportUserData)) Bulk-export user data" Write-Output "$([int][listAdminExamples]::addUsersViaBulkImport)) Add users via bulk import" Write-Output "$([int][listAdminExamples]::auditUsers)) Audit users" From cc489f910aa7aab233532d23c7d09ce163419180 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 5 Jul 2022 13:41:20 -0700 Subject: [PATCH 168/462] Prompt: Changed 'add' to 'update' --- examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 index eb80450..8446fdf 100644 --- a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -104,7 +104,7 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { } do { - [int]$selection = Read-Host 'Select a CLM permission profile to add' + [int]$selection = Read-Host 'Select a CLM permission profile to update' } while ($selection -gt $clmPermissionProfiles.count -or $selection -lt 1); $permissionProfileId = $menu.Item($selection) @@ -119,7 +119,7 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { } do { - [int]$selection = Read-Host 'Select an eSignature permission profile to add' + [int]$selection = Read-Host 'Select an eSignature permission profile to update' } while ($selection -gt $esignPermissionProfiles.count -or $selection -lt 1); $permissionProfileId = $menu.Item($selection) From 7af4952b15fb77511fd1230b670f8577d33773f7 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 14 Jul 2022 12:55:29 -0700 Subject: [PATCH 169/462] Adding two new Admin API Code examples --- .../Admin/eg002CreateActiveCLMEsignUser.ps1 | 6 +- ...g008UpdateUserProductPermissionProfile.ps1 | 164 ++++++++++++++++++ ...g009DeleteUserProductPermissionProfile.ps1 | 139 +++++++++++++++ launcher.ps1 | 31 +++- 4 files changed, 336 insertions(+), 4 deletions(-) create mode 100644 examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 create mode 100644 examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 diff --git a/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 b/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 index 2ac0eb0..68970ed 100644 --- a/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 +++ b/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 @@ -159,7 +159,11 @@ try { Write-Output "Response:" $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/users/" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST - $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + + # Store user email to the file for future reference + $($response.Content | ConvertFrom-Json).email > .\config\ESIGN_CLM_USER_EMAIL + Write-Output "Done" } catch { diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 new file mode 100644 index 0000000..8446fdf --- /dev/null +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -0,0 +1,164 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID +$emailAddressFile = ".\config\ESIGN_CLM_USER_EMAIL" + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json +$base_path = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +# Check that we have an email address of created user +if (Test-Path $emailAddressFile) { + $emailAddress = Get-Content $emailAddressFile + + try { + $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" + $headers.add("Authorization", "Bearer $accessToken") + $headers.add("Content-Type", "application/json") + + $uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${emailAddress}" + $response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET + } catch { + Write-Output "The user with stored email address is not present in the account." + Write-Output "Please run example 2: 'Create a new active CLM and eSignature user' before running this code example" + exit 1 + } +} else { + Write-Output "Please run example 2: 'Create a new active CLM and eSignature user' before running this code example" + exit 1 +} + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +try { + # Get all permission profiles + Write-Output "Getting permission profiles..." + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + $productProfiles = $($response.Content | ConvertFrom-Json).product_permission_profiles + + # Get and showcase permission profiles that are currently added to the user + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users?email=${emailAddress}" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + + Write-Output "Response:" + Write-Output "" + Write-Output $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + Write-Output "" +} +catch { + Write-Output "Error:" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +$esignPermissionProfiles = $null +$clmPermissionProfiles = $null + +foreach ($productProfile in $productProfiles) { + if ($productProfile.product_name -eq "ESign") { + $esignPermissionProfiles = $productProfile.permission_profiles + $esignProductId = $productProfile.product_id + } else { + $clmPermissionProfiles = $productProfile.permission_profiles + $clmProductId = $productProfile.product_id + } +} + +Write-Output "" +Write-Output "Update user product permission profile for the following email: $emailAddress" +Write-Output "" + +Enum listProductChoices { + CLM = 1; + eSignature = 2; +} +$listProductChoicesView = $null; +do { + Write-Output "$([int][listProductChoices]::CLM)) CLM" + Write-Output "$([int][listProductChoices]::eSignature)) eSignature" + [int]$listProductChoicesView = Read-Host "Would you like to update the permission profile for the eSignature or CLM product?" +} while (-not [listProductChoices]::IsDefined([listProductChoices], $listProductChoicesView)); + +if ($listProductChoicesView -eq [listProductChoices]::CLM) { + $productId = $clmProductId + Write-Output "" + + $menu = @{} + for ($i=1;$i -le $clmPermissionProfiles.count; $i++) { + Write-Output "$i. $($clmPermissionProfiles[$i-1].permission_profile_name)" + $menu.Add($i,($clmPermissionProfiles[$i-1].permission_profile_id)) + } + + do { + [int]$selection = Read-Host 'Select a CLM permission profile to update' + } while ($selection -gt $clmPermissionProfiles.count -or $selection -lt 1); + + $permissionProfileId = $menu.Item($selection) +} else { + $productId = $esignProductId + Write-Output "" + + $menu = @{} + for ($i=1;$i -le $esignPermissionProfiles.count; $i++) { + Write-Output "$i. $($esignPermissionProfiles[$i-1].permission_profile_name)" + $menu.Add($i,($esignPermissionProfiles[$i-1].permission_profile_id)) + } + + do { + [int]$selection = Read-Host 'Select an eSignature permission profile to update' + } while ($selection -gt $esignPermissionProfiles.count -or $selection -lt 1); + + $permissionProfileId = $menu.Item($selection) +} + +# Construct the request body +$body = @" +{ + "email": "$emailAddress", + "product_permission_profiles": [ + { + "product_id": '$productId', + "permission_profile_id": '$permissionProfileId', + } + ] +} +"@ + +try { + # Display the JSON response + Write-Output "Response:" + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + + Write-Output "Done" +} +catch { + Write-Output "Unable to update the permission profiles." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 new file mode 100644 index 0000000..069e888 --- /dev/null +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -0,0 +1,139 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID +$emailAddressFile = ".\config\ESIGN_CLM_USER_EMAIL" + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json +$base_path = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +# Check that we have an email address of created user +if (Test-Path $emailAddressFile) { + $emailAddress = Get-Content $emailAddressFile + + try { + $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" + $headers.add("Authorization", "Bearer $accessToken") + $headers.add("Content-Type", "application/json") + + $uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${emailAddress}" + $response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET + } catch { + Write-Output "The user with stored email address is not present in the account." + Write-Output "Please run example 2: 'Create a new active CLM and eSignature user' before running this code example" + exit 1 + } +} else { + Write-Output "Please run example 2: 'Create a new active CLM and eSignature user' before running this code example" + exit 1 +} + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +try { + # Display the JSON response + Write-Output "Getting permission profiles by email address..." + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users?email=${emailAddress}" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + $productProfiles = $($response.Content | ConvertFrom-Json).product_permission_profiles + + Write-Output "Response:" + Write-Output "" + Write-Output $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + Write-Output "" +} +catch +{ + Write-Output "Error:" + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +$clmProductId = "37f013eb-7012-4588-8028-357b39fdbd00" +$esignProductId = "f6406c68-225c-4e9b-9894-64152a26fa83" + +Write-Output "" +Write-Output "Delete user product permission profile for the following email: " $emailAddress +Write-Output "" + +Enum listProductChoices { + CLM = 1; + eSignature = 2; +} + +$listProductChoicesView = $null; +do { + Write-Output "$([int][listProductChoices]::CLM)) CLM" + Write-Output "$([int][listProductChoices]::eSignature)) eSignature" + [int]$listProductChoicesView = Read-Host "Which product permission profile would you like to delete?" +} while (-not [listProductChoices]::IsDefined([listProductChoices], $listProductChoicesView)); + +if ($listProductChoicesView -eq [listProductChoices]::CLM) { + $productId = $clmProductId +} else { + $productId = $esignProductId +} + + +foreach ($productProfile in $productProfiles) { + if ($productProfile.product_id -eq $productId) { + $userHasProductPermissions = "true" + } +} + +if ($null -eq $userHasProductPermissions) { + Write-Output "" + Write-Output "This user was already removed from this product." + Write-Output "Please, try another product or run example 2: 'Create a new active CLM and eSignature user' to create a user with both product accesses." + Write-Output "" +} else { + # Construct the request body + $body = @" + { + "user_email": "$emailAddress", + "product_ids": [ + "$productId", + ] + } +"@ + + try { + # Display the JSON response + Write-Output "Response:" + $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" + Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE + + Write-Output "Product permission profile has been deleted." + Write-Output "" + Write-Output "Done" + } catch { + Write-Output "Unable to delete the permission profile." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 + } +} diff --git a/launcher.ps1 b/launcher.ps1 index 624aed0..b9b6642 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1,6 +1,7 @@ $ErrorActionPreference = "Stop" # force stop on failure $configFile = ".\config\settings.json" +$emailAddressFile = ".\config\ESIGN_CLM_USER_EMAIL" if ((Test-Path $configFile) -eq $False) { Write-Output "Error: " @@ -8,15 +9,27 @@ if ((Test-Path $configFile) -eq $False) { Write-Output "Next, fill in your API credentials, Signer name and email to continue." } +# Check that we have an email address stored after running the 2 Admin code example +# in case the file was created before - delete it +if (Test-Path $emailAddressFile) { + Remove-Item $emailAddressFile +} + # Get required environment variables from .\config\settings.json file $config = Get-Content $configFile -Raw | ConvertFrom-Json function checkCC { # Fill in Quickstart Carbon Copy config values - if ($config.CC_EMAIL -eq "{CC_EMAIL}" ) { + if (($config.CC_EMAIL -eq "{CC_EMAIL}" ) -or ($config.CC_EMAIL -eq "" )) { Write-Output "It looks like this is your first time running the launcher from Quickstart. " $config.CC_EMAIL = Read-Host "Enter a CC email address to receive copies of envelopes" + if (-not [system.Text.RegularExpressions.Regex]::IsMatch($config.CC_EMAIL, + "^(?("")("".+?(? Date: Thu, 14 Jul 2022 13:06:27 -0700 Subject: [PATCH 170/462] Adding Step comments --- examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 | 6 ++++++ examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 index 8446fdf..25ef7fc 100644 --- a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -30,10 +30,12 @@ if (Test-Path $emailAddressFile) { } # Construct your API headers +# Step 2 start $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 end try { # Get all permission profiles @@ -126,6 +128,7 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { } # Construct the request body +# Step 3 start $body = @" { "email": "$emailAddress", @@ -137,13 +140,16 @@ $body = @" ] } "@ +# Step 3 end try { # Display the JSON response Write-Output "Response:" + # Step 4 start $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + # Step 4 end Write-Output "Done" } diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 index 069e888..3541a7d 100644 --- a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -30,10 +30,12 @@ if (Test-Path $emailAddressFile) { } # Construct your API headers +# Step 2 start $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 end try { # Display the JSON response @@ -103,6 +105,7 @@ if ($null -eq $userHasProductPermissions) { Write-Output "" } else { # Construct the request body + # Step 3 start $body = @" { "user_email": "$emailAddress", @@ -111,12 +114,15 @@ if ($null -eq $userHasProductPermissions) { ] } "@ +# Step 3 end try { # Display the JSON response Write-Output "Response:" + # Step 4 start $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE + # Step 4 end Write-Output "Product permission profile has been deleted." Write-Output "" From 7525bde81f745701b4a6b5925a760fb8bc7f2f88 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 14 Jul 2022 13:07:12 -0700 Subject: [PATCH 171/462] Adding comments --- examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 | 6 ++++++ examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 index 8446fdf..25ef7fc 100644 --- a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -30,10 +30,12 @@ if (Test-Path $emailAddressFile) { } # Construct your API headers +# Step 2 start $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 end try { # Get all permission profiles @@ -126,6 +128,7 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { } # Construct the request body +# Step 3 start $body = @" { "email": "$emailAddress", @@ -137,13 +140,16 @@ $body = @" ] } "@ +# Step 3 end try { # Display the JSON response Write-Output "Response:" + # Step 4 start $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + # Step 4 end Write-Output "Done" } diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 index 069e888..3541a7d 100644 --- a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -30,10 +30,12 @@ if (Test-Path $emailAddressFile) { } # Construct your API headers +# Step 2 start $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +# Step 2 end try { # Display the JSON response @@ -103,6 +105,7 @@ if ($null -eq $userHasProductPermissions) { Write-Output "" } else { # Construct the request body + # Step 3 start $body = @" { "user_email": "$emailAddress", @@ -111,12 +114,15 @@ if ($null -eq $userHasProductPermissions) { ] } "@ +# Step 3 end try { # Display the JSON response Write-Output "Response:" + # Step 4 start $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE + # Step 4 end Write-Output "Product permission profile has been deleted." Write-Output "" From d45aad0833a76fb4b99b8651dfadf999208dc0d6 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Tue, 19 Jul 2022 16:54:36 +0300 Subject: [PATCH 172/462] added example --- examples/eSignature/eg039SigningInPerson.ps1 | 130 +++++++++++++++++++ launcher.ps1 | 8 +- 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg039SigningInPerson.ps1 diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 new file mode 100644 index 0000000..9c129d4 --- /dev/null +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -0,0 +1,130 @@ +$apiUri = "https://demo.docusign.net/restapi" + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# Step 2. Create the envelope definition. +# The signer recipient includes a clientUserId setting +# +# document 1 (PDF) has tag /sn1/ +# recipient 1 - signer +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$docBase64 = New-TemporaryFile + +# Fetch doc and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 + +$hostEmail = Read-Host "Please enter the email address associated with the host's DocuSign account" +$hostName = Read-Host "Please enter the name of the host" +$signerName = Read-Host "Please enter the name of the in person signer" + +Write-Output "Sending the envelope request to DocuSign..." + +# Concatenate the different parts of the request +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $docBase64)"; + name = "Lorem Ipsum"; + fileExtension = "pdf"; + documentId = "1"; + }; + ); + recipients = @{ + inPersonSigners = @( + @{ + hostEmail = $hostEmail; + hostName = $hostName; + signerName = $signerName; + recipientId = "1"; + routingOrder = "1"; + clientUserId = "1000"; + tabs = @{ + signHereTabs = @( + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +# Step 3. Call DocuSign to create the envelope +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId +Write-Output "EnvelopeId: $envelopeId" + +# Step 4. Create a recipient view definition +# The signer will directly open this link from the browser to sign. +# +# The returnUrl is normally your own web app. DocuSign will redirect +# the signer to returnUrl when the signing completes. +# For this example, we'll use http://httpbin.org/get to show the +# query parameters passed back from DocuSign + +Write-Output "Requesting the url for the embedded signing..." + +$json = [ordered]@{ + 'returnUrl' = 'http://httpbin.org/get'; + 'authenticationMethod' = 'none'; + 'email' = $hostEmail; + 'userName' = $hostName; + 'clientUserId' = 1000 +} | ConvertTo-Json -Compress + + +# Step 5. Create the recipient view and begin the DocuSign signing +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -Body $json ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" +$signingUrl = $(Get-Content $response | ConvertFrom-Json).url + +# ***DS.snippet.0.end +Write-Output "The embedded signing URL is $signingUrl" +Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." + +Start-Process $signingUrl + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $docBase64 + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index b9b6642..4019531 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -234,7 +234,8 @@ function startSignature { Delayed_Routing = 36; SMS_Delivery = 37; Create_Signable_HTML_document = 38; - Pick_An_API = 39; + Signing_In_Person = 39; + Pick_An_API = 40; } $ApiExamplesView = $null; @@ -278,6 +279,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" + Write-Output "$([int][ApiExamples]::Signing_In_Person)) Signing_In_Person" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -408,6 +410,10 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Signing_In_Person) { + checkCC + powershell.exe .\examples\eSignature\eg039SigningInPerson.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } From 25cce977845568bb2fcabe44fca22e12367387c5 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 19 Jul 2022 14:15:05 -0700 Subject: [PATCH 173/462] New "quick" ACG for PowerShell... --- Quick_ACG/launcherACG.ps1 | 59 +++++++++++++++++++++++++++++++++++++++ eg001EmbeddedSigning.ps1 | 31 ++++++++++++++++---- 2 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 Quick_ACG/launcherACG.ps1 diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 new file mode 100644 index 0000000..862ed01 --- /dev/null +++ b/Quick_ACG/launcherACG.ps1 @@ -0,0 +1,59 @@ +$ErrorActionPreference = "Stop" # force stop on failure + +$configFile = "..\config\settings.json" + +if ((Test-Path $configFile) -eq $False) { + Write-Output "Error: " + Write-Output "First copy the file '..\config\settings.example.json' to '$configFile'." + Write-Output "Next, fill in your API credentials, Signer name and email to continue." +} + +# Get required environment variables from ..\config\settings.json file +$config = Get-Content $configFile -Raw | ConvertFrom-Json + +function startQuickACG { + Write-Output '' + Write-Output "Authentication in progress, please wait" + Write-Output '' + powershell.exe -Command ..\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") + Write-Output '' + + if ((Test-Path "../config/ds_access_token.txt") -eq $true) { + powershell.exe -Command ..\eg001EmbeddedSigning.ps1 + Write-Output '' + startSignature + } + else { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } +} + +function startSignature { + do { + # Preparing a list of menu options + Enum MenuOptions { + Embedded_Signing = 1; + Exit = 2; + } + + $MenuOptionsView = $null; + do { + Write-Output "" + Write-Output 'Pick the next action: ' + Write-Output "$([int][MenuOptions]::Embedded_Signing)) Rerun the embeddd signing code example" + Write-Output "$([int][MenuOptions]::Exit)) Exit" + [int]$MenuOptionsView = Read-Host "Pick the next action" + } while (-not [MenuOptions]::IsDefined([MenuOptions], $MenuOptionsView)); + + if ($MenuOptionsView -eq [MenuOptions]::Embedded_Signing) { + powershell.exe -Command ..\eg001EmbeddedSigning.ps1 + } + elseif ($MenuOptionsView -eq [MenuOptions]::Exit) { + exit 1 + } + } until ($MenuOptionsView -eq [MenuOptions]::Exit) + exit 1 +} + +Write-Output "Welcome to the DocuSign PowerShell Quick Authorization Code Grant Launcher" +startQuickACG diff --git a/eg001EmbeddedSigning.ps1 b/eg001EmbeddedSigning.ps1 index 01597ca..c475ab0 100644 --- a/eg001EmbeddedSigning.ps1 +++ b/eg001EmbeddedSigning.ps1 @@ -1,19 +1,31 @@ $apiUri = "https://demo.docusign.net/restapi" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $configPath) -eq $false) { + $configPath = "..\config\settings.json" +} +if ((Test-Path $tokenPath) -eq $false) { + $tokenPath = "..\config\ds_access_token.txt" +} +if ((Test-Path $accountIdPath) -eq $false) { + $accountIdPath = "..\config\API_ACCOUNT_ID" +} # Use embedded signing # Get required variables from .\config\settings.json file -$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json - - +$variables = Get-Content $configPath -Raw | ConvertFrom-Json # 1. Obtain your OAuth token -$accessToken = Get-Content .\config\ds_access_token.txt +$accessToken = Get-Content $tokenPath # Obtain your accountId from demo.docusign.net -- the account id is shown in # the drop down on the upper right corner of the screen by your picture or # the default picture. -$accountID = Get-Content .\config\API_ACCOUNT_ID +$accountID = Get-Content $accountIdPath # Step 2. Create the envelope definition. # The signer recipient includes a clientUserId setting @@ -28,8 +40,15 @@ $requestData = New-TemporaryFile $response = New-TemporaryFile $doc1Base64 = New-TemporaryFile +$docPath = ".\demo_documents\World_Wide_Corp_lorem.pdf" + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $docPath) -eq $false) { + $docPath = "..\demo_documents\World_Wide_Corp_lorem.pdf" +} + # Fetch doc and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc1Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $doc1Base64 Write-Output "Sending the envelope request to DocuSign..." From 105a4f0a481d341381d4e9ca35998673068ff576 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Wed, 20 Jul 2022 15:26:32 +0300 Subject: [PATCH 174/462] fixes --- examples/eSignature/eg039SigningInPerson.ps1 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 index 9c129d4..7c77172 100644 --- a/examples/eSignature/eg039SigningInPerson.ps1 +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -1,4 +1,5 @@ $apiUri = "https://demo.docusign.net/restapi" +$authorizationEndpoint = "https://account-d.docusign.com/oauth" # Step 1: Obtain your OAuth token # Note: Substitute these values with your own @@ -24,10 +25,22 @@ $docBase64 = New-TemporaryFile # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 -$hostEmail = Read-Host "Please enter the email address associated with the host's DocuSign account" $hostName = Read-Host "Please enter the name of the host" $signerName = Read-Host "Please enter the name of the in person signer" +# Get the current user email +Invoke-RestMethod ` + -Uri "${authorizationEndpoint}/userinfo" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Cache-Control' = "no-store"; + 'Pragma' = "no-cache"; +} ` + -OutFile $response + +$hostEmail = $(Get-Content $response | ConvertFrom-Json).email + Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request From 56c65b0afbc0c850c576bc354c9d1931e3442556 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 26 Jul 2022 15:04:31 -0700 Subject: [PATCH 175/462] Small updates to In Person Signing --- examples/eSignature/eg039SigningInPerson.ps1 | 2 +- launcher.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 index 7c77172..7046c8e 100644 --- a/examples/eSignature/eg039SigningInPerson.ps1 +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -25,7 +25,6 @@ $docBase64 = New-TemporaryFile # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 -$hostName = Read-Host "Please enter the name of the host" $signerName = Read-Host "Please enter the name of the in person signer" # Get the current user email @@ -40,6 +39,7 @@ Invoke-RestMethod ` -OutFile $response $hostEmail = $(Get-Content $response | ConvertFrom-Json).email +$hostName = $(Get-Content $response | ConvertFrom-Json).name Write-Output "Sending the envelope request to DocuSign..." diff --git a/launcher.ps1 b/launcher.ps1 index 4019531..366466e 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -279,7 +279,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" - Write-Output "$([int][ApiExamples]::Signing_In_Person)) Signing_In_Person" + Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); From 66dabd88b418085bb4f6562faddc478b6ab7bb6a Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Wed, 27 Jul 2022 13:12:13 +0300 Subject: [PATCH 176/462] added example --- .../eSignature/eg040SetDocumentVisibility.ps1 | 162 ++++++++++++++++++ launcher.ps1 | 7 +- 2 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg040SetDocumentVisibility.ps1 diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 new file mode 100644 index 0000000..bc0d792 --- /dev/null +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -0,0 +1,162 @@ +$apiUri = "https://demo.docusign.net/restapi" + +# Send an envelope and set document visibility + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# ***DS.snippet.0.start +# document 1 (html) has tag **signature_1** +# document 2 (docx) has tag /sn1/ +# document 3 (pdf) has tag /sn1/ +# +# The envelope has two recipients. +# recipient 1 - signer 1 +# recipient 2 - signer 2 +# recipient 3 - cc +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$doc1Base64 = New-TemporaryFile +$doc2Base64 = New-TemporaryFile +$doc3Base64 = New-TemporaryFile + +$SIGNER1_EMAIL = Read-Host 'Please enter signer #1 email address' +$SIGNER1_NAME = Read-Host 'Please enter signer #1 name' +$SIGNER2_EMAIL = Read-Host 'Please enter signer #2 email address' +$SIGNER2_NAME = Read-Host 'Please enter signer #2 name' +$CC_EMAIL = Read-Host 'Please enter carbon copy email address' +$CC_NAME = Read-Host 'Please enter carbon copy name' + + +# Fetch docs and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 + +Write-Output "Sending the envelope request to DocuSign..." +Write-Output "The envelope has three documents. Processing time will be about 15 seconds." +Write-Output "Results:" + +# Concatenate the different parts of the request +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $doc1Base64)"; + name = "Order acknowledgement"; + fileExtension = "html"; + documentId = "1"; + }; + @{ + documentBase64 = "$(Get-Content $doc2Base64)"; + name = "Battle Plan"; + fileExtension = "docx"; + documentId = "2"; + }; + @{ + documentBase64 = "$(Get-Content $doc3Base64)"; + name = "Lorem Ipsum"; + fileExtension = "pdf"; + documentId = "3"; + }; ); + recipients = @{ + carbonCopies = @( + @{ + email = $CC_EMAIL; + name = $CC_NAME; + recipientId = "3"; + routingOrder = "3"; + }; + ); + signers = @( + @{ + email = $SIGNER1_EMAIL; + name = $SIGNER1_NAME; + recipientId = "1"; + routingOrder = "1"; + excludedDocuments = @(2, 3) + tabs = @{ + signHereTabs = @( + @{ + anchorString = "**signature_1**"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + @{ + email = $SIGNER2_EMAIL; + name = $SIGNER2_NAME; + recipientId = "2"; + routingOrder = "2"; + excludedDocuments = @(1) + tabs = @{ + signHereTabs = @( + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +# Step 3. Create and send the envelope' +try { + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + + Write-Output "Response: $(Get-Content -Raw $response)" + + # pull out the envelopeId + $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId + + # ***DS.snippet.0.end + Write-Output "EnvelopeId: $envelopeId" +} +catch { + $errorMessage = $_.ErrorDetails.Message + Write-Host $errorMessage + Write-Host "" + + if ( $errorMessage.Contains("ACCOUNT_LACKS_PERMISSIONS") ) { + Write-Host "See https://developers.docusign.com/docs/esign-rest-api/how-to/set-document-visibility in the DocuSign Developer Center for instructions on how to enable document visibility in your developer account." + } +} + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $doc1Base64 +Remove-Item $doc2Base64 +Remove-Item $doc3Base64 + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index b9b6642..0ec3757 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -234,7 +234,8 @@ function startSignature { Delayed_Routing = 36; SMS_Delivery = 37; Create_Signable_HTML_document = 38; - Pick_An_API = 39; + Set_Document_Visibility = 40; + Pick_An_API = 41; } $ApiExamplesView = $null; @@ -278,6 +279,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" + Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -408,6 +410,9 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Set_Document_Visibility) { + powershell.exe .\examples\eSignature\eg040SetDocumentVisibility.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } From 11beb101cb89916ff0681dea24a52ee0dd73f8f3 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 27 Jul 2022 13:10:58 -0700 Subject: [PATCH 177/462] Fix typo --- Quick_ACG/launcherACG.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 index 862ed01..9b1a72b 100644 --- a/Quick_ACG/launcherACG.ps1 +++ b/Quick_ACG/launcherACG.ps1 @@ -40,7 +40,7 @@ function startSignature { do { Write-Output "" Write-Output 'Pick the next action: ' - Write-Output "$([int][MenuOptions]::Embedded_Signing)) Rerun the embeddd signing code example" + Write-Output "$([int][MenuOptions]::Embedded_Signing)) Rerun the embedded signing code example" Write-Output "$([int][MenuOptions]::Exit)) Exit" [int]$MenuOptionsView = Read-Host "Pick the next action" } while (-not [MenuOptions]::IsDefined([MenuOptions], $MenuOptionsView)); From 82350a7ec61af011ea917be0e29ed97cf814aaa9 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 27 Jul 2022 13:11:45 -0700 Subject: [PATCH 178/462] Fixing typo --- Quick_ACG/launcherACG.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 index 862ed01..9b1a72b 100644 --- a/Quick_ACG/launcherACG.ps1 +++ b/Quick_ACG/launcherACG.ps1 @@ -40,7 +40,7 @@ function startSignature { do { Write-Output "" Write-Output 'Pick the next action: ' - Write-Output "$([int][MenuOptions]::Embedded_Signing)) Rerun the embeddd signing code example" + Write-Output "$([int][MenuOptions]::Embedded_Signing)) Rerun the embedded signing code example" Write-Output "$([int][MenuOptions]::Exit)) Exit" [int]$MenuOptionsView = Read-Host "Pick the next action" } while (-not [MenuOptions]::IsDefined([MenuOptions], $MenuOptionsView)); From e8302f2292c284f82be458ce29934666d69241fe Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 12 Aug 2022 11:42:34 -0700 Subject: [PATCH 179/462] Adding new option to eSign7 for PDF Portfolio --- examples/eSignature/eg007EnvelopeGetDoc.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/eSignature/eg007EnvelopeGetDoc.ps1 b/examples/eSignature/eg007EnvelopeGetDoc.ps1 index 14b828e..5d9d0f3 100644 --- a/examples/eSignature/eg007EnvelopeGetDoc.ps1 +++ b/examples/eSignature/eg007EnvelopeGetDoc.ps1 @@ -36,6 +36,7 @@ Enum listDocs { CertificateOfCompletion = 4; DocumentsCombinedTogether = 5; ZIPfile = 6; + PDFPortfolio = 7; } $listDocsView = $null; @@ -47,6 +48,7 @@ do { Write-Output "$([int][listDocs]::CertificateOfCompletion) - Certificate of Completion" Write-Output "$([int][listDocs]::DocumentsCombinedTogether) - Documents combined together" Write-Output "$([int][listDocs]::ZIPfile) - ZIP file" + Write-Output "$([int][listDocs]::PDFPortfolio) - PDF Portfolio" [int]$listDocsView = Read-Host "Please make a selection" } while (-not [listDocs]::IsDefined([listDocs], $listDocsView)); @@ -62,6 +64,10 @@ elseif ($listDocsView -eq [listDocs]::ZIPfile) { $docChoice = "archive" $outputFileExtension = "zip" } +elseif ($listDocsView -eq [listDocs]::PDFPortfolio) { + $docChoice = "portfolio" + $outputFileExtension = "pdf" +} else { $docChoice = $listDocsView } From a7352469e90e8f2bcc8df364accc48df444d2f47 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 15 Aug 2022 15:08:30 -0700 Subject: [PATCH 180/462] Adding new PDF Portfolio option --- examples/eSignature/eg007EnvelopeGetDoc.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/eSignature/eg007EnvelopeGetDoc.ps1 b/examples/eSignature/eg007EnvelopeGetDoc.ps1 index 14b828e..5d9d0f3 100644 --- a/examples/eSignature/eg007EnvelopeGetDoc.ps1 +++ b/examples/eSignature/eg007EnvelopeGetDoc.ps1 @@ -36,6 +36,7 @@ Enum listDocs { CertificateOfCompletion = 4; DocumentsCombinedTogether = 5; ZIPfile = 6; + PDFPortfolio = 7; } $listDocsView = $null; @@ -47,6 +48,7 @@ do { Write-Output "$([int][listDocs]::CertificateOfCompletion) - Certificate of Completion" Write-Output "$([int][listDocs]::DocumentsCombinedTogether) - Documents combined together" Write-Output "$([int][listDocs]::ZIPfile) - ZIP file" + Write-Output "$([int][listDocs]::PDFPortfolio) - PDF Portfolio" [int]$listDocsView = Read-Host "Please make a selection" } while (-not [listDocs]::IsDefined([listDocs], $listDocsView)); @@ -62,6 +64,10 @@ elseif ($listDocsView -eq [listDocs]::ZIPfile) { $docChoice = "archive" $outputFileExtension = "zip" } +elseif ($listDocsView -eq [listDocs]::PDFPortfolio) { + $docChoice = "portfolio" + $outputFileExtension = "pdf" +} else { $docChoice = $listDocsView } From 1f871fc6bf55941406be8f1e086f18a8904053b2 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 16 Aug 2022 15:54:44 -0700 Subject: [PATCH 181/462] Fixing merge issue --- launcher.ps1 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/launcher.ps1 b/launcher.ps1 index 0ec3757..e45fac2 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -234,6 +234,7 @@ function startSignature { Delayed_Routing = 36; SMS_Delivery = 37; Create_Signable_HTML_document = 38; + Signing_In_Person = 39; Set_Document_Visibility = 40; Pick_An_API = 41; } @@ -279,6 +280,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" + Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" @@ -410,7 +412,12 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Signing_In_Person) { + checkCC + powershell.exe .\examples\eSignature\eg039SigningInPerson.ps1 + } elseif ($ApiExamplesView -eq [ApiExamples]::Set_Document_Visibility) { + checkCC powershell.exe .\examples\eSignature\eg040SetDocumentVisibility.ps1 } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) From 0f5ad08c05470eca08640b777d1897ac4f13e328 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 18 Aug 2022 09:58:13 -0700 Subject: [PATCH 182/462] removing clientUserId so that email is sent in the end --- examples/eSignature/eg039SigningInPerson.ps1 | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 index 7046c8e..494448d 100644 --- a/examples/eSignature/eg039SigningInPerson.ps1 +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -10,7 +10,6 @@ $accessToken = Get-Content .\config\ds_access_token.txt $accountId = Get-Content .\config\API_ACCOUNT_ID # Step 2. Create the envelope definition. -# The signer recipient includes a clientUserId setting # # document 1 (PDF) has tag /sn1/ # recipient 1 - signer @@ -62,7 +61,6 @@ Write-Output "Sending the envelope request to DocuSign..." signerName = $signerName; recipientId = "1"; routingOrder = "1"; - clientUserId = "1000"; tabs = @{ signHereTabs = @( @{ @@ -111,7 +109,6 @@ $json = [ordered]@{ 'authenticationMethod' = 'none'; 'email' = $hostEmail; 'userName' = $hostName; - 'clientUserId' = 1000 } | ConvertTo-Json -Compress From 10e6eea852489d0f32248c801f2abf963d9882de Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 18 Aug 2022 11:18:54 -0700 Subject: [PATCH 183/462] Adding two new code examples --- examples/eSignature/eg039SigningInPerson.ps1 | 140 +++++++++++++++ .../eSignature/eg040SetDocumentVisibility.ps1 | 162 ++++++++++++++++++ launcher.ps1 | 14 +- 3 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg039SigningInPerson.ps1 create mode 100644 examples/eSignature/eg040SetDocumentVisibility.ps1 diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 new file mode 100644 index 0000000..494448d --- /dev/null +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -0,0 +1,140 @@ +$apiUri = "https://demo.docusign.net/restapi" +$authorizationEndpoint = "https://account-d.docusign.com/oauth" + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# Step 2. Create the envelope definition. +# +# document 1 (PDF) has tag /sn1/ +# recipient 1 - signer +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$docBase64 = New-TemporaryFile + +# Fetch doc and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 + +$signerName = Read-Host "Please enter the name of the in person signer" + +# Get the current user email +Invoke-RestMethod ` + -Uri "${authorizationEndpoint}/userinfo" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Cache-Control' = "no-store"; + 'Pragma' = "no-cache"; +} ` + -OutFile $response + +$hostEmail = $(Get-Content $response | ConvertFrom-Json).email +$hostName = $(Get-Content $response | ConvertFrom-Json).name + +Write-Output "Sending the envelope request to DocuSign..." + +# Concatenate the different parts of the request +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $docBase64)"; + name = "Lorem Ipsum"; + fileExtension = "pdf"; + documentId = "1"; + }; + ); + recipients = @{ + inPersonSigners = @( + @{ + hostEmail = $hostEmail; + hostName = $hostName; + signerName = $signerName; + recipientId = "1"; + routingOrder = "1"; + tabs = @{ + signHereTabs = @( + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +# Step 3. Call DocuSign to create the envelope +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId +Write-Output "EnvelopeId: $envelopeId" + +# Step 4. Create a recipient view definition +# The signer will directly open this link from the browser to sign. +# +# The returnUrl is normally your own web app. DocuSign will redirect +# the signer to returnUrl when the signing completes. +# For this example, we'll use http://httpbin.org/get to show the +# query parameters passed back from DocuSign + +Write-Output "Requesting the url for the embedded signing..." + +$json = [ordered]@{ + 'returnUrl' = 'http://httpbin.org/get'; + 'authenticationMethod' = 'none'; + 'email' = $hostEmail; + 'userName' = $hostName; +} | ConvertTo-Json -Compress + + +# Step 5. Create the recipient view and begin the DocuSign signing +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -Body $json ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" +$signingUrl = $(Get-Content $response | ConvertFrom-Json).url + +# ***DS.snippet.0.end +Write-Output "The embedded signing URL is $signingUrl" +Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." + +Start-Process $signingUrl + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $docBase64 + +Write-Output "Done." diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 new file mode 100644 index 0000000..bc0d792 --- /dev/null +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -0,0 +1,162 @@ +$apiUri = "https://demo.docusign.net/restapi" + +# Send an envelope and set document visibility + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# ***DS.snippet.0.start +# document 1 (html) has tag **signature_1** +# document 2 (docx) has tag /sn1/ +# document 3 (pdf) has tag /sn1/ +# +# The envelope has two recipients. +# recipient 1 - signer 1 +# recipient 2 - signer 2 +# recipient 3 - cc +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$doc1Base64 = New-TemporaryFile +$doc2Base64 = New-TemporaryFile +$doc3Base64 = New-TemporaryFile + +$SIGNER1_EMAIL = Read-Host 'Please enter signer #1 email address' +$SIGNER1_NAME = Read-Host 'Please enter signer #1 name' +$SIGNER2_EMAIL = Read-Host 'Please enter signer #2 email address' +$SIGNER2_NAME = Read-Host 'Please enter signer #2 name' +$CC_EMAIL = Read-Host 'Please enter carbon copy email address' +$CC_NAME = Read-Host 'Please enter carbon copy name' + + +# Fetch docs and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 + +Write-Output "Sending the envelope request to DocuSign..." +Write-Output "The envelope has three documents. Processing time will be about 15 seconds." +Write-Output "Results:" + +# Concatenate the different parts of the request +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $doc1Base64)"; + name = "Order acknowledgement"; + fileExtension = "html"; + documentId = "1"; + }; + @{ + documentBase64 = "$(Get-Content $doc2Base64)"; + name = "Battle Plan"; + fileExtension = "docx"; + documentId = "2"; + }; + @{ + documentBase64 = "$(Get-Content $doc3Base64)"; + name = "Lorem Ipsum"; + fileExtension = "pdf"; + documentId = "3"; + }; ); + recipients = @{ + carbonCopies = @( + @{ + email = $CC_EMAIL; + name = $CC_NAME; + recipientId = "3"; + routingOrder = "3"; + }; + ); + signers = @( + @{ + email = $SIGNER1_EMAIL; + name = $SIGNER1_NAME; + recipientId = "1"; + routingOrder = "1"; + excludedDocuments = @(2, 3) + tabs = @{ + signHereTabs = @( + @{ + anchorString = "**signature_1**"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + @{ + email = $SIGNER2_EMAIL; + name = $SIGNER2_NAME; + recipientId = "2"; + routingOrder = "2"; + excludedDocuments = @(1) + tabs = @{ + signHereTabs = @( + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +# Step 3. Create and send the envelope' +try { + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + + Write-Output "Response: $(Get-Content -Raw $response)" + + # pull out the envelopeId + $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId + + # ***DS.snippet.0.end + Write-Output "EnvelopeId: $envelopeId" +} +catch { + $errorMessage = $_.ErrorDetails.Message + Write-Host $errorMessage + Write-Host "" + + if ( $errorMessage.Contains("ACCOUNT_LACKS_PERMISSIONS") ) { + Write-Host "See https://developers.docusign.com/docs/esign-rest-api/how-to/set-document-visibility in the DocuSign Developer Center for instructions on how to enable document visibility in your developer account." + } +} + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $doc1Base64 +Remove-Item $doc2Base64 +Remove-Item $doc3Base64 + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index b9b6642..e45fac2 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -234,7 +234,9 @@ function startSignature { Delayed_Routing = 36; SMS_Delivery = 37; Create_Signable_HTML_document = 38; - Pick_An_API = 39; + Signing_In_Person = 39; + Set_Document_Visibility = 40; + Pick_An_API = 41; } $ApiExamplesView = $null; @@ -278,6 +280,8 @@ function startSignature { Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" + Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" + Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -408,6 +412,14 @@ function startSignature { checkCC powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Signing_In_Person) { + checkCC + powershell.exe .\examples\eSignature\eg039SigningInPerson.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Set_Document_Visibility) { + checkCC + powershell.exe .\examples\eSignature\eg040SetDocumentVisibility.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } From bdec2d90fde4973d783680ed4a9c18dd711ecb27 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 26 Aug 2022 11:17:59 -0700 Subject: [PATCH 184/462] Adding steps comments for IPS --- examples/eSignature/eg039SigningInPerson.ps1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 index 494448d..64dd428 100644 --- a/examples/eSignature/eg039SigningInPerson.ps1 +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -43,6 +43,7 @@ $hostName = $(Get-Content $response | ConvertFrom-Json).name Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request +# Step 2 start @{ emailSubject = "Please sign this document set"; documents = @( @@ -76,8 +77,10 @@ Write-Output "Sending the envelope request to DocuSign..." }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +# Step 2 end # Step 3. Call DocuSign to create the envelope +# Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -89,6 +92,7 @@ Invoke-RestMethod ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" +# Step 3 end # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId @@ -104,15 +108,18 @@ Write-Output "EnvelopeId: $envelopeId" Write-Output "Requesting the url for the embedded signing..." +# Step 4 start $json = [ordered]@{ 'returnUrl' = 'http://httpbin.org/get'; 'authenticationMethod' = 'none'; 'email' = $hostEmail; 'userName' = $hostName; } | ConvertTo-Json -Compress +# Step 4 end # Step 5. Create the recipient view and begin the DocuSign signing +# Step 5 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` -Method 'POST' ` @@ -125,6 +132,7 @@ Invoke-RestMethod ` Write-Output "Response: $(Get-Content -Raw $response)" $signingUrl = $(Get-Content $response | ConvertFrom-Json).url +# Step 5 end # ***DS.snippet.0.end Write-Output "The embedded signing URL is $signingUrl" From cef69ab937f746c459f2c1e6f80fbffd45096011 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 26 Aug 2022 11:29:50 -0700 Subject: [PATCH 185/462] Adding step comments to DocVis --- examples/eSignature/eg040SetDocumentVisibility.ps1 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 index bc0d792..0e5f0a0 100644 --- a/examples/eSignature/eg040SetDocumentVisibility.ps1 +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -52,6 +52,7 @@ Write-Output "The envelope has three documents. Processing time will be about 15 Write-Output "Results:" # Concatenate the different parts of the request +# Step 3 start @{ emailSubject = "Please sign this document set"; documents = @( @@ -121,18 +122,22 @@ Write-Output "Results:" }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +# Step 3 end -# Step 3. Create and send the envelope' +# Step 4 start try { Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` -Headers @{ +# Step 2 start 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; +# Step 2 end } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +# Step 4 end Write-Output "Response: $(Get-Content -Raw $response)" From 2bc908de4dbfb577e549f213c6db8fc2163abe38 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 26 Aug 2022 15:58:16 -0700 Subject: [PATCH 186/462] moved step 3 gist and removed some old numbering --- examples/eSignature/eg039SigningInPerson.ps1 | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 index 64dd428..5bc8a7f 100644 --- a/examples/eSignature/eg039SigningInPerson.ps1 +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -1,7 +1,7 @@ $apiUri = "https://demo.docusign.net/restapi" $authorizationEndpoint = "https://account-d.docusign.com/oauth" -# Step 1: Obtain your OAuth token +# Obtain your OAuth token # Note: Substitute these values with your own $accessToken = Get-Content .\config\ds_access_token.txt @@ -9,7 +9,7 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountId = Get-Content .\config\API_ACCOUNT_ID -# Step 2. Create the envelope definition. +# Create the envelope definition. # # document 1 (PDF) has tag /sn1/ # recipient 1 - signer @@ -79,7 +79,7 @@ Write-Output "Sending the envelope request to DocuSign..." } | ConvertTo-Json -Depth 32 > $requestData # Step 2 end -# Step 3. Call DocuSign to create the envelope +# Call DocuSign to create the envelope # Step 3 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -92,13 +92,13 @@ Invoke-RestMethod ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" -# Step 3 end # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId Write-Output "EnvelopeId: $envelopeId" +# Step 3 end -# Step 4. Create a recipient view definition +# Create a recipient view definition # The signer will directly open this link from the browser to sign. # # The returnUrl is normally your own web app. DocuSign will redirect @@ -118,7 +118,7 @@ $json = [ordered]@{ # Step 4 end -# Step 5. Create the recipient view and begin the DocuSign signing +# Create the recipient view and begin the DocuSign signing # Step 5 start Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` @@ -134,7 +134,6 @@ Write-Output "Response: $(Get-Content -Raw $response)" $signingUrl = $(Get-Content $response | ConvertFrom-Json).url # Step 5 end -# ***DS.snippet.0.end Write-Output "The embedded signing URL is $signingUrl" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." From 723244652f4f4c4d40f9360a4e0c96995b165f76 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 26 Aug 2022 16:34:22 -0700 Subject: [PATCH 187/462] removed old numbering --- examples/eSignature/eg040SetDocumentVisibility.ps1 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 index 0e5f0a0..207622c 100644 --- a/examples/eSignature/eg040SetDocumentVisibility.ps1 +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -6,7 +6,7 @@ $apiUri = "https://demo.docusign.net/restapi" $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -# Step 1: Obtain your OAuth token +# Obtain your OAuth token # Note: Substitute these values with your own $accessToken = Get-Content .\config\ds_access_token.txt @@ -14,7 +14,6 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountId = Get-Content .\config\API_ACCOUNT_ID -# ***DS.snippet.0.start # document 1 (html) has tag **signature_1** # document 2 (docx) has tag /sn1/ # document 3 (pdf) has tag /sn1/ @@ -144,7 +143,6 @@ try { # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId - # ***DS.snippet.0.end Write-Output "EnvelopeId: $envelopeId" } catch { From 4fc5ce531367f9864617c1c501b7db2c45f04267 Mon Sep 17 00:00:00 2001 From: raileendr Date: Tue, 13 Sep 2022 16:24:09 -0700 Subject: [PATCH 188/462] separate header from api call --- examples/eSignature/eg007EnvelopeGetDoc.ps1 | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg007EnvelopeGetDoc.ps1 b/examples/eSignature/eg007EnvelopeGetDoc.ps1 index 5d9d0f3..8d1b016 100644 --- a/examples/eSignature/eg007EnvelopeGetDoc.ps1 +++ b/examples/eSignature/eg007EnvelopeGetDoc.ps1 @@ -26,6 +26,11 @@ else { exit 1 } +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } + $docChoice = "1" $outputFileExtension = "pdf" @@ -78,11 +83,9 @@ Write-Output "Sending the EnvelopeDocuments::get request to DocuSign..." Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/documents/${docChoice}" ` -Method 'GET' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; -} ` + -Headers $headers ` -OutFile ${outputFile}${outputFileExtension} + # Step 3 end Write-Output "The document(s) are stored in file ${outputFile}${outputFileExtension}" Write-Output "Done." From 2cfd99cea77e39b4bdcff51f13661b62dc9a888e Mon Sep 17 00:00:00 2001 From: raileendr Date: Tue, 13 Sep 2022 16:51:24 -0700 Subject: [PATCH 189/462] seprated headers from api call --- examples/eSignature/eg006EnvelopeDocs.ps1 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/examples/eSignature/eg006EnvelopeDocs.ps1 b/examples/eSignature/eg006EnvelopeDocs.ps1 index b74f59d..bb1cad4 100644 --- a/examples/eSignature/eg006EnvelopeDocs.ps1 +++ b/examples/eSignature/eg006EnvelopeDocs.ps1 @@ -23,17 +23,21 @@ else { exit 1 } +# Step 2 start +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} +# Step 2 end + Write-Output "Sending the EnvelopeDocuments::list request to DocuSign..." Write-Output "Results:" -# Step 2. List envelope documents +# Step 3. List envelope documents Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/documents" ` -Method 'GET' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; -} + -Headers $headers # ***DS.snippet.0.end Write-Output "Done." From 1d132153ba849bf633e66ba557b275662808efc9 Mon Sep 17 00:00:00 2001 From: raileendr Date: Fri, 16 Sep 2022 15:47:32 -0700 Subject: [PATCH 190/462] Separating API call from headers and adding step comments --- examples/eSignature/eg010SendBinaryDocs.ps1 | 27 ++++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/examples/eSignature/eg010SendBinaryDocs.ps1 b/examples/eSignature/eg010SendBinaryDocs.ps1 index d5b94f5..1f9e6cb 100644 --- a/examples/eSignature/eg010SendBinaryDocs.ps1 +++ b/examples/eSignature/eg010SendBinaryDocs.ps1 @@ -7,24 +7,33 @@ function Add-OemContent { } # Configuration -# 1. Get required variables from .\config\settings.json: +# Get required variables from .\config\settings.json: $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json $CC_EMAIL = $variables.CC_EMAIL $CC_NAME = $variables.CC_NAME $SIGNER_EMAIL = $variables.SIGNER_EMAIL $SIGNER_NAME = $variables.SIGNER_NAME - -# Step 2. Obtain your OAuth access token +# Step 1 start +# Obtain your OAuth access token $accessToken = Get-Content ".\config\ds_access_token.txt" +# Step 1 end # Obtain your accountId from demo.docusign.net -- the account id is shown in # the drop down on the upper right corner of the screen by your picture or # the default picture. $accountId = Get-Content ".\config\API_ACCOUNT_ID" +# Step 2 start +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "multipart/form-data; boundary=${boundary}"; +} +# Step 2 end + # ***DS.snippet.0.start -# Step 3. Construct the request body +# Step 3 start +# Construct the request body # document 1 (html) has tag **signature_1** # document 2 (docx) has tag /sn1/ # document 3 (pdf) has tag /sn1/ @@ -142,22 +151,22 @@ Add-OemContent $requestData "${CRLF}" # Add closing boundary Add-OemContent $requestData "--$boundary--" Add-OemContent $requestData "${CRLF}" +# Step 3 end # Send request try { - # Step 4. Call the eSignature REST API + # Step 4 start + # Call the eSignature REST API Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "multipart/form-data; boundary=${boundary}"; - } ` + -Headers $headers ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" } +# Step 4 end catch { Write-Error $_ } From 98c6e82119c6849cabca6a40b596fbfb302eff2d Mon Sep 17 00:00:00 2001 From: raileendr Date: Fri, 16 Sep 2022 16:00:45 -0700 Subject: [PATCH 191/462] moved step 2 to resolve error --- examples/eSignature/eg010SendBinaryDocs.ps1 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/eSignature/eg010SendBinaryDocs.ps1 b/examples/eSignature/eg010SendBinaryDocs.ps1 index 1f9e6cb..9a83b37 100644 --- a/examples/eSignature/eg010SendBinaryDocs.ps1 +++ b/examples/eSignature/eg010SendBinaryDocs.ps1 @@ -23,13 +23,6 @@ $accessToken = Get-Content ".\config\ds_access_token.txt" # the default picture. $accountId = Get-Content ".\config\API_ACCOUNT_ID" -# Step 2 start -$headers = @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "multipart/form-data; boundary=${boundary}"; -} -# Step 2 end - # ***DS.snippet.0.start # Step 3 start @@ -153,6 +146,13 @@ Add-OemContent $requestData "--$boundary--" Add-OemContent $requestData "${CRLF}" # Step 3 end +# Step 2 start +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "multipart/form-data; boundary=${boundary}"; +} +# Step 2 end + # Send request try { # Step 4 start From 6e2d2899dd0a9e838dcdc2da0228c61b2ce0b7e5 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 7 Oct 2022 09:52:20 -0700 Subject: [PATCH 192/462] DEVDOCS-8774 - checking for errors in Monitor API and giving nice user friendly error if you don't have Monitor enabled --- examples/Monitor/eg001GetMonitoringData.ps1 | 2 +- examples/Monitor/eg002WebQueryEndpoint.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index c1ac11c..9447ace 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -71,7 +71,7 @@ DO { } $int++ } - Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "You do not have Monitor enabled for your account, follow https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/ to get it enabled." Write-Output "Command : "$_.InvocationInfo.Line $complete = $true } diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 index 819a51c..fb0188e 100644 --- a/examples/Monitor/eg002WebQueryEndpoint.ps1 +++ b/examples/Monitor/eg002WebQueryEndpoint.ps1 @@ -62,7 +62,7 @@ catch { } $int++ } - Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "You do not have Monitor enabled for your account, follow https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/ to get it enabled." Write-Output "Command : "$_.InvocationInfo.Line } # Step 4 end From 192d3cb2c1e5b0a1c592f113d0cb2ef87aeb4b01 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 10 Oct 2022 14:45:08 -0700 Subject: [PATCH 193/462] Adding check for Monitor API --- examples/Monitor/eg001GetMonitoringData.ps1 | 2 +- examples/Monitor/eg002WebQueryEndpoint.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index c1ac11c..9447ace 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -71,7 +71,7 @@ DO { } $int++ } - Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "You do not have Monitor enabled for your account, follow https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/ to get it enabled." Write-Output "Command : "$_.InvocationInfo.Line $complete = $true } diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 index 819a51c..fb0188e 100644 --- a/examples/Monitor/eg002WebQueryEndpoint.ps1 +++ b/examples/Monitor/eg002WebQueryEndpoint.ps1 @@ -62,7 +62,7 @@ catch { } $int++ } - Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "You do not have Monitor enabled for your account, follow https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/ to get it enabled." Write-Output "Command : "$_.InvocationInfo.Line } # Step 4 end From fb383859d758f623121bc4908a1abdce99e75a82 Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Mon, 17 Oct 2022 10:30:10 -0700 Subject: [PATCH 194/462] changed cc email check validation to be generic (#49) * Adding check for Monitor API * change cc check to generic email check * added check to examples that use signature email w/o cc email * revert to error code exit * rename email check function * update error text Co-authored-by: Inbar Gazit --- launcher.ps1 | 57 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index e45fac2..031b4bf 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -18,7 +18,17 @@ if (Test-Path $emailAddressFile) { # Get required environment variables from .\config\settings.json file $config = Get-Content $configFile -Raw | ConvertFrom-Json -function checkCC { +function checkEmailAddresses { + + if (-not [system.Text.RegularExpressions.Regex]::IsMatch($config.SIGNER_EMAIL, + "^(?("")("".+?(? Date: Mon, 17 Oct 2022 14:04:23 -0700 Subject: [PATCH 195/462] envelope id and envelope documents are now shown fully in the output --- examples/eSignature/eg006EnvelopeDocs.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg006EnvelopeDocs.ps1 b/examples/eSignature/eg006EnvelopeDocs.ps1 index bb1cad4..718f76b 100644 --- a/examples/eSignature/eg006EnvelopeDocs.ps1 +++ b/examples/eSignature/eg006EnvelopeDocs.ps1 @@ -37,7 +37,7 @@ Write-Output "Results:" Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/documents" ` -Method 'GET' ` - -Headers $headers + -Headers $headers | ConvertTo-Json # ***DS.snippet.0.end Write-Output "Done." From 7ca1ec1c0b7b7ddbf1555ba2fe0a93f19f287bd3 Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Tue, 18 Oct 2022 23:36:38 -0700 Subject: [PATCH 196/462] New embedClickwrap code example (#50) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adding check for Monitor API * initial commit * wire in click-eg006 into launcher.ps1 (not working yet) * stumped, returns 401 (unauthorized) * added in scopes and fixed small bugs (now wad) * few more small 🐛 * Update code_grant.ps1 impersonation isn't needed for this scope on codeGrant * synced error printouts with Bash, removed older Step numbers Co-authored-by: Inbar Gazit Co-authored-by: meihDS <70775251+meihDS@users.noreply.github.com> --- OAuth/code_grant.ps1 | 2 +- OAuth/jwt.ps1 | 2 +- examples/Click/eg006EmbedClickwrap.ps1 | 81 ++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 examples/Click/eg006EmbedClickwrap.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 667c4e7..5e25b45 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -21,7 +21,7 @@ elseif ($apiVersion -eq "eSignature") { $scopes = "signature" } elseif ($apiVersion -eq "click") { - $scopes = "click.manage" + $scopes = "click.manage%20click.send%20signature" } elseif ($apiVersion -eq "monitor") { $scopes = "signature impersonation" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 527d70c..ba4bb48 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -34,7 +34,7 @@ if ($apiVersion -eq "rooms") { } elseif ($apiVersion -eq "eSignature") { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "click") { - $scopes = "click.manage" + $scopes = "click.manage%20click.send%20signature%20impersonation" } elseif ($apiVersion -eq "monitor") { $scopes = "signature%20impersonation" diff --git a/examples/Click/eg006EmbedClickwrap.ps1 b/examples/Click/eg006EmbedClickwrap.ps1 new file mode 100644 index 0000000..c12e4a8 --- /dev/null +++ b/examples/Click/eg006EmbedClickwrap.ps1 @@ -0,0 +1,81 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Check that we have a clickwrap ID +if (Test-Path .\config\CLICKWRAP_ID) { + $ClickWrapId = Get-Content .\config\CLICKWRAP_ID +} +else { + Write-Output "Clickwrap ID required. Please run code example 1 - Create Clickwrap" + exit 1 +} + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") + +$client_user_id = Read-Host "Please input a Client User Id (your own unique identifier) for the clickwrap" +$full_name = Read-Host "Please input a full name" +$email_address = Read-Host "Please input an email address" +$company_name = Read-Host "Please input a company name" +$title = Read-Host "Please input a job title" + +# Construct the request body +$requestData = New-TemporaryFile +$response = New-TemporaryFile + +@{ + clientUserId = $client_user_id; + documentData = + @{ + fullName = $full_name; + email = $email_address; + company = $company_name; + title = $title; + date = $((Get-Date).ToString("yyyy-MM-ddThh:mm:ssK")) + }; +} | ConvertTo-Json -Depth 32 > $requestData + +# Call the Click API +# a) Make a GET call to the users endpoint to retrieve responses (acceptance) of a specific clickwrap for an account +# b) Display the returned JSON structure of the responses +try { + + + Invoke-RestMethod ` + -Uri "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/agreements" ` + -UseBasicParsing ` + -Method "POST" ` + -Headers @{ + "Authorization" = "Bearer $accessToken" + "Content-Type" = "application/json" + "Accept" = "application/json" +} ` +-InFile (Resolve-Path $requestData).Path ` +-OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + + +# cleanup +Remove-Item $requestData +Remove-Item $response +Write-Output "Done." + +} +catch { + $errorMessage = $_.ErrorDetails.Message + Write-Host "" + if($errorMessage){ + if ( $errorMessage.Contains("There are no active versions for clickwrapId") ) { + Write-Host "Clickwrap must be activated. Please run code example 2 - Activate Clickwrap" + } + elseif ( $errorMessage.Contains("Unable to find Clickwrap with id") ) { + Write-Host "Clickwrap ID required. Please run code example 1 - Create Clickwrap" + } + +} +} From 2df51178494b1703a36eca7022f3d016c45b12ed Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 21 Oct 2022 13:54:10 -0700 Subject: [PATCH 197/462] Updating README --- README.md | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 4ba7a7f..a26d02a 100644 --- a/README.md +++ b/README.md @@ -18,38 +18,43 @@ When the token expires, it updates automatically. ## eSignature API -For more information about the scopes used for obtaining authorization to use the eSignature API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). +For more information about the scopes used for obtaining authorization to use the eSignature API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). -For a list of code examples that use the eSignature API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/esign-rest-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +For a list of code examples that use the eSignature API, see the [How-to guides overview](https://developers.docusign.com/docs/esign-rest-api/how-to/) on the DocuSign Developer Center. -## Rooms API +## Rooms API -**Note:** To use the Rooms API you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. -For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). +**Note:** To use the Rooms API, you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. +For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). -For a list of code examples that use the Rooms API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/rooms-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. - -## Click API +For a list of code examples that use the Rooms API, see the [How-to guides overview](https://developers.docusign.com/docs/rooms-api/how-to/) on the DocuSign Developer Center. -For more information about the scopes used for obtaining authorization to use the Click API, see [Required scopes](https://developers.docusign.com/docs/click-api/click101/auth/#required-scopes). -For a list of code examples that use the Click API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/click-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +## Click API +For more information about the scopes used for obtaining authorization to use the Click API, see [Required scopes](https://developers.docusign.com/docs/click-api/click101/auth/#required-scopes) -## Admin API +For a list of code examples that use the Click API, see the [How-to guides overview](https://developers.docusign.com/docs/click-api/how-to/) on the DocuSign Developer Center. -**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). -For more information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). +## Monitor API -For a list of code examples that use the Admin API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/admin-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +**Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). + +For information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). + +For a list of code examples that use the Monitor API, see the [How-to guides overview](https://developers.docusign.com/docs/monitor-api/how-to/) on the DocuSign Developer Center. -## Monitor API -**Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). -For information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). -For a list of code examples that use the Monitor API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/monitor-api/how-to/code-launchers/#examples-and-languages) on the DocuSign Developer Center. +## Admin API + +**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). + +For information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). + +For a list of code examples that use the Admin API, see the [How-to guides overview](https://developers.docusign.com/docs/admin-api/how-to/) on the DocuSign Developer Center. ## Installation + ### Prerequisites **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip items 1 and 2 as they were automatically performed for you. From bf5c2d76991fab5cd7090d2fda8613b0e33abced Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 21 Oct 2022 14:31:45 -0700 Subject: [PATCH 198/462] README.md updates --- README.md | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 4ba7a7f..a26d02a 100644 --- a/README.md +++ b/README.md @@ -18,38 +18,43 @@ When the token expires, it updates automatically. ## eSignature API -For more information about the scopes used for obtaining authorization to use the eSignature API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). +For more information about the scopes used for obtaining authorization to use the eSignature API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). -For a list of code examples that use the eSignature API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/esign-rest-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +For a list of code examples that use the eSignature API, see the [How-to guides overview](https://developers.docusign.com/docs/esign-rest-api/how-to/) on the DocuSign Developer Center. -## Rooms API +## Rooms API -**Note:** To use the Rooms API you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. -For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). +**Note:** To use the Rooms API, you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. +For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). -For a list of code examples that use the Rooms API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/rooms-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. - -## Click API +For a list of code examples that use the Rooms API, see the [How-to guides overview](https://developers.docusign.com/docs/rooms-api/how-to/) on the DocuSign Developer Center. -For more information about the scopes used for obtaining authorization to use the Click API, see [Required scopes](https://developers.docusign.com/docs/click-api/click101/auth/#required-scopes). -For a list of code examples that use the Click API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/click-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +## Click API +For more information about the scopes used for obtaining authorization to use the Click API, see [Required scopes](https://developers.docusign.com/docs/click-api/click101/auth/#required-scopes) -## Admin API +For a list of code examples that use the Click API, see the [How-to guides overview](https://developers.docusign.com/docs/click-api/how-to/) on the DocuSign Developer Center. -**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). -For more information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). +## Monitor API -For a list of code examples that use the Admin API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/admin-api/how-to/code-launchers#examples-and-languages) on the DocuSign Developer Center. +**Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). + +For information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). + +For a list of code examples that use the Monitor API, see the [How-to guides overview](https://developers.docusign.com/docs/monitor-api/how-to/) on the DocuSign Developer Center. -## Monitor API -**Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). -For information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). -For a list of code examples that use the Monitor API, select the PowerShell tab under [Examples and languages](https://developers.docusign.com/docs/monitor-api/how-to/code-launchers/#examples-and-languages) on the DocuSign Developer Center. +## Admin API + +**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). + +For information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). + +For a list of code examples that use the Admin API, see the [How-to guides overview](https://developers.docusign.com/docs/admin-api/how-to/) on the DocuSign Developer Center. ## Installation + ### Prerequisites **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip items 1 and 2 as they were automatically performed for you. From 74158995e031e00adbadd68422d6eb66d1d1feef Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Mon, 24 Oct 2022 15:01:21 +0300 Subject: [PATCH 199/462] updated jwt auth code to open page only when consent is required --- OAuth/jwt.ps1 | 134 +++++++++++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 56 deletions(-) diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 527d70c..f5ca567 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -55,62 +55,6 @@ $authorizationURL = "${authorizationEndpoint}auth?scope=$scopes&redirect_uri=$re Write-Output "The authorization URL is: $authorizationURL" Write-Output "" -# Request the authorization code -# Use Http Server -$http = New-Object System.Net.HttpListener - -# Hostname and port to listen on -$http.Prefixes.Add($redirectURI + "/") - -try { - # Start the Http Server - $http.Start() - - } - catch { - Write-Error "OAuth listener failed. Is port 8080 in use by another program?" -ErrorAction Stop - } - -if ($http.IsListening) { - Write-Output "Open the following URL in a browser to continue:" $authorizationURL - Start-Process $authorizationURL -} - -while ($http.IsListening) { - $context = $http.GetContext() - - if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.Url.LocalPath -match '/authorization-code/callback') { - # write-host "Check context" - # write-host "$($context.Request.UserHostAddress) => $($context.Request.Url)" -f 'mag' - [string]$html = ' - - - - - - - Ok. You may close this tab and return to the shell. This window closes automatically in five seconds. - - - - ' - # Respond to the request - $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) # Convert HTML to bytes - $context.Response.ContentLength64 = $buffer.Length - $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) # Stream HTML to browser - $context.Response.OutputStream.Close() # Close the response - - Start-Sleep 4 - $http.Stop() - } -} - # Step 2. Create a JWT $decJwtHeader = [ordered]@{ 'typ' = 'JWT'; @@ -177,5 +121,83 @@ try { Write-Output "Account id has been written to $accountIdFile file..." } catch { + if (($_.ErrorDetails.Message | ConvertFrom-Json | Select-Object -Expand error) -eq "consent_required") { + # Use Http Server + $http = New-Object System.Net.HttpListener + + # Hostname and port to listen on + $http.Prefixes.Add($redirectURI + "/") + + try { + # Start the Http Server + $http.Start() + + } + catch { + Write-Error "OAuth listener failed. Is port 8080 in use by another program?" -ErrorAction Stop + } + + if ($http.IsListening) { + Write-Output "Open the following URL in a browser to continue:" $authorizationURL + Start-Process $authorizationURL + } + + while ($http.IsListening) { + $context = $http.GetContext() + + if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.Url.LocalPath -match '/authorization-code/callback') { + # write-host "Check context" + # write-host "$($context.Request.UserHostAddress) => $($context.Request.Url)" -f 'mag' + [string]$html = ' + + + + + + + Ok. You may close this tab and return to the shell. This window closes automatically in five seconds. + + + + ' + # Respond to the request + $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) # Convert HTML to bytes + $context.Response.ContentLength64 = $buffer.Length + $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) # Stream HTML to browser + $context.Response.OutputStream.Close() # Close the response + + Start-Sleep 4 + $http.Stop() + } + } + + $authorizationEndpoint = "https://account-d.docusign.com/oauth/" + $tokenResponse = Invoke-WebRequest ` + -Uri "$authorizationEndpoint/token" ` + -UseBasicParsing ` + -Method "POST" ` + -Body "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$jwtToken" + $accessToken = ($tokenResponse | ConvertFrom-Json).access_token + Write-Output $accessToken > $outputFile + Write-Output "Access token has been written to $outputFile file..." + + Write-Output "Getting an account id..." + $userInfoResponse = Invoke-RestMethod ` + -Uri "$authorizationEndpoint/userinfo" ` + -UseBasicParsing ` + -Method "GET" ` + -Headers @{ "Authorization" = "Bearer $accessToken" } + $accountId = $userInfoResponse.accounts[0].account_id + Write-Output "Account id: $accountId" + Write-Output $accountId > $accountIdFile + Write-Output "Account id has been written to $accountIdFile file..." + } else { Write-Error $_ + } } \ No newline at end of file From 10da28e3112d7a85ce673a3949dcd72705143591 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 24 Oct 2022 12:37:27 -0700 Subject: [PATCH 200/462] DEVDOCS-7202 - removing duplicate line --- examples/eSignature/eg024CreatingPermissionProfiles.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/eSignature/eg024CreatingPermissionProfiles.ps1 b/examples/eSignature/eg024CreatingPermissionProfiles.ps1 index dc973d6..910d397 100644 --- a/examples/eSignature/eg024CreatingPermissionProfiles.ps1 +++ b/examples/eSignature/eg024CreatingPermissionProfiles.ps1 @@ -31,7 +31,6 @@ $body = @" "allowedAddressBookAccess":"personalAndShared", "allowedTemplateAccess":"share", "enableRecipientViewingNotifications":"true", - "enableRecipientViewingNotifications":"true", "enableSequentialSigningInterface":"true", "receiveCompletedSelfSignedDocumentsAsEmailLinks":"false", "signingUiVersion":"v2", From 012993bc4e8079179df60b36a6e12ad4c9862f56 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 27 Oct 2022 13:25:36 -0700 Subject: [PATCH 201/462] A couple of fixes --- OAuth/jwt.ps1 | 134 ++++++++++-------- .../eg024CreatingPermissionProfiles.ps1 | 1 - 2 files changed, 78 insertions(+), 57 deletions(-) diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index ba4bb48..25d3afe 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -55,62 +55,6 @@ $authorizationURL = "${authorizationEndpoint}auth?scope=$scopes&redirect_uri=$re Write-Output "The authorization URL is: $authorizationURL" Write-Output "" -# Request the authorization code -# Use Http Server -$http = New-Object System.Net.HttpListener - -# Hostname and port to listen on -$http.Prefixes.Add($redirectURI + "/") - -try { - # Start the Http Server - $http.Start() - - } - catch { - Write-Error "OAuth listener failed. Is port 8080 in use by another program?" -ErrorAction Stop - } - -if ($http.IsListening) { - Write-Output "Open the following URL in a browser to continue:" $authorizationURL - Start-Process $authorizationURL -} - -while ($http.IsListening) { - $context = $http.GetContext() - - if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.Url.LocalPath -match '/authorization-code/callback') { - # write-host "Check context" - # write-host "$($context.Request.UserHostAddress) => $($context.Request.Url)" -f 'mag' - [string]$html = ' - - - - - - - Ok. You may close this tab and return to the shell. This window closes automatically in five seconds. - - - - ' - # Respond to the request - $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) # Convert HTML to bytes - $context.Response.ContentLength64 = $buffer.Length - $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) # Stream HTML to browser - $context.Response.OutputStream.Close() # Close the response - - Start-Sleep 4 - $http.Stop() - } -} - # Step 2. Create a JWT $decJwtHeader = [ordered]@{ 'typ' = 'JWT'; @@ -177,5 +121,83 @@ try { Write-Output "Account id has been written to $accountIdFile file..." } catch { + if (($_.ErrorDetails.Message | ConvertFrom-Json | Select-Object -Expand error) -eq "consent_required") { + # Use Http Server + $http = New-Object System.Net.HttpListener + + # Hostname and port to listen on + $http.Prefixes.Add($redirectURI + "/") + + try { + # Start the Http Server + $http.Start() + + } + catch { + Write-Error "OAuth listener failed. Is port 8080 in use by another program?" -ErrorAction Stop + } + + if ($http.IsListening) { + Write-Output "Open the following URL in a browser to continue:" $authorizationURL + Start-Process $authorizationURL + } + + while ($http.IsListening) { + $context = $http.GetContext() + + if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.Url.LocalPath -match '/authorization-code/callback') { + # write-host "Check context" + # write-host "$($context.Request.UserHostAddress) => $($context.Request.Url)" -f 'mag' + [string]$html = ' + + + + + + + Ok. You may close this tab and return to the shell. This window closes automatically in five seconds. + + + + ' + # Respond to the request + $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) # Convert HTML to bytes + $context.Response.ContentLength64 = $buffer.Length + $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) # Stream HTML to browser + $context.Response.OutputStream.Close() # Close the response + + Start-Sleep 4 + $http.Stop() + } + } + + $authorizationEndpoint = "https://account-d.docusign.com/oauth/" + $tokenResponse = Invoke-WebRequest ` + -Uri "$authorizationEndpoint/token" ` + -UseBasicParsing ` + -Method "POST" ` + -Body "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$jwtToken" + $accessToken = ($tokenResponse | ConvertFrom-Json).access_token + Write-Output $accessToken > $outputFile + Write-Output "Access token has been written to $outputFile file..." + + Write-Output "Getting an account id..." + $userInfoResponse = Invoke-RestMethod ` + -Uri "$authorizationEndpoint/userinfo" ` + -UseBasicParsing ` + -Method "GET" ` + -Headers @{ "Authorization" = "Bearer $accessToken" } + $accountId = $userInfoResponse.accounts[0].account_id + Write-Output "Account id: $accountId" + Write-Output $accountId > $accountIdFile + Write-Output "Account id has been written to $accountIdFile file..." + } else { Write-Error $_ + } } \ No newline at end of file diff --git a/examples/eSignature/eg024CreatingPermissionProfiles.ps1 b/examples/eSignature/eg024CreatingPermissionProfiles.ps1 index dc973d6..910d397 100644 --- a/examples/eSignature/eg024CreatingPermissionProfiles.ps1 +++ b/examples/eSignature/eg024CreatingPermissionProfiles.ps1 @@ -31,7 +31,6 @@ $body = @" "allowedAddressBookAccess":"personalAndShared", "allowedTemplateAccess":"share", "enableRecipientViewingNotifications":"true", - "enableRecipientViewingNotifications":"true", "enableSequentialSigningInterface":"true", "receiveCompletedSelfSignedDocumentsAsEmailLinks":"false", "signingUiVersion":"v2", From a22c9246b4e5ec42b4a0e7ad88196e395afc093a Mon Sep 17 00:00:00 2001 From: raileendr Date: Mon, 14 Nov 2022 09:02:04 -0800 Subject: [PATCH 202/462] CFR part 11 --- .../eSignature/eg041EmbeddedSigningCFR.ps1 | 188 ++++++++++++++++++ launcher.ps1 | 8 +- 2 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg041EmbeddedSigningCFR.ps1 diff --git a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 new file mode 100644 index 0000000..8564039 --- /dev/null +++ b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 @@ -0,0 +1,188 @@ +$apiUri = "https://demo.docusign.net/restapi" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" + + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $configPath) -eq $false) { + $configPath = "..\config\settings.json" +} +if ((Test-Path $tokenPath) -eq $false) { + $tokenPath = "..\config\ds_access_token.txt" +} +if ((Test-Path $accountIdPath) -eq $false) { + $accountIdPath = "..\config\API_ACCOUNT_ID" +} + +# Use embedded signing + +# Get required variables from .\config\settings.json file +$variables = Get-Content $configPath -Raw | ConvertFrom-Json +$SIGNER_EMAIL = $variables.SIGNER_EMAIL +$SIGNER_NAME = $variables.SIGNER_NAME +$PHONE_NUMBER = $variables.PHONE_NUMBER + +# 1. Obtain your OAuth token +$oAuthAccessToken = Get-Content .\config\ds_access_token.txt + +# Obtain your accountId from demo.docusign.net -- the account id is shown in +# the drop down on the upper right corner of the screen by your picture or +# the default picture. +$accountID = Get-Content $accountIdPath +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$doc1Base64 = New-TemporaryFile + +$docPath = ".\demo_documents\World_Wide_Corp_lorem.pdf" + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $docPath) -eq $false) { + $docPath = "..\demo_documents\World_Wide_Corp_lorem.pdf" +} + +# Fetch doc and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $doc1Base64 +# - Obtain your workflow ID +# Step 2 start +$uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $oAuthAccessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") +Write-Output "Attempting to retrieve your account's workflow ID" + +$result = Invoke-RestMethod -uri $uri -headers $headers -method GET +$result.content +#Obtain the workflow ID from the API response +$workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "Phone Authentication"}).workflowId +# Step 2 end + +if ($null -eq $workflowId) +{ + throw "Please contact https://support.docusign.com to enable recipient phone authentication in your account." +} + +Write-Output "Sending the envelope request to DocuSign..." + +# Concatenate the different parts of the request +$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient authentication for the signer" + +$SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" +# Construct your envelope JSON body +# Step 3 start +$body = @" +{ + "documents": [{ + "documentBase64": "$(Get-Content $doc1Base64)", + "documentId": "1", + "fileExtension": "pdf", + "name": "Lorem" + }], + "emailBlurb": "Please let us know if you have any questions.", + "emailSubject": "Part 11 Example Consent Form", + "envelopeIdStamping": "true", + "recipients": { + "signers": [{ + "name": "$SIGNER_NAME", + "email": "$SIGNER_EMAIL", + "roleName": "", + "note": "", + "routingOrder": 2, + "clientUserID": 1000, + "status": "created", + "tabs": { + "signHereTabs": [{ + "documentId": "1", + "name": "SignHereTab", + "pageNumber": "1", + "recipientId": "1", + "tabLabel": "SignHereTab", + "xPosition": "200", + "yPosition": "160" + }] + }, + "templateAccessCodeRequired": null, + "deliveryMethod": "email", + "recipientId": "1", + "identityVerification":{ + "workflowId":"$workflowId", + "steps":null,"inputOptions":[ + {"name":"phone_number_list", + "valueType":"PhoneNumberList", + "phoneNumberList":[ + { + "countryCode":"$SIGNER_COUNTRY_CODE", + "number":"$SIGNER_PHONE_NUMBER" + } + ] + }] + } + }] + }, + "status": "Sent" +} +"@ +# Step 3 end +Write-Output "" + +# Step 4. Call DocuSign to create the envelope +$uri = "${apiUri}/v2.1/accounts/$APIAccountId/envelopes" +$result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST -UseBasicParsing -OutFile $response +$result.content + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId + +# Step 5. Create a recipient view definition +# The signer will directly open this link from the browser to sign. +# +# The returnUrl is normally your own web app. DocuSign will redirect +# the signer to returnUrl when the signing completes. +# For this example, we'll use http://httpbin.org/get to show the +# query parameters passed back from DocuSign + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile + +Write-Output "Requesting the url for the embedded signing..." + +$json = [ordered]@{ + 'returnUrl' = 'http://httpbin.org/get'; + 'authenticationMethod' = 'none'; + 'email' = $variables.SIGNER_EMAIL; + 'userName' = $variables.SIGNER_NAME; + 'clientUserId' = 1000 +} | ConvertTo-Json -Compress + + +# Step 6. Create the recipient view and begin the DocuSign signing +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $oAuthAccessToken"; + 'Content-Type' = "application/json"; +} ` + -Body $json ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" +$signingUrl = $(Get-Content $response | ConvertFrom-Json).url + +# ***DS.snippet.0.end +Write-Output "The embedded signing URL is $signingUrl" +Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." + +Start-Process $signingUrl + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $doc1Base64 + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 031b4bf..46aabfa 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -246,7 +246,8 @@ function startSignature { Create_Signable_HTML_document = 38; Signing_In_Person = 39; Set_Document_Visibility = 40; - Pick_An_API = 41; + Embedded_Signing_CFR = 41 + Pick_An_API = 42; } $ApiExamplesView = $null; @@ -292,6 +293,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" + Write-Output "$([int][ApiExamples]::Embedded_Signing_CFR)) Embedded_Signing_CFR" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -430,6 +432,10 @@ function startSignature { checkEmailAddresses powershell.exe .\examples\eSignature\eg040SetDocumentVisibility.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Signing_CFR) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg041EmbeddedSigningCFR.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } From 2939e2b200258137c0dad36140e545bba2de2d0d Mon Sep 17 00:00:00 2001 From: raileendr Date: Mon, 14 Nov 2022 15:12:06 -0800 Subject: [PATCH 203/462] checks if account has cfr --- launcher.ps1 | 216 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 207 insertions(+), 9 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index 46aabfa..ecb4d12 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -17,6 +17,21 @@ if (Test-Path $emailAddressFile) { # Get required environment variables from .\config\settings.json file $config = Get-Content $configFile -Raw | ConvertFrom-Json +function isCFR { + $response = New-TemporaryFile + $accessToken = Get-Content .\config\ds_access_token.txt + $accountId = Get-Content .\config\API_ACCOUNT_ID + + Invoke-RestMethod ` + -Uri "https://demo.docusign.net/restapi/v2.1/accounts/$accountId/settings" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + $env:CFR_STATUS = Select-String -Pattern '"require21CFRpt11Compliance":"true"' -Path $response +} function checkEmailAddresses { @@ -185,9 +200,15 @@ function startAuth ($apiVersion) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } } - + #add new code to get cfr value if ($listApiView -eq [listApi]::eSignature) { - startSignature + isCFR + if($null -ne $env:CFR_STATUS){ + startCFRSignature + } + else { + startSignature + } } elseif ($listApiView -eq [listApi]::Rooms) { startRooms @@ -203,6 +224,189 @@ function startAuth ($apiVersion) { } } +function startCFRSignature { + do { + # Preparing a list of eSignature examples + Enum ApiExamples { + Embedded_Signing_CFR = 1; + Signing_Via_Email = 2; + List_Envelopes = 3; + Envelope_Info = 4; + Envelope_Recipients = 5; + Envelope_Docs = 6; + Envelope_Get_Doc = 7; + Create_Template = 8; + Use_Template = 9; + Send_Binary_Docs = 10; + Embedded_Sending = 11; + Embedded_Console = 12; + Add_Doc_To_Template = 13; + Envelope_Tab_Data = 14; + Set_Tab_Values = 15; + Set_Template_Tab_Values = 16; + Envelope_Custom_Field_Data = 17; + Signing_Via_Email_With_Access_Code = 18; + Signing_Via_Email_With_Phone_Authentication = 19; + Signing_Via_Email_With_Knowledge_Based_Authentication = 20; + Signing_Via_Email_With_IDV_Authentication = 21; + Creating_Permission_Profiles = 22; + Setting_Permission_Profiles = 23; + Updating_Individual_Permission = 24; + Deleting_Permissions = 25; + Creating_A_Brand = 26; + Applying_Brand_Envelope = 27; + Applying_Brand_Template = 28; + Bulk_Sending = 29; + Scheduled_Sending = 30; + Create_Signable_HTML_document = 31; + Pick_An_API = 32; + } + + $ApiExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][ApiExamples]::Embedded_Signing_CFR)) Embedded_Signing_CFR" + Write-Output "$([int][ApiExamples]::Signing_Via_Email)) Signing_Via_Email" + Write-Output "$([int][ApiExamples]::List_Envelopes)) List_Envelopes" + Write-Output "$([int][ApiExamples]::Envelope_Info)) Envelope_Info" + Write-Output "$([int][ApiExamples]::Envelope_Recipients)) Envelope_Recipients" + Write-Output "$([int][ApiExamples]::Envelope_Docs)) Envelope_Docs" + Write-Output "$([int][ApiExamples]::Envelope_Get_Doc)) Envelope_Get_Doc" + Write-Output "$([int][ApiExamples]::Create_Template)) Create_Template" + Write-Output "$([int][ApiExamples]::Use_Template)) Use_Template" + Write-Output "$([int][ApiExamples]::Send_Binary_Docs)) Send_Binary_Docs" + Write-Output "$([int][ApiExamples]::Embedded_Sending)) Embedded_Sending" + Write-Output "$([int][ApiExamples]::Embedded_Console)) Embedded_Console" + Write-Output "$([int][ApiExamples]::Add_Doc_To_Template)) Add_Doc_To_Template" + Write-Output "$([int][ApiExamples]::Envelope_Tab_Data)) Envelope_Tab_Data" + Write-Output "$([int][ApiExamples]::Set_Tab_Values)) Set_Tab_Values" + Write-Output "$([int][ApiExamples]::Set_Template_Tab_Values)) Set_Template_Tab_Values" + Write-Output "$([int][ApiExamples]::Envelope_Custom_Field_Data)) Envelope_Custom_Field_Data" + Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Access_Code)) Signing_Via_Email_With_Access_Code" + Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Phone_Authentication)) Signing_Via_Email_With_Phone_Authentication" + Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication)) Signing_Via_Email_With_Knowledge_Based_Authentication" + Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_IDV_Authentication)) Signing_Via_Email_With_IDV_Authentication" + Write-Output "$([int][ApiExamples]::Creating_Permission_Profiles)) Creating_Permission_Profiles" + Write-Output "$([int][ApiExamples]::Setting_Permission_Profiles)) Setting_Permission_Profiles" + Write-Output "$([int][ApiExamples]::Updating_Individual_Permission)) Updating_Individual_Permission" + Write-Output "$([int][ApiExamples]::Deleting_Permissions)) Deleting_Permissions" + Write-Output "$([int][ApiExamples]::Creating_A_Brand)) Creating_A_Brand" + Write-Output "$([int][ApiExamples]::Applying_Brand_Envelope)) Applying_Brand_Envelope" + Write-Output "$([int][ApiExamples]::Applying_Brand_Template)) Applying_Brand_Template" + Write-Output "$([int][ApiExamples]::Bulk_Sending)) Bulk_Sending" + Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" + Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" + Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" + [int]$ApiExamplesView = Read-Host "Select the action" + } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); + + if ($ApiExamplesView -eq [ApiExamples]::Embedded_Signing_CFR) { + powershell.exe -Command .\examples\eSignature\eg041EmbeddedSigningCFR.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email) { + checkEmailAddresses + powershell.exe -Command .\examples\eSignature\eg002SigningViaEmail.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::List_Envelopes) { + powershell.exe -Command .\examples\eSignature\eg003ListEnvelopes.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Info) { + powershell.exe -Command .\examples\eSignature\eg004EnvelopeInfo.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Recipients) { + powershell.exe .\examples\eSignature\eg005EnvelopeRecipients.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Docs) { + powershell.exe .\examples\eSignature\eg006EnvelopeDocs.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Get_Doc) { + powershell.exe .\examples\eSignature\eg007EnvelopeGetDoc.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Create_Template) { + powershell.exe .\examples\eSignature\eg008CreateTemplate.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Use_Template) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg009UseTemplate.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Send_Binary_Docs) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg010SendBinaryDocs.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Sending) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg011EmbeddedSending.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Console) { + powershell.exe .\examples\eSignature\eg012EmbeddedConsole.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Add_Doc_To_Template) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg013AddDocToTemplate.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Tab_Data) { + powershell.exe .\examples\eSignature\eg015EnvelopeTabData.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Set_Tab_Values) { + powershell.exe .\examples\eSignature\eg016SetTabValues.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Set_Template_Tab_Values) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg017SetTemplateTabValues.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Custom_Field_Data) { + powershell.exe .\examples\eSignature\eg018EnvelopeCustomFieldData.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Access_Code) { + powershell.exe .\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Phone_Authentication) { + powershell.exe .\examples\eSignature\eg020SigningViaEmailWithPhoneAuthentication.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { + powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_IDV_Authentication) { + powershell.exe .\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Creating_Permission_Profiles) { + powershell.exe .\examples\eSignature\eg024CreatingPermissionProfiles.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Setting_Permission_Profiles) { + powershell.exe .\examples\eSignature\eg025SettingPermissionProfiles.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Updating_Individual_Permission) { + powershell.exe .\examples\eSignature\eg026UpdatingIndividualPermission.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Deleting_Permissions) { + powershell.exe .\examples\eSignature\eg027DeletingPermissions.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Creating_A_Brand) { + powershell.exe .\examples\eSignature\eg028CreatingABrand.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Applying_Brand_Envelope) { + powershell.exe .\examples\eSignature\eg029ApplyingBrandEnvelope.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Applying_Brand_Template) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg030ApplyingBrandTemplate.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Bulk_Sending) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg031BulkSending.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Scheduled_Sending) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg035ScheduledSending.ps1 + } + elseif ($ApiExamplesView -eq [ApiExamples]::Create_Signable_HTML_document) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 + } + } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) + startLauncher +} function startSignature { do { # Preparing a list of eSignature examples @@ -246,8 +450,7 @@ function startSignature { Create_Signable_HTML_document = 38; Signing_In_Person = 39; Set_Document_Visibility = 40; - Embedded_Signing_CFR = 41 - Pick_An_API = 42; + Pick_An_API = 41; } $ApiExamplesView = $null; @@ -293,7 +496,6 @@ function startSignature { Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" - Write-Output "$([int][ApiExamples]::Embedded_Signing_CFR)) Embedded_Signing_CFR" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -432,10 +634,6 @@ function startSignature { checkEmailAddresses powershell.exe .\examples\eSignature\eg040SetDocumentVisibility.ps1 } - elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Signing_CFR) { - checkEmailAddresses - powershell.exe .\examples\eSignature\eg041EmbeddedSigningCFR.ps1 - } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } From 63c41193185bf05b56fc4324bd565b64161fe0f8 Mon Sep 17 00:00:00 2001 From: raileendr Date: Mon, 14 Nov 2022 15:13:44 -0800 Subject: [PATCH 204/462] removed extra comment --- launcher.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/launcher.ps1 b/launcher.ps1 index ecb4d12..99d9103 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -200,7 +200,6 @@ function startAuth ($apiVersion) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } } - #add new code to get cfr value if ($listApiView -eq [listApi]::eSignature) { isCFR if($null -ne $env:CFR_STATUS){ From 28cc8cf96f52f0446726609e4cf223232ef72884 Mon Sep 17 00:00:00 2001 From: raileendr Date: Mon, 14 Nov 2022 15:52:39 -0800 Subject: [PATCH 205/462] changed phone auth line --- examples/eSignature/eg041EmbeddedSigningCFR.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 index 8564039..8f9e5b2 100644 --- a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 +++ b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 @@ -58,7 +58,7 @@ Write-Output "Attempting to retrieve your account's workflow ID" $result = Invoke-RestMethod -uri $uri -headers $headers -method GET $result.content #Obtain the workflow ID from the API response -$workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "Phone Authentication"}).workflowId +$workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "SMS for Access & Signatures"}).workflowId # Step 2 end if ($null -eq $workflowId) From c488158ace99643f4ac838b7790303613452011f Mon Sep 17 00:00:00 2001 From: raileendr Date: Thu, 17 Nov 2022 09:29:07 -0800 Subject: [PATCH 206/462] CFR QA Fixes --- .../eSignature/eg041EmbeddedSigningCFR.ps1 | 6 ++-- launcher.ps1 | 31 ++++++++----------- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 index 8f9e5b2..59c2536 100644 --- a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 +++ b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 @@ -69,9 +69,9 @@ if ($null -eq $workflowId) Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request -$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient authentication for the signer" +$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country phone number prefix for the Signer" -$SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" +$SIGNER_PHONE_NUMBER = Read-Host "Please enter an SMS-enabled Phone number for the Signer" # Construct your envelope JSON body # Step 3 start $body = @" @@ -102,7 +102,7 @@ $body = @" "recipientId": "1", "tabLabel": "SignHereTab", "xPosition": "200", - "yPosition": "160" + "yPosition": "150" }] }, "templateAccessCodeRequired": null, diff --git a/launcher.ps1 b/launcher.ps1 index 99d9103..38ca79f 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -245,20 +245,19 @@ function startCFRSignature { Set_Template_Tab_Values = 16; Envelope_Custom_Field_Data = 17; Signing_Via_Email_With_Access_Code = 18; - Signing_Via_Email_With_Phone_Authentication = 19; - Signing_Via_Email_With_Knowledge_Based_Authentication = 20; - Signing_Via_Email_With_IDV_Authentication = 21; - Creating_Permission_Profiles = 22; - Setting_Permission_Profiles = 23; - Updating_Individual_Permission = 24; - Deleting_Permissions = 25; - Creating_A_Brand = 26; - Applying_Brand_Envelope = 27; - Applying_Brand_Template = 28; - Bulk_Sending = 29; - Scheduled_Sending = 30; - Create_Signable_HTML_document = 31; - Pick_An_API = 32; + Signing_Via_Email_With_Knowledge_Based_Authentication = 19; + Signing_Via_Email_With_IDV_Authentication = 20; + Creating_Permission_Profiles = 21; + Setting_Permission_Profiles = 22; + Updating_Individual_Permission = 23; + Deleting_Permissions = 24; + Creating_A_Brand = 25; + Applying_Brand_Envelope = 26; + Applying_Brand_Template = 27; + Bulk_Sending = 28; + Scheduled_Sending = 29; + Create_Signable_HTML_document = 30; + Pick_An_API = 31; } $ApiExamplesView = $null; @@ -283,7 +282,6 @@ function startCFRSignature { Write-Output "$([int][ApiExamples]::Set_Template_Tab_Values)) Set_Template_Tab_Values" Write-Output "$([int][ApiExamples]::Envelope_Custom_Field_Data)) Envelope_Custom_Field_Data" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Access_Code)) Signing_Via_Email_With_Access_Code" - Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Phone_Authentication)) Signing_Via_Email_With_Phone_Authentication" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication)) Signing_Via_Email_With_Knowledge_Based_Authentication" Write-Output "$([int][ApiExamples]::Signing_Via_Email_With_IDV_Authentication)) Signing_Via_Email_With_IDV_Authentication" Write-Output "$([int][ApiExamples]::Creating_Permission_Profiles)) Creating_Permission_Profiles" @@ -360,9 +358,6 @@ function startCFRSignature { elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Access_Code) { powershell.exe .\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1 } - elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Phone_Authentication) { - powershell.exe .\examples\eSignature\eg020SigningViaEmailWithPhoneAuthentication.ps1 - } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 } From 9d8ae5ae8fe5982f56d4ac30c16c3c77e5fde5a6 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 17 Nov 2022 17:40:00 -0800 Subject: [PATCH 207/462] moved "sending the envelope request" line --- examples/eSignature/eg041EmbeddedSigningCFR.ps1 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 index 59c2536..063173f 100644 --- a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 +++ b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 @@ -66,12 +66,13 @@ if ($null -eq $workflowId) throw "Please contact https://support.docusign.com to enable recipient phone authentication in your account." } -Write-Output "Sending the envelope request to DocuSign..." - # Concatenate the different parts of the request $SIGNER_COUNTRY_CODE = Read-Host "Please enter a country phone number prefix for the Signer" $SIGNER_PHONE_NUMBER = Read-Host "Please enter an SMS-enabled Phone number for the Signer" + +Write-Output "Sending the envelope request to DocuSign..." + # Construct your envelope JSON body # Step 3 start $body = @" From fbbe8eaca7665353116638ecd0592a80c80c01c0 Mon Sep 17 00:00:00 2001 From: annahileta Date: Mon, 12 Dec 2022 13:39:18 +0200 Subject: [PATCH 208/462] added processing of target account id value --- OAuth/code_grant.ps1 | 29 +++++++++++++++++++++++++++-- OAuth/jwt.ps1 | 28 ++++++++++++++++++++++++++-- config/settings.example.json | 3 ++- launcher.ps1 | 6 +++--- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 5e25b45..1d5b64b 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -4,7 +4,10 @@ param( [Parameter(Mandatory = $true)] [string]$clientSecret, [Parameter(Mandatory = $true)] - [string]$apiVersion) + [string]$apiVersion, + [Parameter(Mandatory = $true)] + [string]$targetAccountId + ) $PORT = '8080' $IP = 'localhost' @@ -126,7 +129,29 @@ try { -Uri "$authorizationEndpoint/userinfo" ` -Method "GET" ` -Headers @{ "Authorization" = "Bearer $accessToken" } - $accountId = $userInfoResponse.accounts[0].account_id + + if ($targetAccountId -ne "TARGET_ACCOUNT_ID") { + $targetAccountFound = "false"; + foreach ($account_info in $userInfoResponse.accounts) { + if ($account_info.account_id -eq $targetAccountId) { + $accountId = $account_info.account_id; + $targetAccountFound = "true"; + break; + } + } + + if ($targetAccountFound -eq "false") { + Write-Error "Targeted Account with Id $targetAccountId not found." -ErrorAction Stop; + } + } else { + foreach ($account_info in $userInfoResponse.accounts) { + if ($account_info.is_default -eq "true") { + $accountId = $account_info.account_id; + break; + } + } + } + Write-Output "Account id: $accountId" Write-Output $accountId > $accountIdFile Write-Output "Account id has been written to $accountIdFile file..." diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 25d3afe..6ca26de 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -2,7 +2,10 @@ param( [Parameter(Mandatory = $true)] [string]$clientId, [Parameter(Mandatory = $true)] - [string]$apiVersion) + [string]$apiVersion, + [Parameter(Mandatory = $true)] + [string]$targetAccountId + ) # Reference dependencies . ([System.IO.Path]::Combine($PSScriptRoot, "..\Install-NugetPackage.ps1")) @@ -115,7 +118,28 @@ try { -UseBasicParsing ` -Method "GET" ` -Headers @{ "Authorization" = "Bearer $accessToken" } - $accountId = $userInfoResponse.accounts[0].account_id + + if ($targetAccountId -ne "TARGET_ACCOUNT_ID") { + $targetAccountFound = "false"; + foreach ($account_info in $userInfoResponse.accounts) { + if ($account_info.account_id -eq $targetAccountId) { + $accountId = $account_info.account_id; + $targetAccountFound = "true"; + break; + } + } + + if ($targetAccountFound -eq "false") { + Write-Error "Targeted Account with Id $targetAccountId not found." -ErrorAction Stop; + } + } else { + foreach ($account_info in $userInfoResponse.accounts) { + if ($account_info.is_default -eq "true") { + $accountId = $account_info.account_id; + break; + } + } + } Write-Output "Account id: $accountId" Write-Output $accountId > $accountIdFile Write-Output "Account id has been written to $accountIdFile file..." diff --git a/config/settings.example.json b/config/settings.example.json index 2415bf6..5baef34 100644 --- a/config/settings.example.json +++ b/config/settings.example.json @@ -12,5 +12,6 @@ "SECRET_KEY": "{SECRET_KEY}", "GATEWAY_ACCOUNT_ID": "{DS_PAYMENT_GATEWAY_ID}", "ORGANIZATION_ID": "{ORGANIZATION_ID}", - "ACCOUNT_ID": "{ACCOUNT_ID}" + "ACCOUNT_ID": "{ACCOUNT_ID}", + "TARGET_ACCOUNT_ID": "{TARGET_ACCOUNT_ID}" } diff --git a/launcher.ps1 b/launcher.ps1 index 38ca79f..e34efa0 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -112,7 +112,7 @@ function startLauncher { Write-Output '' Write-Output "Quickstart Enabled, please wait" write-Output '' - powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) if ((Test-Path "./config/ds_access_token.txt") -eq $true) { @@ -189,13 +189,13 @@ function startAuth ($apiVersion) { startLauncher } elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { - powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID) if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } } elseif ($AuthTypeView -eq [AuthType]::JWT) { - powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) + powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID) if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } From eae4072c9129d46513ae9cbb58cb4ebd8d56fe05 Mon Sep 17 00:00:00 2001 From: annahileta Date: Mon, 12 Dec 2022 16:07:04 +0200 Subject: [PATCH 209/462] fixed the target account id feature in Quick ACG --- Quick_ACG/launcherACG.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 index 9b1a72b..e859a57 100644 --- a/Quick_ACG/launcherACG.ps1 +++ b/Quick_ACG/launcherACG.ps1 @@ -15,7 +15,7 @@ function startQuickACG { Write-Output '' Write-Output "Authentication in progress, please wait" Write-Output '' - powershell.exe -Command ..\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") + powershell.exe -Command ..\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) Write-Output '' if ((Test-Path "../config/ds_access_token.txt") -eq $true) { From ba5e2826560ab5438072cbfa58f5d2dac3eaaa5f Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Tue, 27 Dec 2022 11:48:50 -0800 Subject: [PATCH 210/462] separated headers from api call --- examples/eSignature/eg016SetTabValues.ps1 | 11 +++++++---- examples/eSignature/eg018EnvelopeCustomFieldData.ps1 | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/examples/eSignature/eg016SetTabValues.ps1 b/examples/eSignature/eg016SetTabValues.ps1 index 9cdf58b..30f24ad 100644 --- a/examples/eSignature/eg016SetTabValues.ps1 +++ b/examples/eSignature/eg016SetTabValues.ps1 @@ -13,6 +13,12 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountId = Get-Content .\config\API_ACCOUNT_ID +# Step 2. Create your authorization headers +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} + # Tabs and custom fields shown in the request body in step 4 # Step 4. Construct the request body @@ -146,10 +152,7 @@ Write-Output "Requesting the url for the embedded signing..." Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` -Method 'POST' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; -} ` + -Headers $headers ` -InFile (Resolve-Path $requestData).Path` -OutFile $response diff --git a/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 b/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 index c5ae849..d8d0afb 100644 --- a/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 +++ b/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 @@ -27,14 +27,17 @@ else { Write-Output "Sending the EnvelopeCustomFields::list request to DocuSign..." +# Step 2. Create your authorization headers +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} + # Step 3. Call the eSignature REST API Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/custom_fields" ` -Method 'GET' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; -} ` + -Headers $headers ` -OutFile $response Write-Output "Results:" From 185651cb61d416460b74a8d6bed158547b77340e Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Tue, 27 Dec 2022 12:06:59 -0800 Subject: [PATCH 211/462] fixed salary --- examples/eSignature/eg016SetTabValues.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg016SetTabValues.ps1 b/examples/eSignature/eg016SetTabValues.ps1 index 30f24ad..4639081 100644 --- a/examples/eSignature/eg016SetTabValues.ps1 +++ b/examples/eSignature/eg016SetTabValues.ps1 @@ -102,7 +102,7 @@ Write-Output "Sending the envelope request to DocuSign..." locked = "true"; tabId = "salary"; tabLabel = "Salary"; - value = "$123,000.00"; + value = '$123,000.00'; }; ); }; }; ); From 5762703df7d30a0e5b863eaebd505c5bd56d0e34 Mon Sep 17 00:00:00 2001 From: Matt Lusher Date: Thu, 12 Jan 2023 15:57:12 -0500 Subject: [PATCH 212/462] Fixing typo in filename --- ...1 => eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/eSignature/{eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 => eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1} (100%) diff --git a/examples/eSignature/eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 b/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 similarity index 100% rename from examples/eSignature/eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 rename to examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 From bff46764c5eaa13219351ad0692d1e9653ae006f Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 12 Jan 2023 13:47:06 -0800 Subject: [PATCH 213/462] Changing the reference to the renamed file --- launcher.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index 38ca79f..839f20a 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -359,7 +359,7 @@ function startCFRSignature { powershell.exe .\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { - powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 + powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_IDV_Authentication) { powershell.exe .\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -562,7 +562,7 @@ function startSignature { powershell.exe .\examples\eSignature\eg020SigningViaEmailWithPhoneAuthentication.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { - powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 + powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_IDV_Authentication) { powershell.exe .\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1 From 1d7c323e772b3d5e1c1b7fa77982a8cf9cd4221c Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 12 Jan 2023 14:02:48 -0800 Subject: [PATCH 214/462] Fixing typo in file name --- ... eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1} | 0 launcher.ps1 | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename examples/eSignature/{eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 => eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1} (100%) diff --git a/examples/eSignature/eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 b/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 similarity index 100% rename from examples/eSignature/eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 rename to examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 diff --git a/launcher.ps1 b/launcher.ps1 index 38ca79f..839f20a 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -359,7 +359,7 @@ function startCFRSignature { powershell.exe .\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { - powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 + powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_IDV_Authentication) { powershell.exe .\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -562,7 +562,7 @@ function startSignature { powershell.exe .\examples\eSignature\eg020SigningViaEmailWithPhoneAuthentication.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { - powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnoweldgeBasedAuthentication.ps1 + powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_IDV_Authentication) { powershell.exe .\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1 From e28f7c754b322732a7845c548e2d9b6861139407 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 22 Feb 2023 12:03:33 -0800 Subject: [PATCH 215/462] Finish wok on DEVDOCS-9561 --- examples/eSignature/eg016SetTabValues.ps1 | 39 ++++++++++++++--------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/examples/eSignature/eg016SetTabValues.ps1 b/examples/eSignature/eg016SetTabValues.ps1 index 4639081..d92b509 100644 --- a/examples/eSignature/eg016SetTabValues.ps1 +++ b/examples/eSignature/eg016SetTabValues.ps1 @@ -1,4 +1,4 @@ -$apiUri = "https://demo.docusign.net/restapi" +$apiUri = "https://stage.docusign.net/restapi" # Set Envelope Tab Data @@ -67,7 +67,28 @@ Write-Output "Sending the envelope request to DocuSign..." anchorXOffset = "20"; anchorYOffset = "10"; }; ); - textTabs = @(@{ + numericalTabs = @(@{ + ValidationType = "Currency"; + XPosition = "210"; + YPosition = "235"; + Height = "20"; + Width = "70"; + PageNumber = "1"; + DocumentId = "1"; + MinNumericalValue = "0"; + MaxNumericalValue = "1000000"; + TabId = "salary"; + TabLabel = "Salary"; + NumericalValue = "123000"; + LocalPolicy = @{ + CultureName = "en-US"; + CurrencyCode = "usd"; + CurrencyPositiveFormat = "csym_1_comma_234_comma_567_period_89"; + CurrencyNegativeFormat = "minus_csym_1_comma_234_comma_567_period_89"; + UseLongCurrencyFormat = "true"; + }; + }; ); + textTabs = @(@{ anchorString = "/legal/"; anchorUnits = "pixels"; anchorXOffset = "5"; @@ -91,19 +112,7 @@ Write-Output "Sending the envelope request to DocuSign..." tabId = "familiar_name"; tabLabel = "Familiar name"; value = $variables.SIGNER_NAME; - }; @{ - anchorString = "/salary/"; - anchorUnits = "pixels"; - anchorXOffset = "5"; - anchorYOffset = "-9"; - bold = "true"; - font = "helvetica"; - fontSize = "size11"; - locked = "true"; - tabId = "salary"; - tabLabel = "Salary"; - value = '$123,000.00'; - }; ); + };); }; }; ); }; From 0e52aeff18417e961e3c51356b3b97c9e953a708 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 22 Feb 2023 12:18:40 -0800 Subject: [PATCH 216/462] Adding code for DEVDOCS-9572 --- examples/eSignature/eg008CreateTemplate.ps1 | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 414b081..f064630 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -1,4 +1,4 @@ -$apiUri = "https://demo.docusign.net/restapi" +$apiUri = "https://stage.docusign.net/restapi" # Create a template. First, the account's templates are listed. # If one of the templates is named "Example Signer and CC template" @@ -16,7 +16,7 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # List the account's templates Write-Output "Checking to see if the template already exists in your account..." -$templateName = "Example Signer and CC template" +$templateName = "Example Signer and CC template v2" $response = New-TemporaryFile Invoke-RestMethod ` @@ -159,12 +159,15 @@ Write-Output "Sending the template create request to DocuSign..." tabLabel = "text"; width = 84; xPosition = "153"; yPosition = "230"; }; + ); + numericalTabs = @( @{ + ValidationType = "Currency"; documentId = "1"; font = "helvetica"; fontSize = "size14"; height = 23; pageNumber = "1"; required = "false"; - tabLabel = "numbersOnly"; width = 84; - xPosition = "153"; yPosition = "260"; + tabLabel = "numericalCurrency"; width = 84; + xPosition = "153"; yPosition = "230"; }; ); }; From 6d3c8fc480129a4b6b3ee90a157d425ffd44167d Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Sun, 26 Feb 2023 21:25:41 -0800 Subject: [PATCH 217/462] rooms 6 update and fix for example 4 --- .../Rooms/eg004AddFormsToRoomController.ps1 | 4 +-- ...ateAnExternalFormFillSessionController.ps1 | 29 +++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/examples/Rooms/eg004AddFormsToRoomController.ps1 b/examples/Rooms/eg004AddFormsToRoomController.ps1 index 96cc221..bb0c3db 100644 --- a/examples/Rooms/eg004AddFormsToRoomController.ps1 +++ b/examples/Rooms/eg004AddFormsToRoomController.ps1 @@ -16,11 +16,11 @@ $roomId = $($response.Content | ConvertFrom-Json).rooms[0].roomId # Get Form Library ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/form_libraries" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -$formLibraryId = $($response.Content | ConvertFrom-Json).formsLibrarySummaries.formsLibraryId +$formLibraryId = $($response.Content | ConvertFrom-Json).formsLibrarySummaries[0].formsLibraryId # Get Form ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/form_libraries/$formLibraryId/forms" -$response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers +$response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $formId = $($response.Content | ConvertFrom-Json).forms[0].libraryFormId # Construct the request body for adding a form diff --git a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 index 96bcf22..763134f 100644 --- a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 +++ b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 @@ -16,19 +16,21 @@ $roomId = $($response.Content | ConvertFrom-Json).rooms[0].roomId # Get Form Library ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/form_libraries" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -$formLibraryId = $($response.Content | ConvertFrom-Json).formsLibrarySummaries.formsLibraryId +$formLibraryId = $($response.Content | ConvertFrom-Json).formsLibrarySummaries[0].formsLibraryId # Get Form ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/form_libraries/$formLibraryId/forms" -$response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers +$response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $formId = $($response.Content | ConvertFrom-Json).forms[0].libraryFormId + # Construct your request body $body = @" { - "roomId": $roomId, - "formId": "$formId" + "roomId": "$roomId", + "formId": "$formId", + "xFrameAllowedUrl": "https://iframetester.com/" } "@ @@ -40,6 +42,15 @@ try { Write-Output "Response:" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST $response.Content | ConvertFrom-Json | ConvertTo-Json + + $signingUrl = $($response.Content | ConvertFrom-Json).url + $redirectUrl = "https://iframetester.com/?url="+$signingUrl + + Write-Output "The embedded form URL is $redirectUrl" + Write-Output "Attempting to automatically open your browser..." + + Start-Process $redirectUrl + } catch { Write-Output "Unable to access form fill view link " @@ -49,6 +60,14 @@ catch { if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } $int++ } - Write-Output "Error : "$_.ErrorDetails.Message + + $errorMessage = $_.ErrorDetails.Message + + if ( $errorMessage.Contains("INVALID_REQUEST_PARAMETERS") ) { Write-Output "Room ID is needed. Please run step 1 or 2..." } + + if ( $errorMessage.Contains("PROPERTY_VALIDATION_FAILURE")) { Write-Output "Problem: Form is not in the room. Please run example 4...." } + + Write-Output "Error : "$errorMessage Write-Output "Command : "$_.InvocationInfo.Line + } \ No newline at end of file From 53a93da6e708133595a1045d3f11ccf581c380ee Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Thu, 2 Mar 2023 12:42:15 -0800 Subject: [PATCH 218/462] error handling fix --- .../Rooms/eg006CreateAnExternalFormFillSessionController.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 index 763134f..1ef91ef 100644 --- a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 +++ b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 @@ -63,7 +63,7 @@ catch { $errorMessage = $_.ErrorDetails.Message - if ( $errorMessage.Contains("INVALID_REQUEST_PARAMETERS") ) { Write-Output "Room ID is needed. Please run step 1 or 2..." } + if ( $errorMessage.Contains("ACCESS_DENIED") ) { Write-Output "Room ID is needed. Please run step 1 or 2..." } if ( $errorMessage.Contains("PROPERTY_VALIDATION_FAILURE")) { Write-Output "Problem: Form is not in the room. Please run example 4...." } From cb61555ea2fa96672098b130c13fdb8b8ebeedab Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Fri, 3 Mar 2023 13:33:45 -0800 Subject: [PATCH 219/462] added another error code --- .../Rooms/eg006CreateAnExternalFormFillSessionController.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 index 1ef91ef..4a1e239 100644 --- a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 +++ b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 @@ -63,9 +63,9 @@ catch { $errorMessage = $_.ErrorDetails.Message - if ( $errorMessage.Contains("ACCESS_DENIED") ) { Write-Output "Room ID is needed. Please run step 1 or 2..." } + if ( $errorMessage.Contains("INVALID_REQUEST_PARAMETERS") ) { Write-Output "Room ID is needed. Please run step 1 or 2..." } - if ( $errorMessage.Contains("PROPERTY_VALIDATION_FAILURE")) { Write-Output "Problem: Form is not in the room. Please run example 4...." } + if ( $errorMessage.Contains("PROPERTY_VALIDATION_FAILURE") -or $errorMessage.Contains("FORM_NOT_IN_ROOM")) { Write-Output "Problem: Form is not in the room. Please run example 4...." } Write-Output "Error : "$errorMessage Write-Output "Command : "$_.InvocationInfo.Line From 14220b008d37c1ba982f10d9578002a33841867b Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Fri, 3 Mar 2023 15:10:17 -0800 Subject: [PATCH 220/462] rooms 1 and 2 fix --- examples/Rooms/eg001CreateRoomWithDataController.ps1 | 3 ++- examples/Rooms/eg002CreateRoomWithTemplateController.ps1 | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/Rooms/eg001CreateRoomWithDataController.ps1 b/examples/Rooms/eg001CreateRoomWithDataController.ps1 index a5d6046..19f7a75 100644 --- a/examples/Rooms/eg001CreateRoomWithDataController.ps1 +++ b/examples/Rooms/eg001CreateRoomWithDataController.ps1 @@ -11,7 +11,8 @@ $headers.add("Content-Type", "application/json") # Get Role ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/roles" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET -$roleId = $($response.Content | ConvertFrom-Json).roles[0].roleid +$roles = $($response.Content | ConvertFrom-Json).roles +$roleId = $roles.Where({$_.name -eq "Default Admin"}).roleId # - Construct the request body for your room $body = @" diff --git a/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 b/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 index 93ac09a..71d04b3 100644 --- a/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 +++ b/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 @@ -17,7 +17,8 @@ $uriOfficeId = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountI try { $response = Invoke-RestMethod -uri $uri -headers $headers -method GET - $roleId = $response.roles[0].roleId + $roles = $response.roles + $roleId = $roles.Where({$_.name -eq "Default Admin"}).roleId $roomTemplateId = $response.roomTemplates.roomTemplateId Write-Output "roleID:" $roleId $response = Invoke-RestMethod -uri $uriOfficeId -headers $headers -method GET From 7a494a43d67e0ac29b8d3c022ed1bad64aa3e72a Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:23:21 -0800 Subject: [PATCH 221/462] updated error handling text --- .../eg006CreateAnExternalFormFillSessionController.ps1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 index 4a1e239..0e85ee7 100644 --- a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 +++ b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 @@ -63,11 +63,11 @@ catch { $errorMessage = $_.ErrorDetails.Message - if ( $errorMessage.Contains("INVALID_REQUEST_PARAMETERS") ) { Write-Output "Room ID is needed. Please run step 1 or 2..." } + if ( $errorMessage.Contains("INVALID_REQUEST_PARAMETERS") ) { Write-Output "Problem: Create a room using example 1." } - if ( $errorMessage.Contains("PROPERTY_VALIDATION_FAILURE") -or $errorMessage.Contains("FORM_NOT_IN_ROOM")) { Write-Output "Problem: Form is not in the room. Please run example 4...." } + if ( $errorMessage.Contains("PROPERTY_VALIDATION_FAILURE") -or $errorMessage.Contains("FORM_NOT_IN_ROOM")) { Write-Output "Problem: Selected room does not have any forms. Add a form to a room using example 4." } Write-Output "Error : "$errorMessage Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} From dd7c834b745ec5dd819f2221a267579b777fb801 Mon Sep 17 00:00:00 2001 From: annahileta Date: Tue, 7 Mar 2023 10:12:49 +0200 Subject: [PATCH 222/462] added selects for forms and form groups --- examples/Rooms/eg009AssignFormGroup.ps1 | 73 +++++++++++++++++++------ 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index 7a8be90..f230c1a 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -21,8 +21,7 @@ try { # Retrieve a form library ID $obj = $response.Content | ConvertFrom-Json $formsLibraryID = $obj.formsLibrarySummaries[0].formsLibraryId -} -catch { +} catch { Write-Output "Unable to retrieve form library" # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error @@ -38,14 +37,29 @@ catch { $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_libraries/$formsLibraryID/forms" try { + Write-Output "" Write-Output "Response:" $response = Invoke-WebRequest -uri $uri -headers $headers -method GET - # Retrieve the the first form ID provided $response.Content - $obj = $response | ConvertFrom-Json - $formID = $obj.forms[0].libraryFormId -} -catch { + + $formsObj = $($response.Content | ConvertFrom-Json).forms + + Write-Output "" + $menu = @{} + for ($i=1;$i -le $formsObj.count; $i++) { + Write-Output "$i. $($formsObj[$i-1].name)" + $menu.Add($i,($formsObj[$i-1].libraryFormId)) + } + + do { + Write-Output "" + [int]$selection = Read-Host 'Select a form by the form name: ' + } while ($selection -gt $formsObj.count -or $selection -lt 1); + $formID = $menu.Item($selection) + + Write-Output "" + Write-Output "Form Id: $formID" +} catch { Write-Output "Unable to retrieve a form id" # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error @@ -59,14 +73,40 @@ catch { # Step 3 End # Step 4 Start -# Get form group ID from the .\config\FORM_GROUP_ID file -if (Test-Path .\config\FORM_GROUP_ID) { - $formGroupID = Get-Content .\config\FORM_GROUP_ID - } - else { - Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." - exit 1 - } +$formGroupID = "" + +# Call the Rooms API to look up a list of form group IDs +$uri = "${base_path}/restapi/v2/accounts/$APIAccountId/form_groups" +$result = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + +Write-Output "" +Write-Output "Response:" +$result.Content + +$formGroupObj = $($result.Content | ConvertFrom-Json).formGroups +Write-Output "" + +# Setup a temporary menu option to pick a form group +$menu = @{} +for ($i=1;$i -le $formGroupObj.count; $i++) { + Write-Output "$i. $($formGroupObj[$i-1].name)" + $menu.Add($i,($formGroupObj[$i-1].formGroupId)) +} + +if ($formGroupObj.count -lt 1) { + Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." + exit 1 +} + +do { + Write-Output "" + [int]$selection = Read-Host 'Select a form group: ' +} while ($selection -gt $formGroupObj.count -or $selection -lt 1); +$formGroupID = $menu.Item($selection) + +Write-Output "" +Write-Output "Form group Id: $formGroupID" +Write-Output "" # Step 4 End # Step 5 Start @@ -85,8 +125,7 @@ try { $response = Invoke-WebRequest -uri $uri -headers $headers -method POST -Body $body Write-Output $response.Status Write-Output "Response: No JSON response body returned when setting the default office ID in a form group" -} -catch { +} catch { Write-Output "Unable to assign the form to the form group" # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error From df62ccf549952ad0ce61017db17b83d66a605eab Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 7 Mar 2023 13:08:49 -0800 Subject: [PATCH 223/462] Updating back to demo --- examples/eSignature/eg008CreateTemplate.ps1 | 2 +- examples/eSignature/eg016SetTabValues.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index f064630..bf50fdc 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -1,4 +1,4 @@ -$apiUri = "https://stage.docusign.net/restapi" +$apiUri = "https://demo.docusign.net/restapi" # Create a template. First, the account's templates are listed. # If one of the templates is named "Example Signer and CC template" diff --git a/examples/eSignature/eg016SetTabValues.ps1 b/examples/eSignature/eg016SetTabValues.ps1 index d92b509..2f177d5 100644 --- a/examples/eSignature/eg016SetTabValues.ps1 +++ b/examples/eSignature/eg016SetTabValues.ps1 @@ -1,4 +1,4 @@ -$apiUri = "https://stage.docusign.net/restapi" +$apiUri = "https://demo.docusign.net/restapi" # Set Envelope Tab Data From 7047bc691a0b3db4189abcf2f9fc322ce2ace8ca Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 8 Mar 2023 10:30:10 -0800 Subject: [PATCH 224/462] Updating template to v2 --- examples/eSignature/eg008CreateTemplate.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 414b081..54773e1 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -16,7 +16,7 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # List the account's templates Write-Output "Checking to see if the template already exists in your account..." -$templateName = "Example Signer and CC template" +$templateName = "Example Signer and CC template v2" $response = New-TemporaryFile Invoke-RestMethod ` @@ -64,7 +64,7 @@ Write-Output "Sending the template create request to DocuSign..." # Concatenate the different parts of the request @{ description = "Example template created via the eSignature API"; - name = "Example Signer and CC template"; + name = "Example Signer and CC template v2"; shared = "false"; documents = @( @{ From cf4e1a829fefa5e7c8b5950ae727747f59e76d96 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 8 Mar 2023 11:18:10 -0800 Subject: [PATCH 225/462] Updating template name to v2 --- examples/eSignature/eg008CreateTemplate.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 414b081..54773e1 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -16,7 +16,7 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # List the account's templates Write-Output "Checking to see if the template already exists in your account..." -$templateName = "Example Signer and CC template" +$templateName = "Example Signer and CC template v2" $response = New-TemporaryFile Invoke-RestMethod ` @@ -64,7 +64,7 @@ Write-Output "Sending the template create request to DocuSign..." # Concatenate the different parts of the request @{ description = "Example template created via the eSignature API"; - name = "Example Signer and CC template"; + name = "Example Signer and CC template v2"; shared = "false"; documents = @( @{ From 17bf15d2412bd10e50bebe4c7cfe5f66dba230d0 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 10 Mar 2023 10:39:58 -0800 Subject: [PATCH 226/462] Updates to support users with multiple accounts, updates and fixes to Rooms API as well as new Numerical tabs --- OAuth/code_grant.ps1 | 29 +++++++- OAuth/jwt.ps1 | 28 +++++++- Quick_ACG/launcherACG.ps1 | 2 +- config/settings.example.json | 3 +- examples/Rooms/eg009AssignFormGroup.ps1 | 73 ++++++++++++++++----- examples/eSignature/eg008CreateTemplate.ps1 | 7 +- examples/eSignature/eg016SetTabValues.ps1 | 37 +++++++---- launcher.ps1 | 6 +- 8 files changed, 143 insertions(+), 42 deletions(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 5e25b45..1d5b64b 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -4,7 +4,10 @@ param( [Parameter(Mandatory = $true)] [string]$clientSecret, [Parameter(Mandatory = $true)] - [string]$apiVersion) + [string]$apiVersion, + [Parameter(Mandatory = $true)] + [string]$targetAccountId + ) $PORT = '8080' $IP = 'localhost' @@ -126,7 +129,29 @@ try { -Uri "$authorizationEndpoint/userinfo" ` -Method "GET" ` -Headers @{ "Authorization" = "Bearer $accessToken" } - $accountId = $userInfoResponse.accounts[0].account_id + + if ($targetAccountId -ne "TARGET_ACCOUNT_ID") { + $targetAccountFound = "false"; + foreach ($account_info in $userInfoResponse.accounts) { + if ($account_info.account_id -eq $targetAccountId) { + $accountId = $account_info.account_id; + $targetAccountFound = "true"; + break; + } + } + + if ($targetAccountFound -eq "false") { + Write-Error "Targeted Account with Id $targetAccountId not found." -ErrorAction Stop; + } + } else { + foreach ($account_info in $userInfoResponse.accounts) { + if ($account_info.is_default -eq "true") { + $accountId = $account_info.account_id; + break; + } + } + } + Write-Output "Account id: $accountId" Write-Output $accountId > $accountIdFile Write-Output "Account id has been written to $accountIdFile file..." diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 25d3afe..6ca26de 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -2,7 +2,10 @@ param( [Parameter(Mandatory = $true)] [string]$clientId, [Parameter(Mandatory = $true)] - [string]$apiVersion) + [string]$apiVersion, + [Parameter(Mandatory = $true)] + [string]$targetAccountId + ) # Reference dependencies . ([System.IO.Path]::Combine($PSScriptRoot, "..\Install-NugetPackage.ps1")) @@ -115,7 +118,28 @@ try { -UseBasicParsing ` -Method "GET" ` -Headers @{ "Authorization" = "Bearer $accessToken" } - $accountId = $userInfoResponse.accounts[0].account_id + + if ($targetAccountId -ne "TARGET_ACCOUNT_ID") { + $targetAccountFound = "false"; + foreach ($account_info in $userInfoResponse.accounts) { + if ($account_info.account_id -eq $targetAccountId) { + $accountId = $account_info.account_id; + $targetAccountFound = "true"; + break; + } + } + + if ($targetAccountFound -eq "false") { + Write-Error "Targeted Account with Id $targetAccountId not found." -ErrorAction Stop; + } + } else { + foreach ($account_info in $userInfoResponse.accounts) { + if ($account_info.is_default -eq "true") { + $accountId = $account_info.account_id; + break; + } + } + } Write-Output "Account id: $accountId" Write-Output $accountId > $accountIdFile Write-Output "Account id has been written to $accountIdFile file..." diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 index 9b1a72b..e859a57 100644 --- a/Quick_ACG/launcherACG.ps1 +++ b/Quick_ACG/launcherACG.ps1 @@ -15,7 +15,7 @@ function startQuickACG { Write-Output '' Write-Output "Authentication in progress, please wait" Write-Output '' - powershell.exe -Command ..\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") + powershell.exe -Command ..\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) Write-Output '' if ((Test-Path "../config/ds_access_token.txt") -eq $true) { diff --git a/config/settings.example.json b/config/settings.example.json index 2415bf6..5baef34 100644 --- a/config/settings.example.json +++ b/config/settings.example.json @@ -12,5 +12,6 @@ "SECRET_KEY": "{SECRET_KEY}", "GATEWAY_ACCOUNT_ID": "{DS_PAYMENT_GATEWAY_ID}", "ORGANIZATION_ID": "{ORGANIZATION_ID}", - "ACCOUNT_ID": "{ACCOUNT_ID}" + "ACCOUNT_ID": "{ACCOUNT_ID}", + "TARGET_ACCOUNT_ID": "{TARGET_ACCOUNT_ID}" } diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index 7a8be90..f230c1a 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -21,8 +21,7 @@ try { # Retrieve a form library ID $obj = $response.Content | ConvertFrom-Json $formsLibraryID = $obj.formsLibrarySummaries[0].formsLibraryId -} -catch { +} catch { Write-Output "Unable to retrieve form library" # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error @@ -38,14 +37,29 @@ catch { $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_libraries/$formsLibraryID/forms" try { + Write-Output "" Write-Output "Response:" $response = Invoke-WebRequest -uri $uri -headers $headers -method GET - # Retrieve the the first form ID provided $response.Content - $obj = $response | ConvertFrom-Json - $formID = $obj.forms[0].libraryFormId -} -catch { + + $formsObj = $($response.Content | ConvertFrom-Json).forms + + Write-Output "" + $menu = @{} + for ($i=1;$i -le $formsObj.count; $i++) { + Write-Output "$i. $($formsObj[$i-1].name)" + $menu.Add($i,($formsObj[$i-1].libraryFormId)) + } + + do { + Write-Output "" + [int]$selection = Read-Host 'Select a form by the form name: ' + } while ($selection -gt $formsObj.count -or $selection -lt 1); + $formID = $menu.Item($selection) + + Write-Output "" + Write-Output "Form Id: $formID" +} catch { Write-Output "Unable to retrieve a form id" # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error @@ -59,14 +73,40 @@ catch { # Step 3 End # Step 4 Start -# Get form group ID from the .\config\FORM_GROUP_ID file -if (Test-Path .\config\FORM_GROUP_ID) { - $formGroupID = Get-Content .\config\FORM_GROUP_ID - } - else { - Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." - exit 1 - } +$formGroupID = "" + +# Call the Rooms API to look up a list of form group IDs +$uri = "${base_path}/restapi/v2/accounts/$APIAccountId/form_groups" +$result = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + +Write-Output "" +Write-Output "Response:" +$result.Content + +$formGroupObj = $($result.Content | ConvertFrom-Json).formGroups +Write-Output "" + +# Setup a temporary menu option to pick a form group +$menu = @{} +for ($i=1;$i -le $formGroupObj.count; $i++) { + Write-Output "$i. $($formGroupObj[$i-1].name)" + $menu.Add($i,($formGroupObj[$i-1].formGroupId)) +} + +if ($formGroupObj.count -lt 1) { + Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." + exit 1 +} + +do { + Write-Output "" + [int]$selection = Read-Host 'Select a form group: ' +} while ($selection -gt $formGroupObj.count -or $selection -lt 1); +$formGroupID = $menu.Item($selection) + +Write-Output "" +Write-Output "Form group Id: $formGroupID" +Write-Output "" # Step 4 End # Step 5 Start @@ -85,8 +125,7 @@ try { $response = Invoke-WebRequest -uri $uri -headers $headers -method POST -Body $body Write-Output $response.Status Write-Output "Response: No JSON response body returned when setting the default office ID in a form group" -} -catch { +} catch { Write-Output "Unable to assign the form to the form group" # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 54773e1..9ec984f 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -159,12 +159,15 @@ Write-Output "Sending the template create request to DocuSign..." tabLabel = "text"; width = 84; xPosition = "153"; yPosition = "230"; }; + ); + numericalTabs = @( @{ + ValidationType = "Currency"; documentId = "1"; font = "helvetica"; fontSize = "size14"; height = 23; pageNumber = "1"; required = "false"; - tabLabel = "numbersOnly"; width = 84; - xPosition = "153"; yPosition = "260"; + tabLabel = "numericalCurrency"; width = 84; + xPosition = "153"; yPosition = "230"; }; ); }; diff --git a/examples/eSignature/eg016SetTabValues.ps1 b/examples/eSignature/eg016SetTabValues.ps1 index 4639081..2f177d5 100644 --- a/examples/eSignature/eg016SetTabValues.ps1 +++ b/examples/eSignature/eg016SetTabValues.ps1 @@ -67,7 +67,28 @@ Write-Output "Sending the envelope request to DocuSign..." anchorXOffset = "20"; anchorYOffset = "10"; }; ); - textTabs = @(@{ + numericalTabs = @(@{ + ValidationType = "Currency"; + XPosition = "210"; + YPosition = "235"; + Height = "20"; + Width = "70"; + PageNumber = "1"; + DocumentId = "1"; + MinNumericalValue = "0"; + MaxNumericalValue = "1000000"; + TabId = "salary"; + TabLabel = "Salary"; + NumericalValue = "123000"; + LocalPolicy = @{ + CultureName = "en-US"; + CurrencyCode = "usd"; + CurrencyPositiveFormat = "csym_1_comma_234_comma_567_period_89"; + CurrencyNegativeFormat = "minus_csym_1_comma_234_comma_567_period_89"; + UseLongCurrencyFormat = "true"; + }; + }; ); + textTabs = @(@{ anchorString = "/legal/"; anchorUnits = "pixels"; anchorXOffset = "5"; @@ -91,19 +112,7 @@ Write-Output "Sending the envelope request to DocuSign..." tabId = "familiar_name"; tabLabel = "Familiar name"; value = $variables.SIGNER_NAME; - }; @{ - anchorString = "/salary/"; - anchorUnits = "pixels"; - anchorXOffset = "5"; - anchorYOffset = "-9"; - bold = "true"; - font = "helvetica"; - fontSize = "size11"; - locked = "true"; - tabId = "salary"; - tabLabel = "Salary"; - value = '$123,000.00'; - }; ); + };); }; }; ); }; diff --git a/launcher.ps1 b/launcher.ps1 index 839f20a..de6a426 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -112,7 +112,7 @@ function startLauncher { Write-Output '' Write-Output "Quickstart Enabled, please wait" write-Output '' - powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) if ((Test-Path "./config/ds_access_token.txt") -eq $true) { @@ -189,13 +189,13 @@ function startAuth ($apiVersion) { startLauncher } elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { - powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID) if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } } elseif ($AuthTypeView -eq [AuthType]::JWT) { - powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) + powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID) if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } From 2c9962b341ab4743514027e7a7137aa32cf58bec Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 21 Apr 2023 16:45:49 +0000 Subject: [PATCH 227/462] DEVDOCS-9924 (#62) * DocGen code example --- demo_documents/Offer_Letter_Demo.docx | Bin 0 -> 37132 bytes .../eSignature/eg042DocumentGeneration.ps1 | 269 ++++++++++++++++++ launcher.ps1 | 8 +- 3 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 demo_documents/Offer_Letter_Demo.docx create mode 100644 examples/eSignature/eg042DocumentGeneration.ps1 diff --git a/demo_documents/Offer_Letter_Demo.docx b/demo_documents/Offer_Letter_Demo.docx new file mode 100644 index 0000000000000000000000000000000000000000..a8d6d59fe73b6a2d94788c3e701573ddaa5cd3a3 GIT binary patch literal 37132 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 $doc1Base64 + +# Concatenate the different parts of the request +@{ + description = "Example template created via the API"; + name = "${templateName}"; + shared = "false"; + documents = @( + @{ + documentBase64 = "$(Get-Content $doc1Base64)"; + documentId = "1"; + fileExtension = "docx"; + order = "1"; + pages = "1"; + name = "Offer Letter Demo"; + isDocGenDocument = "true"; + + }; + ); + emailSubject = "Please sign this document"; + recipients = @{ + signers = @( + @{ + recipientId = "1"; + roleName = "signer"; + routingOrder = "1"; + }; + ); + }; + status = "created"; + } | ConvertTo-Json -Depth 32 > $requestData + +Write-Output "${apiUri}/v2.1/accounts/${accountId}/templates" + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/templates" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +# pull out the template id +$templateId = $(Get-Content $response | ConvertFrom-Json).templateId + +Write-Output "Template '${templateName}' was created! Template ID ${templateId}." + +# Step 3. Add a document with merge fields to your template +@{ + documents = @( + @{ + documentBase64 = "$(Get-Content $doc1Base64)"; + documentId = "1"; + fileExtension = "docx"; + order = "1"; + pages = "1"; + name = "Offer Letter Demo"; + + }; + ); +} | ConvertTo-Json -Depth 32 > $requestData + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/templates/${templateId}/documents/1" ` + -Method 'PUT' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +# Step 4. Add tabs to the template +@{ + signHereTabs = @( + @{ + anchorString = "Employee Signature"; + anchorUnits = "pixels"; + anchorXOffset = "5"; + anchorYOffset = "-22"; + }; + ); + dateSignedTabs = @( + @{ + anchorString = "Date"; + anchorUnits = "pixels"; + anchorYOffset = "-22"; + }; + ); +} | ConvertTo-Json -Depth 32 > $requestData + + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/templates/${templateId}/recipients/1/tabs" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +# Step 5. Create an envelope draft from a template +# Leave envelope in "draft"/"created" status, don't send it yet +@{ + templateId = "${templateId}"; + templateRoles = @( + @{ + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + roleName = "signer"; + }; + ); + status = "created"; +} | ConvertTo-Json -Depth 32 > $requestData + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +# pull out the envelope id +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId + +Write-Output "Envelope '${templateName}' draft was created! Envelope ID ${envelopeId}." + +# Step 6: Get DocGenFormFields +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/docGenFormFields" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` +-OutFile $response + +Write-Output "Response:" +Get-Content $response + +# pull out the document id value +$documentId = $(Get-Content $response | ConvertFrom-Json).docGenFormFields[0].documentId + + +Write-Output "Document ID ${documentId}." + +# Step 6. Build the request to update the data fields in the envelope that we created from the template +# Collect user data to send to API/Document fields +$CandidateName = Read-Host "Enter candidate name" +$ManagerName = Read-Host "Enter manager name" +$StartDate = Read-Host "Enter start date" +$Salary = Read-Host "Enter salary" +Write-Output "Choose job title" +Write-Output "1 - Software Engineer" +Write-Output "2 - Product Manager" +Write-Output "3 - Sales Representative" +$JobTitle = "Software Engineer" +$JobNumber = Read-Host +if ($JobNumber -eq "2") { + $JobTitle = "Product Manager" +} +elseif ($JobNumber -eq "3") { + $JobTitle = "Sales Representative" +} + +@{ + docGenFormFields = @( + @{ + documentId = "${documentId}"; + docGenFormFieldList = @( + @{ + name = "Candidate_Name"; + value = "${CandidateName}"; + }; + @{ + name = "Job_Title"; + value = "${JobTitle}"; + }; + @{ + name = "Manager_Name"; + value = "${ManagerName}"; + }; + @{ + name = "Start_Date"; + value = "${StartDate}"; + }; + @{ + name = "Salary"; + value = "${Salary}"; + } + ) + } + ) +} | ConvertTo-Json -Depth 32 > $requestData + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/docgenformfields" ` + -Method 'PUT' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +# Step 8 - Send the envelope +@{ + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/" ` + -Method 'PUT' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response:" +Get-Content $response + + +# cleanup +Remove-Item $requestData +Remove-Item $requestDataTemp +Remove-Item $response +Remove-Item $doc1Base64 + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index de6a426..513e999 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -444,7 +444,8 @@ function startSignature { Create_Signable_HTML_document = 38; Signing_In_Person = 39; Set_Document_Visibility = 40; - Pick_An_API = 41; + Document_Generation = 41; + Pick_An_API = 42; } $ApiExamplesView = $null; @@ -490,6 +491,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" + Write-Output "$([int][ApiExamples]::Document_Generation)) Document_Generation" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -628,6 +630,10 @@ function startSignature { checkEmailAddresses powershell.exe .\examples\eSignature\eg040SetDocumentVisibility.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Document_Generation) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg042DocumentGeneration.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } From 225bf59fb8d07d412f98e311ec679456486f7f44 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 2 May 2023 15:25:03 -0700 Subject: [PATCH 228/462] DEVDOCS-10934, fixing SMS delivery code example --- examples/eSignature/eg037SMSDelivery.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index 9f677b9..c74e776 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -74,6 +74,7 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo name = $variables.CC_NAME; recipientId = "2"; routingOrder = "2"; + deliveryMethod = "SMS"; }; ); @@ -86,6 +87,7 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo name = $variables.SIGNER_NAME; recipientId = "1"; routingOrder = "1"; + deliveryMethod = "SMS"; tabs = @{ signHereTabs = @( @{ From c311513a1f1a6f76e24e78e6c36b504ca3ec0214 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 3 May 2023 14:55:18 -0700 Subject: [PATCH 229/462] Fixing SMS delivery code example --- examples/eSignature/eg037SMSDelivery.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index 9f677b9..c74e776 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -74,6 +74,7 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo name = $variables.CC_NAME; recipientId = "2"; routingOrder = "2"; + deliveryMethod = "SMS"; }; ); @@ -86,6 +87,7 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo name = $variables.SIGNER_NAME; recipientId = "1"; routingOrder = "1"; + deliveryMethod = "SMS"; tabs = @{ signHereTabs = @( @{ From 2ac8bdaeef01d56cb8f7aaee203543c7839eb746 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Tue, 9 May 2023 16:10:25 -0700 Subject: [PATCH 230/462] adding codeDepot snippets --- examples/eSignature/eg029ApplyingBrandEnvelope.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg029ApplyingBrandEnvelope.ps1 b/examples/eSignature/eg029ApplyingBrandEnvelope.ps1 index ac62de5..3607d69 100644 --- a/examples/eSignature/eg029ApplyingBrandEnvelope.ps1 +++ b/examples/eSignature/eg029ApplyingBrandEnvelope.ps1 @@ -23,12 +23,15 @@ else { } # Construct your API headers +#ds-snippet-start:eSign29Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign29Step2 # Construct your request body +#ds-snippet-start:eSign29Step3 $body = @" { "documents": [{ @@ -65,12 +68,14 @@ $body = @" "status": "Sent" } "@ +#ds-snippet-end:eSign29Step3 Write-Output "" Write-Output "Request: " Write-Output $body # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope +#ds-snippet-start:eSign29Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -85,4 +90,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:eSign29Step4 \ No newline at end of file From 701001f132b49cc6f1257efec2cc9edafef1c31c Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 11 May 2023 10:32:33 -0700 Subject: [PATCH 231/462] DEVDOCS-10612 - adding codeDepot markers --- examples/Click/eg001CreateClickwrap.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/Click/eg001CreateClickwrap.ps1 b/examples/Click/eg001CreateClickwrap.ps1 index dd56830..1ed129b 100644 --- a/examples/Click/eg001CreateClickwrap.ps1 +++ b/examples/Click/eg001CreateClickwrap.ps1 @@ -5,12 +5,15 @@ $APIAccountId = Get-Content .\config\API_ACCOUNT_ID $clickwrapName = Read-Host "Please input a name for the clickwrap: " # Step 2. Construct your API headers +#ds-snippet-start:Click1Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click1Step2 # Step 3. Construct the request body +#ds-snippet-start:Click1Step3 $body = @" { "displaySettings": { @@ -36,14 +39,17 @@ $body = @" "requireReacceptance": true } "@ +#ds-snippet-end:Click1Step3 # Step 4. Call the Click API # a) Make a POST call to the clickwraps endpoint to create a clickwrap for an account # b) Display the JSON structure of the created clickwrap +#ds-snippet-start:Click1Step4 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method POST -Body $body Write-Output "Response: " $result.Content +#ds-snippet-end:Click1Step4 # Store clickwrapId to the file for future reference $($result.Content | ConvertFrom-Json).clickwrapId > .\config\CLICKWRAP_ID \ No newline at end of file From 898f18f78f28dbee747ab7283636a07513dca528 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 11 May 2023 10:42:46 -0700 Subject: [PATCH 232/462] DEVDOCS-10355 - adding codeDepot markers --- examples/Click/eg002ActivateClickwrap.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/Click/eg002ActivateClickwrap.ps1 b/examples/Click/eg002ActivateClickwrap.ps1 index c041a08..212c908 100644 --- a/examples/Click/eg002ActivateClickwrap.ps1 +++ b/examples/Click/eg002ActivateClickwrap.ps1 @@ -12,24 +12,30 @@ if (Test-Path .\config\CLICKWRAP_ID) { } # Step 2. Construct your API headers +#ds-snippet-start:Click2Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click2Step2 # Note: These values are not valid, but are shown for example purposes only! $VersionNumber = "1" # Construct your clickwrap JSON body +#ds-snippet-start:Click2Step3 $body = @" { "status" : "active" } "@ +#ds-snippet-end:Click2Step3 # a) Make a POST call to updateClickwrapVersionByNumber # b) Display the JSON structure of the created clickwrap +#ds-snippet-start:Click2Step4 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/versions/$VersionNumber" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method PUT -Body $body Write-Output "Response: " $result.Content +#ds-snippet-start:Click2Step4 From e8941aaf3577ac32c4f15a9457e8a71e4e58244a Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 11 May 2023 10:43:36 -0700 Subject: [PATCH 233/462] DEVDOCS-10355 - fixing --- examples/Click/eg002ActivateClickwrap.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Click/eg002ActivateClickwrap.ps1 b/examples/Click/eg002ActivateClickwrap.ps1 index 212c908..9b06052 100644 --- a/examples/Click/eg002ActivateClickwrap.ps1 +++ b/examples/Click/eg002ActivateClickwrap.ps1 @@ -38,4 +38,4 @@ $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/ $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method PUT -Body $body Write-Output "Response: " $result.Content -#ds-snippet-start:Click2Step4 +#ds-snippet-end:Click2Step4 From baec96d0a2e46090a1fda51b5ad66cbcbcc210ab Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 11 May 2023 10:47:14 -0700 Subject: [PATCH 234/462] DEVDOCS-10507 - adding codeDepot markers --- examples/Click/eg003CreateNewClickwrapVersion.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/Click/eg003CreateNewClickwrapVersion.ps1 b/examples/Click/eg003CreateNewClickwrapVersion.ps1 index 5192a57..c3f39b7 100644 --- a/examples/Click/eg003CreateNewClickwrapVersion.ps1 +++ b/examples/Click/eg003CreateNewClickwrapVersion.ps1 @@ -12,12 +12,15 @@ if (Test-Path .\config\CLICKWRAP_ID) { } # Step 2. Construct your API headers +#ds-snippet-start:Click3Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click3Step2 # Construct your clickwrap JSON body +#ds-snippet-start:Click3Step3 $body = @" { "name": "Terms of Service", @@ -46,11 +49,14 @@ $body = @" "requireReacceptance": true } "@ +#ds-snippet-end:Click3Step3 # Step 4. Call the Click API # a) Make a POST call to the versions endpoint to update a specific clickwrap (create a version) for an account # b) Display the returned JSON structure of the versioned clickwrap +#ds-snippet-start:Click3Step4 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/versions" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -body $body -Method POST Write-Output "Response: " $result.Content +#ds-snippet-end:Click3Step4 From 4beb46243849f81424c63af34a8033619a3ae7e2 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 12 May 2023 10:29:41 -0700 Subject: [PATCH 235/462] DEVDOCS-10510, adding codeDepot markers --- examples/Click/eg004GetListOfClickwraps.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/Click/eg004GetListOfClickwraps.ps1 b/examples/Click/eg004GetListOfClickwraps.ps1 index 39671d7..2842f8d 100644 --- a/examples/Click/eg004GetListOfClickwraps.ps1 +++ b/examples/Click/eg004GetListOfClickwraps.ps1 @@ -3,15 +3,19 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Step 2. Construct your API headers +#ds-snippet-start:Click4Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click4Step2 # Step 3. Call the Click API # a) Make a GET call to the clickwraps endpoint to retrieve all clickwraps for an account # b) Display the JSON structure of the returned clickwraps +#ds-snippet-start:Click4Step3 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method GET Write-Output "Response: " $result.Content +#ds-snippet-end:Click4Step3 From 099f6e3d55699019cf530e3b7fa5b0617be37638 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 12 May 2023 10:32:28 -0700 Subject: [PATCH 236/462] DEVDOCS-10386 - adding codeDepot markers --- examples/Click/eg005GetClickwrapResponses.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/Click/eg005GetClickwrapResponses.ps1 b/examples/Click/eg005GetClickwrapResponses.ps1 index 9fd9a3f..80559f2 100644 --- a/examples/Click/eg005GetClickwrapResponses.ps1 +++ b/examples/Click/eg005GetClickwrapResponses.ps1 @@ -12,15 +12,19 @@ if (Test-Path .\config\CLICKWRAP_ID) { } # Step 2. Construct your API headers +#ds-snippet-start:Click5Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click5Step2 # Step 3. Call the Click API # a) Make a GET call to the users endpoint to retrieve responses (acceptance) of a specific clickwrap for an account # b) Display the returned JSON structure of the responses +#ds-snippet-start:Click5Step3 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/users" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method GET Write-Output "Response: " -$result.Content \ No newline at end of file +$result.Content +#ds-snippet-end:Click5Step3 \ No newline at end of file From fb7a9d4363e9130ef74cea5bc001b3117381911f Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 12 May 2023 14:25:07 -0700 Subject: [PATCH 237/462] DEVDOCS-10388 - adding codeDepot markers --- examples/Click/eg006EmbedClickwrap.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/Click/eg006EmbedClickwrap.ps1 b/examples/Click/eg006EmbedClickwrap.ps1 index c12e4a8..5a30aab 100644 --- a/examples/Click/eg006EmbedClickwrap.ps1 +++ b/examples/Click/eg006EmbedClickwrap.ps1 @@ -12,10 +12,12 @@ else { } # Construct your API headers +#ds-snippet-start:Click6Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click6Step2 $client_user_id = Read-Host "Please input a Client User Id (your own unique identifier) for the clickwrap" $full_name = Read-Host "Please input a full name" @@ -24,6 +26,7 @@ $company_name = Read-Host "Please input a company name" $title = Read-Host "Please input a job title" # Construct the request body +#ds-snippet-start:Click6Step3 $requestData = New-TemporaryFile $response = New-TemporaryFile @@ -38,6 +41,7 @@ $response = New-TemporaryFile date = $((Get-Date).ToString("yyyy-MM-ddThh:mm:ssK")) }; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:Click6Step3 # Call the Click API # a) Make a GET call to the users endpoint to retrieve responses (acceptance) of a specific clickwrap for an account @@ -45,6 +49,7 @@ $response = New-TemporaryFile try { + #ds-snippet-start:Click6Step4 Invoke-RestMethod ` -Uri "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/agreements" ` -UseBasicParsing ` @@ -56,6 +61,7 @@ try { } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:Click6Step4 Write-Output "Response: $(Get-Content -Raw $response)" From 4ad3a1337f45683735be19d46a6805d2c84e6070 Mon Sep 17 00:00:00 2001 From: annahileta Date: Wed, 17 May 2023 15:26:28 +0300 Subject: [PATCH 238/462] added shared access code example --- examples/eSignature/eg043SharedAccess.ps1 | 190 ++++++++++++++++++++++ launcher.ps1 | 8 +- utils/sharedAccess.ps1 | 42 +++++ 3 files changed, 239 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg043SharedAccess.ps1 create mode 100644 utils/sharedAccess.ps1 diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 new file mode 100644 index 0000000..82b1a7d --- /dev/null +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -0,0 +1,190 @@ +$apiUri = "https://demo.docusign.net/restapi" +$accountUri = "https://account-d.docusign.com" + +$accessToken = Get-Content .\config\ds_access_token.txt +$accountId = Get-Content .\config\API_ACCOUNT_ID + +$requestData = New-TemporaryFile +$requestDataTemp = New-TemporaryFile +$response = New-TemporaryFile + +Write-Output "" +$agentName = Read-Host "Please enter the name of the new agent" +Write-Output "" +$agentEmail = Read-Host "Please enter the email address of the new agent" +Write-Output "" +$activation = Read-Host "Please input an activation code for the new agent. Save this code. You'll need it when activating the new agent." + +try { + # Check, if the agent already exists + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/users?email=${agentEmail}&status=Active" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + + Write-Output "" + Write-Output "Response:" + Write-Output "" + Get-Content $response + + $agentUserId = $(Get-Content $response | ConvertFrom-Json).users.userId +} catch { + # Create a new agent in the account + @{ + newUsers = @( + @{ + activationAccessCode = $activation; + userName = $agentName; + email = $agentEmail; + }; + ); + } | ConvertTo-Json -Depth 32 > $requestData + + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/users" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + + Write-Output "" + Write-Output "Response:" + Write-Output "" + Get-Content $response + + $agentUserId = $(Get-Content $response | ConvertFrom-Json).newUsers.userId +} + +Write-Output "" +Write-Output "Agent has been created. Please go to the agent's email to activate the agent, and press 1 to continue the example: " + +$choice = Read-Host +if ($choice -ne "1") { + Write-Output "Closing the example... " + exit 1 +} + +# Get user id of the currently logged user +Invoke-RestMethod ` + -Uri "${accountUri}/oauth/userinfo" ` + -Method 'GET' ` + -Headers @{ + 'Cache-Control' = "no-store"; + 'Pragma' = "cache"; + 'Authorization' = "Bearer $accessToken"; +} ` + -Body @{ "from_date" = ${fromDate} } ` + -OutFile $response + +$userId = $(Get-Content $response | ConvertFrom-Json).sub + +$isUserActivated = 0; + +do { + try { + # Check, if authorization exists + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/users/${agentUserId}/authorizations/agent?permissions=manage" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + + Write-Output "" + Write-Output "Response:" + Write-Output "" + Get-Content $response + + if ($(Get-Content $response | ConvertFrom-Json).authorizations -eq "") { + # Sharing the envelope with the agent + $body = @" + { + "agentUser": + { + "userId": "${agentUserId}", + "accountId": "${accountId}" + }, + "permission": "manage" + } +"@ + + Write-Output "" + $uri = "${apiUri}/v2.1/accounts/${accountId}/users/${userId}/authorization" + + $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" + $headers.add("Authorization", "Bearer $accessToken") + $headers.add("Content-Type", "application/json") + + $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST -UseBasicParsing -OutFile $response + $result.content + } + + $isUserActivated = 1; + } catch { + Write-Output "Agent has been created. Please go to the agent's email to activate the agent, and press 1 to continue the example: " + + $choice = Read-Host + if ($choice -ne "1") { + Write-Output "Closing the example... " + exit 1 + } + } +} while (!$isUserActivated) + +# Principal is told to log out and log in as the new agent +Write-Output "" +Write-Output "Please go to the principal's developer account at admindemo.docusign.com and log out, then come back to this terminal. Press 1 to continue: " + +$choice = Read-Host +if ($choice -ne "1") { + Write-Output "Closing the example... " + exit 1 +} + +powershell.exe -Command .\utils\sharedAccess.ps1 + +# Make the API call to check the envelope +# Get date in the ISO 8601 format +$fromDate = ((Get-Date).AddDays(-10d)).ToString("yyyy-MM-ddThh:mm:ssK") + +$response = New-TemporaryFile + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'GET' ` + -Headers @{ + 'X-DocuSign-Act-On-Behalf' = $userId; + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -Body @{ "from_date" = ${fromDate} } ` + -OutFile $response + +if ([string]::IsNullOrEmpty($response)) +{ + Write-Output "" + Write-Output "Response body is empty because there are no envelopes in the account. Please run example 2 and re-run this example." +} else { + Write-Output "" + Write-Output "Response:" + Write-Output "" + + Get-Content $response +} + +# cleanup +Remove-Item $requestData +Remove-Item $requestDataTemp +Remove-Item $response + +Write-Output "" +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 513e999..cfe9c90 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -445,7 +445,8 @@ function startSignature { Signing_In_Person = 39; Set_Document_Visibility = 40; Document_Generation = 41; - Pick_An_API = 42; + Shared_Access = 42; + Pick_An_API = 43; } $ApiExamplesView = $null; @@ -492,6 +493,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" Write-Output "$([int][ApiExamples]::Document_Generation)) Document_Generation" + Write-Output "$([int][ApiExamples]::Shared_Access)) Shared_Access" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -634,6 +636,10 @@ function startSignature { checkEmailAddresses powershell.exe .\examples\eSignature\eg042DocumentGeneration.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Shared_Access) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg043SharedAccess.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } diff --git a/utils/sharedAccess.ps1 b/utils/sharedAccess.ps1 new file mode 100644 index 0000000..085f957 --- /dev/null +++ b/utils/sharedAccess.ps1 @@ -0,0 +1,42 @@ +$configFile = ".\config\settings.json" + +if ((Test-Path $configFile) -eq $False) { + Write-Output "Error: " + Write-Output "First copy the file '.\config\settings.example.json' to '$configFile'." + Write-Output "Next, fill in your API credentials, Signer name and email to continue." +} + +# Get required environment variables from .\config\settings.json file +$config = Get-Content $configFile -Raw | ConvertFrom-Json + +Enum AuthType { + CodeGrant = 1; + JWT = 2; + Exit = 3; +} + +$AuthTypeView = $null; +do { + Write-Output "" + Write-Output 'Choose an OAuth Strategy: ' + Write-Output "$([int][AuthType]::CodeGrant)) Authorization Code Grant" + Write-Output "$([int][AuthType]::JWT)) Json Web Token (JWT)" + Write-Output "$([int][AuthType]::Exit)) Exit" + [int]$AuthTypeView = Read-Host "Select an OAuth method to Authenticate with your DocuSign account" +} while (-not [AuthType]::IsDefined([AuthType], $AuthTypeView)); + +if ($AuthTypeView -eq [AuthType]::Exit) { + exit 1; +} +elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) + if ((Test-Path "./config/ds_access_token.txt") -eq $false) { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } +} +elseif ($AuthTypeView -eq [AuthType]::JWT) { + powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) + if ((Test-Path "./config/ds_access_token.txt") -eq $false) { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } +} From 353c8d8ec70bdc4f53fd157ec0b62754955cd235 Mon Sep 17 00:00:00 2001 From: annahileta Date: Thu, 18 May 2023 15:32:25 +0300 Subject: [PATCH 239/462] added try/catch blocks --- examples/eSignature/eg043SharedAccess.ps1 | 76 +++++++++++++++-------- 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 index 82b1a7d..e9623e4 100644 --- a/examples/eSignature/eg043SharedAccess.ps1 +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -71,19 +71,30 @@ if ($choice -ne "1") { exit 1 } -# Get user id of the currently logged user -Invoke-RestMethod ` +try { + # Get user id of the currently logged user + Invoke-RestMethod ` -Uri "${accountUri}/oauth/userinfo" ` -Method 'GET' ` -Headers @{ 'Cache-Control' = "no-store"; 'Pragma' = "cache"; 'Authorization' = "Bearer $accessToken"; -} ` + } ` -Body @{ "from_date" = ${fromDate} } ` -OutFile $response -$userId = $(Get-Content $response | ConvertFrom-Json).sub + $userId = $(Get-Content $response | ConvertFrom-Json).sub +} catch { + Write-Output "Unable to retrieve Bulk Status." + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} $isUserActivated = 0; @@ -152,33 +163,44 @@ if ($choice -ne "1") { powershell.exe -Command .\utils\sharedAccess.ps1 -# Make the API call to check the envelope -# Get date in the ISO 8601 format -$fromDate = ((Get-Date).AddDays(-10d)).ToString("yyyy-MM-ddThh:mm:ssK") +try { + # Make the API call to check the envelope + # Get date in the ISO 8601 format + $fromDate = ((Get-Date).AddDays(-10d)).ToString("yyyy-MM-ddThh:mm:ssK") -$response = New-TemporaryFile + $response = New-TemporaryFile -Invoke-RestMethod ` - -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` - -Method 'GET' ` - -Headers @{ - 'X-DocuSign-Act-On-Behalf' = $userId; - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; -} ` - -Body @{ "from_date" = ${fromDate} } ` - -OutFile $response + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'GET' ` + -Headers @{ + 'X-DocuSign-Act-On-Behalf' = $userId; + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -Body @{ "from_date" = ${fromDate} } ` + -OutFile $response -if ([string]::IsNullOrEmpty($response)) -{ - Write-Output "" - Write-Output "Response body is empty because there are no envelopes in the account. Please run example 2 and re-run this example." -} else { - Write-Output "" - Write-Output "Response:" - Write-Output "" + if ([string]::IsNullOrEmpty($response)) + { + Write-Output "" + Write-Output "Response body is empty because there are no envelopes in the account. Please run example 2 and re-run this example." + } else { + Write-Output "" + Write-Output "Response:" + Write-Output "" - Get-Content $response + Get-Content $response + } +} catch { + Write-Output "Unable to retrieve Bulk Status." + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line } # cleanup From a656d0f0f7ef9f1425e5f92ec70f27a15b518362 Mon Sep 17 00:00:00 2001 From: annahileta Date: Thu, 18 May 2023 16:13:17 +0300 Subject: [PATCH 240/462] changed example order number --- launcher.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index cfe9c90..ce2bc54 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -445,8 +445,8 @@ function startSignature { Signing_In_Person = 39; Set_Document_Visibility = 40; Document_Generation = 41; - Shared_Access = 42; - Pick_An_API = 43; + Shared_Access = 43; + Pick_An_API = 44; } $ApiExamplesView = $null; From 05fcf6a738f326317ca2ea8d3119d3a78bb0572f Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Mon, 22 May 2023 15:38:45 -0700 Subject: [PATCH 241/462] adding codeDepot snippets --- examples/Rooms/eg009AssignFormGroup.ps1 | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index f230c1a..f56be67 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -2,15 +2,15 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID -# Step 2 Start # Construct your API headers +#ds-snippet-start:Rooms9Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 End +#ds-snippet-end:Rooms9Step2 -# Step 3 Start +#ds-snippet-start:Rooms9Step3 # Call the Rooms API to look up your forms library ID $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_libraries" @@ -70,9 +70,9 @@ try { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 3 End +#ds-snippet-end:Rooms9Step3 -# Step 4 Start +#ds-snippet-start:Rooms9Step4 $formGroupID = "" # Call the Rooms API to look up a list of form group IDs @@ -107,17 +107,17 @@ $formGroupID = $menu.Item($selection) Write-Output "" Write-Output "Form group Id: $formGroupID" Write-Output "" -# Step 4 End +#ds-snippet-end:Rooms9Step4 -# Step 5 Start +#ds-snippet-start:Rooms9Step5 # Construct your request body $body = @" {"formId": "$formID" } "@ -# Step 5 End +#ds-snippet-end:Rooms9Step5 -# Step 6 Start +#ds-snippet-start:Rooms9Step6 # Call the Rooms API $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/assign_form" @@ -136,4 +136,4 @@ try { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 6 End +#ds-snippet-end:Rooms9Step6 From 46e10b5fedbde1afa86b7c14c6fd0c9c6341dae8 Mon Sep 17 00:00:00 2001 From: annahileta Date: Tue, 23 May 2023 14:44:24 +0300 Subject: [PATCH 242/462] changed the number of the shared access code example --- launcher.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index ce2bc54..cfe9c90 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -445,8 +445,8 @@ function startSignature { Signing_In_Person = 39; Set_Document_Visibility = 40; Document_Generation = 41; - Shared_Access = 43; - Pick_An_API = 44; + Shared_Access = 42; + Pick_An_API = 43; } $ApiExamplesView = $null; From e46d9582ed9069f7e5f12d8e75c509361738f399 Mon Sep 17 00:00:00 2001 From: annahileta Date: Wed, 24 May 2023 12:19:11 +0300 Subject: [PATCH 243/462] added a check for empty response --- examples/eSignature/eg043SharedAccess.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 index e9623e4..f191b77 100644 --- a/examples/eSignature/eg043SharedAccess.ps1 +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -115,7 +115,7 @@ do { Write-Output "" Get-Content $response - if ($(Get-Content $response | ConvertFrom-Json).authorizations -eq "") { + if ([string]::IsNullOrEmpty($(Get-Content $response | ConvertFrom-Json).authorizations)) { # Sharing the envelope with the agent $body = @" { From 35c9250f72f48a7f5780e4ac742a59862113a89a Mon Sep 17 00:00:00 2001 From: annahileta Date: Thu, 25 May 2023 14:27:38 +0300 Subject: [PATCH 244/462] delete user from organization and account --- OAuth/code_grant.ps1 | 2 +- OAuth/jwt.ps1 | 2 +- .../eg010DeleteUserDataFromOrganization.ps1 | 56 +++++++++++++++++++ .../Admin/eg011DeleteUserDataFromAccount.ps1 | 46 +++++++++++++++ launcher.ps1 | 14 ++++- 5 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 examples/Admin/eg010DeleteUserDataFromOrganization.ps1 create mode 100644 examples/Admin/eg011DeleteUserDataFromAccount.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 1d5b64b..a15df4f 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -30,7 +30,7 @@ elseif ($apiVersion -eq "monitor") { $scopes = "signature impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read" + $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact" } $authorizationEndpoint = "https://account-d.docusign.com/oauth/" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 6ca26de..2c63d4c 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -43,7 +43,7 @@ if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read" + $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact" } # Step 1. Request application consent diff --git a/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 b/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 new file mode 100644 index 0000000..4ad21be --- /dev/null +++ b/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 @@ -0,0 +1,56 @@ +$accessToken = Get-Content .\config\ds_access_token.txt + +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json +$basePath = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") + +# Get user information +$emailAddress = Read-Host "Please input the email address of the user whose data will be deleted. Note that this email address should be associated with a user that has been closed for at least 24 hours." + +$uri = "${basePath}/v2.1/organizations/${organizationId}/users/dsprofile?email=${emailAddress}" +$response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET + +$userId = $($response.Content | ConvertFrom-Json).users.id +$accountId = $($response.Content | ConvertFrom-Json).users.memberships.account_id + +# Construct the request body +$body = @" + { + "user_id": "$userId", + "memberships": [{ + "account_id": "$accountId", + }] + } +"@ + +try { + # Display the JSON response + Write-Output "" + Write-Output "Response:" + $uri = "${basePath}/v2/data_redaction/organizations/${organizationId}/user" + + $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $result.content +} catch { + Write-Output "Unable to delete the user." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +Write-Output "" +Write-Output "Done" diff --git a/examples/Admin/eg011DeleteUserDataFromAccount.ps1 b/examples/Admin/eg011DeleteUserDataFromAccount.ps1 new file mode 100644 index 0000000..b1759c0 --- /dev/null +++ b/examples/Admin/eg011DeleteUserDataFromAccount.ps1 @@ -0,0 +1,46 @@ +$accessToken = Get-Content .\config\ds_access_token.txt + +$basePath = "https://api-d.docusign.net/management" +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") + +# Get user information +$userId = Read-Host "Please enter the user ID of the user whose data will be deleted. Note that this user ID should be associated with a user that has been closed for at least 24 hours." + +# Construct the request body +$body = @" + { + "user_id": "$userId", + } +"@ + +try { + # Display the JSON response + Write-Output "" + Write-Output "Response:" + $uri = "${basePath}/v2/data_redaction/accounts/${APIAccountId}/user" + + $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $result.content +} catch { + Write-Output "Unable to delete the user." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +Write-Output "" +Write-Output "Done" diff --git a/launcher.ps1 b/launcher.ps1 index 513e999..0b055a4 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -785,7 +785,9 @@ function startAdmin { getUserProfileByUserId = 7; updateUserProductPermissionProfile = 8; deleteUserProductPermissionProfile = 9; - Pick_An_API = 10; + deleteUserDataFromOrganization = 10; + deleteUserDataFromAccount = 11; + Pick_An_API = 12; } $listAdminExamplesView = $null; do { @@ -800,6 +802,8 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Retrieve the user's DocuSign profile using a User ID" Write-Output "$([int][listAdminExamples]::updateUserProductPermissionProfile)) Update user product permission profiles using an email address" Write-Output "$([int][listAdminExamples]::deleteUserProductPermissionProfile)) Delete user product permission profiles using an email address" + Write-Output "$([int][listAdminExamples]::deleteUserDataFromOrganization)) Delete user data from organization" + Write-Output "$([int][listAdminExamples]::deleteUserDataFromAccount)) Delete user data from account" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -842,6 +846,14 @@ function startAdmin { checkOrgId powershell.exe -Command .\examples\Admin\eg009DeleteUserProductPermissionProfile.ps1 } + elseif ($listAdminExamplesView -eq [listAdminExamples]::deleteUserDataFromOrganization) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg010DeleteUserDataFromOrganization.ps1 + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::deleteUserDataFromAccount) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg011DeleteUserDataFromAccount.ps1 + } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } From 28b5ede31bca969b3e1d59bcbffae94e2d5a56dd Mon Sep 17 00:00:00 2001 From: annahileta Date: Thu, 25 May 2023 16:35:34 +0300 Subject: [PATCH 245/462] added fixes for texts --- examples/eSignature/eg043SharedAccess.ps1 | 11 ++++------- launcher.ps1 | 4 ++-- utils/sharedAccess.ps1 | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 index f191b77..fd04170 100644 --- a/examples/eSignature/eg043SharedAccess.ps1 +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -110,11 +110,6 @@ do { } ` -OutFile $response - Write-Output "" - Write-Output "Response:" - Write-Output "" - Get-Content $response - if ([string]::IsNullOrEmpty($(Get-Content $response | ConvertFrom-Json).authorizations)) { # Sharing the envelope with the agent $body = @" @@ -135,8 +130,10 @@ do { $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") - $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST -UseBasicParsing -OutFile $response - $result.content + Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST -UseBasicParsing -OutFile $response + + Write-Output "Response:" + Write-Output "$(Get-Content -Raw $response)" } $isUserActivated = 1; diff --git a/launcher.ps1 b/launcher.ps1 index cfe9c90..ce2bc54 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -445,8 +445,8 @@ function startSignature { Signing_In_Person = 39; Set_Document_Visibility = 40; Document_Generation = 41; - Shared_Access = 42; - Pick_An_API = 43; + Shared_Access = 43; + Pick_An_API = 44; } $ApiExamplesView = $null; diff --git a/utils/sharedAccess.ps1 b/utils/sharedAccess.ps1 index 085f957..96dd766 100644 --- a/utils/sharedAccess.ps1 +++ b/utils/sharedAccess.ps1 @@ -22,7 +22,7 @@ do { Write-Output "$([int][AuthType]::CodeGrant)) Authorization Code Grant" Write-Output "$([int][AuthType]::JWT)) Json Web Token (JWT)" Write-Output "$([int][AuthType]::Exit)) Exit" - [int]$AuthTypeView = Read-Host "Select an OAuth method to Authenticate with your DocuSign account" + [int]$AuthTypeView = Read-Host "Choose an OAuth Strategy. Then log in as the new user that you just created." } while (-not [AuthType]::IsDefined([AuthType], $AuthTypeView)); if ($AuthTypeView -eq [AuthType]::Exit) { From 359e0db12e097f4bfd61a55301a4a85befdf78d8 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 26 May 2023 10:12:53 -0700 Subject: [PATCH 246/462] DEVDOCS-10275 - adding codeDepot markers --- examples/Admin/eg003BulkExportUserData.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/Admin/eg003BulkExportUserData.ps1 b/examples/Admin/eg003BulkExportUserData.ps1 index dbada55..1c4d736 100644 --- a/examples/Admin/eg003BulkExportUserData.ps1 +++ b/examples/Admin/eg003BulkExportUserData.ps1 @@ -2,11 +2,11 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin3Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin3Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -35,7 +35,7 @@ $result = Invoke-WebRequest -headers $headers -Uri $uri2 -body $body -Method POS $requestId = $($result.Content | ConvertFrom-Json).id $requestId -# Step 3 start +#ds-snippet-start:Admin3Step3 Write-Output "Checking Bulk Action Status" $uri2 = "${base_path}/v2/organizations/$organizationId/exports/user_list/$requestId" $result2 = Invoke-WebRequest -headers $headers -Uri $uri2 -Method GET @@ -62,7 +62,7 @@ else { Write-Output "An error has occurred, the Bulk Action has not been completed." exit 1 } -# Step 3 end +#ds-snippet-end:Admin3Step3 # Check the request status # Step 4 start From ed1908012b3a873c65bfbc85616a5f45e57e266a Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 26 May 2023 10:15:16 -0700 Subject: [PATCH 247/462] DEVDOCS-10275 - adding codeDepot markers --- examples/Admin/eg003BulkExportUserData.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/Admin/eg003BulkExportUserData.ps1 b/examples/Admin/eg003BulkExportUserData.ps1 index 1c4d736..1261c5d 100644 --- a/examples/Admin/eg003BulkExportUserData.ps1 +++ b/examples/Admin/eg003BulkExportUserData.ps1 @@ -65,22 +65,22 @@ else { #ds-snippet-end:Admin3Step3 # Check the request status -# Step 4 start +#ds-snippet-start:Admin3Step4 $uri2 = "${base_path}/v2/organizations/$organizationId/exports/user_list/$requestId" $result2 = Invoke-WebRequest -headers $headers -Uri $uri2 -Method GET $result2.Content $results = $result2 | ConvertFrom-Json -# Step 4 end +#ds-snippet-end:Admin3Step4 $results # Get result Id $resultId = $($result2 | ConvertFrom-Json).results.id # Download the exported user data -# Step 5 start +#ds-snippet-start:Admin3Step5 $uri3 = "https://demo.docusign.net/restapi/v2/organization_exports/$organizationId/user_list/$resultId" $result3 = Invoke-WebRequest -headers $headers -Uri $uri3 -Method GET $result3.Content -# Step 5 end +#ds-snippet-end:Admin3Step5 Write-Output "Export data to file bulkexport.csv ..." $result3.Content > bulkexport.csv From 8407b6373c756c7e4a378c3bda40ca7c10697554 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 26 May 2023 11:39:36 -0700 Subject: [PATCH 248/462] DEVDOOCS-10605 - adding codeDepot markers --- examples/Admin/eg004AddUsersViaBulkImport.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/Admin/eg004AddUsersViaBulkImport.ps1 b/examples/Admin/eg004AddUsersViaBulkImport.ps1 index 1ae1437..ab78979 100644 --- a/examples/Admin/eg004AddUsersViaBulkImport.ps1 +++ b/examples/Admin/eg004AddUsersViaBulkImport.ps1 @@ -3,7 +3,7 @@ $accessToken = Get-Content .\config\ds_access_token.txt $accountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin4Step2 $headers1 = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers1.add("Authorization","Bearer ${accessToken}") $headers1.add("Content-Disposition", "filename=bulkimport.csv") @@ -11,7 +11,7 @@ $headers1.add("Content-Type","text/csv") $headers2 = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers2.add("Authorization","Bearer ${accessToken}") -# Step end +#ds-snippet-end:Admin4Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -26,7 +26,7 @@ $base_path = "https://api-d.docusign.net/management" $organizationId = $variables.ORGANIZATION_ID # Create the bulk import request -# Step 3 start +#ds-snippet-start:Admin4Step3 $body = @" AccountID,AccountName,FirstName,LastName,UserEmail,eSignPermissionProfile,Group,Language,UserTitle,CompanyName,AddressLine1,AddressLine2,City,StateRegionProvince,PostalCode,Phone,LoginPolicy,AutoActivate $accountId,Sample Account,John,Markson,user1email@example.com,Account Administrator,Everyone,en,Mr.,Some Division,123 4th St,Suite C1,Seattle,WA,8178,2065559999,fedAuthRequired,true @@ -39,13 +39,13 @@ $result1 = Invoke-WebRequest -headers $headers1 -Uri $uri1 -body $body -Method P $result1.Content $results = $result1 | ConvertFrom-Json $importId = $results.id -# Step 3 end +#ds-snippet-end:Admin4Step3 # Check the request status Write-Output "Sleep 20 seconds..." Start-Sleep 20 -# Step 4 start +#ds-snippet-start:Admin4Step4 $uri2 = "${base_path}/v2/organizations/$organizationId/imports/bulk_users/$importId" $result2 = Invoke-WebRequest -headers $headers2 -Uri $uri2 -Method GET $result2.Content -# Step 4 end +#ds-snippet-end:Admin4Step4 From 95ff140a7d5757a0832f8844c07a27d00d934b32 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 30 May 2023 14:46:33 -0700 Subject: [PATCH 249/462] DEVDOCS-10334 - adding codeDepot markers --- examples/Admin/eg006GetUserProfileByEmail.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/Admin/eg006GetUserProfileByEmail.ps1 b/examples/Admin/eg006GetUserProfileByEmail.ps1 index f89cd78..620997b 100644 --- a/examples/Admin/eg006GetUserProfileByEmail.ps1 +++ b/examples/Admin/eg006GetUserProfileByEmail.ps1 @@ -2,11 +2,11 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin6Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin6Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -24,8 +24,8 @@ $email = Read-Host "Enter the user's email address" $result = "" # Call the DocuSign Admin API -# Step 3 start +#ds-snippet-start:Admin6Step3 $uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${email}" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET $result.Content -# Step 3 end +#ds-snippet-end:Admin6Step3 From f5276509ceaee97741459b2098bf06d4e2ef46ea Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 30 May 2023 14:50:25 -0700 Subject: [PATCH 250/462] DEVDOCS-10266 - adding codeDepot markers --- examples/Admin/eg007GetUserProfileByUserId.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/Admin/eg007GetUserProfileByUserId.ps1 b/examples/Admin/eg007GetUserProfileByUserId.ps1 index 9d17051..5667004 100644 --- a/examples/Admin/eg007GetUserProfileByUserId.ps1 +++ b/examples/Admin/eg007GetUserProfileByUserId.ps1 @@ -2,11 +2,11 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin7Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin7Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -24,8 +24,8 @@ $userId = Read-Host "Enter the user's User ID" $result = "" # Call the DocuSign Admin API -# Step 3 start +#ds-snippet-start:Admin7Step3 $uri = "${base_path}/v2.1/organizations/${organizationId}/users/${userId}/dsprofile" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET $result.Content -# Step 3 end +#ds-snippet-end:Admin7Step3 From f634d2b861225f0925c437f66a6335deb52e65f7 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 31 May 2023 14:44:56 -0700 Subject: [PATCH 251/462] DEDOCS-10370 - adding codeDepot markers --- .../eg008UpdateUserProductPermissionProfile.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 index 25ef7fc..9a74af3 100644 --- a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -30,12 +30,12 @@ if (Test-Path $emailAddressFile) { } # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin8Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin8Step2 try { # Get all permission profiles @@ -128,7 +128,7 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { } # Construct the request body -# Step 3 start +#ds-snippet-start:Admin8Step3 $body = @" { "email": "$emailAddress", @@ -140,16 +140,16 @@ $body = @" ] } "@ -# Step 3 end +#ds-snippet-end:Admin8Step3 try { # Display the JSON response Write-Output "Response:" - # Step 4 start +#ds-snippet-start:Admin8Step4 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 - # Step 4 end +#ds-snippet-end:Admin8Step4 Write-Output "Done" } From a4b44392377faa5153fd9783863fd9419bfc9a7d Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 31 May 2023 14:47:25 -0700 Subject: [PATCH 252/462] DEVDOCS-10603 - adding codeDepot markers --- .../eg009DeleteUserProductPermissionProfile.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 index 3541a7d..49b266b 100644 --- a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -30,12 +30,12 @@ if (Test-Path $emailAddressFile) { } # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin9Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin9Step2 try { # Display the JSON response @@ -105,7 +105,7 @@ if ($null -eq $userHasProductPermissions) { Write-Output "" } else { # Construct the request body - # Step 3 start +#ds-snippet-start:Admin9Step3 $body = @" { "user_email": "$emailAddress", @@ -114,15 +114,15 @@ if ($null -eq $userHasProductPermissions) { ] } "@ -# Step 3 end +#ds-snippet-end:Admin9Step3 try { # Display the JSON response Write-Output "Response:" - # Step 4 start +#ds-snippet-start:Admin9Step4 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE - # Step 4 end +#ds-snippet-end:Admin9Step4 Write-Output "Product permission profile has been deleted." Write-Output "" From eb3f3dab95e808b444e6c697762d0af608765649 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 31 May 2023 15:07:16 -0700 Subject: [PATCH 253/462] DEVDOCS-10376 - adding codeDepot markers --- examples/eSignature/eg002SigningViaEmail.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/eSignature/eg002SigningViaEmail.ps1 b/examples/eSignature/eg002SigningViaEmail.ps1 index 484beb3..85d5273 100644 --- a/examples/eSignature/eg002SigningViaEmail.ps1 +++ b/examples/eSignature/eg002SigningViaEmail.ps1 @@ -43,6 +43,7 @@ Write-Output "The envelope has three documents. Processing time will be about 15 Write-Output "Results:" # Concatenate the different parts of the request +#ds-snippet-start:eSign2tep2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -100,8 +101,10 @@ Write-Output "Results:" }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign2Step2 # Step 3. Create and send the envelope +#ds-snippet-start:eSign2Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -111,6 +114,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign2Step3 Write-Output "Response: $(Get-Content -Raw $response)" From 1199a993f94b7893ca726430008c6f3bf63c2eaa Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 1 Jun 2023 13:37:03 -0700 Subject: [PATCH 254/462] Adding new code examples --- OAuth/code_grant.ps1 | 2 +- OAuth/jwt.ps1 | 2 +- examples/Admin/eg003BulkExportUserData.ps1 | 16 +- examples/Admin/eg004AddUsersViaBulkImport.ps1 | 12 +- examples/Admin/eg006GetUserProfileByEmail.ps1 | 8 +- .../Admin/eg007GetUserProfileByUserId.ps1 | 8 +- ...g008UpdateUserProductPermissionProfile.ps1 | 12 +- ...g009DeleteUserProductPermissionProfile.ps1 | 12 +- .../eg010DeleteUserDataFromOrganization.ps1 | 56 +++++ .../Admin/eg011DeleteUserDataFromAccount.ps1 | 46 ++++ examples/Click/eg001CreateClickwrap.ps1 | 6 + examples/Click/eg002ActivateClickwrap.ps1 | 6 + .../Click/eg003CreateNewClickwrapVersion.ps1 | 6 + examples/Click/eg004GetListOfClickwraps.ps1 | 4 + examples/Click/eg005GetClickwrapResponses.ps1 | 6 +- examples/Click/eg006EmbedClickwrap.ps1 | 6 + examples/Rooms/eg009AssignFormGroup.ps1 | 20 +- examples/eSignature/eg002SigningViaEmail.ps1 | 4 + examples/eSignature/eg043SharedAccess.ps1 | 209 ++++++++++++++++++ launcher.ps1 | 22 +- utils/sharedAccess.ps1 | 42 ++++ 21 files changed, 456 insertions(+), 49 deletions(-) create mode 100644 examples/Admin/eg010DeleteUserDataFromOrganization.ps1 create mode 100644 examples/Admin/eg011DeleteUserDataFromAccount.ps1 create mode 100644 examples/eSignature/eg043SharedAccess.ps1 create mode 100644 utils/sharedAccess.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 1d5b64b..a15df4f 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -30,7 +30,7 @@ elseif ($apiVersion -eq "monitor") { $scopes = "signature impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read" + $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact" } $authorizationEndpoint = "https://account-d.docusign.com/oauth/" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 6ca26de..2c63d4c 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -43,7 +43,7 @@ if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read" + $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact" } # Step 1. Request application consent diff --git a/examples/Admin/eg003BulkExportUserData.ps1 b/examples/Admin/eg003BulkExportUserData.ps1 index dbada55..1261c5d 100644 --- a/examples/Admin/eg003BulkExportUserData.ps1 +++ b/examples/Admin/eg003BulkExportUserData.ps1 @@ -2,11 +2,11 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin3Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin3Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -35,7 +35,7 @@ $result = Invoke-WebRequest -headers $headers -Uri $uri2 -body $body -Method POS $requestId = $($result.Content | ConvertFrom-Json).id $requestId -# Step 3 start +#ds-snippet-start:Admin3Step3 Write-Output "Checking Bulk Action Status" $uri2 = "${base_path}/v2/organizations/$organizationId/exports/user_list/$requestId" $result2 = Invoke-WebRequest -headers $headers -Uri $uri2 -Method GET @@ -62,25 +62,25 @@ else { Write-Output "An error has occurred, the Bulk Action has not been completed." exit 1 } -# Step 3 end +#ds-snippet-end:Admin3Step3 # Check the request status -# Step 4 start +#ds-snippet-start:Admin3Step4 $uri2 = "${base_path}/v2/organizations/$organizationId/exports/user_list/$requestId" $result2 = Invoke-WebRequest -headers $headers -Uri $uri2 -Method GET $result2.Content $results = $result2 | ConvertFrom-Json -# Step 4 end +#ds-snippet-end:Admin3Step4 $results # Get result Id $resultId = $($result2 | ConvertFrom-Json).results.id # Download the exported user data -# Step 5 start +#ds-snippet-start:Admin3Step5 $uri3 = "https://demo.docusign.net/restapi/v2/organization_exports/$organizationId/user_list/$resultId" $result3 = Invoke-WebRequest -headers $headers -Uri $uri3 -Method GET $result3.Content -# Step 5 end +#ds-snippet-end:Admin3Step5 Write-Output "Export data to file bulkexport.csv ..." $result3.Content > bulkexport.csv diff --git a/examples/Admin/eg004AddUsersViaBulkImport.ps1 b/examples/Admin/eg004AddUsersViaBulkImport.ps1 index 1ae1437..ab78979 100644 --- a/examples/Admin/eg004AddUsersViaBulkImport.ps1 +++ b/examples/Admin/eg004AddUsersViaBulkImport.ps1 @@ -3,7 +3,7 @@ $accessToken = Get-Content .\config\ds_access_token.txt $accountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin4Step2 $headers1 = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers1.add("Authorization","Bearer ${accessToken}") $headers1.add("Content-Disposition", "filename=bulkimport.csv") @@ -11,7 +11,7 @@ $headers1.add("Content-Type","text/csv") $headers2 = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers2.add("Authorization","Bearer ${accessToken}") -# Step end +#ds-snippet-end:Admin4Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -26,7 +26,7 @@ $base_path = "https://api-d.docusign.net/management" $organizationId = $variables.ORGANIZATION_ID # Create the bulk import request -# Step 3 start +#ds-snippet-start:Admin4Step3 $body = @" AccountID,AccountName,FirstName,LastName,UserEmail,eSignPermissionProfile,Group,Language,UserTitle,CompanyName,AddressLine1,AddressLine2,City,StateRegionProvince,PostalCode,Phone,LoginPolicy,AutoActivate $accountId,Sample Account,John,Markson,user1email@example.com,Account Administrator,Everyone,en,Mr.,Some Division,123 4th St,Suite C1,Seattle,WA,8178,2065559999,fedAuthRequired,true @@ -39,13 +39,13 @@ $result1 = Invoke-WebRequest -headers $headers1 -Uri $uri1 -body $body -Method P $result1.Content $results = $result1 | ConvertFrom-Json $importId = $results.id -# Step 3 end +#ds-snippet-end:Admin4Step3 # Check the request status Write-Output "Sleep 20 seconds..." Start-Sleep 20 -# Step 4 start +#ds-snippet-start:Admin4Step4 $uri2 = "${base_path}/v2/organizations/$organizationId/imports/bulk_users/$importId" $result2 = Invoke-WebRequest -headers $headers2 -Uri $uri2 -Method GET $result2.Content -# Step 4 end +#ds-snippet-end:Admin4Step4 diff --git a/examples/Admin/eg006GetUserProfileByEmail.ps1 b/examples/Admin/eg006GetUserProfileByEmail.ps1 index f89cd78..620997b 100644 --- a/examples/Admin/eg006GetUserProfileByEmail.ps1 +++ b/examples/Admin/eg006GetUserProfileByEmail.ps1 @@ -2,11 +2,11 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin6Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin6Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -24,8 +24,8 @@ $email = Read-Host "Enter the user's email address" $result = "" # Call the DocuSign Admin API -# Step 3 start +#ds-snippet-start:Admin6Step3 $uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${email}" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET $result.Content -# Step 3 end +#ds-snippet-end:Admin6Step3 diff --git a/examples/Admin/eg007GetUserProfileByUserId.ps1 b/examples/Admin/eg007GetUserProfileByUserId.ps1 index 9d17051..5667004 100644 --- a/examples/Admin/eg007GetUserProfileByUserId.ps1 +++ b/examples/Admin/eg007GetUserProfileByUserId.ps1 @@ -2,11 +2,11 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin7Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin7Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -24,8 +24,8 @@ $userId = Read-Host "Enter the user's User ID" $result = "" # Call the DocuSign Admin API -# Step 3 start +#ds-snippet-start:Admin7Step3 $uri = "${base_path}/v2.1/organizations/${organizationId}/users/${userId}/dsprofile" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET $result.Content -# Step 3 end +#ds-snippet-end:Admin7Step3 diff --git a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 index 25ef7fc..9a74af3 100644 --- a/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg008UpdateUserProductPermissionProfile.ps1 @@ -30,12 +30,12 @@ if (Test-Path $emailAddressFile) { } # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin8Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin8Step2 try { # Get all permission profiles @@ -128,7 +128,7 @@ if ($listProductChoicesView -eq [listProductChoices]::CLM) { } # Construct the request body -# Step 3 start +#ds-snippet-start:Admin8Step3 $body = @" { "email": "$emailAddress", @@ -140,16 +140,16 @@ $body = @" ] } "@ -# Step 3 end +#ds-snippet-end:Admin8Step3 try { # Display the JSON response Write-Output "Response:" - # Step 4 start +#ds-snippet-start:Admin8Step4 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 - # Step 4 end +#ds-snippet-end:Admin8Step4 Write-Output "Done" } diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 index 3541a7d..49b266b 100644 --- a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -30,12 +30,12 @@ if (Test-Path $emailAddressFile) { } # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin9Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin9Step2 try { # Display the JSON response @@ -105,7 +105,7 @@ if ($null -eq $userHasProductPermissions) { Write-Output "" } else { # Construct the request body - # Step 3 start +#ds-snippet-start:Admin9Step3 $body = @" { "user_email": "$emailAddress", @@ -114,15 +114,15 @@ if ($null -eq $userHasProductPermissions) { ] } "@ -# Step 3 end +#ds-snippet-end:Admin9Step3 try { # Display the JSON response Write-Output "Response:" - # Step 4 start +#ds-snippet-start:Admin9Step4 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE - # Step 4 end +#ds-snippet-end:Admin9Step4 Write-Output "Product permission profile has been deleted." Write-Output "" diff --git a/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 b/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 new file mode 100644 index 0000000..4ad21be --- /dev/null +++ b/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 @@ -0,0 +1,56 @@ +$accessToken = Get-Content .\config\ds_access_token.txt + +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json +$basePath = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") + +# Get user information +$emailAddress = Read-Host "Please input the email address of the user whose data will be deleted. Note that this email address should be associated with a user that has been closed for at least 24 hours." + +$uri = "${basePath}/v2.1/organizations/${organizationId}/users/dsprofile?email=${emailAddress}" +$response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET + +$userId = $($response.Content | ConvertFrom-Json).users.id +$accountId = $($response.Content | ConvertFrom-Json).users.memberships.account_id + +# Construct the request body +$body = @" + { + "user_id": "$userId", + "memberships": [{ + "account_id": "$accountId", + }] + } +"@ + +try { + # Display the JSON response + Write-Output "" + Write-Output "Response:" + $uri = "${basePath}/v2/data_redaction/organizations/${organizationId}/user" + + $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $result.content +} catch { + Write-Output "Unable to delete the user." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +Write-Output "" +Write-Output "Done" diff --git a/examples/Admin/eg011DeleteUserDataFromAccount.ps1 b/examples/Admin/eg011DeleteUserDataFromAccount.ps1 new file mode 100644 index 0000000..b1759c0 --- /dev/null +++ b/examples/Admin/eg011DeleteUserDataFromAccount.ps1 @@ -0,0 +1,46 @@ +$accessToken = Get-Content .\config\ds_access_token.txt + +$basePath = "https://api-d.docusign.net/management" +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") + +# Get user information +$userId = Read-Host "Please enter the user ID of the user whose data will be deleted. Note that this user ID should be associated with a user that has been closed for at least 24 hours." + +# Construct the request body +$body = @" + { + "user_id": "$userId", + } +"@ + +try { + # Display the JSON response + Write-Output "" + Write-Output "Response:" + $uri = "${basePath}/v2/data_redaction/accounts/${APIAccountId}/user" + + $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $result.content +} catch { + Write-Output "Unable to delete the user." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +Write-Output "" +Write-Output "Done" diff --git a/examples/Click/eg001CreateClickwrap.ps1 b/examples/Click/eg001CreateClickwrap.ps1 index dd56830..1ed129b 100644 --- a/examples/Click/eg001CreateClickwrap.ps1 +++ b/examples/Click/eg001CreateClickwrap.ps1 @@ -5,12 +5,15 @@ $APIAccountId = Get-Content .\config\API_ACCOUNT_ID $clickwrapName = Read-Host "Please input a name for the clickwrap: " # Step 2. Construct your API headers +#ds-snippet-start:Click1Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click1Step2 # Step 3. Construct the request body +#ds-snippet-start:Click1Step3 $body = @" { "displaySettings": { @@ -36,14 +39,17 @@ $body = @" "requireReacceptance": true } "@ +#ds-snippet-end:Click1Step3 # Step 4. Call the Click API # a) Make a POST call to the clickwraps endpoint to create a clickwrap for an account # b) Display the JSON structure of the created clickwrap +#ds-snippet-start:Click1Step4 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method POST -Body $body Write-Output "Response: " $result.Content +#ds-snippet-end:Click1Step4 # Store clickwrapId to the file for future reference $($result.Content | ConvertFrom-Json).clickwrapId > .\config\CLICKWRAP_ID \ No newline at end of file diff --git a/examples/Click/eg002ActivateClickwrap.ps1 b/examples/Click/eg002ActivateClickwrap.ps1 index c041a08..9b06052 100644 --- a/examples/Click/eg002ActivateClickwrap.ps1 +++ b/examples/Click/eg002ActivateClickwrap.ps1 @@ -12,24 +12,30 @@ if (Test-Path .\config\CLICKWRAP_ID) { } # Step 2. Construct your API headers +#ds-snippet-start:Click2Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click2Step2 # Note: These values are not valid, but are shown for example purposes only! $VersionNumber = "1" # Construct your clickwrap JSON body +#ds-snippet-start:Click2Step3 $body = @" { "status" : "active" } "@ +#ds-snippet-end:Click2Step3 # a) Make a POST call to updateClickwrapVersionByNumber # b) Display the JSON structure of the created clickwrap +#ds-snippet-start:Click2Step4 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/versions/$VersionNumber" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method PUT -Body $body Write-Output "Response: " $result.Content +#ds-snippet-end:Click2Step4 diff --git a/examples/Click/eg003CreateNewClickwrapVersion.ps1 b/examples/Click/eg003CreateNewClickwrapVersion.ps1 index 5192a57..c3f39b7 100644 --- a/examples/Click/eg003CreateNewClickwrapVersion.ps1 +++ b/examples/Click/eg003CreateNewClickwrapVersion.ps1 @@ -12,12 +12,15 @@ if (Test-Path .\config\CLICKWRAP_ID) { } # Step 2. Construct your API headers +#ds-snippet-start:Click3Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click3Step2 # Construct your clickwrap JSON body +#ds-snippet-start:Click3Step3 $body = @" { "name": "Terms of Service", @@ -46,11 +49,14 @@ $body = @" "requireReacceptance": true } "@ +#ds-snippet-end:Click3Step3 # Step 4. Call the Click API # a) Make a POST call to the versions endpoint to update a specific clickwrap (create a version) for an account # b) Display the returned JSON structure of the versioned clickwrap +#ds-snippet-start:Click3Step4 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/versions" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -body $body -Method POST Write-Output "Response: " $result.Content +#ds-snippet-end:Click3Step4 diff --git a/examples/Click/eg004GetListOfClickwraps.ps1 b/examples/Click/eg004GetListOfClickwraps.ps1 index 39671d7..2842f8d 100644 --- a/examples/Click/eg004GetListOfClickwraps.ps1 +++ b/examples/Click/eg004GetListOfClickwraps.ps1 @@ -3,15 +3,19 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Step 2. Construct your API headers +#ds-snippet-start:Click4Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click4Step2 # Step 3. Call the Click API # a) Make a GET call to the clickwraps endpoint to retrieve all clickwraps for an account # b) Display the JSON structure of the returned clickwraps +#ds-snippet-start:Click4Step3 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method GET Write-Output "Response: " $result.Content +#ds-snippet-end:Click4Step3 diff --git a/examples/Click/eg005GetClickwrapResponses.ps1 b/examples/Click/eg005GetClickwrapResponses.ps1 index 9fd9a3f..80559f2 100644 --- a/examples/Click/eg005GetClickwrapResponses.ps1 +++ b/examples/Click/eg005GetClickwrapResponses.ps1 @@ -12,15 +12,19 @@ if (Test-Path .\config\CLICKWRAP_ID) { } # Step 2. Construct your API headers +#ds-snippet-start:Click5Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click5Step2 # Step 3. Call the Click API # a) Make a GET call to the users endpoint to retrieve responses (acceptance) of a specific clickwrap for an account # b) Display the returned JSON structure of the responses +#ds-snippet-start:Click5Step3 $uri = "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/users" $result = Invoke-WebRequest -headers $headers -Uri $uri -UseBasicParsing -Method GET Write-Output "Response: " -$result.Content \ No newline at end of file +$result.Content +#ds-snippet-end:Click5Step3 \ No newline at end of file diff --git a/examples/Click/eg006EmbedClickwrap.ps1 b/examples/Click/eg006EmbedClickwrap.ps1 index c12e4a8..5a30aab 100644 --- a/examples/Click/eg006EmbedClickwrap.ps1 +++ b/examples/Click/eg006EmbedClickwrap.ps1 @@ -12,10 +12,12 @@ else { } # Construct your API headers +#ds-snippet-start:Click6Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Click6Step2 $client_user_id = Read-Host "Please input a Client User Id (your own unique identifier) for the clickwrap" $full_name = Read-Host "Please input a full name" @@ -24,6 +26,7 @@ $company_name = Read-Host "Please input a company name" $title = Read-Host "Please input a job title" # Construct the request body +#ds-snippet-start:Click6Step3 $requestData = New-TemporaryFile $response = New-TemporaryFile @@ -38,6 +41,7 @@ $response = New-TemporaryFile date = $((Get-Date).ToString("yyyy-MM-ddThh:mm:ssK")) }; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:Click6Step3 # Call the Click API # a) Make a GET call to the users endpoint to retrieve responses (acceptance) of a specific clickwrap for an account @@ -45,6 +49,7 @@ $response = New-TemporaryFile try { + #ds-snippet-start:Click6Step4 Invoke-RestMethod ` -Uri "https://demo.docusign.net/clickapi/v1/accounts/$APIAccountId/clickwraps/$ClickWrapId/agreements" ` -UseBasicParsing ` @@ -56,6 +61,7 @@ try { } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:Click6Step4 Write-Output "Response: $(Get-Content -Raw $response)" diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index f56be67..f230c1a 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -2,15 +2,15 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID +# Step 2 Start # Construct your API headers -#ds-snippet-start:Rooms9Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -#ds-snippet-end:Rooms9Step2 +# Step 2 End -#ds-snippet-start:Rooms9Step3 +# Step 3 Start # Call the Rooms API to look up your forms library ID $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_libraries" @@ -70,9 +70,9 @@ try { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -#ds-snippet-end:Rooms9Step3 +# Step 3 End -#ds-snippet-start:Rooms9Step4 +# Step 4 Start $formGroupID = "" # Call the Rooms API to look up a list of form group IDs @@ -107,17 +107,17 @@ $formGroupID = $menu.Item($selection) Write-Output "" Write-Output "Form group Id: $formGroupID" Write-Output "" -#ds-snippet-end:Rooms9Step4 +# Step 4 End -#ds-snippet-start:Rooms9Step5 +# Step 5 Start # Construct your request body $body = @" {"formId": "$formID" } "@ -#ds-snippet-end:Rooms9Step5 +# Step 5 End -#ds-snippet-start:Rooms9Step6 +# Step 6 Start # Call the Rooms API $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/assign_form" @@ -136,4 +136,4 @@ try { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -#ds-snippet-end:Rooms9Step6 +# Step 6 End diff --git a/examples/eSignature/eg002SigningViaEmail.ps1 b/examples/eSignature/eg002SigningViaEmail.ps1 index 484beb3..85d5273 100644 --- a/examples/eSignature/eg002SigningViaEmail.ps1 +++ b/examples/eSignature/eg002SigningViaEmail.ps1 @@ -43,6 +43,7 @@ Write-Output "The envelope has three documents. Processing time will be about 15 Write-Output "Results:" # Concatenate the different parts of the request +#ds-snippet-start:eSign2tep2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -100,8 +101,10 @@ Write-Output "Results:" }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign2Step2 # Step 3. Create and send the envelope +#ds-snippet-start:eSign2Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -111,6 +114,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign2Step3 Write-Output "Response: $(Get-Content -Raw $response)" diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 new file mode 100644 index 0000000..fd04170 --- /dev/null +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -0,0 +1,209 @@ +$apiUri = "https://demo.docusign.net/restapi" +$accountUri = "https://account-d.docusign.com" + +$accessToken = Get-Content .\config\ds_access_token.txt +$accountId = Get-Content .\config\API_ACCOUNT_ID + +$requestData = New-TemporaryFile +$requestDataTemp = New-TemporaryFile +$response = New-TemporaryFile + +Write-Output "" +$agentName = Read-Host "Please enter the name of the new agent" +Write-Output "" +$agentEmail = Read-Host "Please enter the email address of the new agent" +Write-Output "" +$activation = Read-Host "Please input an activation code for the new agent. Save this code. You'll need it when activating the new agent." + +try { + # Check, if the agent already exists + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/users?email=${agentEmail}&status=Active" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + + Write-Output "" + Write-Output "Response:" + Write-Output "" + Get-Content $response + + $agentUserId = $(Get-Content $response | ConvertFrom-Json).users.userId +} catch { + # Create a new agent in the account + @{ + newUsers = @( + @{ + activationAccessCode = $activation; + userName = $agentName; + email = $agentEmail; + }; + ); + } | ConvertTo-Json -Depth 32 > $requestData + + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/users" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + + Write-Output "" + Write-Output "Response:" + Write-Output "" + Get-Content $response + + $agentUserId = $(Get-Content $response | ConvertFrom-Json).newUsers.userId +} + +Write-Output "" +Write-Output "Agent has been created. Please go to the agent's email to activate the agent, and press 1 to continue the example: " + +$choice = Read-Host +if ($choice -ne "1") { + Write-Output "Closing the example... " + exit 1 +} + +try { + # Get user id of the currently logged user + Invoke-RestMethod ` + -Uri "${accountUri}/oauth/userinfo" ` + -Method 'GET' ` + -Headers @{ + 'Cache-Control' = "no-store"; + 'Pragma' = "cache"; + 'Authorization' = "Bearer $accessToken"; + } ` + -Body @{ "from_date" = ${fromDate} } ` + -OutFile $response + + $userId = $(Get-Content $response | ConvertFrom-Json).sub +} catch { + Write-Output "Unable to retrieve Bulk Status." + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} + +$isUserActivated = 0; + +do { + try { + # Check, if authorization exists + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/users/${agentUserId}/authorizations/agent?permissions=manage" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + + if ([string]::IsNullOrEmpty($(Get-Content $response | ConvertFrom-Json).authorizations)) { + # Sharing the envelope with the agent + $body = @" + { + "agentUser": + { + "userId": "${agentUserId}", + "accountId": "${accountId}" + }, + "permission": "manage" + } +"@ + + Write-Output "" + $uri = "${apiUri}/v2.1/accounts/${accountId}/users/${userId}/authorization" + + $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" + $headers.add("Authorization", "Bearer $accessToken") + $headers.add("Content-Type", "application/json") + + Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST -UseBasicParsing -OutFile $response + + Write-Output "Response:" + Write-Output "$(Get-Content -Raw $response)" + } + + $isUserActivated = 1; + } catch { + Write-Output "Agent has been created. Please go to the agent's email to activate the agent, and press 1 to continue the example: " + + $choice = Read-Host + if ($choice -ne "1") { + Write-Output "Closing the example... " + exit 1 + } + } +} while (!$isUserActivated) + +# Principal is told to log out and log in as the new agent +Write-Output "" +Write-Output "Please go to the principal's developer account at admindemo.docusign.com and log out, then come back to this terminal. Press 1 to continue: " + +$choice = Read-Host +if ($choice -ne "1") { + Write-Output "Closing the example... " + exit 1 +} + +powershell.exe -Command .\utils\sharedAccess.ps1 + +try { + # Make the API call to check the envelope + # Get date in the ISO 8601 format + $fromDate = ((Get-Date).AddDays(-10d)).ToString("yyyy-MM-ddThh:mm:ssK") + + $response = New-TemporaryFile + + Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'GET' ` + -Headers @{ + 'X-DocuSign-Act-On-Behalf' = $userId; + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -Body @{ "from_date" = ${fromDate} } ` + -OutFile $response + + if ([string]::IsNullOrEmpty($response)) + { + Write-Output "" + Write-Output "Response body is empty because there are no envelopes in the account. Please run example 2 and re-run this example." + } else { + Write-Output "" + Write-Output "Response:" + Write-Output "" + + Get-Content $response + } +} catch { + Write-Output "Unable to retrieve Bulk Status." + + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} + +# cleanup +Remove-Item $requestData +Remove-Item $requestDataTemp +Remove-Item $response + +Write-Output "" +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 513e999..435fe55 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -445,7 +445,8 @@ function startSignature { Signing_In_Person = 39; Set_Document_Visibility = 40; Document_Generation = 41; - Pick_An_API = 42; + Shared_Access = 43; + Pick_An_API = 44; } $ApiExamplesView = $null; @@ -492,6 +493,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" Write-Output "$([int][ApiExamples]::Document_Generation)) Document_Generation" + Write-Output "$([int][ApiExamples]::Shared_Access)) Shared_Access" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -634,6 +636,10 @@ function startSignature { checkEmailAddresses powershell.exe .\examples\eSignature\eg042DocumentGeneration.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Shared_Access) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg043SharedAccess.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } @@ -785,7 +791,9 @@ function startAdmin { getUserProfileByUserId = 7; updateUserProductPermissionProfile = 8; deleteUserProductPermissionProfile = 9; - Pick_An_API = 10; + deleteUserDataFromOrganization = 10; + deleteUserDataFromAccount = 11; + Pick_An_API = 12; } $listAdminExamplesView = $null; do { @@ -800,6 +808,8 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Retrieve the user's DocuSign profile using a User ID" Write-Output "$([int][listAdminExamples]::updateUserProductPermissionProfile)) Update user product permission profiles using an email address" Write-Output "$([int][listAdminExamples]::deleteUserProductPermissionProfile)) Delete user product permission profiles using an email address" + Write-Output "$([int][listAdminExamples]::deleteUserDataFromOrganization)) Delete user data from organization" + Write-Output "$([int][listAdminExamples]::deleteUserDataFromAccount)) Delete user data from account" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -842,6 +852,14 @@ function startAdmin { checkOrgId powershell.exe -Command .\examples\Admin\eg009DeleteUserProductPermissionProfile.ps1 } + elseif ($listAdminExamplesView -eq [listAdminExamples]::deleteUserDataFromOrganization) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg010DeleteUserDataFromOrganization.ps1 + } + elseif ($listAdminExamplesView -eq [listAdminExamples]::deleteUserDataFromAccount) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg011DeleteUserDataFromAccount.ps1 + } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } diff --git a/utils/sharedAccess.ps1 b/utils/sharedAccess.ps1 new file mode 100644 index 0000000..96dd766 --- /dev/null +++ b/utils/sharedAccess.ps1 @@ -0,0 +1,42 @@ +$configFile = ".\config\settings.json" + +if ((Test-Path $configFile) -eq $False) { + Write-Output "Error: " + Write-Output "First copy the file '.\config\settings.example.json' to '$configFile'." + Write-Output "Next, fill in your API credentials, Signer name and email to continue." +} + +# Get required environment variables from .\config\settings.json file +$config = Get-Content $configFile -Raw | ConvertFrom-Json + +Enum AuthType { + CodeGrant = 1; + JWT = 2; + Exit = 3; +} + +$AuthTypeView = $null; +do { + Write-Output "" + Write-Output 'Choose an OAuth Strategy: ' + Write-Output "$([int][AuthType]::CodeGrant)) Authorization Code Grant" + Write-Output "$([int][AuthType]::JWT)) Json Web Token (JWT)" + Write-Output "$([int][AuthType]::Exit)) Exit" + [int]$AuthTypeView = Read-Host "Choose an OAuth Strategy. Then log in as the new user that you just created." +} while (-not [AuthType]::IsDefined([AuthType], $AuthTypeView)); + +if ($AuthTypeView -eq [AuthType]::Exit) { + exit 1; +} +elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { + powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) + if ((Test-Path "./config/ds_access_token.txt") -eq $false) { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } +} +elseif ($AuthTypeView -eq [AuthType]::JWT) { + powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) + if ((Test-Path "./config/ds_access_token.txt") -eq $false) { + Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop + } +} From 185981a7859ba55b182ac7755432cae4e1009adf Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 2 Jun 2023 08:53:26 -0700 Subject: [PATCH 255/462] DEVDOCS-10450 - adding codeDepot markers --- examples/eSignature/eg003ListEnvelopes.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg003ListEnvelopes.ps1 b/examples/eSignature/eg003ListEnvelopes.ps1 index 8f3ae9e..bd04510 100644 --- a/examples/eSignature/eg003ListEnvelopes.ps1 +++ b/examples/eSignature/eg003ListEnvelopes.ps1 @@ -8,6 +8,7 @@ $apiUri = "https://demo.docusign.net/restapi" $accessToken = Get-Content .\config\ds_access_token.txt # Step 2. List envelope status +#ds-snippet-start:eSign3Step2 # Obtain your accountId from demo.docusign.net -- the account id is shown in # the drop down on the upper right corner of the screen by your picture or # the default picture. @@ -28,5 +29,5 @@ $(Invoke-RestMethod ` 'Content-Type' = "application/json"; } ` -Body @{ "from_date" = ${fromDate} }).envelopes - +#ds-snippet-end:eSign3Step2 Write-Output "Done." From e7255a50aee335bdfc8f2bb79a47613a8d7cc8f2 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Fri, 2 Jun 2023 09:34:10 -0700 Subject: [PATCH 256/462] adding headers gist --- examples/eSignature/eg043SharedAccess.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 index fd04170..3d76903 100644 --- a/examples/eSignature/eg043SharedAccess.ps1 +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -8,6 +8,10 @@ $requestData = New-TemporaryFile $requestDataTemp = New-TemporaryFile $response = New-TemporaryFile +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") + Write-Output "" $agentName = Read-Host "Please enter the name of the new agent" Write-Output "" From 465acf4194f5ba4b9ce20f119e0497cabdf8012b Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 2 Jun 2023 10:27:32 -0700 Subject: [PATCH 257/462] DEVDOCS-10307 - adding codeDepot markers --- examples/eSignature/eg004EnvelopeInfo.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg004EnvelopeInfo.ps1 b/examples/eSignature/eg004EnvelopeInfo.ps1 index 0da30d7..05c841d 100644 --- a/examples/eSignature/eg004EnvelopeInfo.ps1 +++ b/examples/eSignature/eg004EnvelopeInfo.ps1 @@ -28,7 +28,7 @@ else { Write-Output "Sending the Envelopes::get request to DocuSign..." Write-Output "Results:" -# Step 2. Get envelope data +#ds-snippet-start:eSign4Step2 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}" ` -Method 'GET' ` @@ -36,6 +36,6 @@ Invoke-RestMethod ` 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; } -# ***DS.snippet.0.end +#ds-snippet-end:eSign4Step2 Write-Output "Done." From fbfa08fab4e8e9d269de890392af06bcbb289d80 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 2 Jun 2023 11:58:55 -0700 Subject: [PATCH 258/462] DEVDOCS-103535 - adding codeDepot markers --- examples/eSignature/eg005EnvelopeRecipients.ps1 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/eSignature/eg005EnvelopeRecipients.ps1 b/examples/eSignature/eg005EnvelopeRecipients.ps1 index 9d321bc..b3b181d 100644 --- a/examples/eSignature/eg005EnvelopeRecipients.ps1 +++ b/examples/eSignature/eg005EnvelopeRecipients.ps1 @@ -29,8 +29,7 @@ Write-Output "Sending the EnvelopeRecipients::list request to DocuSign..." Write-Output "Results:" -# Step 2. List envelope recipients -# ***DS.snippet.0.start +#ds-snippet-start:eSign5Step2 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/recipients" ` -Method 'GET' ` @@ -38,6 +37,6 @@ Invoke-RestMethod ` 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; } -# ***DS.snippet.0.end +#ds-snippet-end:eSign5Step2 Write-Output "Done." From cb205c6c62ce953929e3ffd0e5fb0af982fd67ea Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 2 Jun 2023 14:23:16 -0700 Subject: [PATCH 259/462] DEVDOCS-10609 - adding codeDepot markers --- examples/eSignature/eg007EnvelopeGetDoc.ps1 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/eSignature/eg007EnvelopeGetDoc.ps1 b/examples/eSignature/eg007EnvelopeGetDoc.ps1 index 8d1b016..0122ffc 100644 --- a/examples/eSignature/eg007EnvelopeGetDoc.ps1 +++ b/examples/eSignature/eg007EnvelopeGetDoc.ps1 @@ -26,10 +26,12 @@ else { exit 1 } +#ds-snippet-start:eSign7Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; } +#ds-snippet-end:eSign7Step2 $docChoice = "1" $outputFileExtension = "pdf" @@ -79,13 +81,12 @@ else { Write-Output "Sending the EnvelopeDocuments::get request to DocuSign..." # Call the eSignature API -# Step 3 start +#ds-snippet-start:eSign7Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/documents/${docChoice}" ` -Method 'GET' ` -Headers $headers ` -OutFile ${outputFile}${outputFileExtension} - -# Step 3 end +#ds-snippet-end:eSign7Step3 Write-Output "The document(s) are stored in file ${outputFile}${outputFileExtension}" Write-Output "Done." From c4727381d3fec048ba7464226345e72c19d02d3f Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 2 Jun 2023 14:55:46 -0700 Subject: [PATCH 260/462] DEVDOCS-10585 - adding codeDepot markers --- examples/eSignature/eg008CreateTemplate.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 9ec984f..371e9f1 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -62,6 +62,7 @@ Write-Output "Sending the template create request to DocuSign..." [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_fields.pdf"))) > $doc1Base64 # Concatenate the different parts of the request +#ds-snippet-start:eSign8Step2 @{ description = "Example template created via the eSignature API"; name = "Example Signer and CC template v2"; @@ -176,7 +177,9 @@ Write-Output "Sending the template create request to DocuSign..." }; status = "created"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign8Step2 +#ds-snippet-start:eSign8Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/templates" ` -Method 'POST' ` @@ -186,6 +189,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign8Step3 Write-Output "Results:" Get-Content $response From 842fadb1eada79eb534f5714bdc289b04f03ab16 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 2 Jun 2023 15:26:13 -0700 Subject: [PATCH 261/462] DEVDOCS-10469 - adding codeDepot makers --- examples/eSignature/eg009UseTemplate.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg009UseTemplate.ps1 b/examples/eSignature/eg009UseTemplate.ps1 index 2c3b65f..5935878 100644 --- a/examples/eSignature/eg009UseTemplate.ps1 +++ b/examples/eSignature/eg009UseTemplate.ps1 @@ -22,7 +22,6 @@ if (-not (Test-Path .\config\TEMPLATE_ID)) { exit 0 } -# ***DS.snippet.0.start # Step 2. Create the envelope definition from a template # temp files: $response = New-TemporaryFile @@ -30,6 +29,7 @@ $requestData = New-TemporaryFile Write-Output "Sending the envelope request to DocuSign..." +#ds-snippet-start:eSign9Step2 @{ templateId = "$(Get-Content .\config\TEMPLATE_ID)"; templateRoles = @( @@ -46,8 +46,10 @@ Write-Output "Sending the envelope request to DocuSign..." ); status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign9Step2 # Step 3. Create and send the envelope +#ds-snippet-start:eSign9Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -57,6 +59,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign9Step3 Write-Output "Response:" From e3e6cc07f420fff04368e9d9e3417629d7278167 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 2 Jun 2023 15:34:20 -0700 Subject: [PATCH 262/462] DEVDOCSS-10624 - adding codeDepot markers --- examples/eSignature/eg010SendBinaryDocs.ps1 | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/eSignature/eg010SendBinaryDocs.ps1 b/examples/eSignature/eg010SendBinaryDocs.ps1 index 9a83b37..6f2062b 100644 --- a/examples/eSignature/eg010SendBinaryDocs.ps1 +++ b/examples/eSignature/eg010SendBinaryDocs.ps1 @@ -23,9 +23,7 @@ $accessToken = Get-Content ".\config\ds_access_token.txt" # the default picture. $accountId = Get-Content ".\config\API_ACCOUNT_ID" -# ***DS.snippet.0.start - -# Step 3 start +#ds-snippet-start:eSign10Step3 # Construct the request body # document 1 (html) has tag **signature_1** # document 2 (docx) has tag /sn1/ @@ -144,14 +142,14 @@ Add-OemContent $requestData "${CRLF}" # Add closing boundary Add-OemContent $requestData "--$boundary--" Add-OemContent $requestData "${CRLF}" -# Step 3 end +#ds-snippet-end:eSign10Step3 -# Step 2 start +#ds-snippet-start:eSign10Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "multipart/form-data; boundary=${boundary}"; } -# Step 2 end +#ds-snippet-end:eSign10Step2 # Send request try { From 8421f149baf9ffebdfcb8617c3f305acabb1afff Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 5 Jun 2023 11:25:46 -0700 Subject: [PATCH 263/462] DEVDOCS-11294 - adding codeDepot markers --- examples/eSignature/eg012EmbeddedConsole.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg012EmbeddedConsole.ps1 b/examples/eSignature/eg012EmbeddedConsole.ps1 index 49f07b1..4f6ae4b 100644 --- a/examples/eSignature/eg012EmbeddedConsole.ps1 +++ b/examples/eSignature/eg012EmbeddedConsole.ps1 @@ -42,6 +42,7 @@ do { Write-Output "Requesting the console view url" +#ds-snippet-start:eSign12Step2 $requestBody = switch ($selectedView) { { [ViewType]::FrontPage } { @{ @@ -58,7 +59,6 @@ $requestBody = switch ($selectedView) { } $requestBody -# Step 2. Call the eSignature REST API $console = Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/views/console" ` -Method "POST" ` @@ -71,8 +71,8 @@ $console = Invoke-RestMethod ` Write-Output "Results:" Write-Output "Console received: $console" $consoleUrl = $console.url +#ds-snippet-end:eSign12Step2 -# ***DS.snippet.0.end Write-Output "The console URL is $consoleUrl" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." Start-Process $consoleUrl From 06f4865c2eb8a114ee042b2ee8d7ed74682b6e86 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Mon, 5 Jun 2023 11:37:18 -0700 Subject: [PATCH 264/462] adding codeDepot markers --- eg001EmbeddedSigning.ps1 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/eg001EmbeddedSigning.ps1 b/eg001EmbeddedSigning.ps1 index c475ab0..fb1820b 100644 --- a/eg001EmbeddedSigning.ps1 +++ b/eg001EmbeddedSigning.ps1 @@ -53,6 +53,7 @@ if ((Test-Path $docPath) -eq $false) { Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request +#ds-snippet-start:eSign1Step2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -86,8 +87,10 @@ Write-Output "Sending the envelope request to DocuSign..." }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign1Step2 # Step 3. Call DocuSign to create the envelope +#ds-snippet-start:eSign1Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -97,6 +100,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign1Step3 Write-Output "Response: $(Get-Content -Raw $response)" @@ -112,6 +116,7 @@ Write-Output "EnvelopeId: $envelopeId" # For this example, we'll use http://httpbin.org/get to show the # query parameters passed back from DocuSign +#ds-snippet-start:eSign1Step4 Write-Output "Requesting the url for the embedded signing..." $json = [ordered]@{ @@ -121,9 +126,10 @@ $json = [ordered]@{ 'userName' = $variables.SIGNER_NAME; 'clientUserId' = 1000 } | ConvertTo-Json -Compress - +#ds-snippet-end:eSign1Step4 # Step 5. Create the recipient view and begin the DocuSign signing +#ds-snippet-start:eSign1Step5 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` -Method 'POST' ` @@ -136,6 +142,7 @@ Invoke-RestMethod ` Write-Output "Response: $(Get-Content -Raw $response)" $signingUrl = $(Get-Content $response | ConvertFrom-Json).url +#ds-snippet-end:eSign1Step5 # ***DS.snippet.0.end Write-Output "The embedded signing URL is $signingUrl" @@ -148,4 +155,4 @@ Remove-Item $requestData Remove-Item $response Remove-Item $doc1Base64 -Write-Output "Done." +Write-Output "Done." \ No newline at end of file From 9920d38ad91d44dd57a1d287af1537a101db2ab1 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 5 Jun 2023 13:46:29 -0700 Subject: [PATCH 265/462] DEVDOCS-10480 - adding codeDepot markers --- examples/eSignature/eg013AddDocToTemplate.ps1 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg013AddDocToTemplate.ps1 b/examples/eSignature/eg013AddDocToTemplate.ps1 index 8e654dd..8ea3a3c 100644 --- a/examples/eSignature/eg013AddDocToTemplate.ps1 +++ b/examples/eSignature/eg013AddDocToTemplate.ps1 @@ -28,7 +28,6 @@ $requestData = New-TemporaryFile $response = New-TemporaryFile $doc1Base64 = New-TemporaryFile -# ***DS.snippet.0.start # Fetch docs and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\added_document.html"))) > $doc1Base64 @@ -38,6 +37,7 @@ Write-Output "added by using Composite Templates" # Concatenate the different parts of the request # document 1 (html) has tag **signature_1** +#ds-snippet-start:eSign13Step2 @{ compositeTemplates = @( @{ @@ -118,7 +118,10 @@ Write-Output "added by using Composite Templates" ); status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign13Step2 + # Step 3. Call DocuSign to create the envelope +#ds-snippet-start:eSign13Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -128,6 +131,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign13Step3 Write-Output "Results:" Get-Content $response @@ -143,6 +147,7 @@ Write-Output "EnvelopeId: $envelopeId" # the signer to returnUrl when the signing completes. # For this example, we'll use http://httpbin.org/get to show the # query parameters passed back from DocuSign +#ds-snippet-start:eSign13Step4 Write-Output "Requesting the url for the embedded signing..." @{ @@ -167,7 +172,7 @@ Write-Output "Response:" Get-Content $response $signingUrl = $(Get-Content $response | ConvertFrom-Json).url -# ***DS.snippet.0.end +#ds-snippet-end:eSign13Step4 Write-Output "The embedded signing URL is $signingUrl" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." From 26a79246fb8740fe6e689de0acc926cfa01eb548 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 5 Jun 2023 13:55:27 -0700 Subject: [PATCH 266/462] DEVDOCS-10325 - adding codeDepot markers --- examples/eSignature/eg014CollectPayment.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg014CollectPayment.ps1 b/examples/eSignature/eg014CollectPayment.ps1 index aabf743..e9f0def 100644 --- a/examples/eSignature/eg014CollectPayment.ps1 +++ b/examples/eSignature/eg014CollectPayment.ps1 @@ -33,6 +33,7 @@ $doc1Base64 = New-TemporaryFile Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request +#ds-snippet-start:eSign14Step2 @{ emailSubject = "Please complete your order"; documents = @( @@ -159,8 +160,9 @@ Write-Output "Sending the envelope request to DocuSign..." }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign14Step2 -# Step 4. Call the eSignature REST API +#ds-snippet-start:eSign14Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -170,7 +172,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response -# ***DS.snippet.0.end +#ds-snippet-end:eSign14Step3 Write-Output "Results:" Get-Content $response From f5ae78a07a2bea36227891c49aa100b9c5057535 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 5 Jun 2023 14:53:21 -0700 Subject: [PATCH 267/462] DEVDOCS-10580 - adding codeDepot markers --- examples/eSignature/eg015EnvelopeTabData.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/eSignature/eg015EnvelopeTabData.ps1 b/examples/eSignature/eg015EnvelopeTabData.ps1 index 7011c5e..a2c8213 100644 --- a/examples/eSignature/eg015EnvelopeTabData.ps1 +++ b/examples/eSignature/eg015EnvelopeTabData.ps1 @@ -20,18 +20,22 @@ else { } # Step 2. Create your authorization headers +#ds-snippet-start:eSign15Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Accept' = "application/json"; 'Content-Type' = "application/json"; } +#ds-snippet-end:eSign15Step2 # Step 3. a) Make a GET call to the form_data endpoint to retrieve your envelope tab values # b) Display the JSON response +#ds-snippet-start:eSign15Step3 $result = $(Invoke-WebRequest ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/form_data" ` -Method 'GET' ` -Headers $headers) +#ds-snippet-end:eSign15Step3 if ( $result.StatusCode -gt 201) { Write-Output "Retrieving envelope form data has failed." From 7f3064a6ba89bd5ddd7d28178f1b40cd4afb9962 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 5 Jun 2023 15:10:29 -0700 Subject: [PATCH 268/462] DEVDOCS-10560 - adding codeDepot markers --- examples/eSignature/eg016SetTabValues.ps1 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg016SetTabValues.ps1 b/examples/eSignature/eg016SetTabValues.ps1 index 2f177d5..5c68966 100644 --- a/examples/eSignature/eg016SetTabValues.ps1 +++ b/examples/eSignature/eg016SetTabValues.ps1 @@ -14,13 +14,15 @@ $accessToken = Get-Content .\config\ds_access_token.txt $accountId = Get-Content .\config\API_ACCOUNT_ID # Step 2. Create your authorization headers +#ds-snippet-start:eSign16Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; } +#ds-snippet-end:eSign16Step2 # Tabs and custom fields shown in the request body in step 4 -# Step 4. Construct the request body +# Step 3. Construct the request body # Temp files: $requestData = New-TemporaryFile @@ -33,6 +35,7 @@ Write-Output "Sending the envelope request to DocuSign..." [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_salary.docx"))) > $doc1Base64 +#ds-snippet-start:eSign16Step3 @{ customFields = @{ textCustomFields = @(@{ @@ -118,8 +121,10 @@ Write-Output "Sending the envelope request to DocuSign..." }; status = "Sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign16Step3 -# Step 5. Call the eSignature REST API +# Step 4. Call the eSignature REST API +#ds-snippet-start:eSign15Step4 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -129,6 +134,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign16Step4 Write-Output "Response:" Get-Content $response @@ -150,6 +156,7 @@ Write-Output $envelopeId > .\config\ENVELOPE_ID Write-Output "Requesting the url for the embedded signing..." +#ds-snippet-start:eSign16Step5 @{ returnUrl = "http://httpbin.org/get"; authenticationMethod = "none"; @@ -167,6 +174,7 @@ Invoke-RestMethod ` Write-Output "Response:" Get-Content $response +#ds-snippet-end:eSign16Step5 $signingUrl = $(Get-Content $response | ConvertFrom-Json).url From 20b42cbfe0784614321aa0b99a0ffb5c7373e57d Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 5 Jun 2023 15:50:00 -0700 Subject: [PATCH 269/462] DEVDOCS-10580 - adding codeDepot markers --- examples/eSignature/eg018EnvelopeCustomFieldData.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 b/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 index d8d0afb..7d9e72e 100644 --- a/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 +++ b/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 @@ -28,17 +28,21 @@ else { Write-Output "Sending the EnvelopeCustomFields::list request to DocuSign..." # Step 2. Create your authorization headers +#ds-snippet-start:eSign18Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; } +#ds-snippet-end:eSign18Step2 # Step 3. Call the eSignature REST API +#ds-snippet-start:eSign18Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/custom_fields" ` -Method 'GET' ` -Headers $headers ` -OutFile $response +#ds-snippet-end:eSign18Step3 Write-Output "Results:" From 1e1918bbfeb2e8193c93ecb78081f99e23e2dfab Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 5 Jun 2023 16:15:27 -0700 Subject: [PATCH 270/462] DEVDOCS-10366 - adding codeDepot markers --- .../eSignature/eg019SigningViaEmailWithAccessCode.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 b/examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 index 4d6f0ed..3ab04cf 100644 --- a/examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 +++ b/examples/eSignature/eg019SigningViaEmailWithAccessCode.ps1 @@ -19,10 +19,12 @@ $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Step 2. Construct your API headers # Construct your API headers +#ds-snippet-start:eSign19Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign19Step2 # Step 3. Construct the request body # temp files: @@ -34,6 +36,7 @@ $docBase64 = New-TemporaryFile $AccessCode = Read-Host "Please enter an access code for recipient authentication" # Construct your envelope JSON body +#ds-snippet-start:eSign19Step3 $body = @" { "documents": [{ @@ -76,6 +79,7 @@ $body = @" "status": "Sent" } "@ +#ds-snippet-end:eSign19Step3 Write-Output "" Write-Output "Request: " Write-Output $body @@ -83,6 +87,7 @@ Write-Output $body # Step 4. Call the eSignature REST API # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope +#ds-snippet-start:eSign19Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -97,4 +102,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:eSign19Step4 From 69b2df68f214a99a76ffa8fc96f5d2dfc2dec9fe Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Tue, 6 Jun 2023 11:28:16 -0700 Subject: [PATCH 271/462] DEVDOCS-10108 adding codeDepot markers --- examples/eSignature/eg006EnvelopeDocs.ps1 | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/eSignature/eg006EnvelopeDocs.ps1 b/examples/eSignature/eg006EnvelopeDocs.ps1 index 718f76b..92ce232 100644 --- a/examples/eSignature/eg006EnvelopeDocs.ps1 +++ b/examples/eSignature/eg006EnvelopeDocs.ps1 @@ -6,7 +6,7 @@ $apiUri = "https://demo.docusign.net/restapi" # can be manually created. # ***DS.snippet.0.start -# Step 1. Obtain your Oauth access token +# Obtain your Oauth access token $accessToken = Get-Content .\config\ds_access_token.txt # Obtain your accountId from demo.docusign.net -- the account id is shown in @@ -23,21 +23,22 @@ else { exit 1 } -# Step 2 start +#ds-snippet-start:eSign6Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; } -# Step 2 end +#ds-snippet-end:eSign6Step2 Write-Output "Sending the EnvelopeDocuments::list request to DocuSign..." Write-Output "Results:" -# Step 3. List envelope documents +# List envelope documents +#ds-snippet-start:eSign6Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/documents" ` -Method 'GET' ` -Headers $headers | ConvertTo-Json -# ***DS.snippet.0.end +#ds-snippet-end:eSign6Step3 Write-Output "Done." From 882cbe1a0bb60a0badf9424f48ba39db6d9da9ef Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 6 Jun 2023 12:30:49 -0700 Subject: [PATCH 272/462] DEVDOCS-10127 - adding codeDepot markers --- ...020SigningViaEmailWithPhoneAuthentication.ps1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index 91100c8..6b7b794 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -27,15 +27,15 @@ $docBase64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 # Construct your API headers -# Step 2 start +#ds-snippet-start:eSign20Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:eSign20Step2 # - Obtain your workflow ID -# Step 3 start +#ds-snippet-start:eSign20Step3 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" Write-Output "Attempting to retrieve your account's workflow ID" @@ -45,7 +45,7 @@ $result = Invoke-RestMethod -uri $uri -headers $headers -method GET $result.content #Obtain the workflow ID from the API response $workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "Phone Authentication"}).workflowId -# Step 3 end +#ds-snippet-end:eSign20Step3 if ($null -eq $workflowId) { @@ -56,7 +56,7 @@ $SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient auth $SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" # Construct your envelope JSON body -# Step 4 start +#ds-snippet-start:eSign20Step4 $body = @" { "documents": [{ @@ -108,14 +108,14 @@ $body = @" "status": "Sent" } "@ -# Step 4 end +#ds-snippet-end:eSign20Step4 Write-Output "" Write-Output "Request: " Write-Output $body # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope -# Step 5 start +#ds-snippet-start:eSign20Step5 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -131,7 +131,7 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 5 end +#ds-snippet-end:eSign20Step5 # cleanup Remove-Item $docBase64 From 3a357864ebfe4e05a73890cd2d991ca87f5b412c Mon Sep 17 00:00:00 2001 From: Graham Bowers <89472819+GbowersHLB@users.noreply.github.com> Date: Wed, 7 Jun 2023 10:38:19 -0400 Subject: [PATCH 273/462] Update eg003ListEnvelopes.ps1 Set to 24h time, if the HH is lowercase it causes glitches if you change the .AddDays to .AddHours For example, If you use -3h in the addhours it would only use AM and cause duplications. --- examples/eSignature/eg003ListEnvelopes.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg003ListEnvelopes.ps1 b/examples/eSignature/eg003ListEnvelopes.ps1 index bd04510..a2bea91 100644 --- a/examples/eSignature/eg003ListEnvelopes.ps1 +++ b/examples/eSignature/eg003ListEnvelopes.ps1 @@ -18,7 +18,7 @@ Write-Output "Sending the list envelope status request to DocuSign..." Write-Output "Results:" # Get date in the ISO 8601 format -$fromDate = ((Get-Date).AddDays(-10d)).ToString("yyyy-MM-ddThh:mm:ssK") +$fromDate = ((Get-Date).AddDays(-10d)).ToString("yyyy-MM-ddTHH:mm:ssK") $(Invoke-RestMethod ` From 056ebdf6577c84ed2a80f08895888a054afe6e11 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 8 Jun 2023 11:16:55 -0700 Subject: [PATCH 274/462] DEVDOCS-10574 - adding codeDepot markers --- examples/Rooms/eg002CreateRoomWithTemplateController.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 b/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 index 71d04b3..a455abf 100644 --- a/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 +++ b/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 @@ -5,10 +5,12 @@ $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers # - Construct your API headers +#ds-snippet-start:Rooms2Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Rooms2Step2 # - Retrieve rooms pre-requisite data # - Obtain our RoleID and OfficeID @@ -56,6 +58,7 @@ catch { } # Construct the JSON body for your room +#ds-snippet-start:Rooms2Step3 $body = @" { "name": "Sample Rooms Creation from Template", @@ -76,9 +79,11 @@ $body = @" } } "@ +#ds-snippet-end:Rooms2Step3 # a) Call the Rooms API # b) Display JSON response +#ds-snippet-start:Rooms2Step4 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms" try { @@ -95,4 +100,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:Rooms2Step4 From 73a82b2a193234e621f4910d12029ca2e47e3b2f Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 8 Jun 2023 11:20:17 -0700 Subject: [PATCH 275/462] DEVDOCS-10574 - adding codeDepot markers --- examples/Rooms/eg005GetRoomsWithFiltersController.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/Rooms/eg005GetRoomsWithFiltersController.ps1 b/examples/Rooms/eg005GetRoomsWithFiltersController.ps1 index d17ce8b..054bc24 100644 --- a/examples/Rooms/eg005GetRoomsWithFiltersController.ps1 +++ b/examples/Rooms/eg005GetRoomsWithFiltersController.ps1 @@ -3,17 +3,22 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers +#ds-snippet-start:Rooms5Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Rooms5Step2 +#ds-snippet-start:Rooms5Step3 # Set your filtering parameters $past = (Get-Date (Get-Date).AddDays(-10) -Format "yyyy-MM-dd") # Set the date 1 day forward to account for changes made today $current = (Get-Date (Get-Date).AddDays(1) -Format "yyyy-MM-dd") +#ds-snippet-end:Rooms5Step3 # Call the v2 Rooms API +#ds-snippet-start:Rooms5Step4 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms?fieldDataChangedStartDate=$past&fieldDataChangedEndDate=$current" try { @@ -30,4 +35,5 @@ catch { } Write-Output "Error : "$_ Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:Rooms5Step4 From b78d43e7e9fb882c435a7e2800a45c1f6cf52f46 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 8 Jun 2023 11:25:07 -0700 Subject: [PATCH 276/462] DEVDOCS-10454 and DEVDOCS-10589 - adding codeDepot markers --- examples/Rooms/eg001CreateRoomWithDataController.ps1 | 8 +++++++- .../Rooms/eg002CreateRoomWithTemplateController.ps1 | 10 ++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/examples/Rooms/eg001CreateRoomWithDataController.ps1 b/examples/Rooms/eg001CreateRoomWithDataController.ps1 index 19f7a75..d2833aa 100644 --- a/examples/Rooms/eg001CreateRoomWithDataController.ps1 +++ b/examples/Rooms/eg001CreateRoomWithDataController.ps1 @@ -3,10 +3,12 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers +#ds-snippet-start:Rooms1Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Rooms1Step2 # Get Role ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/roles" @@ -15,6 +17,7 @@ $roles = $($response.Content | ConvertFrom-Json).roles $roleId = $roles.Where({$_.name -eq "Default Admin"}).roleId # - Construct the request body for your room +#ds-snippet-start:Rooms1Step3 $body = @" { "name": "Sample Room Creation", @@ -33,9 +36,11 @@ $body = @" } } "@ +#ds-snippet-end:Rooms1Step3 # a) Call the Rooms API # b) Display the JSON response +#ds-snippet-start:Rooms1Step4 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms" try { @@ -54,4 +59,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:Rooms1Step4 diff --git a/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 b/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 index a455abf..432bbc8 100644 --- a/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 +++ b/examples/Rooms/eg002CreateRoomWithTemplateController.ps1 @@ -14,6 +14,7 @@ $headers.add("Content-Type", "application/json") # - Retrieve rooms pre-requisite data # - Obtain our RoleID and OfficeID +#ds-snippet-start:Rooms2Step3 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/roles" $uriOfficeId = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/offices" @@ -36,6 +37,7 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +#ds-snippet-end:Rooms2Step3 # - Retrieve a Rooms template ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/room_templates" @@ -58,7 +60,7 @@ catch { } # Construct the JSON body for your room -#ds-snippet-start:Rooms2Step3 +#ds-snippet-start:Rooms2Step4 $body = @" { "name": "Sample Rooms Creation from Template", @@ -79,11 +81,11 @@ $body = @" } } "@ -#ds-snippet-end:Rooms2Step3 +#ds-snippet-end:Rooms2Step4 # a) Call the Rooms API # b) Display JSON response -#ds-snippet-start:Rooms2Step4 +#ds-snippet-start:Rooms2Step5 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms" try { @@ -101,4 +103,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -#ds-snippet-end:Rooms2Step4 +#ds-snippet-end:Rooms2Step5 From c85995daf8a36bbce1c082b457a31d3b9e16cb0e Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 9 Jun 2023 10:00:22 -0700 Subject: [PATCH 277/462] DEVDOCS-10360 - adding codeDepot markers --- examples/Rooms/eg003ExportDataFromRoomController.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/Rooms/eg003ExportDataFromRoomController.ps1 b/examples/Rooms/eg003ExportDataFromRoomController.ps1 index bc7ca9b..e86f951 100644 --- a/examples/Rooms/eg003ExportDataFromRoomController.ps1 +++ b/examples/Rooms/eg003ExportDataFromRoomController.ps1 @@ -3,10 +3,12 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers +#ds-snippet-start:Rooms3Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Rooms3Step2 # Get Room ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms" @@ -15,6 +17,7 @@ $roomId = $($response.Content | ConvertFrom-Json).rooms[0].roomId # a) Call the Rooms API # b) Display JSON response +#ds-snippet-start:Rooms3Step3 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms/$roomId/field_data" try { @@ -31,4 +34,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:Rooms3Step3 From 062358c773d08ba7bedd7708eb66ed0fb4b6bb87 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 9 Jun 2023 10:02:41 -0700 Subject: [PATCH 278/462] DEVDOCS-10357 - adding codeDepot markers --- examples/Rooms/eg004AddFormsToRoomController.ps1 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/examples/Rooms/eg004AddFormsToRoomController.ps1 b/examples/Rooms/eg004AddFormsToRoomController.ps1 index bb0c3db..430041a 100644 --- a/examples/Rooms/eg004AddFormsToRoomController.ps1 +++ b/examples/Rooms/eg004AddFormsToRoomController.ps1 @@ -3,10 +3,12 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers +#ds-snippet-start:Rooms4Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Rooms4Step2 # Get Room ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms" @@ -14,6 +16,7 @@ $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -meth $roomId = $($response.Content | ConvertFrom-Json).rooms[0].roomId # Get Form Library ID +#ds-snippet-start:Rooms4Step3 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/form_libraries" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers $formLibraryId = $($response.Content | ConvertFrom-Json).formsLibrarySummaries[0].formsLibraryId @@ -27,8 +30,11 @@ $formId = $($response.Content | ConvertFrom-Json).forms[0].libraryFormId $body = @" {"formId":"$formId"} "@ +#ds-snippet-end:Rooms4Step3 + # Call the Rooms API +#ds-snippet-start:Rooms4Step4 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms/$roomId/forms" try { @@ -46,4 +52,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:Rooms4Step4 From 2c25967f1b592469ac4d3168e5717e3bc2413b9c Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 9 Jun 2023 11:00:25 -0700 Subject: [PATCH 279/462] DEVDOCS-10610 - adding codeDepot markers --- examples/Rooms/eg007CreateFormGroup.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/Rooms/eg007CreateFormGroup.ps1 b/examples/Rooms/eg007CreateFormGroup.ps1 index f5e05cf..5760198 100644 --- a/examples/Rooms/eg007CreateFormGroup.ps1 +++ b/examples/Rooms/eg007CreateFormGroup.ps1 @@ -3,25 +3,25 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID -# Step 2 Start # Construct your API headers +#ds-snippet-start:Rooms7Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 End +#ds-snippet-end:Rooms7Step2 -# Step 3 Start +#ds-snippet-start:Rooms7Step3 # Construct the request body $body = @" { "name": "Sample Room Form Group" } "@ -# Step 3 End +#ds-snippet-end:Rooms7Step3 -# Step 4 Start # Call the Rooms API +#ds-snippet-start:Rooms7Step4 $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups" @@ -46,4 +46,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 4 End +#ds-snippet-end:Rooms7Step4 From 71a53229c4562f631b46618400790ea7aed741da Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 9 Jun 2023 14:05:58 -0700 Subject: [PATCH 280/462] DEVDOCS-10284 - adding codeDepot markers --- examples/Rooms/eg008AccessFormGroup.ps1 | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 2470d0c..74373cf 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -2,17 +2,17 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID -# Step 2 Start # Construct your API headers +#ds-snippet-start:Rooms9Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 End +#ds-snippet-end:Rooms9Step2 -# Step 3 Start # Get an office ID +#ds-snippet-start:Rooms9Step3 $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/offices" @@ -35,11 +35,13 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 3 End +#ds-snippet-end:Rooms9Step3 # Get form group ID from the .\config\FORM_GROUP_ID file if (Test-Path .\config\FORM_GROUP_ID) { +#ds-snippet-start:Rooms9Step4 $formGroupID = Get-Content .\config\FORM_GROUP_ID +#ds-snippet-end:Rooms9Step4 } else { Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." @@ -47,8 +49,8 @@ else { } -# Step 5 Start # Call the Rooms API +#ds-snippet-start:Rooms9Step5 $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/grant_office_access/$officeID" try { @@ -73,4 +75,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 5 End +#ds-snippet-end:Rooms9Step5 From 071d2bd1d94bd08dd5916a05c62a732d6f7b8dc0 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 9 Jun 2023 14:07:19 -0700 Subject: [PATCH 281/462] DEVDOCS-10284 - fixing snippet name --- examples/Rooms/eg008AccessFormGroup.ps1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index 74373cf..c73aed8 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -3,16 +3,16 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers -#ds-snippet-start:Rooms9Step2 +#ds-snippet-start:Rooms8Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -#ds-snippet-end:Rooms9Step2 +#ds-snippet-end:Rooms8Step2 # Get an office ID -#ds-snippet-start:Rooms9Step3 +#ds-snippet-start:Rooms8Step3 $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/offices" @@ -35,13 +35,13 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -#ds-snippet-end:Rooms9Step3 +#ds-snippet-end:Rooms8Step3 # Get form group ID from the .\config\FORM_GROUP_ID file if (Test-Path .\config\FORM_GROUP_ID) { -#ds-snippet-start:Rooms9Step4 +#ds-snippet-start:Rooms8Step4 $formGroupID = Get-Content .\config\FORM_GROUP_ID -#ds-snippet-end:Rooms9Step4 +#ds-snippet-end:Rooms8Step4 } else { Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." @@ -50,7 +50,7 @@ else { # Call the Rooms API -#ds-snippet-start:Rooms9Step5 +#ds-snippet-start:Rooms8Step5 $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/grant_office_access/$officeID" try { @@ -75,4 +75,4 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -#ds-snippet-end:Rooms9Step5 +#ds-snippet-end:Rooms8Step5 From bb1c01af6d4bb527fd3bb36565d7a2a436cc16b3 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Fri, 9 Jun 2023 14:26:18 -0700 Subject: [PATCH 282/462] DEVDOCS-10249 adding codeDepot markers --- examples/Rooms/eg009AssignFormGroup.ps1 | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index f230c1a..8757a0a 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -2,16 +2,16 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID -# Step 2 Start # Construct your API headers +#ds-snippet-start:Rooms9Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 End +#ds-snippet-end:Rooms9Step2 -# Step 3 Start # Call the Rooms API to look up your forms library ID +#ds-snippet-start:Rooms9Step3 $base_path = "https://demo.rooms.docusign.com" $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_libraries" try { @@ -70,7 +70,7 @@ try { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 3 End +#ds-snippet-end:Rooms9Step3 # Step 4 Start $formGroupID = "" @@ -109,16 +109,17 @@ Write-Output "Form group Id: $formGroupID" Write-Output "" # Step 4 End -# Step 5 Start # Construct your request body +#ds-snippet-start:Rooms9Step5 $body = @" {"formId": "$formID" } "@ -# Step 5 End +#ds-snippet-end:Rooms9Step5 + -# Step 6 Start # Call the Rooms API +#ds-snippet-start:Rooms9Step6 $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/assign_form" try { @@ -136,4 +137,4 @@ try { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 6 End +#ds-snippet-end:Rooms9Step6 From 8361ea848bc8964d91e4965ee119349e94cc5728 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Fri, 9 Jun 2023 14:30:12 -0700 Subject: [PATCH 283/462] DEVDOCS-10249 adding codeDepot marker --- examples/Rooms/eg009AssignFormGroup.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index 8757a0a..655171e 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -72,7 +72,7 @@ try { } #ds-snippet-end:Rooms9Step3 -# Step 4 Start +#ds-snippet-start:Rooms9Step4 $formGroupID = "" # Call the Rooms API to look up a list of form group IDs @@ -107,7 +107,7 @@ $formGroupID = $menu.Item($selection) Write-Output "" Write-Output "Form group Id: $formGroupID" Write-Output "" -# Step 4 End +#ds-snippet-start:Rooms9Step4 # Construct your request body #ds-snippet-start:Rooms9Step5 From f903a094ec0a91ead05804ac0c741d92a46b2502 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Fri, 9 Jun 2023 14:39:14 -0700 Subject: [PATCH 284/462] fixing codeDepot --- examples/Rooms/eg009AssignFormGroup.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Rooms/eg009AssignFormGroup.ps1 b/examples/Rooms/eg009AssignFormGroup.ps1 index 655171e..b9ba05f 100644 --- a/examples/Rooms/eg009AssignFormGroup.ps1 +++ b/examples/Rooms/eg009AssignFormGroup.ps1 @@ -107,7 +107,7 @@ $formGroupID = $menu.Item($selection) Write-Output "" Write-Output "Form group Id: $formGroupID" Write-Output "" -#ds-snippet-start:Rooms9Step4 +#ds-snippet-end:Rooms9Step4 # Construct your request body #ds-snippet-start:Rooms9Step5 From e49cd177e892e5ce03af312024eba3990f7f95f1 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 12 Jun 2023 13:59:27 -0700 Subject: [PATCH 285/462] DEVDOCS-10204 - adding codeDepot markers --- examples/eSignature/eg028CreatingABrand.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg028CreatingABrand.ps1 b/examples/eSignature/eg028CreatingABrand.ps1 index ce8bb36..92d4a9b 100644 --- a/examples/eSignature/eg028CreatingABrand.ps1 +++ b/examples/eSignature/eg028CreatingABrand.ps1 @@ -9,23 +9,28 @@ $oAuthAccessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers +#ds-snippet-start:eSign28Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign28Step2 $brandName = Read-Host "Please enter a NEW brand name" # Construct the request body +#ds-snippet-start:eSign28Step3 $body = @" { "brandName": "${brandName}", "defaultBrandLanguage": "en" } "@ +#ds-snippet-end:eSign28Step3 # a) Call the eSignature API # b) Display the JSON response +#ds-snippet-start:eSign28Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/brands" try { @@ -43,4 +48,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:eSign28Step4 \ No newline at end of file From aef8cf6f72a2acef86937517e9e6f81f1af06d2c Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Mon, 12 Jun 2023 14:21:51 -0700 Subject: [PATCH 286/462] DEVDOCS-10367 - adding codeDepot markers --- examples/eSignature/eg034UseConditionalRecipients.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/eSignature/eg034UseConditionalRecipients.ps1 b/examples/eSignature/eg034UseConditionalRecipients.ps1 index bda28ff..7d8593a 100644 --- a/examples/eSignature/eg034UseConditionalRecipients.ps1 +++ b/examples/eSignature/eg034UseConditionalRecipients.ps1 @@ -32,16 +32,19 @@ Write-Output "SIGNER_NOT_CHECKED_EMAIL is $SIGNER_NOT_CHECKED_EMAIL" Write-Output "SIGNER_NOT_CHECKED_NAME is $SIGNER_NOT_CHECKED_NAME" # Step 2. Construct your API headers +#ds-snippet-start:eSign34Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign34Step2 # Create temp files $requestData = New-TemporaryFile $response = New-TemporaryFile # Step 3. Construct the request body +#ds-snippet-start:eSign34Step3 @{ documents = @( @@ -196,8 +199,10 @@ $response = New-TemporaryFile }; status = "Sent" } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign34Step3 # Step 4. Call the eSignature API +#ds-snippet-start:eSign34Step4 try { Write-Output "Request: " Write-Output $requestData @@ -228,6 +233,7 @@ catch [System.Net.WebException] { catch { Write-Output $_ } +#ds-snippet-end:eSign34Step4 # Delete temp files Remove-Item $requestData From e175b36e6055c7326f55dd195f4c2114408a6316 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Mon, 12 Jun 2023 15:02:02 -0700 Subject: [PATCH 287/462] DEVDOCS-10551 adding codeDepot markers --- examples/Admin/eg005AuditUsers.ps1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/Admin/eg005AuditUsers.ps1 b/examples/Admin/eg005AuditUsers.ps1 index 8595eac..ef743f7 100644 --- a/examples/Admin/eg005AuditUsers.ps1 +++ b/examples/Admin/eg005AuditUsers.ps1 @@ -16,14 +16,14 @@ if($null -eq $organizationId) } # Construct your API headers -# Step 2 start +# ds-snippet-start:Admin5Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 end +# ds-snippet-end:Admin5Step2 -# Step 3 Start +# ds-snippet-start:Admin5Step3 $modifiedSince = (Get-Date (Get-Date).AddDays(-10) -Format "yyyy-MM-dd") try { @@ -45,13 +45,13 @@ catch { Write-Output "Command : "$_.InvocationInfo.Line exit 1 } -# Step 3 end +# ds-snippet-end:Admin5Step3 -# Step 4 start +# ds-snippet-start:Admin5Step4 $userEmails = $modifiedUsers.email -# Step 4 end +# ds-snippet-end:Admin5Step4 -# Step 5 start +# ds-snippet-start:Admin5Step5 foreach ($emailAddress in $userEmails){ try { # Display the JSON response @@ -72,4 +72,4 @@ foreach ($emailAddress in $userEmails){ exit 1 } } -# Step 5 end \ No newline at end of file +# ds-snippet-end:Admin5Step5 \ No newline at end of file From e825f9df291f6f93b58da9f24f193a7ab98a9281 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Mon, 12 Jun 2023 15:13:24 -0700 Subject: [PATCH 288/462] DEVDOCS-10551 remove space aiya --- examples/Admin/eg005AuditUsers.ps1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/Admin/eg005AuditUsers.ps1 b/examples/Admin/eg005AuditUsers.ps1 index ef743f7..c0bb422 100644 --- a/examples/Admin/eg005AuditUsers.ps1 +++ b/examples/Admin/eg005AuditUsers.ps1 @@ -16,14 +16,14 @@ if($null -eq $organizationId) } # Construct your API headers -# ds-snippet-start:Admin5Step2 +#ds-snippet-start:Admin5Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# ds-snippet-end:Admin5Step2 +#ds-snippet-end:Admin5Step2 -# ds-snippet-start:Admin5Step3 +#ds-snippet-start:Admin5Step3 $modifiedSince = (Get-Date (Get-Date).AddDays(-10) -Format "yyyy-MM-dd") try { @@ -45,13 +45,13 @@ catch { Write-Output "Command : "$_.InvocationInfo.Line exit 1 } -# ds-snippet-end:Admin5Step3 +#ds-snippet-end:Admin5Step3 -# ds-snippet-start:Admin5Step4 +#ds-snippet-start:Admin5Step4 $userEmails = $modifiedUsers.email -# ds-snippet-end:Admin5Step4 +#ds-snippet-end:Admin5Step4 -# ds-snippet-start:Admin5Step5 +#ds-snippet-start:Admin5Step5 foreach ($emailAddress in $userEmails){ try { # Display the JSON response @@ -72,4 +72,4 @@ foreach ($emailAddress in $userEmails){ exit 1 } } -# ds-snippet-end:Admin5Step5 \ No newline at end of file +#ds-snippet-end:Admin5Step5 \ No newline at end of file From 037dee18611b6334515564dee5e01f2e47036b09 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Tue, 13 Jun 2023 14:16:57 -0700 Subject: [PATCH 289/462] DEVDOCS-10451 PS Admin 2 cD markers --- .../Admin/eg002CreateActiveCLMEsignUser.ps1 | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 b/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 index 68970ed..19fc491 100644 --- a/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 +++ b/examples/Admin/eg002CreateActiveCLMEsignUser.ps1 @@ -9,21 +9,23 @@ $base_path = "https://api-d.docusign.net/management" $organizationId=$variables.ORGANIZATION_ID # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin2Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin2Step2 + -# Step 3 Start try { # Display the JSON response # Write-Output "Response:" + #ds-snippet-start:Admin2Step3 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET - # $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 4 + $productProfiles = $($response.Content | ConvertFrom-Json).product_permission_profiles + #ds-snippet-end:Admin2Step3 } catch { Write-Output "Error:" @@ -36,7 +38,7 @@ catch { Write-Output "Command : "$_.InvocationInfo.Line exit 1 } -# Step 3 end + $esignPermissionProfiles = $null $clmPermissionProfiles = $null @@ -82,14 +84,15 @@ if($null -eq $clmPermissionProfiles){ $clmPermissionProfileId = $menu.Item($selection) } -# Step 4 Start + try { # Display the JSON response Write-Output "Response:" + #ds-snippet-start:Admin2Step4 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/dsgroups" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET - # $response.Content | ConvertFrom-Json | ConvertTo-Json $dsGroups = $($response.Content | ConvertFrom-Json).ds_groups + #ds-snippet-end:Admin2Step4 } catch { Write-Output "Error:" @@ -102,7 +105,7 @@ catch { Write-Output "Command : "$_.InvocationInfo.Line exit 1 } -# Step 4 end + if($dsGroups.count -eq 0){ Write-Output "You must create a DS Group before running this code example" @@ -125,8 +128,8 @@ $firstName = Read-Host "Enter the first name of the new user" $lastName = Read-Host "Enter the last name of the new user" $userEmail = Read-Host "Enter an email for the new user" -# - Construct the request body for the new user -# Step 5 Start +# Construct the request body for the new user +#ds-snippet-start:Admin2Step5 $body = @" { "user_name": "$userName", @@ -151,19 +154,20 @@ $body = @" ] } "@ -# Step 5 end +#ds-snippet-end:Admin2Step5 + -# Step 6 Start try { # Display the JSON response Write-Output "Response:" + #ds-snippet-start:Admin2Step6 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/users/" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + #ds-snippet-end:Admin2Step6 # Store user email to the file for future reference $($response.Content | ConvertFrom-Json).email > .\config\ESIGN_CLM_USER_EMAIL - Write-Output "Done" } catch { @@ -177,4 +181,3 @@ catch { Write-Output "Command : "$_.InvocationInfo.Line exit 1 } -# Step 6 end \ No newline at end of file From 63e9e847eba54114bd705c2930135e1c59805dd0 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 13 Jun 2023 15:01:44 -0700 Subject: [PATCH 290/462] DEVDOCS-10372 - adding codeDepot markers --- examples/Monitor/eg001GetMonitoringData.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index 9447ace..cae49b2 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -5,10 +5,12 @@ $response = New-TemporaryFile $accessToken = Get-Content .\config\ds_access_token.txt # Step 2. Construct your API headers +#ds-snippet-start:Monitor1Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Monitor1Step2 # Declare variables $complete=$false @@ -25,6 +27,7 @@ if (($accessToken -eq "") -or ($null -eq $accessToken)) { # After each call, save the cursor and use it to make the next # call from the point where the previous one left off when iterating through # the monitoring records +#ds-snippet-start:Monitor1Step3 DO { $iterations++ Write-Output "" @@ -77,6 +80,7 @@ DO { } } While ($complete -eq $false ) +#ds-snippet-start:Monitor1Step3 Remove-Item $response From 3f36e2ed48dcc19ee13249c799e322b5814ec3ef Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 13 Jun 2023 15:02:51 -0700 Subject: [PATCH 291/462] DEVDOCS-10372 - fixing --- examples/Monitor/eg001GetMonitoringData.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index cae49b2..b0131a0 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -80,7 +80,7 @@ DO { } } While ($complete -eq $false ) -#ds-snippet-start:Monitor1Step3 +#ds-snippet-end:Monitor1Step3 Remove-Item $response From a3627c6c9ac4ce94b8cdabd36d31e15f0a8bd12f Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 13 Jun 2023 15:17:04 -0700 Subject: [PATCH 292/462] DEVDOCS-10546 - adding codeDepot markers --- examples/eSignature/eg031BulkSending.ps1 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/eSignature/eg031BulkSending.ps1 b/examples/eSignature/eg031BulkSending.ps1 index ecca201..abcbf11 100644 --- a/examples/eSignature/eg031BulkSending.ps1 +++ b/examples/eSignature/eg031BulkSending.ps1 @@ -23,23 +23,23 @@ $doc1Base64 = New-TemporaryFile # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc1Base64 -# Step 2 start # Construct your API headers +#ds-snippet-start:eSign31Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json, text/plain, */*") $headers.add("Content-Type", "application/json;charset=UTF-8") $headers.add("Accept-Encoding", "gzip, deflate, br") $headers.add("Accept-Language", "en-US,en;q=0.9") -# Step 2 end +#ds-snippet-end:eSign31Step2 $continue = $true -# Step 3 start # Step 3. Submit a bulk list # Submit the Bulk List # Create a temporary file to store the JSON body # The JSON body must contain the recipient role, recipientId, name, and email. +#ds-snippet-start:eSign31Step3 $body = @" { "name": "sample.csv", @@ -99,10 +99,10 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 3 end -# Step 4 start +#ds-snippet-end:eSign31Step3 # Step 4. Create an envelope # Create your draft envelope +#ds-snippet-start:eSign31Step4 $body = @" { "documents": [{ @@ -175,12 +175,12 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } -# Step 4 end -# Step 5 start +#ds-snippet-end:eSign31Step4 # Step 5. Attach your bulk list ID to the envelope # Add an envelope custom field set to the value of your listId # This Custom Field is used for tracking your Bulk Send via the Envelopes::Get method # Create a temporary file to store the JSON body +#ds-snippet-start:eSign31Step5 $body = @" { "listCustomFields": [], @@ -214,11 +214,11 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 5 start -# Step 5 end +#ds-snippet-end:eSign31Step5 # Step 6. Initiate bulk send # Initiate the Bulk Send # Target endpoint: {ACCOUNT_ID}/bulk_send_lists/{LIST_ID}/send +#ds-snippet-start:eSign31Step6 $body = @" { "listId": "${listId}", @@ -250,11 +250,11 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } -# Step 6 end -# Step 7 start +#ds-snippet-end:eSign31Step6 # Step 7. Confirm successful batch send # Confirm successful batch send # Note: Depending on the number of Bulk Recipients, it may take some time for the Bulk Send to complete. For 2000 recipients this can take ~1 hour. +#ds-snippet-start:eSign31Step7 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/bulk_send_batch/$bulkBatchId" if ($continue -eq $true) { $response = $null @@ -278,4 +278,4 @@ if ($continue -eq $true) { Write-Output "Command : "$_.InvocationInfo.Line } } -# Step 7 end +#ds-snippet-end:eSign31Step7 From 0733c2bbfee26a38c24aa1dc692833c864ba3ab6 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Tue, 13 Jun 2023 16:32:37 -0700 Subject: [PATCH 293/462] DEVDOCS-10356 PS Admin 1 cD markers --- .../eg001CreateNewUserWithActiveStatus.ps1 | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 b/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 index 1c08178..f161340 100644 --- a/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 +++ b/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 @@ -3,11 +3,11 @@ $accessToken = Get-Content .\config\ds_access_token.txt $accountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers -# Step 2 start +#ds-snippet-start:Admin1Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") -# Step 2 end +#ds-snippet-end:Admin1Step2 # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -22,11 +22,12 @@ $base_path = "https://api-d.docusign.net/management" $organizationId = $variables.ORGANIZATION_ID # Get groups and permission profile IDs - +#ds-snippet-start:Admin1Step3 $uri = "${base_path}/v2/organizations/${organizationId}/accounts/${accountId}/permissions" $result = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $permissionsObj = $($result.Content | ConvertFrom-Json).permissions +#ds-snippet-end:Admin1Step3 # Setup a temporary menu option to pick a permission profile $menu = @{} @@ -38,12 +39,12 @@ $menu = @{} } while ($selection -gt $permissionsObj.count -or $selection -lt 1); $permissionsId = $menu.Item($selection) - +#ds-snippet-start:Admin1Step4 $uri = "${base_path}/v2/organizations/${organizationId}/accounts/${accountId}/groups" $result = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $groupsObj = $($result.Content | ConvertFrom-Json).groups - +#ds-snippet-end:Admin1Step4 # Setup a temporary menu option to pick a group $menu = @{} @@ -63,7 +64,7 @@ $lastName = Read-Host "Enter the last name of the new user" $userEmail = Read-Host "Enter an email for the new user" # Construct the request body for the new user -# Step 3 start +#ds-snippet-start:Admin1Step5 $body = @" { "user_name": "$userName", @@ -86,12 +87,12 @@ $body = @" ] } "@ -# Step 3 end +#ds-snippet-end:Admin1Step5 $result = "" # Call the DocuSign Admin API -# Step 4 start +#ds-snippet-start:Admin1Step6 $uri = "${base_path}/v2/organizations/${organizationId}/users" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method POST $result.Content -# Step 4 end +#ds-snippet-end:Admin1Step6 From 6160750da866ba09412ad37e7cb972290bc81ecd Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 14 Jun 2023 15:10:46 -0700 Subject: [PATCH 294/462] DEVDOCS-10581 - adding codeDepot markers --- examples/eSignature/eg025SettingPermissionProfiles.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg025SettingPermissionProfiles.ps1 b/examples/eSignature/eg025SettingPermissionProfiles.ps1 index 8848f74..192d76f 100644 --- a/examples/eSignature/eg025SettingPermissionProfiles.ps1 +++ b/examples/eSignature/eg025SettingPermissionProfiles.ps1 @@ -19,15 +19,18 @@ else { # Step 2. Construct your API headers # Construct your API headers +#ds-snippet-start:eSign25Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign25Step2 $GROUP_NAME = Read-Host "Please enter a NEW group name" # Step 3. Construct the request body # Create a Group and get a Group ID +#ds-snippet-start:eSign25Step3 $body = @" { "groups": [ @@ -37,6 +40,7 @@ $body = @" ] } "@ +#ds-snippet-end:eSign25Step3 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/groups" $response = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST $groupId = $($response.Content | ConvertFrom-Json).groups.groupId @@ -57,6 +61,7 @@ $body = @" # a) Call the eSignature API # b) Display the JSON response +#ds-snippet-start:eSign25Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/groups" $response = $null @@ -74,4 +79,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:eSign25Step4 \ No newline at end of file From 5decc6e5a1bba813ba11b024decd39a884d803b3 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 14 Jun 2023 15:27:20 -0700 Subject: [PATCH 295/462] DEVDOCS-10594 - adding codeDepot markers --- examples/eSignature/eg035ScheduledSending.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index 5cf6cff..48979f3 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -35,7 +35,7 @@ Write-Output "Results:" # Step 2. Create the envelope definition $ResumeDate = Read-Host "Please enter the future date for when you want to schedule this envelope as YYYY-MM-DD: " -# Step 2 start +#ds-snippet-start:eSign35Step2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -81,10 +81,10 @@ $ResumeDate = Read-Host "Please enter the future date for when you want to sched }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData -# Step 2 end +#ds-snippet-end:eSign35Step2 # Step 3. Create and send the envelope -# Step 3 start +#ds-snippet-start:eSign35Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -96,7 +96,7 @@ Invoke-RestMethod ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" -# Step 3 end +#ds-snippet-end:eSign35Step3 # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId From 5f21680ee3ac3466fe7aa376e9ed714d0a65782b Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 14 Jun 2023 15:29:49 -0700 Subject: [PATCH 296/462] DEVDOCS-10572 - adding codeDepot markers --- examples/eSignature/eg026UpdatingIndividualPermission.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg026UpdatingIndividualPermission.ps1 b/examples/eSignature/eg026UpdatingIndividualPermission.ps1 index 3b514f3..f07ff02 100644 --- a/examples/eSignature/eg026UpdatingIndividualPermission.ps1 +++ b/examples/eSignature/eg026UpdatingIndividualPermission.ps1 @@ -9,10 +9,12 @@ $oAuthAccessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers +#ds-snippet-start:eSign26Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign26Step2 # Check that we have an profile name if (Test-Path .\config\PROFILE_NAME) { @@ -33,6 +35,7 @@ else { } # Construct your request body +#ds-snippet-start:eSign26Step3 $body = @" { "permissionProfileName": "${profileName}", @@ -65,9 +68,11 @@ $body = @" } } "@ +#ds-snippet-end:eSign26Step3 # a) Call the eSignature API # b) Display the JSON response +#ds-snippet-start:eSign26Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/permission_profiles/${profileId}" try { @@ -84,4 +89,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:eSign26Step4 \ No newline at end of file From 85403074ed3ac774079a5b4dac00ee13c581c2bc Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 14 Jun 2023 15:42:07 -0700 Subject: [PATCH 297/462] DEVDOCS-10595 - adding codeDepot markers --- examples/eSignature/eg030ApplyingBrandTemplate.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg030ApplyingBrandTemplate.ps1 b/examples/eSignature/eg030ApplyingBrandTemplate.ps1 index c220e10..b47058e 100644 --- a/examples/eSignature/eg030ApplyingBrandTemplate.ps1 +++ b/examples/eSignature/eg030ApplyingBrandTemplate.ps1 @@ -34,12 +34,15 @@ else { } # Construct your API headers +#ds-snippet-start:eSign30Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign30Step2 # Construct your request body +#ds-snippet-start:eSign30Step3 $body = @" { "templateId": "${templateID}", @@ -59,9 +62,11 @@ $body = @" "status": "sent" } "@ +#ds-snippet-end:eSign30Step3 # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope +#ds-snippet-start:eSign30Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { @@ -77,4 +82,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:eSign30Step4 \ No newline at end of file From b8729030b40b808df07b5f5a5818c9fc91e7b24b Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 14 Jun 2023 15:51:28 -0700 Subject: [PATCH 298/462] DEVDOCS-10464 - adding codeDepot markers --- .../eg006CreateAnExternalFormFillSessionController.ps1 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 index 0e85ee7..ef7281b 100644 --- a/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 +++ b/examples/Rooms/eg006CreateAnExternalFormFillSessionController.ps1 @@ -3,10 +3,12 @@ $accessToken = Get-Content .\config\ds_access_token.txt $APIAccountId = Get-Content .\config\API_ACCOUNT_ID # Construct your API headers +#ds-snippet-start:Rooms6Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:Rooms6Step2 # Get Room ID $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/rooms" @@ -25,6 +27,7 @@ $formId = $($response.Content | ConvertFrom-Json).forms[0].libraryFormId # Construct your request body +#ds-snippet-start:Rooms6Step3 $body = @" { @@ -33,24 +36,29 @@ $body = "xFrameAllowedUrl": "https://iframetester.com/" } "@ +#ds-snippet-end:Rooms6Step3 # a) Call the v2 Rooms API # b) Display the JSON response +#ds-snippet-start:Rooms6Step4 $uri = "https://demo.rooms.docusign.com/restapi/v2/accounts/$APIAccountId/external_form_fill_sessions" try { Write-Output "Response:" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -body $body -method POST $response.Content | ConvertFrom-Json | ConvertTo-Json +#ds-snippet-end:Rooms6Step4 +#ds-snippet-start:Rooms6Step5 $signingUrl = $($response.Content | ConvertFrom-Json).url + $redirectUrl = "https://iframetester.com/?url="+$signingUrl Write-Output "The embedded form URL is $redirectUrl" Write-Output "Attempting to automatically open your browser..." Start-Process $redirectUrl - +#ds-snippet-end:Rooms6Step5 } catch { Write-Output "Unable to access form fill view link " From 633ea5644fb8d3a7edb46db861f4654475b2f5f0 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 14 Jun 2023 16:40:58 -0700 Subject: [PATCH 299/462] DEVDOCS-10463 - adding codeDepot markers --- ...eg023SigningViaEmailWithIDVAuthentication.ps1 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 index 792c803..aeb8e3b 100644 --- a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 +++ b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -26,17 +26,17 @@ $docBase64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 # - Construct your API headers -# Step 2 start +#ds-snippet-start:eSign23Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json, text/plain, */*") $headers.add("Content-Type", "application/json;charset=UTF-8") $headers.add("Accept-Encoding", "gzip, deflate, br") $headers.add("Accept-Language", "en-US,en;q=0.9") -# Step 2 end +#ds-snippet-end:eSign23Step2 # - Obtain your workflow ID -# Step 3 start +#ds-snippet-start:eSign23Step3 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" Write-Output "Attempting to retrieve your account's workflow ID" @@ -46,7 +46,7 @@ $result = Invoke-RestMethod -uri $uri -headers $headers -method GET $result.content #Obtain the workflow ID from the API response $workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "DocuSign ID Verification"}).workflowId -# Step 3 end +#ds-snippet-end:eSign23Step3 if ($null -eq $workflowId) { @@ -59,7 +59,7 @@ $SIGNER_EMAIL = Read-Host "Please enter email address for the signer" # - Construct your envelope JSON body # Note: If you did not successfully obtain your workflow ID, this step will fail. -# Step 4 start +#ds-snippet-start:eSign23Step4 $body = @" { "documents": [{ @@ -102,14 +102,14 @@ $body = @" "status": "Sent" } "@ -# Step 4 end +#ds-snippet-end:eSign23Step4 Write-Output "" Write-Output "Request: " Write-Output $body # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope -# Step 5 start +#ds-snippet-start:eSign23Step5 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -125,7 +125,7 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } -# Step 5 end +#ds-snippet-end:eSign23Step5 # cleanup Remove-Item $docBase64 \ No newline at end of file From 6b8c6254f415c80899c9f951848fd247a80b29d0 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 15 Jun 2023 13:47:18 -0700 Subject: [PATCH 300/462] DEVDOCS-10477 - adding codeDepot markers --- examples/eSignature/eg033UnpauseSignatureWorkflow.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/eSignature/eg033UnpauseSignatureWorkflow.ps1 b/examples/eSignature/eg033UnpauseSignatureWorkflow.ps1 index 485befe..c0df3de 100644 --- a/examples/eSignature/eg033UnpauseSignatureWorkflow.ps1 +++ b/examples/eSignature/eg033UnpauseSignatureWorkflow.ps1 @@ -22,20 +22,25 @@ else { } # Step 2. Construct your API headers +#ds-snippet-start:eSign33Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign33Step2 # Step 3.Construct the JSON body for your envelope +#ds-snippet-start:eSign33Step3 @{ workflow = @{ workflowStatus = "in_progress"; }; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign33Step3 # Step 4. Call the eSignature API +#ds-snippet-start:eSign33Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}?resend_envelope=true" Invoke-RestMethod ` -Uri $uri ` @@ -47,6 +52,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign33Step4 Write-Output "" Write-Output "Request: $(Get-Content -Raw $requestData)" From 619c70def10c6fd7b31445b566d02ef140c783d7 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 15 Jun 2023 13:51:23 -0700 Subject: [PATCH 301/462] DEVDOCS-10478 - adding codeDepot markers --- examples/eSignature/eg024CreatingPermissionProfiles.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg024CreatingPermissionProfiles.ps1 b/examples/eSignature/eg024CreatingPermissionProfiles.ps1 index 910d397..6b3c8e3 100644 --- a/examples/eSignature/eg024CreatingPermissionProfiles.ps1 +++ b/examples/eSignature/eg024CreatingPermissionProfiles.ps1 @@ -12,12 +12,15 @@ $PROFILE_NAME = Read-Host "Please enter a new permission profile name: " $PROFILE_NAME > .\config\PROFILE_NAME # Construct your API headers +#ds-snippet-start:eSign24Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign24Step2 # Construct the request body for your permission profile +#ds-snippet-start:eSign24Step3 $body = @" { "permissionProfileName": "${PROFILE_NAME}", @@ -50,9 +53,11 @@ $body = @" } } "@ +#ds-snippet-end:eSign24Step3 # a) Call the eSignature API # b) Display the JSON response +#ds-snippet-start:eSign24Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/permission_profiles/" try { @@ -70,4 +75,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:eSign24Step4 \ No newline at end of file From 37d001bdfbcdad7f6680015e9c302088b79f23ce Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 15 Jun 2023 14:45:23 -0700 Subject: [PATCH 302/462] DEVDOCS-10511 - adding codeDepot markers --- examples/eSignature/eg037SMSDelivery.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index c74e776..199c152 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -42,7 +42,7 @@ $SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer: $SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient: " $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient: " -# Step 2 start +#ds-snippet-start:eSign37Step2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -109,7 +109,7 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData -# Step 2 end +#ds-snippet-end:eSign37Step2 Write-Output "Sending the envelope request to DocuSign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." @@ -118,7 +118,7 @@ Write-Output $requestData # Step 3. Create and send the envelope # Create and send the envelope -# Step 3 start +#ds-snippet-start:eSign37Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -130,7 +130,7 @@ Invoke-RestMethod ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" -# Step 3 end +#ds-snippet-end:eSign37Step3 # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId From 9901c6487ef403148adf6c3259f321989f771ed5 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 16 Jun 2023 13:37:19 -0700 Subject: [PATCH 303/462] DEVDOCS-10437 - adding codeDepot markers --- examples/eSignature/eg027DeletingPermissions.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg027DeletingPermissions.ps1 b/examples/eSignature/eg027DeletingPermissions.ps1 index 9dfbdac..6d062da 100644 --- a/examples/eSignature/eg027DeletingPermissions.ps1 +++ b/examples/eSignature/eg027DeletingPermissions.ps1 @@ -18,13 +18,16 @@ else { } # Construct your API headers +#ds-snippet-start:eSign27Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign27Step2 # a) Call the eSignature API # b) Display the JSON response +#ds-snippet-start:eSign27Step3 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/permission_profiles/$profileID" try { @@ -40,4 +43,5 @@ catch { } Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line -} \ No newline at end of file +} +#ds-snippet-end:eSign27Step3 \ No newline at end of file From bafdb4e517e6526831e3c82d29be61b2904c5e2b Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 16 Jun 2023 13:50:36 -0700 Subject: [PATCH 304/462] DEVDOCS-10525 - adding codeDepot markers --- examples/eSignature/eg038ResponsiveSigning.ps1 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/eSignature/eg038ResponsiveSigning.ps1 b/examples/eSignature/eg038ResponsiveSigning.ps1 index 8c5e132..30dd811 100644 --- a/examples/eSignature/eg038ResponsiveSigning.ps1 +++ b/examples/eSignature/eg038ResponsiveSigning.ps1 @@ -37,6 +37,7 @@ $doc_html = New-TemporaryFile Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request +#ds-snippet-start:eSign38Step2 @{ emailSubject = "Example Signing Document"; documents = @( @@ -70,8 +71,10 @@ Write-Output "Sending the envelope request to DocuSign..." }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign38Step2 # Step 3. Call DocuSign to create the envelope +#ds-snippet-start:eSign38Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -81,6 +84,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign38Step3 Write-Output "Response: $(Get-Content -Raw $response)" @@ -121,7 +125,6 @@ Invoke-RestMethod ` Write-Output "Response: $(Get-Content -Raw $response)" $signingUrl = $(Get-Content $response | ConvertFrom-Json).url -# ***DS.snippet.0.end Write-Output "The embedded signing URL is $signingUrl" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." From 781b3e2b5e33c801cc4be362338284dc8c3eedd2 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Fri, 16 Jun 2023 14:10:26 -0700 Subject: [PATCH 305/462] DEVDOCS-10497 - adding codeDepot markers --- examples/eSignature/eg032PauseSignatureWorkflow.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/eSignature/eg032PauseSignatureWorkflow.ps1 b/examples/eSignature/eg032PauseSignatureWorkflow.ps1 index 490df95..eb4ef1d 100644 --- a/examples/eSignature/eg032PauseSignatureWorkflow.ps1 +++ b/examples/eSignature/eg032PauseSignatureWorkflow.ps1 @@ -20,12 +20,15 @@ $requestData = New-TemporaryFile $response = New-TemporaryFile # Step 2. Construct your API headers +#ds-snippet-start:eSign32Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign32Step2 # Step 3. Construct the request body +#ds-snippet-start:eSign32Step3 @{ documents = @( @@ -91,8 +94,10 @@ $headers.add("Content-Type", "application/json") }; status = "sent" } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign32Step3 # Step 4. Call the eSignature API +#ds-snippet-start:eSign32Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" Invoke-RestMethod ` -Uri $uri ` @@ -103,6 +108,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign32Step4 # Get EnvelopeID $envelopeId = $($(Get-Content $response) | ConvertFrom-Json).envelopeId From 4a75b5d90bd5d2e7b7bce23e185530cd7a83d075 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 20 Jun 2023 10:51:55 -0700 Subject: [PATCH 306/462] DEVDOCS-11318 - removing Monitor2 --- examples/Monitor/eg002WebQueryEndpoint.ps1 | 73 ---------------------- launcher.ps1 | 4 +- 2 files changed, 1 insertion(+), 76 deletions(-) delete mode 100644 examples/Monitor/eg002WebQueryEndpoint.ps1 diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 deleted file mode 100644 index fb0188e..0000000 --- a/examples/Monitor/eg002WebQueryEndpoint.ps1 +++ /dev/null @@ -1,73 +0,0 @@ -# Step 1. Get required environment variables from .\config\settings.json file -$accessToken = Get-Content .\config\ds_access_token.txt -$accountId = Get-Content .\config\API_ACCOUNT_ID - -# Step 2. Construct your API headers -$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" -$headers.add("Authorization", "Bearer $accessToken") -$headers.add("Accept", "application/json") -$headers.add("Content-Type", "application/json") - -$beginDate = Read-Host "Please enter the start date as YYYY-MM-DD" -$endDate = Read-Host "Please enter the end date as YYYY-MM-DD" - -# You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint -if (($accessToken -eq "") -or ($null -eq $accessToken)) { - Write-Output "You must provide an access token" -} - -# Step 3 start -# Filter parameters -$body = @" -{ - "filters": [ - { - "FilterName": "Time", - "BeginTime": "$beginDate", - "EndTime": "$endDate" - }, - { - "FilterName": "Has", - "ColumnName": "AccountId", - "Value": "$accountId" - } - ], - "aggregations": [ - { - "aggregationName": "Raw", - "limit": "100", - "orderby": [ - "Timestamp, desc" - ] - } - ] -} -"@ -# Step 3 end - -# a) Make a POST call to the postWebQuery endpoint to query the companies data. -# b) Display the JSON structure of the created envelope -# Step 4 start -$uri = "https://lens-d.docusign.net/api/v2.0/datasets/monitor/web_query" -try { - Write-Output "Response:" - $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST - $result.content -} -catch { - $int = 0 - foreach($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { - Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] - } - $int++ - } - Write-Output "You do not have Monitor enabled for your account, follow https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/ to get it enabled." - Write-Output "Command : "$_.InvocationInfo.Line -} -# Step 4 end - -Write-Output "" -Write-Output "" -Write-Output "Done." -Write-Output "" diff --git a/launcher.ps1 b/launcher.ps1 index 435fe55..1f3a74a 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -757,15 +757,13 @@ function startMonitor { do { Enum listMonitorExamples { getMonitoringData = 1; - postWebQuery = 2; - Pick_An_API = 3; + Pick_An_API = 2; } $listMonitorExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMonitorExamples]::getMonitoringData)) Get Monitoring Data" - Write-Output "$([int][listMonitorExamples]::postWebQuery)) Query Monitoring Data with Filters" Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" [int]$listMonitorExamplesView = Read-Host "Select the action" } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); From 318ea35ad224851e4d9951fc597e4eeb65d0197a Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 20 Jun 2023 11:36:28 -0700 Subject: [PATCH 307/462] DEVDOCS-10459 - adding codeDepot markers --- examples/eSignature/eg039SigningInPerson.ps1 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 index 494448d..95af498 100644 --- a/examples/eSignature/eg039SigningInPerson.ps1 +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -43,6 +43,7 @@ $hostName = $(Get-Content $response | ConvertFrom-Json).name Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request +#ds-snippet-start:eSign39Step2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -76,8 +77,10 @@ Write-Output "Sending the envelope request to DocuSign..." }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign39Step2 # Step 3. Call DocuSign to create the envelope +#ds-snippet-start:eSign39Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -93,6 +96,7 @@ Write-Output "Response: $(Get-Content -Raw $response)" # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId Write-Output "EnvelopeId: $envelopeId" +#ds-snippet-end:eSign39Step3 # Step 4. Create a recipient view definition # The signer will directly open this link from the browser to sign. @@ -104,15 +108,17 @@ Write-Output "EnvelopeId: $envelopeId" Write-Output "Requesting the url for the embedded signing..." +#ds-snippet-start:eSign39Step4 $json = [ordered]@{ 'returnUrl' = 'http://httpbin.org/get'; 'authenticationMethod' = 'none'; 'email' = $hostEmail; 'userName' = $hostName; } | ConvertTo-Json -Compress - +#ds-snippet-end:eSign39Step4 # Step 5. Create the recipient view and begin the DocuSign signing +#ds-snippet-start:eSign39Step5 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` -Method 'POST' ` @@ -125,8 +131,8 @@ Invoke-RestMethod ` Write-Output "Response: $(Get-Content -Raw $response)" $signingUrl = $(Get-Content $response | ConvertFrom-Json).url +#ds-snippet-end:eSign39Step4 -# ***DS.snippet.0.end Write-Output "The embedded signing URL is $signingUrl" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." From 2e14ad713cb5153fa8377254eaa08ddaa1b62c0c Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 20 Jun 2023 11:38:10 -0700 Subject: [PATCH 308/462] DEVDOCS-10459 - adding codeDepot markers --- examples/eSignature/eg039SigningInPerson.ps1 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 index 494448d..95af498 100644 --- a/examples/eSignature/eg039SigningInPerson.ps1 +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -43,6 +43,7 @@ $hostName = $(Get-Content $response | ConvertFrom-Json).name Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request +#ds-snippet-start:eSign39Step2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -76,8 +77,10 @@ Write-Output "Sending the envelope request to DocuSign..." }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign39Step2 # Step 3. Call DocuSign to create the envelope +#ds-snippet-start:eSign39Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -93,6 +96,7 @@ Write-Output "Response: $(Get-Content -Raw $response)" # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId Write-Output "EnvelopeId: $envelopeId" +#ds-snippet-end:eSign39Step3 # Step 4. Create a recipient view definition # The signer will directly open this link from the browser to sign. @@ -104,15 +108,17 @@ Write-Output "EnvelopeId: $envelopeId" Write-Output "Requesting the url for the embedded signing..." +#ds-snippet-start:eSign39Step4 $json = [ordered]@{ 'returnUrl' = 'http://httpbin.org/get'; 'authenticationMethod' = 'none'; 'email' = $hostEmail; 'userName' = $hostName; } | ConvertTo-Json -Compress - +#ds-snippet-end:eSign39Step4 # Step 5. Create the recipient view and begin the DocuSign signing +#ds-snippet-start:eSign39Step5 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` -Method 'POST' ` @@ -125,8 +131,8 @@ Invoke-RestMethod ` Write-Output "Response: $(Get-Content -Raw $response)" $signingUrl = $(Get-Content $response | ConvertFrom-Json).url +#ds-snippet-end:eSign39Step4 -# ***DS.snippet.0.end Write-Output "The embedded signing URL is $signingUrl" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." From e9cb17a77f99e576cfa34b25164ca0240dfa25df Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 20 Jun 2023 11:52:07 -0700 Subject: [PATCH 309/462] DEVDOCS-10541 - adding codeDepot markers --- ...eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 b/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 index 47b2f55..3c53f1f 100644 --- a/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 +++ b/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 @@ -26,12 +26,15 @@ $docBase64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 # Construct your API headers +#ds-snippet-start:eSign22Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign22Step2 # Construct your envelope JSON body +#ds-snippet-start:eSign22Step3 $body = @" { "documents": [{ @@ -69,12 +72,14 @@ $body = @" "status": "Sent" } "@ +#ds-snippet-end:eSign22Step3 Write-Output "" Write-Output "Request: " Write-Output $body # a) Make a POST call to the createEnvelopes endpoint to create a new envelope. # b) Display the JSON structure of the created envelope +#ds-snippet-start:eSign22Step4 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" @@ -90,6 +95,7 @@ catch { Write-Output "Error : "$_.ErrorDetails.Message Write-Output "Command : "$_.InvocationInfo.Line } +#ds-snippet-end:eSign22Step4 # cleanup Remove-Item $docBase64 \ No newline at end of file From 1efe81b3ac181d32104d9d9453308e54040c7ce2 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 21 Jun 2023 14:35:26 -0700 Subject: [PATCH 310/462] Removing one of the Monitor API code examples as the endpoint is no longer available --- examples/Monitor/eg002WebQueryEndpoint.ps1 | 73 ---------------------- launcher.ps1 | 4 +- 2 files changed, 1 insertion(+), 76 deletions(-) delete mode 100644 examples/Monitor/eg002WebQueryEndpoint.ps1 diff --git a/examples/Monitor/eg002WebQueryEndpoint.ps1 b/examples/Monitor/eg002WebQueryEndpoint.ps1 deleted file mode 100644 index fb0188e..0000000 --- a/examples/Monitor/eg002WebQueryEndpoint.ps1 +++ /dev/null @@ -1,73 +0,0 @@ -# Step 1. Get required environment variables from .\config\settings.json file -$accessToken = Get-Content .\config\ds_access_token.txt -$accountId = Get-Content .\config\API_ACCOUNT_ID - -# Step 2. Construct your API headers -$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" -$headers.add("Authorization", "Bearer $accessToken") -$headers.add("Accept", "application/json") -$headers.add("Content-Type", "application/json") - -$beginDate = Read-Host "Please enter the start date as YYYY-MM-DD" -$endDate = Read-Host "Please enter the end date as YYYY-MM-DD" - -# You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint -if (($accessToken -eq "") -or ($null -eq $accessToken)) { - Write-Output "You must provide an access token" -} - -# Step 3 start -# Filter parameters -$body = @" -{ - "filters": [ - { - "FilterName": "Time", - "BeginTime": "$beginDate", - "EndTime": "$endDate" - }, - { - "FilterName": "Has", - "ColumnName": "AccountId", - "Value": "$accountId" - } - ], - "aggregations": [ - { - "aggregationName": "Raw", - "limit": "100", - "orderby": [ - "Timestamp, desc" - ] - } - ] -} -"@ -# Step 3 end - -# a) Make a POST call to the postWebQuery endpoint to query the companies data. -# b) Display the JSON structure of the created envelope -# Step 4 start -$uri = "https://lens-d.docusign.net/api/v2.0/datasets/monitor/web_query" -try { - Write-Output "Response:" - $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST - $result.content -} -catch { - $int = 0 - foreach($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { - Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] - } - $int++ - } - Write-Output "You do not have Monitor enabled for your account, follow https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/ to get it enabled." - Write-Output "Command : "$_.InvocationInfo.Line -} -# Step 4 end - -Write-Output "" -Write-Output "" -Write-Output "Done." -Write-Output "" diff --git a/launcher.ps1 b/launcher.ps1 index 435fe55..1f3a74a 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -757,15 +757,13 @@ function startMonitor { do { Enum listMonitorExamples { getMonitoringData = 1; - postWebQuery = 2; - Pick_An_API = 3; + Pick_An_API = 2; } $listMonitorExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMonitorExamples]::getMonitoringData)) Get Monitoring Data" - Write-Output "$([int][listMonitorExamples]::postWebQuery)) Query Monitoring Data with Filters" Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" [int]$listMonitorExamplesView = Read-Host "Select the action" } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); From c27dcf28abc7e48fd16d8d42ee7f47c0fc23987f Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Wed, 28 Jun 2023 11:59:51 -0700 Subject: [PATCH 311/462] adding codeDepot markers --- examples/eSignature/eg036DelayedRouting.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index b49746b..add2d0d 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -39,7 +39,7 @@ $Signer2Name = Read-Host "Please enter the name for the second signer: " $DelayInHours= Read-Host "Please enter the delay (in hours): " $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 -# Step 2 start +#ds-snippet-start:eSign36Step2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -103,10 +103,10 @@ $DelayTimeSpan = New-TimeSpan -Hours $DelayInHours -Minutes 0 }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData -# Step 2 end +#ds-snippet-end:eSign36Step2 -# Step 3. Create and send the envelope -# Step 3 start +# Create and send the envelope +#ds-snippet-start:eSign36Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -116,7 +116,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response -# Step 3 end +#ds-snippet-end:eSign36Step3 Write-Output "Response: $(Get-Content -Raw $response)" From 3efd6d3d4c7a22cc30a9a6f08c53a42412c13fd4 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Wed, 28 Jun 2023 12:57:31 -0700 Subject: [PATCH 312/462] adding Notary code examples to GH --- OAuth/code_grant.ps1 | 3 + examples/Notary/Jurisdictions.ps1 | 33 ++++ examples/Notary/inviteNotaryToPool.ps1 | 80 ++++++++++ .../Notary/signatureRequestToNotaryGroup.ps1 | 147 ++++++++++++++++++ launcher.ps1 | 42 ++++- 5 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 examples/Notary/Jurisdictions.ps1 create mode 100644 examples/Notary/inviteNotaryToPool.ps1 create mode 100644 examples/Notary/signatureRequestToNotaryGroup.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index a15df4f..d326a47 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -32,6 +32,9 @@ elseif ($apiVersion -eq "monitor") { elseif ($apiVersion -eq "admin") { $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact" } +elseif ($apiVersion -eq "notary") { + $scopes = "signature%20organization_read%20notary_read%20notary_write" +} $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $redirectUri = "http://${IP}:${PORT}/authorization-code/callback" diff --git a/examples/Notary/Jurisdictions.ps1 b/examples/Notary/Jurisdictions.ps1 new file mode 100644 index 0000000..7b1997a --- /dev/null +++ b/examples/Notary/Jurisdictions.ps1 @@ -0,0 +1,33 @@ +# Returns the status of whether or not jurisdictions are disabled + +$apiUri = "https://notary-d.docusign.net/restapi" + +# Step 1. Obtain your Oauth access token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountID = Get-Content .\config\API_ACCOUNT_ID + +# Step 2. Make a GET request to the jurisdictions endpoint + +$response = New-TemporaryFile + +Write-Output "Sending the jurisdiction status request to DocuSign..." +Write-Output "" +Write-Output "Results:" + +Invoke-RestMethod ` + -UseBasicParsing ` + -Uri "${apiUri}/v1.0/accounts/${accountID}/jurisdictions" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" +Write-Output "" +Write-Output "Done..." diff --git a/examples/Notary/inviteNotaryToPool.ps1 b/examples/Notary/inviteNotaryToPool.ps1 new file mode 100644 index 0000000..aec01bb --- /dev/null +++ b/examples/Notary/inviteNotaryToPool.ps1 @@ -0,0 +1,80 @@ +# Invite a notary to join your pool + +$apiUri = "https://notary-d.docusign.net/restapi" + + +# Step 1. Obtain your Oauth access token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt +$accountID = Get-Content .\config\API_ACCOUNT_ID +$response = New-TemporaryFile + +# Construct your API headers + +# Step 2 Start +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +# Step 2 End + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# Check that we have an organization id in the settings.json config file +if (!$variables.ORGANIZATION_ID) { + Write-Output "Organization ID is needed. Please add the ORGANIZATION_ID variable to the settings.json" + exit -1 +} + +$organizationId = $variables.ORGANIZATION_ID + + +Write-Output "" +Write-Output "Retrieving your notary pool:" +Write-Output "" + +# Step 3 Start +Invoke-RestMethod ` + -UseBasicParsing ` + -Uri "${apiUri}/v1.0/organizations/${organizationId}/pools/" ` + -Headers $headers ` + -Method 'GET' ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" +$POOL_ID = $(Get-Content $response | ConvertFrom-Json).pools[0].poolId +# Step 3 End + +# Step 4 Start +write-Output "" +$NOTARY_NAME = Read-Host "Enter a name for the notary" +$NOTARY_EMAIL = Read-Host "Enter an email address for the notary" + +$body = @" +{ + "email" : "${NOTARY_EMAIL}", + "name" : "${NOTARY_NAME}", +} +"@ +# Step 4 End + +# Step 5 Start +write-Output "" +write-Output "Inviting ${NOTARY_NAME} to your organization's notary pool" +write-Output "" +write-Output "Pool id is ${POOL_ID}" +write-Output "" +Invoke-RestMethod ` + -Uri "${apiUri}/v1.0/organizations/${organizationId}/pools/${POOL_ID}/invites" ` + -Headers $headers ` + -Method 'POST' ` + -Body $body ` + -Outfile $response + +Write-Output "Response: $(Get-Content -Raw $response)" +# Step 5 End + +# cleanup +Remove-Item $response +Write-Output "" +Write-Output "Done..." \ No newline at end of file diff --git a/examples/Notary/signatureRequestToNotaryGroup.ps1 b/examples/Notary/signatureRequestToNotaryGroup.ps1 new file mode 100644 index 0000000..b7aa8b6 --- /dev/null +++ b/examples/Notary/signatureRequestToNotaryGroup.ps1 @@ -0,0 +1,147 @@ +$apiUri = "https://demo.docusign.net/restapi" + +# Send an envelope with three documents + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# Check that we have a Notary name and email in the settings.json config file +if ((!$variables.NOTARY_EMAIL) -or (!$variables.NOTARY_NAME)) { + Write-Output "NOTARY_EMAIL and NOTARY_NAME are needed. Please add the NOTARY_EMAIL and NOTARY_NAME variables to the settings.json" + exit -1 +} + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Accept' = "application/json"; + 'Content-Type' = "application/json"; +} + + +# document 1 (html) has tag **signature_1** +# document 2 (docx) has tag /sn1/ +# document 3 (pdf) has tag /sn1/ +# +# The envelope has two recipients. +# recipient 1 - signer +# recipient 2 - cc +# The envelope will be sent first to the signer. +# After it is signed, a copy is sent to the cc person. + + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$docBase64 = New-TemporaryFile + +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $docBase64 + +Write-Output "Sending the envelope request to DocuSign..." +Write-Output "The envelope has three documents. Processing time will be about 15 seconds." +Write-Output "Results:" + +# Concatenate the different parts of the request + + +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $docBase64)"; + name = "Order acknowledgement"; + fileExtension = "html"; + documentId = "1"; + }; + ); + recipients = @{ + notaries = @( + @{ + email = $variables.NOTARY_EMAIL; + name = $variables.NOTARY_NAME; + recipientId = "1"; + routingOrder = "1"; + tabs = @{ + notarySealTabs = @( + @{ + xPosition = "150"; + yPosition = "50"; + documentId = "1"; + pageNumber = "1"; + }; + ); + signHereTabs = @( + @{ + xPosition = "300"; + yPosition = "150"; + documentId = "1"; + pageNumber = "1"; + }; + ) + }; + userId = $NOTARY_API_ACCOUNT_ID; + notaryType = "remote"; + }; + ); + signers = @( + @{ + clientUserId = "12345"; + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "2"; + routingOrder = "1"; + notaryId = "1"; + tabs = @{ + signHereTabs = @( + @{ + documentId = "1"; + xPosition = "50"; + yPosition = "50"; + pageNumber = "1"; + }; + @{ + stampType = "stamp"; + documentId = "1"; + xPosition = "200"; + yPosition = "150"; + pageNumber = "1"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData + + +# Step 3. Create and send the envelope +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers $headers ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId + +# Save the envelope id for use by other scripts +Write-Output "EnvelopeId: $envelopeId" +Write-Output $envelopeId > .\config\ENVELOPE_ID + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $docBase64 + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 1f3a74a..f2f4b9a 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -101,7 +101,8 @@ function startLauncher { Click = 3; Monitor = 4; Admin = 5; - Exit = 6; + Notary = 6; + Exit = 7; } $listApiView = $null; @@ -137,6 +138,7 @@ function startLauncher { Write-Output "$([int][listApi]::Click)) Click" Write-Output "$([int][listApi]::Monitor)) Monitor" Write-Output "$([int][listApi]::Admin)) Admin" + Write-Output "$([int][listApi]::Notary)) Notary" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); @@ -156,6 +158,9 @@ function startLauncher { elseif ($listApiView -eq [listApi]::Admin) { startAuth "admin" } + elseif ($listApiView -eq [listApi]::Notary) { + startAuth "notary" + } elseif ($listApiView -eq [listApi]::Exit) { exit 1 } @@ -221,6 +226,9 @@ function startAuth ($apiVersion) { elseif ($listApiView -eq [listApi]::Admin) { startAdmin } + elseif ($listApiView -eq [listApi]::Notary) { + startNotary + } } function startCFRSignature { @@ -862,5 +870,37 @@ function startAdmin { startLauncher } +function startNotary { + do { + Enum listNotaryExamples { + signatureRequestToNotaryGroup = 1; + inviteNotaryToPool = 2; + jurisdictions = 3; + Pick_An_API = 4; + } + $listNotaryExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listNotaryExamples]::signatureRequestToNotaryGroup)) Send_Signature_Request_To_Notary_Group" + Write-Output "$([int][listNotaryExamples]::inviteNotaryToPool)) Invite_Notary_To_Pool" + Write-Output "$([int][listNotaryExamples]::jurisdictions)) Jurisdictions" + Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" + [int]$listNotaryExamplesView = Read-Host "Select the action" + } while (-not [listNotaryExamples]::IsDefined([listNotaryExamples], $listNotaryExamplesView)); + + if ($listNotaryExamplesView -eq [listNotaryExamples]::signatureRequestToNotaryGroup) { + powershell.exe -Command .\examples\Notary\signatureRequestToNotaryGroup.ps1 + } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::Invite_Notary_To_Pool) { + powershell.exe -Command .\examples\Notary\inviteNotaryToPool.ps1 + } + } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::jurisdictions) { + powershell.exe -Command .\examples\Notary\Jurisdictions.ps1 + } + } until ($listNotaryExamplesView -eq [listNotaryExamples]::Pick_An_API) + startLauncher +} + + Write-Output "Welcome to the DocuSign PowerShell Launcher" startLauncher From cae158d7a6627e782736b8dde2c9d636c0349588 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Wed, 28 Jun 2023 13:39:44 -0700 Subject: [PATCH 313/462] small fix --- launcher.ps1 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/launcher.ps1 b/launcher.ps1 index f2f4b9a..9f1d183 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -882,8 +882,8 @@ function startNotary { do { Write-Output "" Write-Output 'Select the action: ' - Write-Output "$([int][listNotaryExamples]::signatureRequestToNotaryGroup)) Send_Signature_Request_To_Notary_Group" - Write-Output "$([int][listNotaryExamples]::inviteNotaryToPool)) Invite_Notary_To_Pool" + Write-Output "$([int][listNotaryExamples]::signatureRequestToNotaryGroup)) Send_Signature Request to Notary group" + Write-Output "$([int][listNotaryExamples]::inviteNotaryToPool)) Invite Notary to Pool" Write-Output "$([int][listNotaryExamples]::jurisdictions)) Jurisdictions" Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" [int]$listNotaryExamplesView = Read-Host "Select the action" @@ -891,9 +891,8 @@ function startNotary { if ($listNotaryExamplesView -eq [listNotaryExamples]::signatureRequestToNotaryGroup) { powershell.exe -Command .\examples\Notary\signatureRequestToNotaryGroup.ps1 - } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::Invite_Notary_To_Pool) { - powershell.exe -Command .\examples\Notary\inviteNotaryToPool.ps1 - } + } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::inviteNotaryToPool) { + powershell.exe -Command .\examples\Notary\inviteNotaryToPool.ps1 } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::jurisdictions) { powershell.exe -Command .\examples\Notary\Jurisdictions.ps1 } From a514224cfd5efece11234ac1913337250853a3c5 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Wed, 28 Jun 2023 17:01:52 -0700 Subject: [PATCH 314/462] updated files for JWT --- OAuth/jwt.ps1 | 3 +++ examples/Notary/signatureRequestToNotaryGroup.ps1 | 6 +++--- launcher.ps1 | 8 +++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 2c63d4c..b8d6fea 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -45,6 +45,9 @@ if ($apiVersion -eq "rooms") { elseif ($apiVersion -eq "admin") { $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact" } + elseif ($apiVersion -eq "notary") { + $scopes = "signature%20organization_read%20notary_read%20notary_write" + } # Step 1. Request application consent $PORT = '8080' diff --git a/examples/Notary/signatureRequestToNotaryGroup.ps1 b/examples/Notary/signatureRequestToNotaryGroup.ps1 index b7aa8b6..41fdeca 100644 --- a/examples/Notary/signatureRequestToNotaryGroup.ps1 +++ b/examples/Notary/signatureRequestToNotaryGroup.ps1 @@ -6,8 +6,8 @@ $apiUri = "https://demo.docusign.net/restapi" $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json # Check that we have a Notary name and email in the settings.json config file -if ((!$variables.NOTARY_EMAIL) -or (!$variables.NOTARY_NAME)) { - Write-Output "NOTARY_EMAIL and NOTARY_NAME are needed. Please add the NOTARY_EMAIL and NOTARY_NAME variables to the settings.json" +if ((!$variables.NOTARY_EMAIL) -or (!$variables.NOTARY_NAME) -or (!$variables.NOTARY_API_ACCOUNT_ID)) { + Write-Output "NOTARY_EMAIL, NOTARY_NAME, and NOTARY_API_ACCOUNT_ID are needed. Please add the NOTARY_EMAIL, NOTARY_NAME, and NOTARY_API_ACCOUNT_ID variables to the settings.json" exit -1 } @@ -86,7 +86,7 @@ Write-Output "Results:" }; ) }; - userId = $NOTARY_API_ACCOUNT_ID; + userId = $variables.NOTARY_API_ACCOUNT_ID; notaryType = "remote"; }; ); diff --git a/launcher.ps1 b/launcher.ps1 index 9f1d183..de69bdd 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -882,13 +882,15 @@ function startNotary { do { Write-Output "" Write-Output 'Select the action: ' - Write-Output "$([int][listNotaryExamples]::signatureRequestToNotaryGroup)) Send_Signature Request to Notary group" - Write-Output "$([int][listNotaryExamples]::inviteNotaryToPool)) Invite Notary to Pool" + Write-Output "$([int][listNotaryExamples]::signatureRequestToNotaryGroup)) Send signature request to Notary group" + Write-Output "$([int][listNotaryExamples]::inviteNotaryToPool)) Invite Notary to pool" Write-Output "$([int][listNotaryExamples]::jurisdictions)) Jurisdictions" - Write-Output "$([int][listMonitorExamples]::Pick_An_API)) Pick_An_API" + Write-Output "$([int][listNotaryExamples]::Pick_An_API)) Pick_An_API" [int]$listNotaryExamplesView = Read-Host "Select the action" } while (-not [listNotaryExamples]::IsDefined([listNotaryExamples], $listNotaryExamplesView)); + # if ($listNotaryExamplesView -eq [listNotaryExamples]::jurisdictions) { + # powershell.exe -Command .\examples\Notary\Jurisdictions.ps1 if ($listNotaryExamplesView -eq [listNotaryExamples]::signatureRequestToNotaryGroup) { powershell.exe -Command .\examples\Notary\signatureRequestToNotaryGroup.ps1 } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::inviteNotaryToPool) { From a9ce39c5dfe8a42c86ce520037c0a43b3cabb115 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Wed, 28 Jun 2023 17:52:08 -0700 Subject: [PATCH 315/462] added cD mkrs, added closed beta --- examples/Notary/Jurisdictions.ps1 | 8 ++++---- examples/Notary/inviteNotaryToPool.ps1 | 16 ++++++++-------- .../Notary/signatureRequestToNotaryGroup.ps1 | 14 ++++++++------ launcher.ps1 | 2 +- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/examples/Notary/Jurisdictions.ps1 b/examples/Notary/Jurisdictions.ps1 index 7b1997a..bb81e4f 100644 --- a/examples/Notary/Jurisdictions.ps1 +++ b/examples/Notary/Jurisdictions.ps1 @@ -2,7 +2,7 @@ $apiUri = "https://notary-d.docusign.net/restapi" -# Step 1. Obtain your Oauth access token +# Obtain your Oauth access token # Note: Substitute these values with your own $accessToken = Get-Content .\config\ds_access_token.txt @@ -10,14 +10,14 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountID = Get-Content .\config\API_ACCOUNT_ID -# Step 2. Make a GET request to the jurisdictions endpoint +# Make a GET request to the jurisdictions endpoint $response = New-TemporaryFile Write-Output "Sending the jurisdiction status request to DocuSign..." Write-Output "" Write-Output "Results:" - +#ds-snippet-start:Notary3Step2 Invoke-RestMethod ` -UseBasicParsing ` -Uri "${apiUri}/v1.0/accounts/${accountID}/jurisdictions" ` @@ -27,7 +27,7 @@ Invoke-RestMethod ` 'Content-Type' = "application/json"; } ` -OutFile $response - +#ds-snippet-end Write-Output "Response: $(Get-Content -Raw $response)" Write-Output "" Write-Output "Done..." diff --git a/examples/Notary/inviteNotaryToPool.ps1 b/examples/Notary/inviteNotaryToPool.ps1 index aec01bb..400c98c 100644 --- a/examples/Notary/inviteNotaryToPool.ps1 +++ b/examples/Notary/inviteNotaryToPool.ps1 @@ -11,11 +11,11 @@ $response = New-TemporaryFile # Construct your API headers -# Step 2 Start +#ds-snippet-start:Notary2Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") -# Step 2 End +#ds-snippet-end # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -33,7 +33,7 @@ Write-Output "" Write-Output "Retrieving your notary pool:" Write-Output "" -# Step 3 Start +#ds-snippet-start:Notary2Step3 Invoke-RestMethod ` -UseBasicParsing ` -Uri "${apiUri}/v1.0/organizations/${organizationId}/pools/" ` @@ -43,9 +43,9 @@ Invoke-RestMethod ` Write-Output "Response: $(Get-Content -Raw $response)" $POOL_ID = $(Get-Content $response | ConvertFrom-Json).pools[0].poolId -# Step 3 End +#ds-snippet-end -# Step 4 Start +#ds-snippet-start:Notary2Step4 write-Output "" $NOTARY_NAME = Read-Host "Enter a name for the notary" $NOTARY_EMAIL = Read-Host "Enter an email address for the notary" @@ -56,14 +56,14 @@ $body = @" "name" : "${NOTARY_NAME}", } "@ -# Step 4 End +#ds-snippet-end -# Step 5 Start write-Output "" write-Output "Inviting ${NOTARY_NAME} to your organization's notary pool" write-Output "" write-Output "Pool id is ${POOL_ID}" write-Output "" +#ds-snippet-start:Notary2Step5 Invoke-RestMethod ` -Uri "${apiUri}/v1.0/organizations/${organizationId}/pools/${POOL_ID}/invites" ` -Headers $headers ` @@ -72,7 +72,7 @@ Invoke-RestMethod ` -Outfile $response Write-Output "Response: $(Get-Content -Raw $response)" -# Step 5 End +#ds-snippet-end # cleanup Remove-Item $response diff --git a/examples/Notary/signatureRequestToNotaryGroup.ps1 b/examples/Notary/signatureRequestToNotaryGroup.ps1 index 41fdeca..6d20acb 100644 --- a/examples/Notary/signatureRequestToNotaryGroup.ps1 +++ b/examples/Notary/signatureRequestToNotaryGroup.ps1 @@ -11,7 +11,7 @@ if ((!$variables.NOTARY_EMAIL) -or (!$variables.NOTARY_NAME) -or (!$variables.NO exit -1 } -# Step 1: Obtain your OAuth token +# Obtain your OAuth token # Note: Substitute these values with your own $accessToken = Get-Content .\config\ds_access_token.txt @@ -19,12 +19,13 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountId = Get-Content .\config\API_ACCOUNT_ID +#ds-snippet-start:Notary1Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Accept' = "application/json"; 'Content-Type' = "application/json"; } - +#ds-snippet-end # document 1 (html) has tag **signature_1** # document 2 (docx) has tag /sn1/ @@ -50,7 +51,7 @@ Write-Output "Results:" # Concatenate the different parts of the request - +#ds-snippet-start:Notary1Step3 @{ emailSubject = "Please sign this document set"; documents = @( @@ -120,9 +121,10 @@ Write-Output "Results:" }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end - -# Step 3. Create and send the envelope +# Create and send the envelope +#ds-snippet-start:Notary1Step4 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -131,7 +133,7 @@ Invoke-RestMethod ` -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" - +#ds-snippet-end # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId diff --git a/launcher.ps1 b/launcher.ps1 index de69bdd..8c82b91 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -138,7 +138,7 @@ function startLauncher { Write-Output "$([int][listApi]::Click)) Click" Write-Output "$([int][listApi]::Monitor)) Monitor" Write-Output "$([int][listApi]::Admin)) Admin" - Write-Output "$([int][listApi]::Notary)) Notary" + Write-Output "$([int][listApi]::Notary)) Notary (closed beta)" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); From 7de8a38ffda2b8a17c004ecf6c6e878ad9123457 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:07:16 -0700 Subject: [PATCH 316/462] added Notary API to README.md --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a26d02a..2a53587 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ When the token expires, the user is asked to re-authenticate. The refresh token When the token expires, it updates automatically. -## eSignature API +## eSignature REST API -For more information about the scopes used for obtaining authorization to use the eSignature API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). +For more information about the scopes used for obtaining authorization to use the eSignature REST API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). For a list of code examples that use the eSignature API, see the [How-to guides overview](https://developers.docusign.com/docs/esign-rest-api/how-to/) on the DocuSign Developer Center. @@ -53,6 +53,16 @@ For information about the scopes used for obtaining authorization to use the Adm For a list of code examples that use the Admin API, see the [How-to guides overview](https://developers.docusign.com/docs/admin-api/how-to/) on the DocuSign Developer Center. + +## Notary API (closed beta) + +**Note:** For closed beta participants interested in adding Notary API functionality to your production account, contact your DocuSign representative. Example 1 requires a Sender DocuSign developer account API account ID that has been provisioned for the [Notary API base URI](https://developers.docusign.com/docs/notary-api/go-live/). Example 2 requires that you [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your Sender DocuSign developer account. + +For information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/notary-api/notary101/auth/). + +For a list of code examples that use the Notary API, see the [How-to guides overview](https://developers.docusign.com/docs/notary-api/how-to/) on the DocuSign Developer Center. + + ## Installation ### Prerequisites From 7ecfce4abeb049a902b56afc97cdd2fee00f9708 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Wed, 5 Jul 2023 12:15:30 -0700 Subject: [PATCH 317/462] separating headers from api call --- examples/eSignature/eg017SetTemplateTabValues.ps1 | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg017SetTemplateTabValues.ps1 b/examples/eSignature/eg017SetTemplateTabValues.ps1 index d2271aa..bbfee6c 100644 --- a/examples/eSignature/eg017SetTemplateTabValues.ps1 +++ b/examples/eSignature/eg017SetTemplateTabValues.ps1 @@ -17,6 +17,11 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID $requestData = New-TemporaryFile $response = New-TemporaryFile +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; + } + # Check that we have a template ID if (Test-Path .\config\TEMPLATE_ID) { $templateId = Get-Content .\config\TEMPLATE_ID @@ -114,10 +119,7 @@ Write-Output "Sending the envelope request to DocuSign..." Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; -} ` + -Headers $headers ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response From ed07b05834c9216eb1fb7384d400e88b8dc3a623 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Fri, 7 Jul 2023 10:53:19 -0700 Subject: [PATCH 318/462] adding ID Evidence code examples to PS launcher --- examples/ID_Evidence/retrieveEvents.ps1 | 115 +++++++++++++ examples/ID_Evidence/retrieveMedia.ps1 | 162 ++++++++++++++++++ ...23SigningViaEmailWithIDVAuthentication.ps1 | 10 +- launcher.ps1 | 38 +++- 4 files changed, 321 insertions(+), 4 deletions(-) create mode 100644 examples/ID_Evidence/retrieveEvents.ps1 create mode 100644 examples/ID_Evidence/retrieveMedia.ps1 diff --git a/examples/ID_Evidence/retrieveEvents.ps1 b/examples/ID_Evidence/retrieveEvents.ps1 new file mode 100644 index 0000000..cb2edfa --- /dev/null +++ b/examples/ID_Evidence/retrieveEvents.ps1 @@ -0,0 +1,115 @@ +# Required values: $oAuthAccessToken, $APIaccountId, $envelopeId +# Returns: $recipientIdGuid, $resourceToken, $copy_of_id_front + +$oAuthAccessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Check that we have an IDV Envelope ID +if (-not (Test-Path .\config\IDV_ENVELOPE_ID)) { + Write-Output "An IDV Envelope ID is needed. Run eSignature example 23 'Signing via Email with IDV Authentication' and complete IDV before running this code example." + exit 0 +} + +$envelopeId = Get-Content .\config\IDV_ENVELOPE_ID + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization","Bearer ${oAuthAccessToken}") +$headers.add("Accept","application/json, text/plain, */*") +$headers.add("Content-Type","application/json;charset=UTF-8") + +# Retrieve recipient data +$uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients" + +write-host "Retrieving recipient data" +3 + +try{ + write-host "Response:" + $result = Invoke-RestMethod -uri $uri -headers $headers -method GET + $result.content + #Obtain the recipient ID GUID from the API response + $recipientIdGuid = $result.signers.recipientIdGuid + } +catch{ + $int = 0 + foreach($header in $_.Exception.Response.Headers){ + #On error, display the error, the line that triggered the error, and the TraceToken + if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + $int++ + } + write-host "Error : "$_.ErrorDetails.Message + write-host "Command : "$_.InvocationInfo.Line +} + +write-host "recipientIdGuid: " $recipientIdGuid +# Save the Recipient ID Guid for use by other scripts +Write-Output $recipientIdGuid > .\config\RECIPIENT_ID_GUID + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization","Bearer ${oAuthAccessToken}") +$headers.add("Accept","application/json, text/plain, */*") +$headers.add("Content-Type","application/json;charset=UTF-8") + +# Obtain identity proof token (resource token) +$uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients/${recipientIdGuid}/identity_proof_token" + +write-host "Attempting to retrieve your identity proof token" + +try{ + write-host "Response:" + $result = Invoke-RestMethod -uri $uri -headers $headers -method POST + $result.content + #Obtain the resourceToken from the API response + $resourceToken = $result.resourceToken + } +catch{ + $int = 0 + foreach($header in $_.Exception.Response.Headers){ + #On error, display the error, the line that triggered the error, and the TraceToken + if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + $int++ + } + write-host "Error : "$_.ErrorDetails.Message + write-host "Command : "$_.InvocationInfo.Line +} + +write-host "resourceToken: " $resourceToken +# Save the Resource Token for use by other scripts +Write-Output $resourceToken > .\config\RESOURCE_TOKEN.txt + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization","Bearer $resourceToken") +$headers.add("Accept","application/json, text/plain, */*") +$headers.add("Content-Type","application/json;charset=UTF-8") + + +# Retrieve recipient data +$uri = "https://proof-d.docusign.net/api/v1/events/person/$recipientIdGuid.json" + +write-host "Retrieving recipient data" + +try{ + write-host "Response:" + $result = Invoke-RestMethod -uri $uri -headers $headers -UseBasicParsing -method GET + #Obtain the Event List from the API response + $EventList = $result.events | ConvertTo-Json + + write-host $EventList + } +catch{ + $int = 0 + foreach($header in $_.Exception.Response.Headers){ + #On error, display the error, the line that triggered the error, and the TraceToken + if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + $int++ + } + write-host "Error : "$_.ErrorDetails.Message + write-host "Command : "$_.InvocationInfo.Line +} + +$copy_of_id_front = $result.events.data.copy_of_id_front | ConvertTo-Json +write-host "copy_of_id_front:"$copy_of_id_front +# Save the copy_of_id_front URL for use by other scripts +Write-Output $copy_of_id_front > .\config\COPY_OF_ID_FRONT_URL.txt diff --git a/examples/ID_Evidence/retrieveMedia.ps1 b/examples/ID_Evidence/retrieveMedia.ps1 new file mode 100644 index 0000000..3620610 --- /dev/null +++ b/examples/ID_Evidence/retrieveMedia.ps1 @@ -0,0 +1,162 @@ +# Required values: $oAuthAccessToken, $APIaccountId, $envelopeId +# Returns: $recipientIdGuid, $resourceToken, $copy_of_id_front + +$oAuthAccessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Check that we have an IDV Envelope ID +if (-not (Test-Path .\config\IDV_ENVELOPE_ID)) { + Write-Output "An IDV Envelope ID is needed. Run eSignature example 23 'Signing via Email with IDV Authentication' and complete IDV before running this code example." + exit 0 +} + +$envelopeId = Get-Content .\config\IDV_ENVELOPE_ID + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization","Bearer ${oAuthAccessToken}") +$headers.add("Accept","application/json, text/plain, */*") +$headers.add("Content-Type","application/json;charset=UTF-8") + +# Retrieve recipient data +$uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients" + +write-host "Retrieving recipient data" +3 + +try{ + write-host "Response:" + $result = Invoke-RestMethod -uri $uri -headers $headers -method GET + $result.content + #Obtain the recipient ID GUID from the API response + $recipientIdGuid = $result.signers.recipientIdGuid + } +catch{ + $int = 0 + foreach($header in $_.Exception.Response.Headers){ + #On error, display the error, the line that triggered the error, and the TraceToken + if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + $int++ + } + write-host "Error : "$_.ErrorDetails.Message + write-host "Command : "$_.InvocationInfo.Line +} + +write-host "recipientIdGuid: " $recipientIdGuid +# Save the Recipient ID Guid for use by other scripts +Write-Output $recipientIdGuid > .\config\RECIPIENT_ID_GUID + +# Construct your API headers +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization","Bearer ${oAuthAccessToken}") +$headers.add("Accept","application/json, text/plain, */*") +$headers.add("Content-Type","application/json;charset=UTF-8") + +# Obtain identity proof token (resource token) +$uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients/${recipientIdGuid}/identity_proof_token" + +write-host "Attempting to retrieve your identity proof token" + +try{ + write-host "Response:" + $result = Invoke-RestMethod -uri $uri -headers $headers -method POST + $result.content + #Obtain the resourceToken from the API response + $resourceToken = $result.resourceToken + } +catch{ + $int = 0 + foreach($header in $_.Exception.Response.Headers){ + #On error, display the error, the line that triggered the error, and the TraceToken + if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + $int++ + } + write-host "Error : "$_.ErrorDetails.Message + write-host "Command : "$_.InvocationInfo.Line +} + +write-host "resourceToken: " $resourceToken +# Save the Resource Token for use by other scripts +Write-Output $resourceToken > .\config\RESOURCE_TOKEN.txt + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization","Bearer $resourceToken") +$headers.add("Accept","application/json, text/plain, */*") +$headers.add("Content-Type","application/json;charset=UTF-8") + + +# Retrieve recipient data +$uri = "https://proof-d.docusign.net/api/v1/events/person/$recipientIdGuid.json" + +write-host "Retrieving recipient data" + +try{ + write-host "Response:" + $result = Invoke-RestMethod -uri $uri -headers $headers -UseBasicParsing -method GET + #Obtain the Event List from the API response + $EventList = $result.events | ConvertTo-Json + + write-host $EventList + } +catch{ + $int = 0 + foreach($header in $_.Exception.Response.Headers){ + #On error, display the error, the line that triggered the error, and the TraceToken + if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + $int++ + } + write-host "Error : "$_.ErrorDetails.Message + write-host "Command : "$_.InvocationInfo.Line +} + +$copy_of_id_front = $result.events.data.copy_of_id_front | ConvertTo-Json +write-host "copy_of_id_front:"$copy_of_id_front +# Save the copy_of_id_front URL for use by other scripts +Write-Output $copy_of_id_front > .\config\COPY_OF_ID_FRONT_URL.txt + + +# Required values: $resourceToken, $copy_of_id_front + +# Check that we have Copy of ID front URL and Resource Token in config file +if ((-not (Test-Path .\config\COPY_OF_ID_FRONT_URL.txt)) -or (-not (Test-Path .\config\RESOURCE_TOKEN.txt))) { + Write-Output "Copy of ID Front URL and Resource Token are needed. Run ID Evidence example 1 'Retrieve events' before running this code example." + exit -1 +} +$copy_of_id_front = Get-Content .\config\COPY_OF_ID_FRONT_URL.txt +#$recipientIdGuid = Get-Content .\config\RECIPIENT_ID_GUID +$resourceToken = Get-Content .\config\RESOURCE_TOKEN.txt + + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization","Bearer $resourceToken") +$headers.add("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*") +$headers.add("Content-Type","image/jpg") + +# return a base-64 image of the front of the photo ID +#$uri = "https://proof-d.docusign.net/api/v1/events/person/${recipientIdGuid}/${eventId}/media/${frontMediaId}" +$uri = "https://proof-d.docusign.net/api/v1/events/person/eecbf35c-753d-4b72-9780-9fe993fe6b6c/2e914d89-b174-4598-9422-53328cb92170/media/e6b45fc9-04e9-42ea-be94-f7a939d5dbc9" +#$uri = $copy_of_id_front + +[uri]::IsWellFormedUriString($copy_of_id_front, 'Absolute') +[uri]::IsWellFormedUriString($uri, 'Absolute') + +write-host "Retrieving recipient data" + +try{ + write-host "Response:" + $result = Invoke-RestMethod -uri $uri -headers $headers -method GET + $result.content + #Obtain the base-64 image + $id_front_base64_image = $result + write-host $id_front_base64_image | Out-File .\Base64.Delete + } +catch{ + $int = 0 + foreach($header in $_.Exception.Response.Headers){ + #On error, display the error, the line that triggered the error, and the TraceToken + if($header -eq "X-DocuSign-TraceToken"){ write-host "TraceToken : " $_.Exception.Response.Headers[$int]} + $int++ + } + write-host "Error : "$_.ErrorDetails.Message + write-host "Command : "$_.InvocationInfo.Line +} diff --git a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 index aeb8e3b..32f1677 100644 --- a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 +++ b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -113,8 +113,14 @@ Write-Output $body $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/envelopes" try { Write-Output "Response:" - $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST - $result.content + $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $response = $result.content | ConvertFrom-Json + + $envelopeId = $response.envelopeId + + # Save the IDV envelope id for use by other scripts + Write-Output "IDV EnvelopeId: " $envelopeId + Write-Output $envelopeId > .\config\IDV_ENVELOPE_ID } catch { $int = 0 diff --git a/launcher.ps1 b/launcher.ps1 index 8c82b91..354c6c2 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -101,8 +101,9 @@ function startLauncher { Click = 3; Monitor = 4; Admin = 5; - Notary = 6; - Exit = 7; + ID_Evidence = 6; + Notary = 7; + Exit = 8; } $listApiView = $null; @@ -138,6 +139,7 @@ function startLauncher { Write-Output "$([int][listApi]::Click)) Click" Write-Output "$([int][listApi]::Monitor)) Monitor" Write-Output "$([int][listApi]::Admin)) Admin" + Write-Output "$([int][listApi]::ID_Evidence)) ID Evidence" Write-Output "$([int][listApi]::Notary)) Notary (closed beta)" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" @@ -158,6 +160,9 @@ function startLauncher { elseif ($listApiView -eq [listApi]::Admin) { startAuth "admin" } + elseif ($listApiView -eq [listApi]::ID_Evidence) { + startAuth "idEvidence" + } elseif ($listApiView -eq [listApi]::Notary) { startAuth "notary" } @@ -226,6 +231,9 @@ function startAuth ($apiVersion) { elseif ($listApiView -eq [listApi]::Admin) { startAdmin } + elseif ($listApiView -eq [listApi]::ID_Evidence) { + startID_Evidence + } elseif ($listApiView -eq [listApi]::Notary) { startNotary } @@ -870,6 +878,32 @@ function startAdmin { startLauncher } +function startID_Evidence { + do { + Enum listID_EvidenceExamples { + retrieveEvents = 1; + retrieveMedia = 2; + Pick_An_API = 3; + } + $listID_EvidenceExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listID_EvidenceExamples]::retrieveEvents)) Retrieve events" + Write-Output "$([int][listID_EvidenceExamples]::retrieveMedia)) Retrieve media" + Write-Output "$([int][listID_EvidenceExamples]::Pick_An_API)) Pick_An_API" + [int]$listID_EvidenceExamplesView = Read-Host "Select the action" + } while (-not [listID_EvidenceExamples]::IsDefined([listID_EvidenceExamples], $listID_EvidenceExamplesView)); + + if ($listID_EvidenceExamplesView -eq [listID_EvidenceExamples]::retrieveEvents) { + powershell.exe -Command .\examples\ID_Evidence\retrieveEvents.ps1 + } elseif ($listID_EvidenceExamplesView -eq [listID_EvidenceExamples]::retrieveMedia) { + powershell.exe -Command .\examples\ID_Evidence\retrieveMedia.ps1 + } + } until ($listID_EvidenceExamplesView -eq [listID_EvidenceExamples]::Pick_An_API) + startLauncher +} + function startNotary { do { Enum listNotaryExamples { From b40af92bf36beef490240b7e336c71d6d12566d5 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Tue, 11 Jul 2023 14:58:23 -0700 Subject: [PATCH 319/462] Updated files for Sigma porting --- examples/ID_Evidence/retrieveEvents.ps1 | 6 ++++-- examples/ID_Evidence/retrieveMedia.ps1 | 28 +++++++++++++------------ 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/examples/ID_Evidence/retrieveEvents.ps1 b/examples/ID_Evidence/retrieveEvents.ps1 index cb2edfa..d78d041 100644 --- a/examples/ID_Evidence/retrieveEvents.ps1 +++ b/examples/ID_Evidence/retrieveEvents.ps1 @@ -22,7 +22,6 @@ $headers.add("Content-Type","application/json;charset=UTF-8") $uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients" write-host "Retrieving recipient data" -3 try{ write-host "Response:" @@ -46,6 +45,7 @@ write-host "recipientIdGuid: " $recipientIdGuid # Save the Recipient ID Guid for use by other scripts Write-Output $recipientIdGuid > .\config\RECIPIENT_ID_GUID + # Construct your API headers $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization","Bearer ${oAuthAccessToken}") @@ -79,12 +79,12 @@ write-host "resourceToken: " $resourceToken # Save the Resource Token for use by other scripts Write-Output $resourceToken > .\config\RESOURCE_TOKEN.txt + $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization","Bearer $resourceToken") $headers.add("Accept","application/json, text/plain, */*") $headers.add("Content-Type","application/json;charset=UTF-8") - # Retrieve recipient data $uri = "https://proof-d.docusign.net/api/v1/events/person/$recipientIdGuid.json" @@ -113,3 +113,5 @@ $copy_of_id_front = $result.events.data.copy_of_id_front | ConvertTo-Json write-host "copy_of_id_front:"$copy_of_id_front # Save the copy_of_id_front URL for use by other scripts Write-Output $copy_of_id_front > .\config\COPY_OF_ID_FRONT_URL.txt + +# cleanup diff --git a/examples/ID_Evidence/retrieveMedia.ps1 b/examples/ID_Evidence/retrieveMedia.ps1 index 3620610..f186aa0 100644 --- a/examples/ID_Evidence/retrieveMedia.ps1 +++ b/examples/ID_Evidence/retrieveMedia.ps1 @@ -22,7 +22,6 @@ $headers.add("Content-Type","application/json;charset=UTF-8") $uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients" write-host "Retrieving recipient data" -3 try{ write-host "Response:" @@ -118,10 +117,10 @@ Write-Output $copy_of_id_front > .\config\COPY_OF_ID_FRONT_URL.txt # Required values: $resourceToken, $copy_of_id_front # Check that we have Copy of ID front URL and Resource Token in config file -if ((-not (Test-Path .\config\COPY_OF_ID_FRONT_URL.txt)) -or (-not (Test-Path .\config\RESOURCE_TOKEN.txt))) { - Write-Output "Copy of ID Front URL and Resource Token are needed. Run ID Evidence example 1 'Retrieve events' before running this code example." - exit -1 -} +#if ((-not (Test-Path .\config\COPY_OF_ID_FRONT_URL.txt)) -or (-not (Test-Path .\config\RESOURCE_TOKEN.txt))) { +# Write-Output "Copy of ID Front URL and Resource Token are needed. Run ID Evidence example 1 'Retrieve events' before running this code example." +# exit -1 +#} $copy_of_id_front = Get-Content .\config\COPY_OF_ID_FRONT_URL.txt #$recipientIdGuid = Get-Content .\config\RECIPIENT_ID_GUID $resourceToken = Get-Content .\config\RESOURCE_TOKEN.txt @@ -134,21 +133,22 @@ $headers.add("Content-Type","image/jpg") # return a base-64 image of the front of the photo ID #$uri = "https://proof-d.docusign.net/api/v1/events/person/${recipientIdGuid}/${eventId}/media/${frontMediaId}" -$uri = "https://proof-d.docusign.net/api/v1/events/person/eecbf35c-753d-4b72-9780-9fe993fe6b6c/2e914d89-b174-4598-9422-53328cb92170/media/e6b45fc9-04e9-42ea-be94-f7a939d5dbc9" +#$uri = "https://proof-d.docusign.net/api/v1/events/person/eecbf35c-753d-4b72-9780-9fe993fe6b6c/2e914d89-b174-4598-9422-53328cb92170/media/e6b45fc9-04e9-42ea-be94-f7a939d5dbc9" +$uri = #$uri = $copy_of_id_front -[uri]::IsWellFormedUriString($copy_of_id_front, 'Absolute') -[uri]::IsWellFormedUriString($uri, 'Absolute') +#[system.uri]$copy_of_id_front = $uri +#[uri]::IsWellFormedUriString($copy_of_id_front, 'Absolute') +#[uri]::IsWellFormedUriString($uri, 'Absolute') write-host "Retrieving recipient data" try{ - write-host "Response:" + #Obtain the base-64 image $result = Invoke-RestMethod -uri $uri -headers $headers -method GET - $result.content - #Obtain the base-64 image - $id_front_base64_image = $result - write-host $id_front_base64_image | Out-File .\Base64.Delete + #$result.content + $result > C:\id_front_base64_image.txt + write-host "Response: Saved to C:\id_front_base64_image.txt" } catch{ $int = 0 @@ -160,3 +160,5 @@ catch{ write-host "Error : "$_.ErrorDetails.Message write-host "Command : "$_.InvocationInfo.Line } + +# cleanup From 127cba097cde991021fb014b1379308f1a8ed8f6 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Wed, 12 Jul 2023 18:19:06 -0700 Subject: [PATCH 320/462] get JWT token --- OAuth/code_grant.ps1 | 2 +- OAuth/jwt.ps1 | 8 ++++---- examples/ID_Evidence/retrieveMedia.ps1 | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index d326a47..f861282 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -20,7 +20,7 @@ $state = [Convert]::ToString($(Get-Random -Maximum 1000000000), 16) if($apiVersion -eq "rooms"){ $scopes = "signature%20dtr.rooms.read%20dtr.rooms.write%20dtr.documents.read%20dtr.documents.write%20dtr.profile.read%20dtr.profile.write%20dtr.company.read%20dtr.company.write%20room_forms" } -elseif ($apiVersion -eq "eSignature") { +elseif (($apiVersion -eq "eSignature") -or ($apiVersion -eq "idEvidence")){ $scopes = "signature" } elseif ($apiVersion -eq "click") { diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index b8d6fea..28845f1 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -34,7 +34,7 @@ $timestamp = [int][double]::Parse((Get-Date (Get-Date).ToUniversalTime() -UForma if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation%20dtr.rooms.read%20dtr.rooms.write%20dtr.documents.read%20dtr.documents.write%20dtr.profile.read%20dtr.profile.write%20dtr.company.read%20dtr.company.write%20room_forms" - } elseif ($apiVersion -eq "eSignature") { + } elseif (($apiVersion -eq "eSignature") -or ($apiVersion -eq "idEvidence")) { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "click") { $scopes = "click.manage%20click.send%20signature%20impersonation" @@ -49,7 +49,7 @@ if ($apiVersion -eq "rooms") { $scopes = "signature%20organization_read%20notary_read%20notary_write" } -# Step 1. Request application consent +# Request application consent $PORT = '8080' $IP = 'localhost' $state = [Convert]::ToString($(Get-Random -Maximum 1000000000), 16) @@ -61,7 +61,7 @@ $authorizationURL = "${authorizationEndpoint}auth?scope=$scopes&redirect_uri=$re Write-Output "The authorization URL is: $authorizationURL" Write-Output "" -# Step 2. Create a JWT +# Create a JWT $decJwtHeader = [ordered]@{ 'typ' = 'JWT'; 'alg' = 'RS256' @@ -103,7 +103,7 @@ $signedBase64Token = [System.Convert]::ToBase64String($signedToken) -replace '\+ $jwtToken = "$encJwtHeader.$encJwtPayLoad.$signedBase64Token" -# Step 3. Obtain the access token +# Obtain the access token try { $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $tokenResponse = Invoke-WebRequest ` diff --git a/examples/ID_Evidence/retrieveMedia.ps1 b/examples/ID_Evidence/retrieveMedia.ps1 index f186aa0..0e03e1e 100644 --- a/examples/ID_Evidence/retrieveMedia.ps1 +++ b/examples/ID_Evidence/retrieveMedia.ps1 @@ -133,8 +133,8 @@ $headers.add("Content-Type","image/jpg") # return a base-64 image of the front of the photo ID #$uri = "https://proof-d.docusign.net/api/v1/events/person/${recipientIdGuid}/${eventId}/media/${frontMediaId}" -#$uri = "https://proof-d.docusign.net/api/v1/events/person/eecbf35c-753d-4b72-9780-9fe993fe6b6c/2e914d89-b174-4598-9422-53328cb92170/media/e6b45fc9-04e9-42ea-be94-f7a939d5dbc9" -$uri = +$uri = "https://proof-d.docusign.net/api/v1/events/person/eecbf35c-753d-4b72-9780-9fe993fe6b6c/2e914d89-b174-4598-9422-53328cb92170/media/e6b45fc9-04e9-42ea-be94-f7a939d5dbc9" +#$uri = #$uri = $copy_of_id_front #[system.uri]$copy_of_id_front = $uri From 9a109613cb3ffd291205971719193f0558db9f90 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Thu, 13 Jul 2023 15:00:51 -0700 Subject: [PATCH 321/462] fixed typos and moved top tabs down --- examples/Notary/signatureRequestToNotaryGroup.ps1 | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/Notary/signatureRequestToNotaryGroup.ps1 b/examples/Notary/signatureRequestToNotaryGroup.ps1 index 6d20acb..796ec27 100644 --- a/examples/Notary/signatureRequestToNotaryGroup.ps1 +++ b/examples/Notary/signatureRequestToNotaryGroup.ps1 @@ -46,8 +46,7 @@ $docBase64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $docBase64 Write-Output "Sending the envelope request to DocuSign..." -Write-Output "The envelope has three documents. Processing time will be about 15 seconds." -Write-Output "Results:" +Write-Output "The envelope processing time will be about 15 seconds." # Concatenate the different parts of the request @@ -72,8 +71,8 @@ Write-Output "Results:" tabs = @{ notarySealTabs = @( @{ - xPosition = "150"; - yPosition = "50"; + xPosition = "300"; + yPosition = "245"; documentId = "1"; pageNumber = "1"; }; @@ -103,8 +102,8 @@ Write-Output "Results:" signHereTabs = @( @{ documentId = "1"; - xPosition = "50"; - yPosition = "50"; + xPosition = "200"; + yPosition = "245"; pageNumber = "1"; }; @{ From 7a09080142d0a0aa06bf501da36befeb79128317 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Thu, 13 Jul 2023 17:38:13 -0700 Subject: [PATCH 322/462] updated so file can save with jwt --- examples/ID_Evidence/retrieveMedia.ps1 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/ID_Evidence/retrieveMedia.ps1 b/examples/ID_Evidence/retrieveMedia.ps1 index 0e03e1e..c5923a3 100644 --- a/examples/ID_Evidence/retrieveMedia.ps1 +++ b/examples/ID_Evidence/retrieveMedia.ps1 @@ -133,7 +133,7 @@ $headers.add("Content-Type","image/jpg") # return a base-64 image of the front of the photo ID #$uri = "https://proof-d.docusign.net/api/v1/events/person/${recipientIdGuid}/${eventId}/media/${frontMediaId}" -$uri = "https://proof-d.docusign.net/api/v1/events/person/eecbf35c-753d-4b72-9780-9fe993fe6b6c/2e914d89-b174-4598-9422-53328cb92170/media/e6b45fc9-04e9-42ea-be94-f7a939d5dbc9" +$uri = "https://proof-d.docusign.net/api/v1/events/person/e96e07a5-c393-4622-9c3a-58f33be7b617/b9a3bb1b-cf9b-4ac3-9014-eddd5a798990/media/3300d1a8-0e03-408d-b3d8-ec12fb86596a" #$uri = #$uri = $copy_of_id_front @@ -147,8 +147,9 @@ try{ #Obtain the base-64 image $result = Invoke-RestMethod -uri $uri -headers $headers -method GET #$result.content - $result > C:\id_front_base64_image.txt - write-host "Response: Saved to C:\id_front_base64_image.txt" + #$result > C:\id_front_base64_image.txt + $result | Out-File -FilePath .\id_front_base64_image.txt + write-host "Response: Saved to .\id_front_base64_image.txt" } catch{ $int = 0 From 2010fe7f7bea7b7ff8265eddb3038163e6c82333 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Thu, 13 Jul 2023 17:56:27 -0700 Subject: [PATCH 323/462] uncomment line 137 of retrieveMedia --- examples/ID_Evidence/retrieveMedia.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/ID_Evidence/retrieveMedia.ps1 b/examples/ID_Evidence/retrieveMedia.ps1 index c5923a3..0efce37 100644 --- a/examples/ID_Evidence/retrieveMedia.ps1 +++ b/examples/ID_Evidence/retrieveMedia.ps1 @@ -133,8 +133,8 @@ $headers.add("Content-Type","image/jpg") # return a base-64 image of the front of the photo ID #$uri = "https://proof-d.docusign.net/api/v1/events/person/${recipientIdGuid}/${eventId}/media/${frontMediaId}" -$uri = "https://proof-d.docusign.net/api/v1/events/person/e96e07a5-c393-4622-9c3a-58f33be7b617/b9a3bb1b-cf9b-4ac3-9014-eddd5a798990/media/3300d1a8-0e03-408d-b3d8-ec12fb86596a" -#$uri = +#$uri = "https://proof-d.docusign.net/api/v1/events/person/e96e07a5-c393-4622-9c3a-58f33be7b617/b9a3bb1b-cf9b-4ac3-9014-eddd5a798990/media/3300d1a8-0e03-408d-b3d8-ec12fb86596a" +$uri = #$uri = $copy_of_id_front #[system.uri]$copy_of_id_front = $uri From 41db1013dfb4c8db44d45bf10c4c87d46d50c19b Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 18 Jul 2023 15:44:22 -0700 Subject: [PATCH 324/462] DEVDOCS-11403 - adding codeDepot markers --- examples/eSignature/eg043SharedAccess.ps1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 index 3d76903..274fd4c 100644 --- a/examples/eSignature/eg043SharedAccess.ps1 +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -8,9 +8,11 @@ $requestData = New-TemporaryFile $requestDataTemp = New-TemporaryFile $response = New-TemporaryFile +#ds-snippet-start:eSign43Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign43Step2 Write-Output "" $agentName = Read-Host "Please enter the name of the new agent" @@ -19,6 +21,7 @@ $agentEmail = Read-Host "Please enter the email address of the new agent" Write-Output "" $activation = Read-Host "Please input an activation code for the new agent. Save this code. You'll need it when activating the new agent." +#ds-snippet-start:eSign43Step3 try { # Check, if the agent already exists Invoke-RestMethod ` @@ -64,6 +67,7 @@ try { Get-Content $response $agentUserId = $(Get-Content $response | ConvertFrom-Json).newUsers.userId + #ds-snippet-end:eSign43Step3 } Write-Output "" @@ -100,6 +104,7 @@ try { Write-Output "Command : "$_.InvocationInfo.Line } +#ds-snippet-start:eSign43Step4 $isUserActivated = 0; do { @@ -141,6 +146,7 @@ do { } $isUserActivated = 1; + #ds-snippet-end:eSign43Step4 } catch { Write-Output "Agent has been created. Please go to the agent's email to activate the agent, and press 1 to continue the example: " @@ -164,6 +170,7 @@ if ($choice -ne "1") { powershell.exe -Command .\utils\sharedAccess.ps1 +#ds-snippet-start:eSign43Step5 try { # Make the API call to check the envelope # Get date in the ISO 8601 format @@ -193,6 +200,7 @@ try { Get-Content $response } + #ds-snippet-end:eSign43Step5 } catch { Write-Output "Unable to retrieve Bulk Status." From d49fa52d3b0a7fe9ce506b663def6cd2d554f960 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 18 Jul 2023 16:02:03 -0700 Subject: [PATCH 325/462] DEVDOCS-11401 - adding codeDepot markers --- examples/Admin/eg010DeleteUserDataFromOrganization.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 b/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 index 4ad21be..4113d9b 100644 --- a/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 +++ b/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 @@ -4,10 +4,12 @@ $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json $basePath = "https://api-d.docusign.net/management" $organizationId=$variables.ORGANIZATION_ID +#ds-snippet-start:Admin10Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") $headers.add("Accept", "application/json") +#ds-snippet-end:Admin10Step2 # Get user information $emailAddress = Read-Host "Please input the email address of the user whose data will be deleted. Note that this email address should be associated with a user that has been closed for at least 24 hours." @@ -19,6 +21,7 @@ $userId = $($response.Content | ConvertFrom-Json).users.id $accountId = $($response.Content | ConvertFrom-Json).users.memberships.account_id # Construct the request body +#ds-snippet-start:Admin10Step3 $body = @" { "user_id": "$userId", @@ -27,15 +30,18 @@ $body = @" }] } "@ +#ds-snippet-end:Admin10Step3 try { # Display the JSON response Write-Output "" Write-Output "Response:" + #ds-snippet-start:Admin10Step4 $uri = "${basePath}/v2/data_redaction/organizations/${organizationId}/user" $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST $result.content + #ds-snippet-end:Admin10Step4 } catch { Write-Output "Unable to delete the user." From 3ca96b2c96094c868bad939f7f95658b25ac2d7b Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 20 Jul 2023 12:15:55 -0700 Subject: [PATCH 326/462] Updating comments --- examples/Admin/eg010DeleteUserDataFromOrganization.ps1 | 6 ++++++ examples/eSignature/eg043SharedAccess.ps1 | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 b/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 index 4ad21be..4113d9b 100644 --- a/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 +++ b/examples/Admin/eg010DeleteUserDataFromOrganization.ps1 @@ -4,10 +4,12 @@ $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json $basePath = "https://api-d.docusign.net/management" $organizationId=$variables.ORGANIZATION_ID +#ds-snippet-start:Admin10Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") $headers.add("Accept", "application/json") +#ds-snippet-end:Admin10Step2 # Get user information $emailAddress = Read-Host "Please input the email address of the user whose data will be deleted. Note that this email address should be associated with a user that has been closed for at least 24 hours." @@ -19,6 +21,7 @@ $userId = $($response.Content | ConvertFrom-Json).users.id $accountId = $($response.Content | ConvertFrom-Json).users.memberships.account_id # Construct the request body +#ds-snippet-start:Admin10Step3 $body = @" { "user_id": "$userId", @@ -27,15 +30,18 @@ $body = @" }] } "@ +#ds-snippet-end:Admin10Step3 try { # Display the JSON response Write-Output "" Write-Output "Response:" + #ds-snippet-start:Admin10Step4 $uri = "${basePath}/v2/data_redaction/organizations/${organizationId}/user" $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST $result.content + #ds-snippet-end:Admin10Step4 } catch { Write-Output "Unable to delete the user." diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 index 3d76903..274fd4c 100644 --- a/examples/eSignature/eg043SharedAccess.ps1 +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -8,9 +8,11 @@ $requestData = New-TemporaryFile $requestDataTemp = New-TemporaryFile $response = New-TemporaryFile +#ds-snippet-start:eSign43Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign43Step2 Write-Output "" $agentName = Read-Host "Please enter the name of the new agent" @@ -19,6 +21,7 @@ $agentEmail = Read-Host "Please enter the email address of the new agent" Write-Output "" $activation = Read-Host "Please input an activation code for the new agent. Save this code. You'll need it when activating the new agent." +#ds-snippet-start:eSign43Step3 try { # Check, if the agent already exists Invoke-RestMethod ` @@ -64,6 +67,7 @@ try { Get-Content $response $agentUserId = $(Get-Content $response | ConvertFrom-Json).newUsers.userId + #ds-snippet-end:eSign43Step3 } Write-Output "" @@ -100,6 +104,7 @@ try { Write-Output "Command : "$_.InvocationInfo.Line } +#ds-snippet-start:eSign43Step4 $isUserActivated = 0; do { @@ -141,6 +146,7 @@ do { } $isUserActivated = 1; + #ds-snippet-end:eSign43Step4 } catch { Write-Output "Agent has been created. Please go to the agent's email to activate the agent, and press 1 to continue the example: " @@ -164,6 +170,7 @@ if ($choice -ne "1") { powershell.exe -Command .\utils\sharedAccess.ps1 +#ds-snippet-start:eSign43Step5 try { # Make the API call to check the envelope # Get date in the ISO 8601 format @@ -193,6 +200,7 @@ try { Get-Content $response } + #ds-snippet-end:eSign43Step5 } catch { Write-Output "Unable to retrieve Bulk Status." From 050bfdfa65d19c7ee900e0b8547088b36dc391f5 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 20 Jul 2023 12:48:12 -0700 Subject: [PATCH 327/462] DEVDOCS-10439 - adding codeDepot markers --- examples/eSignature/eg017SetTemplateTabValues.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/eSignature/eg017SetTemplateTabValues.ps1 b/examples/eSignature/eg017SetTemplateTabValues.ps1 index bbfee6c..56fad91 100644 --- a/examples/eSignature/eg017SetTemplateTabValues.ps1 +++ b/examples/eSignature/eg017SetTemplateTabValues.ps1 @@ -17,10 +17,12 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID $requestData = New-TemporaryFile $response = New-TemporaryFile +#ds-snippet-start:eSign17Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; } +#ds-snippet-end:eSign17Step2 # Check that we have a template ID if (Test-Path .\config\TEMPLATE_ID) { @@ -34,6 +36,7 @@ else { Write-Output "Sending the envelope request to DocuSign..." # Tabs and custom fields shown in the request body on step 4 # Step 4. Construct the request body +#ds-snippet-start:eSign17Step4 @{ customFields = @{ textCustomFields = @( @@ -114,14 +117,17 @@ Write-Output "Sending the envelope request to DocuSign..." status = "Sent"; templateId = "$templateId"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign17Step4 # Step 5. Call the eSignature REST API +#ds-snippet-start:eSign17Step5 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` -Headers $headers ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign17Step5 Write-Output "Response:" Get-Content $response From 51d2edf78c97261893f6be1b596d18f3f3452ec9 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 20 Jul 2023 12:49:40 -0700 Subject: [PATCH 328/462] DEVDOCS-10439 - Fixing --- examples/eSignature/eg017SetTemplateTabValues.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/eSignature/eg017SetTemplateTabValues.ps1 b/examples/eSignature/eg017SetTemplateTabValues.ps1 index 56fad91..32114b1 100644 --- a/examples/eSignature/eg017SetTemplateTabValues.ps1 +++ b/examples/eSignature/eg017SetTemplateTabValues.ps1 @@ -146,6 +146,7 @@ Write-Output "EnvelopeId: $envelopeId" Write-Output "Requesting the url for the embedded signing..." +#ds-snippet-start:eSign17Step6 @{ returnUrl = "http://httpbin.org/get"; authenticationMethod = "none"; @@ -163,6 +164,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path` -OutFile $response +#ds-snippet-end:eSign17Step6 Write-Output "Response:" Get-Content $response From 2bebcc315c604b7163661c02d2caff33d70fd294 Mon Sep 17 00:00:00 2001 From: annahileta Date: Tue, 25 Jul 2023 15:32:09 +0300 Subject: [PATCH 329/462] fixing the issue with url format --- examples/ID_Evidence/retrieveMedia.ps1 | 30 +++++++++----------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/examples/ID_Evidence/retrieveMedia.ps1 b/examples/ID_Evidence/retrieveMedia.ps1 index 0efce37..db3a70f 100644 --- a/examples/ID_Evidence/retrieveMedia.ps1 +++ b/examples/ID_Evidence/retrieveMedia.ps1 @@ -10,6 +10,12 @@ if (-not (Test-Path .\config\IDV_ENVELOPE_ID)) { exit 0 } +# Check that we have Copy of ID front URL and Resource Token in config file +if ((-not (Test-Path .\config\COPY_OF_ID_FRONT_URL.txt)) -or (-not (Test-Path .\config\RESOURCE_TOKEN.txt))) { + Write-Output "Copy of ID Front URL and Resource Token are needed. Run ID Evidence example 1 'Retrieve events' before running this code example." + exit 0 +} + $envelopeId = Get-Content .\config\IDV_ENVELOPE_ID # Construct your API headers @@ -75,6 +81,7 @@ catch{ } write-host "resourceToken: " $resourceToken + # Save the Resource Token for use by other scripts Write-Output $resourceToken > .\config\RESOURCE_TOKEN.txt @@ -83,7 +90,6 @@ $headers.add("Authorization","Bearer $resourceToken") $headers.add("Accept","application/json, text/plain, */*") $headers.add("Content-Type","application/json;charset=UTF-8") - # Retrieve recipient data $uri = "https://proof-d.docusign.net/api/v1/events/person/$recipientIdGuid.json" @@ -96,8 +102,7 @@ try{ $EventList = $result.events | ConvertTo-Json write-host $EventList - } -catch{ +}catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ #On error, display the error, the line that triggered the error, and the TraceToken @@ -115,14 +120,8 @@ Write-Output $copy_of_id_front > .\config\COPY_OF_ID_FRONT_URL.txt # Required values: $resourceToken, $copy_of_id_front - -# Check that we have Copy of ID front URL and Resource Token in config file -#if ((-not (Test-Path .\config\COPY_OF_ID_FRONT_URL.txt)) -or (-not (Test-Path .\config\RESOURCE_TOKEN.txt))) { -# Write-Output "Copy of ID Front URL and Resource Token are needed. Run ID Evidence example 1 'Retrieve events' before running this code example." -# exit -1 -#} $copy_of_id_front = Get-Content .\config\COPY_OF_ID_FRONT_URL.txt -#$recipientIdGuid = Get-Content .\config\RECIPIENT_ID_GUID +$recipientIdGuid = Get-Content .\config\RECIPIENT_ID_GUID $resourceToken = Get-Content .\config\RESOURCE_TOKEN.txt @@ -132,22 +131,13 @@ $headers.add("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* $headers.add("Content-Type","image/jpg") # return a base-64 image of the front of the photo ID -#$uri = "https://proof-d.docusign.net/api/v1/events/person/${recipientIdGuid}/${eventId}/media/${frontMediaId}" -#$uri = "https://proof-d.docusign.net/api/v1/events/person/e96e07a5-c393-4622-9c3a-58f33be7b617/b9a3bb1b-cf9b-4ac3-9014-eddd5a798990/media/3300d1a8-0e03-408d-b3d8-ec12fb86596a" -$uri = -#$uri = $copy_of_id_front - -#[system.uri]$copy_of_id_front = $uri -#[uri]::IsWellFormedUriString($copy_of_id_front, 'Absolute') -#[uri]::IsWellFormedUriString($uri, 'Absolute') +$uri = $copy_of_id_front -replace '"' write-host "Retrieving recipient data" try{ #Obtain the base-64 image $result = Invoke-RestMethod -uri $uri -headers $headers -method GET - #$result.content - #$result > C:\id_front_base64_image.txt $result | Out-File -FilePath .\id_front_base64_image.txt write-host "Response: Saved to .\id_front_base64_image.txt" } From 4ab51d2ae5bc0b111a16c05067c70e31b4eff63e Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Wed, 26 Jul 2023 11:19:15 -0700 Subject: [PATCH 330/462] DEVDOCS-10475 codeDepot markers + refactoring to have headers done in step 2 --- .../eSignature/eg040SetDocumentVisibility.ps1 | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 index bc0d792..d7c8333 100644 --- a/examples/eSignature/eg040SetDocumentVisibility.ps1 +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -14,7 +14,6 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountId = Get-Content .\config\API_ACCOUNT_ID -# ***DS.snippet.0.start # document 1 (html) has tag **signature_1** # document 2 (docx) has tag /sn1/ # document 3 (pdf) has tag /sn1/ @@ -41,6 +40,12 @@ $SIGNER2_NAME = Read-Host 'Please enter signer #2 name' $CC_EMAIL = Read-Host 'Please enter carbon copy email address' $CC_NAME = Read-Host 'Please enter carbon copy name' +#ds-snippet-start:eSign403Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign40Step2 + # Fetch docs and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 @@ -52,6 +57,7 @@ Write-Output "The envelope has three documents. Processing time will be about 15 Write-Output "Results:" # Concatenate the different parts of the request +#ds-snippet-start:eSign403Step3 @{ emailSubject = "Please sign this document set"; documents = @( @@ -121,25 +127,24 @@ Write-Output "Results:" }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign403Step3 # Step 3. Create and send the envelope' +#ds-snippet-start:eSign403Step4 try { Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; - } ` - -InFile (Resolve-Path $requestData).Path ` - -OutFile $response + -Headers $headers ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response +#ds-snippet-end:eSign403Step4 Write-Output "Response: $(Get-Content -Raw $response)" # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId - # ***DS.snippet.0.end Write-Output "EnvelopeId: $envelopeId" } catch { From 2f45f2210fa35625bc7071442ced16135a198b59 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 27 Jul 2023 09:46:45 -0700 Subject: [PATCH 331/462] DEVDOCS-10475 - fixing codeDepot markers --- examples/eSignature/eg040SetDocumentVisibility.ps1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 index d7c8333..b74167a 100644 --- a/examples/eSignature/eg040SetDocumentVisibility.ps1 +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -57,7 +57,7 @@ Write-Output "The envelope has three documents. Processing time will be about 15 Write-Output "Results:" # Concatenate the different parts of the request -#ds-snippet-start:eSign403Step3 +#ds-snippet-start:eSign40Step3 @{ emailSubject = "Please sign this document set"; documents = @( @@ -127,10 +127,10 @@ Write-Output "Results:" }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData -#ds-snippet-end:eSign403Step3 +#ds-snippet-end:eSign40Step3 # Step 3. Create and send the envelope' -#ds-snippet-start:eSign403Step4 +#ds-snippet-start:eSign40Step4 try { Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -138,7 +138,7 @@ try { -Headers $headers ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response -#ds-snippet-end:eSign403Step4 +#ds-snippet-end:eSign40Step4 Write-Output "Response: $(Get-Content -Raw $response)" From 43fa354d194cb655a7c79503a35ae00323809ba5 Mon Sep 17 00:00:00 2001 From: Mei Hsieh Date: Tue, 1 Aug 2023 11:07:43 -0700 Subject: [PATCH 332/462] add IDEvidence cD mkrs and remove temp files --- examples/ID_Evidence/retrieveEvents.ps1 | 12 +++++++++++- examples/ID_Evidence/retrieveMedia.ps1 | 13 ++++++++++++- examples/Notary/Jurisdictions.ps1 | 5 ++++- examples/Notary/inviteNotaryToPool.ps1 | 2 +- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/examples/ID_Evidence/retrieveEvents.ps1 b/examples/ID_Evidence/retrieveEvents.ps1 index d78d041..4b6517a 100644 --- a/examples/ID_Evidence/retrieveEvents.ps1 +++ b/examples/ID_Evidence/retrieveEvents.ps1 @@ -19,6 +19,7 @@ $headers.add("Accept","application/json, text/plain, */*") $headers.add("Content-Type","application/json;charset=UTF-8") # Retrieve recipient data +#ds-snippet-start:IDEvidence1Step2 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients" write-host "Retrieving recipient data" @@ -30,6 +31,7 @@ try{ #Obtain the recipient ID GUID from the API response $recipientIdGuid = $result.signers.recipientIdGuid } +#ds-snippet-end catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ @@ -53,6 +55,7 @@ $headers.add("Accept","application/json, text/plain, */*") $headers.add("Content-Type","application/json;charset=UTF-8") # Obtain identity proof token (resource token) +#ds-snippet-start:IDEvidence1Step3 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients/${recipientIdGuid}/identity_proof_token" write-host "Attempting to retrieve your identity proof token" @@ -64,6 +67,7 @@ try{ #Obtain the resourceToken from the API response $resourceToken = $result.resourceToken } +#ds-snippet-end catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ @@ -79,13 +83,15 @@ write-host "resourceToken: " $resourceToken # Save the Resource Token for use by other scripts Write-Output $resourceToken > .\config\RESOURCE_TOKEN.txt - +#ds-snippet-start:IDEvidence1Step4 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization","Bearer $resourceToken") $headers.add("Accept","application/json, text/plain, */*") $headers.add("Content-Type","application/json;charset=UTF-8") +#ds-snippet-end # Retrieve recipient data +#ds-snippet-start:IDEvidence1Step5 $uri = "https://proof-d.docusign.net/api/v1/events/person/$recipientIdGuid.json" write-host "Retrieving recipient data" @@ -98,6 +104,8 @@ try{ write-host $EventList } +#ds-snippet-end + catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ @@ -115,3 +123,5 @@ write-host "copy_of_id_front:"$copy_of_id_front Write-Output $copy_of_id_front > .\config\COPY_OF_ID_FRONT_URL.txt # cleanup +Remove-Item $result +Write-Output "Done." diff --git a/examples/ID_Evidence/retrieveMedia.ps1 b/examples/ID_Evidence/retrieveMedia.ps1 index db3a70f..49cb86f 100644 --- a/examples/ID_Evidence/retrieveMedia.ps1 +++ b/examples/ID_Evidence/retrieveMedia.ps1 @@ -25,6 +25,7 @@ $headers.add("Accept","application/json, text/plain, */*") $headers.add("Content-Type","application/json;charset=UTF-8") # Retrieve recipient data +#ds-snippet-start:IDEvidence2Step2 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients" write-host "Retrieving recipient data" @@ -36,6 +37,7 @@ try{ #Obtain the recipient ID GUID from the API response $recipientIdGuid = $result.signers.recipientIdGuid } +#ds-snippet-end catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ @@ -58,6 +60,7 @@ $headers.add("Accept","application/json, text/plain, */*") $headers.add("Content-Type","application/json;charset=UTF-8") # Obtain identity proof token (resource token) +#ds-snippet-start:IDEvidence2Step3 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/${APIaccountId}/envelopes/${envelopeId}/recipients/${recipientIdGuid}/identity_proof_token" write-host "Attempting to retrieve your identity proof token" @@ -69,6 +72,7 @@ try{ #Obtain the resourceToken from the API response $resourceToken = $result.resourceToken } +#ds-snippet-end catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ @@ -85,12 +89,15 @@ write-host "resourceToken: " $resourceToken # Save the Resource Token for use by other scripts Write-Output $resourceToken > .\config\RESOURCE_TOKEN.txt +#ds-snippet-start:IDEvidence2Step4 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization","Bearer $resourceToken") $headers.add("Accept","application/json, text/plain, */*") $headers.add("Content-Type","application/json;charset=UTF-8") +#ds-snippet-end # Retrieve recipient data +#ds-snippet-start:IDEvidence2Step5 $uri = "https://proof-d.docusign.net/api/v1/events/person/$recipientIdGuid.json" write-host "Retrieving recipient data" @@ -100,8 +107,8 @@ try{ $result = Invoke-RestMethod -uri $uri -headers $headers -UseBasicParsing -method GET #Obtain the Event List from the API response $EventList = $result.events | ConvertTo-Json - write-host $EventList +#ds-snippet-end }catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ @@ -131,6 +138,7 @@ $headers.add("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */* $headers.add("Content-Type","image/jpg") # return a base-64 image of the front of the photo ID +#ds-snippet-start:IDEvidence2Step6 $uri = $copy_of_id_front -replace '"' write-host "Retrieving recipient data" @@ -141,6 +149,7 @@ try{ $result | Out-File -FilePath .\id_front_base64_image.txt write-host "Response: Saved to .\id_front_base64_image.txt" } +#ds-snippet-end catch{ $int = 0 foreach($header in $_.Exception.Response.Headers){ @@ -153,3 +162,5 @@ catch{ } # cleanup +Remove-Item $result +Write-Output "Done." diff --git a/examples/Notary/Jurisdictions.ps1 b/examples/Notary/Jurisdictions.ps1 index bb81e4f..44bedc4 100644 --- a/examples/Notary/Jurisdictions.ps1 +++ b/examples/Notary/Jurisdictions.ps1 @@ -29,5 +29,8 @@ Invoke-RestMethod ` -OutFile $response #ds-snippet-end Write-Output "Response: $(Get-Content -Raw $response)" + +# cleanup +Remove-Item $response Write-Output "" -Write-Output "Done..." +Write-Output "Done." diff --git a/examples/Notary/inviteNotaryToPool.ps1 b/examples/Notary/inviteNotaryToPool.ps1 index 400c98c..edd830f 100644 --- a/examples/Notary/inviteNotaryToPool.ps1 +++ b/examples/Notary/inviteNotaryToPool.ps1 @@ -77,4 +77,4 @@ Write-Output "Response: $(Get-Content -Raw $response)" # cleanup Remove-Item $response Write-Output "" -Write-Output "Done..." \ No newline at end of file +Write-Output "Done." From 96a529f1c89508d63d35dad6ba7381a0450a7480 Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Wed, 9 Aug 2023 16:57:07 -0700 Subject: [PATCH 333/462] fixing codeDepot markers for admin9 - DEVDOCS-10603 --- ...g009DeleteUserProductPermissionProfile.ps1 | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 index 49b266b..ef9ac2f 100644 --- a/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 +++ b/examples/Admin/eg009DeleteUserProductPermissionProfile.ps1 @@ -40,23 +40,25 @@ $headers.add("Content-Type", "application/json") try { # Display the JSON response Write-Output "Getting permission profiles by email address..." + #ds-snippet-start:Admin9Step3 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/permission_profiles/users?email=${emailAddress}" $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET $productProfiles = $($response.Content | ConvertFrom-Json).product_permission_profiles - + #ds-snippet-end:Admin9Step3 + Write-Output "Response:" Write-Output "" Write-Output $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 Write-Output "" } -catch +catch { Write-Output "Error:" # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error foreach ($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { - Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } $int++ } @@ -105,7 +107,7 @@ if ($null -eq $userHasProductPermissions) { Write-Output "" } else { # Construct the request body -#ds-snippet-start:Admin9Step3 +#ds-snippet-start:Admin9Step4 $body = @" { "user_email": "$emailAddress", @@ -114,16 +116,16 @@ if ($null -eq $userHasProductPermissions) { ] } "@ -#ds-snippet-end:Admin9Step3 +#ds-snippet-end:Admin9Step4 try { # Display the JSON response Write-Output "Response:" -#ds-snippet-start:Admin9Step4 +#ds-snippet-start:Admin9Step5 $uri = "${base_path}/v2.1/organizations/${organizationId}/accounts/${APIAccountId}/products/users" Invoke-WebRequest -uri $uri -headers $headers -body $body -method DELETE -#ds-snippet-end:Admin9Step4 - +#ds-snippet-end:Admin9Step5 + Write-Output "Product permission profile has been deleted." Write-Output "" Write-Output "Done" @@ -132,8 +134,8 @@ if ($null -eq $userHasProductPermissions) { # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error foreach ($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { - Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } $int++ } From 284e9749dd336842155b3a09c63024ff4a68239b Mon Sep 17 00:00:00 2001 From: Aaron Wilde <52012222+AaronWDS@users.noreply.github.com> Date: Mon, 21 Aug 2023 16:50:11 -0700 Subject: [PATCH 334/462] WhatsApp functionality added onto EX37 (#76) * initial commit * fix rename bug * requested pr changes * remove extra space * one more space to remove --- examples/eSignature/eg036DelayedRouting.ps1 | 2 +- examples/eSignature/eg037SMSDelivery.ps1 | 38 +++++++++++++++------ launcher.ps1 | 6 ++-- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index add2d0d..e0c1006 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -1,4 +1,4 @@ -#SMS Delivery +#Delayed Routing $apiUri = "https://demo.docusign.net/restapi" # Send an envelope with one document diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index 199c152..690b63b 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -1,4 +1,4 @@ -#SMS Delivery +#SMS or WhatsApp Delivery $apiUri = "https://demo.docusign.net/restapi" # Send an envelope with three documents @@ -37,10 +37,25 @@ $doc3Base64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 # Step 2. Create the envelope definition -$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer: " -$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer: " -$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient: " -$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient: " +Write-Output 'Please choose a message delivery type: ' +Write-Output "$(1) SMS" +Write-Output "$(2) WhatsApp" + +[int]$MSGType = Read-Host "Select 1 or 2" + +if ($MSGType -eq 1){ + $selected = "SMS" +} +else { + $selected = "WhatsApp" +} + +$MSGCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer" +$MSGNumber = Read-Host "Please enter a Mobile number for the Signer" +$MSGCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient" +$MSGNumberCC = Read-Host "Please enter a Mobile number for the Carbon Copied recipient" + + #ds-snippet-start:eSign37Step2 @{ @@ -68,26 +83,27 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo carbonCopies = @( @{ phoneNumber = @{ - countryCode = $SMSCCCountryPrefix; - number = $SMSNumberCC; + countryCode = $MSGCCCountryPrefix; + number = $MSGNumberCC; } name = $variables.CC_NAME; recipientId = "2"; routingOrder = "2"; - deliveryMethod = "SMS"; + deliveryMethod = $selected; }; ); signers = @( @{ phoneNumber = @{ - countryCode = $SMSCountryPrefix; - number = $SMSNumber; + countryCode = $MSGCountryPrefix; + number = $MSGNumber; + } name = $variables.SIGNER_NAME; recipientId = "1"; routingOrder = "1"; - deliveryMethod = "SMS"; + deliveryMethod = $selected; tabs = @{ signHereTabs = @( @{ diff --git a/launcher.ps1 b/launcher.ps1 index 354c6c2..fb1be6d 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -456,7 +456,7 @@ function startSignature { Use_Conditional_Recipients = 34; Scheduled_Sending = 35; Delayed_Routing = 36; - SMS_Delivery = 37; + SMS_or_WhatsApp = 37; Create_Signable_HTML_document = 38; Signing_In_Person = 39; Set_Document_Visibility = 40; @@ -504,7 +504,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Use_Conditional_Recipients)) Use_Conditional_Recipients" Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" - Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" + Write-Output "$([int][ApiExamples]::SMS_or_WhatsApp)) SMS_or_WhatsApp" Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" @@ -632,7 +632,7 @@ function startSignature { checkEmailAddresses powershell.exe .\examples\eSignature\eg036DelayedRouting.ps1 } - elseif ($ApiExamplesView -eq [ApiExamples]::SMS_Delivery) { + elseif ($ApiExamplesView -eq [ApiExamples]::SMS_or_WhatsApp) { checkEmailAddresses powershell.exe .\examples\eSignature\eg037SMSDelivery.ps1 } From 0180ecf1256106d78fa4146d06ffd974a8440cc2 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 14:01:58 -0700 Subject: [PATCH 335/462] Create powershell.yml testing our Playwright Tests with GitHub Action in powershell-private repo --- .github/workflows/powershell.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/powershell.yml diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml new file mode 100644 index 0000000..8ddc19b --- /dev/null +++ b/.github/workflows/powershell.yml @@ -0,0 +1,31 @@ +name: Playwright Tests +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + +permissions: + contents: read + +jobs: + test: + timeout-minutes: 5 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Install dependencies + run: npm ci + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + - uses: actions/upload-artifact@v3 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 3 From 687b7d22b6aa5973da51ac689e00236499b42cc1 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 14:08:30 -0700 Subject: [PATCH 336/462] Update powershell.yml --- .github/workflows/powershell.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 8ddc19b..f8794a8 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -18,6 +18,7 @@ jobs: with: node-version: 18 - name: Install dependencies + run: npm install run: npm ci - name: Install Playwright Browsers run: npx playwright install --with-deps From a58d4ed97afafe65d6cc46840dbde1017389f007 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 14:10:27 -0700 Subject: [PATCH 337/462] Update powershell.yml small fix --- .github/workflows/powershell.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index f8794a8..a93be75 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -17,8 +17,9 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - name: Install dependencies + - name: Install dependencies 1 run: npm install + - name: Install dependencies 2 run: npm ci - name: Install Playwright Browsers run: npx playwright install --with-deps From ad8bc03f61404970ae1ac1075d60874429534fd5 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 14:18:27 -0700 Subject: [PATCH 338/462] Update powershell.yml try to install npm 8 --- .github/workflows/powershell.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index a93be75..efe41f5 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -17,9 +17,10 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - name: Install dependencies 1 - run: npm install - - name: Install dependencies 2 + - uses: actions/setup-npm@v8 + with: + npm-version: 8 + - name: Install dependencies run: npm ci - name: Install Playwright Browsers run: npx playwright install --with-deps From ed35f755f4083fb5ed3441371315775de83e1863 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 14:23:16 -0700 Subject: [PATCH 339/462] Update powershell.yml try fix I found on s/o https://stackoverflow.com/questions/69984660/npm-ci-can-only-install-packages-with-an-existing-package-lock-json-or-npm-shrin --- .github/workflows/powershell.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index efe41f5..5925d4c 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -17,11 +17,15 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - uses: actions/setup-npm@v8 - with: - npm-version: 8 - name: Install dependencies - run: npm ci + run: | + if [ -e yarn.lock ]; then + yarn install --frozen-lockfile + elif [ -e package-lock.json ]; then + npm ci + else + npm i + fi - name: Install Playwright Browsers run: npx playwright install --with-deps - name: Run Playwright tests From 62dec3b992025721087854980fb4765a6997c721 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 14:47:18 -0700 Subject: [PATCH 340/462] Update powershell.yml try npm install --package-lock-only --- .github/workflows/powershell.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 5925d4c..662f3f6 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -17,15 +17,12 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - name: Install dependencies - run: | - if [ -e yarn.lock ]; then - yarn install --frozen-lockfile - elif [ -e package-lock.json ]; then + - name: Install dependencies 1 + run: + npm install --package-lock-only + - name: Install dependencies 2 + run: npm ci - else - npm i - fi - name: Install Playwright Browsers run: npx playwright install --with-deps - name: Run Playwright tests From d778f6f4825add9ee026c4df970e68f6dce58b39 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 15:04:03 -0700 Subject: [PATCH 341/462] upload package.json from https://github.com/microsoft/playwright-github-action/blob/main/package.json --- package.json | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..a7f8655 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "playwright-github-action", + "version": "1.0.0", + "description": "Run Playwright tests on GitHub Actions", + "main": "index.js", + "scripts": { + "lint": "eslint index.js", + "build": "ncc build index.js -o dist", + "package": "npm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/microsoft/playwright-github-action.git" + }, + "author": "Microsoft", + "license": "MIT", + "bugs": { + "url": "https://github.com/microsoft/playwright-github-action/issues" + }, + "homepage": "https://github.com/microsoft/playwright-github-action#readme", + "dependencies": { + "@actions/core": "^1.9.1", + "@actions/exec": "^1.1.1" + }, + "devDependencies": { + "@zeit/ncc": "^0.20.5", + "eslint": "^8.17.0" + } +} From b7b9f39a7ce96030b6d602c84db231530037a501 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 15:19:26 -0700 Subject: [PATCH 342/462] Update powershell.yml remove - name: Install dependencies 1 run: npm install --package-lock-only --- .github/workflows/powershell.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 662f3f6..8d6e886 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -17,10 +17,7 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - name: Install dependencies 1 - run: - npm install --package-lock-only - - name: Install dependencies 2 + - name: Install dependencies run: npm ci - name: Install Playwright Browsers From 9ee97d21f7729fcc5a704c0aae1f0789adf79f0f Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 15:22:19 -0700 Subject: [PATCH 343/462] Revert "Update powershell.yml" --- .github/workflows/powershell.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 8d6e886..662f3f6 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -17,7 +17,10 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - name: Install dependencies + - name: Install dependencies 1 + run: + npm install --package-lock-only + - name: Install dependencies 2 run: npm ci - name: Install Playwright Browsers From cd0aca6a0ad58d5bba85260ad1e14a589e0fd26d Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 15:41:37 -0700 Subject: [PATCH 344/462] Update powershell.yml added these steps per error messages: - name: Uninstall Playwright run: npm uninstall playwright - name: Install Playwright npm test package run: npm install -D @playwright/test - name: Install Playwright Browsers run: npx playwright install --- .github/workflows/powershell.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 662f3f6..f9254ec 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -23,8 +23,12 @@ jobs: - name: Install dependencies 2 run: npm ci + - name: Uninstall Playwright + run: npm uninstall playwright + - name: Install Playwright npm test package + run: npm install -D @playwright/test - name: Install Playwright Browsers - run: npx playwright install --with-deps + run: npx playwright install - name: Run Playwright tests run: npx playwright test - uses: actions/upload-artifact@v3 From f7856f0415293950f19d59c28e57788f17ff4259 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:37:43 -0700 Subject: [PATCH 345/462] add playwright.config.ts adding playwright.config.ts --- playwright.config.ts | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 playwright.config.ts diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..301801e --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,77 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); From 3c6055872c605400183831e1a43084e52835cac8 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:43:05 -0700 Subject: [PATCH 346/462] added /tests folder containing 2 tests --- tests/example.spec.ts | 18 ++++++++++++++++++ tests/quickstartPage.spec.ts | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 tests/example.spec.ts create mode 100644 tests/quickstartPage.spec.ts diff --git a/tests/example.spec.ts b/tests/example.spec.ts new file mode 100644 index 0000000..54a906a --- /dev/null +++ b/tests/example.spec.ts @@ -0,0 +1,18 @@ +import { test, expect } from '@playwright/test'; + +test('has title', async ({ page }) => { + await page.goto('https://playwright.dev/'); + + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle(/Playwright/); +}); + +test('get started link', async ({ page }) => { + await page.goto('https://playwright.dev/'); + + // Click the get started link. + await page.getByRole('link', { name: 'Get started' }).click(); + + // Expects page to have a heading with the name of Installation. + await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible(); +}); diff --git a/tests/quickstartPage.spec.ts b/tests/quickstartPage.spec.ts new file mode 100644 index 0000000..b1fc57a --- /dev/null +++ b/tests/quickstartPage.spec.ts @@ -0,0 +1,18 @@ +import { test, expect } from '@playwright/test'; + +test('has title', async ({ page }) => { + await page.goto('https://developers.docusign.com/docs/esign-rest-api/quickstart/'); + + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle(/Quickstart/); +}); + +test('get started link', async ({ page }) => { + await page.goto('https://developers.docusign.com/docs/esign-rest-api/quickstart/'); + + // Click the get started link. + await page.getByRole('link', { name: 'Log in' }).click(); + + // Expects page to have a heading with the name of Installation. + await expect(page.getByRole('heading', { name: 'Log In' })).toBeVisible(); +}); From aec17dcc10fa4d5e32c2a02a5dc140c2aea2092e Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:48:21 -0700 Subject: [PATCH 347/462] Update playwright.config.ts comment out firefox and webkit the latter led to 4 failed tests --- playwright.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index 301801e..3404e3c 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -36,7 +36,7 @@ export default defineConfig({ name: 'chromium', use: { ...devices['Desktop Chrome'] }, }, - + /* { name: 'firefox', use: { ...devices['Desktop Firefox'] }, @@ -46,7 +46,7 @@ export default defineConfig({ name: 'webkit', use: { ...devices['Desktop Safari'] }, }, - + */ /* Test against mobile viewports. */ // { // name: 'Mobile Chrome', From 8a7d3d960555bb3b56f6ef722f163efdefc5e545 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 16:56:12 -0700 Subject: [PATCH 348/462] Update powershell.yml install only chromium browser, not firefox, not webkit --- .github/workflows/powershell.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index f9254ec..0f782bf 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -17,18 +17,18 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - name: Install dependencies 1 + - name: Install dependency package-lock run: npm install --package-lock-only - - name: Install dependencies 2 + - name: Install dependency npm run: npm ci - name: Uninstall Playwright run: npm uninstall playwright - name: Install Playwright npm test package run: npm install -D @playwright/test - - name: Install Playwright Browsers - run: npx playwright install + - name: Install Playwright Chromium browser only + run: npx playwright install chromium - name: Run Playwright tests run: npx playwright test - uses: actions/upload-artifact@v3 From 0e4a85d8eb361836bfe8ce8fb6faaef5f8f2d758 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 31 Aug 2023 17:00:23 -0700 Subject: [PATCH 349/462] Update powershell.yml removed on push, only on pr to main, master --- .github/workflows/powershell.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 0f782bf..d4b7e8f 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -1,7 +1,5 @@ name: Playwright Tests on: - push: - branches: [main, master] pull_request: branches: [main, master] From 630642f641fc900b0c27f215e5d9b93ace9be051 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 11:02:18 -0700 Subject: [PATCH 350/462] add package-lock from MS GH https://github.com/microsoft/playwright-github-action/blob/main/package-lock.json --- package-lock.json | 1692 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1692 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..647759f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1692 @@ +{ + "name": "playwright-github-action", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "playwright-github-action", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@actions/core": "^1.9.1", + "@actions/exec": "^1.1.1" + }, + "devDependencies": { + "@zeit/ncc": "^0.20.5", + "eslint": "^8.17.0" + } + }, + "node_modules/@actions/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", + "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", + "dependencies": { + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" + } + }, + "node_modules/@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "dependencies": { + "@actions/io": "^1.0.1" + } + }, + "node_modules/@actions/http-client": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", + "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", + "dependencies": { + "tunnel": "^0.0.6" + } + }, + "node_modules/@actions/io": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.1.tgz", + "integrity": "sha512-Qi4JoKXjmE0O67wAOH6y0n26QXhMKMFo7GD/4IXNVcrtLjUlGjGuVys6pQgwF3ArfGTQu0XpqaNr0YhED2RaRA==" + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@zeit/ncc": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.20.5.tgz", + "integrity": "sha512-XU6uzwvv95DqxciQx+aOLhbyBx/13ky+RK1y88Age9Du3BlA4mMPCy13BGjayOrrumOzlq1XV3SD/BWiZENXlw==", + "deprecated": "@zeit/ncc is no longer maintained. Please use @vercel/ncc instead.", + "dev": true, + "bin": { + "ncc": "dist/ncc/cli.js" + } + }, + "node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", + "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "dependencies": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + }, + "dependencies": { + "@actions/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", + "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", + "requires": { + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" + } + }, + "@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "requires": { + "@actions/io": "^1.0.1" + } + }, + "@actions/http-client": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", + "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", + "requires": { + "tunnel": "^0.0.6" + } + }, + "@actions/io": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.1.tgz", + "integrity": "sha512-Qi4JoKXjmE0O67wAOH6y0n26QXhMKMFo7GD/4IXNVcrtLjUlGjGuVys6pQgwF3ArfGTQu0XpqaNr0YhED2RaRA==" + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@zeit/ncc": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.20.5.tgz", + "integrity": "sha512-XU6uzwvv95DqxciQx+aOLhbyBx/13ky+RK1y88Age9Du3BlA4mMPCy13BGjayOrrumOzlq1XV3SD/BWiZENXlw==", + "dev": true + }, + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", + "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "requires": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} From 2ad586fb82270b421bc7a4acdf8f6e4c30742d7c Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 11:13:59 -0700 Subject: [PATCH 351/462] Update powershell.yml removed these 2 steps: - name: Install dependency package-lock run: npm install --package-lock-only - name: Run Playwright tests run: npx playwright test added: UI mode, show-report --- .github/workflows/powershell.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index d4b7e8f..6f50e37 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -15,9 +15,6 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - - name: Install dependency package-lock - run: - npm install --package-lock-only - name: Install dependency npm run: npm ci @@ -27,8 +24,10 @@ jobs: run: npm install -D @playwright/test - name: Install Playwright Chromium browser only run: npx playwright install chromium - - name: Run Playwright tests - run: npx playwright test + - name: Run Playwright tests UI mode + run: npx playwright test --ui + - name: Show Playwright HTML test reports + run: npx playwright show-report - uses: actions/upload-artifact@v3 if: always() with: From 5ff32c7134fac5c7fe2c190d9f2bb2abc1b0df37 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:00:59 -0700 Subject: [PATCH 352/462] upload index.js from https://github.com/microsoft/playwright-github-action/blob/main/index.js Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- index.js | 444 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 444 insertions(+) create mode 100644 index.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..6fdcf0c --- /dev/null +++ b/index.js @@ -0,0 +1,444 @@ +const core = require('@actions/core'); +const { exec } = require('@actions/exec'); +const os = require('os'); +const util = require('util'); +const fs = require('fs'); + +const readFileAsync = util.promisify(fs.readFile.bind(fs)); + +const DEPENDENCIES = { + 'ubuntu18.04': { + tools: [ + 'xvfb', + 'fonts-noto-color-emoji', + 'ttf-unifont', + 'libfontconfig', + 'libfreetype6', + 'xfonts-cyrillic', + 'xfonts-scalable', + 'fonts-liberation', + 'fonts-ipafont-gothic', + 'fonts-wqy-zenhei', + 'fonts-tlwg-loma-otf', + 'ttf-ubuntu-font-family', + ], + chromium: [ + 'fonts-liberation', + 'libasound2', + 'libatk-bridge2.0-0', + 'libatk1.0-0', + 'libatspi2.0-0', + 'libcairo2', + 'libcups2', + 'libdbus-1-3', + 'libdrm2', + 'libegl1', + 'libgbm1', + 'libgdk-pixbuf2.0-0', + 'libglib2.0-0', + 'libgtk-3-0', + 'libnspr4', + 'libnss3', + 'libpango-1.0-0', + 'libpangocairo-1.0-0', + 'libx11-6', + 'libx11-xcb1', + 'libxcb-dri3-0', + 'libxcb1', + 'libxcomposite1', + 'libxdamage1', + 'libxext6', + 'libxfixes3', + 'libxi6', + 'libxrandr2', + 'libxshmfence1', + 'libxtst6', + ], + firefox: [ + 'ffmpeg', + 'libatk1.0-0', + 'libcairo-gobject2', + 'libcairo2', + 'libdbus-1-3', + 'libdbus-glib-1-2', + 'libfontconfig1', + 'libfreetype6', + 'libgdk-pixbuf2.0-0', + 'libglib2.0-0', + 'libgtk-3-0', + 'libgtk2.0-0', + 'libpango-1.0-0', + 'libpangocairo-1.0-0', + 'libpangoft2-1.0-0', + 'libx11-6', + 'libx11-xcb1', + 'libxcb-shm0', + 'libxcb1', + 'libxcomposite1', + 'libxcursor1', + 'libxdamage1', + 'libxext6', + 'libxfixes3', + 'libxi6', + 'libxrender1', + 'libxt6', + ], + webkit: [ + 'gstreamer1.0-libav', + 'gstreamer1.0-plugins-bad', + 'gstreamer1.0-plugins-base', + 'gstreamer1.0-plugins-good', + 'libatk-bridge2.0-0', + 'libatk1.0-0', + 'libbrotli1', + 'libcairo2', + 'libegl1', + 'libenchant1c2a', + 'libepoxy0', + 'libevdev2', + 'libfontconfig1', + 'libfreetype6', + 'libgdk-pixbuf2.0-0', + 'libgl1', + 'libgles2', + 'libglib2.0-0', + 'libgstreamer-gl1.0-0', + 'libgstreamer1.0-0', + 'libgtk-3-0', + 'libharfbuzz-icu0', + 'libharfbuzz0b', + 'libhyphen0', + 'libicu60', + 'libjpeg-turbo8', + 'libnotify4', + 'libopenjp2-7', + 'libopus0', + 'libpango-1.0-0', + 'libpng16-16', + 'libsecret-1-0', + 'libvpx5', + 'libwayland-client0', + 'libwayland-egl1', + 'libwayland-server0', + 'libwebp6', + 'libwebpdemux2', + 'libwoff1', + 'libx11-6', + 'libxcomposite1', + 'libxdamage1', + 'libxkbcommon0', + 'libxml2', + 'libxslt1.1', + 'libevent-2.1-6', + ], + }, + + 'ubuntu20.04': { + tools: [ + 'xvfb', + 'fonts-noto-color-emoji', + 'ttf-unifont', + 'libfontconfig', + 'libfreetype6', + 'xfonts-cyrillic', + 'xfonts-scalable', + 'fonts-liberation', + 'fonts-ipafont-gothic', + 'fonts-wqy-zenhei', + 'fonts-tlwg-loma-otf', + 'ttf-ubuntu-font-family', + ], + chromium: [ + 'fonts-liberation', + 'libasound2', + 'libatk-bridge2.0-0', + 'libatk1.0-0', + 'libatspi2.0-0', + 'libcairo2', + 'libcups2', + 'libdbus-1-3', + 'libdrm2', + 'libegl1', + 'libgbm1', + 'libgdk-pixbuf2.0-0', + 'libglib2.0-0', + 'libgtk-3-0', + 'libnspr4', + 'libnss3', + 'libpango-1.0-0', + 'libpangocairo-1.0-0', + 'libx11-6', + 'libx11-xcb1', + 'libxcb-dri3-0', + 'libxcb1', + 'libxcomposite1', + 'libxdamage1', + 'libxext6', + 'libxfixes3', + 'libxi6', + 'libxrandr2', + 'libxshmfence1', + 'libxtst6', + ], + firefox: [ + 'libatk1.0-0', + 'libcairo-gobject2', + 'libcairo2', + 'libdbus-1-3', + 'libdbus-glib-1-2', + 'libfontconfig1', + 'libfreetype6', + 'libgdk-pixbuf2.0-0', + 'libglib2.0-0', + 'libgtk-3-0', + 'libgtk2.0-0', + 'libpango-1.0-0', + 'libpangocairo-1.0-0', + 'libpangoft2-1.0-0', + 'libx11-6', + 'libx11-xcb1', + 'libxcb-shm0', + 'libxcb1', + 'libxcomposite1', + 'libxcursor1', + 'libxdamage1', + 'libxext6', + 'libxfixes3', + 'libxi6', + 'libxrender1', + 'libxt6', + 'libxtst6', + ], + webkit: [ + 'libenchant-2-2', + 'gstreamer1.0-libav', + 'gstreamer1.0-plugins-bad', + 'gstreamer1.0-plugins-base', + 'gstreamer1.0-plugins-good', + 'libatk-bridge2.0-0', + 'libatk1.0-0', + 'libcairo2', + 'libegl1', + 'libenchant1c2a', + 'libepoxy0', + 'libevdev2', + 'libfontconfig1', + 'libfreetype6', + 'libgdk-pixbuf2.0-0', + 'libgl1', + 'libgles2', + 'libglib2.0-0', + 'libgstreamer-gl1.0-0', + 'libgstreamer1.0-0', + 'libgtk-3-0', + 'libharfbuzz-icu0', + 'libharfbuzz0b', + 'libhyphen0', + 'libicu66', + 'libjpeg-turbo8', + 'libnotify4', + 'libopenjp2-7', + 'libopus0', + 'libpango-1.0-0', + 'libpng16-16', + 'libsecret-1-0', + 'libsoup2.4-1', + 'libvpx6', + 'libwayland-client0', + 'libwayland-egl1', + 'libwayland-server0', + 'libwebp6', + 'libwebpdemux2', + 'libwoff1', + 'libx11-6', + 'libxcomposite1', + 'libxdamage1', + 'libxkbcommon0', + 'libxml2', + 'libxslt1.1', + 'libopengl0', + 'libatomic1', + 'libevent-2.1-7', + ], + }, + + 'ubuntu22.04': { + tools: [ + 'xvfb', + 'fonts-noto-color-emoji', + 'fonts-unifont', + 'libfontconfig1', + 'libfreetype6', + 'xfonts-cyrillic', + 'xfonts-scalable', + 'fonts-liberation', + 'fonts-ipafont-gothic', + 'fonts-wqy-zenhei', + 'fonts-tlwg-loma-otf', + 'fonts-freefont-ttf', + ], + chromium: [ + 'libasound2', + 'libatk-bridge2.0-0', + 'libatk1.0-0', + 'libatspi2.0-0', + 'libcairo2', + 'libcups2', + 'libdbus-1-3', + 'libdrm2', + 'libgbm1', + 'libglib2.0-0', + 'libnspr4', + 'libnss3', + 'libpango-1.0-0', + 'libwayland-client0', + 'libx11-6', + 'libxcb1', + 'libxcomposite1', + 'libxdamage1', + 'libxext6', + 'libxfixes3', + 'libxkbcommon0', + 'libxrandr2' + ], + firefox: [ + 'ffmpeg', + 'libasound2', + 'libatk1.0-0', + 'libcairo-gobject2', + 'libcairo2', + 'libdbus-1-3', + 'libdbus-glib-1-2', + 'libfontconfig1', + 'libfreetype6', + 'libgdk-pixbuf-2.0-0', + 'libglib2.0-0', + 'libgtk-3-0', + 'libpango-1.0-0', + 'libpangocairo-1.0-0', + 'libx11-6', + 'libx11-xcb1', + 'libxcb-shm0', + 'libxcb1', + 'libxcomposite1', + 'libxcursor1', + 'libxdamage1', + 'libxext6', + 'libxfixes3', + 'libxi6', + 'libxrandr2', + 'libxrender1', + 'libxtst6' + ], + webkit: [ + 'libenchant-2-2', + 'gstreamer1.0-libav', + 'gstreamer1.0-plugins-bad', + 'gstreamer1.0-plugins-base', + 'gstreamer1.0-plugins-good', + 'libicu70', + 'libatk-bridge2.0-0', + 'libatk1.0-0', + 'libcairo2', + 'libdbus-1-3', + 'libdrm2', + 'libegl1', + 'libepoxy0', + 'libevdev2', + 'libffi7', + 'libfontconfig1', + 'libfreetype6', + 'libgbm1', + 'libgdk-pixbuf-2.0-0', + 'libgles2', + 'libglib2.0-0', + 'libglx0', + 'libgstreamer-gl1.0-0', + 'libgstreamer-plugins-base1.0-0', + 'libgstreamer1.0-0', + 'libgtk-3-0', + 'libgudev-1.0-0', + 'libharfbuzz-icu0', + 'libharfbuzz0b', + 'libhyphen0', + 'libjpeg-turbo8', + 'liblcms2-2', + 'libmanette-0.2-0', + 'libnotify4', + 'libopengl0', + 'libopenjp2-7', + 'libopus0', + 'libpango-1.0-0', + 'libpng16-16', + 'libproxy1v5', + 'libsecret-1-0', + 'libsoup2.4-1', + 'libwayland-client0', + 'libwayland-egl1', + 'libwayland-server0', + 'libwebpdemux2', + 'libwoff1', + 'libx11-6', + 'libxcomposite1', + 'libxdamage1', + 'libxkbcommon0', + 'libxml2', + 'libxslt1.1', + 'libx264-163', + 'libatomic1', + 'libevent-2.1-7', + ], + } +}; + +async function run() { + try { + if (os.platform() === 'linux') { + await exec('sudo', ['apt-get', 'update']); + const ubuntuVersion = await getUbuntuVersion(); + let deps = []; + if (ubuntuVersion === '18.04') + deps = DEPENDENCIES['ubuntu18.04']; + else if (ubuntuVersion === '20.04') + deps = DEPENDENCIES['ubuntu20.04']; + else if (ubuntuVersion === '22.04') + deps = DEPENDENCIES['ubuntu22.04']; + else + throw new Error('Cannot install dependencies for this linux distribution!'); + await exec('sudo', ['apt-get', 'install', '-y', '--no-install-recommends', + ...deps.chromium, + ...deps.firefox, + ...deps.webkit, + ...deps.tools, + ]); + } + } + catch (error) { + core.setFailed(error.message); + } +} + +async function getUbuntuVersion() { + if (os.platform() !== 'linux') + return ''; + const osReleaseText = await readFileAsync('/etc/os-release', 'utf8').catch(() => {}); + if (!osReleaseText) + return ''; + + const fields = new Map(); + for (const line of osReleaseText.split('\n')) { + const tokens = line.split('='); + const name = tokens.shift(); + let value = tokens.join('=').trim(); + if (value.startsWith('"') && value.endsWith('"')) + value = value.substring(1, value.length - 1); + if (!name) + continue; + fields.set(name.toLowerCase(), value); + } + if (!fields.get('name') || fields.get('name').toLowerCase() !== 'ubuntu') + return ''; + return fields.get('version_id') || ''; +} + +run() From 1c8968285780f46216b622b115849c7f9af16dd5 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:06:13 -0700 Subject: [PATCH 353/462] Update powershell.yml Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- .github/workflows/powershell.yml | 76 ++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 6f50e37..dae5311 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -5,32 +5,54 @@ on: permissions: contents: read - + jobs: - test: - timeout-minutes: 5 - runs-on: ubuntu-latest + test-linux: + name: Playwright@${{ matrix.playwright}} ${{ matrix.os }} headless=${{ matrix.headless }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-20.04, windows-latest] + playwright: [1.8.0, 1.12.0, 1.18.0, next, beta] + headless: [true, false] + exclude: + - os: ubuntu-20.04 + playwright: 1.0.0 + - os: ubuntu-20.04 + playwright: 1.1.0 + - os: ubuntu-20.04 + playwright: 1.2.0 + - os: ubuntu-22.04 + playwright: 1.23 + - os: ubuntu-22.04 + playwright: 1.25 + - os: ubuntu-22.04 + playwright: next + - os: ubuntu-20.04 + playwright: latest + include: + - os: ubuntu-22.04 + playwright: next + + runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - name: Install dependency npm - run: - npm ci - - name: Uninstall Playwright - run: npm uninstall playwright - - name: Install Playwright npm test package - run: npm install -D @playwright/test - - name: Install Playwright Chromium browser only - run: npx playwright install chromium - - name: Run Playwright tests UI mode - run: npx playwright test --ui - - name: Show Playwright HTML test reports - run: npx playwright show-report - - uses: actions/upload-artifact@v3 - if: always() - with: - name: playwright-report - path: playwright-report/ - retention-days: 3 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + - uses: ./ + - name: Install dependencies + run: cd sample && npm install playwright@${{ matrix.playwright }} + # Headless running is the same across OSes + - name: Run Playwright (headless) + if: ${{ matrix.headless == true }} + run: cd sample && node index.js + + # Headful is different in every OS + - name: Run Playwright (headful linux) + if: ${{ matrix.headless == false && startsWith(matrix.os, 'ubuntu') }} + run: cd sample && HEADFUL=true xvfb-run --auto-servernum -- node index.js + - name: Run Playwright (headful windows) + if: ${{ matrix.headless == false && startsWith(matrix.os, 'windows') }} + run: cd sample && HEADFUL=true node index.js + shell: bash From 6bd474f99befe6923a48d104296e689837f3614e Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:11:11 -0700 Subject: [PATCH 354/462] Revert "Update powershell.yml with tests.yml" --- .github/workflows/powershell.yml | 76 ++++++++++++-------------------- 1 file changed, 27 insertions(+), 49 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index dae5311..6f50e37 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -5,54 +5,32 @@ on: permissions: contents: read - + jobs: - test-linux: - name: Playwright@${{ matrix.playwright}} ${{ matrix.os }} headless=${{ matrix.headless }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-20.04, windows-latest] - playwright: [1.8.0, 1.12.0, 1.18.0, next, beta] - headless: [true, false] - exclude: - - os: ubuntu-20.04 - playwright: 1.0.0 - - os: ubuntu-20.04 - playwright: 1.1.0 - - os: ubuntu-20.04 - playwright: 1.2.0 - - os: ubuntu-22.04 - playwright: 1.23 - - os: ubuntu-22.04 - playwright: 1.25 - - os: ubuntu-22.04 - playwright: next - - os: ubuntu-20.04 - playwright: latest - include: - - os: ubuntu-22.04 - playwright: next - - runs-on: ${{ matrix.os }} + test: + timeout-minutes: 5 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - uses: ./ - - name: Install dependencies - run: cd sample && npm install playwright@${{ matrix.playwright }} - # Headless running is the same across OSes - - name: Run Playwright (headless) - if: ${{ matrix.headless == true }} - run: cd sample && node index.js - - # Headful is different in every OS - - name: Run Playwright (headful linux) - if: ${{ matrix.headless == false && startsWith(matrix.os, 'ubuntu') }} - run: cd sample && HEADFUL=true xvfb-run --auto-servernum -- node index.js - - name: Run Playwright (headful windows) - if: ${{ matrix.headless == false && startsWith(matrix.os, 'windows') }} - run: cd sample && HEADFUL=true node index.js - shell: bash + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + - name: Install dependency npm + run: + npm ci + - name: Uninstall Playwright + run: npm uninstall playwright + - name: Install Playwright npm test package + run: npm install -D @playwright/test + - name: Install Playwright Chromium browser only + run: npx playwright install chromium + - name: Run Playwright tests UI mode + run: npx playwright test --ui + - name: Show Playwright HTML test reports + run: npx playwright show-report + - uses: actions/upload-artifact@v3 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 3 From f448fdf267f3168658a7092dc00252b9faef6819 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:19:41 -0700 Subject: [PATCH 355/462] Update powershell.yml - name: Run Playwright tests UI mode (headful linux) run: HEADFUL=true xvfb-run --auto-servernum && npx playwright test --ui Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- .github/workflows/powershell.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 6f50e37..618b5cc 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -24,8 +24,8 @@ jobs: run: npm install -D @playwright/test - name: Install Playwright Chromium browser only run: npx playwright install chromium - - name: Run Playwright tests UI mode - run: npx playwright test --ui + - name: Run Playwright tests UI mode (headful linux) + run: HEADFUL=true xvfb-run --auto-servernum && npx playwright test --ui - name: Show Playwright HTML test reports run: npx playwright show-report - uses: actions/upload-artifact@v3 From 42b03e5f4e2ac018f0a65b2065eb21a6599a9256 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:25:00 -0700 Subject: [PATCH 356/462] Delete index.js Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- index.js | 444 ------------------------------------------------------- 1 file changed, 444 deletions(-) delete mode 100644 index.js diff --git a/index.js b/index.js deleted file mode 100644 index 6fdcf0c..0000000 --- a/index.js +++ /dev/null @@ -1,444 +0,0 @@ -const core = require('@actions/core'); -const { exec } = require('@actions/exec'); -const os = require('os'); -const util = require('util'); -const fs = require('fs'); - -const readFileAsync = util.promisify(fs.readFile.bind(fs)); - -const DEPENDENCIES = { - 'ubuntu18.04': { - tools: [ - 'xvfb', - 'fonts-noto-color-emoji', - 'ttf-unifont', - 'libfontconfig', - 'libfreetype6', - 'xfonts-cyrillic', - 'xfonts-scalable', - 'fonts-liberation', - 'fonts-ipafont-gothic', - 'fonts-wqy-zenhei', - 'fonts-tlwg-loma-otf', - 'ttf-ubuntu-font-family', - ], - chromium: [ - 'fonts-liberation', - 'libasound2', - 'libatk-bridge2.0-0', - 'libatk1.0-0', - 'libatspi2.0-0', - 'libcairo2', - 'libcups2', - 'libdbus-1-3', - 'libdrm2', - 'libegl1', - 'libgbm1', - 'libgdk-pixbuf2.0-0', - 'libglib2.0-0', - 'libgtk-3-0', - 'libnspr4', - 'libnss3', - 'libpango-1.0-0', - 'libpangocairo-1.0-0', - 'libx11-6', - 'libx11-xcb1', - 'libxcb-dri3-0', - 'libxcb1', - 'libxcomposite1', - 'libxdamage1', - 'libxext6', - 'libxfixes3', - 'libxi6', - 'libxrandr2', - 'libxshmfence1', - 'libxtst6', - ], - firefox: [ - 'ffmpeg', - 'libatk1.0-0', - 'libcairo-gobject2', - 'libcairo2', - 'libdbus-1-3', - 'libdbus-glib-1-2', - 'libfontconfig1', - 'libfreetype6', - 'libgdk-pixbuf2.0-0', - 'libglib2.0-0', - 'libgtk-3-0', - 'libgtk2.0-0', - 'libpango-1.0-0', - 'libpangocairo-1.0-0', - 'libpangoft2-1.0-0', - 'libx11-6', - 'libx11-xcb1', - 'libxcb-shm0', - 'libxcb1', - 'libxcomposite1', - 'libxcursor1', - 'libxdamage1', - 'libxext6', - 'libxfixes3', - 'libxi6', - 'libxrender1', - 'libxt6', - ], - webkit: [ - 'gstreamer1.0-libav', - 'gstreamer1.0-plugins-bad', - 'gstreamer1.0-plugins-base', - 'gstreamer1.0-plugins-good', - 'libatk-bridge2.0-0', - 'libatk1.0-0', - 'libbrotli1', - 'libcairo2', - 'libegl1', - 'libenchant1c2a', - 'libepoxy0', - 'libevdev2', - 'libfontconfig1', - 'libfreetype6', - 'libgdk-pixbuf2.0-0', - 'libgl1', - 'libgles2', - 'libglib2.0-0', - 'libgstreamer-gl1.0-0', - 'libgstreamer1.0-0', - 'libgtk-3-0', - 'libharfbuzz-icu0', - 'libharfbuzz0b', - 'libhyphen0', - 'libicu60', - 'libjpeg-turbo8', - 'libnotify4', - 'libopenjp2-7', - 'libopus0', - 'libpango-1.0-0', - 'libpng16-16', - 'libsecret-1-0', - 'libvpx5', - 'libwayland-client0', - 'libwayland-egl1', - 'libwayland-server0', - 'libwebp6', - 'libwebpdemux2', - 'libwoff1', - 'libx11-6', - 'libxcomposite1', - 'libxdamage1', - 'libxkbcommon0', - 'libxml2', - 'libxslt1.1', - 'libevent-2.1-6', - ], - }, - - 'ubuntu20.04': { - tools: [ - 'xvfb', - 'fonts-noto-color-emoji', - 'ttf-unifont', - 'libfontconfig', - 'libfreetype6', - 'xfonts-cyrillic', - 'xfonts-scalable', - 'fonts-liberation', - 'fonts-ipafont-gothic', - 'fonts-wqy-zenhei', - 'fonts-tlwg-loma-otf', - 'ttf-ubuntu-font-family', - ], - chromium: [ - 'fonts-liberation', - 'libasound2', - 'libatk-bridge2.0-0', - 'libatk1.0-0', - 'libatspi2.0-0', - 'libcairo2', - 'libcups2', - 'libdbus-1-3', - 'libdrm2', - 'libegl1', - 'libgbm1', - 'libgdk-pixbuf2.0-0', - 'libglib2.0-0', - 'libgtk-3-0', - 'libnspr4', - 'libnss3', - 'libpango-1.0-0', - 'libpangocairo-1.0-0', - 'libx11-6', - 'libx11-xcb1', - 'libxcb-dri3-0', - 'libxcb1', - 'libxcomposite1', - 'libxdamage1', - 'libxext6', - 'libxfixes3', - 'libxi6', - 'libxrandr2', - 'libxshmfence1', - 'libxtst6', - ], - firefox: [ - 'libatk1.0-0', - 'libcairo-gobject2', - 'libcairo2', - 'libdbus-1-3', - 'libdbus-glib-1-2', - 'libfontconfig1', - 'libfreetype6', - 'libgdk-pixbuf2.0-0', - 'libglib2.0-0', - 'libgtk-3-0', - 'libgtk2.0-0', - 'libpango-1.0-0', - 'libpangocairo-1.0-0', - 'libpangoft2-1.0-0', - 'libx11-6', - 'libx11-xcb1', - 'libxcb-shm0', - 'libxcb1', - 'libxcomposite1', - 'libxcursor1', - 'libxdamage1', - 'libxext6', - 'libxfixes3', - 'libxi6', - 'libxrender1', - 'libxt6', - 'libxtst6', - ], - webkit: [ - 'libenchant-2-2', - 'gstreamer1.0-libav', - 'gstreamer1.0-plugins-bad', - 'gstreamer1.0-plugins-base', - 'gstreamer1.0-plugins-good', - 'libatk-bridge2.0-0', - 'libatk1.0-0', - 'libcairo2', - 'libegl1', - 'libenchant1c2a', - 'libepoxy0', - 'libevdev2', - 'libfontconfig1', - 'libfreetype6', - 'libgdk-pixbuf2.0-0', - 'libgl1', - 'libgles2', - 'libglib2.0-0', - 'libgstreamer-gl1.0-0', - 'libgstreamer1.0-0', - 'libgtk-3-0', - 'libharfbuzz-icu0', - 'libharfbuzz0b', - 'libhyphen0', - 'libicu66', - 'libjpeg-turbo8', - 'libnotify4', - 'libopenjp2-7', - 'libopus0', - 'libpango-1.0-0', - 'libpng16-16', - 'libsecret-1-0', - 'libsoup2.4-1', - 'libvpx6', - 'libwayland-client0', - 'libwayland-egl1', - 'libwayland-server0', - 'libwebp6', - 'libwebpdemux2', - 'libwoff1', - 'libx11-6', - 'libxcomposite1', - 'libxdamage1', - 'libxkbcommon0', - 'libxml2', - 'libxslt1.1', - 'libopengl0', - 'libatomic1', - 'libevent-2.1-7', - ], - }, - - 'ubuntu22.04': { - tools: [ - 'xvfb', - 'fonts-noto-color-emoji', - 'fonts-unifont', - 'libfontconfig1', - 'libfreetype6', - 'xfonts-cyrillic', - 'xfonts-scalable', - 'fonts-liberation', - 'fonts-ipafont-gothic', - 'fonts-wqy-zenhei', - 'fonts-tlwg-loma-otf', - 'fonts-freefont-ttf', - ], - chromium: [ - 'libasound2', - 'libatk-bridge2.0-0', - 'libatk1.0-0', - 'libatspi2.0-0', - 'libcairo2', - 'libcups2', - 'libdbus-1-3', - 'libdrm2', - 'libgbm1', - 'libglib2.0-0', - 'libnspr4', - 'libnss3', - 'libpango-1.0-0', - 'libwayland-client0', - 'libx11-6', - 'libxcb1', - 'libxcomposite1', - 'libxdamage1', - 'libxext6', - 'libxfixes3', - 'libxkbcommon0', - 'libxrandr2' - ], - firefox: [ - 'ffmpeg', - 'libasound2', - 'libatk1.0-0', - 'libcairo-gobject2', - 'libcairo2', - 'libdbus-1-3', - 'libdbus-glib-1-2', - 'libfontconfig1', - 'libfreetype6', - 'libgdk-pixbuf-2.0-0', - 'libglib2.0-0', - 'libgtk-3-0', - 'libpango-1.0-0', - 'libpangocairo-1.0-0', - 'libx11-6', - 'libx11-xcb1', - 'libxcb-shm0', - 'libxcb1', - 'libxcomposite1', - 'libxcursor1', - 'libxdamage1', - 'libxext6', - 'libxfixes3', - 'libxi6', - 'libxrandr2', - 'libxrender1', - 'libxtst6' - ], - webkit: [ - 'libenchant-2-2', - 'gstreamer1.0-libav', - 'gstreamer1.0-plugins-bad', - 'gstreamer1.0-plugins-base', - 'gstreamer1.0-plugins-good', - 'libicu70', - 'libatk-bridge2.0-0', - 'libatk1.0-0', - 'libcairo2', - 'libdbus-1-3', - 'libdrm2', - 'libegl1', - 'libepoxy0', - 'libevdev2', - 'libffi7', - 'libfontconfig1', - 'libfreetype6', - 'libgbm1', - 'libgdk-pixbuf-2.0-0', - 'libgles2', - 'libglib2.0-0', - 'libglx0', - 'libgstreamer-gl1.0-0', - 'libgstreamer-plugins-base1.0-0', - 'libgstreamer1.0-0', - 'libgtk-3-0', - 'libgudev-1.0-0', - 'libharfbuzz-icu0', - 'libharfbuzz0b', - 'libhyphen0', - 'libjpeg-turbo8', - 'liblcms2-2', - 'libmanette-0.2-0', - 'libnotify4', - 'libopengl0', - 'libopenjp2-7', - 'libopus0', - 'libpango-1.0-0', - 'libpng16-16', - 'libproxy1v5', - 'libsecret-1-0', - 'libsoup2.4-1', - 'libwayland-client0', - 'libwayland-egl1', - 'libwayland-server0', - 'libwebpdemux2', - 'libwoff1', - 'libx11-6', - 'libxcomposite1', - 'libxdamage1', - 'libxkbcommon0', - 'libxml2', - 'libxslt1.1', - 'libx264-163', - 'libatomic1', - 'libevent-2.1-7', - ], - } -}; - -async function run() { - try { - if (os.platform() === 'linux') { - await exec('sudo', ['apt-get', 'update']); - const ubuntuVersion = await getUbuntuVersion(); - let deps = []; - if (ubuntuVersion === '18.04') - deps = DEPENDENCIES['ubuntu18.04']; - else if (ubuntuVersion === '20.04') - deps = DEPENDENCIES['ubuntu20.04']; - else if (ubuntuVersion === '22.04') - deps = DEPENDENCIES['ubuntu22.04']; - else - throw new Error('Cannot install dependencies for this linux distribution!'); - await exec('sudo', ['apt-get', 'install', '-y', '--no-install-recommends', - ...deps.chromium, - ...deps.firefox, - ...deps.webkit, - ...deps.tools, - ]); - } - } - catch (error) { - core.setFailed(error.message); - } -} - -async function getUbuntuVersion() { - if (os.platform() !== 'linux') - return ''; - const osReleaseText = await readFileAsync('/etc/os-release', 'utf8').catch(() => {}); - if (!osReleaseText) - return ''; - - const fields = new Map(); - for (const line of osReleaseText.split('\n')) { - const tokens = line.split('='); - const name = tokens.shift(); - let value = tokens.join('=').trim(); - if (value.startsWith('"') && value.endsWith('"')) - value = value.substring(1, value.length - 1); - if (!name) - continue; - fields.set(name.toLowerCase(), value); - } - if (!fields.get('name') || fields.get('name').toLowerCase() !== 'ubuntu') - return ''; - return fields.get('version_id') || ''; -} - -run() From d99bab01df250b2594abc7e31ad0bc1593a7ca7d Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:28:33 -0700 Subject: [PATCH 357/462] Update playwright.config.ts uncommented webserver Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- playwright.config.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/playwright.config.ts b/playwright.config.ts index 3404e3c..bd2a798 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -69,9 +69,9 @@ export default defineConfig({ ], /* Run your local dev server before starting the tests */ - // webServer: { - // command: 'npm run start', - // url: 'http://127.0.0.1:3000', - // reuseExistingServer: !process.env.CI, - // }, + webServer: { + command: 'npm run start', + url: 'http://127.0.0.1:3000', + reuseExistingServer: !process.env.CI, + }, }); From 5651b151750a4fd3eb6710fef6ef1da7012c8572 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:31:28 -0700 Subject: [PATCH 358/462] Update powershell.yml Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- .github/workflows/powershell.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index 618b5cc..be7c32b 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -24,8 +24,8 @@ jobs: run: npm install -D @playwright/test - name: Install Playwright Chromium browser only run: npx playwright install chromium - - name: Run Playwright tests UI mode (headful linux) - run: HEADFUL=true xvfb-run --auto-servernum && npx playwright test --ui + - name: Run Playwright tests UI mode + run: HEADFUL=true && npx playwright test --ui - name: Show Playwright HTML test reports run: npx playwright show-report - uses: actions/upload-artifact@v3 From 5a61b5418fd7d3f83812be3d0646078e3fdb4614 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:34:51 -0700 Subject: [PATCH 359/462] Update playwright.config.ts uncomment base url Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playwright.config.ts b/playwright.config.ts index bd2a798..70c78ac 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -24,7 +24,7 @@ export default defineConfig({ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://127.0.0.1:3000', + baseURL: 'http://127.0.0.1:3000', /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', From ab61420ae1f73438f4c2fef4b627e10750bb12f5 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:41:49 -0700 Subject: [PATCH 360/462] Update powershell.yml manually run workflow workflow dispatch: Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- .github/workflows/powershell.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml index be7c32b..347f009 100644 --- a/.github/workflows/powershell.yml +++ b/.github/workflows/powershell.yml @@ -2,6 +2,7 @@ name: Playwright Tests on: pull_request: branches: [main, master] + workflow_dispatch: permissions: contents: read From 349f3eb54e86f53890dcbceed5be9492af513a8a Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 13:56:33 -0700 Subject: [PATCH 361/462] Update package.json updated b/c I had it incorrect from the MS site Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- package.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index a7f8655..c641e8e 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,30 @@ { - "name": "playwright-github-action", + "name": "code-examples-powershell-private", "version": "1.0.0", "description": "Run Playwright tests on GitHub Actions", "main": "index.js", "scripts": { "lint": "eslint index.js", "build": "ncc build index.js -o dist", + "test:tests": "playwright tests", "package": "npm run build" }, "repository": { "type": "git", - "url": "git+https://github.com/microsoft/playwright-github-action.git" + "url": "git+https://github.com/docusign/code-examples-powershell-private.git" }, "author": "Microsoft", "license": "MIT", "bugs": { - "url": "https://github.com/microsoft/playwright-github-action/issues" + "url": "https://github.com/docusign/code-examples-powershell-private/issues" }, - "homepage": "https://github.com/microsoft/playwright-github-action#readme", + "homepage": "https://github.com/docusign/code-examples-powershell-private#readme", "dependencies": { "@actions/core": "^1.9.1", "@actions/exec": "^1.1.1" }, "devDependencies": { + "@playwright/test": "^1.37.1" "@zeit/ncc": "^0.20.5", "eslint": "^8.17.0" } From 6dea14abab62567747a6ae649cbe46b24db4b0eb Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:09:52 -0700 Subject: [PATCH 362/462] Update package.json updated per https://github.com/docusign/code-examples-node-private/blob/master/package.json to try to get rid of error Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index c641e8e..1b7c4ae 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "code-examples-powershell-private", + "name": "docusign-code-examples", "version": "1.0.0", - "description": "Run Playwright tests on GitHub Actions", + "description": "DocuSign eSignature Code examples using either Authorization Code Grant and JWT OAuth", "main": "index.js", "scripts": { "lint": "eslint index.js", @@ -11,9 +11,9 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/docusign/code-examples-powershell-private.git" + "url": "https://github.com/docusign/code-examples-powershell-private" }, - "author": "Microsoft", + "author": "DocuSign, Inc", "license": "MIT", "bugs": { "url": "https://github.com/docusign/code-examples-powershell-private/issues" From 84d004ccace72a7ed72d4c5fc01ad6284aae0442 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:12:29 -0700 Subject: [PATCH 363/462] Update package.json added missing comma Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1b7c4ae..d916d31 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "docusign-code-examples", + "name": "/code-examples-powershell-private", "version": "1.0.0", "description": "DocuSign eSignature Code examples using either Authorization Code Grant and JWT OAuth", "main": "index.js", @@ -24,7 +24,7 @@ "@actions/exec": "^1.1.1" }, "devDependencies": { - "@playwright/test": "^1.37.1" + "@playwright/test": "^1.37.1", "@zeit/ncc": "^0.20.5", "eslint": "^8.17.0" } From a60fb8faf29d1676290c2f601322591943656ccd Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:15:53 -0700 Subject: [PATCH 364/462] Update package-lock.json updated name in 2 places of this file Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 647759f..f95080c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "playwright-github-action", + "name": "code-examples-powershell-private", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "playwright-github-action", + "name": "code-examples-powershell-private", "version": "1.0.0", "license": "MIT", "dependencies": { From c1de829d039ff7840569d197ed6d5734aa8a13a6 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:17:48 -0700 Subject: [PATCH 365/462] Update package.json removed dependency b/c I'm not sure what the match would be in package-lock file "@playwright/test": "^1.22.2", Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index d916d31..b8622d4 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "@actions/exec": "^1.1.1" }, "devDependencies": { - "@playwright/test": "^1.37.1", "@zeit/ncc": "^0.20.5", "eslint": "^8.17.0" } From 21f2cddb263801a826505a513d9eca2d9e6f56c8 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:23:29 -0700 Subject: [PATCH 366/462] Update quickstartPage.spec.ts to localhost:5000 Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- tests/quickstartPage.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/quickstartPage.spec.ts b/tests/quickstartPage.spec.ts index b1fc57a..bb49320 100644 --- a/tests/quickstartPage.spec.ts +++ b/tests/quickstartPage.spec.ts @@ -1,14 +1,14 @@ import { test, expect } from '@playwright/test'; test('has title', async ({ page }) => { - await page.goto('https://developers.docusign.com/docs/esign-rest-api/quickstart/'); + await page.goto('http://localhost:5000/'); // Expect a title "to contain" a substring. await expect(page).toHaveTitle(/Quickstart/); }); test('get started link', async ({ page }) => { - await page.goto('https://developers.docusign.com/docs/esign-rest-api/quickstart/'); + await page.goto('http://localhost:5000/'); // Click the get started link. await page.getByRole('link', { name: 'Log in' }).click(); From 0b5bd0725e19acb39e71769cd0d393d5547521c8 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:39:44 -0700 Subject: [PATCH 367/462] Delete package.json Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- package.json | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 package.json diff --git a/package.json b/package.json deleted file mode 100644 index b8622d4..0000000 --- a/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "/code-examples-powershell-private", - "version": "1.0.0", - "description": "DocuSign eSignature Code examples using either Authorization Code Grant and JWT OAuth", - "main": "index.js", - "scripts": { - "lint": "eslint index.js", - "build": "ncc build index.js -o dist", - "test:tests": "playwright tests", - "package": "npm run build" - }, - "repository": { - "type": "git", - "url": "https://github.com/docusign/code-examples-powershell-private" - }, - "author": "DocuSign, Inc", - "license": "MIT", - "bugs": { - "url": "https://github.com/docusign/code-examples-powershell-private/issues" - }, - "homepage": "https://github.com/docusign/code-examples-powershell-private#readme", - "dependencies": { - "@actions/core": "^1.9.1", - "@actions/exec": "^1.1.1" - }, - "devDependencies": { - "@zeit/ncc": "^0.20.5", - "eslint": "^8.17.0" - } -} From ac8b0a74b08888cda6cdf7db1ad6708b4fd3805b Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:40:27 -0700 Subject: [PATCH 368/462] Delete package-lock.json Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- package-lock.json | 1692 --------------------------------------------- 1 file changed, 1692 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index f95080c..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1692 +0,0 @@ -{ - "name": "code-examples-powershell-private", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "code-examples-powershell-private", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@actions/core": "^1.9.1", - "@actions/exec": "^1.1.1" - }, - "devDependencies": { - "@zeit/ncc": "^0.20.5", - "eslint": "^8.17.0" - } - }, - "node_modules/@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", - "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "node_modules/@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", - "dependencies": { - "@actions/io": "^1.0.1" - } - }, - "node_modules/@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", - "dependencies": { - "tunnel": "^0.0.6" - } - }, - "node_modules/@actions/io": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.1.tgz", - "integrity": "sha512-Qi4JoKXjmE0O67wAOH6y0n26QXhMKMFo7GD/4IXNVcrtLjUlGjGuVys6pQgwF3ArfGTQu0XpqaNr0YhED2RaRA==" - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@zeit/ncc": { - "version": "0.20.5", - "resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.20.5.tgz", - "integrity": "sha512-XU6uzwvv95DqxciQx+aOLhbyBx/13ky+RK1y88Age9Du3BlA4mMPCy13BGjayOrrumOzlq1XV3SD/BWiZENXlw==", - "deprecated": "@zeit/ncc is no longer maintained. Please use @vercel/ncc instead.", - "dev": true, - "bin": { - "ncc": "dist/ncc/cli.js" - } - }, - "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", - "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", - "dev": true, - "dependencies": { - "acorn": "^8.7.1", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - }, - "dependencies": { - "@actions/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz", - "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==", - "requires": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", - "requires": { - "@actions/io": "^1.0.1" - } - }, - "@actions/http-client": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", - "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", - "requires": { - "tunnel": "^0.0.6" - } - }, - "@actions/io": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.1.tgz", - "integrity": "sha512-Qi4JoKXjmE0O67wAOH6y0n26QXhMKMFo7GD/4IXNVcrtLjUlGjGuVys6pQgwF3ArfGTQu0XpqaNr0YhED2RaRA==" - }, - "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.2", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@zeit/ncc": { - "version": "0.20.5", - "resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.20.5.tgz", - "integrity": "sha512-XU6uzwvv95DqxciQx+aOLhbyBx/13ky+RK1y88Age9Du3BlA4mMPCy13BGjayOrrumOzlq1XV3SD/BWiZENXlw==", - "dev": true - }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", - "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", - "dev": true, - "requires": { - "acorn": "^8.7.1", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } -} From 8dd45bfb92bf8bf06c29cab709d3d11e8bef6013 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:41:36 -0700 Subject: [PATCH 369/462] Delete .github/workflows/powershell.yml Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- .github/workflows/powershell.yml | 37 -------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 .github/workflows/powershell.yml diff --git a/.github/workflows/powershell.yml b/.github/workflows/powershell.yml deleted file mode 100644 index 347f009..0000000 --- a/.github/workflows/powershell.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Playwright Tests -on: - pull_request: - branches: [main, master] - workflow_dispatch: - -permissions: - contents: read - -jobs: - test: - timeout-minutes: 5 - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18 - - name: Install dependency npm - run: - npm ci - - name: Uninstall Playwright - run: npm uninstall playwright - - name: Install Playwright npm test package - run: npm install -D @playwright/test - - name: Install Playwright Chromium browser only - run: npx playwright install chromium - - name: Run Playwright tests UI mode - run: HEADFUL=true && npx playwright test --ui - - name: Show Playwright HTML test reports - run: npx playwright show-report - - uses: actions/upload-artifact@v3 - if: always() - with: - name: playwright-report - path: playwright-report/ - retention-days: 3 From 7a13e6a655b2033ed199ef4750b8db9157b6e765 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:42:45 -0700 Subject: [PATCH 370/462] Delete tests directory Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- tests/example.spec.ts | 18 ------------------ tests/quickstartPage.spec.ts | 18 ------------------ 2 files changed, 36 deletions(-) delete mode 100644 tests/example.spec.ts delete mode 100644 tests/quickstartPage.spec.ts diff --git a/tests/example.spec.ts b/tests/example.spec.ts deleted file mode 100644 index 54a906a..0000000 --- a/tests/example.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test('has title', async ({ page }) => { - await page.goto('https://playwright.dev/'); - - // Expect a title "to contain" a substring. - await expect(page).toHaveTitle(/Playwright/); -}); - -test('get started link', async ({ page }) => { - await page.goto('https://playwright.dev/'); - - // Click the get started link. - await page.getByRole('link', { name: 'Get started' }).click(); - - // Expects page to have a heading with the name of Installation. - await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible(); -}); diff --git a/tests/quickstartPage.spec.ts b/tests/quickstartPage.spec.ts deleted file mode 100644 index bb49320..0000000 --- a/tests/quickstartPage.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test('has title', async ({ page }) => { - await page.goto('http://localhost:5000/'); - - // Expect a title "to contain" a substring. - await expect(page).toHaveTitle(/Quickstart/); -}); - -test('get started link', async ({ page }) => { - await page.goto('http://localhost:5000/'); - - // Click the get started link. - await page.getByRole('link', { name: 'Log in' }).click(); - - // Expects page to have a heading with the name of Installation. - await expect(page.getByRole('heading', { name: 'Log In' })).toBeVisible(); -}); From 1abd1bb4c383968f2f5eecefcadc296adb357ba9 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:43:19 -0700 Subject: [PATCH 371/462] Delete playwright.config.ts Signed-off-by: meihDS <70775251+meihDS@users.noreply.github.com> --- playwright.config.ts | 77 -------------------------------------------- 1 file changed, 77 deletions(-) delete mode 100644 playwright.config.ts diff --git a/playwright.config.ts b/playwright.config.ts deleted file mode 100644 index 70c78ac..0000000 --- a/playwright.config.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { defineConfig, devices } from '@playwright/test'; - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - testDir: './tests', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - /* - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - { - name: 'webkit', - use: { ...devices['Desktop Safari'] }, - }, - */ - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ - webServer: { - command: 'npm run start', - url: 'http://127.0.0.1:3000', - reuseExistingServer: !process.env.CI, - }, -}); From 27f7999eb9d5464066771d6b9dc1290ed45e0caf Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Wed, 6 Sep 2023 13:12:24 +0300 Subject: [PATCH 372/462] added code example --- OAuth/code_grant.ps1 | 2 +- OAuth/jwt.ps1 | 2 +- examples/Admin/eg012CloneAccount.ps1 | 112 +++++++++++++++++++++++++++ launcher.ps1 | 8 +- 4 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 examples/Admin/eg012CloneAccount.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index f861282..41e1244 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -30,7 +30,7 @@ elseif ($apiVersion -eq "monitor") { $scopes = "signature impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact" + $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read" } elseif ($apiVersion -eq "notary") { $scopes = "signature%20organization_read%20notary_read%20notary_write" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 28845f1..c8b56ca 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -43,7 +43,7 @@ if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact" + $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read" } elseif ($apiVersion -eq "notary") { $scopes = "signature%20organization_read%20notary_read%20notary_write" diff --git a/examples/Admin/eg012CloneAccount.ps1 b/examples/Admin/eg012CloneAccount.ps1 new file mode 100644 index 0000000..83588cc --- /dev/null +++ b/examples/Admin/eg012CloneAccount.ps1 @@ -0,0 +1,112 @@ +$accessToken = Get-Content .\config\ds_access_token.txt + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +$basePath = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +# Construct your API headers +#ds-snippet-start:Admin12Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Admin12Step2 + +$response = $null + +try { + # Retrieve asset group accounts + Write-Output "" + Write-Output "Accounts to clone:" + + #ds-snippet-start:Admin12Step3 + $uri = "${basePath}/v1/organizations/${organizationId}/assetGroups/accounts?compliant=true" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + #ds-snippet-end:Admin12Step3 +} catch { + Write-Output "Unable retrieve asset group accounts." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +$sourceAccountId = $null +$accounts = $($response.Content | ConvertFrom-Json).assetGroupAccounts +if ($accounts.count -eq 1){ + $sourceAccountId = $accounts[0].accountId +} else { + $menu = @{} + for ($i=1;$i -le $accounts.count; $i++) + { Write-Output "$i. $($accounts[$i-1].accountName)" + $menu.Add($i,($accounts[$i-1].accountId))} + do { + [int]$selection = Read-Host 'Select an account to clone' + } while ($selection -gt $accounts.count -or $selection -lt 1); + $sourceAccountId = $menu.Item($selection) +} + +$targetAccountName = Read-Host "Please enter the name of the new account" +$targetAccountFirstName = Read-Host "Please enter the first name of the new account admin" +$targetAccountLastName = Read-Host "Please enter the last name of the new account admin" +$targetAccountEmail = Read-Host "Please enter the email address of the new account admin" + +#ds-snippet-start:Admin12Step4 +# The country code value is set to "US" for the developer environment +# In production, set the value to the code for the country of the target account +$body = @" +{ + "sourceAccount": { + "id": "$sourceAccountId" + }, + "targetAccount": { + "name": "$targetAccountName", + "admin": { + "firstName": "$targetAccountFirstName", + "lastName": "$targetAccountLastName", + "email": "$targetAccountEmail" + }, + "countryCode": "US" + } +} +"@ +#ds-snippet-end:Admin12Step4 + +try { + # Clone source account into new account + Write-Output "" + Write-Output "Response:" + + #ds-snippet-start:Admin12Step5 + $uri = "${basePath}/v1/organizations/${organizationId}/assetGroups/accountClone" + $response = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + #ds-snippet-end:Admin12Step5 +} catch { + Write-Output "Failed to clone an account." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +Write-Output "" +Write-Output "Done" diff --git a/launcher.ps1 b/launcher.ps1 index fb1be6d..659381a 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -807,7 +807,8 @@ function startAdmin { deleteUserProductPermissionProfile = 9; deleteUserDataFromOrganization = 10; deleteUserDataFromAccount = 11; - Pick_An_API = 12; + cloneAccount = 12; + Pick_An_API = 13; } $listAdminExamplesView = $null; do { @@ -824,6 +825,7 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::deleteUserProductPermissionProfile)) Delete user product permission profiles using an email address" Write-Output "$([int][listAdminExamples]::deleteUserDataFromOrganization)) Delete user data from organization" Write-Output "$([int][listAdminExamples]::deleteUserDataFromAccount)) Delete user data from account" + Write-Output "$([int][listAdminExamples]::cloneAccount)) Clone Account" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -874,6 +876,10 @@ function startAdmin { checkOrgId powershell.exe -Command .\examples\Admin\eg011DeleteUserDataFromAccount.ps1 } + elseif ($listAdminExamplesView -eq [listAdminExamples]::cloneAccount) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg012CloneAccount.ps1 + } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } From a559dc374ef929246355a7a585a958b89357eddb Mon Sep 17 00:00:00 2001 From: inbargazit Date: Thu, 7 Sep 2023 14:23:43 -0700 Subject: [PATCH 373/462] Adding new Admin API code example to clone accounts --- examples/Admin/eg012CloneAccount.ps1 | 112 ++++++++++++++++++++ examples/eSignature/eg036DelayedRouting.ps1 | 2 +- examples/eSignature/eg037SMSDelivery.ps1 | 38 +++++-- launcher.ps1 | 14 ++- 4 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 examples/Admin/eg012CloneAccount.ps1 diff --git a/examples/Admin/eg012CloneAccount.ps1 b/examples/Admin/eg012CloneAccount.ps1 new file mode 100644 index 0000000..83588cc --- /dev/null +++ b/examples/Admin/eg012CloneAccount.ps1 @@ -0,0 +1,112 @@ +$accessToken = Get-Content .\config\ds_access_token.txt + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +$basePath = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +# Construct your API headers +#ds-snippet-start:Admin12Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Admin12Step2 + +$response = $null + +try { + # Retrieve asset group accounts + Write-Output "" + Write-Output "Accounts to clone:" + + #ds-snippet-start:Admin12Step3 + $uri = "${basePath}/v1/organizations/${organizationId}/assetGroups/accounts?compliant=true" + $response = Invoke-WebRequest -uri $uri -UseBasicParsing -headers $headers -method GET + #ds-snippet-end:Admin12Step3 +} catch { + Write-Output "Unable retrieve asset group accounts." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +$sourceAccountId = $null +$accounts = $($response.Content | ConvertFrom-Json).assetGroupAccounts +if ($accounts.count -eq 1){ + $sourceAccountId = $accounts[0].accountId +} else { + $menu = @{} + for ($i=1;$i -le $accounts.count; $i++) + { Write-Output "$i. $($accounts[$i-1].accountName)" + $menu.Add($i,($accounts[$i-1].accountId))} + do { + [int]$selection = Read-Host 'Select an account to clone' + } while ($selection -gt $accounts.count -or $selection -lt 1); + $sourceAccountId = $menu.Item($selection) +} + +$targetAccountName = Read-Host "Please enter the name of the new account" +$targetAccountFirstName = Read-Host "Please enter the first name of the new account admin" +$targetAccountLastName = Read-Host "Please enter the last name of the new account admin" +$targetAccountEmail = Read-Host "Please enter the email address of the new account admin" + +#ds-snippet-start:Admin12Step4 +# The country code value is set to "US" for the developer environment +# In production, set the value to the code for the country of the target account +$body = @" +{ + "sourceAccount": { + "id": "$sourceAccountId" + }, + "targetAccount": { + "name": "$targetAccountName", + "admin": { + "firstName": "$targetAccountFirstName", + "lastName": "$targetAccountLastName", + "email": "$targetAccountEmail" + }, + "countryCode": "US" + } +} +"@ +#ds-snippet-end:Admin12Step4 + +try { + # Clone source account into new account + Write-Output "" + Write-Output "Response:" + + #ds-snippet-start:Admin12Step5 + $uri = "${basePath}/v1/organizations/${organizationId}/assetGroups/accountClone" + $response = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + #ds-snippet-end:Admin12Step5 +} catch { + Write-Output "Failed to clone an account." + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +Write-Output "" +Write-Output "Done" diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index add2d0d..e0c1006 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -1,4 +1,4 @@ -#SMS Delivery +#Delayed Routing $apiUri = "https://demo.docusign.net/restapi" # Send an envelope with one document diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index 199c152..690b63b 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -1,4 +1,4 @@ -#SMS Delivery +#SMS or WhatsApp Delivery $apiUri = "https://demo.docusign.net/restapi" # Send an envelope with three documents @@ -37,10 +37,25 @@ $doc3Base64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 # Step 2. Create the envelope definition -$SMSCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer: " -$SMSNumber = Read-Host "Please enter an SMS-enabled Phone number for the Signer: " -$SMSCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient: " -$SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbon Copied recipient: " +Write-Output 'Please choose a message delivery type: ' +Write-Output "$(1) SMS" +Write-Output "$(2) WhatsApp" + +[int]$MSGType = Read-Host "Select 1 or 2" + +if ($MSGType -eq 1){ + $selected = "SMS" +} +else { + $selected = "WhatsApp" +} + +$MSGCountryPrefix = Read-Host "Please enter a country phone number prefix for the Signer" +$MSGNumber = Read-Host "Please enter a Mobile number for the Signer" +$MSGCCCountryPrefix = Read-Host "Please enter a country phone number prefix for the Carbon Copied recipient" +$MSGNumberCC = Read-Host "Please enter a Mobile number for the Carbon Copied recipient" + + #ds-snippet-start:eSign37Step2 @{ @@ -68,26 +83,27 @@ $SMSNumberCC = Read-Host "Please enter an SMS-enabled Phone number for the Carbo carbonCopies = @( @{ phoneNumber = @{ - countryCode = $SMSCCCountryPrefix; - number = $SMSNumberCC; + countryCode = $MSGCCCountryPrefix; + number = $MSGNumberCC; } name = $variables.CC_NAME; recipientId = "2"; routingOrder = "2"; - deliveryMethod = "SMS"; + deliveryMethod = $selected; }; ); signers = @( @{ phoneNumber = @{ - countryCode = $SMSCountryPrefix; - number = $SMSNumber; + countryCode = $MSGCountryPrefix; + number = $MSGNumber; + } name = $variables.SIGNER_NAME; recipientId = "1"; routingOrder = "1"; - deliveryMethod = "SMS"; + deliveryMethod = $selected; tabs = @{ signHereTabs = @( @{ diff --git a/launcher.ps1 b/launcher.ps1 index 354c6c2..659381a 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -456,7 +456,7 @@ function startSignature { Use_Conditional_Recipients = 34; Scheduled_Sending = 35; Delayed_Routing = 36; - SMS_Delivery = 37; + SMS_or_WhatsApp = 37; Create_Signable_HTML_document = 38; Signing_In_Person = 39; Set_Document_Visibility = 40; @@ -504,7 +504,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Use_Conditional_Recipients)) Use_Conditional_Recipients" Write-Output "$([int][ApiExamples]::Scheduled_Sending)) Scheduled_Sending" Write-Output "$([int][ApiExamples]::Delayed_Routing)) Delayed_Routing" - Write-Output "$([int][ApiExamples]::SMS_Delivery)) SMS_Delivery" + Write-Output "$([int][ApiExamples]::SMS_or_WhatsApp)) SMS_or_WhatsApp" Write-Output "$([int][ApiExamples]::Create_Signable_HTML_document)) Create_Signable_HTML_document" Write-Output "$([int][ApiExamples]::Signing_In_Person)) In_Person_Signing" Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" @@ -632,7 +632,7 @@ function startSignature { checkEmailAddresses powershell.exe .\examples\eSignature\eg036DelayedRouting.ps1 } - elseif ($ApiExamplesView -eq [ApiExamples]::SMS_Delivery) { + elseif ($ApiExamplesView -eq [ApiExamples]::SMS_or_WhatsApp) { checkEmailAddresses powershell.exe .\examples\eSignature\eg037SMSDelivery.ps1 } @@ -807,7 +807,8 @@ function startAdmin { deleteUserProductPermissionProfile = 9; deleteUserDataFromOrganization = 10; deleteUserDataFromAccount = 11; - Pick_An_API = 12; + cloneAccount = 12; + Pick_An_API = 13; } $listAdminExamplesView = $null; do { @@ -824,6 +825,7 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::deleteUserProductPermissionProfile)) Delete user product permission profiles using an email address" Write-Output "$([int][listAdminExamples]::deleteUserDataFromOrganization)) Delete user data from organization" Write-Output "$([int][listAdminExamples]::deleteUserDataFromAccount)) Delete user data from account" + Write-Output "$([int][listAdminExamples]::cloneAccount)) Clone Account" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -874,6 +876,10 @@ function startAdmin { checkOrgId powershell.exe -Command .\examples\Admin\eg011DeleteUserDataFromAccount.ps1 } + elseif ($listAdminExamplesView -eq [listAdminExamples]::cloneAccount) { + checkOrgId + powershell.exe -Command .\examples\Admin\eg012CloneAccount.ps1 + } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } From 165d4b5621d60d02f5bd8b28eaaea57b557b90c0 Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Mon, 25 Sep 2023 14:12:20 -0700 Subject: [PATCH 374/462] DEVDOCS-10442 adding codeDepot tags eeg41 --- .../eSignature/eg041EmbeddedSigningCFR.ps1 | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 index 063173f..ed3de2f 100644 --- a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 +++ b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 @@ -47,7 +47,7 @@ if ((Test-Path $docPath) -eq $false) { # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $doc1Base64 # - Obtain your workflow ID -# Step 2 start +#ds-snippet-start:eSign41Step2 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $oAuthAccessToken") @@ -59,7 +59,7 @@ $result = Invoke-RestMethod -uri $uri -headers $headers -method GET $result.content #Obtain the workflow ID from the API response $workflowId = [System.Linq.Enumerable]::FirstOrDefault($result.identityVerification, [func[object, bool]] { param($x) $x.defaultName -eq "SMS for Access & Signatures"}).workflowId -# Step 2 end +#ds-snippet-end:eSign41Step2 if ($null -eq $workflowId) { @@ -74,7 +74,7 @@ $SIGNER_PHONE_NUMBER = Read-Host "Please enter an SMS-enabled Phone number for t Write-Output "Sending the envelope request to DocuSign..." # Construct your envelope JSON body -# Step 3 start +#ds-snippet-start:eSign41Step3 $body = @" { "documents": [{ @@ -121,24 +121,25 @@ $body = @" } ] }] - } + } }] }, "status": "Sent" } -"@ -# Step 3 end +"@ +#ds-snippet-end:eSign41Step3 Write-Output "" -# Step 4. Call DocuSign to create the envelope +#ds-snippet-start:eSign41Step4 $uri = "${apiUri}/v2.1/accounts/$APIAccountId/envelopes" $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST -UseBasicParsing -OutFile $response $result.content # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId +#ds-snippet-end:eSign41Step4 -# Step 5. Create a recipient view definition +# Create a recipient view definition # The signer will directly open this link from the browser to sign. # # The returnUrl is normally your own web app. DocuSign will redirect @@ -151,7 +152,7 @@ $requestData = New-TemporaryFile $response = New-TemporaryFile Write-Output "Requesting the url for the embedded signing..." - +#ds-snippet-start:eSign41Step5 $json = [ordered]@{ 'returnUrl' = 'http://httpbin.org/get'; 'authenticationMethod' = 'none'; @@ -159,9 +160,10 @@ $json = [ordered]@{ 'userName' = $variables.SIGNER_NAME; 'clientUserId' = 1000 } | ConvertTo-Json -Compress +#ds-snippet-end:eSign41Step5 - -# Step 6. Create the recipient view and begin the DocuSign signing +# Create the recipient view and begin the DocuSign signing +#ds-snippet-start:eSign41Step6 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` -Method 'POST' ` @@ -174,8 +176,8 @@ Invoke-RestMethod ` Write-Output "Response: $(Get-Content -Raw $response)" $signingUrl = $(Get-Content $response | ConvertFrom-Json).url +#ds-snippet-end:eSign41Step6 -# ***DS.snippet.0.end Write-Output "The embedded signing URL is $signingUrl" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." From 2922b6993775c249dc4bd9efb7359e65e47c898a Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Tue, 26 Sep 2023 10:37:43 -0700 Subject: [PATCH 375/462] DEVDOCS-12453 fixing html text color --- demo_documents/order_form.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo_documents/order_form.html b/demo_documents/order_form.html index ae79998..5df418d 100644 --- a/demo_documents/order_form.html +++ b/demo_documents/order_form.html @@ -26,7 +26,7 @@ Harmonica - /l1q/ + /l1q/ $5 @@ -36,7 +36,7 @@ Xylophone - /l2q/ + /l2q/ $150 From 4dd2018b0992784aacced1ee1b3b7a044766a6b1 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Fri, 6 Oct 2023 15:24:00 -0700 Subject: [PATCH 376/462] separating step 3 and 4 --- .../eSignature/eg017SetTemplateTabValues.ps1 | 66 ++++++++++++++----- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/examples/eSignature/eg017SetTemplateTabValues.ps1 b/examples/eSignature/eg017SetTemplateTabValues.ps1 index 32114b1..e09b06d 100644 --- a/examples/eSignature/eg017SetTemplateTabValues.ps1 +++ b/examples/eSignature/eg017SetTemplateTabValues.ps1 @@ -34,6 +34,40 @@ else { } Write-Output "Sending the envelope request to DocuSign..." +# Step 3. Create tabs and custom fields +#ds-snippet-start:eSign17Step3 +$text_custom_fields = @{ + "name" = "app metadata item" + "required" = "false" + "show" = "true" + "value" = "1234567" +} + +$checkbox_tabs = @{ + "selected1" = "true" + "tabLabel1" = "ckAuthorization" + "selected2" = "true" + "tabLabel2" = "ckAgreement" +} + +$list_tabs = @{ + "documentId" = "1" + "pageNumber" = "1" + "tabLabel" = "list" + "value" = "green" +} + +$radio_tabs = @{ + "selected" = "true" + "value" = "white" +} + +$text_tabs = @{ + "tabLabel" = "text" + "value" = "Jabberywocky!" +} +#ds-snippet-end:eSign17Step3 + # Tabs and custom fields shown in the request body on step 4 # Step 4. Construct the request body #ds-snippet-start:eSign17Step4 @@ -41,10 +75,10 @@ Write-Output "Sending the envelope request to DocuSign..." customFields = @{ textCustomFields = @( @{ - name = "app metadata item"; - required = "false"; - show = "true"; - value = "1234567"; + name = $($text_custom_fields['name']); + required = $($text_custom_fields['required']); + show = $($text_custom_fields['show']); + value = $($text_custom_fields['value']); }; ); }; @@ -57,20 +91,20 @@ Write-Output "Sending the envelope request to DocuSign..." tabs = @{ checkboxTabs = @( @{ - selected = "true"; - tabLabel = "ckAuthorization"; + selected = $($checkbox_tabs['selected1']); + tabLabel = $($checkbox_tabs['tabLabel1']); }; @{ - selected = "true"; - tabLabel = "ckAgreement"; + selected = $($checkbox_tabs['selected2']); + tabLabel = $($checkbox_tabs['tabLabel2']); }; ); listTabs = @( @{ - documentId = "1"; - pageNumber = "1"; - tabLabel = "list"; - value = "green"; + documentId = $($list_tabs['documentId']); + pageNumber = $($list_tabs['pageNumber']); + tabLabel = $($list_tabs['tabLabel']); + value = $($list_tabs['value']); }; ); radioGroupTabs = @( @@ -78,16 +112,16 @@ Write-Output "Sending the envelope request to DocuSign..." groupName = "radio1"; radios = @( @{ - selected = "true"; - value = "white"; + selected = $($radio_tabs['selected']); + value = $($radio_tabs['value']); }; ); }; ); textTabs = @( @{ - tabLabel = "text"; - value = "Jabberywocky!"; + tabLabel = $($text_tabs['tabLabel']); + value = $($text_tabs['value']); }; @{ bold = "true"; From d4a41bb75193c6589318b867a3813268a43b4c8c Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Wed, 11 Oct 2023 13:02:21 +0300 Subject: [PATCH 377/462] add formula tabs --- .../eSignature/eg038ResponsiveSigning.ps1 | 57 ++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg038ResponsiveSigning.ps1 b/examples/eSignature/eg038ResponsiveSigning.ps1 index 30dd811..e62c164 100644 --- a/examples/eSignature/eg038ResponsiveSigning.ps1 +++ b/examples/eSignature/eg038ResponsiveSigning.ps1 @@ -31,11 +31,14 @@ $doc_html = New-TemporaryFile ((Get-Content $doc_html) ` -replace '/sn1/', '' ` - -replace '/l1q/', '' ` - -replace '/l2q/', '') | Set-Content $doc_html + -replace '/l1q/', '' ` + -replace '/l2q/', '') | Set-Content $doc_html Write-Output "Sending the envelope request to DocuSign..." +$price1 = 5 +$price2 = 150 + # Concatenate the different parts of the request #ds-snippet-start:eSign38Step2 @{ @@ -58,6 +61,56 @@ Write-Output "Sending the envelope request to DocuSign..." routingOrder = "1"; clientUserId = "1000"; roleName = "Signer"; + tabs = @{ + formulaTabs = @( + @{ + font = "helvetica"; + fontSize = "size11"; + fontColor = "black"; + anchorString = "/l1e/"; + anchorYOffset = "-8"; + anchorUnits = "pixels"; + anchorXOffset = "105"; + tabLabel = "l1e"; + formula = "[l1q] * $price1"; + roundDecimalPlaces = "0"; + required = "true"; + locked = "true"; + disableAutoSize = "false"; + }; + @{ + font = "helvetica"; + fontSize = "size11"; + fontColor = "black"; + anchorString = "/l2e/"; + anchorYOffset = "-8"; + anchorUnits = "pixels"; + anchorXOffset = "105"; + tabLabel = "l2e"; + formula = "[l2q] * $price2"; + roundDecimalPlaces = "0"; + required = "true"; + locked = "true"; + disableAutoSize = "false"; + }; + @{ + font = "helvetica"; + fontSize = "size11"; + fontColor = "black"; + anchorString = "/l3t/"; + anchorYOffset = "-8"; + anchorUnits = "pixels"; + anchorXOffset = "105"; + tabLabel = "l3t"; + formula = "[l1e] + [l2e]"; + roundDecimalPlaces = "0"; + required = "true"; + locked = "true"; + disableAutoSize = "false"; + bold = "true"; + }; + ); + }; }; ); carbonCopies = @( From c0926fd0cd5e78c47d1191324f643eba90136d38 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Fri, 27 Oct 2023 14:21:42 -0700 Subject: [PATCH 378/462] Bringing in improvement from developer community from public github --- examples/eSignature/eg003ListEnvelopes.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg003ListEnvelopes.ps1 b/examples/eSignature/eg003ListEnvelopes.ps1 index bd04510..a2bea91 100644 --- a/examples/eSignature/eg003ListEnvelopes.ps1 +++ b/examples/eSignature/eg003ListEnvelopes.ps1 @@ -18,7 +18,7 @@ Write-Output "Sending the list envelope status request to DocuSign..." Write-Output "Results:" # Get date in the ISO 8601 format -$fromDate = ((Get-Date).AddDays(-10d)).ToString("yyyy-MM-ddThh:mm:ssK") +$fromDate = ((Get-Date).AddDays(-10d)).ToString("yyyy-MM-ddTHH:mm:ssK") $(Invoke-RestMethod ` From 5227b4e747270030a70c5557f0bddd5356206b0f Mon Sep 17 00:00:00 2001 From: Anna Hileta <80112359+annahileta@users.noreply.github.com> Date: Mon, 30 Oct 2023 19:27:35 +0200 Subject: [PATCH 379/462] added focused view code example (#97) --- examples/eSignature/eg044FocusedView.ps1 | 145 +++++++++++++++++++++++ launcher.ps1 | 8 +- utils/startServerForFocusedView.ps1 | 108 +++++++++++++++++ 3 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg044FocusedView.ps1 create mode 100644 utils/startServerForFocusedView.ps1 diff --git a/examples/eSignature/eg044FocusedView.ps1 b/examples/eSignature/eg044FocusedView.ps1 new file mode 100644 index 0000000..97a5517 --- /dev/null +++ b/examples/eSignature/eg044FocusedView.ps1 @@ -0,0 +1,145 @@ +$apiUri = "https://demo.docusign.net/restapi" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" + +# Get required variables from .\config\settings.json file +$variables = Get-Content $configPath -Raw | ConvertFrom-Json + +# 1. Obtain your OAuth token +$accessToken = Get-Content $tokenPath + +# Obtain your accountId from demo.docusign.net -- the account id is shown in +# the drop down on the upper right corner of the screen by your picture or +# the default picture. +$accountID = Get-Content $accountIdPath + +# Step 2. Create the envelope definition. + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$doc1Base64 = New-TemporaryFile + +$docPath = ".\demo_documents\World_Wide_Corp_lorem.pdf" + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $docPath) -eq $false) { + $docPath = "..\demo_documents\World_Wide_Corp_lorem.pdf" +} + +# Fetch doc and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $doc1Base64 + +Write-Output "Sending the envelope request to DocuSign..." +Write-Output "" + +# Concatenate the different parts of the request +#ds-snippet-start:eSign44Step2 +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $doc1Base64)"; + name = "Lorem Ipsum"; + fileExtension = "pdf"; + documentId = "1"; + }; + ); + recipients = @{ + signers = @( + @{ + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "1"; + routingOrder = "1"; + clientUserId = "1000"; + tabs = @{ + signHereTabs = @( + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign44Step2 + +# Step 3. Call DocuSign to create the envelope +#ds-snippet-start:eSign44Step3 +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response +#ds-snippet-end:eSign44Step3 + +Write-Output "Response: $(Get-Content -Raw $response)" +Write-Output "" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId +Write-Output "EnvelopeId: $envelopeId" +Write-Output "" + +# Step 4. Create a recipient view definition +# The signer will directly open this link from the browser to sign. +# +# The returnUrl is normally your own web app. DocuSign will redirect +# the signer to returnUrl when the signing completes. +# For this example, we'll use http://httpbin.org/get to show the +# query parameters passed back from DocuSign + +#ds-snippet-start:eSign44Step4 +Write-Output "Requesting the url for the embedded signing..." +Write-Output "" + +$json = @{ + returnUrl = "http://httpbin.org/get" + authenticationMethod = "none" + email = $variables.SIGNER_EMAIL + userName = $variables.SIGNER_NAME + clientUserId = 1000 + frameAncestors = @("http://localhost:8080", "https://apps-d.docusign.com") + messageOrigins = @("https://apps-d.docusign.com") +} + +$jsonString = $json | ConvertTo-Json +#ds-snippet-end:eSign44Step4 + +# Step 5. Create the recipient view and begin the DocuSign signing +#ds-snippet-start:eSign44Step5 +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -Body $jsonString ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +$signingUrl = $(Get-Content $response | ConvertFrom-Json).url +#ds-snippet-end:eSign44Step5 + +Start-Process -NoNewWindow -FilePath "powershell" -ArgumentList "-File .\utils\startServerForFocusedView.ps1 -signingURL $signingUrl" + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $doc1Base64 + +Write-Output "" +Write-Output "Done." \ No newline at end of file diff --git a/launcher.ps1 b/launcher.ps1 index 659381a..e6dc908 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -462,7 +462,8 @@ function startSignature { Set_Document_Visibility = 40; Document_Generation = 41; Shared_Access = 43; - Pick_An_API = 44; + Focused_View = 44; + Pick_An_API = 45; } $ApiExamplesView = $null; @@ -510,6 +511,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Set_Document_Visibility)) Set_Document_Visibility" Write-Output "$([int][ApiExamples]::Document_Generation)) Document_Generation" Write-Output "$([int][ApiExamples]::Shared_Access)) Shared_Access" + Write-Output "$([int][ApiExamples]::Focused_View)) Focused_View" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -656,6 +658,10 @@ function startSignature { checkEmailAddresses powershell.exe .\examples\eSignature\eg043SharedAccess.ps1 } + elseif ($ApiExamplesView -eq [ApiExamples]::Focused_View) { + checkEmailAddresses + powershell.exe .\examples\eSignature\eg044FocusedView.ps1 + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher } diff --git a/utils/startServerForFocusedView.ps1 b/utils/startServerForFocusedView.ps1 new file mode 100644 index 0000000..2a14c14 --- /dev/null +++ b/utils/startServerForFocusedView.ps1 @@ -0,0 +1,108 @@ +param( + [Parameter(Mandatory = $true)] + [string]$signingURL + ) + +$port = '8080' +$ip = 'localhost' + +# Get required environment variables from ..\config\settings.json file +$configFile = ".\config\settings.json" +$config = Get-Content $configFile -Raw | ConvertFrom-Json +$integrationKey = $config.INTEGRATION_KEY_AUTH_CODE + +$socket = 'http://' + $ip + ':' + $port + '/' + +$responseOk = @" + +
+

The document has been embedded with focused view.

+
+ + + + + Signing + + + +
+ + +

Continue

+ + + + +"@ + +[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true } + +$listener = New-Object System.Net.HttpListener +$listener.Prefixes.Add($socket) +$listener.Start() +Start-Process $socket + +$context = $listener.GetContext() +$response = $context.Response + +$buffer = [System.Text.Encoding]::UTF8.GetBytes($responseOk) +$response.ContentType = "text/html" +$response.ContentLength64 = $buffer.Length +$output = $response.OutputStream +$output.Write($buffer, 0, $buffer.Length) +$output.Close() From cbaddda38ce3aa8dcffa54735a8c94cd64efe3b7 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Mon, 11 Dec 2023 15:55:56 -0800 Subject: [PATCH 380/462] DEVDOCS-13002 add ID Evidence, alpha reorg --- README.md | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 2a53587..24f80eb 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ### GitHub repo: [code-examples-powershell](./README.md) -This GitHub repo includes code examples for the DocuSign Admin API, Click API, eSignature REST API, Monitor API, and Rooms API. To switch between API code examples, select the desired option from the menu when prompted. +This GitHub repo includes code examples for the DocuSign Admin API, Click API, eSignature REST API, ID Evidence API, Monitor API, Notary API, and Rooms API. To switch between API code examples, select the desired option from the menu when prompted. ## Introduction @@ -20,14 +20,16 @@ When the token expires, it updates automatically. For more information about the scopes used for obtaining authorization to use the eSignature REST API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). -For a list of code examples that use the eSignature API, see the [How-to guides overview](https://developers.docusign.com/docs/esign-rest-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the eSignature REST API, see the [How-to guides overview](https://developers.docusign.com/docs/esign-rest-api/how-to/) on the DocuSign Developer Center. -## Rooms API -**Note:** To use the Rooms API, you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. -For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). +## Admin API -For a list of code examples that use the Rooms API, see the [How-to guides overview](https://developers.docusign.com/docs/rooms-api/how-to/) on the DocuSign Developer Center. +**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). + +For information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). + +For a list of code examples that use the Admin API, see the [How-to guides overview](https://developers.docusign.com/docs/admin-api/how-to/) on the DocuSign Developer Center. ## Click API @@ -36,6 +38,15 @@ For more information about the scopes used for obtaining authorization to use th For a list of code examples that use the Click API, see the [How-to guides overview](https://developers.docusign.com/docs/click-api/how-to/) on the DocuSign Developer Center. +## ID Evidence API + +**Note:** To run the ID Evidence code examples, you must first complete the [Prerequisites](https://developers.docusign.com/docs/idevidence-api/how-to/retrieve-idevidence-events/). + +For more information about the scopes used for obtaining authorization to use the ID Evidence API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). + +For a list of code examples that use the ID Evidence API, see the [How-to guides overview](https://developers.docusign.com/docs/idevidence-api/how-to/) on the DocuSign Developer Center. + + ## Monitor API **Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). @@ -45,22 +56,27 @@ For information about the scopes used for obtaining authorization to use the Mon For a list of code examples that use the Monitor API, see the [How-to guides overview](https://developers.docusign.com/docs/monitor-api/how-to/) on the DocuSign Developer Center. -## Admin API +## Notary API (closed beta) -**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). +**Note:** For closed beta participants interested in adding Notary API functionality to your production account, contact your DocuSign representative. -For information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). +Example 1 requires a Sender DocuSign developer account API account ID that has been provisioned for the [Notary API base URI](https://developers.docusign.com/docs/notary-api/go-live/). -For a list of code examples that use the Admin API, see the [How-to guides overview](https://developers.docusign.com/docs/admin-api/how-to/) on the DocuSign Developer Center. +Example 2 requires that you [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your Sender DocuSign developer account. +For information about the scopes used for obtaining authorization to use the Notary API, see the [scopes section](https://developers.docusign.com/docs/notary-api/notary101/auth/). -## Notary API (closed beta) +For a list of code examples that use the Notary API, see the [How-to guides overview](https://developers.docusign.com/docs/notary-api/how-to/) on the DocuSign Developer Center. -**Note:** For closed beta participants interested in adding Notary API functionality to your production account, contact your DocuSign representative. Example 1 requires a Sender DocuSign developer account API account ID that has been provisioned for the [Notary API base URI](https://developers.docusign.com/docs/notary-api/go-live/). Example 2 requires that you [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your Sender DocuSign developer account. -For information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/notary-api/notary101/auth/). +## Rooms API -For a list of code examples that use the Notary API, see the [How-to guides overview](https://developers.docusign.com/docs/notary-api/how-to/) on the DocuSign Developer Center. +**Note:** To use the Rooms API, you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). + +Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. +For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). + +For a list of code examples that use the Rooms API, see the [How-to guides overview](https://developers.docusign.com/docs/rooms-api/how-to/) on the DocuSign Developer Center. ## Installation From 711be74897739014f6917e4bfbbb7dec506324e8 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 21 Dec 2023 13:33:27 -0800 Subject: [PATCH 381/462] Update README.md Signed-off-by: Inbar Gazit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 24f80eb..12bcc44 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,10 @@ For a list of code examples that use the Rooms API, see the [How-to guides overv 1. Select **Authorization Code Grant** when authenticating your account. 1. Select your desired code example. +#### Installation steps for Authorization Code Grant embedded signing example +1. In File Explorer, open your Quickstart folder, then open the Quick_ACG folder within it. +1. Right-click the launcherACG.ps1 file and select Run with PowerShell > Open. + ### Installation steps for JWT Grant authentication **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. Also, in order to select JSON Web Token authentication in the launcher, in config/settings.json, change the `quickstart` setting to `"false"`. From 36cc9337f4fa3ca45456605da99970cb6cfa41fc Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 21 Dec 2023 13:34:51 -0800 Subject: [PATCH 382/462] Update README.md Signed-off-by: Inbar Gazit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 12bcc44..aaa3964 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,8 @@ For a list of code examples that use the Rooms API, see the [How-to guides overv 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. + +#### Installation steps for Multiple code examples, Authorization Code Grant, and JWT Grant and JWT grant remote signing example 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**. 1. Select an API when prompted in Windows PowerShell. 1. Select **Authorization Code Grant** when authenticating your account. From 6606c96184c36e77f64c639444d93760f8dda211 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Thu, 21 Dec 2023 13:36:35 -0800 Subject: [PATCH 383/462] Updating README for DEVDOCS-12995 --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 24f80eb..aaa3964 100644 --- a/README.md +++ b/README.md @@ -121,11 +121,17 @@ For a list of code examples that use the Rooms API, see the [How-to guides overv 1. Add the launcher’s redirect URI. Under **Additional settings**, select **+ ADD URI**, and set a redirect URI of http://localhost:8080/authorization-code/callback. Select **SAVE**. 1. Set a name and email address for the signer. In settings.json, save an email address as `SIGNER_EMAIL` and a name as `SIGNER_NAME`. **Note:** Protect your personal information. Please make sure that settings.json will not be stored in your source code repository. + +#### Installation steps for Multiple code examples, Authorization Code Grant, and JWT Grant and JWT grant remote signing example 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open**. 1. Select an API when prompted in Windows PowerShell. 1. Select **Authorization Code Grant** when authenticating your account. 1. Select your desired code example. +#### Installation steps for Authorization Code Grant embedded signing example +1. In File Explorer, open your Quickstart folder, then open the Quick_ACG folder within it. +1. Right-click the launcherACG.ps1 file and select Run with PowerShell > Open. + ### Installation steps for JWT Grant authentication **Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. Also, in order to select JSON Web Token authentication in the launcher, in config/settings.json, change the `quickstart` setting to `"false"`. From cf81a61c21c45f4f54199f0387cfd3a38f77914f Mon Sep 17 00:00:00 2001 From: inbargazit Date: Fri, 19 Jan 2024 14:58:06 -0800 Subject: [PATCH 384/462] Fixing codeDepot markers for PowerShell eSign14 (DEVDOCS-10325) --- examples/eSignature/eg014CollectPayment.ps1 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/eSignature/eg014CollectPayment.ps1 b/examples/eSignature/eg014CollectPayment.ps1 index e9f0def..ef5a598 100644 --- a/examples/eSignature/eg014CollectPayment.ps1 +++ b/examples/eSignature/eg014CollectPayment.ps1 @@ -18,7 +18,6 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # to the left under INTEGRATIONS and select # Payments to retrieve your Gateway account ID. -# ***DS.snippet.0.start # Step 3. Create the envelope definition @@ -33,7 +32,7 @@ $doc1Base64 = New-TemporaryFile Write-Output "Sending the envelope request to DocuSign..." # Concatenate the different parts of the request -#ds-snippet-start:eSign14Step2 +#ds-snippet-start:eSign14Step3 @{ emailSubject = "Please complete your order"; documents = @( @@ -160,9 +159,9 @@ Write-Output "Sending the envelope request to DocuSign..." }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData -#ds-snippet-end:eSign14Step2 +#ds-snippet-end:eSign14Step3 -#ds-snippet-start:eSign14Step3 +#ds-snippet-start:eSign14Step4 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -172,7 +171,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response -#ds-snippet-end:eSign14Step3 +#ds-snippet-end:eSign14Step4 Write-Output "Results:" Get-Content $response From 0b9fbdccee3e51575b47fefa35c3f966b5bdbe65 Mon Sep 17 00:00:00 2001 From: annahileta Date: Mon, 22 Jan 2024 16:01:52 +0200 Subject: [PATCH 385/462] added menu and scopes --- OAuth/code_grant.ps1 | 3 +++ OAuth/jwt.ps1 | 3 +++ launcher.ps1 | 48 ++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 41e1244..15215a5 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -35,6 +35,9 @@ elseif ($apiVersion -eq "admin") { elseif ($apiVersion -eq "notary") { $scopes = "signature%20organization_read%20notary_read%20notary_write" } +elseif ($apiVersion -eq "maestro") { + $scopes = "signature%20aow_manage" +} $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $redirectUri = "http://${IP}:${PORT}/authorization-code/callback" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index c8b56ca..6199745 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -48,6 +48,9 @@ if ($apiVersion -eq "rooms") { elseif ($apiVersion -eq "notary") { $scopes = "signature%20organization_read%20notary_read%20notary_write" } + elseif ($apiVersion -eq "maestro") { + $scopes = "signature%20aow_manage%20impersonation" + } # Request application consent $PORT = '8080' diff --git a/launcher.ps1 b/launcher.ps1 index e6dc908..27314e6 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -43,8 +43,6 @@ function checkEmailAddresses { exit 1; } - - # Fill in Quickstart Carbon Copy config values if (($config.CC_EMAIL -eq "{CC_EMAIL}" ) -or ($config.CC_EMAIL -eq "" )) { Write-Output "It looks like this is your first time running the launcher from Quickstart. " @@ -103,7 +101,8 @@ function startLauncher { Admin = 5; ID_Evidence = 6; Notary = 7; - Exit = 8; + Maestro = 8; + Exit = 9; } $listApiView = $null; @@ -141,6 +140,7 @@ function startLauncher { Write-Output "$([int][listApi]::Admin)) Admin" Write-Output "$([int][listApi]::ID_Evidence)) ID Evidence" Write-Output "$([int][listApi]::Notary)) Notary (closed beta)" + Write-Output "$([int][listApi]::Maestro)) Maestro" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); @@ -165,7 +165,10 @@ function startLauncher { } elseif ($listApiView -eq [listApi]::Notary) { startAuth "notary" - } + } + elseif ($listApiView -eq [listApi]::Maestro) { + startAuth "maestro" + } elseif ($listApiView -eq [listApi]::Exit) { exit 1 } @@ -237,6 +240,9 @@ function startAuth ($apiVersion) { elseif ($listApiView -eq [listApi]::Notary) { startNotary } + elseif ($listApiView -eq [listApi]::Maestro) { + startMaestro + } } function startCFRSignature { @@ -948,6 +954,40 @@ function startNotary { startLauncher } +function startMaestro { + do { + Enum listMaestroExamples { + triggerWorkflow = 1; + cancelWorkflow = 2; + getWorkflowStatus = 3; + Pick_An_API = 4; + } + $listMaestroExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listMaestroExamples]::triggerWorkflow)) How to trigger a Maestro workflow" + Write-Output "$([int][listMaestroExamples]::cancelWorkflow)) How to cancel a Maestro workflow instance" + Write-Output "$([int][listMaestroExamples]::getWorkflowStatus)) How to get the status of a Maestro workflow instance" + Write-Output "$([int][listMaestroExamples]::Pick_An_API)) Pick_An_API" + [int]$listMaestroExamplesView = Read-Host "Select the action" + } while (-not [listMaestroExamples]::IsDefined([listMaestroExamples], $listMaestroExamplesView)); + + if ($listMaestroExamplesView -eq [listMaestroExamples]::triggerWorkflow) { + powershell.exe -Command .\examples\Maestro\eg001TriggerWorkflow.ps1 + + } + elseif ($listMaestroExamplesView -eq [listMaestroExamples]::cancelWorkflow) { + powershell.exe -Command .\examples\Maestro\eg002CancelWorkflow.ps1 + + } + elseif ($listMaestroExamplesView -eq [listMaestroExamples]::getWorkflowStatus) { + powershell.exe -Command .\examples\Maestro\eg003GetWorkflowStatus.ps1 + } + + } until ($listMaestroExamplesView -eq [listMaestroExamples]::Pick_An_API) + startLauncher +} Write-Output "Welcome to the DocuSign PowerShell Launcher" startLauncher From 36d4b4fbe32d4b282b2cbb40fca76b70bdbe6603 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Tue, 23 Jan 2024 12:03:20 +0200 Subject: [PATCH 386/462] add three examples --- examples/Maestro/eg001TriggerWorkflow.ps1 | 87 +++++++++++++++++++++ examples/Maestro/eg002CancelWorkflow.ps1 | 54 +++++++++++++ examples/Maestro/eg003GetWorkflowStatus.ps1 | 58 ++++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 examples/Maestro/eg001TriggerWorkflow.ps1 create mode 100644 examples/Maestro/eg002CancelWorkflow.ps1 create mode 100644 examples/Maestro/eg003GetWorkflowStatus.ps1 diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 new file mode 100644 index 0000000..0579c61 --- /dev/null +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -0,0 +1,87 @@ +# Trigger a workflow + +if (Test-Path .\config\WORKFLOW_ID) { + $workflowId = Get-Content .\config\WORKFLOW_ID +} else { + # create workflow + +} + +# check that create workflow script ran successfully +if (Test-Path .\config\WORKFLOW_ID) { + $workflowId = Get-Content .\config\WORKFLOW_ID +} else { + Write-Output "Please create a worklow before running this example" + exit 1 +} + +$base_path = "https://demo.services.docusign.net/aow-manage/v1.0" + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# temp files: +$response = New-TemporaryFile + +# Construct your API headers +#ds-snippet-start:Maestro1Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Maestro1Step2 + +Write-Output "Attempting to retrieve Workflow definition..." + +#ds-snippet-start:Maestro1Step3 +Invoke-RestMethod ` + -Uri "${base_path}/management/accounts/${accountId}/workflowDefinitions/${workflowId}" ` + -Method 'GET' ` + -Headers $headers ` + -OutFile $response + +$triggerUrl = $(Get-Content $response | ConvertFrom-Json).triggerUrl +#ds-snippet-end:Maestro1Step3 + +$instance_name = Read-Host "Please input a name for the workflow instance" +$signer_name = Read-Host "Please input the full name for the signer participant" +$signer_email = Read-Host "Please input an email for the signer participant" +$cc_name = Read-Host "Please input the full name for the cc participant" +$cc_email = Read-Host "Please input an email for the cc participant" + +#ds-snippet-start:Maestro1Step4 +$body = @" +{ + "instanceName": "$instance_name", + "participants": {}, + "payload": { + "signerEmail": "$signer_email", + "signerName": "$signer_name", + "ccEmail": "$cc_email", + "ccName": "$cc_name" + }, + "metadata": {} +} +"@ +#ds-snippet-end:Maestro1Step4 + +#ds-snippet-start:Maestro1Step5 +$triggerResult = Invoke-WebRequest -uri $triggerUrl -headers $headers -body $body -method POST +#ds-snippet-end:Maestro1Step5 + +Write-Output "Response: $triggerResult" + +# pull out the envelopeId +$instanceId = $($triggerResult | ConvertFrom-Json).instanceId +# Store the instance_id into the config file +Write-Output $instanceId > .\config\INSTANCE_ID + +# cleanup +Remove-Item $response + +Write-Output "Done." diff --git a/examples/Maestro/eg002CancelWorkflow.ps1 b/examples/Maestro/eg002CancelWorkflow.ps1 new file mode 100644 index 0000000..44c27b8 --- /dev/null +++ b/examples/Maestro/eg002CancelWorkflow.ps1 @@ -0,0 +1,54 @@ +# Cancel a workflow instance + +# Check that there is a workflow +if (-not (Test-Path .\config\WORKFLOW_ID)) { + Write-Output "Please create a worklow before running this example" + exit 0 +} + +# Check that there is a running workflow instance to cancel +if (Test-Path .\config\INSTANCE_ID) { + $instanceId = Get-Content .\config\INSTANCE_ID +} else { + Write-Output "Please trigger a workflow before running this example" + exit 0 +} + +$base_path = "https://demo.services.docusign.net/aow-manage/v1.0" + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# temp file: +$response = New-TemporaryFile + +# Construct your API headers +#ds-snippet-start:Maestro2Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Maestro2Step2 + +Write-Output "Attempting to cancel the Workflow Instance..." + +#ds-snippet-start:Maestro2Step3 +Invoke-RestMethod ` + -Uri "${base_path}/management/accounts/${accountId}/instances/${instanceId}/cancel" ` + -Method 'POST' ` + -Headers $headers ` + -OutFile $response + +Write-Output "Workflow has been canceled." +Write-Output "Response: $(Get-Content -Raw $response)" +#ds-snippet-end:Maestro2Step3 + +# cleanup +Remove-Item $response + +Write-Output "Done." diff --git a/examples/Maestro/eg003GetWorkflowStatus.ps1 b/examples/Maestro/eg003GetWorkflowStatus.ps1 new file mode 100644 index 0000000..81d6f19 --- /dev/null +++ b/examples/Maestro/eg003GetWorkflowStatus.ps1 @@ -0,0 +1,58 @@ +# Get workflow instance state + +# Check that there is a workflow +if (Test-Path .\config\WORKFLOW_ID) { + $workflowId = Get-Content .\config\WORKFLOW_ID +} else { + Write-Output "Please create a worklow before running this example" + exit 0 +} + +# Check that there is an instance +if (Test-Path .\config\INSTANCE_ID) { + $instanceId = Get-Content .\config\INSTANCE_ID +} else { + Write-Output "Please trigger a workflow before running this example" + exit 0 +} + +$base_path = "https://demo.services.docusign.net/aow-manage/v1.0" + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# temp file: +$response = New-TemporaryFile + +# Construct your API headers +#ds-snippet-start:Maestro3Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Maestro3Step2 + +Write-Output "Attempting to retrieve Workflow Instance Status..." + +#ds-snippet-start:Maestro3Step3 +Invoke-RestMethod ` + -Uri "${base_path}/management/accounts/${accountId}/workflowDefinitions/${workflowId}/instances/${instanceId}" ` + -Method 'GET' ` + -Headers $headers ` + -OutFile $response + +$status = $(Get-Content $response | ConvertFrom-Json).instanceState + +Write-Output "Workflow Status: $status" +Write-Output "Response: $(Get-Content -Raw $response)" +#ds-snippet-end:Maestro3Step3 + +# cleanup +Remove-Item $response + +Write-Output "Done." From 692ca4c6b7896ecb7a4f0a216f6b0970baf90150 Mon Sep 17 00:00:00 2001 From: annahileta Date: Tue, 23 Jan 2024 17:01:57 +0200 Subject: [PATCH 387/462] added utils file --- examples/Maestro/createWorkflowUtils.ps1 | 625 ++++++++++++++++++++++ examples/Maestro/eg001TriggerWorkflow.ps1 | 11 +- 2 files changed, 630 insertions(+), 6 deletions(-) create mode 100644 examples/Maestro/createWorkflowUtils.ps1 diff --git a/examples/Maestro/createWorkflowUtils.ps1 b/examples/Maestro/createWorkflowUtils.ps1 new file mode 100644 index 0000000..c575d19 --- /dev/null +++ b/examples/Maestro/createWorkflowUtils.ps1 @@ -0,0 +1,625 @@ +# Check that we have a template id +if (-not (Test-Path .\config\TEMPLATE_ID)) { + Write-Output "Creating template" + powershell.exe .\examples\eSignature\eg008CreateTemplate.ps1 +} + +$templateId = Get-Content "config/TEMPLATE_ID" + +Write-Host "Creating a new workflow" + +$signerId = [guid]::NewGuid().ToString().ToLower() +$ccId = [guid]::NewGuid().ToString().ToLower() +$triggerId = "wfTrigger" + +$accessToken = Get-Content "config/ds_access_token.txt" +$accountId = Get-Content "config/API_ACCOUNT_ID" + +$base_path = "https://demo.services.docusign.net/aow-manage/v1.0" + +$headers = @{ + 'Authorization' = "Bearer $accessToken" + 'Accept' = 'application/json' + 'Content-Type' = 'application/json' +} + +$body = @" +{ + "workflowDefinition": { + "workflowName": "Example workflow - send invite to signer", + "workflowDescription": "", + "accountId": "$accountId", + "documentVersion": "1.0.0", + "schemaVersion": "1.0.0", + "participants": { + "$signerId": { + "participantRole": "Signer" + }, + "$ccId": { + "participantRole": "CC" + } + }, + "trigger": { + "name": "Get_URL", + "type": "Http", + "httpType": "Get", + "id": "$triggerId", + "input": { + "metadata": { + "customAttributes": {} + }, + "payload": { + "dacId_$triggerId": { + "source": "step", + "propertyName": "dacId", + "stepId": "$triggerId" + }, + "id_$triggerId": { + "source": "step", + "propertyName": "id", + "stepId": "$triggerId" + }, + "signerName_$triggerId": { + "source": "step", + "propertyName": "signerName", + "stepId": "$triggerId" + }, + "signerEmail_$triggerId": { + "source": "step", + "propertyName": "signerEmail", + "stepId": "$triggerId" + }, + "ccName_$triggerId": { + "source": "step", + "propertyName": "ccName", + "stepId": "$triggerId" + }, + "ccEmail_$triggerId": { + "source": "step", + "propertyName": "ccEmail", + "stepId": "$triggerId" + } + }, + "participants": {} + }, + "output": { + "dacId_$triggerId": { + "source": "step", + "propertyName": "dacId", + "stepId": "$triggerId" + } + } + }, + "variables": { + "dacId_$triggerId": { + "source": "step", + "propertyName": "dacId", + "stepId": "$triggerId" + }, + "id_$triggerId": { + "source": "step", + "propertyName": "id", + "stepId": "$triggerId" + }, + "signerName_$triggerId": { + "source": "step", + "propertyName": "signerName", + "stepId": "$triggerId" + }, + "signerEmail_$triggerId": { + "source": "step", + "propertyName": "signerEmail", + "stepId": "$triggerId" + }, + "ccName_$triggerId": { + "source": "step", + "propertyName": "ccName", + "stepId": "$triggerId" + }, + "ccEmail_$triggerId": { + "source": "step", + "propertyName": "ccEmail", + "stepId": "$triggerId" + }, + "envelopeId_step2": { + "source": "step", + "propertyName": "envelopeId", + "stepId": "step2", + "type": "String" + }, + "combinedDocumentsBase64_step2": { + "source": "step", + "propertyName": "combinedDocumentsBase64", + "stepId": "step2", + "type": "File" + }, + "fields.signer.text.value_step2": { + "source": "step", + "propertyName": "fields.signer.text.value", + "stepId": "step2", + "type": "String" + } + }, + "steps": [ + { + "id": "step1", + "name": "Set Up Invite", + "moduleName": "Notification-SendEmail", + "configurationProgress": "Completed", + "type": "DS-EmailNotification", + "config": { + "templateType": "WorkflowParticipantNotification", + "templateVersion": 1, + "language": "en", + "sender_name": "DocuSign Orchestration", + "sender_alias": "Orchestration", + "participantId": "$signerId" + }, + "input": { + "recipients": [ + { + "name": { + "source": "step", + "propertyName": "signerName", + "stepId": "$triggerId" + }, + "email": { + "source": "step", + "propertyName": "signerEmail", + "stepId": "$triggerId" + } + } + ], + "mergeValues": { + "ParticipantFullName": { + "source": "step", + "propertyName": "signerName", + "stepId": "$triggerId" + } + } + }, + "output": {} + }, + { + "id": "step2", + "name": "Get Signatures", + "moduleName": "ESign", + "configurationProgress": "Completed", + "type": "DS-Sign", + "config": { + "participantId": "$signerId" + }, + "input": { + "isEmbeddedSign": true, + "documents": [ + { + "type": "FromDSTemplate", + "eSignTemplateId": "$templateId" + } + ], + "emailSubject": "Please sign this document", + "emailBlurb": "", + "recipients": { + "signers": [ + { + "defaultRecipient": "false", + "tabs": { + "signHereTabs": [ + { + "stampType": "signature", + "name": "SignHere", + "tabLabel": "Sign Here", + "scaleValue": "1", + "optional": "false", + "documentId": "1", + "recipientId": "1", + "pageNumber": "1", + "xPosition": "191", + "yPosition": "148", + "tabId": "1", + "tabType": "signhere" + } + ], + "textTabs": [ + { + "requireAll": "false", + "value": "", + "required": "false", + "locked": "false", + "concealValueOnDocument": "false", + "disableAutoSize": "false", + "tabLabel": "text", + "font": "helvetica", + "fontSize": "size14", + "localePolicy": {}, + "documentId": "1", + "recipientId": "1", + "pageNumber": "1", + "xPosition": "153", + "yPosition": "230", + "width": "84", + "height": "23", + "tabId": "2", + "tabType": "text" + } + ], + "checkboxTabs": [ + { + "name": "", + "tabLabel": "ckAuthorization", + "selected": "false", + "selectedOriginal": "false", + "requireInitialOnSharedChange": "false", + "required": "true", + "locked": "false", + "documentId": "1", + "recipientId": "1", + "pageNumber": "1", + "xPosition": "75", + "yPosition": "417", + "width": "0", + "height": "0", + "tabId": "3", + "tabType": "checkbox" + }, + { + "name": "", + "tabLabel": "ckAuthentication", + "selected": "false", + "selectedOriginal": "false", + "requireInitialOnSharedChange": "false", + "required": "true", + "locked": "false", + "documentId": "1", + "recipientId": "1", + "pageNumber": "1", + "xPosition": "75", + "yPosition": "447", + "width": "0", + "height": "0", + "tabId": "4", + "tabType": "checkbox" + }, + { + "name": "", + "tabLabel": "ckAgreement", + "selected": "false", + "selectedOriginal": "false", + "requireInitialOnSharedChange": "false", + "required": "true", + "locked": "false", + "documentId": "1", + "recipientId": "1", + "pageNumber": "1", + "xPosition": "75", + "yPosition": "478", + "width": "0", + "height": "0", + "tabId": "5", + "tabType": "checkbox" + }, + { + "name": "", + "tabLabel": "ckAcknowledgement", + "selected": "false", + "selectedOriginal": "false", + "requireInitialOnSharedChange": "false", + "required": "true", + "locked": "false", + "documentId": "1", + "recipientId": "1", + "pageNumber": "1", + "xPosition": "75", + "yPosition": "508", + "width": "0", + "height": "0", + "tabId": "6", + "tabType": "checkbox" + } + ], + "radioGroupTabs": [ + { + "documentId": "1", + "recipientId": "1", + "groupName": "radio1", + "radios": [ + { + "pageNumber": "1", + "xPosition": "142", + "yPosition": "384", + "value": "white", + "selected": "false", + "tabId": "7", + "required": "false", + "locked": "false", + "bold": "false", + "italic": "false", + "underline": "false", + "fontColor": "black", + "fontSize": "size7" + }, + { + "pageNumber": "1", + "xPosition": "74", + "yPosition": "384", + "value": "red", + "selected": "false", + "tabId": "8", + "required": "false", + "locked": "false", + "bold": "false", + "italic": "false", + "underline": "false", + "fontColor": "black", + "fontSize": "size7" + }, + { + "pageNumber": "1", + "xPosition": "220", + "yPosition": "384", + "value": "blue", + "selected": "false", + "tabId": "9", + "required": "false", + "locked": "false", + "bold": "false", + "italic": "false", + "underline": "false", + "fontColor": "black", + "fontSize": "size7" + } + ], + "shared": "false", + "requireInitialOnSharedChange": "false", + "requireAll": "false", + "tabType": "radiogroup", + "value": "", + "originalValue": "" + } + ], + "listTabs": [ + { + "listItems": [ + { + "text": "Red", + "value": "red", + "selected": "false" + }, + { + "text": "Orange", + "value": "orange", + "selected": "false" + }, + { + "text": "Yellow", + "value": "yellow", + "selected": "false" + }, + { + "text": "Green", + "value": "green", + "selected": "false" + }, + { + "text": "Blue", + "value": "blue", + "selected": "false" + }, + { + "text": "Indigo", + "value": "indigo", + "selected": "false" + }, + { + "text": "Violet", + "value": "violet", + "selected": "false" + } + ], + "value": "", + "originalValue": "", + "required": "false", + "locked": "false", + "requireAll": "false", + "tabLabel": "list", + "font": "helvetica", + "fontSize": "size14", + "localePolicy": {}, + "documentId": "1", + "recipientId": "1", + "pageNumber": "1", + "xPosition": "142", + "yPosition": "291", + "width": "78", + "height": "0", + "tabId": "10", + "tabType": "list" + } + ], + "numericalTabs": [ + { + "validationType": "currency", + "value": "", + "required": "false", + "locked": "false", + "concealValueOnDocument": "false", + "disableAutoSize": "false", + "tabLabel": "numericalCurrency", + "font": "helvetica", + "fontSize": "size14", + "localePolicy": { + "cultureName": "en-US", + "currencyPositiveFormat": "csym_1_comma_234_comma_567_period_89", + "currencyNegativeFormat": "opar_csym_1_comma_234_comma_567_period_89_cpar", + "currencyCode": "usd" + }, + "documentId": "1", + "recipientId": "1", + "pageNumber": "1", + "xPosition": "163", + "yPosition": "260", + "width": "84", + "height": "0", + "tabId": "11", + "tabType": "numerical" + } + ] + }, + "signInEachLocation": "false", + "agentCanEditEmail": "false", + "agentCanEditName": "false", + "requireUploadSignature": "false", + "name": { + "source": "step", + "propertyName": "signerName", + "stepId": "$triggerId" + }, + "email": { + "source": "step", + "propertyName": "signerEmail", + "stepId": "$triggerId" + }, + "recipientId": "1", + "recipientIdGuid": "00000000-0000-0000-0000-000000000000", + "accessCode": "", + "requireIdLookup": "false", + "routingOrder": "1", + "note": "", + "roleName": "signer", + "completedCount": "0", + "deliveryMethod": "email", + "templateLocked": "false", + "templateRequired": "false", + "inheritEmailNotificationConfiguration": "false", + "recipientType": "signer" + } + ], + "carbonCopies": [ + { + "agentCanEditEmail": "false", + "agentCanEditName": "false", + "name": { + "source": "step", + "propertyName": "ccName", + "stepId": "$triggerId" + }, + "email": { + "source": "step", + "propertyName": "ccEmail", + "stepId": "$triggerId" + }, + "recipientId": "2", + "recipientIdGuid": "00000000-0000-0000-0000-000000000000", + "accessCode": "", + "requireIdLookup": "false", + "routingOrder": "2", + "note": "", + "roleName": "cc", + "completedCount": "0", + "deliveryMethod": "email", + "templateLocked": "false", + "templateRequired": "false", + "inheritEmailNotificationConfiguration": "false", + "recipientType": "carboncopy" + } + ], + "certifiedDeliveries": [] + } + }, + "output": { + "envelopeId_step2": { + "source": "step", + "propertyName": "envelopeId", + "stepId": "step2", + "type": "String" + }, + "combinedDocumentsBase64_step2": { + "source": "step", + "propertyName": "combinedDocumentsBase64", + "stepId": "step2", + "type": "File" + }, + "fields.signer.text.value_step2": { + "source": "step", + "propertyName": "fields.signer.text.value", + "stepId": "step2", + "type": "String" + } + } + }, + { + "id": "step3", + "name": "Show a Confirmation Screen", + "moduleName": "ShowConfirmationScreen", + "configurationProgress": "Completed", + "type": "DS-ShowScreenStep", + "config": { + "participantId": "$signerId" + }, + "input": { + "httpType": "Post", + "payload": { + "participantId": "$signerId", + "confirmationMessage": { + "title": "Tasks complete", + "description": "You have completed all your workflow tasks." + } + } + }, + "output": {} + } + ] + } +} +"@ + +# Create temporary file for response +$response = New-TemporaryFile + +# Send request to create new workflow +try { + $workflowDefinition = Invoke-RestMethod -Uri "$base_path/management/accounts/$accountId/workflowDefinitions" -Method POST -Headers $headers -body $body + + $workflow_id = $workflowDefinition.workflowDefinitionId + Write-Host "Workflow ID: $workflow_id" +} +catch { + Write-Host "" + Write-Host "Unable to create a new workflow" + Write-Host "" + Get-Content $workflowDefinition.FullName + Exit 0 +} + +# Define redirect_url +$redirect_url = "http://localhost:8080" + +# Publish workflow +$published = $false +while (-not $published) { + try { + Invoke-RestMethod -Uri "$base_path/management/accounts/$accountId/workflowDefinitions/$workflow_id/publish?isPreRunCheck=true" -Method POST -Headers $Headers + + $published = $true + $workflow_id | Out-File -FilePath "config/WORKFLOW_ID" + Write-Host "Successfully created and published workflow $workflow_id, ID saved to config/WORKFLOW_ID" + } + catch { + $message = $($_ | ConvertFrom-Json).message + Write-Host $message + if ($message -eq "Consent required") { + $consentUrl = $($_ | ConvertFrom-Json).consentUrl + Write-Host "" + Write-Host "Please grant consent at the following URL to publish this workflow: $consentUrl&host=$redirect_url" + + # Wait for user to press Enter + Read-Host "Press Enter to continue" + } else { + Write-Host $message + Exit 0 + } + } +} + +# Remove the temporary files +Remove-Item $response diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index 0579c61..551ae24 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -1,12 +1,11 @@ # Trigger a workflow - -if (Test-Path .\config\WORKFLOW_ID) { - $workflowId = Get-Content .\config\WORKFLOW_ID -} else { - # create workflow - +if (-not (Test-Path .\config\WORKFLOW_ID)) { + # create workflow + powershell.exe .\examples\Maestro\createWorkflowUtils.ps1 } +$workflowId = Get-Content .\config\WORKFLOW_ID + # check that create workflow script ran successfully if (Test-Path .\config\WORKFLOW_ID) { $workflowId = Get-Content .\config\WORKFLOW_ID From 5e5ccf46e9942cf3c1113436a46527381a10619f Mon Sep 17 00:00:00 2001 From: inbargazit Date: Tue, 23 Jan 2024 12:18:55 -0800 Subject: [PATCH 388/462] Small fix in createWorkflowUtils.ps1 to add customMessage element to mergeValues based on feedback from Maestro engineers --- examples/Maestro/createWorkflowUtils.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/Maestro/createWorkflowUtils.ps1 b/examples/Maestro/createWorkflowUtils.ps1 index c575d19..94e2cdc 100644 --- a/examples/Maestro/createWorkflowUtils.ps1 +++ b/examples/Maestro/createWorkflowUtils.ps1 @@ -171,6 +171,7 @@ $body = @" } ], "mergeValues": { + "CustomMessage": "Follow this link to access and complete the workflow.", "ParticipantFullName": { "source": "step", "propertyName": "signerName", From 8b8bf1efdca476e212765ead7c13bb607cd03191 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Tue, 23 Jan 2024 18:22:04 -0800 Subject: [PATCH 389/462] Maestro (beta) in the list of APIs --- launcher.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher.ps1 b/launcher.ps1 index 27314e6..253db4e 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -140,7 +140,7 @@ function startLauncher { Write-Output "$([int][listApi]::Admin)) Admin" Write-Output "$([int][listApi]::ID_Evidence)) ID Evidence" Write-Output "$([int][listApi]::Notary)) Notary (closed beta)" - Write-Output "$([int][listApi]::Maestro)) Maestro" + Write-Output "$([int][listApi]::Maestro)) Maestro (beta)" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); From e17b8f00d66d98d531e1285add2084aa0f604a98 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Mon, 5 Feb 2024 15:08:31 -0800 Subject: [PATCH 390/462] Adding Maestro API to the README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index aaa3964..c8ec7c2 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,13 @@ For more information about the scopes used for obtaining authorization to use th For a list of code examples that use the ID Evidence API, see the [How-to guides overview](https://developers.docusign.com/docs/idevidence-api/how-to/) on the DocuSign Developer Center. +## Maestro API (beta) + +**Note:** Maestro API is currently only avaiable for developers that participate in the [beta program](https://developers.docusign.com/docs/maestro-api/get-access/). + +For information about the scopes used for obtaining authorization to use the Maestro API, see the [scopes section](https://developers.docusign.com/docs/maestro-api/auth/). + +For a list of code examples that use the Maestro API, see the [How-to guides overview](https://developers.docusign.com/docs/maestro-api/how-to/) on the DocuSign Developer Center. ## Monitor API From beb2029ec817543c0156ba94332a956dfe7db9d4 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Mon, 5 Feb 2024 15:09:05 -0800 Subject: [PATCH 391/462] Adding Maestro API to the README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index aaa3964..c8ec7c2 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,13 @@ For more information about the scopes used for obtaining authorization to use th For a list of code examples that use the ID Evidence API, see the [How-to guides overview](https://developers.docusign.com/docs/idevidence-api/how-to/) on the DocuSign Developer Center. +## Maestro API (beta) + +**Note:** Maestro API is currently only avaiable for developers that participate in the [beta program](https://developers.docusign.com/docs/maestro-api/get-access/). + +For information about the scopes used for obtaining authorization to use the Maestro API, see the [scopes section](https://developers.docusign.com/docs/maestro-api/auth/). + +For a list of code examples that use the Maestro API, see the [How-to guides overview](https://developers.docusign.com/docs/maestro-api/how-to/) on the DocuSign Developer Center. ## Monitor API From 4c8b5917fdc462c988c5a90b6e52d1d00e476d01 Mon Sep 17 00:00:00 2001 From: Anna Hileta <80112359+annahileta@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:31:04 +0200 Subject: [PATCH 392/462] Added web forms template (#99) * added web forms template --- OAuth/code_grant.ps1 | 4 + OAuth/jwt.ps1 | 3 + demo_documents/World_Wide_Corp_Web_Form.pdf | Bin 0 -> 45823 bytes demo_documents/web-form-config.json | 1 + examples/WebForms/eg001CreateInstance.ps1 | 81 ++++++++++ launcher.ps1 | 37 ++++- utils/createWebFormTemplate.ps1 | 157 ++++++++++++++++++++ utils/startServerForWebFormsExample.ps1 | 91 ++++++++++++ 8 files changed, 370 insertions(+), 4 deletions(-) create mode 100644 demo_documents/World_Wide_Corp_Web_Form.pdf create mode 100644 demo_documents/web-form-config.json create mode 100644 examples/WebForms/eg001CreateInstance.ps1 create mode 100644 utils/createWebFormTemplate.ps1 create mode 100644 utils/startServerForWebFormsExample.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 15215a5..5caa861 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -38,6 +38,10 @@ elseif ($apiVersion -eq "notary") { elseif ($apiVersion -eq "maestro") { $scopes = "signature%20aow_manage" } +elseif ($apiVersion -eq "webForms") { + $scopes = "signature%20webforms_read%20webforms_instance_read%20webforms_instance_write" +} + $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $redirectUri = "http://${IP}:${PORT}/authorization-code/callback" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 6199745..5ad8cd9 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -51,6 +51,9 @@ if ($apiVersion -eq "rooms") { elseif ($apiVersion -eq "maestro") { $scopes = "signature%20aow_manage%20impersonation" } + elseif ($apiVersion -eq "webForms") { + $scopes = "signature%20webforms_read%20webforms_instance_read%20webforms_instance_write" + } # Request application consent $PORT = '8080' diff --git a/demo_documents/World_Wide_Corp_Web_Form.pdf b/demo_documents/World_Wide_Corp_Web_Form.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d6b952766a08335d2116f0f8f746622473d4c6fa GIT binary patch literal 45823 zcmagFV{|9a_U|9twmGqFJCkH$+qP}n=ET+~wv&l%+fM%TJ?H$^xp&?Fy0;&6Rqx*W zy{q?ws#>dGMXo3+PRB&g3PV1Be!2_8M8rsBXJ`q-%gdl*;cRU}M5SiuXl<;gW?^ii zCt~Mlucu~Ws3&gcXhRLdpy+64>|$i%NJOPXr9krR=U ziLJ4TqlqImKR?Xh?myZr|IJ}!K*R*YAS_43Apcj=!1}*V9RGC^5&FmJ->$MEM2s*D zveN&$s}V8Lv;6zwfMJl6C1U#fPFaY^+0n)1|6i5!zp5%8_9jFO>I#OICPvPG!(0rV z|7DS~F);fZ{r7{N&51bw3QC$-n3+2haj?QLh}c=%IV#&582ybDHF32tGEtHc{+r3d z*-6pFQN+&1-pj6iprYUn*CMf;$mUu=O=P< zb~G`tfpO1X%nsAi^yvQnF7wLkbaLZ}Ag5^L@kz=UOMYNxks8j$l9QFa9ukcKzwpmD z9ElBw`6Gk`4qQ*vmDgYK@=hSxkg=Mv%K3b?c|3Ce#2dE1d*hR%@ac$PZTGFmdvZyZ zBCF(_Sn7XboG2M(nk?JBHcgeG>WF*tJpw5=k0v(9nkw6m7NUqIp2(R&CY3ozO%#|f z1rsi-2qv3EwGvS3z#S3PSl{*Oc66XX_$^+j=T!^|;VzXJZ2#vhE{fHvYVJ@A@7K@I zht=_0WkfMEg17@!IUU>Vt{LT~Xu2u7cXm=LVRB$Ulq}dGf$@3m;~)SU-?>mJ!cY%i6oMl{e6T(KrEAJpVtR+-Rwrv`ih+P zYU%ltTJ>T0EO{wSpRc^%h#{ocI_WRUbAwk=%3jiBf}Ju)u6miPI^11l)<24@e>BQw z|734}|MQZ^5Yw&3{E;_AdVL80b?ddo!Qq)1*3``?iUNJanux{7Etl|}x+3qSL_KYT zl*@|Hk5on-#p79R@WB9n`A!diMUS)PBh+w?GOIF7Zee-~r*5j9IYygwMV<3zbbFIW zANi%S@;m~#`kuZV@8C@K@UUK9Jbk90x%`nc@gwEx2f_G{i`VgO2-8;Fg?;;>H%4kwd?J3!s8=S6X@B0k}U6>HA$8M&_ zPEQ9MSL4TcZ5-cYI#Uv@CR~RDkObobK1A;q344w2cM8`N-PKEeud=tVB4c_rPuDc4 zR}AP!$<9}F_@nJVrl{47)27UHe_l|hnd#(?(q66T5RH!7aCzm~*|$L_0#THjQk;pDJgQ+S1Vw+i}4ESX3WhDB_w@o19;rp5Ix)=cI44{&)>>T+DCWW(+XfQXBl-mvS{@8-oX6;2+TB+&28G-}LN; zH$TK%PMm1Xv1I)iZA^u;(ZSoGz0l=*Q}QU5e!9GGPqLn`KT2V+l)c{0`FcsX`&^Ig zLcd>CBloJ2{L*GlbP`H;>ORHRgDCRHEc<#4fZJn}`hz839g5;H^Cr;4^!iwINScy5 z&jwqjn<>yEkmMkAvmCh<$w@>IrVJ4*`69wSd)Ug-`x<< zoJ6}A_fZn*p!d3SEBC8ViUg@S_&^S<65D2j2)=9%%6g15ii6;)GAjyYd&z+}m?ZWFr3v zsKvpq^UKlA5~B6gn5Wold8hS;m&2g)!tvO-Yo4vnd+CznPK3kuFN>p+`iq8$Dq$gr zQA7{GU7E;GtOChWeoDRLly5o}dk86_(gMLQCf?_vgTBr^Qii57%WBH=)ag3f_RGp+ zO*%*dS-(eF*EVU7CRGoBu1jDEf8P?&!S%}7nugsB$(n`mI(&Vkff>Q_i|mCb6KeHO z(Msd)w1!a@sT0e*{oUm2xu);w;Pbl`)7xHg+vTGQ)nksCN54*$5)ejq-!w@w8%72{I?&TNMqOmdV}92Gh+f2}kXQ3Z~mQj=G==gwzd zS}1E@>3F!=cSbJZ`DEhNs5uh#aU8X`fqIMe?iPY=MSb@7ZaD~xRr(-ubFE4CV9DbFzZBvzH-Xcwhvk*r$TQJRm>Dh!?xWv67<4vyl7t&jkqwa~*fmduXqtgeDd`mr&NCiXXWa?l*<-X|Ic3Qmc3u4;cn+zV0@*rCLo{_gzTIX( z|9s4JelAIfyN>>?%HDU8WXjLx&gS)jUwqn~kdIP>_4FCkS2QDcymJ0pJq?R*wG6Ql zSNhQ$DH%k6tCRF5T7+{@zTXr55&4Y8Nl7~do%+G(^;OBe%CXoGD1LZp>(ffC!lw@y z&-GofIT#PZ)9|0u&ey>(R(Q9f*ihq1t-Yys3+v*5NWBTbnol?`Na@20_y{>3W3H?=p!Ksc3KrN_11q&lj>fZ0JH2ZnQ0 zG}ZA^ozQILU-I*N9ZRgdz0eWRCZ);Iyjl_KR#~JoE?GuG zn~vx*4asvLN}eoSlW=B;M+k>A8Y*+X7bd_2)9 zG9Pu0RX(KOFuah6-%xsdH#srJ7@h0R`ruOi+NtUV?AF+{?q#;}?a2P8H0plJ+@t3b zOUo-5+oWjkVb}t;`{_9Gpp{cZB|1xGPgK zjvG!j_&1dPbvh!4e0!Fe$Rmnh^NJeRRVN2d8~Y9eY6pX>^+C%@Vv+cn8M`q2!bqB_n|e zcI?urFS+~Th!Q~J9NR~S?R_Zd7O@u5$63t2#6h(j;r4K=$+LOa*QZzk^J)&li?u-4 zM!P)Lr4q}@$++MsLw~@zPW-};d$)&euXF9XYvGdmYGuRiXB$T=DP`PuTEmw}oEb(A z|13}-<5p>S&P}No+z~Ia^PSTE>0qtAO|11a%9S*RQTnU5yM!jG zV(H@OtPLsO(u`;XC2rL3CnE2g)E7=G_(2(q%=!-P#g0LP&_qx#0FjtU91+`+ix~xE!w@ENfeK|>Wbiu8r#nH`Oj0k_yuQM*#`h!tFyz7tfLo*2|>~4N{98?oJAVZh#1~w$2Gz^W+f4x_YSei*S%ebLu8&T{4Vc*0 znPQ%=#Se2mx=Tk@I2*nk=!RydK9mK!s5tIDr}Nq3)q&+Ug@y50j*2+8-?0rT(Sq_d z$~oQ@oJur2D%4*GOFLgQT^ZonpWrdAuj2$FqUDG#RzW^%z4`o{#!wM(26MtH#{RlA z6d+xP!dM@$=8Bl7^Mit%u*vnV8f^~jiY)ld`)D?bBI z59zV+NLotf-q|gdxMDs?k5^R6Udf3~&XnIn26NA*E`@d{SHq(<{f41GcUpYHFXw*j zJe?pjywPO*tA(n27cI*31AQ3#%o31^T=2B5nDWb;D)bCS(BtTb43w~%CU~q}10yJN zXQpf=XKN-1_r5z0Rzo<%Kq_`o&xbjB#s1`imRCj@jEY3CsCC&@@LKn0%vQpxg|8dy z4SW%)Oi#Bh<1-Y@8|Z{_k0xooQ60ML%{Gp!n$)m0xp;eUY#p(Z^YHPQnHA!oIMte= zX#NWl371G4&S~~+lc{N2lKbhl1sq&RP>3T?TZ_Ob8ZnRzD`zH7Q-nAM@e#~@yYS(u z+wIvpYHs6b1bWeTxSs{=w2C2X=)^6&DlDh~I>$?fT{Cn?7Fc(Up$!oQ;}L=wIxnM1 zNYCqO*bey8`_k7xDM>CzBm@KR=6{sS;GEL(0~QAlxGA;=lWT&fMKV8%=VH_Y5ANp< z_a8$CTuS>fh9)hw4WVOcUnDS$28Lfog}o=ig38gb3yFkcGWKg9W+W+7^KZ$`SK#0? z_JYJI0-nzbbIzb7ur0F@mnOjp)-loYE(X!P3G!|()?Cw8Aie} zVYLq~<^4Lp8T}9CYL_3*DuX=}knuG{#RC>6qXl|kuSZdMtwY6RFGk)TiGE7(s3fS0 zwaH_6l0f6Pk&aVYZ!7msQJwKVsJ~s_XSAo#ahq(riOTzY4BfEDVb9c6m27I|=T#&_ z;5I9^k~8h~nsP`sM=^FdG^XwTvgze!Aa?3YTmL0NAj4mIQk$cBY*iTJ)Q1?EDT8ZD zk*4SmM;71Cuo&Bor;DQ*9G150`~gB0N+b8Ybhr3KZtjeYtsxA=Tz3~wyj2$K^1Bev zB$*smASE=4)3i71XYT~<+1Fjg#kyz7gT4?`%<%MJcGGzBVCG6y&&iTe(4w!`%V$lb?k&7v{aF_UTfLp14A zpzl{0T5}D&+cP_NsCLohW&NV%eGvAj8e%njos$VarvWz4bG?Or(UW*fh0 zG2bPi;jWh--AG=F!Q~q)jGOIbdc`5pQ<&r|fTm#tR^mHoTQvD-0`Sn}eLu$d){u-U zzwj&)GeYCA27WQ}LNI?AdiNrMnCEYNME|rF+TsO2pHzlru7_g@g;?zcbbdGfH0eG&X% zw<4ak0Mc#G`r|bwMo4<7seKfDoE<)hftk@SESJtfxHs*!sscqG^GY)GDLb=B|7c7CtkC;KL{8E8=1^gHcS)RUE!7I9jj4 z^wgVrX6Q<>d=>o}EwZ~Uz4U6HaVgzW;YZ_~w;j7&<=x2Fx+5M_@%2^HHGPr^JWX(9 za|g&f37vERmx`hIDMz|}pfe!oKWdd*vvC{6$!Vt3OP1fcj<&kPFi7lQD|&Vw=F*qc zY64z;rK}oBHo!ly(TYr*N7202s(rbPtFD&iN-suPHKXdAsLTE|l=fwyGm)}h{;|85 zFmWIF)o@ZGfBa0#Qg_`hf6TRe6k$3*5gkN5AaGYIF#HZ)@&=ztl;is#8&uk6wSU&T zG*F?R19KFR-6%h8i_A^fjYMQTz0yR-ZeY?eXj|PXvU@bj2B!0te49{2nt$F9OiPHLEoIb$4186BKagB555H zoi2onv{T6o@E~H?Ii%_GPU%#>1V2-P1RE#Px~MYG-5uB2);=`;9G#{=FgtW?yj#n- z!j!d7uRy)NX9iZ=#axewFtPT=mdilTRF9CWB1&o*Y(vLx^hd+L<|uJ@LDItaqYt{% zvQhKoeWvI_H_|feY$bTWK`zBE-KKam1NggS6`p`e@m(#W-&`z*Zn%y3%pCXQ8F|mf zN^>wZ_fP=lEwUSs4P|(JvZ3|2TRkxM@c1T` zhVrI{9kt|IB|hUy5)zT0p8+ZI?W96TlaHGIf<34VVw6nWV;dx5JABewwpk^BZ5OYF zdlek(xsZ3YozobwoyB*iYRtU4V6P_Kfc{PXW4k<1{)@|{*AY60di2y4q@8$WcH?mf z1nYl^6}6Qg@ts1ZxQ&6- z>U%Lh5`rR~Sm&DloZM|f*q~2c0;ioEr(VpcJj*=}g;JGTh)HO}?hgtc*kvWY8fYnC zs7DKOpbMHE;XDW^$AvO|E*Zid|}iWLF96 z$_uUE3r)l`u^Uj1T#OcjW~oa>(+`Q6md}7e!`WwH)a1kgH}a=H2xLGDWJBj%xuCa> z7m_(~AUaXvg5G6PO?_1YCjF$2mKcUhYTeB5I$LbR0SXkLi;+BjW~w7lQy$r_Q=UH zWEnvzeM1M3K09e%aM>8C#Ak{VerGUx1yEh-@eF7vbsAFL$TC{uykjE_ByN0(A=i3j zY)Y;Xj=*RwmiU~z4f`OP^|Os*jfBIk-bAn&_Ge(V4(!tqMfLBi!Zo#_vZH}fhim&& zOZ}9&IB6nfG8tfK9cPBk+!p*Kwd4NDGJbqPgLFZMWQ-2O9OW+vfE8q4&)QZe)xb>O zVdqn+jTFd>Qjr>v<8Bj&|6J+Pohym+pOsUBJ_40KyB4)`Z*BF{7*i_?X%9ok3+T-} zoaPO9e5-r!bAB0)eI1)t9PJCpy*g6m=#vwnze`@xQu9WDC@-r z0yZDGa>ac@Zvm>A1Uy{`@BGQmZY|$F0{6J^fxsrSCtyi1+sho&FUv!4r5omnMv_6T z&O{W*f#;YM@n&&!GCcP#GcqMlC#n-o^iNz@zoX>r4IH$)vF+hzfkx_K&B-5)!AhLb zqPlbvNWbAr4ZVu%#A&8-L*8c?4#~gQiw;79AQ!Qgk-U6~hR>@vVu@ADbk#?pWN(H^ zZc}7QPg+jx=#0)9TIu*q6KT6??)9MBGdW@z{wz+WnU&~}yTt%iDGJCPBNeoXil{j> zcgTC+8g+!iqR5b?X8ZE%eWlw<#!?q2B0%ZNYz82_Ki1C%Rm`U7z7IevTzVIyKe&Xp z&7xsy#Mh&vao)4;G@}X}gV)7^{oQs^e+U7eFmXQ}z&70Z^;P;2*F?E%fCpY|q~g@e zw59LR4Qi~dz?yty&hdP` z+PX4mUu<^pVf(P+`;kTH;;MI2YZ_S@=9o6QVdFFi7O_KkMAqMJdjy!O-Ew%YHP$io zcqsTnnsYV4wpl2AO>Kbl2DA#~ZFT{GxGku0ITwdcMwAD{0Af}XtHDxnGj^gjqE zI%~F2{sA~ux@$HfSdSy%d(Gw~Y-ejc{9e^B*Ymo@)r}v{kk##-8nv4Ead5O4{w}AO z1za;v@@rf@1!s>IRTy>&;Ln>>sIJ>eWKc z0sAVmEcnfiU!5HR_&er`0&%*9ZvUGp#TgXd?6b?E{HZ!pB_3|r1Ic2#iJKaV(j12f zR1Yo#KE=N6dm}AX-4WecEesGBKuWV<(rRW7!|3$+_)Eh5a@3Tyn7@^<`kQ(+g>G52 z{gincybXs$-c0)uM<5W!3o!_o`iY*I6kP$@XeZPK-eANTlas^sQFX;jW5(aAsFs8; zR_w`f2O9;0MM-`$b6d+ruf{|3kT@{L(z)pW`GsdbEG3yS2tHLcoblQK|9VqM#6uYG zS~}>Lg=uW3zi|14I@yO6hZ=BGD-pbmP4Fb9$Y|wg#3JMI z3_q_MH1LFI{YYO4u?jNTSw?Yfu|Ms|~#$C&vIAF0tN>b$W*wJeE0g|MOH?=o%rflsv zqs5{n8l9|G$^^=L#Tby^^Mn5C+*KyP7Fu9SLLL)XGts}~+j668`0%y-xI1*Y&dRgx zRpf06ylAJVuic~4s1;U2F5emKuMle47JEAB;;Y0*!oFA>hv6Ui~ z&*TMWj&0KL%a-xnbegp?8+aO>M2u<9niIh-6T_m)ASOqF z6z%uM%}>H%Me&W^0X-XrqF^-cwMi#hVx6?N>|H$uYYjU=h3+VScSNLpFGV{|*OM&s zG`+?uw2y1})F5w2`d480Ov^aY^(t3ZK9#NFpU-{ShV)O~1T{a2n=N1ZlCR&wJ0&>5?*Q!-S9Td zVphppbLe@9%fwN${syWBEP3IM~O4UWWAf=Rl9Ff4cdtek7tm~f$eaKrHPT8x*%(2%l|cA_4UkC@6eAl;86^y_h; zS?vQ`9|qq;^*hk9uUe_4b=yuq(P**nFrI65PPBR!jJ!AvE?I5L0YBZMZ%C6F;K7yc zwnjlg$+yiVg5dO<5W%Ipm!7UM6X6P^j=(4qb48ic^FgoS`gDySr3y+)8&9g4YeBJHmprv$X2;Gb@?5<~^PMH6T%k#NZf zv-OZ7Y|(Y^pMe+k)Bo+6ISX!Si64fB^&Y%gmNR0$K36t4VzcG&Sjk-B3TPG+0 zXqomTTa9!87MEmTIDL$#6=uecEIBK^KZIr@*c&vpR)US*d@gQ?Q6`lsnT0tB94O5T{W)LMNnvi(hW{+LwMMr6SR|H_Uyrgz(z0uUVplvB7S zT;lJTHbXk@>*(?&!yjg{wuo}{*78{Fl$b5WGQKIOf2=7~=vBHx%s1kPLFvTIt&&^B zMpN_+S>%C?6+Mh5c__9~+&hARi@-v5$dEEMw=48Z3vC7t*hR?(s4SjIWwh$a89MNK ztBF0qsbtkfPLzO{ItswuvgcGc4gv!ntmZW4kFr-;%$}w*dG9BDo5`DY!WlaB>t+IR z8$u<`lDEPsISdahvE0BE5u?SVe#m!Q!eS${HY5S>SJ&E$)g)ic2JqfB3Htb2*052RV0C5Ed_hBzoy|A(i#IK#r zYx+=ljRG*5+X_tFHV6iniVjSZfikvZ$XfO7W!*_pU=7?mULjFQ^6_IbUcYXvkSl7H zuO&I{6Tx;P3iVa2n8wk`Hyr+eGBuAu&iN9hBlzDTL;A|M6>_c+cPUtMSS}*c*+J0N z%;IXa_MaY#bJn99JsFJSNxoNDUn}_khdt}T6W1pXECI8`khKlbSA%i{SB4SNGD!ak zk_6Tq^R05aT>u2K3sk_V2-kxJ0xiUR|A5MVx$b482f=f@n9F*mJSsr2!-d5gbJT)<@zbtm* z@6I$&BWsch`G`h~uGjkzjsB_4-NR~G+4)Td$cwY#6y=6V$$rkw#dlpsG9((}`>V23 zD6MF}>Qj+k2SkD^vLP$AJo;mE60(+b53$PQKyosvN{jkLjh z=yM;f#8Fe!Sqgmv3Qb3B=n3BUkvQA}SAzyw9{Cjq(y}&zulrck1>?5FQ(EEMNf|^?L4W9>ANL#=gwQD4 zl;NBe`F8u>>j!nDrmF@O?2}NDQW`IZqAJ0`<*GIS0g!iRdf?ckYsHRENO+&!6Y+D! zfDB;A)u*OuO_t-yL*VKWroaym$KQEI_6su_iYL7nqru1@?f!?h^ptVuz;)|h^WFsk zT)Z2PtrMQj(!9S&& z9-dFZEJY2$?D~+sB;pTdamhjaaB*xs`YjiNIwv&&r(o0Za^|?Wbe&Big`zl<^EQuy zo;aik{0s&uVf$81TMg@==5ZTDd`kN`rH*}>iGaF>RKLA5>$V~`8D<%|w#En!_++Z;-NC4{zKEEip&1Tt8u4+_zBJlqT$~?b zd?k@W6i-fJ2Vh_zjSYP9j7?L!@nQ{+xgj}iOCQ}oZ97}irj~zyrINmiLysDLewLO& zfjXtvzu%eb+44fVcZW6YDTryFnTye5_G#>@MiThn%58^>m+X+}OY~0gv&%f_=qKP1 zC>+(#j36Yq*f8)dI=VXp?NIRRxv+in=}U|otKEEK@R@WxdE zV^mYb*)&`K-sHDEzVme$&!SmLAk~y8x zM&3sSUSCm_+)8(69YKXO*LzOVgr0e_H#KgwCq*}05VFZa0Ef)B{&=A48jTkSdpyNq zK}5y_`0)^9g zSrb(b$UT0hCC%5*+LwSG34)|>5CXlj~NFxnc|;tX=R3- z2?)O$J3kr;nzP`ViR!`c)>6(NP5Kq{lMOeJ;ZyWBF$BZrpy)Vt2}~!qEiN%K9TG~cP1nJP!@H}835hOW zEoIP*@#6j=kqc(?G=}0i4FY*t1I5Az^6gV?{`%IeB*RTJ4^iw;o(bBz%hLT-BxCCX z8DyLA3*t8qY54y+=Q96y&iyy#toSdaS;@r7&c)Hl#EIxH-Tjx{Hc~cmCer#Bw#}eo z;_ghu@GtgR_&=@4e_AOW7zQzSX9;EJza;ZNp%N@a{~+8-e}4^d5dFhxEB(c`|A(ah z$3dNw=pWGfUuJQ;zdZC`n>Z^G>%W7<*@)Qw(_<%M|F_>i0&*tC76!t0?nGLQe~s)+ z%tRbq%ztx>{8ji1RXY*=vy}Wzs{9x4HgZ-paQv6?FQEPJ?qB%(-&+5Jng8qge^~Z^ zq22$K!Ra4Cm%n5BiOO#dqb|F1X^17`zkJF|Z>{T28>6a6ps z{x{*xM8w3(#rprCz&Tl&{x=GI$P3n6W$5uc<9%zhGpjRe>M9gy)r2?#LRJzAShPLf z8YMgcsnC)||OPnf&QyGTpswiEL2?*$34_tq5 zJDw^jLBa>>Kl)N^Hg)!VcP(ho`gHIb~s*kh=SBeys7@U)|}sR*=pk_Z1DjBe{v#PU44~_gTjH*2Wq4(PBP*5 zUX5&VsjQ=YRs0ez2Sv9OI(m%K2bSI!N&S$PRh99UzVsan+OFiFpfDo*GG5f$T=U7^ z?=>TyNdUg9_50XMjjqTOlyA7rYrPyReOZ;6o@hCHkF$EN;JDRom~juvEeu&G$2t(= z-&6O-erkqtfa!+&Z9uU{{=%FNdXI$JTN3`$T-bOI@uwxT`Q4=>bpv)%^ib!HXI~L? zpa?R!XR%7>ac+l4A5pp@u-e!NN|brig&@+-G%yO1GG9tQx)H;;qG$)oyAw2PKeIZ5 zP8~*#FdxvJ)DivA26`RDl2+>D$V`u3yulmwOP&|DQCx|h0j;0iM}wO7O`PsnywyS2 z=`Yi}=bw*UHYL@Q@-yNRP}`qxvRiiO)j%a=yW0H;cCvGDAnDS7K-v_wq%=kGG0V&? z1o5#$3qC0i;m!@9ok^Mz=sXDSEJi+>sdi}$(7_7e=mmX;WW^?H z^`Z>0mk@oS;~)kRWNUjFmb|4r;#=>Oqh&a^BY2OavT5QqgE}a!2eOU*=z9}SN4>y@ z;nSA`w3m0)gto3Ux1KAJ(hTMB_^sa{TW|? zi8kQe`ks~UWRHM0;u!d3b~W38tuA`GE#ACt?s~lo(&dbSpHQE0RG@*`Q$KMqYnFF> z-1E8yYs~I7D5C1**)eR9$JLWK2%(eK4F3G|g=Laj;ywn*I7LPCLC# z+#q~vpk>L;@;VH-E%=3{YN#HtOM_L@TZbn?8HxZm!PsP^9%%p_I)t^x*kowlXU`RC z3Kzww9cn-vN&)v1E(VK!s19hr8}6QwRX;tdfM5U*u90cMpbbofE>r`{)UdoyF{S`U z1WbfHR9BUtM`^&^&>LOM&+x~JhV>rBfM29nb59)iousl%xG^4Ehd(skP5FSy71?12wKRV z92)rk&q&Ap7_^vZJ?Xjd7m&!%kz?g#)I5o~I(Ja9)!TM7@V!U0*L^3dyCE~>Wc1pi zQQV&3!bx{JvD_Eh$c@_!H0)cPNanpowD!GUXk7cqkQl547YLS$Z0 zN5d=~7krVBk1_U(gtTN7ikKOXWT46aXdaL$!NQtWYUTR(D3RPBF!-i5-9^jt7>ma= zF*l}`YU-nkkhNEqClI5hWjpE*27W8EI^^d1Y>&B>SY)~8dK5DKL3+YT^WX4>Kk(L> z+zeP%c?&Dz#ZqUo`Yg|jI$3F})sv%r#FvLU$0tZ9f|$|?V=}7cQaU3G&eIO`jNQOH zmhQ|pJDT(SzAEv*Fmqi(##|76%sppk_^LJ9MAxf*d2zX_8rxt|xCJE^`Ye1Rz1m?d zFh}4Rk>Kr(x^Zve+hko7>v&S}M8JRFZHiR8fHE)S6 zNL&BA3D>N4o5R(Oeoz{8o6FKM#22e=!>DY6yb#9`2=?&i-zD5KPupd(g?ZC2Uw|j06y7wJ4 z6|S{&p5BArqTUl=XMYh;9nR6mQPpbiMhO7-L~8Am3t!(gJ(p`kZz2Aa8|2v4s>8os zx37GJ@P_P;c(KEC>up7L>vyYK-er&74#`=vvgg@5KN0fAJmuMO9lUn>0Nx02r`)SN zvG69m4Z8syBqZ(z5eVg}9=JhmgT1wVA>QM=F`Dd2+xM~O*i+ag7<}K=JvVv5{#fvY z{=&aCdEwfKdx0HH+W~%Y8^rnmaljnmN#k`b=6?#^|SXz+6(vENek}^pDE&K zTjvHt>lImYI^p<)k$D~%2#@P04Ug;NKi7C+8yPVWSn>$mPrAW6 z;suY>n&|}|G@IM@1UW6^;s;gGPyjt5<{!C5;*ELX9l_kuI41%?&5(8v-kP`r-=YtK z+GFW9Vb`g2NYjyn0{wk)62k5w2YSqHsT9Z@9l_i;%a&jFyV*QDR9q zAt{jr1UC@Ac4@Q4FOJjwdq_3IdzdMwYvHFdHI#MGE2`3&HnUxC#grMcnLU(V2OA1u zhhykQaap)|e{k%$;9|>%ZI)I<(nf#;)hF2hvSLhK#!0&CXJgx^!nYlWZUM%wt|v16 z1z&>-+j3{w*T*JT)qdf`Hf1b#uPtW^R@T4ZU=);K&*)mtjCWxIdn}&NUBbM97X9eZ z5j(F$puow546}>bCz;>KjAc~aCs}p&dpcLriu`Wk5KG1%d zUe%syKUfhdqd^8}N@{9&kSU?1r2egaPSQl4YGLp`Kkz=18l5TS9)`Y*e?YEJ$B6K< zy?xn#s5<2B&&{6}vAOh>P{POXgxp-ZzjNgUz~1BnP)h*66Tfa`G?0>@Zh)1s$ewNG zKXkw(&be|At$#e=LkW4@RN|P-G)yT-27jBKUdJm3`ULM4z7HEx&cN}QS%-yMFXvP= z=8S}KJlIG3!#WbWTIJ5XgUkvz#acQo`yIfBNAgQdQ@N*-8?;_7DrkSW@Zr@C?yHU$ z3-w+Tli{?ut-6a+TO%VG*Mm1jGTo-4UfdNO)8Mm36>rcHWnja+ifRM>KGckiMqfPM zxz1ZR*)Q>p_NY2s=sa;jt-er_{E-Ih)S_C}HQqhsSp0df)W>)^Sbv&9#sSo>(09-q zy*wEpso;Ftpl)k5t<*GQ(q}GDWy)UglG#7^MDa&yB|OIsEDQD)<5i8bWoA)ctu&$1 zs7YUC6gf*$D;>E?7-}Xx5**@p6s1%VODRMVE##lYx)c@oLWtYGV9wIQ&`8m@ra}tJ z1vF{??>zd$;y1Fm2n$em>~x13g)!GJgXP5L3Xx-Q(#sT3ZqD$E>@)qy^|WVYB8_64 zVFp$uGr0~)ydW0LdobgHM#(5(=h*Y0IeV`*>S%W3B?${_GOL>HHIH4*hlchRWv2!S z*yZW-f{mMEV+=4a(_x^gvB3zIF&5$stq>Xo1%+Rn>WlMh^GjAXns^8}ySX~e&3rlu zs+R1LBp1yD9n_SnE>6mm=9k9G;ePH%e{ydCCkuGC$&berRKL22V2mC$g6+vt5k%zqsk^_CFj;j4 z%xa z>9B}!>a5s&$(bgX$ z>1ervxM$;JwxUm^kl4yQdefcUdeJ~^_iF%d2FZg5?>o44v!>L2y`HdKzLRbqYpuCa zMB$b|aT800cu0%s!WHsy-S)mCY*_0UkRk-w407jD(XDC2=M+~d8%Rhw#X_+wV;S-i ze4G@D;b|hX8wfBGP2j=nF1U03WZCkJY?WB%vfJE!K4VNCNjc)n?{HJxm&eUhw=88D zTR(+@OX1*vae)GK$tUMcA;|NMT;rhF1<@dc{q^+I4~d53VOaLYUO`kb3w088g@8MB z@KORms>~29wC(O3w)h)h88?K|q#N}r=E~9otrHbZW2^V=FL|`njl_J;=IpQw4{ZL; zob@;J+l>%_PipH4FK$GH;+$z1jKzQ|E)I5?fAl60l*ZUYXG0LbUDpnyV(XmC&v_}{ z-3*a*um--I-%}sFXM5++bLILu>FiSj^WfcpYQ~-(=$L4Klu+G3y(KHH^RA(uFjsc; zsYt6XLWkZqk$z-KK7@Cka+}y!uR}zP;;`wv!i`ZD1nu$pxxO&fG4`Q8$|NVy9QHg>pB80g%ri)h?@M0uySbTyA)Gd1L# zTC9Yd&`M~vi&-7KE=ALNx{fxLE^*|snd}&nXxLvuZQ`j8^uon8o4PmlJlX=uznVx1 zv*mGqf)PwUdRJ^LE$vjOsAmsJwAcww6xN zBv`oGrgY+n?SxdgV2P%`slVUCCnQ9iu&0L&VXn5My}hKpxMWo)QiVmKnU!U~`GL-k zFp+LbfsImT1oPgIje%F%-ixn<{Lq&iZSWPe0OhnWa_N}xeLj!S<7@m^kED0}i_e}A zujSh}?e6V43>zpp2y9+M#4Ies?eb^rj3C0E1SE0&Z+;8x4Vpr<5?GlpAg(( zaMvNYySokU9^47;?(XiM;O-hA!8LfW4DN0L!kzs0K3mQ{_q_Mh%eU(8s;+vfs@JgA zub&pIo*+8rl%0A@6C=i*ZiBDK9vUn2X|)Ei^cy1`y>iyk>yo<|iIos;Nv=OzM=+ zZ$UKf081*NEgMlV!-9xh87#|7g^n0X{Y2obwJV`XiA#uDAdGicuOTjOXI3UNJGs22 zdrvq5mq*+Xhistr_t@TKRb>5NH-v>j0|R@%2McD^SBEubClJNS?+;XygQ!4$PSmjF4S%z+I<$8$<+sybPOJbLpAQZByAolbQ7k76bGeLC?!m4< z+HlQ|RhlBlH7#J+0QB#a-=q}67SABa(Nu<7B$R@0z8q?bu!-jgPMC)esW7oqZOD%y zw@(Cy%6f}}-+dRI3n7b&|FllU_koHJPtjy>jk4>J=%6K^oA^L@L97LufD(gsyDsGS z@0q!7Zv`Xvu^{a9PWg2ov@xG)_3h6yl|yPgbojm2zc^^g5a7zVO96A%vQQ0}r8d~f zi-S45StR`xH*cnV9p1>6T@zH~7s$~OOKiBv@q3+DVK)F5R)j2wo~o<9v6i59@%Lu( z5sa-mDK7`*y|{AUEn4TP=l5?MRr_U#d=htQx51UrG2t5B>kr9hI6&>H{_L)SuCLf; z={#E`{_XrAVsdNy?tvzOd1|HXnOlg9MiU9yMnW^LhuLwVz0*L?0M3BzC5N5}^EiDO z_5-JOWG_%nLq)aHOge4DHjfMU$EjQma2xskQq?U=Cx>ipQkS{PIc$gCT-S;>`jY$t zrnrz}h(f0*0Q!gbPMOW4ZpY&1^%xqs8npu)XfA+{@h0qmyTUr~ZM^8dsm$HNK}klP zup|c@&=MEs{ilwsM8qejxB-|dwBalRiI6hM7$sWWw(O#^jtW^+cARgcUjpV=l9aA`9$)#h^Woa`R*6$>Jny%jp@?lzUtJ_;W7aGtV z{y8OJiGbw)fT72dke#A_uSuD6tbke{P?=zBi``RA_?5L>)kt#d ze(Qfrev5z0sDVLXzF6UAtJm_Q`H7=LB&T%2O69bv+VHgSF1%da^us$Q-x3*lf=$Yn zH?r!4@}`UJ44ffm6}wZlB%{y)g#yaN2k>?XC&+7r%K#qqdKjxPido7_t|e~FzIBBO zC|N&eFpCj8R5Jsn7R5vz`u-b2-kiw|lX_XHIE=4?Vr04&Ru22b2UzS>#yJEkjGtMw)Nxh2Z5yi|!^G2T>~)g)N9$|( z?BLp_s;{RW#NHpNrmDQxZb?%L`a?nqH+)%As)PX%k7NapOOc0hs8Qe7>XUc|Q3#{@ za@JIE)|q-7LUMxiioZ@z4xhU_74QoBbKBRhxtz7cQ{xI%7AgN~KE&G+z1OYF^2KTA zTzy{8n(BZ}-0Bc9E*W@=jLBP99?|lyNlY&lWx^c${7M_bEaOW|XGU#BWJT{~4gf~K z&ri%*h)mB*INqc@~O;rylpj>MaKs|0Fd5 z3C7;z+Gz9B>EoTVPfO42hVkZyCH1d$JM_gA^VI8OOIgtGh{w?8P8Qgr-j%|0zY;Qf34# zErLLtUmQ-1Z9Z+kQ9tBcO4aNK=ZNnj&J`j41Ry3OITvbG7bY$C^jqqM-0=kROvOw} ztHKUl177c|+?+85X=16hd6zZyDTUoN^|*Fpoz1gU+ya(&YcX1pH8%4V4t@Naert?x zvvBTD*47fXxy+aC)?jCCw_C@uI=`cmGH=N_{peV*p-mAqpW6O5)&}D-BP(|DD(wLOc9to>!WkvPe~7#&-Y=Umb^zUG5}@&0drk zngB-2&2QFKXF{#-A7Ui$1>UcH@B08=0Ss*J>*Fx;Kjo`8UoM{Fath#|7bG?#U7|E2 z2~=kWfqIWC@qZ%+*^ihh?{lew1t)M3m>iijnWULi_%rq_on2jm(Dvs9+uk@DI8(Gh z=dz)&xwdJ3T77Qy&4F)q;cIfrTNz0y#<8QtC8Dim*V8>7g*wWJBK8|B~WpS%}^Gi#{W!|RjHyUS^gIZ49L*|9uZ@h{V_(B#9CP5P`(?h#z)>{-4u z{wdj&geS?B2FsbX?PIOYku7FG{P-0bIj zZiTMKjXL@RPWmXB!i)Qo^tn}R*8}bO=xxBHk-$!}u$O0G)c4keaooow&&sfi_ajuy zjmT*2W3GFi$J!K5cOzXmL}rw|z3fgm;pYg0icObMn^aT4Ux2zsBs?n3-b?z{Qu=cm9NZeOd2 z=S?m(_vp$}A3l19QiJJBWVXYIM+yL7p&w8-8Uz)<$-qIinUI^O$T)3dx0fLvazX2E z$jMp-izpyKaZ(~D@bTw~m8=HAbwp-Nj#(J?nwI-E!&-6~z^kBQlq+_upwPKQMY9`- zg&ywG03ycvG#{62bon`Glb6JexJzYM2sUVAO3HGRE5Wz_aCrl9J>G)Usfe%Mk6ub4R5z1HwZ9Vn<93BH<2M>T6$`2T`BO(L#c-u)Ao&Xt=VPsJU05oAI!=TU zkLzXgUEb538ws5~b{7(9XTz&|#ewCM;ErW+h7-;(UhuYsapsTWbixsA^^8qwtWetl zy+I1ltj-ENki?a}O`ywkC>&!T@}>rWDLoNpCP(?aRS@@kU-8AzFTp>zmX-R+c%8fvvwn;AE=Ndo<>@E)6E#x2N6e>}L>TUj;A4`_mh+$u+pmoicz2ew z79uRSK&-!T!myMn)dwYz`MoF?b*D0trjhs2m(Wg~>%DUji|l8NVzD+d`lVn;#uO@T z;iy|S@`5z>Ala`v{$-koe9G=UnAh@;svYy>_K9YRn(Pt5d4<5kVwCk)3jHFW(a^`p zU$abcLIR5M%zO93uGf^ya+v1KjYK$nTWOWQ1P9>Wydv!O>Hhjpp~CtvIRO7gRQ@;- z33C@yXKP2-kIs<%d62TAu{|Wwp6FkH^y<#$CT^xy=B^5Akh6BimM&zFjC`UlrhgLd z@v`$U@p5tSK#u%rSjnFri2dbJ7)D2oD>i zIaW4KGF}cgCLV597G4Ne`BMqv9L?FtAb#a<1m^D$lJyUN`8SU8=i0y3_~*dM{)!Al zxriCNnE$!pe;)rovK5NUO8mL%PYl^0!;+Oy|0pdhpM4>eRC0!7X|#5*Bzyl~)gTAe+#DV4%26CheVW}iH!#m0|PP+4v3`T=3!!Ig9HUKQWi2!7A_`s4sI?k z12RrXEgnutyf|67c?`(7Ss{&Zax<~A@$j;eadL1naj>$ma*?rf@iKA!b?i@lHb~SV zlLZOzUnO41Jh8FzKxh#=3lpRnNT4`5Aa~&5;$|b`Waom^giHb1Kig#?W9Q*v;^O{O zhl7QKiJONLat}zq{!xpAhnI<)g9|cokeQRvg7o;$F#l`5{@nNP^Yy>URW@EorGMsf zG*J0r6Uu__H?1|XeP=v-+vqMD`n7ROoO%B49S8opNF4b$xYu6RZCxv}fh^t(9zg1X zd|7GO)?jS66jGl0z!t|;IA!y){8vQ`_|enw=M1zsiy*+#xS7*ub?!z1ICvogk4B52 zL5)~Op@yw>cn;ND#|I|ch+~~&QX*v?cpa6%{wdxbu3t6y=upi3ngh3G2Jwp5!wlGkH)~Is7o<)W2^5sx8EQ+!p52Wu_6v&a?uZ7<7WsbtGk3 z(g>{6xaVEGrD%PELVP~DsYz;}RY(>;MocE(qW<$)@PFAC|5)OG);452{_h(?(gBiT z^UwPI$FgUX`LAbznK5KfLN*D+di}KtRUxyj{!zoh`cG0$GSEpEdILdH;vz z;$r27Y_I=q8St=h|C{F8%|`H4muwBJIy}sMs6o7 z4+Y&=PnVgAE`k-w7YUFga@rIbb}OEBe2GG%M86Z=9ch z_00R~&QZn)hRd9Ob{NV%Bn|d*Y8&$8JYMxtk-(^56dJ7 zh~055(-q=+UOwln86Idv-bh)acGHoJ_Q{d#%E13@c8<@G@l>3X4t^P`>iuFuj+1OW z3-imJFeB6tX7FWBc@Mt<7JC?ekQ&n&hK1zY^q~F-S;{CfTTXKlYGWh=<$f~LoPuUD z90T740dLte(Hw7i_m9`qSA$pM#Do{=XQPLR{s7@$0apPYp5wF|lm19Ng)FFT-cxi)~EUnlW`O!G}-YNQ}ISXKn z>~8!giscv30Z_2;IP}qk+-pdb?PqJCB(qgkT$ovs-AvraLAF&X!5u!4C4^Jg#p_%YMM)ukcCv zVXUCN)-?_Bnu$lRHODC=1TV40bEf(#y`s;q^Z4&E30^Q>A~-i=nS@cc&TR( z{PZ&XA}xJ(O&a#m;{b0`b3{@u+5h{);IlZ*u~cjPgOp)A?xlq;3h+> zRC*t{D`{ho2Lge~hcvvXx{>{o!|8Xs;yZOagjXdG0#dzUFFQV0?{)&9CRs=FDg||} z+1L6K`;xZNzW~fUK@Jb4$;Ld5zl__8Q%eN!9~p0RG_erURPj%&$<;;E)D<{6Qf(?w zIkx51OQ?UT$<2SFRg27KAyB0J&=*?@Bv3H@uo+u&IS;DgFb3(&TSdXhL1)X@2eFlC zv)eS+;xkYTFPG1OItlXKj|vrKENAtzrDf4P|(%+AKZDknOE*RZS|8n#4 zqV?cf+Otq=_@2QoXKCl>k3v;pqm|9R(ULYF)i6Y*qg6^E-W7#Xr?Sdn1JaE4di5-> za>9H$fZ;_L^PrpM=GId|PlU4R(4UH7G@R!M_#Uks;ReMUe!EFm$B5~^Lx$f>z>htL zXtfwf&n)~MdB*}Lk4c~PYu%5#mb&DBkd9^2fPCvXAE@4_|k z&lKGs{ON41j7PY1bTc306iBpSsPyfF8Z=QY_`dYkV8b@Vb{Jcv4AZ)LQG~K_ya@~Y z`awrLMVnfA5}Oi0(;-{PDWt<5k-VfPDQByAG z4#uImp|2N{47!E&>R-g)(}zP5hssYhMy6xyWm_R5WPj0v!eQX7B_6qeKo`xSrpny~ z)#nF6_&)OyQH0-gzBTTQYgZl!+TJi!8u{QiejlVZXTy#81KAWV?G%YrM%euLo8B$ z-WfEW%3umH$a4%Mp^v<| zo3Zqff7q9qlOs)sP0By%<*a}yq~NKaRnV~IA|n8Du(UL4KB)u6YzcDjO@FDDGfVcw z9`3TRZt1~K8T+UPRK0n^0(}NziaXI=Rm;XqpMSJ#B#FhhX&q3{fn)nLT2eo_!Q8SC zyp9E|Da;2S9$T5dkevZFwH&Grt-`Gd?a)Cs0*F?k7*=l?Du?*&_{7RkBT=B0t2g2B zm5iD`txOrNHdpK9PVu2t-~h#z8x*WDeUh3wgh3-XOF#ygGJ8M>)GsN5Y-PYZ9Zwy0 zKH1vvd=Gf#`B|H{ALV7F-+|oLp<%jQ&}gyAIlUWHy#Ar)5Xn|IEsW^4A0TQ z=_RY?ba&wMGw*T1AaAYnB_MjIa(qh*Lfj&LUuouTt&A*ed2B2mTyIk5ek67=FGV`p?gs*+ zR!{&r9QOs)7ZWX(r4hN+3z0{^f1^(x(iirLag;z)Ki`BJl?gs~UC<}fIIGGWjdIMj zXILH7T&THF_&I4wO3H*kJB>IGi5XFmJC=4YU^D&XU}Y^6%RfQ%FYhf^_lH@Mk&6)a ze8u-9LZ){mDV@5H*ua}Z5iVhNMI|N}8!Pp$GE9wBR%FT;4TXlw$jD7CNJ%jm*xdyp zAQa_(9-k~w9@sYG^kbpvIiW#t0WeYIW%uY7lPF9fnpwHm=AZvYad0tx7HJ!Md5i+6rXmS}hx2S}iuUuV(z=h~Y^! z7odNY$`MSJNOgt5uP2V`N6*(GS<%S~bu6|irwljZKyG-)-|PJONE^`4oE zih5V65U*OMqhF6Y#3rkOjQ$ggA!C*xrl5Rr)OZuWGo_hLr(`)m&N;d=`L>bfkg~Z+ zkad!57n=_y4LKsbimGvhL)5uwqY&(s#`>J~)1$vD=S!Es#DsRT+^?Cgkf=t%HO*og zr!@c*%OZCbnrgd#d#R^sW1vakmVw*moATKu+P&Xx4q!S;WRz>(-I-ITQNUcjV zt@GOSF^>N1l$PXB`6!hQUw}%BC+}(`8HR9`K6_4`k`p0i?c%ZFDPf%QgCTYb3Xem^ zK!th=cmm|sno#9I8?%rEj8j0LM-V#G)yf<%&1a#v*DNmtD@B`H(}J+RljF&18>cqa zvsBNN@>7)$k{Q6)I$BR_V~5+DI$2=gK8Qq%&0l{_jMxu_3nrEM@|-9yoQgj;=8Q_HM%mwBU=MmKjfJv^GiV8z3E*j=A{WKnzb17Lt2E9Y%5rTMI%_X+$JEZ3HI|UAn!R+w5^=QSY;cfT%%(Sab!08*7WHUd zW{uH+&`>lho3uB?LoOt+;CI;VF@Wh(4O9E9f5+^w@SE9-{uOqVvJJMFKt7ptUo%isZ~g?OE=@qLN*2dcwXFD7=Mc=NbU#a1C$EC0#^33`>^~x;jyO$@gVIWP z^3tYq?+RY)ty# zMz&*NjAZgA2wNpdy0%TKgFGfUSL|kz8;r_`pfp z+jx8@^kT%(E0c4~ipxe^A?X*mC81WY=cB2H&iUPAdegL0?)+A0d+xTdBDee}jCT#m za<$nZH!R~^2}zUP&v zPkL3-S=Oh%KxbwUx;UIB7ppzO!@>+NP3R0m>vIeqKz%MXdztP<{e;Mu8xiRzJ-xp} zuH*B#(7-?~U*1ZlD3#g^?cgjNDo%auPAWm%Gl_=2yPQotCrIdOZ?vR@oE&4Zno2KT zr)B~2pE0pbnns0&4E0Ii+;@FCy|Kzw}_?4Ty~DVxzcX>7HI9mt_!ajbT9e3YECw5TKXGJ42va}BN> zi}1+R88pHJF=nw+&KW{J0zef3ADx%Ob-BbI*tpFh; zzCEB@zdchLeF+yMU4zBEwDCbv|0w&xK|uMQ@WqLzG{M8te1lF@YqhqUr-`wu#Zv`S zSA+3c=dVx|>Diy70n?0I@m$M&l`qoNm={t!vcP?q`!M)gTz`{qgKDzHP$|@7(j^9n z_B9_6bIVP8m}t*tzsTY)FZ}M}43<7;^=ajBnMl=l^blv&{m-80wwaPx$N%G3N{0&oaq05eUiHa-gsCA#W|J9D{*Yw#A^fa4z zr8rgKl7g*c>;1GMK5wlO<8=Jk*l5DE?c`)7hBewKwq+uPc9JLtik2Xq9{4bf7{Rl3fl!-qf&~coM;Ope=mZ)_zd68YA--UpS zNAahG5^ILV=N*zS>o|g+BBA{#NU$ynNpBRl^v3H5Tcqj;hppe}jA>_eX-DK|V}wg3};u@57JxUf7YaWPQ72XQV? zLL%J>o@kd$+1()>Z5SWPHzc})Jc*s)FL8%#BZVmqCA)(?@%f$5FEPQALr4#+`?FWP zLrsyE=t`8RWcgwOQJzo@qz!04e2Fgc=G47Lpga>>i+Z30qgMO#oA8?ug1LrjBK7JI zb1=A#ZwWED$!ewbBieC}4MLWq+X*h=hBP7>Bk3CsC$(P?hjt_Vht4rFjKdTnj;sEgrd<9N_!!wznw_TNrP zR*Nu5=Z5eQHXt`(H9$AuHNZEZ&jwjZHVZi!|L-&#sr5VEuibc#&h+zvVgW;gwT7IAHqraY{Bexr12Cl}0wi|P zBF`~4$$KS<#C<~^=uIFC2uwee5m^$+j9#$)By>#x(+^oghLj+dUkG5+x`sCw7~uLP zZPbSu+v+#Ifu5w7`Agaeo=djXP~9PrH;-_*UVvZ}yAwCN6Lc_h+is2zGYDCZu4eAydffR)Uez z4TtN?&1gCP&^i8im*^(Ay;d{>F?d5u-st@3XeQs$$j+pZ$$p2nPum9iWo#UCf?(G| z+JD%7hFja^1if23%krTH=1wRk>^KqJ_P|BkMgH(fl_nXpKs4=_^QV z@Zh&AZ?DKk-jUshAO}7p>XBo$1wL4jdVAMsO_x7E9^`UHE<|cX z8cOgMBfqfV{}fB5kV8*#9D$X9rpPtsp1#gqGVi^1%BSoSK@GeR_|mH%Xx0CDdLV!D z|GwX-$f}pU{`&?QjFrGM;C>e&su=i;=uEWp5q--@#2@w%VMjWVRHQfJvp?Jwkx5mzK1&I@%%C(%+QAC~vc6;>qL4o2j|AQ@WF3DgRL zGkc5>cdU>h z=!7#6XC=Xdf$Hi8OF?WbT}rNsK^ti%fjJP~AS(e6Pb(I@g+UYyj;5;R5A;vONM!DB z_!!uY>I}cbOjZ~4jK8Cis3l?uD}4^TGV)`hZ<}~e{_~)(lUu=4agfk`_>tS$?YrZ( zN;k>lqs7ZgH`YL;MU-kEkGzwCqn0xy*u_q2TgpY}vFj?Wt|jDZ_bN@b+sY$D57YCc z4N~vN$c=9sVLkLdb%%n`h>v+aUEXLnS0_fF2E37?D}Q;{9qm#S=2G^kkIyd}YFI6d z9XWVRi?r#@<^7n%ewk4~^H5`I%9%QFINj^FvGg#J!)}^7=91Dn>}2mUSbz3f$UCbI zQoO&Jnwmn%`@whbCdcjSaJb_x67Awf$Dy&WS?3tg9-Q2hTW}z9=i<*?cd|AZhc4Iq zQ%c|88 z%6S_0sfj4g;a;Sq>kI35LE8`IKAoo7J_HBH#BOI5@7&IGrCYiz3ReY7vK5`wJLn&M z*?mQ21fJc#-hU;H$@r|h-3e~5Z69MV4<5k9Op!ZN`FAanYN~iML$j`Ta zCRS0c$=q5nF!nRn&*)W}Ha{}>rF9!|i&?x`yWgzW{G*w_`Puap>XcizPqR^6-Xru3 z$&Wg9OjG62MdspK zK6Ml72++)9voykGJNk&&dTO!`r*;w4Mu^-~qsLS8`hQ z3Hb*T;lZyA-gw@UCHWgLJu|Raft}LoO>4fhJ0SaK={olK9bu>0*U606*Ip3P-Yc#b zg3RH6Y6I4P`LO8!mpl^tn>-SSupkp>Yeun;c4iO+@ZabWHzx!q{1YAhDgB)r@i6f~ z_{+a@BQADUCLVT9UIEhtxf%vh%N)UboQE6Pf1`v7z=@UDoyR3h8@oxy}UkTFx zWAZ%qKW^z?2vX9t%^(Z%w{w3);x2L76s}Q3@)<5@=Vj9L+qbHEhsZIeME8kp1(a^Y z6CVcA4x37qW-BTPN(3d&9a0&+4_Z`EKV9xo4Zzf`M)JHZE9(RFI3H9;2Dj(YB#4{- zQo(`|xxpw-@nEk;wdvkUiQLE)`!tEIxvxgp-lOvr_l^LKP$j*v9!hzt~S9Rh?s` zXZxY;b-4SGoqIITa@dD!7#A*GLGUDvdq23TS+UWTRgKWsZY|zjh4CH^8ZrCsKOYbO zg1-Lwboe9T{{D5~|G-H9<7WAP)kuG3$@+JV^jDIre`+MQKTGDnX(Y&MWc%Y2|CcWe zLr5O)zj34mUpPDUY6` z%e|P*KL7r5k9JcKc=@Za#}Px_N=ZJYP#<9FxPig@|EHQIwGl>V;nfEC~I1zxp6W?x|@BHae>$xNhE*gTol2+c{-&Yd^h z(TTTScpHH%)v8hIBe6TCrZNd5tLGval(fId1I1ynq^>d83==%Wl;-q2<9J6halO7= zvT;OTAb34$k7~D^G_!z*mWZ48K3*>gbg%)gjTit1o9@wl{ zuP_&W4%L~#ofeL%i_oDheJXvt(2z}iRI}oaz>54X&l{g|ksCU-y;jxo{a6x1dsNEF z!Nck8VuUco0>(Hz{onw>&mD3EZ+ISz#c6TcSUDAxN^u1%y6o`Ieu|h`blnK9;K{@p zU6dM>&)B;BD#E&f>BSmW@0yt;RqAna3mUY(ZQ%I;9t6Mm8%43ZMv^h-T*T1^FAj7# zlF`VCnO{t{d?w*6CgA`~iuG8bGfKqFV7ekqyd^@jFAE+1)j=O`3}+(dcM!G}#E35xkc=nFW=yfYJ-f@`=i7!UC~E?< z$$vJH+8iJ^6_sIr(?(o->oz21yY;?~<+qJ7=kb;cx_9zY&*tqn*^Ay^-S?Ic>}S9; zrIX1e_;V%dCH;r=#--!Nt8>o+-dD!W8kR3l#$N}=$}jI_7gCO#Z6dornTtQ(Sk{m zALeW3;)z&B(D}KPRw4bY#-?7UjsB^qR*CJFfKg2ClVZ<(_uTD8@7tF*&p&~#?42;{ zi2hFeJ0$x{zm-4tp{$3U!4{C)bBj-|2UFB26&V!{9yqza5hP!Bep4;QIB?P^QvVZu z`2$k5<5DQT+EWc_+ai}Xzs?U5r!vAq|NT(P#VB_wK@U+SK14w@v(y?~ZLqiYyM=vC z33+a$V__}+S-MTF@e`+E=$+h)P+ShWAE0TVQxS$zSXd9v*A7_n-1G^( zN|^OK@aMrrLyTsv@p^L;l9(YFOCtJ2UMtKes-&JuDxH8}$rK*0LPRVPu>}$eiZ8?{ z`u()Zq#2-Gosh6ZB&j6E;Daa_7cXA=NZYM5sZ@A|-*6YIEIlqPDICIfC@J43GA$bV zi~1M#FHUcS7a}=k#DZz@Lo9Fn7o48>mO}rKjfm-{gVY=1kqNq=hFh}r*Thz+*?eiUchy;f>$9~}@psntYI=IvIRu19$2PW=RdkftyJ};=jC3qqY(+#%OY?FVRki0) zl8CQXGqwwKWnxSzV&7s_ENc2{rwNg6zEZsn5EsXxeR?V?4iJ+xnn2QU+rN+UdJ1*e zxb~4M+z&?bma>{2@l>+ANH1!v27RpAB;?oGzK`F^I$bZkUwrWCZeR~~z;31@!)jK( zc-(^jSYxUZ#~uFE-O|wM7IQa$x6to7Xrs~6=iN(34?wA!CtD~qvHo3ToU0iR^QCMd z9d+;}INjGiR;lKcG*-d(ytc;a(N|E6xDw}E^k}82voXWD37e&BiwDp3L%yvPvX!Bc z4Eq7;Nx?et_S4ToLEqDSL9L&h?Z z>(|WCDfb1B2hZ954N~bg54aS`3{GpHnJJFojxWf@enO;K;|r7+9B7CQ#HZ`cCz99t zPFM&L-X{8_*1S`?)hct1AuX|_8~gW3Y8pRiepl=5M4o2uPmVz!BMDbrygS{%BR$CB zu8(wleHQ$kO<>bjd!}6qD^Y5sZ+q&fi1+LM{tE>TfW6scc;I(Y=2s(0evz<@+>oz% z>jUIqV^(=LWQW$TB_=;t3D}rFp62%w@QJde_w_uzA0y=#)Zc>qK9q*}95F#@Q5Bwo z`FZ`jU_05~p$kfI0Mmtgmv4g%T4vqwreI%0E_EMyx<5hh6pe3*BUbfk@J2PePKSWT z&(l49Uo>7l<)1YnXaO4d9C%x<2$IfHRb$=j%VFBw4>%2QD*JKoV1!yagE%gCW{zMp z>V~C_Hrc5&cxbF`K&-|L@6=Pbxp7vE+$KDGt)_6?&6VP!2UEK1oi=5FpO2Dm&;IQ+DW zF`RQVjB3UGu8RCvn1$VLbMd7!F(yy5NS`@%I0glmgS*k+j>%!M^sO4-o^z~=A7yr61dTpNq%`)E@V>zRv%qQ#BGj zqPOaaoge?gT8|RqBm-Lgz8}E@gSrr>pV>*F6n+yQ8|UWsq}Vxi^U%Lw@y^11IF&r| zWo{mLprteew{Y7){O-k!iI5Oo_mlHtyLhOxGSE{^hBmFLtIWF6?M(r%eBT0nE6u#8waPY+LP?C`lM zXR*By-e^%gj%ulY0`7T+V`d-5R(?i=rkyXYj1IRZ3yoX_Gm}|l7n2Y}2dAKNvC?GB z4iDWwQqwYpkyat?{$^$rsf>OI^1maxmz7J&=dU8 z#mB%AF(6|sRm5HSV_xj)=_!gdT2)gt%^h<&3kMp%j4R9}negH$A zEPrPwviK-{=`Rf`)A>mBCQV{GSI%f{3SI(F*TWt%kGIy={M11}W>0`bf8r zqtX($BMdPC-PxRI0sNWEQ$t+9RGFB0HiGK{vlr=Y!==J6B57+=!TUwBZ?Pv!^WBur30EUD~^bA z09vrH=0&{+7=T>aX1_@A1HNZknVQf6YCz2_vl9{kKpcpJMP*uo7|;TmXHl7yzy_p& zBr-pLD9(+d1*NjGW<{w2dSnHjS679L<0($g8{(bQ$xd`Tw^dLP{<7Y4!B_n76fjXgFk|v)1o{w zACLe67GQgzBKsu`aKi+g0O}qcA_P4LMQyTQ@&gSm!JI%tb1*j0e|%^h^c)_g2I?Lf ziUH-CftNtf(NRWhmr#Id_DdoF*YKR>qFgc`@=@}hm3KAF{ zQUOY3@(c_CKtvW`bO2mdBs=SbL~PVMkigUsh`o-&D^J)Sf7&iBpSJ2$g_ti5LSz4qEL$@8pW?rrOZc8&Asn1IyksF=Fc>bMx`)avk< z$<*rjm>`X*&n*mP5$S>2-dXE+Wr4D46tQ3&VW)_4`I$BtF=D#JmYdSPTx zH5iZ8J9kmzht&e8RLo5boENK)dO?$~NXUyFfa&v|LLq~>L74hONeV0%$`uuZF~?9X z5bK9#V3_tEinB>W7)vYk%DAY5JK*vudk=8Hz1A=K|)NXkmRZi z4=Qohc=sw2UO+U6i66G}#*X$i(P^`AYJ`@fOi!7xRyt=$EHx%rCEx<{JPYfUF(6v8<%p8cP14qtQdv_&-Gat{ z$-3pRMvRJrGUs`TxE6zA+g;wFBcZLl%sGdW*mho7l%qWM)`EES=*eBF&x#n9d>0Cx z+U$WKOt8kcIQFA?smQxp-WxnfD7hWw>F7oSJAXKVxR}(n&%=hpc|~P zMlj(ci{0S0P|gJ33Nei+L^7)<{rwizC4~U4U9kAz62Vwn_*zp|&)Rh@;LX~1x!BH0LjTzB1Rdhr!`_sw>La@2j-XI5j z=6lGknqP}m$MmKnOx6`xs$O=atMdm?@_{T|%(CwK%b{D2LRh3%e}k9ZJ7`Z{T$WnY zcCOWsrXxY-w%3`mt`zFu>vi!t(U*$qh(JZNshd*)PE+Nig$UP99H(51pQ~5!>Ge4k zQ>UEU+WZ>}&s`MW-|wPTK-};0$yu+qCDbvPx=nan4SMrcn4aGh-sl6Fi07Xd+E{Wr zF{nkA1qKKvcCpPrC$IV~W1)y^2C-O7C9TfqCyb(@`wo3m)z1V3cwD&xL^Yu4ELqAQ z*%S4muROm2&Ajql1*!^FfFfME3{kmDFRi%;VL@IZ!pyCT&={7L0*q>>GBh+n)O8i# zqlMfPy?OtWIU6H{A3_QNR=8}VDuu`wlq}@e65o1NAZt*er>1s8O-oHB0OhDnT)G6k zj}d{;&=2+tnPdHO48_QU&zW~& zb7Vsycqfz-a_If<=x?AMoQndp)zf0vXDiH&R-h1qdUEfVp_h2Rq`S9xKN6o4%u%3c zaf4qrv>eomj~+1W7EfRSOD?$24J;gf5ih=k#P=oM<*3MhSZn2+>=%rGmYib+`cdx_ zvx40EqffXZPDXxI=r99q9YV19gJxHN4erAvmkpL7KZ&u!u0VVE`d~dyeTiv^tQY93 zjaLgpaNOx8uH2ZsQ5c6C35GR-k5u{=*EO@+hsPoF z1^R*-l*&{xXHNc<}?Mk3gk*Kg;#xb7gutd zfNsZs_;#Onk$B&GK>FKI^j&tekmb<4_octkVw`N9`&)Z^uUm%$Kcw>}Uzoj^Ja&sO zs`}%|aCBt3G`(tj_N;9rTCHG$YMN%cK1AQk+AGNG)5TFgPtCLg_<>)(K&|WLM4?To z?N-|Rb9?8#i}%%bg1shj$cmA&k-F!jB{8pKU(bBxi#60Vdv9%UFUiK^-td|MlWBwj zr*%8UYY)gU_*P}f0K>YWijh*(@tbHNt1^LFJnrgh-@9J@7ZLsVt>OKr-w9vfwjSjD zXbtMGX>I67eh+x@F3w)Xek+@P3%dQd7kx1pSC`lS!=k@;;n<=5;@H7#Z)o*)p_`!V zQU77srlv=Z?nahPj=1lC7;gh7|BV!mmOFa0GrP4k+OSrqg?8rv@p}7*p^pVt) z$DFLzQgV4+f<=SQvZjv%A36G&DUl*k9fhrUBZ8k=2I$p~q z+jk$m*`jYV_crRj8Enmu5uUBPZcvkMz1_P#CcB-rJa&chDo2|F+qW`ugQJJbC6;wk zG^V12azKolDmdriXo6n!?S$-M=Nye0=Lk4S&`z8WZdx6KrL*zZv>o~N%Wu~&cCs2T z&qqZ#LTq%9Z5ELPH5TYhv^rQCGzp#rnSsqf>ELt_BbX7i0p0*PgPlReV1BS7nil;P zZHvaD)j{f@IB*<@6if;_0EeT&jWP=IITRw-MF_u;rjV!Lrx34#y>RV71-N-=AqAcs z+%H#B2pn)V@GEdkK|N@014n-mE5RMaQ7|o{uVZ$i|VQ>pTpFxRWESgFImP4dN zl!C_#TEg82)u5Ra=$?{y;Mm~YM3X54x}YdPRTFdv#K2h;(EqiNV)F@1$Tlls!{GB!dR)zR0%Jm8N6 z=Onx8jil%ma344re1e?Ao3lq}<7DA85z65DGVD?}>Z7gEJm6bkPBbT)2NVU40uh4m zH;S+kNP>KscIoDH8-p7;(NSOuFbkdxsG8NCb*>%F3f{(_!mVa>zdi?SFlYcs1RsN4 z@y{vUN$2buHPMV<)1;EEi&k#${CX`_9+{p_Lq@Z_vXbPPNP=@=!^|^8OLHyh;M7lz$?Y!UD-+cE z;;Wn8zKgx>lz2$%VW6X4*i2rMT8&Z^v{+#H3zGl6z@*^HSGZ--)0eac5DDQ@&5Q7< z)yjz}?uh24N|R}o({YLX+BX;M!$B5;CTB;Q_4oESV`(l7lfn`^Y&g}f0K10OqF2K> zn{GO}O8QM#xYK}>UG}t#CYLprX{lGqyHcVT7jLz>7#yjL-DaAUfYVRl$1^u@UGXoL zaxCYbTyes`ILT3&`*x)$G&^#m>I%}G?okI!xU^L zX%#uDwX~dX>Qzp>{M1DGfbx@xpc>O#PFSMSCpFsV9aBB=lfm8=&MSf+$1Uq^>@wBa zzd}gf-%K8@EO$AZY06W>9qn_nn6}JGF19(p8vZH&T|S|O#kU~;m4;cS6qh5rYOiIy zL`Z)LS!DS8y6oxlQ=UnF+3#E$W={2qUo;g$o+3)q<9} znDjw)na&;cD;n@?G|S)beBH+>i=0&@W3O>N`;jdpa`skMcKWeCtN%{#@h5zKmhqrF zzFnNfsOm|Uv$KmU+B)T;tEqd7-;M?40!;=b+V+|I5<(8nR>zD2ua^i!+fj7&EYKt3 z-iiMip18MtGL=Aibloaj&Kcjt#LrcPcW(9a78O!HP&#?|_Mw&>MP;~%A7^T15^8zt z9wIPV37hnUVE2BFA>^u;(%n67$ppbzFKHv5p)3&|2HF?o9^qY1KJ-cUmwcn2v3e&@ zWmpc;>9PC?8i}Slbn#3@9j(Ff)x3WVqOSxvm_~c!|oF0DA*?2UORE1?MIKOJj7VNNk%SeHXxupfoU zFiU8(N1IJcg+%Ss^(xwp-5dX;2U|y{Kh~xg9Pcy+UE?^aN&S#${4S64Ew8kRV6uly z%e9EX>@Bt4J%&}PZj||Gt+m~2J+~o;M_P&Gd2eR&CG4t<_8&YuQoSQP^r4(`vl@Qr z(DKDd?sl)Er^n`e8QmBW8i(l2TUObC`4$Y$Bf3N_;_8vmD-cWJ*1BQhEVO6pjO|E< zXJ~}gESFKIA2FUwb>J4`n-Dfm<;17UXLbaa3VMh zI}IJCq4Ml)713=KL~R;?p=RZ(^)m8s30G>FUQFpmvdlm$Iw4m2_V`&&iyB8}390VE z)y1GLpZUOfDgv-+*=;t;!^wLiabx^3RV#!zE9V;Jn$DVEu0imA1aGWzxY=^F-zRz3 zKEInnlS<6Iozw2pg57SeHz!;csgQKBOw60X8FhXyE!>eQG%i&$|GdEM0?ER_s-|u@ zJ}7ISEljt%L0+}xwwU$Y8ABCAHTBGVa*kw|>BO1?b&D}l-zIO^CXe*9(sfLX5HEEp zHz)U7#_1Lt*M$(*aFsZ-DN6^>M0s3=wxO#fQoM>dtENGJYy<%hOfb7RJfVvtuFc`{n(c_vJ&e zU0by8Bzhgp^m3%X+nW9W#Xyd%?N7k3C=huMp5%Rg`|Zjac{Ntg{ADA-GXxIlMk&)g zoHMsRdOXZ*pMz3YZ(na;Oo$LUqFkBPb%%}BJvy%X(T18(^5(~IA$B%q`Bj?no2SIG zHNFnzPv+V9Zt^ij7sk(UnA7MwyT?6~Q8u`0U?TvZ_&moKP(1+A+^LA4^J4eS4DC|w zq_}$R*+6rdgA3VVy`#!XEDM#?Dr$In27;g8Z&}ZdZ0? z`K#(GDaae^y?tfo)5PnuUue_%P3@kmNm>>>FaCsRz(x#`Q0+@43s?=LJ`qm!-crcw zN#9gGQV{3U);i#!)$9^ZlR`>-tar9G`+mG;;{UR}L|m$yyQ7BchwB3^1E=|+^7?aV zCjUIsS`)t&;TsK=gC~+4cPyix8E;V%A6&kTOQ3XMk`AVucm$_b)1At@zT9NHrr#tf zPeHHsu#FnydEN54KS@pJ1{Ky2=1*N`7&^e0uXi#htnZNYhvoi}#bU68_FWCJbjNj# z@Nenrg&^`?%(Um62RqrcNozJ!WUKH#Hkx_qpFx;DgF0=SrR z_4*mrTj>n>gr1eneZX>NaQp$A2zg9GhCj8mh)+j57Z$ep`O($Q*i~)F;*w3w_wdaE zsGE~1gjd5uBOy8iMzYqCVfp-i7E#ZdAn{;ks!>9^C?Us3GWh*y-9(!e`2M*X{*Xlr zLkwm8(opEVQ@;r1zzFvKq`7|054jD&-T{WEX;IhQ-hR~*OdXg_Db`g0CDaua2=lIf zEa!Khok?rr)9$PIOsmhtK(0jA(;ZtoREwV^sHpkM8-I|yW-7RD;qsPDX zM;m_Wtk&%6be6eT_LRdr;`y!N^U#d|Mc@mJ8xfth5$-~X=?zzST8=B0BO@#PjQUgq zrc6a-7X+US5ja=gPJVD5xmV}>#KO>?3{xOXIGU*1c$D8tlIFzQdx2;eb4#h^udMW0 znWNEHF_>BX&`WQNn|}8}4_=(#>Gip5n?>_V?0o%R>lG;~4G*HZ$Zy=w#%~R}M&q^_ zmIn)!XCuVBCF!liIC3}hz(QLI>$0n`-Ng(Cbc@Rgvc*Ht*C~WM^s`Q?cPvOZecyk18 z1V4$N=(whxa7~cdcX;QKNTM-+VhT(@+HH>1isd!&^!0^~7vZ05s%TY}RuZG-xG}>x zgCHLELB?VK=FnvH8uISj#YZlk~;Z?km=fo zJMGz-E`QT>=ifN(Z8r&z2)pt1{6o&cJ(*Xog|hH5x{;1yc-G?A_2xBxPJR}11Jla= ztWb!=H(S|8H*YZ%zCtjk8siF&nE7sqRASuuT`Mh>^^UPu(J@mI z1x39yBRqJ$OJcreWaL~h*~D8c91pdYLQvm~FJkt@(3Z=kUeo0(lBGOj#qKGCwEP1`hC-XL7D&3z{ zU+Ih|UZ&ZRU~QgGcqsFDzI2AhGfa0zdL?#k&9tFyljCw{D8HZawD@F27nv5joTq=a z7+RdQS?-T7P&4B!viSV$JoedJ;b>yMmLK?mXT$@y+1+sI``0zAu|1IfmEBVhrbiKUiDV?^vr|;PVrP z!K3ZP>tti9w0!4`@RCQvZq6re-?PdhzmC@?{PJr?4I3rdy6@W-E87vPb?xqrY1n&* zM%!|uYr)2{L(eSSJ8}7wx6+dxcfb03e)4;jg$Wx^uFM||C~ICbwU~7`l_#8~UfcFQ3TN*E$biwYmST zF$qcGB6C|8E!r!qK*b!;oCw)dqc(rOrFNJbw|k=OyU+2E9O09YLDjs{H&w^ zBV`{)DHjnCxA)!8A0~vn%nf%(JhS>qm$Ap^edEkq>2p{6hvuyTk#Y{!+GW*H(WsGwB*J_HTZP8UxZ4ZDXaOXOuu2R%ed~qjx zwD)0)1Fxlt(1lW)hEQD#eG}>Z(+C0)do3aItB=yrA0Nq1HX^a~YY@<0_o9d7fg#P+ zERIsjEDnov7)0OrJ6{qD6AvUhM`72!;pn0 zD)XsukjD)<2pyL%SqRvy1#P>x%&nSfbJfLG-_OGEzO`XjwdW`1>6Vpd$ie}GHE{r1 zInd%nF=@y1WM=|wSc|(UhJ26G?vKA?Xbg8QS2r9@K)ZcQ{aV?*zL|hn{C?98RWUh5 z;Me6H-ztkhMwT2epJC`X7-Uy`qCYN$G4F3NRLAJ?`&qs+EO}B1dB{KL;SBFC^ENfc z3l&X?a*bVGqvvA%L!@R`AgF!NDPf)G6*<8*{fAL?)L9z~!jGfxM&Kny^A$rsr4Dpx zX#a6hv+^+VpyUTD-t~=3q3TDBdr_sA>2n@gxs3`zT$NAFF9ge;(&P6lK5L2f%CKu* zQ(^kDfF>ZMkz{M9m(f~rPe{q*jv-K|@_fw&TR~BgKUdN#%`YP<7FY`IxY=#XZju=> zC1?`eBcScUx9_zW&GPy&Asf6$pV>dkY_haAL;)GU*bs@C6QnB7#ReOuh02eM_Jh_w3gr~$_C1D}1rNXVH&vsL? z?bYFYNvH@&9d`BJ=H#TE(OpfQKK|Q$*j{DBDLJ3WfUAa6(Uy-KntNz_TzV$cDa6!y zWXR6V1BrMyQ&1ko_dd+A=kB^wex%>~0-zZ06sXKw2*bE6c%(ayxGv0n+1_wac!^z| zH`3A}YxJc}!)4G){L#)a9M$I7Cb#(X*-MIx88+=7Y4>(?M;Stvc;t3BARlj}?KbXA zdH?u$*7zg<7Sh}M3MuO3d5@3SFXwtuie-jw;tGjMf$}70)8XSDW+*v!%@Eml;E|+} zYCcBS8=Y@9$idv-t4g`yl-zt;DJ=+P@eI4My*<_)ngQ`#YIbCbH z(wlA$t-`m??|M%drzS*?Bh9N{vOFJT^Gc|;_~6SEw2v3m%~o^L(|cN_B<|zfA*fGR zzczkc+Y}v;KBJU%=3?vEUblpNu6F6F+aL?+&wI*;O)%NE3D<(EyI9I54ffY%j*cxJ zkFNgsQdsohwH_9;&SWz!@y!0pxxRbE_Zuy^qX_S(zB)kAxlvBQ{)UL*As$Z1Dc-ar zOFthF8m))|5{dq}Mlo5!(tnGc{v4hsW{)5k*0bl#ryua7VClH9No}oGw>WJ2RFh#6 zJrtq5!g6DZU81Jcr%HFkKhB*!(QH*SPj>35{)ZYv*S*GG1hoB)+r|t1u4|TvC+c=} z2b=aTp2hlgFQ!Zl6*m*f=o{_Iw7Ji^beCAe$211SpM(V#_`6fls*Q2K9^@FDV$A{0*i+-ac*zv8h>%`(iJ2sAXd9&X!%7 z58akrtOvUcedjy=g{bisTpoLC!jc{0{gR2$t-Lqm#!2M-o$I2ihT4yziq&IJNQaHL zAf3s{`R40W8HXw#Cstj>9`hJOXjP~Sp4d@x5jM2Y4YB0jPLHUye7X{2f)m=z@n}Ag zyTq=ES3F(g@u^b;a#d~LY&c=IK}gpuk$U=-N=eJ({t*5$EUieC`_dkO?{TVY4iPZR}n>&*?2m+Jz?tdeK#NcDS((U;DAjv=IMP_a69r ze$L|;fH5FbNv1Pm&|-{z%2d)_!KiRC43(j9Gtd#o=Nk1VXv$2M%r6K`TrI;!J31?Q$wYSN~^S%-H2_TpJI}pCR8@oc*2t4 zAm~~=XrItgZ5cC?VH3e7@GQ7!n4im|)P#SsWSHNtrY-M>6|pt-AOGY+;Qu%j{3lHH zA8+%&u&RFvs}+C4#{LJy7=Ry1A|=H{frG>UBdGpw5o1U|ru+*k`VAOEAccNft0n&= zj{eolfBC6@ktKS6Ax-{riuqsBm*2<9_G==3^HcwQxPP)T|367F0IvE)h5>$Rz(@U) z_Y#L8ga8ms6!1^O;Q-tPOpcfYT>K|ACk_`C5&;M;Nj5kF_~RD=6tG|u1voBIfEWA8 z@cqmr0$_LlR)w>P19$4D${GfEuYWcJ1CTBez*YS#n+V%~>K2of5E2Ed24JsWI2u5d ziHL|IfpX$MMcQzL(7!N0F~C(0=&66z@SjwmCg8>*5RwR>yaZ4{6ae2~5(pqFCLtmO zaBM#%*#A|@FNRGL35*UH8KBBWvLS&XNC2{KNx;$lmyAF!5pbYiV!+}6=IIx(_Ft9! z8iA-7;LQe(HG{DMT@`}CfGChIDhdoAkY$VgwMiJDIS1wvCL|6_z|ZlEiHZurelm2x zEWm+U06RC(#?M)Tivwf%>Foxte{y<&xf{44fO-Aj_U*rbZ}7k9;r~yVlc@M_kdsA1 zmut8PrSiAHh~za699#kp_I!*ORh-=I2?{n})n~D9$xL>?AwGyD#p10#TDdR$$ja~~ z>PYlpwtH+u?A>dlfiGe+8tR)jM=kwiY|7nM;-}s*Gi;q!R$CUNMxwl5B(FR=-8uG3 z>uL76g|u94Isi5(1bM#QHDBc>F7L`g&lgr{p(#6`kCQ4^e$;Qe z^jNjE=fy-kMh;cH$XAmPOjWVy?7|J86_B4S-c{`kS&_Lpj&=UXusEPCE=#mf=B+NGa@Es?2CuevHFy?Erd_qxkQAK(&bQo>}mo5TX$Cuq`4kY=Nna3!ARDB=IYU%T^)<;e8?jJ&(WhoOIN zk3aAHzbUo9?j3(_1^>Y2{=RAaH;Fmm$pxhPzY%l4*2-V@F<%c`I}*SiFGeEr=Z8%k zfe=No*|GhZ_S5?P^TX!)?=%=pLKLX{w=@wE*gx{YVdA2IvHZ7uq9RDZWB+>^@Jzsg zS@|s=P#@x-ZNLGi{_pu{\"adm\":{\"path\":\"ADM.Form.SignerName\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"PhoneNumber","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"167","yPosition":"261","width":"0","height":"0","anchorString":"/PhoneNumber/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"Company","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"182","yPosition":"315","width":"0","height":"0","anchorString":"/Company/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Company\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"JobTitle","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"137","yPosition":"342","width":"0","height":"0","anchorString":"/Title/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}","tabType":"text"}],"checkboxTabs":[{"name":"Yes","tabLabel":"Yes","selected":"false","selectedOriginal":"false","requireInitialOnSharedChange":"false","bold":"false","italic":"false","underline":"false","required":"true","locked":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"237","yPosition":"288","width":"0","height":"0","anchorString":"/SMS/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}","tabType":"checkbox"}]},"signInEachLocation":"false","agentCanEditEmail":"false","agentCanEditName":"false","requireUploadSignature":"false","name":"","email":"","recipientId":"1","recipientIdGuid":"00000000-0000-0000-0000-000000000000","accessCode":"","requireIdLookup":"false","routingOrder":"1","note":"","roleName":"signer","completedCount":"0","deliveryMethod":"email","templateLocked":"false","templateRequired":"false","inheritEmailNotificationConfiguration":"false","recipientType":"signer"}],"agents":[],"editors":[],"intermediaries":[],"carbonCopies":[],"certifiedDeliveries":[],"inPersonSigners":[],"seals":[],"witnesses":[],"notaries":[],"recipientCount":"1"},"envelopeIdStamping":"true","autoNavigation":"true","allowComments":"true","disableResponsiveDocument":"true","anySigner":null,"envelopeLocation":"current_site"}]} diff --git a/examples/WebForms/eg001CreateInstance.ps1 b/examples/WebForms/eg001CreateInstance.ps1 new file mode 100644 index 0000000..b9a9864 --- /dev/null +++ b/examples/WebForms/eg001CreateInstance.ps1 @@ -0,0 +1,81 @@ +$apiUri = "https://apps-d.docusign.com/api/webforms/v1.1" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" + +# Get required variables from .\config\settings.json file +$config = Get-Content $configPath -Raw | ConvertFrom-Json + +$accessToken = Get-Content $tokenPath +$accountId = Get-Content $accountIdPath + +# Create template for the Web Form from the API +powershell.exe -Command .\utils\createWebFormTemplate.ps1 + +$templateId = Get-Content -Path ".\config\WEB_FORM_TEMPLATE_ID" + +$webFormConfig = Get-Content -Raw demo_documents\web-form-config.json +$result = $webFormConfig -replace "template-id", $templateId +$result | Set-Content -Path demo_documents\web-form-config.json + +Write-Host "" +Write-Host "Go to your DocuSign account to create the Web Form. Go to 'Forms' in your developer account, select 'New,' and choose 'Upload web form.' Upload the JSON config file 'web-form-config.json' found under the demo_documents folder of this project. You will need to activate the web form before proceeding. Press 1 to continue after doing so." +$choice = Read-Host + +#ds-snippet-start:WebForms1Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:WebForms1Step2 + +# List web forms in account that match the name of the web form we just created +#ds-snippet-start:WebForms1Step3 +$response = New-TemporaryFile +Invoke-RestMethod ` + -Uri "${apiUri}/accounts/${accountId}/forms?search=Web%20Form%20Example%20Template" ` + -Method 'GET ' ` + -Headers $headers ` + -OutFile $response + +$formId = $(Get-Content $response | ConvertFrom-Json).items[0].id +#ds-snippet-end:WebForms1Step3 + +#ds-snippet-start:WebForms1Step4 +$json = @" +{ + "clientUserId": "1234-5678-abcd-ijkl", + "formValues": { + "PhoneNumber": "555-555-5555", + "Yes": ["Yes"], + "Company": "Tally", + "JobTitle": "Programmer Writer" + }, + "expirationOffset": 3600 +} +"@ +#ds-snippet-end:WebForms1Step4 + +#ds-snippet-start:WebForms1Step5 +Invoke-RestMethod ` + -Uri "${apiUri}/accounts/${accountId}/forms/${formId}/instances" ` + -Method 'POST' ` + -Headers $headers ` + -Body $json ` + -OutFile $response + +$responseContent = $(Get-Content $response | ConvertFrom-Json) +#ds-snippet-end:WebForms1Step5 + +Write-Host "" +Write-Host "Response:" +Write-Host $responseContent + +$formUrl = $responseContent.formUrl +$instanceToken = $responseContent.instanceToken +$integrationKey = $config.INTEGRATION_KEY_AUTH_CODE + +Start-Process -NoNewWindow -FilePath "powershell" -ArgumentList "-File .\utils\startServerForWebFormsExample.ps1 -integrationKey $integrationKey -url $formUrl -instanceToken $instanceToken" + +Write-Output "" +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 253db4e..c0ae1d8 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -101,8 +101,9 @@ function startLauncher { Admin = 5; ID_Evidence = 6; Notary = 7; - Maestro = 8; - Exit = 9; + WebForms = 8; + Maestro = 9; + Exit = 10; } $listApiView = $null; @@ -140,6 +141,7 @@ function startLauncher { Write-Output "$([int][listApi]::Admin)) Admin" Write-Output "$([int][listApi]::ID_Evidence)) ID Evidence" Write-Output "$([int][listApi]::Notary)) Notary (closed beta)" + Write-Output "$([int][listApi]::WebForms)) Web Forms" Write-Output "$([int][listApi]::Maestro)) Maestro (beta)" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" @@ -165,10 +167,13 @@ function startLauncher { } elseif ($listApiView -eq [listApi]::Notary) { startAuth "notary" + } + elseif ($listApiView -eq [listApi]::WebForms) { + startAuth "webForms" } elseif ($listApiView -eq [listApi]::Maestro) { startAuth "maestro" - } + } elseif ($listApiView -eq [listApi]::Exit) { exit 1 } @@ -239,10 +244,12 @@ function startAuth ($apiVersion) { } elseif ($listApiView -eq [listApi]::Notary) { startNotary + } elseif ($listApiView -eq [listApi]::WebForms) { + startWebForms } elseif ($listApiView -eq [listApi]::Maestro) { startMaestro - } + } } function startCFRSignature { @@ -954,6 +961,28 @@ function startNotary { startLauncher } +function startWebForms { + do { + Enum listWebFormsExamples { + createInstance = 1; + Pick_An_API = 2; + } + $listWebFormsExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listWebFormsExamples]::createInstance)) Create_Instance" + Write-Output "$([int][listWebFormsExamples]::Pick_An_API)) Pick_An_API" + [int]$listWebFormsExamplesView = Read-Host "Select the action" + } while (-not [listWebFormsExamples]::IsDefined([listWebFormsExamples], $listWebFormsExamplesView)); + + if ($listWebFormsExamplesView -eq [listWebFormsExamples]::createInstance) { + powershell.exe -Command .\examples\WebForms\eg001CreateInstance.ps1 + } + } until ($listWebFormsExamplesView -eq [listWebFormsExamples]::Pick_An_API) + startLauncher +} + function startMaestro { do { Enum listMaestroExamples { diff --git a/utils/createWebFormTemplate.ps1 b/utils/createWebFormTemplate.ps1 new file mode 100644 index 0000000..1d39fd0 --- /dev/null +++ b/utils/createWebFormTemplate.ps1 @@ -0,0 +1,157 @@ +$apiUri = "https://demo.docusign.net/restapi" + +$accessToken = Get-Content .\config\ds_access_token.txt +$accountId = Get-Content .\config\API_ACCOUNT_ID + +Write-Output "Checking to see if the template already exists in your account..." + +$templateName = "Web Form Example Template" +$response = New-TemporaryFile + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/templates" ` + -Method 'GET' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -Body @{ 'search_text' = $templateName } ` + -OutFile $response + +$templateId = $(Get-Content $response | ConvertFrom-Json).envelopeTemplates.templateId + +Write-Output "Did we find any templateIds?: $templateId" + +if (-not ([string]::IsNullOrEmpty($templateId))) { + Write-Output "Your account already includes the '${templateName}' template." + Write-Output "${templateId}" > .\config\WEB_FORM_TEMPLATE_ID + Remove-Item $response + Write-Output "Done." + exit 0 +} + +$requestData = New-TemporaryFile +$requestDataTemp = New-TemporaryFile +$doc1Base64 = New-TemporaryFile + +Write-Output "Sending the template create request to DocuSign..." + +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents/World_Wide_Corp_Web_Form.pdf"))) > $doc1Base64 + +$json = @" +{ + "description": "Example template created via the API", + "name": "Web Form Example Template", + "shared": "false", + "documents": [ + { + "documentBase64": "$(Get-Content $doc1Base64)", + "documentId": "1", + "fileExtension": "pdf", + "name": "World_Wide_Web_Form" + } + ], + "emailSubject": "Please sign this document", + "recipients": { + "signers": [ + { + "recipientId": "1", + "roleName": "signer", + "routingOrder": "1", + "tabs": { + "checkboxTabs": [ + { + "documentId": "1", + "tabLabel": "Yes", + "anchorString": "/SMS/", + "anchorUnits": "pixels", + "anchorXOffset": "20", + "anchorYOffset": "10" + } + ], + "signHereTabs": [ + { + "documentId": "1", + "tabLabel": "Signature", + "anchorString": "/SignHere/", + "anchorUnits": "pixels", + "anchorXOffset": "20", + "anchorYOffset": "10" + } + ], + "textTabs": [ + { + "documentId": "1", + "tabLabel": "FullName", + "anchorString": "/FullName/", + "anchorUnits": "pixels", + "anchorXOffset": "20", + "anchorYOffset": "10" + }, + { + "documentId": "1", + "tabLabel": "PhoneNumber", + "anchorString": "/PhoneNumber/", + "anchorUnits": "pixels", + "anchorXOffset": "20", + "anchorYOffset": "10" + }, + { + "documentId": "1", + "tabLabel": "Company", + "anchorString": "/Company/", + "anchorUnits": "pixels", + "anchorXOffset": "20", + "anchorYOffset": "10" + }, + { + "documentId": "1", + "tabLabel": "JobTitle", + "anchorString": "/Title/", + "anchorUnits": "pixels", + "anchorXOffset": "20", + "anchorYOffset": "10" + } + ], + "dateSignedTabs": [ + { + "documentId": "1", + "tabLabel": "DateSigned", + "anchorString": "/Date/", + "anchorUnits": "pixels", + "anchorXOffset": "20", + "anchorYOffset": "10" + } + ] + } + } + ] + }, + "status": "created" +} +"@ + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/templates" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -Body $json ` + -OutFile $response + +Write-Output "Results:" +Get-Content $response + +$templateId = $(Get-Content $response | ConvertFrom-Json).templateId + +Write-Output "Template '${templateName}' was created! Template ID ${templateId}." +Write-Output ${templateId} > .\config\WEB_FORM_TEMPLATE_ID + +Remove-Item $requestData +Remove-Item $requestDataTemp +Remove-Item $response +Remove-Item $doc1Base64 + +Write-Output "Done." diff --git a/utils/startServerForWebFormsExample.ps1 b/utils/startServerForWebFormsExample.ps1 new file mode 100644 index 0000000..027fcda --- /dev/null +++ b/utils/startServerForWebFormsExample.ps1 @@ -0,0 +1,91 @@ +param( + [Parameter(Mandatory = $true)] + [string]$integrationKey, + [Parameter(Mandatory = $true)] + [string]$url, + [Parameter(Mandatory = $true)] + [string]$instanceToken + ) + +$port = '8080' +$ip = 'localhost' + +$socket = 'http://' + $ip + ':' + $port + '/' + +$responseOk = @" + + + + + + + +
+
+

Embedded Web Form Example

+
+

Web Form will render here

+
+
+
+ + + + + + + +"@ + +[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true } + +$listener = New-Object System.Net.HttpListener +$listener.Prefixes.Add($socket) +$listener.Start() +Start-Process $socket + +$context = $listener.GetContext() +$response = $context.Response + +$buffer = [System.Text.Encoding]::UTF8.GetBytes($responseOk) +$response.ContentType = "text/html" +$response.ContentLength64 = $buffer.Length +$output = $response.OutputStream +$output.Write($buffer, 0, $buffer.Length) +$output.Close() From 632378c1c6a71b4080cfea6a36866b1419b750bb Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Fri, 9 Feb 2024 12:36:39 -0800 Subject: [PATCH 393/462] add web-form-config.json to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c2371cd..ca3507e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ ds_access_token.txt .vscode/* debug.log config/settings.json +demo_documents/web-form-config.json \ No newline at end of file From 7951a69c66438d553264dfed01aef46fed136e74 Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Fri, 9 Feb 2024 12:55:53 -0800 Subject: [PATCH 394/462] add spacing around codeDepot marker - not showing up as is --- utils/startServerForWebFormsExample.ps1 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/utils/startServerForWebFormsExample.ps1 b/utils/startServerForWebFormsExample.ps1 index 027fcda..70165c9 100644 --- a/utils/startServerForWebFormsExample.ps1 +++ b/utils/startServerForWebFormsExample.ps1 @@ -31,7 +31,9 @@ $responseOk = @" - + - + "@ [Net.ServicePointManager]::ServerCertificateValidationCallback = { $true } From 8d647ac185a5d212a30b2a176469f6c1f8daf913 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Fri, 9 Feb 2024 15:07:19 -0800 Subject: [PATCH 395/462] fixing event listeners --- utils/startServerForWebFormsExample.ps1 | 47 ++++++++++++++++++++----- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/utils/startServerForWebFormsExample.ps1 b/utils/startServerForWebFormsExample.ps1 index 70165c9..1aa4002 100644 --- a/utils/startServerForWebFormsExample.ps1 +++ b/utils/startServerForWebFormsExample.ps1 @@ -52,15 +52,7 @@ iframeStyles: { minHeight: "1500px", }, // Controls the auto resize behavior of the iframe -autoResizeHeight: true, -// These values are passed to the iframe URL as query params -tracking: { - "tracking-field": "tracking-value", -}, -//These values are passed to the iframe URL as hash params -hidden: { - "hidden-field": "hidden-value", -}, +autoResizeHeight: true }; const webFormWidget = docusign.webforms({ @@ -68,6 +60,43 @@ url: '$url', options: webFormOptions, }); +//Basic milestones in this workflow + webFormWidget.on('ready', (event) => { + // event = { type: 'ready' }; + console.log('debug form loaded', event); + }); + + webFormWidget.on('submitted', (event) => { + // event = { type: 'submitted', envelopeId: 'abcd1234' }; + console.log('debug form submitted', event); + }); + + webFormWidget.on('signingReady', (event) => { + // event = { type: 'submitted', envelopeId: 'abcd1234' }; + console.log('debug form signingReady', event); + }); + + webFormWidget.on('sessionEnd', (event) => { + //There are 3 sessionEnd types sessionTimeout, remoteSigningInitiated, signingResult + + // event = { type: 'sessionEnd', sessionEndType: 'sessionTimeout' }; + // event = { + // type: 'sessionEnd', + // sessionEndType: 'signingResult', + // signingResultType: 'signing_complete', + // returnUrl: 'bigcorp.com', + // envelopeId: 'abcd1234', + // }; + // event = { type: 'sessionEnd', sessionEndType: 'remoteSigningInitiated', envelopeId: 'abcd1234' }; + console.log('debug form signingResult', event); + }); + + //Less commonly used events + webFormWidget.on('userActivity', (event) => { + // event = { type: 'userActivity', activityType: 'click' | 'keydown' }; + console.log('debug form userActivity', event); + }); + webFormWidget.mount("#docusign"); } loadWebform(); From b20b69b0a7ba311b56e627c7997b6929cce55f78 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Tue, 13 Feb 2024 11:15:55 -0800 Subject: [PATCH 396/462] updating README --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index c8ec7c2..80deee8 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,14 @@ For more information about the scopes used for obtaining authorization to use th For a list of code examples that use the Rooms API, see the [How-to guides overview](https://developers.docusign.com/docs/rooms-api/how-to/) on the DocuSign Developer Center. +## Web Forms API + +The Web Forms API is available in all developer accounts, but only in certain production account plans. Contact [DocuSign Support](https://support.docusign.com/) or your account manager to find out whether the Web Forms API is available for your production account plan. + +For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/web-forms-api/plan-integration/authentication/). + +For a list of code examples that use the Web Forms API, see the [How-to guides overview](https://developers.docusign.com/docs/web-forms-api/how-to/) on the DocuSign Developer Center. + ## Installation ### Prerequisites From 7f8170f9570d1e6267df00718a880164d2d5de2b Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Tue, 13 Feb 2024 11:58:14 -0800 Subject: [PATCH 397/462] DEVDOCS-13760 codeDepot markers --- .../eSignature/eg042DocumentGeneration.ps1 | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/examples/eSignature/eg042DocumentGeneration.ps1 b/examples/eSignature/eg042DocumentGeneration.ps1 index bf934d1..5a7c2f5 100644 --- a/examples/eSignature/eg042DocumentGeneration.ps1 +++ b/examples/eSignature/eg042DocumentGeneration.ps1 @@ -12,7 +12,7 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -# Step 2. Create a template +# Create a template # # The envelope has one document and one signer/recipient # The document must be a Word docx file @@ -33,6 +33,7 @@ Write-Output "Sending the template create request to DocuSign..." [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\Offer_Letter_Demo.docx"))) > $doc1Base64 # Concatenate the different parts of the request +#ds-snippet-start:eSign42Step2 @{ description = "Example template created via the API"; name = "${templateName}"; @@ -76,10 +77,11 @@ Invoke-RestMethod ` # pull out the template id $templateId = $(Get-Content $response | ConvertFrom-Json).templateId - +#ds-snippet-end:eSign42Step2 Write-Output "Template '${templateName}' was created! Template ID ${templateId}." -# Step 3. Add a document with merge fields to your template +# Add a document with merge fields to your template +#ds-snippet-start:eSign42Step3 @{ documents = @( @{ @@ -103,8 +105,10 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign42Step3 -# Step 4. Add tabs to the template +# Add tabs to the template +#ds-snippet-start:eSign42Step4 @{ signHereTabs = @( @{ @@ -133,9 +137,11 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign42Step4 -# Step 5. Create an envelope draft from a template +# Create an envelope draft from a template # Leave envelope in "draft"/"created" status, don't send it yet +#ds-snippet-start:eSign42Step5 @{ templateId = "${templateId}"; templateRoles = @( @@ -160,10 +166,12 @@ Invoke-RestMethod ` # pull out the envelope id $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId +#ds-snippet-end:eSign42Step5 Write-Output "Envelope '${templateName}' draft was created! Envelope ID ${envelopeId}." -# Step 6: Get DocGenFormFields +# Get DocGenFormFields +#ds-snippet-start:eSign42Step6 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/docGenFormFields" ` -Method 'GET' ` @@ -178,11 +186,11 @@ Get-Content $response # pull out the document id value $documentId = $(Get-Content $response | ConvertFrom-Json).docGenFormFields[0].documentId - +#ds-snippet-end:eSign42Step6 Write-Output "Document ID ${documentId}." -# Step 6. Build the request to update the data fields in the envelope that we created from the template +# Build the request to update the data fields in the envelope that we created from the template # Collect user data to send to API/Document fields $CandidateName = Read-Host "Enter candidate name" $ManagerName = Read-Host "Enter manager name" @@ -201,6 +209,7 @@ elseif ($JobNumber -eq "3") { $JobTitle = "Sales Representative" } +#ds-snippet-start:eSign42Step7 @{ docGenFormFields = @( @{ @@ -240,8 +249,10 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign42Step7 -# Step 8 - Send the envelope +# Send the envelope +#ds-snippet-start:eSign42Step8 @{ status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData @@ -255,7 +266,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response - +#ds-snippet-end:eSign42Step8 Write-Output "Response:" Get-Content $response From 260ed297217004be4453244478bb21209a9fedea Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Fri, 8 Mar 2024 15:16:48 -0800 Subject: [PATCH 398/462] fixing codeDepot marker --- examples/eSignature/eg016SetTabValues.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg016SetTabValues.ps1 b/examples/eSignature/eg016SetTabValues.ps1 index 5c68966..de468ae 100644 --- a/examples/eSignature/eg016SetTabValues.ps1 +++ b/examples/eSignature/eg016SetTabValues.ps1 @@ -124,7 +124,7 @@ Write-Output "Sending the envelope request to DocuSign..." #ds-snippet-end:eSign16Step3 # Step 4. Call the eSignature REST API -#ds-snippet-start:eSign15Step4 +#ds-snippet-start:eSign16Step4 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` From ae8860e967282e00aec1065b50285af5dc41c161 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Tue, 12 Mar 2024 12:45:23 -0700 Subject: [PATCH 399/462] adding step 4 markers --- examples/eSignature/eg010SendBinaryDocs.ps1 | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/eSignature/eg010SendBinaryDocs.ps1 b/examples/eSignature/eg010SendBinaryDocs.ps1 index 6f2062b..935b9b1 100644 --- a/examples/eSignature/eg010SendBinaryDocs.ps1 +++ b/examples/eSignature/eg010SendBinaryDocs.ps1 @@ -13,10 +13,8 @@ $CC_EMAIL = $variables.CC_EMAIL $CC_NAME = $variables.CC_NAME $SIGNER_EMAIL = $variables.SIGNER_EMAIL $SIGNER_NAME = $variables.SIGNER_NAME -# Step 1 start # Obtain your OAuth access token $accessToken = Get-Content ".\config\ds_access_token.txt" -# Step 1 end # Obtain your accountId from demo.docusign.net -- the account id is shown in # the drop down on the upper right corner of the screen by your picture or @@ -153,8 +151,8 @@ $headers = @{ # Send request try { - # Step 4 start # Call the eSignature REST API + #ds-snippet-start:eSign10Step4 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -163,12 +161,11 @@ try { -OutFile $response Write-Output "Response: $(Get-Content -Raw $response)" + #ds-snippet-end:eSign10Step4 } -# Step 4 end catch { Write-Error $_ } -# ***DS.snippet.0.end Get-Content $response From 85a39ea18da2e62466b3235d5dedb45d5445c492 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Tue, 12 Mar 2024 12:56:05 -0700 Subject: [PATCH 400/462] fix step 2 marker --- examples/eSignature/eg002SigningViaEmail.ps1 | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/eSignature/eg002SigningViaEmail.ps1 b/examples/eSignature/eg002SigningViaEmail.ps1 index 85d5273..efee67e 100644 --- a/examples/eSignature/eg002SigningViaEmail.ps1 +++ b/examples/eSignature/eg002SigningViaEmail.ps1 @@ -6,7 +6,7 @@ $apiUri = "https://demo.docusign.net/restapi" $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -# Step 1: Obtain your OAuth token +# Obtain your OAuth token # Note: Substitute these values with your own $accessToken = Get-Content .\config\ds_access_token.txt @@ -14,7 +14,6 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountId = Get-Content .\config\API_ACCOUNT_ID -# ***DS.snippet.0.start # document 1 (html) has tag **signature_1** # document 2 (docx) has tag /sn1/ # document 3 (pdf) has tag /sn1/ @@ -43,7 +42,7 @@ Write-Output "The envelope has three documents. Processing time will be about 15 Write-Output "Results:" # Concatenate the different parts of the request -#ds-snippet-start:eSign2tep2 +#ds-snippet-start:eSign2Step2 @{ emailSubject = "Please sign this document set"; documents = @( @@ -103,7 +102,7 @@ Write-Output "Results:" } | ConvertTo-Json -Depth 32 > $requestData #ds-snippet-end:eSign2Step2 -# Step 3. Create and send the envelope +# Create and send the envelope #ds-snippet-start:eSign2Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -121,7 +120,6 @@ Write-Output "Response: $(Get-Content -Raw $response)" # pull out the envelopeId $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId -# ***DS.snippet.0.end # Save the envelope id for use by other scripts Write-Output "EnvelopeId: $envelopeId" Write-Output $envelopeId > .\config\ENVELOPE_ID From 04f7a60ab5272aacf3f816f6dd5917fe6038703c Mon Sep 17 00:00:00 2001 From: inbargazit Date: Wed, 13 Mar 2024 12:12:30 -0700 Subject: [PATCH 401/462] DEVDOCS-13915 - adding codeDepot markers --- examples/eSignature/eg011EmbeddedSending.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg011EmbeddedSending.ps1 b/examples/eSignature/eg011EmbeddedSending.ps1 index 33b8c18..118ded0 100644 --- a/examples/eSignature/eg011EmbeddedSending.ps1 +++ b/examples/eSignature/eg011EmbeddedSending.ps1 @@ -36,7 +36,6 @@ do { [int]$startingView = Read-Host "Please make a selection" } while (-not [ViewType]::IsDefined([ViewType], $startingView)); -# ***DS.snippet.0.start # Step 2. Create the envelope # Create the document request body @@ -53,6 +52,7 @@ do { # The envelope will be sent first to the signer. # After it is signed, a copy is sent to the cc person. +#ds-snippet-start:eSign11Step2 # temp files: $requestData = New-TemporaryFile $response = New-TemporaryFile @@ -136,8 +136,10 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign11Step2 # Step 3. Create the sender view +#ds-snippet-start:eSign11Step3 # pull out the envelopeId $envelop = $response | Get-Content | ConvertFrom-Json Write-Output "Envelope received: $envelop" @@ -166,7 +168,7 @@ $sendingUrl = $sendingObj.url if ($startingView -eq [ViewType]::RecipientsAndDocuments) { $sendingUrl = $sendingUrl -replace "send=1", "send=0" } -# ***DS.snippet.0.end +#ds-snippet-end:eSign11Step3 Write-Output "The embedded sending URL is ${sendingUrl}" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." From c5e8a9adefa5fd3f679b5ed4fd6470c66055e157 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Wed, 13 Mar 2024 12:15:56 -0700 Subject: [PATCH 402/462] Updating comments --- examples/eSignature/eg011EmbeddedSending.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/eSignature/eg011EmbeddedSending.ps1 b/examples/eSignature/eg011EmbeddedSending.ps1 index 33b8c18..118ded0 100644 --- a/examples/eSignature/eg011EmbeddedSending.ps1 +++ b/examples/eSignature/eg011EmbeddedSending.ps1 @@ -36,7 +36,6 @@ do { [int]$startingView = Read-Host "Please make a selection" } while (-not [ViewType]::IsDefined([ViewType], $startingView)); -# ***DS.snippet.0.start # Step 2. Create the envelope # Create the document request body @@ -53,6 +52,7 @@ do { # The envelope will be sent first to the signer. # After it is signed, a copy is sent to the cc person. +#ds-snippet-start:eSign11Step2 # temp files: $requestData = New-TemporaryFile $response = New-TemporaryFile @@ -136,8 +136,10 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:eSign11Step2 # Step 3. Create the sender view +#ds-snippet-start:eSign11Step3 # pull out the envelopeId $envelop = $response | Get-Content | ConvertFrom-Json Write-Output "Envelope received: $envelop" @@ -166,7 +168,7 @@ $sendingUrl = $sendingObj.url if ($startingView -eq [ViewType]::RecipientsAndDocuments) { $sendingUrl = $sendingUrl -replace "send=1", "send=0" } -# ***DS.snippet.0.end +#ds-snippet-end:eSign11Step3 Write-Output "The embedded sending URL is ${sendingUrl}" Write-Output "It is only valid for five minutes. Attempting to automatically open your browser..." From 69ffd3247db501ddf9526e919b8ecca3a02563b4 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Wed, 13 Mar 2024 13:28:47 -0700 Subject: [PATCH 403/462] fixing codeDepot markers --- examples/eSignature/eg040SetDocumentVisibility.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 index b74167a..99b6c89 100644 --- a/examples/eSignature/eg040SetDocumentVisibility.ps1 +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -40,7 +40,7 @@ $SIGNER2_NAME = Read-Host 'Please enter signer #2 name' $CC_EMAIL = Read-Host 'Please enter carbon copy email address' $CC_NAME = Read-Host 'Please enter carbon copy name' -#ds-snippet-start:eSign403Step2 +#ds-snippet-start:eSign40Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") From f1df3e4614520c26225e5f5d920de5e13ca6c046 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Wed, 13 Mar 2024 14:49:11 -0700 Subject: [PATCH 404/462] adding codeDepot markers --- examples/Admin/eg011DeleteUserDataFromAccount.ps1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/Admin/eg011DeleteUserDataFromAccount.ps1 b/examples/Admin/eg011DeleteUserDataFromAccount.ps1 index b1759c0..b3efeaf 100644 --- a/examples/Admin/eg011DeleteUserDataFromAccount.ps1 +++ b/examples/Admin/eg011DeleteUserDataFromAccount.ps1 @@ -3,29 +3,35 @@ $accessToken = Get-Content .\config\ds_access_token.txt $basePath = "https://api-d.docusign.net/management" $APIAccountId = Get-Content .\config\API_ACCOUNT_ID +#ds-snippet-start:Admin11Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") $headers.add("Accept", "application/json") +#ds-snippet-end:Admin11Step2 # Get user information $userId = Read-Host "Please enter the user ID of the user whose data will be deleted. Note that this user ID should be associated with a user that has been closed for at least 24 hours." # Construct the request body +#ds-snippet-start:Admin11Step3 $body = @" { "user_id": "$userId", } "@ +#ds-snippet-end:Admin11Step3 try { # Display the JSON response Write-Output "" Write-Output "Response:" + #ds-snippet-start:Admin11Step4 $uri = "${basePath}/v2/data_redaction/accounts/${APIAccountId}/user" $result = Invoke-WebRequest -uri $uri -headers $headers -body $body -method POST $result.content + #ds-snippet-end:Admin11Step4 } catch { Write-Output "Unable to delete the user." From 122a7c38cafe85d14fa0c70d599e8e5bd80b981c Mon Sep 17 00:00:00 2001 From: Anna Hileta <80112359+annahileta@users.noreply.github.com> Date: Thu, 28 Mar 2024 01:20:38 +0200 Subject: [PATCH 405/462] added enforceSignerVisibility to true (#101) --- examples/eSignature/eg040SetDocumentVisibility.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 index 99b6c89..aa71e2f 100644 --- a/examples/eSignature/eg040SetDocumentVisibility.ps1 +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -60,6 +60,7 @@ Write-Output "Results:" #ds-snippet-start:eSign40Step3 @{ emailSubject = "Please sign this document set"; + enforceSignerVisibility = "true"; documents = @( @{ documentBase64 = "$(Get-Content $doc1Base64)"; From fbe978925846390e5bae1b06378b1013e48e6420 Mon Sep 17 00:00:00 2001 From: Anna Hileta <80112359+annahileta@users.noreply.github.com> Date: Tue, 2 Apr 2024 02:19:19 +0300 Subject: [PATCH 406/462] Added name and email of signer to the document in Document Visibility (#102) --- demo_documents/doc_1.html | 1 + examples/eSignature/eg040SetDocumentVisibility.ps1 | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/demo_documents/doc_1.html b/demo_documents/doc_1.html index be6ec51..f11b1d6 100644 --- a/demo_documents/doc_1.html +++ b/demo_documents/doc_1.html @@ -11,6 +11,7 @@ color: darkblue;">Order Processing Division

Ordered by {USER_FULLNAME}

Email: {USER_EMAIL}

+

Copy to: {CC_NAME}, {CC_EMAIL}

Candy bonbon pastry jujubes lollipop wafer biscuit biscuit. Topping brownie sesame snaps sweet roll pie. Croissant danish biscuit soufflé caramels jujubes jelly. Dragée danish caramels lemon drops dragée. Gummi bears cupcake biscuit tiramisu sugar plum pastry. Dragée gummies applicake pudding liquorice. Donut jujubes oat cake jelly-o. Dessert bear claw chocolate cake gummies lollipop sugar plum ice cream gummies cheesecake.

diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 index aa71e2f..ae3fb09 100644 --- a/examples/eSignature/eg040SetDocumentVisibility.ps1 +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -48,7 +48,12 @@ $headers.add("Content-Type", "application/json") # Fetch docs and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 +$doc1String = [System.IO.File]::ReadAllText((Resolve-Path ".\demo_documents\doc_1.html")) +$doc1String = $doc1String.Replace("{USER_EMAIL}", $SIGNER1_EMAIL) +$doc1String = $doc1String.Replace("{USER_FULLNAME}", $SIGNER1_NAME) +$doc1String = $doc1String.Replace("{CC_EMAIL}", $CC_EMAIL) +$doc1String = $doc1String.Replace("{CC_NAME}", $CC_NAME) +[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($doc1String)) > $doc1Base64 [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 From a168c066c43eb14a6b1ba8770d4392a9df9f3db7 Mon Sep 17 00:00:00 2001 From: Mykyta-Petrov Date: Mon, 8 Apr 2024 15:20:05 +0300 Subject: [PATCH 407/462] Update docgen example for dynamic tables --- ...o.docx => Offer_Letter_Dynamic_Table.docx} | Bin 37132 -> 36681 bytes .../eSignature/eg042DocumentGeneration.ps1 | 40 ++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) rename demo_documents/{Offer_Letter_Demo.docx => Offer_Letter_Dynamic_Table.docx} (76%) diff --git a/demo_documents/Offer_Letter_Demo.docx b/demo_documents/Offer_Letter_Dynamic_Table.docx similarity index 76% rename from demo_documents/Offer_Letter_Demo.docx rename to demo_documents/Offer_Letter_Dynamic_Table.docx index a8d6d59fe73b6a2d94788c3e701573ddaa5cd3a3..8c109beea0326ed2d92cd78cd2489bb52996c066 100644 GIT binary patch delta 6528 zcmZu#1yEFN)LvleZUl*?Q9wGRy95>_rMp2&Kw|0c-9{&fGiaedj!9?mX{3=RW7e<{}SfBIAKoP=F)=3=9ka!?Pg0Bs?yNh;y3uI(za5 zeRcwN9Ix+47WS6ag^I!XF4s4B#W7AyxOGbh2B!qL+iunaO^I!HA0ErqNm(={L%qF) zBN<@NtPD9>PE1U)IGxu9o+duPU~(lon&_iF3i!BKC}&O2lOn(|$HWR8E|21c3c`-bkuV~J27L$gB1RmPe&a~b7W9d%Z$=Ki=-gik(zYjq4UUL=INB90 z9;B6P)5c|bQJELWJ9;{6d}^$XkfM9sDBvWOiPDM1Re?mXO^4B|^HwYvA!#r?SEDQJ zmB@pqg0h*Tcpzx?N@xf6DGSwBG@GLx{{X7t;Lmz_B5bQbEp&Un0FcM+pjMTjc6v^k zHs?o#|F!*twW>x7#Cp`YcI)}D83%$YIaSyUufG@#C95`Egi=dtIQB;w!8tiXxMnHv zl9~ngd#Xwubz3--I7R3e6iqf$g^!!5^Wu+oV~OHy^{B)xJF}h#T z95W3Yxb%8#4FFmU0fHmZ^!r^}*F)R@X-6Uw_w=6)*TEf4YAtT@`FIHwoO zVY2r2gijK9oEK$man${tinmj~%|(S^;+ongL>|~0LyQv?+Knc%To?+ z2PXAN5*Q!Xg!88M^O%(RRuY%|)14Dbg_6OVzNg8Y!K(#@ER0Q|Fy{cHm#<{iI;H9a zZbfM1AzqEL*ZtaZ10%7#5JW&{o8$dE4!or$^YzaP1a=|9X+Bq=s!rh-_mi!MpQS4c#;e`W=?VRck|a z?0p9sza&sQsiosU^VnXDO&(_jz?be&z$)k%cjXQKfQDobrH zMn2LXOBqWN`HvNk)BR@;s*T40*%KhS3%(EOS3f|Rb(O|QB_1VUeQC{V_2EqPaRZS< z6_ai<=IUN)%;s#oYAlo&<+*Y2g{pyyiowFo#T|cq8M)#EdT;YfJfnr+Sr(+On5erm zZy&B2jy@zjNm;J+*~bI>NAKJH4dNe|$R+A`(bl@|tM4bCTJ8%CgUn@`jH_N*Dx-g?MbU=Tkad(`~BYI z0;l$Gu-D#m_ZW`sfGMILVpxNe-$s#n#WBNjFu#3UqBmX}nB{;9)S{BG_geQPW!fs) zCW6;w`a;j7AD>2wHKGRcKx7Xmn8UuMGearp(j$_lihx7g;w0`i*~Q?!u(E1Xjd!wj zU(rTbvr9+VCDBD=?lJ9q*OY;)z0cE#Yg8~KfUtJ}jW-yCCs}4M@s6vf)}U{!+hFQOaelB$^=?N}g*LWoziNIC+q$Y0`3 zM)C^hd+||OGn~6CaoJ3};k->4?-55&GJR4L)?-ru0>)->1C_guacYC#Fv!#h=6EBm zb$FvN2-|4u1CP4~=)}EWCz`W-`c!QFPD^3_1M4dRvNBEpH@XSa+8Ilr@)~2#ut9ME zkoda}5l3>aq;Ir{JR~SW3P&|Sk7`#KzGv-?XHCc+7641uIe`~=E|{m>$QjDe9d(a% zBRhec(0|B|@3sBMq;aT7NUjGJa3 zX}!@KJ_Wm~ZPT^{BhDVmPnbw9KsUtJF-DuFFA*A$^4{2&YHOF~;5v+D+%*`~?b{~b z5t`cigZ!^X?`5~CdKz4JQ}l+ulJCnju3r+5rcsP~)S2 zwkwu&p62tHE1F0xGD!`J)noNch12K^f5kFBM_M85&AnRcD)3Y{4;+z^jPt&u1LqCX zpp~RSsE>R#K7Doe1uZqGUt;ke|p%6%!SXtl`wrEi)t538=eQ4wW)LDISF zBoElc7&=2>So^pbYy+y>2-K|5|s>|n{De|-kk3I*9ShwEy_X1yU2=op}D(G^sfzKkq6cr*N zFM_%DFk)qoY^<2ke1?n|=Fnnm{oV5mlm4H@6p9_Uz|WU{{ppyTi0>ZF*lk19<$ zo}7!L3`6$MBz{%lkcV2k0;m8$3hjTZaBVR$#Xp6%mxK|LWTM{1Mbaw~v~0HfIBAU$ z1(OQ2Lf{d})p0fLSn#;6Rb^rI>LUL7N#E6q#gXvknb-V%Hmpln(@BVx)`;I=Am>pK z?D1Bf=R@OHNfzuHY=qfG32IZ>QZFZL#w{!qhl{w#Hfl*M%m;^pnPZ=77xIXqi4T>H z_)@UcV`mdVo+WE2J%b`~Nxj2Vj1?z4d-LNnP*@w@fWi?~9-n45d*CfyT8ga%?{zNS zG*d;b)<%M!An4wYBNU)de^8waH~Jjy=B^B9-H+enm*;?szlc_rx)(-rc$~|252R2x zJy9=7^2v~6m-RbyUg&Xej(h&-1a>WsCC~nd_M-a&eC(ViXHe~f<1VIK`_jkT3A*Q3 zEf%R%*X9%5Uu#a)hNwhrI&$(X^|z0QyuR4>0=oR7HwH!x`;1(*yYI&64wMp8Zg(zYkAIg)g zYU^MLp#`esUQ|i)2>?Y9$}l^rY8hbdnDzdIk`&c9{{mIxbkk-j;P`iA?9ppG^)EF z7%=*O7=pf~V1%fJaFP5Xg|0P%j4Pb4!~Q*h zbjDrn(})z_grMGxgLV!dh!wfFen;CNr_q{Yd> zQ3r!%Zr)OD5}oDUj0JVx7Hg*aOWt$*U$oWf&mu_v-|q^#_kbQkb>O@paEy6@m(GRr zI8nA?J-=A@y&^Qg(l&-}P-kCPQpM&SE>j7kQ$IiQK6k^+0(4(d`I`c4*mFg`B9AuZ z%C&#p|3on}tNlZ?&~AvHW*j*6dy1+L8AGtSzAL7Uu|h_KX?YpqgKkRPA;iTcC6>g!2{$4w!{3DNd;LeKj@#E`*}$c(vh4amZ99a8@yO<@m5zj!WWGW(u?_-+0@7Av}Hu zXAvw_OUPFBH6*V~A1EHOZ%qO#C3Lqm*heX;<@*d0?;c59_HQ<0u+e$H{y>uFZx?TL zGnIXUAZX}qSqx+{m2(Ow-709a^q6^tyIQyfR-J*UKHD-laT>2uv5{folUzJuJNKslYf>{ zKUBv%3Zl?jOi(L7wp{Jsk4b| z;&oo^=(gQ;tgZNVo`I-;0kZuGuh>RnQ08X{S%j8*^#Q~5df)Zjg__l;nlFc#o@5cO??75j?s%YpqMLrRmGkV^tx2u51;{I0F|<4%@1Q zgdE9qX1v-zoXQereEy}rbx1D>XT|JIA9bGHFh#N#KI|TtFA)OyNGd^nPz(q1P1|7F zydKhF?=Z+7DAuPM0(h6Wc-JmqbqVKD3GaWhZ=V6C3 zW{D~DNZ^gbTs@n2ZmYQ=5zPMJwnTG?T~4XP?zMVMP*^kU`upqL7 zaf*UXzCCYX$#1HIqF%q~nIBiv?$G-zk{IiTLRu7s3@*SY$s^WYL_sK7T8WrJnsWx; z@5`qdEjXawmT(MILVn!%_Qtagx6XE?*GePIxC8xQ_CZ=d^tp?ZyR3FPskck(UDKg& z@P-}^X=*OcS-Orhr893;MfQPo(&p0qlPhhMi)~nbVeHo&JM6JeG0cT7pfw>X#=(+@Fe0wObkKKkG1-`6*hwCRP zAUKaB=l9{~$|61Xn6*076Cm-ex9ok5^`E$dN(1fQSWFi9SFtf?g*HhjnB)b?OC+y1 zl-G~&(Ik(Ffd%Hg8AiY$CxF^KQAc)?mrO7vk~=lWk`Gna)ucvTo{ZMv4<02YGC_63fwtvbug5P7jm~ zC&R)Y-)T%TazkuRj;ca<5x_v8ID$3LjeJpe)E#h5FxgCQgza6`_}&VpH&Je(&(uH^ zP_mPGoRo8EYCC~yt`B)|Q|>?1dw|d8jr9>e!9u#|C#sB4x`oF%yDs~MCvoxrXz|EZ z-Heo|+azyuX}YaRP@-t00I}yulPsnpx~|YKQ?QT^ZoHgw=h#--fLyi=lUpB#){l$d z^!w*nL_ZJDcejQW#`qRzw0>l=4P35I`%ad;T8I|LlAi+Glr%glPR&(u>^tZoJ~>gBmcA{fd!MrYFdxBdU?r|{El%}gN8z~WBryTaimj5RW=a^a7Q3b z!}Z7(iilE9zo65RJ{PyKq|B6r`=NHoi<_Pc+b$)mj1&@O-BV*oiHkmiNx^Pfa})Xo zd8VT-*2`ud6dfF~`~C$T?b74kk`Q?rU3#G~W1R5GFN(d?nL?Z2V!-*e2K)u7dRaN75dEQC=&cImhhkE(lSDl-Q&!{StA3>Yuh{~qd5x(> z_3ub0<%1c8OOIUmTbQO|o}6+stA^Cb3g)DL<<2tkyT1J`4G85)3CMm*gQq`dEB}$4 zF?3Y_NX|r7(%N>=2-=^KN+K(g`ELsfk7k6x2c5gP2*R_nj|i?`5X#_dYZD522z#zd zGF4RYB9$&#;*%`3L4mo*QeaZfqzs7ly^E;+O?Sb>AhNX9sCC(!SNh009}Va1`o#Oj zGDK2jNd(B}^#^9L=&A53Zr0%uZ^1Qj58i=pd`I)rg9y1jY1rAqu;uBTx?#Sc_8thy zm1?8!r-E7xG7-IL(~x@x67vdfpQ58T1-#5HGs;+uoNB##-|85v``9mUB{O*n5*k03 z$GSmS*Bd`~ZHZiE@V};%)a7<9^lMp?qvub-JMu`8+B{~#)+JGvKHNZnm2VED4?~~? z3~`-1e8}|W(-jPa$Ep;MK7CSb)A$TIuYRa7%fYZsn33Aj_A<=$^?UNCODaYmWe&VC zicH(lv8aMLBp6LN)X=yTnx2HRTkB_vfNPmN`93u!xj`_`39>Ig z+5XaQb^LowHkKIlF!JYdzWbRBU=<`}62SjX-hYkIpiZ#@f6nfGtlS@iGmaA31r=I_ zK>{_7!}+u4{Bw^S9U2`+`)6JLb8UbL9gL%+`!#9%cN>Tg`1eJR4aJP7{sVdxPl*gC zfXc@+{|5cLxgq{H22f21jg1HW0agD5F%UyX;@N+L{t^7Y_5R-=HWKKA1ki7%f6H6K zzakrvLSH1%{&xCziTK;8iVT|ikJG=i;o)DAa;TwCXla!G%jx`6vV^Ulj%vsN0QO%1 zq@OLaiJO(9`xDMz&;J6U5{Z<^baYUIM26q5cbkM~)MW+$;0FKzq<;lMV}WM=$p&bMm- delta 6962 zcmZX3bzGEP^Y^m2ba!_*g0KikcZY;XNG_eyxRijfF>vbtnEUFV@` zGUg%R0s8zxv2w6R<|&63xL#i26~{QU;#Pm%H#s4|-SV*QYe;CltS^zTma%F`f`cXL zy9rebJ@^da7ZnxfcC+r*w0$(;N#HlxOF46Dab>R%Cs97meJ+NT!pq)x;Dg7g0-db@F_{w zixYd^A%eD={^!V-uO~q9Z)9WyIqcQSons7I$YaB8uq*u>i8EEJ{Y@mhOk6C~(m%-W zLrT=kV=W=P?prmVrKS+7au zfW->t0gbV1 z`>#0o+naXQIXd%BtV5iRNm^Y_3$4a)4Ra&OUW#uFl0_nX{C;dDFSks$k7fE@H86%Y zZXiSmjOt%xsC~=&81bE|l`FCXG0!x>IMDwBT05j-WbSX}x4u$8LTuyyd#2KXR}{huCCy^f2sMh;Xjk5`&X9<-@N$ z56)39Ef;vn97BdRL!o>pA2cc4%<}WNLx8S~L zp=`qE%0oFkgwWE=XL#&G9$fp0PqVAd6pokX3>dm_yxPjkgszLtN7ONG9-A#{*PM9{ zwoue%rSG52n5JAbv&fZ%(doNzU8vSpvKsv?hE!7G@qefK()>uwEM1`JWcAkRI?BnZ zYLkyeS1-obFWGbVK-S84$5BbrD|u9tMjZms3y^nGI)NTL1Rl+^N;-XgMPwdZ!9R)5 zNTkb!WqlC;>?Ngk$9MUc>`i9{UT?Y2AP5>>=5b*MIx52a2a_e;@c_-A{8ER7ZIMvV zivAktwBm1u?dUC-ZdJSi$9S-u|G9gk4Bxu4tit{b>qffR909R z#QDNU0tR()jXI7m$wd^nKHkt$>4?d^;)ONG{p?Sli%)S{a+vq4MbEKh%@hCiDf5tIVCAEH|fFW+SHE7Nj zvux@#!L@{5d@c)2$)==No&J7R>V~W323=bX9b^A!qD1ro05FXQ0Q{X$;9(EWp!b;t z@UMs9ZtdghVa;#r>gr|VA;{{Mnj?=mlda}# zk!!r0Z9QQu8tt%NAS9sn*hnOu$3N-RQK3|AzG6OH4qEx`0rl566SZ$da*n0Vn5%M6 zygdfNbhKmb^2k`Qe8*%~OA--meuBk(kI>l@pT%dkI>N!QubkWopKwAmNE93R@m)zU z^VKEzNm|(R=3WLJB%+KlK5qQ$Ne3_7ap5}qd9qM7H`)YC| zPAR~<0m{#?66bvC>SW$;_`>dd(&`IccKcCL9ih5^D7N1(P)+)PnowJ&P5wdZ%Q2dL z&mU)EUZTCM`Xa3Yo@!d{N8g13pX-{H*z*m#c;APhLhR!on7~KYHcpIZBp03<06ri_ zBkVaBlVF|B94&>Hujg{Ob}2Gfdz$(xv5csN2BGDB!5TUl^pXs2&6cR~xoZPQ-a+{~ z0lV<>M^T0DPiEGevsacSA76f9o^6iTsg@KTn6ng*72FS;_Q~U)qiZv z)Y}QcEqXRLB5d(-kP25t&7>_)(QoecmjnLp+nPmlktU7gz@_WKx`A%``Vx`IWXGD zOGX$JMVt+@3*o5?u>05+`hFI6`r-e3tqTL zK8S>;+p;T>4x$1{&|Z`42|s=2vl%5>2MU1_F~vjRvVQ7t6&!+*7X`vx(wAR)E%#u; zpqiY%3~aI*6?vb2*6-Wa@k9oYl%1Kw8cN3I!+~nxOFIi~WLL{k+T{H0sPop|9S)HMkg<^oIzl z-mn}nB%H6ZxqT2X&DjjZqQLpxQ|Kd^8x`u>Jdy)RZLTWf#~1BxpypwVoGj3FQKEf(@=kP%q^Bz_+bdY z3%)2l&4K=+$!02WY*E6;QBl_ECFWXc%Ch=99D$OO7 z1KKVgi}1m&iYKw{^9AP+Ptfh)>`k&SB}4}wr)}Gvn!=T{5ClV0N|th z|FUa70mXkZX&WI6RAh zK21DgPEq}~vaWvq(`!_nKR#3(9U+WLiI7>A!%GD1r4=x$9Zl1f z!k%bws&CU^1=-Y~APEEGa9f3P1z0tUI8Vc6qqwYg-t3Y=*~z5Qw-HRh-6x>jte@Bf zeEziBhu5M+Q}W(Mn5q_&DbbDEZ%Y{#9k`=}55`V<%9&^~`GU)h$`Y+ev2{EqZmo{K znx7?k1|#flo7z6bXBt?18{sf`hY;dIB0q|cJK4m&13h)Ghz#>|FS`y$pZ2I<8uPw! z4pPBG7ZUyK{N%}OKzd=p92$B~@^O<3f9+A$!hDIv>Moo8+PGD1vB?pOF_q>b z6rohK1YM@QLA&=#HCD?p1O)(Ky{miw*C+l#o>hXx!2h^Kl!O_YJvQtTCV&H2VgDj7 z-&%xO?F0gSB%3?ITRhOg5Y~k=SZa?~`HF*c^I5ioe??QX-B0w?$sDG6|FMKbB@(eFbNFwa@-)|DNmEp_iG4i zkJn!M;p2R-^=WHpjoe$0-$PR*VEM@a=;J&U>{OI$Oj*YXz~X`FoC1Vz3q1>#zFMpXov@ zq=+pq&eL|V?=3O`W_Y%K*AAQBS>^vM0tiCAEBxvp-zULD$2zw{(vkl=r8EH&@_XsK7%lyykXkstb4R0`-#MAR9t(=E^$n7fwIUb z%5c_l@B*4s6O1kEf(&hcfQ_ToF~z6orHj?dv7fqY7qUX(ubms#>-TouTqIcUx5MYG zYsM6u{MRMhV$Zk3QnA4}aw5q>RKG@#dQT>IB^$J|?=lm5A^_gA2qfBD&F@N9Te=l-XU=KDJxu>ks&iU*F!SpP=5G zEhkUzjO5N_-~Kk+z13RDn4r%NUFJmyprI|O+!o7oeP>B*LTe-@*)EhbOi@B4zevU= z`qxz7(5QSpf&qhI`=?hd;ybR0FCpt}0;pf;)sK|v;-wake3fY18Z^P_p%dx_s1;4K zM;HYm7{-q&eWA}=172Dc$jjgMpi*Y#*wFB zy_e7$#Y84;tj|34_=HR@;(gyGtQ8pdFiO8yeJ9$al2g%(nxrQrYZXopqgiga5u^=U_>=3yt3NXDkZ=BLrwtx7N5+Z z@gr>ePh)|!GSP+0UyXDgwQ++M0i&7gtR`wPCNyrz{rY7InV&E$KdN^JyLN=ctPqF0 z+CP3@^Dq)#Gu6<|Y3+r8OmGyx8q3`Gezx;4x;Q*yeq+A=1_704qkg%(96pbWy+{zxC=cPqnHOtsvj9z#da=zqson-}Ef1R)AbJTeI{K>9ATRCo zBuvI!jVjkJ0ShYpfzy{=E;ss%OJT<@;d{&npJdy2X!q$wB+)hK-eq5gD z^lWfuGxAF zQ-|F217&d=3bID~jj8q$rI5EUcg-GY66HJ`f15!Uq%TxU?=i|#s-c`1|11BZBGS__ z4M~L?-3LVd-4gixYNnY2Q$s)dC3@?LDw~j<49sDX7bT31IBN+_eY^&Q8HJSJMBeh_ z80f_@l6(dO%HDnNxjy=8pMc$v4gAs_djP2$e>z3KxUfxzO_n$}nuKzB^=+9jB3o#; zP)l#&2Ve?1%YR#=zeuPJ^&pgd7XrPJh~j1itZbAzj>ZNF?~U%zGv4_I0_ zNFdVBAyq+jJKjF7%8cSC3l7oUD16)clC;XC@OCZz>+dlQ{n^@^gQ}_4^7k1h>z&wUjPx&4ZeJf9*rbm! z5CYf}Ll@Ra#~6B6dp7x;pq)hQxJ^xii?iC*p65QyJ=B&`BC^Xg89C$*AHK3E+;(>J zoJ+_6CP?@S`)c#>9XzNt9X7lVakD}#n^c_jRmCII)%1l?XE*Z^x^siCZs{ax1SL8- zRy@g}6_}0t3-!DP&*voakWx#J#w*DA5DS_fuIS(FUaal2T;P37(XJ7S7XM%%J3RtE z$bE+SR6PD-L9%0dhu-+uWMWt$equ!O$$6bu#=FmgMl`E_*>e@=(X%?1@ldZleqO`C zX<6L*i>2DkTQ98WeKy|gJEgvM&1*w2)W@ZuXjGw%030}q6$Ro7N5Q~uHP0|o<^^)Q zV~3e>XaYrv8?CQ@o8IY-;D8i(Zq!hqbIYv4mn`~)cAPD5vQF}J*pgmMzYzs9(O#?h zPZ3!WQoKZahiHv8>S@atsE40Y4Y83i4q}~=JPq>hNWr#ut`oGRk6)c4iI;iSqq<`Rv)$aQ=g z_ADu}T&h1M&t3d&_;Lfi)G>BbSWQ<|T1~IEar0-DZ_Bdwn)bG? zmm+ErGq`c|(3^e?^QTa`eSlJ6ly{a$)XiH#c53Yo)0EdujG&1tmI`g9gYcquy$Cz(^Xx=*zJ%fr{NN_EY|NZMFyZIeQh$$-o^J=HVN-VH~i{F_BiCzAK z(W$rADH!fbOyiv$|5csukvTp+^?xurAHy2jAB;}Ij$--G3QqZk1^TpKvr~ZJ2Kbxt znDh}J4S}qN*rzNbe-7P>p7a8;C2Os`n*cU7?nZgg_;V(4*Uc7DAx()!Q>yGh*{Ff9 zFw+9Lx4|iVhP6Xq=6|}o4JSo)Y|4sbQ<}(F*R5BLdwpYMOLnsA*^K%fal)}>A+Mf| zuBN;iN~k=q?ZLkh$pH;9$BQ(4{y4_MJ(v`oI{qM!06Vtd^rRIrlJ>)ln=>KMoyn@d zGpW7Dwq}dgZ$SU?(pwYC=~nLbqKTqmpFR9%yY>Ln-mZq@qrh3BJfyDgdo#3@&UY-& zbvQ5^;Mj7U-&3(0@HJ&&!f5%E7*W*@PuZDPVg%#|OO#s`Cu^a+y}Wx9eG2k+wxe3l z8Pj5xiD@g|=h114(E+)>RD{T~hxg2MfA6+ayc=5AIaXw6Ripgs>`HmEl22(9d&*@F zjwHYv6g6u5M&9*^^pL8Nr`oN8ZLgzQF8A~WG4+Kx+l&<6ci{B_YHqvP;1Yu(M?n2g zjXumE22*U>_3}K?&98^Z%&@+uxS%lSpMF7gv2Fh#gA`&6VB(!msnPF!iUK47{P*|A z{Tvg%9WC<5iA*sHviDP%e@|-eN07dL10ET}@aNc)J6Zw@ z-Wx;zhu*oPgK^+!Fb30mY5ztp`2Q7kw^F*BuKpv<)637v#`At^`oF?()@_1k?pTxW zE=cj$=1gKZl7I@H4Z~r$m-6pUocJ%sIudw4jPZ|Z2QVt21sPn5m;r7Q^Jn9~8`i%! z+LFT!Vi_^+Prq-^;LunyU^E3hHJ1J#iT}<=gnvm~q=e7>hw0w|NAnjGF+IG6mJZGp z`$vtr$7J!FcMO_$NCNvW#vlf`c^u^*{R88ufLV<2v^eHJblV*r$^oB`WBx~_e}4*p Z-z72{P8Uy$M+6`OWZ%WUG3;K%{{!6lf7t*4 diff --git a/examples/eSignature/eg042DocumentGeneration.ps1 b/examples/eSignature/eg042DocumentGeneration.ps1 index 5a7c2f5..3fe0ca7 100644 --- a/examples/eSignature/eg042DocumentGeneration.ps1 +++ b/examples/eSignature/eg042DocumentGeneration.ps1 @@ -30,7 +30,7 @@ $templateName = "Example document generation template" Write-Output "Sending the template create request to DocuSign..." # Fetch document and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\Offer_Letter_Demo.docx"))) > $doc1Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\Offer_Letter_Dynamic_Table.docx"))) > $doc1Base64 # Concatenate the different parts of the request #ds-snippet-start:eSign42Step2 @@ -198,15 +198,11 @@ $StartDate = Read-Host "Enter start date" $Salary = Read-Host "Enter salary" Write-Output "Choose job title" Write-Output "1 - Software Engineer" -Write-Output "2 - Product Manager" -Write-Output "3 - Sales Representative" +Write-Output "2 - Account Executive" $JobTitle = "Software Engineer" $JobNumber = Read-Host if ($JobNumber -eq "2") { - $JobTitle = "Product Manager" -} -elseif ($JobNumber -eq "3") { - $JobTitle = "Sales Representative" + $JobTitle = "Account Executive" } #ds-snippet-start:eSign42Step7 @@ -232,8 +228,34 @@ elseif ($JobNumber -eq "3") { value = "${StartDate}"; }; @{ - name = "Salary"; - value = "${Salary}"; + name = "Compensation_Package"; + type = "TableRow"; + rowValues = @( + @{ + docGenFormFieldList = @( + @{ + name = "Compensation_Component"; + value = "Salary"; + }; + @{ + name = "Details"; + value = "${Salary}"; + } + ) + }; + @{ + docGenFormFieldList = @( + @{ + name = "Compensation_Component"; + value = "Bonus"; + }; + @{ + name = "Details"; + value = "You will be eligible for a bonus of up to 20 percent based on your performance."; + } + ) + } + ) } ) } From 886980cd08b4a9b84d38a2c8082a8ea59768a3de Mon Sep 17 00:00:00 2001 From: Mykyta-Petrov Date: Wed, 10 Apr 2024 17:32:54 +0300 Subject: [PATCH 408/462] Update date anchor --- examples/eSignature/eg042DocumentGeneration.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/eSignature/eg042DocumentGeneration.ps1 b/examples/eSignature/eg042DocumentGeneration.ps1 index 3fe0ca7..1a94bd3 100644 --- a/examples/eSignature/eg042DocumentGeneration.ps1 +++ b/examples/eSignature/eg042DocumentGeneration.ps1 @@ -120,7 +120,7 @@ Invoke-RestMethod ` ); dateSignedTabs = @( @{ - anchorString = "Date"; + anchorString = "Date Signed"; anchorUnits = "pixels"; anchorYOffset = "-22"; }; From a13afa6549f8dcc6f004c2b8ac8df9fbbe727b09 Mon Sep 17 00:00:00 2001 From: Mykyta-Petrov Date: Fri, 12 Apr 2024 18:29:22 +0300 Subject: [PATCH 409/462] New and updated fields --- .../eSignature/eg042DocumentGeneration.ps1 | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/examples/eSignature/eg042DocumentGeneration.ps1 b/examples/eSignature/eg042DocumentGeneration.ps1 index 1a94bd3..a7b6ba7 100644 --- a/examples/eSignature/eg042DocumentGeneration.ps1 +++ b/examples/eSignature/eg042DocumentGeneration.ps1 @@ -195,7 +195,9 @@ Write-Output "Document ID ${documentId}." $CandidateName = Read-Host "Enter candidate name" $ManagerName = Read-Host "Enter manager name" $StartDate = Read-Host "Enter start date" -$Salary = Read-Host "Enter salary" +Write-Host "Enter salary: $" -NoNewLine +$Salary = Read-Host +$Rsus = Read-Host "Enter RSUs" Write-Output "Choose job title" Write-Output "1 - Software Engineer" Write-Output "2 - Account Executive" @@ -239,7 +241,7 @@ if ($JobNumber -eq "2") { }; @{ name = "Details"; - value = "${Salary}"; + value = "$" + "${Salary}"; } ) }; @@ -251,7 +253,19 @@ if ($JobNumber -eq "2") { }; @{ name = "Details"; - value = "You will be eligible for a bonus of up to 20 percent based on your performance."; + value = "20%"; + } + ) + }; + @{ + docGenFormFieldList = @( + @{ + name = "Compensation_Component"; + value = "RSUs"; + }; + @{ + name = "Details"; + value = $rsus; } ) } From 7f031e781920b64a69955ae2ea714c83557965ae Mon Sep 17 00:00:00 2001 From: inbargazit Date: Tue, 16 Apr 2024 08:38:03 -0700 Subject: [PATCH 410/462] small fix, Dynamic tables is 42 not 41 --- launcher.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/launcher.ps1 b/launcher.ps1 index c0ae1d8..1397060 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -473,7 +473,7 @@ function startSignature { Create_Signable_HTML_document = 38; Signing_In_Person = 39; Set_Document_Visibility = 40; - Document_Generation = 41; + Document_Generation = 42; Shared_Access = 43; Focused_View = 44; Pick_An_API = 45; From 54f4391d683f51d3bd1190e489539007a27d389b Mon Sep 17 00:00:00 2001 From: inbargazit Date: Tue, 16 Apr 2024 08:47:42 -0700 Subject: [PATCH 411/462] Update to eg042DocumentGeneration.ps1 to support dynamic tables --- .../Offer_Letter_Dynamic_Table.docx | Bin 0 -> 36681 bytes .../eSignature/eg042DocumentGeneration.ps1 | 58 ++++++++++++++---- launcher.ps1 | 2 +- 3 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 demo_documents/Offer_Letter_Dynamic_Table.docx diff --git a/demo_documents/Offer_Letter_Dynamic_Table.docx b/demo_documents/Offer_Letter_Dynamic_Table.docx new file mode 100644 index 0000000000000000000000000000000000000000..8c109beea0326ed2d92cd78cd2489bb52996c066 GIT binary patch literal 36681 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%0Av6P|nqe-e0Nb-m$v0QIe1hA` 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 $doc1Base64 +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\Offer_Letter_Dynamic_Table.docx"))) > $doc1Base64 # Concatenate the different parts of the request #ds-snippet-start:eSign42Step2 @@ -120,7 +120,7 @@ Invoke-RestMethod ` ); dateSignedTabs = @( @{ - anchorString = "Date"; + anchorString = "Date Signed"; anchorUnits = "pixels"; anchorYOffset = "-22"; }; @@ -195,18 +195,16 @@ Write-Output "Document ID ${documentId}." $CandidateName = Read-Host "Enter candidate name" $ManagerName = Read-Host "Enter manager name" $StartDate = Read-Host "Enter start date" -$Salary = Read-Host "Enter salary" +Write-Host "Enter salary: $" -NoNewLine +$Salary = Read-Host +$Rsus = Read-Host "Enter RSUs" Write-Output "Choose job title" Write-Output "1 - Software Engineer" -Write-Output "2 - Product Manager" -Write-Output "3 - Sales Representative" +Write-Output "2 - Account Executive" $JobTitle = "Software Engineer" $JobNumber = Read-Host if ($JobNumber -eq "2") { - $JobTitle = "Product Manager" -} -elseif ($JobNumber -eq "3") { - $JobTitle = "Sales Representative" + $JobTitle = "Account Executive" } #ds-snippet-start:eSign42Step7 @@ -232,8 +230,46 @@ elseif ($JobNumber -eq "3") { value = "${StartDate}"; }; @{ - name = "Salary"; - value = "${Salary}"; + name = "Compensation_Package"; + type = "TableRow"; + rowValues = @( + @{ + docGenFormFieldList = @( + @{ + name = "Compensation_Component"; + value = "Salary"; + }; + @{ + name = "Details"; + value = "$" + "${Salary}"; + } + ) + }; + @{ + docGenFormFieldList = @( + @{ + name = "Compensation_Component"; + value = "Bonus"; + }; + @{ + name = "Details"; + value = "20%"; + } + ) + }; + @{ + docGenFormFieldList = @( + @{ + name = "Compensation_Component"; + value = "RSUs"; + }; + @{ + name = "Details"; + value = $rsus; + } + ) + } + ) } ) } diff --git a/launcher.ps1 b/launcher.ps1 index c0ae1d8..1397060 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -473,7 +473,7 @@ function startSignature { Create_Signable_HTML_document = 38; Signing_In_Person = 39; Set_Document_Visibility = 40; - Document_Generation = 41; + Document_Generation = 42; Shared_Access = 43; Focused_View = 44; Pick_An_API = 45; From 0f2ad4887be3bcb07a941a848b444492111a7779 Mon Sep 17 00:00:00 2001 From: Mykyta-Petrov Date: Fri, 10 May 2024 17:24:17 +0300 Subject: [PATCH 412/462] Embedded sending update --- examples/eSignature/eg011EmbeddedSending.ps1 | 55 ++++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/examples/eSignature/eg011EmbeddedSending.ps1 b/examples/eSignature/eg011EmbeddedSending.ps1 index 118ded0..9c118e3 100644 --- a/examples/eSignature/eg011EmbeddedSending.ps1 +++ b/examples/eSignature/eg011EmbeddedSending.ps1 @@ -24,17 +24,18 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # The sending editor can be opened in either of two views: Enum ViewType { - TaggingView = 1; - RecipientsAndDocuments = 2; + Tagger = 1; + Prepare = 2; } $startingView = $null; do { Write-Output 'Select the initial sending view: ' - Write-Output "$([int][ViewType]::TaggingView) - Tagging view" - Write-Output "$([int][ViewType]::RecipientsAndDocuments) - Recipients and documents view" + Write-Output "$([int][ViewType]::Tagger) - Tagging view" + Write-Output "$([int][ViewType]::Prepare) - Prepare view" [int]$startingView = Read-Host "Please make a selection" } while (-not [ViewType]::IsDefined([ViewType], $startingView)); +[string]$startingView = [ViewType]::GetName([ViewType], $startingView) # Step 2. Create the envelope @@ -55,13 +56,19 @@ do { #ds-snippet-start:eSign11Step2 # temp files: $requestData = New-TemporaryFile +$senderViewRequestData = New-TemporaryFile $response = New-TemporaryFile $doc1Base64 = New-TemporaryFile $doc2Base64 = New-TemporaryFile $doc3Base64 = New-TemporaryFile # Fetch docs and encode -[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\doc_1.html"))) > $doc1Base64 +$doc1String = [System.IO.File]::ReadAllText((Resolve-Path ".\demo_documents\doc_1.html")) +$doc1String = $doc1String.Replace("{USER_EMAIL}", $SIGNER_EMAIL) +$doc1String = $doc1String.Replace("{USER_FULLNAME}", $SIGNER_NAME) +$doc1String = $doc1String.Replace("{CC_EMAIL}", $CC_EMAIL) +$doc1String = $doc1String.Replace("{CC_NAME}", $CC_NAME) +[Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($doc1String)) > $doc1Base64 [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 @@ -147,6 +154,36 @@ $envelopeId = $envelop.envelopeId Write-Output "Requesting the sender view url" +@{ + returnUrl = "http://httpbin.org/get"; + viewAccess = "envelope"; + settings = @{ + startingScreen = $startingView; + sendButtonAction = "send"; + showBackButton = "false"; + backButtonAction = "previousPage"; + showHeaderActions = "false"; + showDiscardAction = "false"; + lockToken = ""; + recipientSettings = @{ + showEditRecipients = "false"; + showContactsList = "false"; + }; + documentSettings = @{ + showEditDocuments = "false"; + showEditDocumentVisibility = "false"; + showEditPages = "false"; + }; + taggerSettings = @{ + paletteSections = "default"; + paletteDefault = "custom"; + }; + templateSettings = @{ + showMatchingTemplatesPrompt = "true"; + }; + }; +} | ConvertTo-Json -Depth 32 >> $senderViewRequestData + # The returnUrl is normally your own web app. DocuSign will redirect # the signer to returnUrl when the embedded sending completes. # For this example, we'll use http://httpbin.org/get to show the @@ -158,16 +195,11 @@ Invoke-RestMethod ` 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "application/json"; } ` - -Body (@{ returnUrl = "http://httpbin.org/get"; } | ConvertTo-Json) ` + -InFile (Resolve-Path $senderViewRequestData).Path ` -OutFile $response $sendingObj = $response | Get-Content | ConvertFrom-Json $sendingUrl = $sendingObj.url -# Next, we update the returned url if we want to start with the Recipient -# and Documents view -if ($startingView -eq [ViewType]::RecipientsAndDocuments) { - $sendingUrl = $sendingUrl -replace "send=1", "send=0" -} #ds-snippet-end:eSign11Step3 Write-Output "The embedded sending URL is ${sendingUrl}" @@ -177,6 +209,7 @@ Start-Process $sendingUrl # cleanup Remove-Item $requestData +Remove-Item $senderViewRequestData Remove-Item $response Remove-Item $doc1Base64 Remove-Item $doc2Base64 From ed5d63751475bd770770f0e78470c2dc7993dd05 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Wed, 5 Jun 2024 13:38:32 -0700 Subject: [PATCH 413/462] Update instructions for upload web form --- examples/WebForms/eg001CreateInstance.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/WebForms/eg001CreateInstance.ps1 b/examples/WebForms/eg001CreateInstance.ps1 index b9a9864..04170a5 100644 --- a/examples/WebForms/eg001CreateInstance.ps1 +++ b/examples/WebForms/eg001CreateInstance.ps1 @@ -19,7 +19,7 @@ $result = $webFormConfig -replace "template-id", $templateId $result | Set-Content -Path demo_documents\web-form-config.json Write-Host "" -Write-Host "Go to your DocuSign account to create the Web Form. Go to 'Forms' in your developer account, select 'New,' and choose 'Upload web form.' Upload the JSON config file 'web-form-config.json' found under the demo_documents folder of this project. You will need to activate the web form before proceeding. Press 1 to continue after doing so." +Write-Host "Go to your Docusign account to create the Web Form. Go to 'Templates' in your developer account, select 'Start,' select 'Web Forms,' and choose 'Upload Web Form.' Upload the JSON config file 'web-form-config.json' found under the demo_documents folder of this project. You will need to activate the web form before proceeding. Press Continue after doing so." $choice = Read-Host #ds-snippet-start:WebForms1Step2 From 0b9d906cbbceb8027f5ecb065394f9ecc083e6c1 Mon Sep 17 00:00:00 2001 From: annahileta Date: Wed, 12 Jun 2024 16:33:12 +0300 Subject: [PATCH 414/462] Added checks for email and user name for examples 20, 22 and 23 --- ...SigningViaEmailWithPhoneAuthentication.ps1 | 19 ++++++++++++++++--- ...aEmailWithKnowledgeBasedAuthentication.ps1 | 17 +++++++++++++++-- ...23SigningViaEmailWithIDVAuthentication.ps1 | 18 ++++++++++++++---- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 index 6b7b794..96734fd 100644 --- a/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 +++ b/examples/eSignature/eg020SigningViaEmailWithPhoneAuthentication.ps1 @@ -2,8 +2,6 @@ # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -$SIGNER_EMAIL = $variables.SIGNER_EMAIL -$SIGNER_NAME = $variables.SIGNER_NAME $PHONE_NUMBER = $variables.PHONE_NUMBER # Get the envelope's custom field data @@ -52,9 +50,24 @@ if ($null -eq $workflowId) throw "Please contact https://support.docusign.com to enable recipient phone authentication in your account." } -$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient authentication for the signer" +$isDataIncorrect = $true +while($isDataIncorrect) +{ + $SIGNER_NAME = Read-Host "Please enter name for the signer" + $SIGNER_EMAIL = Read-Host "Please enter email address for the signer" + + if ($SIGNER_EMAIL -eq $variables.SIGNER_EMAIL) { + Write-Output "" + Write-Output "For recipient authentication you must specify a different recipient from the account owner (sender) in order to ensure recipient authentication is performed." + Write-Output "" + } else { + $isDataIncorrect = $false + } +} +$SIGNER_COUNTRY_CODE = Read-Host "Please enter a country code for recipient authentication for the signer" $SIGNER_PHONE_NUMBER = Read-Host "Please enter a phone number for recipient authentication for the signer" + # Construct your envelope JSON body #ds-snippet-start:eSign20Step4 $body = @" diff --git a/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 b/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 index 3c53f1f..1d10b93 100644 --- a/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 +++ b/examples/eSignature/eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 @@ -2,8 +2,6 @@ # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json -$SIGNER_EMAIL = $variables.SIGNER_EMAIL -$SIGNER_NAME = $variables.SIGNER_NAME # Get the envelope's custom field data # This script uses the envelope ID stored in ../envelope_id. @@ -33,6 +31,21 @@ $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") #ds-snippet-end:eSign22Step2 +$isDataIncorrect = $true +while($isDataIncorrect) +{ + $SIGNER_NAME = Read-Host "Please enter name for the signer" + $SIGNER_EMAIL = Read-Host "Please enter email address for the signer" + + if ($SIGNER_EMAIL -eq $variables.SIGNER_EMAIL) { + Write-Output "" + Write-Output "For recipient authentication you must specify a different recipient from the account owner (sender) in order to ensure recipient authentication is performed." + Write-Output "" + } else { + $isDataIncorrect = $false + } +} + # Construct your envelope JSON body #ds-snippet-start:eSign22Step3 $body = @" diff --git a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 index 32f1677..f6414a6 100644 --- a/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 +++ b/examples/eSignature/eg023SigningViaEmailWithIDVAuthentication.ps1 @@ -38,7 +38,6 @@ $headers.add("Accept-Language", "en-US,en;q=0.9") # - Obtain your workflow ID #ds-snippet-start:eSign23Step3 $uri = "https://demo.docusign.net/restapi/v2.1/accounts/$APIAccountId/identity_verification" - Write-Output "Attempting to retrieve your account's workflow ID" Write-Output "Response:" @@ -53,9 +52,20 @@ if ($null -eq $workflowId) throw "Please contact https://support.docusign.com to enable IDV in your account." } -$SIGNER_NAME = Read-Host "Please enter name for the signer" - -$SIGNER_EMAIL = Read-Host "Please enter email address for the signer" +$isDataIncorrect = $true +while($isDataIncorrect) +{ + $SIGNER_NAME = Read-Host "Please enter name for the signer" + $SIGNER_EMAIL = Read-Host "Please enter email address for the signer" + + if ($SIGNER_EMAIL -eq $variables.SIGNER_EMAIL) { + Write-Output "" + Write-Output "For recipient authentication you must specify a different recipient from the account owner (sender) in order to ensure recipient authentication is performed." + Write-Output "" + } else { + $isDataIncorrect = $false + } +} # - Construct your envelope JSON body # Note: If you did not successfully obtain your workflow ID, this step will fail. From 58b04233c75f2f6fb8bf665168a994adcb699d9a Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 25 Jun 2024 15:31:24 -0700 Subject: [PATCH 415/462] Update README.md Signed-off-by: Inbar Gazit --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 80deee8..61d6abc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ # PowerShell Launcher Code Examples +> +>### PLEASE! Share your feedback in a [two questions survey](https://docs.google.com/forms/d/e/1FAIpQLScPa74hwhJwi7XWDDj4-XZVOQTF9jJWgbIFEpulXokCqYWT4A/viewform?usp=pp_url&entry.680551577=PowerShell). +> +> ### GitHub repo: [code-examples-powershell](./README.md) -This GitHub repo includes code examples for the DocuSign Admin API, Click API, eSignature REST API, ID Evidence API, Monitor API, Notary API, and Rooms API. To switch between API code examples, select the desired option from the menu when prompted. +This GitHub repo includes code examples for the [Web Forms API](https://developers.docusign.com/docs/web-forms-api/), [Maestro API](https://developers.docusign.com/docs/maestro-api/), [Docusign Admin API](https://developers.docusign.com/docs/admin-api/), [Click API](https://developers.docusign.com/docs/click-api/), [eSignature REST API](https://developers.docusign.com/docs/esign-rest-api/), [Monitor API](https://developers.docusign.com/docs/monitor-api/), and [Rooms API](https://developers.docusign.com/docs/rooms-api/). ## Introduction From 56f5de8efe7b5ca5e65761028751e5586e7fa250 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Tue, 25 Jun 2024 18:17:41 -0700 Subject: [PATCH 416/462] Update README.md Signed-off-by: Inbar Gazit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61d6abc..8fd2072 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # PowerShell Launcher Code Examples > ->### PLEASE! Share your feedback in a [two questions survey](https://docs.google.com/forms/d/e/1FAIpQLScPa74hwhJwi7XWDDj4-XZVOQTF9jJWgbIFEpulXokCqYWT4A/viewform?usp=pp_url&entry.680551577=PowerShell). +>### PLEASE! Share your feedback in a [two-question survey](https://docs.google.com/forms/d/e/1FAIpQLScPa74hwhJwi7XWDDj4-XZVOQTF9jJWgbIFEpulXokCqYWT4A/viewform?usp=pp_url&entry.680551577=PowerShell). > > ### GitHub repo: [code-examples-powershell](./README.md) From a574d8b56916ba3b2dec0eeaed25f2e4233a2700 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Tue, 25 Jun 2024 18:19:17 -0700 Subject: [PATCH 417/462] Updating the README file --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 80deee8..8fd2072 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ # PowerShell Launcher Code Examples +> +>### PLEASE! Share your feedback in a [two-question survey](https://docs.google.com/forms/d/e/1FAIpQLScPa74hwhJwi7XWDDj4-XZVOQTF9jJWgbIFEpulXokCqYWT4A/viewform?usp=pp_url&entry.680551577=PowerShell). +> +> ### GitHub repo: [code-examples-powershell](./README.md) -This GitHub repo includes code examples for the DocuSign Admin API, Click API, eSignature REST API, ID Evidence API, Monitor API, Notary API, and Rooms API. To switch between API code examples, select the desired option from the menu when prompted. +This GitHub repo includes code examples for the [Web Forms API](https://developers.docusign.com/docs/web-forms-api/), [Maestro API](https://developers.docusign.com/docs/maestro-api/), [Docusign Admin API](https://developers.docusign.com/docs/admin-api/), [Click API](https://developers.docusign.com/docs/click-api/), [eSignature REST API](https://developers.docusign.com/docs/esign-rest-api/), [Monitor API](https://developers.docusign.com/docs/monitor-api/), and [Rooms API](https://developers.docusign.com/docs/rooms-api/). ## Introduction From 8ef3758ce78d9315508585cc7aca95497079d0ce Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Fri, 19 Jul 2024 12:08:37 +0300 Subject: [PATCH 418/462] add Invoke-Script function --- Quick_ACG/launcherACG.ps1 | 6 +- examples/Maestro/createWorkflowUtils.ps1 | 4 +- examples/Maestro/eg001TriggerWorkflow.ps1 | 6 +- examples/WebForms/eg001CreateInstance.ps1 | 4 +- examples/eSignature/eg043SharedAccess.ps1 | 4 +- launcher.ps1 | 232 +++++++++++----------- utils/invokeScript.ps1 | 28 +++ utils/sharedAccess.ps1 | 6 +- 8 files changed, 166 insertions(+), 124 deletions(-) create mode 100644 utils/invokeScript.ps1 diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 index e859a57..0da0a0c 100644 --- a/Quick_ACG/launcherACG.ps1 +++ b/Quick_ACG/launcherACG.ps1 @@ -1,3 +1,5 @@ +. "..\utils\invokeScript.ps1" + $ErrorActionPreference = "Stop" # force stop on failure $configFile = "..\config\settings.json" @@ -15,11 +17,11 @@ function startQuickACG { Write-Output '' Write-Output "Authentication in progress, please wait" Write-Output '' - powershell.exe -Command ..\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) + Invoke-Script -Command "`"..\OAuth\code_grant.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID)" Write-Output '' if ((Test-Path "../config/ds_access_token.txt") -eq $true) { - powershell.exe -Command ..\eg001EmbeddedSigning.ps1 + Invoke-Script -Command "`"..\eg001EmbeddedSigning.ps1`"" Write-Output '' startSignature } diff --git a/examples/Maestro/createWorkflowUtils.ps1 b/examples/Maestro/createWorkflowUtils.ps1 index 94e2cdc..e7cf7fa 100644 --- a/examples/Maestro/createWorkflowUtils.ps1 +++ b/examples/Maestro/createWorkflowUtils.ps1 @@ -1,7 +1,9 @@ +. "utils\invokeScript.ps1" + # Check that we have a template id if (-not (Test-Path .\config\TEMPLATE_ID)) { Write-Output "Creating template" - powershell.exe .\examples\eSignature\eg008CreateTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg008CreateTemplate.ps1`"" } $templateId = Get-Content "config/TEMPLATE_ID" diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index 551ae24..7a54e84 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -1,7 +1,9 @@ +. "utils\invokeScript.ps1" + # Trigger a workflow if (-not (Test-Path .\config\WORKFLOW_ID)) { - # create workflow - powershell.exe .\examples\Maestro\createWorkflowUtils.ps1 + # create workflow + Invoke-Script -Command "`".\examples\Maestro\createWorkflowUtils.ps1`"" } $workflowId = Get-Content .\config\WORKFLOW_ID diff --git a/examples/WebForms/eg001CreateInstance.ps1 b/examples/WebForms/eg001CreateInstance.ps1 index b9a9864..c91f328 100644 --- a/examples/WebForms/eg001CreateInstance.ps1 +++ b/examples/WebForms/eg001CreateInstance.ps1 @@ -1,3 +1,5 @@ +. "utils\invokeScript.ps1" + $apiUri = "https://apps-d.docusign.com/api/webforms/v1.1" $configPath = ".\config\settings.json" $tokenPath = ".\config\ds_access_token.txt" @@ -10,7 +12,7 @@ $accessToken = Get-Content $tokenPath $accountId = Get-Content $accountIdPath # Create template for the Web Form from the API -powershell.exe -Command .\utils\createWebFormTemplate.ps1 +Invoke-Script -Command "`".\utils\createWebFormTemplate.ps1`"" $templateId = Get-Content -Path ".\config\WEB_FORM_TEMPLATE_ID" diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 index 274fd4c..6552d72 100644 --- a/examples/eSignature/eg043SharedAccess.ps1 +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -1,3 +1,5 @@ +. "utils\invokeScript.ps1" + $apiUri = "https://demo.docusign.net/restapi" $accountUri = "https://account-d.docusign.com" @@ -168,7 +170,7 @@ if ($choice -ne "1") { exit 1 } -powershell.exe -Command .\utils\sharedAccess.ps1 +Invoke-Script -Command "`".\utils\sharedAccess.ps1`"" #ds-snippet-start:eSign43Step5 try { diff --git a/launcher.ps1 b/launcher.ps1 index c0ae1d8..95274a8 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1,3 +1,5 @@ +. "utils\invokeScript.ps1" + $ErrorActionPreference = "Stop" # force stop on failure $configFile = ".\config\settings.json" @@ -114,11 +116,11 @@ function startLauncher { Write-Output '' Write-Output "Quickstart Enabled, please wait" write-Output '' - powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) + Invoke-Script -Command "`".\OAuth\code_grant.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID)" if ((Test-Path "./config/ds_access_token.txt") -eq $true) { - powershell.exe -Command .\eg001EmbeddedSigning.ps1 + Invoke-Script -Command "`".\eg001EmbeddedSigning.ps1`"" # This is to prevent getting stuck on the # first example after trying it the first time @@ -207,13 +209,13 @@ function startAuth ($apiVersion) { startLauncher } elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { - powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID) + Invoke-Script -Command "`".\OAuth\code_grant.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID)" if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } } elseif ($AuthTypeView -eq [AuthType]::JWT) { - powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID) + Invoke-Script -Command "`".\OAuth\jwt.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID)" if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } @@ -328,104 +330,104 @@ function startCFRSignature { } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); if ($ApiExamplesView -eq [ApiExamples]::Embedded_Signing_CFR) { - powershell.exe -Command .\examples\eSignature\eg041EmbeddedSigningCFR.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg041EmbeddedSigningCFR.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email) { checkEmailAddresses - powershell.exe -Command .\examples\eSignature\eg002SigningViaEmail.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg002SigningViaEmail.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::List_Envelopes) { - powershell.exe -Command .\examples\eSignature\eg003ListEnvelopes.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg003ListEnvelopes.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Info) { - powershell.exe -Command .\examples\eSignature\eg004EnvelopeInfo.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg004EnvelopeInfo.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Recipients) { - powershell.exe .\examples\eSignature\eg005EnvelopeRecipients.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg005EnvelopeRecipients.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Docs) { - powershell.exe .\examples\eSignature\eg006EnvelopeDocs.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg006EnvelopeDocs.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Get_Doc) { - powershell.exe .\examples\eSignature\eg007EnvelopeGetDoc.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg007EnvelopeGetDoc.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Create_Template) { - powershell.exe .\examples\eSignature\eg008CreateTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg008CreateTemplate.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Use_Template) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg009UseTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg009UseTemplate.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Send_Binary_Docs) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg010SendBinaryDocs.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg010SendBinaryDocs.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Sending) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg011EmbeddedSending.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg011EmbeddedSending.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Console) { - powershell.exe .\examples\eSignature\eg012EmbeddedConsole.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg012EmbeddedConsole.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Add_Doc_To_Template) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg013AddDocToTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg013AddDocToTemplate.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Tab_Data) { - powershell.exe .\examples\eSignature\eg015EnvelopeTabData.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg015EnvelopeTabData.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Set_Tab_Values) { - powershell.exe .\examples\eSignature\eg016SetTabValues.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg016SetTabValues.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Set_Template_Tab_Values) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg017SetTemplateTabValues.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg017SetTemplateTabValues.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Custom_Field_Data) { - powershell.exe .\examples\eSignature\eg018EnvelopeCustomFieldData.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg018EnvelopeCustomFieldData.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Access_Code) { - powershell.exe .\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { - powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_IDV_Authentication) { - powershell.exe .\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Creating_Permission_Profiles) { - powershell.exe .\examples\eSignature\eg024CreatingPermissionProfiles.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg024CreatingPermissionProfiles.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Setting_Permission_Profiles) { - powershell.exe .\examples\eSignature\eg025SettingPermissionProfiles.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg025SettingPermissionProfiles.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Updating_Individual_Permission) { - powershell.exe .\examples\eSignature\eg026UpdatingIndividualPermission.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg026UpdatingIndividualPermission.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Deleting_Permissions) { - powershell.exe .\examples\eSignature\eg027DeletingPermissions.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg027DeletingPermissions.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Creating_A_Brand) { - powershell.exe .\examples\eSignature\eg028CreatingABrand.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg028CreatingABrand.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Applying_Brand_Envelope) { - powershell.exe .\examples\eSignature\eg029ApplyingBrandEnvelope.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg029ApplyingBrandEnvelope.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Applying_Brand_Template) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg030ApplyingBrandTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg030ApplyingBrandTemplate.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Bulk_Sending) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg031BulkSending.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg031BulkSending.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Scheduled_Sending) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg035ScheduledSending.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg035ScheduledSending.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Create_Signable_HTML_document) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg038ResponsiveSigning.ps1`"" } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher @@ -530,150 +532,150 @@ function startSignature { } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); if ($ApiExamplesView -eq [ApiExamples]::Embedded_Signing) { - powershell.exe -Command .\eg001EmbeddedSigning.ps1 + Invoke-Script -Command "`".\eg001EmbeddedSigning.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email) { checkEmailAddresses - powershell.exe -Command .\examples\eSignature\eg002SigningViaEmail.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg002SigningViaEmail.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::List_Envelopes) { - powershell.exe -Command .\examples\eSignature\eg003ListEnvelopes.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg003ListEnvelopes.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Info) { - powershell.exe -Command .\examples\eSignature\eg004EnvelopeInfo.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg004EnvelopeInfo.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Recipients) { - powershell.exe .\examples\eSignature\eg005EnvelopeRecipients.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg005EnvelopeRecipients.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Docs) { - powershell.exe .\examples\eSignature\eg006EnvelopeDocs.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg006EnvelopeDocs.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Get_Doc) { - powershell.exe .\examples\eSignature\eg007EnvelopeGetDoc.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg007EnvelopeGetDoc.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Create_Template) { - powershell.exe .\examples\eSignature\eg008CreateTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg008CreateTemplate.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Use_Template) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg009UseTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg009UseTemplate.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Send_Binary_Docs) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg010SendBinaryDocs.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg010SendBinaryDocs.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Sending) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg011EmbeddedSending.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg011EmbeddedSending.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Embedded_Console) { - powershell.exe .\examples\eSignature\eg012EmbeddedConsole.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg012EmbeddedConsole.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Add_Doc_To_Template) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg013AddDocToTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg013AddDocToTemplate.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Collect_Payment) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg014CollectPayment.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg014CollectPayment.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Tab_Data) { - powershell.exe .\examples\eSignature\eg015EnvelopeTabData.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg015EnvelopeTabData.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Set_Tab_Values) { - powershell.exe .\examples\eSignature\eg016SetTabValues.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg016SetTabValues.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Set_Template_Tab_Values) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg017SetTemplateTabValues.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg017SetTemplateTabValues.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Envelope_Custom_Field_Data) { - powershell.exe .\examples\eSignature\eg018EnvelopeCustomFieldData.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg018EnvelopeCustomFieldData.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Access_Code) { - powershell.exe .\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg019SigningViaEmailWithAccessCode.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Phone_Authentication) { - powershell.exe .\examples\eSignature\eg020SigningViaEmailWithPhoneAuthentication.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg020SigningViaEmailWithPhoneAuthentication.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_Knowledge_Based_Authentication) { - powershell.exe .\examples\eSignature\eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg022SigningViaEmailWithKnowledgeBasedAuthentication.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_Via_Email_With_IDV_Authentication) { - powershell.exe .\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg023SigningViaEmailWithIDVAuthentication.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Creating_Permission_Profiles) { - powershell.exe .\examples\eSignature\eg024CreatingPermissionProfiles.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg024CreatingPermissionProfiles.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Setting_Permission_Profiles) { - powershell.exe .\examples\eSignature\eg025SettingPermissionProfiles.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg025SettingPermissionProfiles.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Updating_Individual_Permission) { - powershell.exe .\examples\eSignature\eg026UpdatingIndividualPermission.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg026UpdatingIndividualPermission.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Deleting_Permissions) { - powershell.exe .\examples\eSignature\eg027DeletingPermissions.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg027DeletingPermissions.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Creating_A_Brand) { - powershell.exe .\examples\eSignature\eg028CreatingABrand.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg028CreatingABrand.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Applying_Brand_Envelope) { - powershell.exe .\examples\eSignature\eg029ApplyingBrandEnvelope.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg029ApplyingBrandEnvelope.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Applying_Brand_Template) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg030ApplyingBrandTemplate.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg030ApplyingBrandTemplate.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Bulk_Sending) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg031BulkSending.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg031BulkSending.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Pause_Signature_Workflow) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg032PauseSignatureWorkflow.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg032PauseSignatureWorkflow.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Unpause_Signature_Workflow) { - powershell.exe .\examples\eSignature\eg033UnpauseSignatureWorkflow.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg033UnpauseSignatureWorkflow.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Use_Conditional_Recipients) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg034UseConditionalRecipients.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg034UseConditionalRecipients.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Scheduled_Sending) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg035ScheduledSending.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg035ScheduledSending.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Delayed_Routing) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg036DelayedRouting.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg036DelayedRouting.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::SMS_or_WhatsApp) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg037SMSDelivery.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg037SMSDelivery.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Create_Signable_HTML_document) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg038ResponsiveSigning.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg038ResponsiveSigning.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Signing_In_Person) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg039SigningInPerson.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg039SigningInPerson.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Set_Document_Visibility) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg040SetDocumentVisibility.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg040SetDocumentVisibility.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Document_Generation) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg042DocumentGeneration.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg042DocumentGeneration.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Shared_Access) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg043SharedAccess.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg043SharedAccess.ps1`"" } elseif ($ApiExamplesView -eq [ApiExamples]::Focused_View) { checkEmailAddresses - powershell.exe .\examples\eSignature\eg044FocusedView.ps1 + Invoke-Script -Command "`".\examples\eSignature\eg044FocusedView.ps1`"" } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher @@ -711,31 +713,31 @@ function startRooms { } while (-not [listRoomExamples]::IsDefined([listRoomExamples], $listRoomExamplesView)); if ($listRoomExamplesView -eq [listRoomExamples]::CreateRoomWithDataController) { - powershell.exe -Command .\examples\Rooms\eg001CreateRoomWithDataController.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg001CreateRoomWithDataController.ps1`"" } elseif ($listRoomExamplesView -eq [listRoomExamples]::CreateRoomWithTemplateController) { - powershell.exe -Command .\examples\Rooms\eg002CreateRoomWithTemplateController.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg002CreateRoomWithTemplateController.ps1`"" } elseif ($listRoomExamplesView -eq [listRoomExamples]::ExportDataFromRoomController) { - powershell.exe -Command .\examples\Rooms\eg003ExportDataFromRoomController.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg003ExportDataFromRoomController.ps1`"" } elseif ($listRoomExamplesView -eq [listRoomExamples]::AddFormsToRoomController) { - powershell.exe -Command .\examples\Rooms\eg004AddFormsToRoomController.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg004AddFormsToRoomController.ps1`"" } elseif ($listRoomExamplesView -eq [listRoomExamples]::GetRoomsWithFiltersController) { - powershell.exe -Command .\examples\Rooms\eg005GetRoomsWithFiltersController.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg005GetRoomsWithFiltersController.ps1`"" } elseif ($listRoomExamplesView -eq [listRoomExamples]::CreateAnExternalFormFillSessionController) { - powershell.exe -Command .\examples\Rooms\eg006CreateAnExternalFormFillSessionController.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg006CreateAnExternalFormFillSessionController.ps1`"" } elseif ($listRoomExamplesView -eq [listRoomExamples]::CreateFormGroup) { - powershell.exe -Command .\examples\Rooms\eg007CreateFormGroup.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg007CreateFormGroup.ps1`"" } elseif ($listRoomExamplesView -eq [listRoomExamples]::AccessFormGroup) { - powershell.exe -Command .\examples\Rooms\eg008AccessFormGroup.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg008AccessFormGroup.ps1`"" } elseif ($listRoomExamplesView -eq [listRoomExamples]::AssignFormGroup) { - powershell.exe -Command .\examples\Rooms\eg009AssignFormGroup.ps1 + Invoke-Script -Command "`".\examples\Rooms\eg009AssignFormGroup.ps1`"" } } until ($listRoomExamplesView -eq [listRoomExamples]::Pick_An_API) startLauncher @@ -767,22 +769,22 @@ function startClick { } while (-not [listClickExamples]::IsDefined([listClickExamples], $listClickExamplesView)); if ($listClickExamplesView -eq [listClickExamples]::createClickwrap) { - powershell.exe -Command .\examples\Click\eg001CreateClickwrap.ps1 + Invoke-Script -Command "`".\examples\Click\eg001CreateClickwrap.ps1`"" } elseif ($listClickExamplesView -eq [listClickExamples]::activateClickwrap) { - powershell.exe -Command .\examples\Click\eg002ActivateClickwrap.ps1 + Invoke-Script -Command "`".\examples\Click\eg002ActivateClickwrap.ps1`"" } elseif ($listClickExamplesView -eq [listClickExamples]::clickwrapVersioning) { - powershell.exe -Command .\examples\Click\eg003CreateNewClickwrapVersion.ps1 + Invoke-Script -Command "`".\examples\Click\eg003CreateNewClickwrapVersion.ps1`"" } elseif ($listClickExamplesView -eq [listClickExamples]::retrieveClickwraps) { - powershell.exe -Command .\examples\Click\eg004GetListOfClickwraps.ps1 + Invoke-Script -Command "`".\examples\Click\eg004GetListOfClickwraps.ps1`"" } elseif ($listClickExamplesView -eq [listClickExamples]::getClickwrapResponses) { - powershell.exe -Command .\examples\Click\eg005GetClickwrapResponses.ps1 + Invoke-Script -Command "`".\examples\Click\eg005GetClickwrapResponses.ps1`"" } elseif ($listClickExamplesView -eq [listClickExamples]::embedClickwrap) { - powershell.exe -Command .\examples\Click\eg006EmbedClickwrap.ps1 + Invoke-Script -Command "`".\examples\Click\eg006EmbedClickwrap.ps1`"" } } until ($listClickExamplesView -eq [listClickExamples]::Pick_An_API) startLauncher @@ -804,9 +806,9 @@ function startMonitor { } while (-not [listMonitorExamples]::IsDefined([listMonitorExamples], $listMonitorExamplesView)); if ($listMonitorExamplesView -eq [listMonitorExamples]::getMonitoringData) { - powershell.exe -Command .\examples\Monitor\eg001getMonitoringData.ps1 + Invoke-Script -Command "`".\examples\Monitor\eg001getMonitoringData.ps1`"" } elseif ($listMonitorExamplesView -eq [listMonitorExamples]::postWebQuery) { - powershell.exe -Command .\examples\Monitor\eg002WebQueryEndpoint.ps1 + Invoke-Script -Command "`".\examples\Monitor\eg002WebQueryEndpoint.ps1`"" } } until ($listMonitorExamplesView -eq [listMonitorExamples]::Pick_An_API) startLauncher @@ -851,53 +853,53 @@ function startAdmin { if ($listAdminExamplesView -eq [listAdminExamples]::createNewUserWithActiveStatus) { checkOrgId - powershell.exe -Command .\examples\Admin\eg001CreateNewUserWithActiveStatus.ps1 + Invoke-Script -Command "`".\examples\Admin\eg001CreateNewUserWithActiveStatus.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::createActiveCLMEsignUser) { checkOrgId - powershell.exe -Command .\examples\Admin\eg002createActiveCLMEsignUser.ps1 + Invoke-Script -Command "`".\examples\Admin\eg002createActiveCLMEsignUser.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::bulkExportUserData) { checkOrgId - powershell.exe -Command .\examples\Admin\eg003BulkExportUserData.ps1 + Invoke-Script -Command "`".\examples\Admin\eg003BulkExportUserData.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::addUsersViaBulkImport) { checkOrgId - powershell.exe -Command .\examples\Admin\eg004AddUsersViaBulkImport.ps1 + Invoke-Script -Command "`".\examples\Admin\eg004AddUsersViaBulkImport.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::auditUsers) { checkOrgId - powershell.exe -Command .\examples\Admin\eg005AuditUsers.ps1 + Invoke-Script -Command "`".\examples\Admin\eg005AuditUsers.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::getUserDSProfilesByEmail) { checkOrgId - powershell.exe -Command .\examples\Admin\eg006GetUserProfileByEmail.ps1 + Invoke-Script -Command "`".\examples\Admin\eg006GetUserProfileByEmail.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::getUserProfileByUserId) { checkOrgId - powershell.exe -Command .\examples\Admin\eg007GetUserProfileByUserId.ps1 + Invoke-Script -Command "`".\examples\Admin\eg007GetUserProfileByUserId.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::updateUserProductPermissionProfile) { checkOrgId - powershell.exe -Command .\examples\Admin\eg008UpdateUserProductPermissionProfile.ps1 + Invoke-Script -Command "`".\examples\Admin\eg008UpdateUserProductPermissionProfile.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::deleteUserProductPermissionProfile) { checkOrgId - powershell.exe -Command .\examples\Admin\eg009DeleteUserProductPermissionProfile.ps1 + Invoke-Script -Command "`".\examples\Admin\eg009DeleteUserProductPermissionProfile.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::deleteUserDataFromOrganization) { checkOrgId - powershell.exe -Command .\examples\Admin\eg010DeleteUserDataFromOrganization.ps1 + Invoke-Script -Command "`".\examples\Admin\eg010DeleteUserDataFromOrganization.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::deleteUserDataFromAccount) { checkOrgId - powershell.exe -Command .\examples\Admin\eg011DeleteUserDataFromAccount.ps1 + Invoke-Script -Command "`".\examples\Admin\eg011DeleteUserDataFromAccount.ps1`"" } elseif ($listAdminExamplesView -eq [listAdminExamples]::cloneAccount) { checkOrgId - powershell.exe -Command .\examples\Admin\eg012CloneAccount.ps1 + Invoke-Script -Command "`".\examples\Admin\eg012CloneAccount.ps1`"" } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher @@ -921,9 +923,9 @@ function startID_Evidence { } while (-not [listID_EvidenceExamples]::IsDefined([listID_EvidenceExamples], $listID_EvidenceExamplesView)); if ($listID_EvidenceExamplesView -eq [listID_EvidenceExamples]::retrieveEvents) { - powershell.exe -Command .\examples\ID_Evidence\retrieveEvents.ps1 + Invoke-Script -Command "`".\examples\ID_Evidence\retrieveEvents.ps1`"" } elseif ($listID_EvidenceExamplesView -eq [listID_EvidenceExamples]::retrieveMedia) { - powershell.exe -Command .\examples\ID_Evidence\retrieveMedia.ps1 + Invoke-Script -Command "`".\examples\ID_Evidence\retrieveMedia.ps1`"" } } until ($listID_EvidenceExamplesView -eq [listID_EvidenceExamples]::Pick_An_API) startLauncher @@ -949,13 +951,13 @@ function startNotary { } while (-not [listNotaryExamples]::IsDefined([listNotaryExamples], $listNotaryExamplesView)); # if ($listNotaryExamplesView -eq [listNotaryExamples]::jurisdictions) { - # powershell.exe -Command .\examples\Notary\Jurisdictions.ps1 + # Invoke-Script -Command "`".\examples\Notary\Jurisdictions.ps1`"" if ($listNotaryExamplesView -eq [listNotaryExamples]::signatureRequestToNotaryGroup) { - powershell.exe -Command .\examples\Notary\signatureRequestToNotaryGroup.ps1 + Invoke-Script -Command "`".\examples\Notary\signatureRequestToNotaryGroup.ps1`"" } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::inviteNotaryToPool) { - powershell.exe -Command .\examples\Notary\inviteNotaryToPool.ps1 + Invoke-Script -Command "`".\examples\Notary\inviteNotaryToPool.ps1" } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::jurisdictions) { - powershell.exe -Command .\examples\Notary\Jurisdictions.ps1 + Invoke-Script -Command "`".\examples\Notary\Jurisdictions.ps1`"" } } until ($listNotaryExamplesView -eq [listNotaryExamples]::Pick_An_API) startLauncher @@ -977,7 +979,7 @@ function startWebForms { } while (-not [listWebFormsExamples]::IsDefined([listWebFormsExamples], $listWebFormsExamplesView)); if ($listWebFormsExamplesView -eq [listWebFormsExamples]::createInstance) { - powershell.exe -Command .\examples\WebForms\eg001CreateInstance.ps1 + Invoke-Script -Command "`".\examples\WebForms\eg001CreateInstance.ps1`"" } } until ($listWebFormsExamplesView -eq [listWebFormsExamples]::Pick_An_API) startLauncher @@ -1003,15 +1005,15 @@ function startMaestro { } while (-not [listMaestroExamples]::IsDefined([listMaestroExamples], $listMaestroExamplesView)); if ($listMaestroExamplesView -eq [listMaestroExamples]::triggerWorkflow) { - powershell.exe -Command .\examples\Maestro\eg001TriggerWorkflow.ps1 + Invoke-Script -Command "`".\examples\Maestro\eg001TriggerWorkflow.ps1`"" } elseif ($listMaestroExamplesView -eq [listMaestroExamples]::cancelWorkflow) { - powershell.exe -Command .\examples\Maestro\eg002CancelWorkflow.ps1 + Invoke-Script -Command "`".\examples\Maestro\eg002CancelWorkflow.ps1`"" } elseif ($listMaestroExamplesView -eq [listMaestroExamples]::getWorkflowStatus) { - powershell.exe -Command .\examples\Maestro\eg003GetWorkflowStatus.ps1 + Invoke-Script -Command "`".\examples\Maestro\eg003GetWorkflowStatus.ps1`"" } } until ($listMaestroExamplesView -eq [listMaestroExamples]::Pick_An_API) diff --git a/utils/invokeScript.ps1 b/utils/invokeScript.ps1 new file mode 100644 index 0000000..35069a6 --- /dev/null +++ b/utils/invokeScript.ps1 @@ -0,0 +1,28 @@ +function Invoke-Script { + param ( + [string]$Command + ) + + # Get the path to the PowerShell executable + $powershellPath = if ($IsWindows) { + try { + (Get-Command powershell.exe -ErrorAction Stop).Source + } catch { + "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" + } + } else { + try { + (Get-Command pwsh -ErrorAction Stop).Source + } catch { + "/usr/local/bin/pwsh" + } + } + + $powershellPath = $powershellPath -replace ' ', '` ' # add ` if the path has spaces + + # Execute the script using the appropriate PowerShell executable + $fullCommand = "$powershellPath -File $Command" + + # Execute the command + Invoke-Expression $fullCommand +} diff --git a/utils/sharedAccess.ps1 b/utils/sharedAccess.ps1 index 96dd766..86d1a18 100644 --- a/utils/sharedAccess.ps1 +++ b/utils/sharedAccess.ps1 @@ -1,3 +1,5 @@ +. "utils\invokeScript.ps1" + $configFile = ".\config\settings.json" if ((Test-Path $configFile) -eq $False) { @@ -29,13 +31,13 @@ if ($AuthTypeView -eq [AuthType]::Exit) { exit 1; } elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { - powershell.exe -Command .\OAuth\code_grant.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) + Invoke-Script -Command "`".\OAuth\code_grant.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID)" if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } } elseif ($AuthTypeView -eq [AuthType]::JWT) { - powershell.exe -Command .\OAuth\jwt.ps1 -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID) + Invoke-Script -Command "`".\OAuth\jwt.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID)" if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } From 46c07afd5e0dea12704a98bddfa7e5e0f888614a Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Fri, 19 Jul 2024 12:56:56 +0300 Subject: [PATCH 419/462] fixes for Mac --- OAuth/code_grant.ps1 | 2 +- OAuth/jwt.ps1 | 2 +- Quick_ACG/launcherACG.ps1 | 6 +++--- examples/Maestro/createWorkflowUtils.ps1 | 2 +- examples/Maestro/eg001TriggerWorkflow.ps1 | 2 +- examples/WebForms/eg001CreateInstance.ps1 | 2 +- examples/eSignature/eg043SharedAccess.ps1 | 2 +- launcher.ps1 | 8 ++++---- utils/sharedAccess.ps1 | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 5caa861..48d5cdc 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -140,7 +140,7 @@ try { -Method "GET" ` -Headers @{ "Authorization" = "Bearer $accessToken" } - if ($targetAccountId -ne "TARGET_ACCOUNT_ID") { + if ($targetAccountId -ne "TARGET_ACCOUNT_ID" -and $targetAccountId -ne "{TARGET_ACCOUNT_ID}") { $targetAccountFound = "false"; foreach ($account_info in $userInfoResponse.accounts) { if ($account_info.account_id -eq $targetAccountId) { diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 5ad8cd9..036ee76 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -128,7 +128,7 @@ try { -Method "GET" ` -Headers @{ "Authorization" = "Bearer $accessToken" } - if ($targetAccountId -ne "TARGET_ACCOUNT_ID") { + if ($targetAccountId -ne "TARGET_ACCOUNT_ID" -and $targetAccountId -ne "{TARGET_ACCOUNT_ID}") { $targetAccountFound = "false"; foreach ($account_info in $userInfoResponse.accounts) { if ($account_info.account_id -eq $targetAccountId) { diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 index 0da0a0c..7248c89 100644 --- a/Quick_ACG/launcherACG.ps1 +++ b/Quick_ACG/launcherACG.ps1 @@ -1,4 +1,4 @@ -. "..\utils\invokeScript.ps1" +. "../utils/invokeScript.ps1" $ErrorActionPreference = "Stop" # force stop on failure @@ -17,7 +17,7 @@ function startQuickACG { Write-Output '' Write-Output "Authentication in progress, please wait" Write-Output '' - Invoke-Script -Command "`"..\OAuth\code_grant.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID)" + Invoke-Script -Command "`"..\OAuth\code_grant.ps1`" -clientId `"$($config.INTEGRATION_KEY_AUTH_CODE)`" -clientSecret `"$($config.SECRET_KEY)`" -apiVersion $("eSignature") -targetAccountId `"$($config.TARGET_ACCOUNT_ID)`"" Write-Output '' if ((Test-Path "../config/ds_access_token.txt") -eq $true) { @@ -48,7 +48,7 @@ function startSignature { } while (-not [MenuOptions]::IsDefined([MenuOptions], $MenuOptionsView)); if ($MenuOptionsView -eq [MenuOptions]::Embedded_Signing) { - powershell.exe -Command ..\eg001EmbeddedSigning.ps1 + Invoke-Script -Command "`"..\eg001EmbeddedSigning.ps1`"" } elseif ($MenuOptionsView -eq [MenuOptions]::Exit) { exit 1 diff --git a/examples/Maestro/createWorkflowUtils.ps1 b/examples/Maestro/createWorkflowUtils.ps1 index e7cf7fa..e4f81a1 100644 --- a/examples/Maestro/createWorkflowUtils.ps1 +++ b/examples/Maestro/createWorkflowUtils.ps1 @@ -1,4 +1,4 @@ -. "utils\invokeScript.ps1" +. "utils/invokeScript.ps1" # Check that we have a template id if (-not (Test-Path .\config\TEMPLATE_ID)) { diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index 7a54e84..750b5d1 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -1,4 +1,4 @@ -. "utils\invokeScript.ps1" +. "utils/invokeScript.ps1" # Trigger a workflow if (-not (Test-Path .\config\WORKFLOW_ID)) { diff --git a/examples/WebForms/eg001CreateInstance.ps1 b/examples/WebForms/eg001CreateInstance.ps1 index c91f328..bbcce5d 100644 --- a/examples/WebForms/eg001CreateInstance.ps1 +++ b/examples/WebForms/eg001CreateInstance.ps1 @@ -1,4 +1,4 @@ -. "utils\invokeScript.ps1" +. "utils/invokeScript.ps1" $apiUri = "https://apps-d.docusign.com/api/webforms/v1.1" $configPath = ".\config\settings.json" diff --git a/examples/eSignature/eg043SharedAccess.ps1 b/examples/eSignature/eg043SharedAccess.ps1 index 6552d72..f9104bc 100644 --- a/examples/eSignature/eg043SharedAccess.ps1 +++ b/examples/eSignature/eg043SharedAccess.ps1 @@ -1,4 +1,4 @@ -. "utils\invokeScript.ps1" +. "utils/invokeScript.ps1" $apiUri = "https://demo.docusign.net/restapi" $accountUri = "https://account-d.docusign.com" diff --git a/launcher.ps1 b/launcher.ps1 index 95274a8..3e9cf1a 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1,4 +1,4 @@ -. "utils\invokeScript.ps1" +. "utils/invokeScript.ps1" $ErrorActionPreference = "Stop" # force stop on failure @@ -116,7 +116,7 @@ function startLauncher { Write-Output '' Write-Output "Quickstart Enabled, please wait" write-Output '' - Invoke-Script -Command "`".\OAuth\code_grant.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $("eSignature") -targetAccountId $($config.TARGET_ACCOUNT_ID)" + Invoke-Script -Command "`".\OAuth\code_grant.ps1`" -clientId `"$($config.INTEGRATION_KEY_AUTH_CODE)`" -clientSecret `"$($config.SECRET_KEY)`" -apiVersion $("eSignature") -targetAccountId `"$($config.TARGET_ACCOUNT_ID)`"" if ((Test-Path "./config/ds_access_token.txt") -eq $true) { @@ -209,13 +209,13 @@ function startAuth ($apiVersion) { startLauncher } elseif ($AuthTypeView -eq [AuthType]::CodeGrant) { - Invoke-Script -Command "`".\OAuth\code_grant.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -clientSecret $($config.SECRET_KEY) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID)" + Invoke-Script -Command "`".\OAuth\code_grant.ps1`" -clientId `"$($config.INTEGRATION_KEY_AUTH_CODE)`" -clientSecret `"$($config.SECRET_KEY)`" -apiVersion $($apiVersion) -targetAccountId `"$($config.TARGET_ACCOUNT_ID)`"" if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } } elseif ($AuthTypeView -eq [AuthType]::JWT) { - Invoke-Script -Command "`".\OAuth\jwt.ps1`" -clientId $($config.INTEGRATION_KEY_AUTH_CODE) -apiVersion $($apiVersion) -targetAccountId $($config.TARGET_ACCOUNT_ID)" + Invoke-Script -Command "`".\OAuth\jwt.ps1`" -clientId `"$($config.INTEGRATION_KEY_AUTH_CODE)`" -apiVersion `"$($apiVersion)`" -targetAccountId `"$($config.TARGET_ACCOUNT_ID)`"" if ((Test-Path "./config/ds_access_token.txt") -eq $false) { Write-Error "Failed to retrieve OAuth Access token, check your settings.json and that port 8080 is not in use" -ErrorAction Stop } diff --git a/utils/sharedAccess.ps1 b/utils/sharedAccess.ps1 index 86d1a18..482a630 100644 --- a/utils/sharedAccess.ps1 +++ b/utils/sharedAccess.ps1 @@ -1,4 +1,4 @@ -. "utils\invokeScript.ps1" +. "utils/invokeScript.ps1" $configFile = ".\config\settings.json" From 4a50ffb013bf40f80b1405743c7a88091094fc17 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Thu, 8 Aug 2024 12:21:37 +0300 Subject: [PATCH 420/462] added example --- OAuth/code_grant.ps1 | 2 +- OAuth/jwt.ps1 | 2 +- examples/Admin/eg013CreateAccount.ps1 | 97 +++++++++++++++++++++++++++ launcher.ps1 | 8 ++- 4 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 examples/Admin/eg013CreateAccount.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 48d5cdc..6254c66 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -30,7 +30,7 @@ elseif ($apiVersion -eq "monitor") { $scopes = "signature impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read" + $scopes = "signature%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read%20organization_sub_account_write%20organization_sub_account_read" } elseif ($apiVersion -eq "notary") { $scopes = "signature%20organization_read%20notary_read%20notary_write" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 036ee76..f96c980 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -43,7 +43,7 @@ if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read" + $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read%organization_sub_account_write%20organization_sub_account_read" } elseif ($apiVersion -eq "notary") { $scopes = "signature%20organization_read%20notary_read%20notary_write" diff --git a/examples/Admin/eg013CreateAccount.ps1 b/examples/Admin/eg013CreateAccount.ps1 new file mode 100644 index 0000000..ae23e92 --- /dev/null +++ b/examples/Admin/eg013CreateAccount.ps1 @@ -0,0 +1,97 @@ +# Get required environment variables from .\config\settings.json file +$accessToken = Get-Content .\config\ds_access_token.txt +$APIAccountId = Get-Content .\config\API_ACCOUNT_ID + +# Get required variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json +$base_path = "https://api-d.docusign.net/management" +$organizationId=$variables.ORGANIZATION_ID + +# Construct your API headers +#ds-snippet-start:Admin13Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Accept", "application/json") +$headers.add("Content-Type", "application/json") +#ds-snippet-end:Admin13Step2 + +try { + #ds-snippet-start:Admin13Step3 + $uri = "${base_path}/v2/organizations/${organizationId}/planItems" + $response = Invoke-WebRequest -headers $headers -Uri $uri -Method GET + + Write-Output "Results from the GET request:" + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + #ds-snippet-end:Admin13Step3 +} catch { + Write-Output "Error:" + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +$responseJson = $response.Content | ConvertFrom-Json +$planId = $responseJson.plan_id +$subscriptionId = $responseJson.subscription_id + +$emailAddress = Read-Host "Please enter the email address for the new account" +$firstName = Read-Host "Please enter the first name for the new account" +$lastName = Read-Host "Please enter the last name for the new account" + +#ds-snippet-start:Admin13Step4 +# The country code value is set to "US" for the developer environment +# In production, set the value to the code for the country of the target account +$body = @" +{ + "subscriptionDetails": { + "id": "$subscriptionId", + "planId": "$planId", + "modules": [] + }, + "targetAccount": { + "name": "CreatedThroughAPI", + "countryCode": "US", + "admin": { + "email": "$emailAddress", + "firstName": "$firstName", + "lastName": "$lastName", + "locale": "en" + } + } +} +"@ +#ds-snippet-end:Admin13Step4 + +try { + #ds-snippet-start:Admin13Step5 + $uri = "${base_path}/v2/organizations/${organizationId}/assetGroups/accountCreate" + $response = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method POST + + Write-Output "Results from the create account method:" + $response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 5 + #ds-snippet-end:Admin13Step5 +} +catch +{ + Write-Output "Error:" + + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line + exit 1 +} + +Write-Output "" +Write-Output "Done" diff --git a/launcher.ps1 b/launcher.ps1 index 344370e..0a02116 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -829,7 +829,8 @@ function startAdmin { deleteUserDataFromOrganization = 10; deleteUserDataFromAccount = 11; cloneAccount = 12; - Pick_An_API = 13; + createAccount = 13; + Pick_An_API = 14; } $listAdminExamplesView = $null; do { @@ -847,6 +848,7 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::deleteUserDataFromOrganization)) Delete user data from organization" Write-Output "$([int][listAdminExamples]::deleteUserDataFromAccount)) Delete user data from account" Write-Output "$([int][listAdminExamples]::cloneAccount)) Clone Account" + Write-Output "$([int][listAdminExamples]::createAccount)) Create Account" Write-Output "$([int][listAdminExamples]::Pick_An_API)) Pick_An_API" [int]$listAdminExamplesView = Read-Host "Select the action" } while (-not [listAdminExamples]::IsDefined([listAdminExamples], $listAdminExamplesView)); @@ -901,6 +903,10 @@ function startAdmin { checkOrgId Invoke-Script -Command "`".\examples\Admin\eg012CloneAccount.ps1`"" } + elseif ($listAdminExamplesView -eq [listAdminExamples]::createAccount) { + checkOrgId + Invoke-Script -Command "`".\examples\Admin\eg013CreateAccount.ps1`"" + } } until ($listAdminExamplesView -eq [listAdminExamples]::Pick_An_API) startLauncher } From 70abae39a2e78e7d8d70e1a19a5d443f5989f0f5 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Thu, 8 Aug 2024 13:37:18 +0300 Subject: [PATCH 421/462] fix scopes --- OAuth/jwt.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index f96c980..f043e21 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -43,7 +43,7 @@ if ($apiVersion -eq "rooms") { $scopes = "signature%20impersonation" } elseif ($apiVersion -eq "admin") { - $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read%organization_sub_account_write%20organization_sub_account_read" + $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read%20organization_sub_account_write%20organization_sub_account_read" } elseif ($apiVersion -eq "notary") { $scopes = "signature%20organization_read%20notary_read%20notary_write" From 075f7ac77eaa9e8a77e50aadf35d8c84340f04f2 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Thu, 22 Aug 2024 10:37:20 -0700 Subject: [PATCH 422/462] DEVDOCS-15065 removing outdated comment --- utils/startServerForWebFormsExample.ps1 | 2 -- 1 file changed, 2 deletions(-) diff --git a/utils/startServerForWebFormsExample.ps1 b/utils/startServerForWebFormsExample.ps1 index 1aa4002..627ac23 100644 --- a/utils/startServerForWebFormsExample.ps1 +++ b/utils/startServerForWebFormsExample.ps1 @@ -77,8 +77,6 @@ options: webFormOptions, }); webFormWidget.on('sessionEnd', (event) => { - //There are 3 sessionEnd types sessionTimeout, remoteSigningInitiated, signingResult - // event = { type: 'sessionEnd', sessionEndType: 'sessionTimeout' }; // event = { // type: 'sessionEnd', From 353365f8f4980b8e0ddfe9c81004ad3cbdbd8a81 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Fri, 11 Oct 2024 12:48:49 -0700 Subject: [PATCH 423/462] DEVDOCS-15448 - updating the web-form-config.json and fixing an issue with older versions of Powershell on Windows --- demo_documents/web-form-config.json | 2 ++ utils/invokeScript.ps1 | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/demo_documents/web-form-config.json b/demo_documents/web-form-config.json index c8ca818..13fb09a 100644 --- a/demo_documents/web-form-config.json +++ b/demo_documents/web-form-config.json @@ -1 +1,3 @@ {"id":"3d761225-xxxx-xxxx-xxxx-683bb52fff21","accountId":"0820f9c5-xxxx-xxxx-xxxx-8a0df87f44aa","isPublished":true,"isEnabled":true,"hasDraftChanges":false,"formState":"active","formProperties":{"name":"Web Form Example Template","isPrivateAccess":false},"formMetadata":{"source":"templates","createdDateTime":"2023-12-07T21:35:55.245Z","publishedSlug":"3f766ec2815665dbc257f97a9b7f97df","owner":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastModifiedDateTime":"2023-12-07T21:38:04.910Z","lastModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"publishedComponentNames":{"SignerName":"TextBox","SignerEmail":"Email","PhoneNumber":"TextBox","Yes":"CheckboxGroup","Company":"TextBox","JobTitle":"TextBox"},"admModelNamespace":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21","formContentModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formContentModifiedDateTime":"2023-12-07T21:37:54.094Z","admModelVersion":"1.0.0","formPropertiesModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formPropertiesModifiedDateTime":"2023-12-07T21:35:55.245Z","sender":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastSenderConsentDateTime":"2023-12-07T21:37:57.247Z","lastPublishedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastPublishedDateTime":"2023-12-07T21:38:04.910Z","lastEnabledBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastEnabledDateTime":"2023-12-07T21:38:04.910Z"},"formContent":{"components":{"Root_Of_Journey":{"componentKey":"Root_Of_Journey","componentType":"Root","componentName":"Root_Of_Journey","componentRules":{},"text":"","children":["Welcome_kyK6x_Uj","Step_vGLuKyzy","Summary_j0FzHU8Q","ESignAction_qqwx19h7","Thankyou_RmjV_bGg"]},"Welcome_kyK6x_Uj":{"text":"Part time work application","subText":"","startButtonText":"Start","componentKey":"Welcome_kyK6x_Uj","componentType":"Welcome"},"Step_vGLuKyzy":{"componentKey":"Step_vGLuKyzy","componentType":"Step","componentName":"Step_vGLuKyzy","text":"Applicant information","children":["TextBox_lTHn2kiH","Email_wRqtKmus","TextBox_kLQ5AMLA","CheckboxGroup_cAHNBDer","TextBox_SiYcnTUz","TextBox_LsASX8b1"]},"Summary_j0FzHU8Q":{"text":"Summary","subText":"Please review the information you have entered:","componentKey":"Summary_j0FzHU8Q","componentType":"Summary"},"ESignAction_qqwx19h7":{"componentKey":"ESignAction_qqwx19h7","componentType":"ESignAction","primaryRecipientId":"1","templateInfoMap":{"eb388ad9-29de-40c9-90f3-211cf7dcefdd":{"templateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","lastModified":"2023-12-07T21:35:55.9300000Z","name":"Web Form Copy - Web Form Example Template","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"}}},"recipientInfoMap":{"1":{"nameComponentKey":"TextBox_lTHn2kiH","emailComponentKey":"Email_wRqtKmus","recipientId":"1","recipientType":"signer","roleName":"signer","routingOrder":"1","nameFromTemplate":"","emailFromTemplate":""}},"tabInfoMap":{"a4f174b8-647d-4c96-9b91-ff548a0c0930":{"componentKey":"TextBox_lTHn2kiH","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","recipientId":"1","tabLabel":"FullName","tabType":"text"},"9bcf6cba-05cf-4088-8c85-e5a905ca1efb":{"componentKey":"TextBox_kLQ5AMLA","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","recipientId":"1","tabLabel":"PhoneNumber","tabType":"text"},"d2d23949-ce13-48de-9043-ce1b4d7d594a":{"componentKey":"TextBox_SiYcnTUz","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","recipientId":"1","tabLabel":"Company","tabType":"text"},"6308de2e-cea9-48aa-ab03-25d53a54cc5a":{"componentKey":"TextBox_LsASX8b1","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","recipientId":"1","tabLabel":"JobTitle","tabType":"text"},"d1d70d31-d7d4-462b-b41a-cc1f55698ae2":{"componentKey":"CheckboxGroup_cAHNBDer","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","recipientId":"1","tabLabel":"Yes","tabType":"checkbox","name":"Yes","selected":"false"}},"requireRemoteSigning":false,"enableDocumentFieldEditing":true},"Thankyou_RmjV_bGg":{"text":"Thank you","subText":"We've received your form.","showConfirmationButton":false,"confirmationButtonText":"Done","confirmationButtonUrl":"","componentKey":"Thankyou_RmjV_bGg","componentType":"Thankyou"},"TextBox_lTHn2kiH":{"componentKey":"TextBox_lTHn2kiH","componentType":"TextBox","componentName":"SignerName","label":"Signer name","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"Email_wRqtKmus":{"componentKey":"Email_wRqtKmus","componentType":"Email","componentName":"SignerEmail","label":"Signer email","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_kLQ5AMLA":{"componentKey":"TextBox_kLQ5AMLA","componentType":"TextBox","componentName":"PhoneNumber","label":"Phone Number","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"CheckboxGroup_cAHNBDer":{"componentKey":"CheckboxGroup_cAHNBDer","componentType":"CheckboxGroup","componentName":"Yes","label":"I prefer to be contacted by text","description":"","options":[{"optionKey":"fk4RHsoj","value":"Yes","label":"Yes","selected":false}]},"TextBox_SiYcnTUz":{"componentKey":"TextBox_SiYcnTUz","componentType":"TextBox","componentName":"Company","label":"Current company","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_LsASX8b1":{"componentKey":"TextBox_LsASX8b1","componentType":"TextBox","componentName":"JobTitle","label":"Current job title","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000}},"isStandalone":false,"templates":[{"originalTemplateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","clonedTemplateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","importedDateTime":"2023-12-07T21:35:56.511Z","recipientIds":["1"]}]},"versionId":1,"eSignTemplates":[{"templateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","uri":"/templates/8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","name":"Web Form Copy - Web Form Example Template","shared":"false","passwordProtected":"false","description":"Example template created via the API","created":"2023-12-07T21:35:55.6300000Z","lastModified":"2023-12-07T21:38:04.3800000Z","lastModifiedBy":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com","uri":"/users/8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1"},"lastUsed":"2023-12-07T21:35:55.9430000Z","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"},"pageCount":"1","folderId":"1e649420-aee9-4f2e-8265-0082f733e8f6","folderName":"Deleted Items","folderIds":["1e649420-aee9-4f2e-8265-0082f733e8f6"],"autoMatch":"true","autoMatchSpecifiedByUser":"false","documents":[{"documentId":"1","uri":"/envelopes/eb388ad9-29de-40c9-90f3-211cf7dcefdd/documents/1","name":"World_Wide_Web_Form","order":"1","pages":"1","documentBase64":"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","display":"inline","includeInDownload":"true","signerMustAcknowledge":"no_interaction","templateLocked":"false","templateRequired":"false"}],"emailSubject":"Please sign this document","emailBlurb":"","signingLocation":"Online","authoritativeCopy":"false","enforceSignerVisibility":"false","enableWetSign":"true","allowMarkup":"false","allowReassign":"true","messageLock":"false","recipientsLock":"false","brandLock":"false","customFields":{"textCustomFields":[{"fieldId":"11003755255","name":"##SFSource","show":"true","required":"false","value":""},{"fieldId":"11003755256","name":"##SFDocumentWriteBack","show":"true","required":"false","value":""},{"fieldId":"11003756051","name":"ModelNamespace","show":"false","required":"false","value":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21"},{"fieldId":"11003756052","name":"ModelVersion","show":"false","required":"false","value":"1"},{"fieldId":"11003756053","name":"ModelAccount","show":"false","required":"false","value":"0820f9c5-0d81-489a-bcc9-8a0df87f44aa"}],"listCustomFields":[]},"recipients":{"signers":[{"defaultRecipient":"false","tabs":{"signHereTabs":[{"stampType":"signature","name":"SignHere","tabLabel":"Signature","scaleValue":"1","optional":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"126","yPosition":"374","anchorString":"/SignHere/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"779409ee-df52-4560-82f5-d036273703ae","tabType":"signhere"}],"dateSignedTabs":[{"name":"DateSigned","value":"","tabLabel":"DateSigned","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"409","yPosition":"396","anchorString":"/Date/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"4f92b805-4bd3-41e3-94cb-343cea58c9b8","tabType":"datesigned"}],"textTabs":[{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"FullName","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"145","yPosition":"234","width":"0","height":"0","anchorString":"/FullName/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.SignerName\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"PhoneNumber","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"167","yPosition":"261","width":"0","height":"0","anchorString":"/PhoneNumber/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"Company","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"182","yPosition":"315","width":"0","height":"0","anchorString":"/Company/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Company\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"JobTitle","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"137","yPosition":"342","width":"0","height":"0","anchorString":"/Title/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}","tabType":"text"}],"checkboxTabs":[{"name":"Yes","tabLabel":"Yes","selected":"false","selectedOriginal":"false","requireInitialOnSharedChange":"false","bold":"false","italic":"false","underline":"false","required":"true","locked":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"237","yPosition":"288","width":"0","height":"0","anchorString":"/SMS/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}","tabType":"checkbox"}]},"signInEachLocation":"false","agentCanEditEmail":"false","agentCanEditName":"false","requireUploadSignature":"false","name":"","email":"","recipientId":"1","recipientIdGuid":"00000000-0000-0000-0000-000000000000","accessCode":"","requireIdLookup":"false","routingOrder":"1","note":"","roleName":"signer","completedCount":"0","deliveryMethod":"email","templateLocked":"false","templateRequired":"false","inheritEmailNotificationConfiguration":"false","recipientType":"signer"}],"agents":[],"editors":[],"intermediaries":[],"carbonCopies":[],"certifiedDeliveries":[],"inPersonSigners":[],"seals":[],"witnesses":[],"notaries":[],"recipientCount":"1"},"envelopeIdStamping":"true","autoNavigation":"true","allowComments":"true","disableResponsiveDocument":"true","anySigner":null,"envelopeLocation":"current_site"}]} + + diff --git a/utils/invokeScript.ps1 b/utils/invokeScript.ps1 index 35069a6..838a894 100644 --- a/utils/invokeScript.ps1 +++ b/utils/invokeScript.ps1 @@ -4,7 +4,7 @@ function Invoke-Script { ) # Get the path to the PowerShell executable - $powershellPath = if ($IsWindows) { + $powershellPath = if ([System.Environment]::OSVersion.Platform -eq "Win32NT") { try { (Get-Command powershell.exe -ErrorAction Stop).Source } catch { From bf946eb67d03253ce8e75a56b484d82584061cdd Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Fri, 11 Oct 2024 14:01:07 -0700 Subject: [PATCH 424/462] fixing command to be mac and windows friendly --- examples/WebForms/eg001CreateInstance.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/WebForms/eg001CreateInstance.ps1 b/examples/WebForms/eg001CreateInstance.ps1 index bbfffe9..a262787 100644 --- a/examples/WebForms/eg001CreateInstance.ps1 +++ b/examples/WebForms/eg001CreateInstance.ps1 @@ -20,7 +20,7 @@ $webFormConfig = Get-Content -Raw demo_documents\web-form-config.json $result = $webFormConfig -replace "template-id", $templateId $result | Set-Content -Path demo_documents\web-form-config.json -Write-Host "" +Write-Host "" Write-Host "Go to your Docusign account to create the Web Form. Go to 'Templates' in your developer account, select 'Start,' select 'Web Forms,' and choose 'Upload Web Form.' Upload the JSON config file 'web-form-config.json' found under the demo_documents folder of this project. You will need to activate the web form before proceeding. Press Continue after doing so." $choice = Read-Host @@ -77,7 +77,7 @@ $formUrl = $responseContent.formUrl $instanceToken = $responseContent.instanceToken $integrationKey = $config.INTEGRATION_KEY_AUTH_CODE -Start-Process -NoNewWindow -FilePath "powershell" -ArgumentList "-File .\utils\startServerForWebFormsExample.ps1 -integrationKey $integrationKey -url $formUrl -instanceToken $instanceToken" +Invoke-Script -Command "./utils/startServerForWebFormsExample.ps1 -integrationKey $integrationKey -url $formUrl -instanceToken $instanceToken" Write-Output "" Write-Output "Done." From 52aaa83173c795faa3a3e8fb8d7d44b139efc63b Mon Sep 17 00:00:00 2001 From: inbargazit Date: Mon, 14 Oct 2024 10:25:05 -0700 Subject: [PATCH 425/462] Fixing template for DEVDOCS-15448 so it aligns --- utils/createWebFormTemplate.ps1 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/utils/createWebFormTemplate.ps1 b/utils/createWebFormTemplate.ps1 index 1d39fd0..ccd6aac 100644 --- a/utils/createWebFormTemplate.ps1 +++ b/utils/createWebFormTemplate.ps1 @@ -65,8 +65,8 @@ $json = @" "tabLabel": "Yes", "anchorString": "/SMS/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" } ], "signHereTabs": [ @@ -85,32 +85,32 @@ $json = @" "tabLabel": "FullName", "anchorString": "/FullName/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" }, { "documentId": "1", "tabLabel": "PhoneNumber", "anchorString": "/PhoneNumber/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" }, { "documentId": "1", "tabLabel": "Company", "anchorString": "/Company/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" }, { "documentId": "1", "tabLabel": "JobTitle", "anchorString": "/Title/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" } ], "dateSignedTabs": [ @@ -119,8 +119,8 @@ $json = @" "tabLabel": "DateSigned", "anchorString": "/Date/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" } ] } From 562558330f943df593f9a12e8ee60610a90371c9 Mon Sep 17 00:00:00 2001 From: Paige Rossi Date: Mon, 28 Oct 2024 11:42:21 -0700 Subject: [PATCH 426/462] removing template ID --- demo_documents/web-form-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo_documents/web-form-config.json b/demo_documents/web-form-config.json index 13fb09a..46145e2 100644 --- a/demo_documents/web-form-config.json +++ b/demo_documents/web-form-config.json @@ -1,3 +1,3 @@ -{"id":"3d761225-xxxx-xxxx-xxxx-683bb52fff21","accountId":"0820f9c5-xxxx-xxxx-xxxx-8a0df87f44aa","isPublished":true,"isEnabled":true,"hasDraftChanges":false,"formState":"active","formProperties":{"name":"Web Form Example Template","isPrivateAccess":false},"formMetadata":{"source":"templates","createdDateTime":"2023-12-07T21:35:55.245Z","publishedSlug":"3f766ec2815665dbc257f97a9b7f97df","owner":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastModifiedDateTime":"2023-12-07T21:38:04.910Z","lastModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"publishedComponentNames":{"SignerName":"TextBox","SignerEmail":"Email","PhoneNumber":"TextBox","Yes":"CheckboxGroup","Company":"TextBox","JobTitle":"TextBox"},"admModelNamespace":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21","formContentModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formContentModifiedDateTime":"2023-12-07T21:37:54.094Z","admModelVersion":"1.0.0","formPropertiesModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formPropertiesModifiedDateTime":"2023-12-07T21:35:55.245Z","sender":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastSenderConsentDateTime":"2023-12-07T21:37:57.247Z","lastPublishedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastPublishedDateTime":"2023-12-07T21:38:04.910Z","lastEnabledBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastEnabledDateTime":"2023-12-07T21:38:04.910Z"},"formContent":{"components":{"Root_Of_Journey":{"componentKey":"Root_Of_Journey","componentType":"Root","componentName":"Root_Of_Journey","componentRules":{},"text":"","children":["Welcome_kyK6x_Uj","Step_vGLuKyzy","Summary_j0FzHU8Q","ESignAction_qqwx19h7","Thankyou_RmjV_bGg"]},"Welcome_kyK6x_Uj":{"text":"Part time work application","subText":"","startButtonText":"Start","componentKey":"Welcome_kyK6x_Uj","componentType":"Welcome"},"Step_vGLuKyzy":{"componentKey":"Step_vGLuKyzy","componentType":"Step","componentName":"Step_vGLuKyzy","text":"Applicant information","children":["TextBox_lTHn2kiH","Email_wRqtKmus","TextBox_kLQ5AMLA","CheckboxGroup_cAHNBDer","TextBox_SiYcnTUz","TextBox_LsASX8b1"]},"Summary_j0FzHU8Q":{"text":"Summary","subText":"Please review the information you have entered:","componentKey":"Summary_j0FzHU8Q","componentType":"Summary"},"ESignAction_qqwx19h7":{"componentKey":"ESignAction_qqwx19h7","componentType":"ESignAction","primaryRecipientId":"1","templateInfoMap":{"eb388ad9-29de-40c9-90f3-211cf7dcefdd":{"templateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","lastModified":"2023-12-07T21:35:55.9300000Z","name":"Web Form Copy - Web Form Example Template","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"}}},"recipientInfoMap":{"1":{"nameComponentKey":"TextBox_lTHn2kiH","emailComponentKey":"Email_wRqtKmus","recipientId":"1","recipientType":"signer","roleName":"signer","routingOrder":"1","nameFromTemplate":"","emailFromTemplate":""}},"tabInfoMap":{"a4f174b8-647d-4c96-9b91-ff548a0c0930":{"componentKey":"TextBox_lTHn2kiH","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","recipientId":"1","tabLabel":"FullName","tabType":"text"},"9bcf6cba-05cf-4088-8c85-e5a905ca1efb":{"componentKey":"TextBox_kLQ5AMLA","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","recipientId":"1","tabLabel":"PhoneNumber","tabType":"text"},"d2d23949-ce13-48de-9043-ce1b4d7d594a":{"componentKey":"TextBox_SiYcnTUz","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","recipientId":"1","tabLabel":"Company","tabType":"text"},"6308de2e-cea9-48aa-ab03-25d53a54cc5a":{"componentKey":"TextBox_LsASX8b1","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","recipientId":"1","tabLabel":"JobTitle","tabType":"text"},"d1d70d31-d7d4-462b-b41a-cc1f55698ae2":{"componentKey":"CheckboxGroup_cAHNBDer","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","recipientId":"1","tabLabel":"Yes","tabType":"checkbox","name":"Yes","selected":"false"}},"requireRemoteSigning":false,"enableDocumentFieldEditing":true},"Thankyou_RmjV_bGg":{"text":"Thank you","subText":"We've received your form.","showConfirmationButton":false,"confirmationButtonText":"Done","confirmationButtonUrl":"","componentKey":"Thankyou_RmjV_bGg","componentType":"Thankyou"},"TextBox_lTHn2kiH":{"componentKey":"TextBox_lTHn2kiH","componentType":"TextBox","componentName":"SignerName","label":"Signer name","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"Email_wRqtKmus":{"componentKey":"Email_wRqtKmus","componentType":"Email","componentName":"SignerEmail","label":"Signer email","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_kLQ5AMLA":{"componentKey":"TextBox_kLQ5AMLA","componentType":"TextBox","componentName":"PhoneNumber","label":"Phone Number","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"CheckboxGroup_cAHNBDer":{"componentKey":"CheckboxGroup_cAHNBDer","componentType":"CheckboxGroup","componentName":"Yes","label":"I prefer to be contacted by text","description":"","options":[{"optionKey":"fk4RHsoj","value":"Yes","label":"Yes","selected":false}]},"TextBox_SiYcnTUz":{"componentKey":"TextBox_SiYcnTUz","componentType":"TextBox","componentName":"Company","label":"Current company","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_LsASX8b1":{"componentKey":"TextBox_LsASX8b1","componentType":"TextBox","componentName":"JobTitle","label":"Current job title","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000}},"isStandalone":false,"templates":[{"originalTemplateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","clonedTemplateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","importedDateTime":"2023-12-07T21:35:56.511Z","recipientIds":["1"]}]},"versionId":1,"eSignTemplates":[{"templateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","uri":"/templates/8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","name":"Web Form Copy - Web Form Example Template","shared":"false","passwordProtected":"false","description":"Example template created via the API","created":"2023-12-07T21:35:55.6300000Z","lastModified":"2023-12-07T21:38:04.3800000Z","lastModifiedBy":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com","uri":"/users/8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1"},"lastUsed":"2023-12-07T21:35:55.9430000Z","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"},"pageCount":"1","folderId":"1e649420-aee9-4f2e-8265-0082f733e8f6","folderName":"Deleted Items","folderIds":["1e649420-aee9-4f2e-8265-0082f733e8f6"],"autoMatch":"true","autoMatchSpecifiedByUser":"false","documents":[{"documentId":"1","uri":"/envelopes/eb388ad9-29de-40c9-90f3-211cf7dcefdd/documents/1","name":"World_Wide_Web_Form","order":"1","pages":"1","documentBase64":"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","display":"inline","includeInDownload":"true","signerMustAcknowledge":"no_interaction","templateLocked":"false","templateRequired":"false"}],"emailSubject":"Please sign this document","emailBlurb":"","signingLocation":"Online","authoritativeCopy":"false","enforceSignerVisibility":"false","enableWetSign":"true","allowMarkup":"false","allowReassign":"true","messageLock":"false","recipientsLock":"false","brandLock":"false","customFields":{"textCustomFields":[{"fieldId":"11003755255","name":"##SFSource","show":"true","required":"false","value":""},{"fieldId":"11003755256","name":"##SFDocumentWriteBack","show":"true","required":"false","value":""},{"fieldId":"11003756051","name":"ModelNamespace","show":"false","required":"false","value":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21"},{"fieldId":"11003756052","name":"ModelVersion","show":"false","required":"false","value":"1"},{"fieldId":"11003756053","name":"ModelAccount","show":"false","required":"false","value":"0820f9c5-0d81-489a-bcc9-8a0df87f44aa"}],"listCustomFields":[]},"recipients":{"signers":[{"defaultRecipient":"false","tabs":{"signHereTabs":[{"stampType":"signature","name":"SignHere","tabLabel":"Signature","scaleValue":"1","optional":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"126","yPosition":"374","anchorString":"/SignHere/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"779409ee-df52-4560-82f5-d036273703ae","tabType":"signhere"}],"dateSignedTabs":[{"name":"DateSigned","value":"","tabLabel":"DateSigned","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"409","yPosition":"396","anchorString":"/Date/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"4f92b805-4bd3-41e3-94cb-343cea58c9b8","tabType":"datesigned"}],"textTabs":[{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"FullName","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"145","yPosition":"234","width":"0","height":"0","anchorString":"/FullName/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.SignerName\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"PhoneNumber","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"167","yPosition":"261","width":"0","height":"0","anchorString":"/PhoneNumber/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"Company","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"182","yPosition":"315","width":"0","height":"0","anchorString":"/Company/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Company\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"JobTitle","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"137","yPosition":"342","width":"0","height":"0","anchorString":"/Title/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}","tabType":"text"}],"checkboxTabs":[{"name":"Yes","tabLabel":"Yes","selected":"false","selectedOriginal":"false","requireInitialOnSharedChange":"false","bold":"false","italic":"false","underline":"false","required":"true","locked":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"237","yPosition":"288","width":"0","height":"0","anchorString":"/SMS/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}","tabType":"checkbox"}]},"signInEachLocation":"false","agentCanEditEmail":"false","agentCanEditName":"false","requireUploadSignature":"false","name":"","email":"","recipientId":"1","recipientIdGuid":"00000000-0000-0000-0000-000000000000","accessCode":"","requireIdLookup":"false","routingOrder":"1","note":"","roleName":"signer","completedCount":"0","deliveryMethod":"email","templateLocked":"false","templateRequired":"false","inheritEmailNotificationConfiguration":"false","recipientType":"signer"}],"agents":[],"editors":[],"intermediaries":[],"carbonCopies":[],"certifiedDeliveries":[],"inPersonSigners":[],"seals":[],"witnesses":[],"notaries":[],"recipientCount":"1"},"envelopeIdStamping":"true","autoNavigation":"true","allowComments":"true","disableResponsiveDocument":"true","anySigner":null,"envelopeLocation":"current_site"}]} +{"id":"3d761225-xxxx-xxxx-xxxx-683bb52fff21","accountId":"0820f9c5-xxxx-xxxx-xxxx-8a0df87f44aa","isPublished":true,"isEnabled":true,"hasDraftChanges":false,"formState":"active","formProperties":{"name":"Web Form Example Template","isPrivateAccess":false},"formMetadata":{"source":"templates","createdDateTime":"2023-12-07T21:35:55.245Z","publishedSlug":"3f766ec2815665dbc257f97a9b7f97df","owner":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastModifiedDateTime":"2023-12-07T21:38:04.910Z","lastModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"publishedComponentNames":{"SignerName":"TextBox","SignerEmail":"Email","PhoneNumber":"TextBox","Yes":"CheckboxGroup","Company":"TextBox","JobTitle":"TextBox"},"admModelNamespace":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21","formContentModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formContentModifiedDateTime":"2023-12-07T21:37:54.094Z","admModelVersion":"1.0.0","formPropertiesModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formPropertiesModifiedDateTime":"2023-12-07T21:35:55.245Z","sender":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastSenderConsentDateTime":"2023-12-07T21:37:57.247Z","lastPublishedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastPublishedDateTime":"2023-12-07T21:38:04.910Z","lastEnabledBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastEnabledDateTime":"2023-12-07T21:38:04.910Z"},"formContent":{"components":{"Root_Of_Journey":{"componentKey":"Root_Of_Journey","componentType":"Root","componentName":"Root_Of_Journey","componentRules":{},"text":"","children":["Welcome_kyK6x_Uj","Step_vGLuKyzy","Summary_j0FzHU8Q","ESignAction_qqwx19h7","Thankyou_RmjV_bGg"]},"Welcome_kyK6x_Uj":{"text":"Part time work application","subText":"","startButtonText":"Start","componentKey":"Welcome_kyK6x_Uj","componentType":"Welcome"},"Step_vGLuKyzy":{"componentKey":"Step_vGLuKyzy","componentType":"Step","componentName":"Step_vGLuKyzy","text":"Applicant information","children":["TextBox_lTHn2kiH","Email_wRqtKmus","TextBox_kLQ5AMLA","CheckboxGroup_cAHNBDer","TextBox_SiYcnTUz","TextBox_LsASX8b1"]},"Summary_j0FzHU8Q":{"text":"Summary","subText":"Please review the information you have entered:","componentKey":"Summary_j0FzHU8Q","componentType":"Summary"},"ESignAction_qqwx19h7":{"componentKey":"ESignAction_qqwx19h7","componentType":"ESignAction","primaryRecipientId":"1","templateInfoMap":{"eb388ad9-29de-40c9-90f3-211cf7dcefdd":{"templateId":"template-id","lastModified":"2023-12-07T21:35:55.9300000Z","name":"Web Form Copy - Web Form Example Template","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"}}},"recipientInfoMap":{"1":{"nameComponentKey":"TextBox_lTHn2kiH","emailComponentKey":"Email_wRqtKmus","recipientId":"1","recipientType":"signer","roleName":"signer","routingOrder":"1","nameFromTemplate":"","emailFromTemplate":""}},"tabInfoMap":{"a4f174b8-647d-4c96-9b91-ff548a0c0930":{"componentKey":"TextBox_lTHn2kiH","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","recipientId":"1","tabLabel":"FullName","tabType":"text"},"9bcf6cba-05cf-4088-8c85-e5a905ca1efb":{"componentKey":"TextBox_kLQ5AMLA","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","recipientId":"1","tabLabel":"PhoneNumber","tabType":"text"},"d2d23949-ce13-48de-9043-ce1b4d7d594a":{"componentKey":"TextBox_SiYcnTUz","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","recipientId":"1","tabLabel":"Company","tabType":"text"},"6308de2e-cea9-48aa-ab03-25d53a54cc5a":{"componentKey":"TextBox_LsASX8b1","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","recipientId":"1","tabLabel":"JobTitle","tabType":"text"},"d1d70d31-d7d4-462b-b41a-cc1f55698ae2":{"componentKey":"CheckboxGroup_cAHNBDer","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","recipientId":"1","tabLabel":"Yes","tabType":"checkbox","name":"Yes","selected":"false"}},"requireRemoteSigning":false,"enableDocumentFieldEditing":true},"Thankyou_RmjV_bGg":{"text":"Thank you","subText":"We've received your form.","showConfirmationButton":false,"confirmationButtonText":"Done","confirmationButtonUrl":"","componentKey":"Thankyou_RmjV_bGg","componentType":"Thankyou"},"TextBox_lTHn2kiH":{"componentKey":"TextBox_lTHn2kiH","componentType":"TextBox","componentName":"SignerName","label":"Signer name","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"Email_wRqtKmus":{"componentKey":"Email_wRqtKmus","componentType":"Email","componentName":"SignerEmail","label":"Signer email","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_kLQ5AMLA":{"componentKey":"TextBox_kLQ5AMLA","componentType":"TextBox","componentName":"PhoneNumber","label":"Phone Number","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"CheckboxGroup_cAHNBDer":{"componentKey":"CheckboxGroup_cAHNBDer","componentType":"CheckboxGroup","componentName":"Yes","label":"I prefer to be contacted by text","description":"","options":[{"optionKey":"fk4RHsoj","value":"Yes","label":"Yes","selected":false}]},"TextBox_SiYcnTUz":{"componentKey":"TextBox_SiYcnTUz","componentType":"TextBox","componentName":"Company","label":"Current company","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_LsASX8b1":{"componentKey":"TextBox_LsASX8b1","componentType":"TextBox","componentName":"JobTitle","label":"Current job title","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000}},"isStandalone":false,"templates":[{"originalTemplateId":"template-id","clonedTemplateId":"template-id","importedDateTime":"2023-12-07T21:35:56.511Z","recipientIds":["1"]}]},"versionId":1,"eSignTemplates":[{"templateId":"template-id","uri":"/templates/template-id","name":"Web Form Copy - Web Form Example Template","shared":"false","passwordProtected":"false","description":"Example template created via the API","created":"2023-12-07T21:35:55.6300000Z","lastModified":"2023-12-07T21:38:04.3800000Z","lastModifiedBy":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com","uri":"/users/8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1"},"lastUsed":"2023-12-07T21:35:55.9430000Z","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"},"pageCount":"1","folderId":"1e649420-aee9-4f2e-8265-0082f733e8f6","folderName":"Deleted Items","folderIds":["1e649420-aee9-4f2e-8265-0082f733e8f6"],"autoMatch":"true","autoMatchSpecifiedByUser":"false","documents":[{"documentId":"1","uri":"/envelopes/eb388ad9-29de-40c9-90f3-211cf7dcefdd/documents/1","name":"World_Wide_Web_Form","order":"1","pages":"1","documentBase64":"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","display":"inline","includeInDownload":"true","signerMustAcknowledge":"no_interaction","templateLocked":"false","templateRequired":"false"}],"emailSubject":"Please sign this document","emailBlurb":"","signingLocation":"Online","authoritativeCopy":"false","enforceSignerVisibility":"false","enableWetSign":"true","allowMarkup":"false","allowReassign":"true","messageLock":"false","recipientsLock":"false","brandLock":"false","customFields":{"textCustomFields":[{"fieldId":"11003755255","name":"##SFSource","show":"true","required":"false","value":""},{"fieldId":"11003755256","name":"##SFDocumentWriteBack","show":"true","required":"false","value":""},{"fieldId":"11003756051","name":"ModelNamespace","show":"false","required":"false","value":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21"},{"fieldId":"11003756052","name":"ModelVersion","show":"false","required":"false","value":"1"},{"fieldId":"11003756053","name":"ModelAccount","show":"false","required":"false","value":"0820f9c5-0d81-489a-bcc9-8a0df87f44aa"}],"listCustomFields":[]},"recipients":{"signers":[{"defaultRecipient":"false","tabs":{"signHereTabs":[{"stampType":"signature","name":"SignHere","tabLabel":"Signature","scaleValue":"1","optional":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"126","yPosition":"374","anchorString":"/SignHere/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"779409ee-df52-4560-82f5-d036273703ae","tabType":"signhere"}],"dateSignedTabs":[{"name":"DateSigned","value":"","tabLabel":"DateSigned","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"409","yPosition":"396","anchorString":"/Date/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"4f92b805-4bd3-41e3-94cb-343cea58c9b8","tabType":"datesigned"}],"textTabs":[{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"FullName","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"145","yPosition":"234","width":"0","height":"0","anchorString":"/FullName/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.SignerName\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"PhoneNumber","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"167","yPosition":"261","width":"0","height":"0","anchorString":"/PhoneNumber/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"Company","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"182","yPosition":"315","width":"0","height":"0","anchorString":"/Company/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Company\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"JobTitle","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"137","yPosition":"342","width":"0","height":"0","anchorString":"/Title/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}","tabType":"text"}],"checkboxTabs":[{"name":"Yes","tabLabel":"Yes","selected":"false","selectedOriginal":"false","requireInitialOnSharedChange":"false","bold":"false","italic":"false","underline":"false","required":"true","locked":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"237","yPosition":"288","width":"0","height":"0","anchorString":"/SMS/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}","tabType":"checkbox"}]},"signInEachLocation":"false","agentCanEditEmail":"false","agentCanEditName":"false","requireUploadSignature":"false","name":"","email":"","recipientId":"1","recipientIdGuid":"00000000-0000-0000-0000-000000000000","accessCode":"","requireIdLookup":"false","routingOrder":"1","note":"","roleName":"signer","completedCount":"0","deliveryMethod":"email","templateLocked":"false","templateRequired":"false","inheritEmailNotificationConfiguration":"false","recipientType":"signer"}],"agents":[],"editors":[],"intermediaries":[],"carbonCopies":[],"certifiedDeliveries":[],"inPersonSigners":[],"seals":[],"witnesses":[],"notaries":[],"recipientCount":"1"},"envelopeIdStamping":"true","autoNavigation":"true","allowComments":"true","disableResponsiveDocument":"true","anySigner":null,"envelopeLocation":"current_site"}]} From 3ef199f1bf26fbb17ef6f7c2f67a207aa5b9bb35 Mon Sep 17 00:00:00 2001 From: inbargazit Date: Mon, 28 Oct 2024 12:11:00 -0700 Subject: [PATCH 427/462] Updating the web-form-config.json for the Web Forms Code Example. --- demo_documents/web-form-config.json | 4 +++- examples/WebForms/eg001CreateInstance.ps1 | 4 ++-- utils/createWebFormTemplate.ps1 | 24 +++++++++++------------ utils/invokeScript.ps1 | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/demo_documents/web-form-config.json b/demo_documents/web-form-config.json index c8ca818..46145e2 100644 --- a/demo_documents/web-form-config.json +++ b/demo_documents/web-form-config.json @@ -1 +1,3 @@ -{"id":"3d761225-xxxx-xxxx-xxxx-683bb52fff21","accountId":"0820f9c5-xxxx-xxxx-xxxx-8a0df87f44aa","isPublished":true,"isEnabled":true,"hasDraftChanges":false,"formState":"active","formProperties":{"name":"Web Form Example Template","isPrivateAccess":false},"formMetadata":{"source":"templates","createdDateTime":"2023-12-07T21:35:55.245Z","publishedSlug":"3f766ec2815665dbc257f97a9b7f97df","owner":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastModifiedDateTime":"2023-12-07T21:38:04.910Z","lastModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"publishedComponentNames":{"SignerName":"TextBox","SignerEmail":"Email","PhoneNumber":"TextBox","Yes":"CheckboxGroup","Company":"TextBox","JobTitle":"TextBox"},"admModelNamespace":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21","formContentModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formContentModifiedDateTime":"2023-12-07T21:37:54.094Z","admModelVersion":"1.0.0","formPropertiesModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formPropertiesModifiedDateTime":"2023-12-07T21:35:55.245Z","sender":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastSenderConsentDateTime":"2023-12-07T21:37:57.247Z","lastPublishedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastPublishedDateTime":"2023-12-07T21:38:04.910Z","lastEnabledBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastEnabledDateTime":"2023-12-07T21:38:04.910Z"},"formContent":{"components":{"Root_Of_Journey":{"componentKey":"Root_Of_Journey","componentType":"Root","componentName":"Root_Of_Journey","componentRules":{},"text":"","children":["Welcome_kyK6x_Uj","Step_vGLuKyzy","Summary_j0FzHU8Q","ESignAction_qqwx19h7","Thankyou_RmjV_bGg"]},"Welcome_kyK6x_Uj":{"text":"Part time work application","subText":"","startButtonText":"Start","componentKey":"Welcome_kyK6x_Uj","componentType":"Welcome"},"Step_vGLuKyzy":{"componentKey":"Step_vGLuKyzy","componentType":"Step","componentName":"Step_vGLuKyzy","text":"Applicant information","children":["TextBox_lTHn2kiH","Email_wRqtKmus","TextBox_kLQ5AMLA","CheckboxGroup_cAHNBDer","TextBox_SiYcnTUz","TextBox_LsASX8b1"]},"Summary_j0FzHU8Q":{"text":"Summary","subText":"Please review the information you have entered:","componentKey":"Summary_j0FzHU8Q","componentType":"Summary"},"ESignAction_qqwx19h7":{"componentKey":"ESignAction_qqwx19h7","componentType":"ESignAction","primaryRecipientId":"1","templateInfoMap":{"eb388ad9-29de-40c9-90f3-211cf7dcefdd":{"templateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","lastModified":"2023-12-07T21:35:55.9300000Z","name":"Web Form Copy - Web Form Example Template","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"}}},"recipientInfoMap":{"1":{"nameComponentKey":"TextBox_lTHn2kiH","emailComponentKey":"Email_wRqtKmus","recipientId":"1","recipientType":"signer","roleName":"signer","routingOrder":"1","nameFromTemplate":"","emailFromTemplate":""}},"tabInfoMap":{"a4f174b8-647d-4c96-9b91-ff548a0c0930":{"componentKey":"TextBox_lTHn2kiH","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","recipientId":"1","tabLabel":"FullName","tabType":"text"},"9bcf6cba-05cf-4088-8c85-e5a905ca1efb":{"componentKey":"TextBox_kLQ5AMLA","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","recipientId":"1","tabLabel":"PhoneNumber","tabType":"text"},"d2d23949-ce13-48de-9043-ce1b4d7d594a":{"componentKey":"TextBox_SiYcnTUz","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","recipientId":"1","tabLabel":"Company","tabType":"text"},"6308de2e-cea9-48aa-ab03-25d53a54cc5a":{"componentKey":"TextBox_LsASX8b1","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","recipientId":"1","tabLabel":"JobTitle","tabType":"text"},"d1d70d31-d7d4-462b-b41a-cc1f55698ae2":{"componentKey":"CheckboxGroup_cAHNBDer","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","recipientId":"1","tabLabel":"Yes","tabType":"checkbox","name":"Yes","selected":"false"}},"requireRemoteSigning":false,"enableDocumentFieldEditing":true},"Thankyou_RmjV_bGg":{"text":"Thank you","subText":"We've received your form.","showConfirmationButton":false,"confirmationButtonText":"Done","confirmationButtonUrl":"","componentKey":"Thankyou_RmjV_bGg","componentType":"Thankyou"},"TextBox_lTHn2kiH":{"componentKey":"TextBox_lTHn2kiH","componentType":"TextBox","componentName":"SignerName","label":"Signer name","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"Email_wRqtKmus":{"componentKey":"Email_wRqtKmus","componentType":"Email","componentName":"SignerEmail","label":"Signer email","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_kLQ5AMLA":{"componentKey":"TextBox_kLQ5AMLA","componentType":"TextBox","componentName":"PhoneNumber","label":"Phone Number","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"CheckboxGroup_cAHNBDer":{"componentKey":"CheckboxGroup_cAHNBDer","componentType":"CheckboxGroup","componentName":"Yes","label":"I prefer to be contacted by text","description":"","options":[{"optionKey":"fk4RHsoj","value":"Yes","label":"Yes","selected":false}]},"TextBox_SiYcnTUz":{"componentKey":"TextBox_SiYcnTUz","componentType":"TextBox","componentName":"Company","label":"Current company","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_LsASX8b1":{"componentKey":"TextBox_LsASX8b1","componentType":"TextBox","componentName":"JobTitle","label":"Current job title","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000}},"isStandalone":false,"templates":[{"originalTemplateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","clonedTemplateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","importedDateTime":"2023-12-07T21:35:56.511Z","recipientIds":["1"]}]},"versionId":1,"eSignTemplates":[{"templateId":"8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","uri":"/templates/8eb75697-bccc-4717-8233-6913c436230b 7bbb0b06-10cd-4964-b13b-6ca9bed14395 1c805d33-e173-4ce3-8add-54e073340cb3","name":"Web Form Copy - Web Form Example Template","shared":"false","passwordProtected":"false","description":"Example template created via the API","created":"2023-12-07T21:35:55.6300000Z","lastModified":"2023-12-07T21:38:04.3800000Z","lastModifiedBy":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com","uri":"/users/8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1"},"lastUsed":"2023-12-07T21:35:55.9430000Z","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"},"pageCount":"1","folderId":"1e649420-aee9-4f2e-8265-0082f733e8f6","folderName":"Deleted Items","folderIds":["1e649420-aee9-4f2e-8265-0082f733e8f6"],"autoMatch":"true","autoMatchSpecifiedByUser":"false","documents":[{"documentId":"1","uri":"/envelopes/eb388ad9-29de-40c9-90f3-211cf7dcefdd/documents/1","name":"World_Wide_Web_Form","order":"1","pages":"1","documentBase64":"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","display":"inline","includeInDownload":"true","signerMustAcknowledge":"no_interaction","templateLocked":"false","templateRequired":"false"}],"emailSubject":"Please sign this document","emailBlurb":"","signingLocation":"Online","authoritativeCopy":"false","enforceSignerVisibility":"false","enableWetSign":"true","allowMarkup":"false","allowReassign":"true","messageLock":"false","recipientsLock":"false","brandLock":"false","customFields":{"textCustomFields":[{"fieldId":"11003755255","name":"##SFSource","show":"true","required":"false","value":""},{"fieldId":"11003755256","name":"##SFDocumentWriteBack","show":"true","required":"false","value":""},{"fieldId":"11003756051","name":"ModelNamespace","show":"false","required":"false","value":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21"},{"fieldId":"11003756052","name":"ModelVersion","show":"false","required":"false","value":"1"},{"fieldId":"11003756053","name":"ModelAccount","show":"false","required":"false","value":"0820f9c5-0d81-489a-bcc9-8a0df87f44aa"}],"listCustomFields":[]},"recipients":{"signers":[{"defaultRecipient":"false","tabs":{"signHereTabs":[{"stampType":"signature","name":"SignHere","tabLabel":"Signature","scaleValue":"1","optional":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"126","yPosition":"374","anchorString":"/SignHere/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"779409ee-df52-4560-82f5-d036273703ae","tabType":"signhere"}],"dateSignedTabs":[{"name":"DateSigned","value":"","tabLabel":"DateSigned","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"409","yPosition":"396","anchorString":"/Date/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"4f92b805-4bd3-41e3-94cb-343cea58c9b8","tabType":"datesigned"}],"textTabs":[{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"FullName","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"145","yPosition":"234","width":"0","height":"0","anchorString":"/FullName/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.SignerName\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"PhoneNumber","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"167","yPosition":"261","width":"0","height":"0","anchorString":"/PhoneNumber/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"Company","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"182","yPosition":"315","width":"0","height":"0","anchorString":"/Company/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Company\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"JobTitle","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"137","yPosition":"342","width":"0","height":"0","anchorString":"/Title/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}","tabType":"text"}],"checkboxTabs":[{"name":"Yes","tabLabel":"Yes","selected":"false","selectedOriginal":"false","requireInitialOnSharedChange":"false","bold":"false","italic":"false","underline":"false","required":"true","locked":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"237","yPosition":"288","width":"0","height":"0","anchorString":"/SMS/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}","tabType":"checkbox"}]},"signInEachLocation":"false","agentCanEditEmail":"false","agentCanEditName":"false","requireUploadSignature":"false","name":"","email":"","recipientId":"1","recipientIdGuid":"00000000-0000-0000-0000-000000000000","accessCode":"","requireIdLookup":"false","routingOrder":"1","note":"","roleName":"signer","completedCount":"0","deliveryMethod":"email","templateLocked":"false","templateRequired":"false","inheritEmailNotificationConfiguration":"false","recipientType":"signer"}],"agents":[],"editors":[],"intermediaries":[],"carbonCopies":[],"certifiedDeliveries":[],"inPersonSigners":[],"seals":[],"witnesses":[],"notaries":[],"recipientCount":"1"},"envelopeIdStamping":"true","autoNavigation":"true","allowComments":"true","disableResponsiveDocument":"true","anySigner":null,"envelopeLocation":"current_site"}]} +{"id":"3d761225-xxxx-xxxx-xxxx-683bb52fff21","accountId":"0820f9c5-xxxx-xxxx-xxxx-8a0df87f44aa","isPublished":true,"isEnabled":true,"hasDraftChanges":false,"formState":"active","formProperties":{"name":"Web Form Example Template","isPrivateAccess":false},"formMetadata":{"source":"templates","createdDateTime":"2023-12-07T21:35:55.245Z","publishedSlug":"3f766ec2815665dbc257f97a9b7f97df","owner":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastModifiedDateTime":"2023-12-07T21:38:04.910Z","lastModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"publishedComponentNames":{"SignerName":"TextBox","SignerEmail":"Email","PhoneNumber":"TextBox","Yes":"CheckboxGroup","Company":"TextBox","JobTitle":"TextBox"},"admModelNamespace":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21","formContentModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formContentModifiedDateTime":"2023-12-07T21:37:54.094Z","admModelVersion":"1.0.0","formPropertiesModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formPropertiesModifiedDateTime":"2023-12-07T21:35:55.245Z","sender":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastSenderConsentDateTime":"2023-12-07T21:37:57.247Z","lastPublishedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastPublishedDateTime":"2023-12-07T21:38:04.910Z","lastEnabledBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastEnabledDateTime":"2023-12-07T21:38:04.910Z"},"formContent":{"components":{"Root_Of_Journey":{"componentKey":"Root_Of_Journey","componentType":"Root","componentName":"Root_Of_Journey","componentRules":{},"text":"","children":["Welcome_kyK6x_Uj","Step_vGLuKyzy","Summary_j0FzHU8Q","ESignAction_qqwx19h7","Thankyou_RmjV_bGg"]},"Welcome_kyK6x_Uj":{"text":"Part time work application","subText":"","startButtonText":"Start","componentKey":"Welcome_kyK6x_Uj","componentType":"Welcome"},"Step_vGLuKyzy":{"componentKey":"Step_vGLuKyzy","componentType":"Step","componentName":"Step_vGLuKyzy","text":"Applicant information","children":["TextBox_lTHn2kiH","Email_wRqtKmus","TextBox_kLQ5AMLA","CheckboxGroup_cAHNBDer","TextBox_SiYcnTUz","TextBox_LsASX8b1"]},"Summary_j0FzHU8Q":{"text":"Summary","subText":"Please review the information you have entered:","componentKey":"Summary_j0FzHU8Q","componentType":"Summary"},"ESignAction_qqwx19h7":{"componentKey":"ESignAction_qqwx19h7","componentType":"ESignAction","primaryRecipientId":"1","templateInfoMap":{"eb388ad9-29de-40c9-90f3-211cf7dcefdd":{"templateId":"template-id","lastModified":"2023-12-07T21:35:55.9300000Z","name":"Web Form Copy - Web Form Example Template","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"}}},"recipientInfoMap":{"1":{"nameComponentKey":"TextBox_lTHn2kiH","emailComponentKey":"Email_wRqtKmus","recipientId":"1","recipientType":"signer","roleName":"signer","routingOrder":"1","nameFromTemplate":"","emailFromTemplate":""}},"tabInfoMap":{"a4f174b8-647d-4c96-9b91-ff548a0c0930":{"componentKey":"TextBox_lTHn2kiH","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","recipientId":"1","tabLabel":"FullName","tabType":"text"},"9bcf6cba-05cf-4088-8c85-e5a905ca1efb":{"componentKey":"TextBox_kLQ5AMLA","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","recipientId":"1","tabLabel":"PhoneNumber","tabType":"text"},"d2d23949-ce13-48de-9043-ce1b4d7d594a":{"componentKey":"TextBox_SiYcnTUz","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","recipientId":"1","tabLabel":"Company","tabType":"text"},"6308de2e-cea9-48aa-ab03-25d53a54cc5a":{"componentKey":"TextBox_LsASX8b1","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","recipientId":"1","tabLabel":"JobTitle","tabType":"text"},"d1d70d31-d7d4-462b-b41a-cc1f55698ae2":{"componentKey":"CheckboxGroup_cAHNBDer","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","recipientId":"1","tabLabel":"Yes","tabType":"checkbox","name":"Yes","selected":"false"}},"requireRemoteSigning":false,"enableDocumentFieldEditing":true},"Thankyou_RmjV_bGg":{"text":"Thank you","subText":"We've received your form.","showConfirmationButton":false,"confirmationButtonText":"Done","confirmationButtonUrl":"","componentKey":"Thankyou_RmjV_bGg","componentType":"Thankyou"},"TextBox_lTHn2kiH":{"componentKey":"TextBox_lTHn2kiH","componentType":"TextBox","componentName":"SignerName","label":"Signer name","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"Email_wRqtKmus":{"componentKey":"Email_wRqtKmus","componentType":"Email","componentName":"SignerEmail","label":"Signer email","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_kLQ5AMLA":{"componentKey":"TextBox_kLQ5AMLA","componentType":"TextBox","componentName":"PhoneNumber","label":"Phone Number","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"CheckboxGroup_cAHNBDer":{"componentKey":"CheckboxGroup_cAHNBDer","componentType":"CheckboxGroup","componentName":"Yes","label":"I prefer to be contacted by text","description":"","options":[{"optionKey":"fk4RHsoj","value":"Yes","label":"Yes","selected":false}]},"TextBox_SiYcnTUz":{"componentKey":"TextBox_SiYcnTUz","componentType":"TextBox","componentName":"Company","label":"Current company","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_LsASX8b1":{"componentKey":"TextBox_LsASX8b1","componentType":"TextBox","componentName":"JobTitle","label":"Current job title","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000}},"isStandalone":false,"templates":[{"originalTemplateId":"template-id","clonedTemplateId":"template-id","importedDateTime":"2023-12-07T21:35:56.511Z","recipientIds":["1"]}]},"versionId":1,"eSignTemplates":[{"templateId":"template-id","uri":"/templates/template-id","name":"Web Form Copy - Web Form Example Template","shared":"false","passwordProtected":"false","description":"Example template created via the API","created":"2023-12-07T21:35:55.6300000Z","lastModified":"2023-12-07T21:38:04.3800000Z","lastModifiedBy":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com","uri":"/users/8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1"},"lastUsed":"2023-12-07T21:35:55.9430000Z","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"},"pageCount":"1","folderId":"1e649420-aee9-4f2e-8265-0082f733e8f6","folderName":"Deleted Items","folderIds":["1e649420-aee9-4f2e-8265-0082f733e8f6"],"autoMatch":"true","autoMatchSpecifiedByUser":"false","documents":[{"documentId":"1","uri":"/envelopes/eb388ad9-29de-40c9-90f3-211cf7dcefdd/documents/1","name":"World_Wide_Web_Form","order":"1","pages":"1","documentBase64":"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","display":"inline","includeInDownload":"true","signerMustAcknowledge":"no_interaction","templateLocked":"false","templateRequired":"false"}],"emailSubject":"Please sign this document","emailBlurb":"","signingLocation":"Online","authoritativeCopy":"false","enforceSignerVisibility":"false","enableWetSign":"true","allowMarkup":"false","allowReassign":"true","messageLock":"false","recipientsLock":"false","brandLock":"false","customFields":{"textCustomFields":[{"fieldId":"11003755255","name":"##SFSource","show":"true","required":"false","value":""},{"fieldId":"11003755256","name":"##SFDocumentWriteBack","show":"true","required":"false","value":""},{"fieldId":"11003756051","name":"ModelNamespace","show":"false","required":"false","value":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21"},{"fieldId":"11003756052","name":"ModelVersion","show":"false","required":"false","value":"1"},{"fieldId":"11003756053","name":"ModelAccount","show":"false","required":"false","value":"0820f9c5-0d81-489a-bcc9-8a0df87f44aa"}],"listCustomFields":[]},"recipients":{"signers":[{"defaultRecipient":"false","tabs":{"signHereTabs":[{"stampType":"signature","name":"SignHere","tabLabel":"Signature","scaleValue":"1","optional":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"126","yPosition":"374","anchorString":"/SignHere/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"779409ee-df52-4560-82f5-d036273703ae","tabType":"signhere"}],"dateSignedTabs":[{"name":"DateSigned","value":"","tabLabel":"DateSigned","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"409","yPosition":"396","anchorString":"/Date/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"4f92b805-4bd3-41e3-94cb-343cea58c9b8","tabType":"datesigned"}],"textTabs":[{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"FullName","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"145","yPosition":"234","width":"0","height":"0","anchorString":"/FullName/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.SignerName\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"PhoneNumber","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"167","yPosition":"261","width":"0","height":"0","anchorString":"/PhoneNumber/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"Company","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"182","yPosition":"315","width":"0","height":"0","anchorString":"/Company/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Company\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"JobTitle","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"137","yPosition":"342","width":"0","height":"0","anchorString":"/Title/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}","tabType":"text"}],"checkboxTabs":[{"name":"Yes","tabLabel":"Yes","selected":"false","selectedOriginal":"false","requireInitialOnSharedChange":"false","bold":"false","italic":"false","underline":"false","required":"true","locked":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"237","yPosition":"288","width":"0","height":"0","anchorString":"/SMS/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}","tabType":"checkbox"}]},"signInEachLocation":"false","agentCanEditEmail":"false","agentCanEditName":"false","requireUploadSignature":"false","name":"","email":"","recipientId":"1","recipientIdGuid":"00000000-0000-0000-0000-000000000000","accessCode":"","requireIdLookup":"false","routingOrder":"1","note":"","roleName":"signer","completedCount":"0","deliveryMethod":"email","templateLocked":"false","templateRequired":"false","inheritEmailNotificationConfiguration":"false","recipientType":"signer"}],"agents":[],"editors":[],"intermediaries":[],"carbonCopies":[],"certifiedDeliveries":[],"inPersonSigners":[],"seals":[],"witnesses":[],"notaries":[],"recipientCount":"1"},"envelopeIdStamping":"true","autoNavigation":"true","allowComments":"true","disableResponsiveDocument":"true","anySigner":null,"envelopeLocation":"current_site"}]} + + diff --git a/examples/WebForms/eg001CreateInstance.ps1 b/examples/WebForms/eg001CreateInstance.ps1 index bbfffe9..a262787 100644 --- a/examples/WebForms/eg001CreateInstance.ps1 +++ b/examples/WebForms/eg001CreateInstance.ps1 @@ -20,7 +20,7 @@ $webFormConfig = Get-Content -Raw demo_documents\web-form-config.json $result = $webFormConfig -replace "template-id", $templateId $result | Set-Content -Path demo_documents\web-form-config.json -Write-Host "" +Write-Host "" Write-Host "Go to your Docusign account to create the Web Form. Go to 'Templates' in your developer account, select 'Start,' select 'Web Forms,' and choose 'Upload Web Form.' Upload the JSON config file 'web-form-config.json' found under the demo_documents folder of this project. You will need to activate the web form before proceeding. Press Continue after doing so." $choice = Read-Host @@ -77,7 +77,7 @@ $formUrl = $responseContent.formUrl $instanceToken = $responseContent.instanceToken $integrationKey = $config.INTEGRATION_KEY_AUTH_CODE -Start-Process -NoNewWindow -FilePath "powershell" -ArgumentList "-File .\utils\startServerForWebFormsExample.ps1 -integrationKey $integrationKey -url $formUrl -instanceToken $instanceToken" +Invoke-Script -Command "./utils/startServerForWebFormsExample.ps1 -integrationKey $integrationKey -url $formUrl -instanceToken $instanceToken" Write-Output "" Write-Output "Done." diff --git a/utils/createWebFormTemplate.ps1 b/utils/createWebFormTemplate.ps1 index 1d39fd0..ccd6aac 100644 --- a/utils/createWebFormTemplate.ps1 +++ b/utils/createWebFormTemplate.ps1 @@ -65,8 +65,8 @@ $json = @" "tabLabel": "Yes", "anchorString": "/SMS/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" } ], "signHereTabs": [ @@ -85,32 +85,32 @@ $json = @" "tabLabel": "FullName", "anchorString": "/FullName/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" }, { "documentId": "1", "tabLabel": "PhoneNumber", "anchorString": "/PhoneNumber/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" }, { "documentId": "1", "tabLabel": "Company", "anchorString": "/Company/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" }, { "documentId": "1", "tabLabel": "JobTitle", "anchorString": "/Title/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" } ], "dateSignedTabs": [ @@ -119,8 +119,8 @@ $json = @" "tabLabel": "DateSigned", "anchorString": "/Date/", "anchorUnits": "pixels", - "anchorXOffset": "20", - "anchorYOffset": "10" + "anchorXOffset": "0", + "anchorYOffset": "0" } ] } diff --git a/utils/invokeScript.ps1 b/utils/invokeScript.ps1 index 35069a6..838a894 100644 --- a/utils/invokeScript.ps1 +++ b/utils/invokeScript.ps1 @@ -4,7 +4,7 @@ function Invoke-Script { ) # Get the path to the PowerShell executable - $powershellPath = if ($IsWindows) { + $powershellPath = if ([System.Environment]::OSVersion.Platform -eq "Win32NT") { try { (Get-Command powershell.exe -ErrorAction Stop).Source } catch { From b216fe956cfadca27c86887c2c1be7ccdb84a588 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 1 Nov 2024 12:41:41 +0100 Subject: [PATCH 428/462] updated the file to include pkce --- OAuth/code_grant.ps1 | 191 ++++++++++++++++++++++++++++--------------- 1 file changed, 127 insertions(+), 64 deletions(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 6254c66..27124b4 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -42,75 +42,106 @@ elseif ($apiVersion -eq "webForms") { $scopes = "signature%20webforms_read%20webforms_instance_read%20webforms_instance_write" } +function GenerateCodeVerifier { + return -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 43 | ForEach-Object {[char]$_}) +} -$authorizationEndpoint = "https://account-d.docusign.com/oauth/" -$redirectUri = "http://${IP}:${PORT}/authorization-code/callback" -$redirectUriEscaped = [Uri]::EscapeDataString($redirectURI) -$authorizationURL = "${authorizationEndpoint}auth?response_type=code&scope=$scopes&client_id=$clientId&state=$state&redirect_uri=$redirectUriEscaped" +function GenerateCodeChallenge($verifier) { + $sha256 = [System.Security.Cryptography.SHA256]::Create() + $hash = $sha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($verifier)) + return [Convert]::ToBase64String($hash).TrimEnd('=').Replace('+', '-').Replace('/', '_') +} +function StartHttpListenerAndAuthorize { + param ( + [string]$authorizationURL, + [string]$redirectURI + ) -# Request the authorization code -# Use Http Server -$http = New-Object System.Net.HttpListener + $http = New-Object System.Net.HttpListener + $http.Prefixes.Add("$redirectURI/") -# Hostname and port to listen on + try { + $http.Start() + } catch { + Write-Error "OAuth listener failed. Is port 8080 in use by another program?" -ErrorAction Stop + return $null + } -$http.Prefixes.Add($redirectURI + "/") -try { -# Start the Http Server -$http.Start() + if ($http.IsListening) { + # Notify the user to open the authorization URL + Write-Output "Open the following URL in a browser to continue: $authorizationURL" + Start-Process $authorizationURL + } -} -catch { - Write-Error "OAuth listener failed. Is port 8080 in use by another program?" -ErrorAction Stop -} + while ($http.IsListening) { + $context = $http.GetContext() + + if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.Url.LocalPath -match '/authorization-code/callback') { + # Prepare the HTML response + [string]$html = ' + + + + + + + Ok. You may close this tab and return to the shell. This window closes automatically in five seconds. + + + ' + $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) + $context.Response.ContentLength64 = $buffer.Length + $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) + $context.Response.OutputStream.Close() + + $url = $context.Request.Url.ToString() + $http.Stop() + + return $url + } + } -if ($http.IsListening) { - Write-Output "Open the following URL in a browser to continue:" $authorizationURL - Start-Process $authorizationURL + return $null # Fallback if the function exits without returning } -while ($http.IsListening) { - $context = $http.GetContext() - - if ($context.Request.HttpMethod -eq 'GET' -and $context.Request.Url.LocalPath -match '/authorization-code/callback') { - # write-host "Check context" - # write-host "$($context.Request.UserHostAddress) => $($context.Request.Url)" -f 'mag' - [string]$html = ' - - - - - - - Ok. You may close this tab and return to the shell. This window closes automatically in five seconds. - - - - ' - # Respond to the request - $buffer = [System.Text.Encoding]::UTF8.GetBytes($html) # Convert HTML to bytes - $context.Response.ContentLength64 = $buffer.Length - $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) # Stream HTML to browser - $context.Response.OutputStream.Close() # Close the response - - # Get context - $Regex = [Regex]::new("(?<=code=)(.*)(?=&state)") - $Match = $Regex.Match($context.Request.Url) +function ExtractAuthorizationCode { + param ( + [Uri]$requestUrl + ) + + # Extract the authorization code using regex + $Regex = [Regex]::new("(?<=code=)([^&]*)") + $Match = $Regex.Match($requestUrl.ToString()) + if ($Match.Success) { - $authorizationCode = $Match.Value + return $Match.Value + } else { + return $null } +} - $http.Stop() - } +$codeVerifier = GenerateCodeVerifier +$code_challenge = GenerateCodeChallenge($codeVerifier) +[System.Environment]::SetEnvironmentVariable("codeVerifier", $codeVerifier, "Process") + +$usePkce = $true; +$authorizationEndpoint = "https://account-d.docusign.com/oauth/" +$redirectUri = "http://${IP}:${PORT}/authorization-code/callback" +$redirectUriEscaped = [Uri]::EscapeDataString($redirectURI) +$authorizationURL = "${authorizationEndpoint}auth?response_type=code&scope=$scopes&client_id=$clientId&state=$state&redirect_uri=$redirectUriEscaped&code_challenge=$code_challenge&code_challenge_method=S256" + +$requestUrl = StartHttpListenerAndAuthorize -authorizationURL $authorizationURL -redirectURI $redirectURI +if ($requestUrl -is [System.Object[]] -and $requestUrl.Count -gt 0) { + $requestUrl = $requestUrl[-1] # Get the last element of the array } +$authorizationCode = ExtractAuthorizationCode -requestUrl $requestUrl + # Obtain the access token # Preparing an Authorization header which contains your integration key and secret key $authorizationHeader = "${clientId}:${clientSecret}" @@ -119,16 +150,48 @@ $authorizationHeader = "${clientId}:${clientSecret}" $authorizationHeaderBytes = [System.Text.Encoding]::UTF8.GetBytes($authorizationHeader) $authorizationHeaderKey = [System.Convert]::ToBase64String($authorizationHeaderBytes) -try { - Write-Output "Getting an access token..." - $accessTokenResponse = Invoke-RestMethod ` - -Uri "$authorizationEndpoint/token" ` - -Method "POST" ` - -Headers @{ "Authorization" = "Basic $authorizationHeaderKey" } ` - -Body @{ - "grant_type" = "authorization_code"; - "code" = "$authorizationCode" + try { + Write-Output "Getting an access token..." + $accessTokenResponse = Invoke-RestMethod ` + -Uri "$authorizationEndpoint/token" ` + -Method "POST" ` + -Headers @{ "Authorization" = "Basic $authorizationHeaderKey" } ` + -Body @{ + "grant_type" = "authorization_code"; + "code" = "$authorizationCode" + "code_verifier" = "$codeVerifier" + } + } catch { + Write-Output "Error fetching access token" + $usePkce = $false + Write-Output "PKCE failed" + } + + if (-not $usePkce) { + $authorizationURL = "${authorizationEndpoint}auth?response_type=code&scope=$scopes&client_id=$clientId&state=$state&redirect_uri=$redirectUriEscaped" + + $requestUrl = StartHttpListenerAndAuthorize -authorizationURL $authorizationURL -redirectURI $redirectURI + if ($requestUrl -is [System.Object[]] -and $requestUrl.Count -gt 0) { + $requestUrl = $requestUrl[-1] # Get the last element of the array + } + $authorizationCode = ExtractAuthorizationCode -requestUrl $requestUrl + + $authorizationHeader = "${clientId}:${clientSecret}" + $authorizationHeaderBytes = [System.Text.Encoding]::UTF8.GetBytes($authorizationHeader) + $authorizationHeaderKey = [System.Convert]::ToBase64String($authorizationHeaderBytes) + + Write-Output "Getting an access token..." + $accessTokenResponse = Invoke-RestMethod ` + -Uri "$authorizationEndpoint/token" ` + -Method "POST" ` + -Headers @{ "Authorization" = "Basic $authorizationHeaderKey" } ` + -Body @{ + "grant_type" = "authorization_code"; + "code" = "$authorizationCode" + } } + +try { $accessToken = $accessTokenResponse.access_token Write-Output "Access token: $accessToken" Write-Output $accessToken > $accessTokenFile From 8fe10777384db587d1661a03b5a81c3f4242baef Mon Sep 17 00:00:00 2001 From: Paige Rossi <70241979+paigesrossi@users.noreply.github.com> Date: Wed, 13 Nov 2024 14:54:49 -0800 Subject: [PATCH 429/462] Navigator examples (#112) * navigator additions Co-authored-by: Karissa Jacobsen --- OAuth/code_grant.ps1 | 4 +- OAuth/jwt.ps1 | 3 + Quick_ACG/launcherACG.ps1 | 2 +- examples/Navigator/eg001ListAgreements.ps1 | 49 ++++++++++++ .../Navigator/eg002GetSingleAgreement.ps1 | 78 +++++++++++++++++++ launcher.ps1 | 62 +++++++++++---- 6 files changed, 182 insertions(+), 16 deletions(-) create mode 100644 examples/Navigator/eg001ListAgreements.ps1 create mode 100644 examples/Navigator/eg002GetSingleAgreement.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 6254c66..1e86713 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -41,7 +41,9 @@ elseif ($apiVersion -eq "maestro") { elseif ($apiVersion -eq "webForms") { $scopes = "signature%20webforms_read%20webforms_instance_read%20webforms_instance_write" } - +elseif ($apiVersion -eq "navigator") { + $scopes = "signature%20adm_store_unified_repo_read" +} $authorizationEndpoint = "https://account-d.docusign.com/oauth/" $redirectUri = "http://${IP}:${PORT}/authorization-code/callback" diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index f043e21..97fe664 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -54,6 +54,9 @@ if ($apiVersion -eq "rooms") { elseif ($apiVersion -eq "webForms") { $scopes = "signature%20webforms_read%20webforms_instance_read%20webforms_instance_write" } + elseif ($apiVersion -eq "navigator") { + $scopes = "signature%20adm_store_unified_repo_read" +} # Request application consent $PORT = '8080' diff --git a/Quick_ACG/launcherACG.ps1 b/Quick_ACG/launcherACG.ps1 index 7248c89..08154d1 100644 --- a/Quick_ACG/launcherACG.ps1 +++ b/Quick_ACG/launcherACG.ps1 @@ -57,5 +57,5 @@ function startSignature { exit 1 } -Write-Output "Welcome to the DocuSign PowerShell Quick Authorization Code Grant Launcher" +Write-Output "Welcome to the Docusign PowerShell Quick Authorization Code Grant Launcher" startQuickACG diff --git a/examples/Navigator/eg001ListAgreements.ps1 b/examples/Navigator/eg001ListAgreements.ps1 new file mode 100644 index 0000000..bdd22f6 --- /dev/null +++ b/examples/Navigator/eg001ListAgreements.ps1 @@ -0,0 +1,49 @@ +$apiUri = "https://api-d.docusign.com/v1" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" +$agreementsPath = ".\config\AGREEMENTS.txt" + +# Get required variables from .\config\settings.json file +$config = Get-Content $configPath -Raw | ConvertFrom-Json + +$accessToken = Get-Content $tokenPath +$accountId = Get-Content $accountIdPath + +#ds-snippet-start:Navigator1Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Navigator1Step2 + +# List agreements +#ds-snippet-start:Navigator1Step3 +$response = New-TemporaryFile +Invoke-RestMethod ` + -Uri "${apiUri}/accounts/${accountId}/agreements" ` + -Method 'GET' ` + -Headers $headers ` + -OutFile $response + +$responseContent = $(Get-Content $response | ConvertFrom-Json) +#ds-snippet-end:Navigator1Step3 + +Write-Host "" +Write-Output "Response: $(Get-Content -Raw $response)" + +# Clear the output file at the beginning +Clear-Content -Path $agreementsPath -ErrorAction SilentlyContinue + +# Loop through each item in the 'data' array +foreach ($item in $responseContent.data) { + # Extract id and file_name + $id = $item.id + $fileName = $item.file_name + + # Write the id and file_name to the output file + "$id $fileName" | Out-File -FilePath $agreementsPath -Append +} + +Write-Output "" +Write-Output "Done." diff --git a/examples/Navigator/eg002GetSingleAgreement.ps1 b/examples/Navigator/eg002GetSingleAgreement.ps1 new file mode 100644 index 0000000..dc76b0c --- /dev/null +++ b/examples/Navigator/eg002GetSingleAgreement.ps1 @@ -0,0 +1,78 @@ +$apiUri = "https://api-d.docusign.com/v1" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" +$agreementsPath = ".\config\AGREEMENTS.txt" + +# Check if the agreements file exists and has content +if (-not (Test-Path $agreementsPath) -or -not (Get-Content $agreementsPath -ErrorAction SilentlyContinue)) { + Write-Output "No agreements found in $agreementsPath." + Write-Output "Please run Navigator example 1: List_Agreements first to get a list of agreements." + exit 0 +} + +# Load the file into an array, separating each line into id and file name +$agreements = Get-Content -Path $agreementsPath | ForEach-Object { + $parts = $_ -split '\s+' + [PSCustomObject]@{ + Id = $parts[0] + FileName = $parts[1] + } +} + +# Display the file names for selection +Write-Output "Please select an agreement:" +for ($i = 0; $i -lt $agreements.Count; $i++) { + Write-Output "$($i + 1). $($agreements[$i].FileName)" +} + +# Prompt user selection +do { + $selection = Read-Host "Enter the number corresponding to your choice" + + if ($selection -match '^\d+$' -and $selection -gt 0 -and $selection -le $agreements.Count) { + $chosenAgreement = $agreements[$selection - 1] + $AGREEMENT_ID = $chosenAgreement.Id + + Write-Output "You selected: $($chosenAgreement.FileName)" + Write-Output "AGREEMENT_ID: $AGREEMENT_ID" + break + } + else { + Write-Output "Invalid selection. Please try again." + } +} while ($true) + +# Get required variables from .\config\settings.json file +$config = Get-Content $configPath -Raw | ConvertFrom-Json + +$accessToken = Get-Content $tokenPath +$accountId = Get-Content $accountIdPath + +#ds-snippet-start:Navigator2Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Navigator2Step2 + +# List agreements +#ds-snippet-start:Navigator2Step3 +$response = New-TemporaryFile +Invoke-RestMethod ` + -Uri "${apiUri}/accounts/${accountId}/agreements/${AGREEMENT_ID}" ` + -Method 'GET' ` + -Headers $headers ` + -OutFile $response + +$responseContent = $(Get-Content $response | ConvertFrom-Json) +#ds-snippet-end:Navigator2Step3 + +Write-Host "" +Write-Output "Response: $(Get-Content -Raw $response)" + + + + +Write-Output "" +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 0a02116..c89b762 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -37,7 +37,7 @@ function isCFR { function checkEmailAddresses { - if (-not [system.Text.RegularExpressions.Regex]::IsMatch($config.SIGNER_EMAIL, + if (-not [system.Text.RegularExpressions.Regex]::IsMatch($config.SIGNER_EMAIL, "^(?("")("".+?(? Date: Fri, 15 Nov 2024 11:22:18 -0800 Subject: [PATCH 430/462] fixing merge coflict --- OAuth/code_grant.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 8d7986b..483f45b 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -48,7 +48,7 @@ elseif ($apiVersion -eq "navigator") { function GenerateCodeVerifier { return -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 43 | ForEach-Object {[char]$_}) - +} function GenerateCodeChallenge($verifier) { $sha256 = [System.Security.Cryptography.SHA256]::Create() $hash = $sha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($verifier)) From ac427eaf1f0713449b5e0dc56252d2ebbff22dd9 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Thu, 21 Nov 2024 13:46:17 -0800 Subject: [PATCH 431/462] updating to use new endpoints for Maestro 1 --- examples/Maestro/eg001TriggerWorkflow.ps1 | 25 +++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index 750b5d1..9ebc3d0 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -16,7 +16,7 @@ if (Test-Path .\config\WORKFLOW_ID) { exit 1 } -$base_path = "https://demo.services.docusign.net/aow-manage/v1.0" +$base_path = "https://demo.services.docusign.net/v1" # Step 1: Obtain your OAuth token # Note: Substitute these values with your own @@ -41,12 +41,13 @@ Write-Output "Attempting to retrieve Workflow definition..." #ds-snippet-start:Maestro1Step3 Invoke-RestMethod ` - -Uri "${base_path}/management/accounts/${accountId}/workflowDefinitions/${workflowId}" ` + -Uri "${base_path}/accounts/${accountId}/workflows/${workflowId}/trigger-requirements" ` -Method 'GET' ` -Headers $headers ` -OutFile $response -$triggerUrl = $(Get-Content $response | ConvertFrom-Json).triggerUrl +$jsonContent = Get-Content -Path $response -Raw | ConvertFrom-Json +$triggerUrl = $jsonContent.trigger_http_config.url #ds-snippet-end:Maestro1Step3 $instance_name = Read-Host "Please input a name for the workflow instance" @@ -58,15 +59,13 @@ $cc_email = Read-Host "Please input an email for the cc participant" #ds-snippet-start:Maestro1Step4 $body = @" { - "instanceName": "$instance_name", - "participants": {}, - "payload": { - "signerEmail": "$signer_email", - "signerName": "$signer_name", - "ccEmail": "$cc_email", - "ccName": "$cc_name" - }, - "metadata": {} + "instance_name": "$instance_name", + "trigger_inputs": { + "signer_email": "$signer_email", + "signer_name": "$signer_name", + "cc_email": "$cc_email", + "cc_name": "$cc_name" + } } "@ #ds-snippet-end:Maestro1Step4 @@ -85,4 +84,4 @@ Write-Output $instanceId > .\config\INSTANCE_ID # cleanup Remove-Item $response -Write-Output "Done." +Write-Output "Done." \ No newline at end of file From 63764bd74e8dd2498bac3e9613e62dc8e81333bd Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Fri, 22 Nov 2024 15:02:56 -0800 Subject: [PATCH 432/462] adding start method to workflow definition --- examples/Maestro/createWorkflowUtils.ps1 | 48 +++--------------------- 1 file changed, 5 insertions(+), 43 deletions(-) diff --git a/examples/Maestro/createWorkflowUtils.ps1 b/examples/Maestro/createWorkflowUtils.ps1 index e4f81a1..00cb83f 100644 --- a/examples/Maestro/createWorkflowUtils.ps1 +++ b/examples/Maestro/createWorkflowUtils.ps1 @@ -90,7 +90,8 @@ $body = @" "propertyName": "dacId", "stepId": "$triggerId" } - } + }, + "type": "API" }, "variables": { "dacId_$triggerId": { @@ -145,46 +146,6 @@ $body = @" "steps": [ { "id": "step1", - "name": "Set Up Invite", - "moduleName": "Notification-SendEmail", - "configurationProgress": "Completed", - "type": "DS-EmailNotification", - "config": { - "templateType": "WorkflowParticipantNotification", - "templateVersion": 1, - "language": "en", - "sender_name": "DocuSign Orchestration", - "sender_alias": "Orchestration", - "participantId": "$signerId" - }, - "input": { - "recipients": [ - { - "name": { - "source": "step", - "propertyName": "signerName", - "stepId": "$triggerId" - }, - "email": { - "source": "step", - "propertyName": "signerEmail", - "stepId": "$triggerId" - } - } - ], - "mergeValues": { - "CustomMessage": "Follow this link to access and complete the workflow.", - "ParticipantFullName": { - "source": "step", - "propertyName": "signerName", - "stepId": "$triggerId" - } - } - }, - "output": {} - }, - { - "id": "step2", "name": "Get Signatures", "moduleName": "ESign", "configurationProgress": "Completed", @@ -551,7 +512,7 @@ $body = @" } }, { - "id": "step3", + "id": "step2", "name": "Show a Confirmation Screen", "moduleName": "ShowConfirmationScreen", "configurationProgress": "Completed", @@ -604,6 +565,7 @@ while (-not $published) { Invoke-RestMethod -Uri "$base_path/management/accounts/$accountId/workflowDefinitions/$workflow_id/publish?isPreRunCheck=true" -Method POST -Headers $Headers $published = $true + $filePath = "config/WORKFLOW_ID" $workflow_id | Out-File -FilePath "config/WORKFLOW_ID" Write-Host "Successfully created and published workflow $workflow_id, ID saved to config/WORKFLOW_ID" } @@ -625,4 +587,4 @@ while (-not $published) { } # Remove the temporary files -Remove-Item $response +Remove-Item $response \ No newline at end of file From e3e9e030d81d864295176cb73b352d65c2f06f5a Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Wed, 27 Nov 2024 13:12:06 -0800 Subject: [PATCH 433/462] removing maestro 2 and 3 --- examples/Maestro/eg002CancelWorkflow.ps1 | 54 ------------------- examples/Maestro/eg003GetWorkflowStatus.ps1 | 58 --------------------- launcher.ps1 | 13 +---- 3 files changed, 1 insertion(+), 124 deletions(-) delete mode 100644 examples/Maestro/eg002CancelWorkflow.ps1 delete mode 100644 examples/Maestro/eg003GetWorkflowStatus.ps1 diff --git a/examples/Maestro/eg002CancelWorkflow.ps1 b/examples/Maestro/eg002CancelWorkflow.ps1 deleted file mode 100644 index 44c27b8..0000000 --- a/examples/Maestro/eg002CancelWorkflow.ps1 +++ /dev/null @@ -1,54 +0,0 @@ -# Cancel a workflow instance - -# Check that there is a workflow -if (-not (Test-Path .\config\WORKFLOW_ID)) { - Write-Output "Please create a worklow before running this example" - exit 0 -} - -# Check that there is a running workflow instance to cancel -if (Test-Path .\config\INSTANCE_ID) { - $instanceId = Get-Content .\config\INSTANCE_ID -} else { - Write-Output "Please trigger a workflow before running this example" - exit 0 -} - -$base_path = "https://demo.services.docusign.net/aow-manage/v1.0" - -# Step 1: Obtain your OAuth token -# Note: Substitute these values with your own -$accessToken = Get-Content .\config\ds_access_token.txt - -# Set up variables for full code example -# Note: Substitute these values with your own -$accountId = Get-Content .\config\API_ACCOUNT_ID - -# temp file: -$response = New-TemporaryFile - -# Construct your API headers -#ds-snippet-start:Maestro2Step2 -$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" -$headers.add("Authorization", "Bearer $accessToken") -$headers.add("Content-Type", "application/json") -$headers.add("Accept", "application/json") -#ds-snippet-end:Maestro2Step2 - -Write-Output "Attempting to cancel the Workflow Instance..." - -#ds-snippet-start:Maestro2Step3 -Invoke-RestMethod ` - -Uri "${base_path}/management/accounts/${accountId}/instances/${instanceId}/cancel" ` - -Method 'POST' ` - -Headers $headers ` - -OutFile $response - -Write-Output "Workflow has been canceled." -Write-Output "Response: $(Get-Content -Raw $response)" -#ds-snippet-end:Maestro2Step3 - -# cleanup -Remove-Item $response - -Write-Output "Done." diff --git a/examples/Maestro/eg003GetWorkflowStatus.ps1 b/examples/Maestro/eg003GetWorkflowStatus.ps1 deleted file mode 100644 index 81d6f19..0000000 --- a/examples/Maestro/eg003GetWorkflowStatus.ps1 +++ /dev/null @@ -1,58 +0,0 @@ -# Get workflow instance state - -# Check that there is a workflow -if (Test-Path .\config\WORKFLOW_ID) { - $workflowId = Get-Content .\config\WORKFLOW_ID -} else { - Write-Output "Please create a worklow before running this example" - exit 0 -} - -# Check that there is an instance -if (Test-Path .\config\INSTANCE_ID) { - $instanceId = Get-Content .\config\INSTANCE_ID -} else { - Write-Output "Please trigger a workflow before running this example" - exit 0 -} - -$base_path = "https://demo.services.docusign.net/aow-manage/v1.0" - -# Step 1: Obtain your OAuth token -# Note: Substitute these values with your own -$accessToken = Get-Content .\config\ds_access_token.txt - -# Set up variables for full code example -# Note: Substitute these values with your own -$accountId = Get-Content .\config\API_ACCOUNT_ID - -# temp file: -$response = New-TemporaryFile - -# Construct your API headers -#ds-snippet-start:Maestro3Step2 -$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" -$headers.add("Authorization", "Bearer $accessToken") -$headers.add("Content-Type", "application/json") -$headers.add("Accept", "application/json") -#ds-snippet-end:Maestro3Step2 - -Write-Output "Attempting to retrieve Workflow Instance Status..." - -#ds-snippet-start:Maestro3Step3 -Invoke-RestMethod ` - -Uri "${base_path}/management/accounts/${accountId}/workflowDefinitions/${workflowId}/instances/${instanceId}" ` - -Method 'GET' ` - -Headers $headers ` - -OutFile $response - -$status = $(Get-Content $response | ConvertFrom-Json).instanceState - -Write-Output "Workflow Status: $status" -Write-Output "Response: $(Get-Content -Raw $response)" -#ds-snippet-end:Maestro3Step3 - -# cleanup -Remove-Item $response - -Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index c89b762..7bd8d4f 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1002,17 +1002,13 @@ function startMaestro { do { Enum listMaestroExamples { triggerWorkflow = 1; - cancelWorkflow = 2; - getWorkflowStatus = 3; - Pick_An_API = 4; + Pick_An_API = 2; } $listMaestroExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMaestroExamples]::triggerWorkflow)) How to trigger a Maestro workflow" - Write-Output "$([int][listMaestroExamples]::cancelWorkflow)) How to cancel a Maestro workflow instance" - Write-Output "$([int][listMaestroExamples]::getWorkflowStatus)) How to get the status of a Maestro workflow instance" Write-Output "$([int][listMaestroExamples]::Pick_An_API)) Pick_An_API" [int]$listMaestroExamplesView = Read-Host "Select the action" } while (-not [listMaestroExamples]::IsDefined([listMaestroExamples], $listMaestroExamplesView)); @@ -1021,13 +1017,6 @@ function startMaestro { Invoke-Script -Command "`".\examples\Maestro\eg001TriggerWorkflow.ps1`"" } - elseif ($listMaestroExamplesView -eq [listMaestroExamples]::cancelWorkflow) { - Invoke-Script -Command "`".\examples\Maestro\eg002CancelWorkflow.ps1`"" - - } - elseif ($listMaestroExamplesView -eq [listMaestroExamples]::getWorkflowStatus) { - Invoke-Script -Command "`".\examples\Maestro\eg003GetWorkflowStatus.ps1`"" - } } until ($listMaestroExamplesView -eq [listMaestroExamples]::Pick_An_API) startLauncher From ff54a9332b948ca4d6eabb9d424c0b98b7d89bd7 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Thu, 2 Jan 2025 09:57:04 -0800 Subject: [PATCH 434/462] cursor value change --- examples/Monitor/eg001GetMonitoringData.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Monitor/eg001GetMonitoringData.ps1 b/examples/Monitor/eg001GetMonitoringData.ps1 index b0131a0..7aacf53 100644 --- a/examples/Monitor/eg001GetMonitoringData.ps1 +++ b/examples/Monitor/eg001GetMonitoringData.ps1 @@ -14,7 +14,7 @@ $headers.add("Content-Type", "application/json") # Declare variables $complete=$false -$cursorValue="" +$cursorValue = (Get-Date (Get-Date).AddDays(-10) -Format "yyyy-MM-dd") $iterations=0 # You must provide an access token that impersonates a user with permissions to access the Monitor API endpoint if (($accessToken -eq "") -or ($null -eq $accessToken)) { From 7e5c993c1046c92f5e3b961544b7c8d55f7acf6c Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Fri, 3 Jan 2025 10:22:03 -0800 Subject: [PATCH 435/462] Docusign case change --- LICENSE | 2 +- PAYMENTS_INSTALLATION.md | 4 +- README.md | 48 +++++++++---------- eg001EmbeddedSigning.ps1 | 10 ++-- .../eg001CreateNewUserWithActiveStatus.ps1 | 2 +- examples/Admin/eg006GetUserProfileByEmail.ps1 | 2 +- .../Admin/eg007GetUserProfileByUserId.ps1 | 2 +- examples/Maestro/createWorkflowUtils.ps1 | 2 +- examples/Notary/Jurisdictions.ps1 | 2 +- examples/eSignature/eg002SigningViaEmail.ps1 | 2 +- examples/eSignature/eg003ListEnvelopes.ps1 | 2 +- examples/eSignature/eg004EnvelopeInfo.ps1 | 2 +- .../eSignature/eg005EnvelopeRecipients.ps1 | 2 +- examples/eSignature/eg006EnvelopeDocs.ps1 | 2 +- examples/eSignature/eg007EnvelopeGetDoc.ps1 | 2 +- examples/eSignature/eg008CreateTemplate.ps1 | 2 +- examples/eSignature/eg009UseTemplate.ps1 | 4 +- examples/eSignature/eg010SendBinaryDocs.ps1 | 2 +- examples/eSignature/eg011EmbeddedSending.ps1 | 8 ++-- examples/eSignature/eg012EmbeddedConsole.ps1 | 6 +-- examples/eSignature/eg013AddDocToTemplate.ps1 | 8 ++-- examples/eSignature/eg014CollectPayment.ps1 | 4 +- examples/eSignature/eg016SetTabValues.ps1 | 8 ++-- .../eSignature/eg017SetTemplateTabValues.ps1 | 8 ++-- .../eg018EnvelopeCustomFieldData.ps1 | 2 +- .../eg034UseConditionalRecipients.ps1 | 2 +- examples/eSignature/eg035ScheduledSending.ps1 | 2 +- examples/eSignature/eg036DelayedRouting.ps1 | 2 +- examples/eSignature/eg037SMSDelivery.ps1 | 2 +- .../eSignature/eg038ResponsiveSigning.ps1 | 10 ++-- examples/eSignature/eg039SigningInPerson.ps1 | 10 ++-- .../eSignature/eg040SetDocumentVisibility.ps1 | 4 +- .../eSignature/eg041EmbeddedSigningCFR.ps1 | 8 ++-- .../eSignature/eg042DocumentGeneration.ps1 | 2 +- examples/eSignature/eg044FocusedView.ps1 | 10 ++-- launcher.ps1 | 6 +-- utils/createWebFormTemplate.ps1 | 2 +- 37 files changed, 99 insertions(+), 99 deletions(-) diff --git a/LICENSE b/LICENSE index 390a206..e769623 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2018 DocuSign, Inc. (https://www.docusign.com) +Copyright (c) 2018 Docusign, Inc. (https://www.docusign.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/PAYMENTS_INSTALLATION.md b/PAYMENTS_INSTALLATION.md index 6531b12..c3fb4b9 100644 --- a/PAYMENTS_INSTALLATION.md +++ b/PAYMENTS_INSTALLATION.md @@ -1,6 +1,6 @@ # Configure a payment gateway -DocuSign offers built-in connections to multiple payment gateways. The payments code example uses a developer account via the Stripe gateway service. +Docusign offers built-in connections to multiple payment gateways. The payments code example uses a developer account via the Stripe gateway service. ## Create a Stripe payment gateway @@ -11,7 +11,7 @@ DocuSign offers built-in connections to multiple payment gateways. The payments ![Skipping the Stripe account form](docs/stripe_skip_account_form_link.png) - An enabled Stripe payment gateway is now associated with your DocuSign developer account and is shown under **Payment Gateway**. + An enabled Stripe payment gateway is now associated with your Docusign developer account and is shown under **Payment Gateway**. 1. Save the **Gateway Account ID** GUID to the code example launcher configuration file. diff --git a/README.md b/README.md index 8fd2072..cd536e1 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ This GitHub repo includes code examples for the [Web Forms API](https://develope This repo includes a PowerShell command-line application that supports the following authentication workflows: -* Authentication with DocuSign via [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode). +* Authentication with Docusign via [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode). When the token expires, the user is asked to re-authenticate. The refresh token is not used. -* Authentication with DocuSign via [JSON Web Token (JWT) Grant](https://developers.docusign.com/platform/auth/jwt/). +* Authentication with Docusign via [JSON Web Token (JWT) Grant](https://developers.docusign.com/platform/auth/jwt/). When the token expires, it updates automatically. @@ -24,22 +24,22 @@ When the token expires, it updates automatically. For more information about the scopes used for obtaining authorization to use the eSignature REST API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). -For a list of code examples that use the eSignature REST API, see the [How-to guides overview](https://developers.docusign.com/docs/esign-rest-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the eSignature REST API, see the [How-to guides overview](https://developers.docusign.com/docs/esign-rest-api/how-to/) on the Docusign Developer Center. ## Admin API -**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your DocuSign developer account. Also, to run the DocuSign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/DocuSign-and-SpringCM). +**Note:** To use the Admin API, you must [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your Docusign developer account. Also, to run the Docusign CLM code example, [CLM must be enabled for your organization](https://support.docusign.com/en/articles/Docusign-and-SpringCM). For information about the scopes used for obtaining authorization to use the Admin API, see the [scopes section](https://developers.docusign.com/docs/admin-api/admin101/auth/). -For a list of code examples that use the Admin API, see the [How-to guides overview](https://developers.docusign.com/docs/admin-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the Admin API, see the [How-to guides overview](https://developers.docusign.com/docs/admin-api/how-to/) on the Docusign Developer Center. ## Click API For more information about the scopes used for obtaining authorization to use the Click API, see [Required scopes](https://developers.docusign.com/docs/click-api/click101/auth/#required-scopes) -For a list of code examples that use the Click API, see the [How-to guides overview](https://developers.docusign.com/docs/click-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the Click API, see the [How-to guides overview](https://developers.docusign.com/docs/click-api/how-to/) on the Docusign Developer Center. ## ID Evidence API @@ -48,7 +48,7 @@ For a list of code examples that use the Click API, see the [How-to guides overv For more information about the scopes used for obtaining authorization to use the ID Evidence API, see [Required scopes](https://developers.docusign.com/docs/esign-rest-api/esign101/auth#required-scopes). -For a list of code examples that use the ID Evidence API, see the [How-to guides overview](https://developers.docusign.com/docs/idevidence-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the ID Evidence API, see the [How-to guides overview](https://developers.docusign.com/docs/idevidence-api/how-to/) on the Docusign Developer Center. ## Maestro API (beta) @@ -56,55 +56,55 @@ For a list of code examples that use the ID Evidence API, see the [How-to guides For information about the scopes used for obtaining authorization to use the Maestro API, see the [scopes section](https://developers.docusign.com/docs/maestro-api/auth/). -For a list of code examples that use the Maestro API, see the [How-to guides overview](https://developers.docusign.com/docs/maestro-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the Maestro API, see the [How-to guides overview](https://developers.docusign.com/docs/maestro-api/how-to/) on the Docusign Developer Center. ## Monitor API -**Note:** To use the Monitor API, you must also [enable DocuSign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). +**Note:** To use the Monitor API, you must also [enable Docusign Monitor for your organization](https://developers.docusign.com/docs/monitor-api/how-to/enable-monitor/). For information about the scopes used for obtaining authorization to use the Monitor API, see the [scopes section](https://developers.docusign.com/docs/monitor-api/monitor101/auth/). -For a list of code examples that use the Monitor API, see the [How-to guides overview](https://developers.docusign.com/docs/monitor-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the Monitor API, see the [How-to guides overview](https://developers.docusign.com/docs/monitor-api/how-to/) on the Docusign Developer Center. ## Notary API (closed beta) -**Note:** For closed beta participants interested in adding Notary API functionality to your production account, contact your DocuSign representative. +**Note:** For closed beta participants interested in adding Notary API functionality to your production account, contact your Docusign representative. -Example 1 requires a Sender DocuSign developer account API account ID that has been provisioned for the [Notary API base URI](https://developers.docusign.com/docs/notary-api/go-live/). +Example 1 requires a Sender Docusign developer account API account ID that has been provisioned for the [Notary API base URI](https://developers.docusign.com/docs/notary-api/go-live/). -Example 2 requires that you [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your Sender DocuSign developer account. +Example 2 requires that you [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your Sender Docusign developer account. For information about the scopes used for obtaining authorization to use the Notary API, see the [scopes section](https://developers.docusign.com/docs/notary-api/notary101/auth/). -For a list of code examples that use the Notary API, see the [How-to guides overview](https://developers.docusign.com/docs/notary-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the Notary API, see the [How-to guides overview](https://developers.docusign.com/docs/notary-api/how-to/) on the Docusign Developer Center. ## Rooms API **Note:** To use the Rooms API, you must also [create your Rooms developer account](https://developers.docusign.com/docs/rooms-api/rooms101/create-account). -Examples 4 and 6 require that you have the DocuSign Forms feature enabled in your Rooms for Real Estate account. +Examples 4 and 6 require that you have the Docusign Forms feature enabled in your Rooms for Real Estate account. For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/rooms-api/rooms101/auth/). -For a list of code examples that use the Rooms API, see the [How-to guides overview](https://developers.docusign.com/docs/rooms-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the Rooms API, see the [How-to guides overview](https://developers.docusign.com/docs/rooms-api/how-to/) on the Docusign Developer Center. ## Web Forms API -The Web Forms API is available in all developer accounts, but only in certain production account plans. Contact [DocuSign Support](https://support.docusign.com/) or your account manager to find out whether the Web Forms API is available for your production account plan. +The Web Forms API is available in all developer accounts, but only in certain production account plans. Contact [Docusign Support](https://support.docusign.com/) or your account manager to find out whether the Web Forms API is available for your production account plan. For more information about the scopes used for obtaining authorization to use the Rooms API, see [Required scopes](https://developers.docusign.com/docs/web-forms-api/plan-integration/authentication/). -For a list of code examples that use the Web Forms API, see the [How-to guides overview](https://developers.docusign.com/docs/web-forms-api/how-to/) on the DocuSign Developer Center. +For a list of code examples that use the Web Forms API, see the [How-to guides overview](https://developers.docusign.com/docs/web-forms-api/how-to/) on the Docusign Developer Center. ## Installation ### Prerequisites -**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip items 1 and 2 as they were automatically performed for you. +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the Docusign Developer Center, skip items 1 and 2 as they were automatically performed for you. -1. A free [DocuSign developer account](https://go.docusign.com/o/sandbox/); create one if you don't already have one. -1. A DocuSign app and integration key that is configured for authentication to use either [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) or [JWT Grant](https://developers.docusign.com/platform/auth/jwt/). +1. A free [Docusign developer account](https://go.docusign.com/o/sandbox/); create one if you don't already have one. +1. A Docusign app and integration key that is configured for authentication to use either [Authorization Code Grant](https://developers.docusign.com/platform/auth/authcode/) or [JWT Grant](https://developers.docusign.com/platform/auth/jwt/). This [video](https://www.youtube.com/watch?v=eiRI4fe5HgM) demonstrates how to obtain an integration key. @@ -130,7 +130,7 @@ For a list of code examples that use the Web Forms API, see the [How-to guides o ### Installation steps -**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the Docusign Developer Center, skip step 3 as it was automatically performed for you. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. 1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. @@ -153,7 +153,7 @@ For a list of code examples that use the Web Forms API, see the [How-to guides o ### Installation steps for JWT Grant authentication -**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the DocuSign Developer Center, skip step 3 as it was automatically performed for you. Also, in order to select JSON Web Token authentication in the launcher, in config/settings.json, change the `quickstart` setting to `"false"`. +**Note:** If you downloaded this code using [Quickstart](https://developers.docusign.com/docs/esign-rest-api/quickstart/) from the Docusign Developer Center, skip step 3 as it was automatically performed for you. Also, in order to select JSON Web Token authentication in the launcher, in config/settings.json, change the `quickstart` setting to `"false"`. 1. Extract the Quickstart ZIP file or download or clone the code-examples-powershell repository. 1. In File Explorer, open your Quickstart folder or your code-examples-powershell folder. @@ -167,7 +167,7 @@ For a list of code examples that use the Web Forms API, see the [How-to guides o 1. Run the launcher. In the root folder, right-click the **launcher** file and select **Run with PowerShell** > **Open** 1. Select an API when prompted in Windows PowerShell. 1. Select **JSON Web Token** when authenticating your account. -1. When prompted, log in to your DocuSign developer account. If this is your first time using the app, select **ACCEPT** at the consent window. +1. When prompted, log in to your Docusign developer account. If this is your first time using the app, select **ACCEPT** at the consent window. 1. Select your desired code example. diff --git a/eg001EmbeddedSigning.ps1 b/eg001EmbeddedSigning.ps1 index fb1820b..1db4868 100644 --- a/eg001EmbeddedSigning.ps1 +++ b/eg001EmbeddedSigning.ps1 @@ -50,7 +50,7 @@ if ((Test-Path $docPath) -eq $false) { # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $doc1Base64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." # Concatenate the different parts of the request #ds-snippet-start:eSign1Step2 @@ -89,7 +89,7 @@ Write-Output "Sending the envelope request to DocuSign..." } | ConvertTo-Json -Depth 32 > $requestData #ds-snippet-end:eSign1Step2 -# Step 3. Call DocuSign to create the envelope +# Step 3. Call Docusign to create the envelope #ds-snippet-start:eSign1Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -111,10 +111,10 @@ Write-Output "EnvelopeId: $envelopeId" # Step 4. Create a recipient view definition # The signer will directly open this link from the browser to sign. # -# The returnUrl is normally your own web app. DocuSign will redirect +# The returnUrl is normally your own web app. Docusign will redirect # the signer to returnUrl when the signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign #ds-snippet-start:eSign1Step4 Write-Output "Requesting the url for the embedded signing..." @@ -128,7 +128,7 @@ $json = [ordered]@{ } | ConvertTo-Json -Compress #ds-snippet-end:eSign1Step4 -# Step 5. Create the recipient view and begin the DocuSign signing +# Step 5. Create the recipient view and begin the Docusign signing #ds-snippet-start:eSign1Step5 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` diff --git a/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 b/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 index f161340..4fabd0b 100644 --- a/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 +++ b/examples/Admin/eg001CreateNewUserWithActiveStatus.ps1 @@ -90,7 +90,7 @@ $body = @" #ds-snippet-end:Admin1Step5 $result = "" -# Call the DocuSign Admin API +# Call the Docusign Admin API #ds-snippet-start:Admin1Step6 $uri = "${base_path}/v2/organizations/${organizationId}/users" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method POST diff --git a/examples/Admin/eg006GetUserProfileByEmail.ps1 b/examples/Admin/eg006GetUserProfileByEmail.ps1 index 620997b..94b88af 100644 --- a/examples/Admin/eg006GetUserProfileByEmail.ps1 +++ b/examples/Admin/eg006GetUserProfileByEmail.ps1 @@ -23,7 +23,7 @@ $organizationId = $variables.ORGANIZATION_ID $email = Read-Host "Enter the user's email address" $result = "" -# Call the DocuSign Admin API +# Call the Docusign Admin API #ds-snippet-start:Admin6Step3 $uri = "${base_path}/v2.1/organizations/${organizationId}/users/dsprofile?email=${email}" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET diff --git a/examples/Admin/eg007GetUserProfileByUserId.ps1 b/examples/Admin/eg007GetUserProfileByUserId.ps1 index 5667004..dbfcd0a 100644 --- a/examples/Admin/eg007GetUserProfileByUserId.ps1 +++ b/examples/Admin/eg007GetUserProfileByUserId.ps1 @@ -23,7 +23,7 @@ $organizationId = $variables.ORGANIZATION_ID $userId = Read-Host "Enter the user's User ID" $result = "" -# Call the DocuSign Admin API +# Call the Docusign Admin API #ds-snippet-start:Admin7Step3 $uri = "${base_path}/v2.1/organizations/${organizationId}/users/${userId}/dsprofile" $result = Invoke-WebRequest -headers $headers -Uri $uri -body $body -Method GET diff --git a/examples/Maestro/createWorkflowUtils.ps1 b/examples/Maestro/createWorkflowUtils.ps1 index e4f81a1..c10a602 100644 --- a/examples/Maestro/createWorkflowUtils.ps1 +++ b/examples/Maestro/createWorkflowUtils.ps1 @@ -153,7 +153,7 @@ $body = @" "templateType": "WorkflowParticipantNotification", "templateVersion": 1, "language": "en", - "sender_name": "DocuSign Orchestration", + "sender_name": "Docusign Orchestration", "sender_alias": "Orchestration", "participantId": "$signerId" }, diff --git a/examples/Notary/Jurisdictions.ps1 b/examples/Notary/Jurisdictions.ps1 index 44bedc4..ab1b537 100644 --- a/examples/Notary/Jurisdictions.ps1 +++ b/examples/Notary/Jurisdictions.ps1 @@ -14,7 +14,7 @@ $accountID = Get-Content .\config\API_ACCOUNT_ID $response = New-TemporaryFile -Write-Output "Sending the jurisdiction status request to DocuSign..." +Write-Output "Sending the jurisdiction status request to Docusign..." Write-Output "" Write-Output "Results:" #ds-snippet-start:Notary3Step2 diff --git a/examples/eSignature/eg002SigningViaEmail.ps1 b/examples/eSignature/eg002SigningViaEmail.ps1 index efee67e..00107b0 100644 --- a/examples/eSignature/eg002SigningViaEmail.ps1 +++ b/examples/eSignature/eg002SigningViaEmail.ps1 @@ -37,7 +37,7 @@ $doc3Base64 = New-TemporaryFile [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" diff --git a/examples/eSignature/eg003ListEnvelopes.ps1 b/examples/eSignature/eg003ListEnvelopes.ps1 index a2bea91..bcbed9b 100644 --- a/examples/eSignature/eg003ListEnvelopes.ps1 +++ b/examples/eSignature/eg003ListEnvelopes.ps1 @@ -14,7 +14,7 @@ $accessToken = Get-Content .\config\ds_access_token.txt # the default picture. $accountID = Get-Content .\config\API_ACCOUNT_ID -Write-Output "Sending the list envelope status request to DocuSign..." +Write-Output "Sending the list envelope status request to Docusign..." Write-Output "Results:" # Get date in the ISO 8601 format diff --git a/examples/eSignature/eg004EnvelopeInfo.ps1 b/examples/eSignature/eg004EnvelopeInfo.ps1 index 05c841d..c61d9a1 100644 --- a/examples/eSignature/eg004EnvelopeInfo.ps1 +++ b/examples/eSignature/eg004EnvelopeInfo.ps1 @@ -25,7 +25,7 @@ else { exit 1 } -Write-Output "Sending the Envelopes::get request to DocuSign..." +Write-Output "Sending the Envelopes::get request to Docusign..." Write-Output "Results:" #ds-snippet-start:eSign4Step2 diff --git a/examples/eSignature/eg005EnvelopeRecipients.ps1 b/examples/eSignature/eg005EnvelopeRecipients.ps1 index b3b181d..21802f1 100644 --- a/examples/eSignature/eg005EnvelopeRecipients.ps1 +++ b/examples/eSignature/eg005EnvelopeRecipients.ps1 @@ -25,7 +25,7 @@ else { exit 1 } -Write-Output "Sending the EnvelopeRecipients::list request to DocuSign..." +Write-Output "Sending the EnvelopeRecipients::list request to Docusign..." Write-Output "Results:" diff --git a/examples/eSignature/eg006EnvelopeDocs.ps1 b/examples/eSignature/eg006EnvelopeDocs.ps1 index 92ce232..0d124ea 100644 --- a/examples/eSignature/eg006EnvelopeDocs.ps1 +++ b/examples/eSignature/eg006EnvelopeDocs.ps1 @@ -30,7 +30,7 @@ $headers = @{ } #ds-snippet-end:eSign6Step2 -Write-Output "Sending the EnvelopeDocuments::list request to DocuSign..." +Write-Output "Sending the EnvelopeDocuments::list request to Docusign..." Write-Output "Results:" # List envelope documents diff --git a/examples/eSignature/eg007EnvelopeGetDoc.ps1 b/examples/eSignature/eg007EnvelopeGetDoc.ps1 index 0122ffc..7cefd0b 100644 --- a/examples/eSignature/eg007EnvelopeGetDoc.ps1 +++ b/examples/eSignature/eg007EnvelopeGetDoc.ps1 @@ -79,7 +79,7 @@ else { $docChoice = $listDocsView } -Write-Output "Sending the EnvelopeDocuments::get request to DocuSign..." +Write-Output "Sending the EnvelopeDocuments::get request to Docusign..." # Call the eSignature API #ds-snippet-start:eSign7Step3 Invoke-RestMethod ` diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index 371e9f1..ae41d7e 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -56,7 +56,7 @@ $requestData = New-TemporaryFile $requestDataTemp = New-TemporaryFile $doc1Base64 = New-TemporaryFile -Write-Output "Sending the template create request to DocuSign..." +Write-Output "Sending the template create request to Docusign..." # Fetch document and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_fields.pdf"))) > $doc1Base64 diff --git a/examples/eSignature/eg009UseTemplate.ps1 b/examples/eSignature/eg009UseTemplate.ps1 index 5935878..d3c2dc5 100644 --- a/examples/eSignature/eg009UseTemplate.ps1 +++ b/examples/eSignature/eg009UseTemplate.ps1 @@ -2,7 +2,7 @@ $apiUri = "https://demo.docusign.net/restapi" -# Send a signing request via email using a DocuSign template +# Send a signing request via email using a Docusign template # Get required environment variables from .\config\settings.json file $variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json @@ -27,7 +27,7 @@ if (-not (Test-Path .\config\TEMPLATE_ID)) { $response = New-TemporaryFile $requestData = New-TemporaryFile -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." #ds-snippet-start:eSign9Step2 @{ diff --git a/examples/eSignature/eg010SendBinaryDocs.ps1 b/examples/eSignature/eg010SendBinaryDocs.ps1 index 935b9b1..8c5a868 100644 --- a/examples/eSignature/eg010SendBinaryDocs.ps1 +++ b/examples/eSignature/eg010SendBinaryDocs.ps1 @@ -43,7 +43,7 @@ $doc1 = Get-Item ".\demo_documents\doc_1.html" $doc2 = Get-Item ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx" $doc3 = Get-Item ".\demo_documents\World_Wide_Corp_lorem.pdf" -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" diff --git a/examples/eSignature/eg011EmbeddedSending.ps1 b/examples/eSignature/eg011EmbeddedSending.ps1 index 9c118e3..d992d70 100644 --- a/examples/eSignature/eg011EmbeddedSending.ps1 +++ b/examples/eSignature/eg011EmbeddedSending.ps1 @@ -2,7 +2,7 @@ $apiUri = "https://demo.docusign.net/restapi" # Use embedded sending: # 1. create a draft envelope with three documents -# 2. Open the sending view of the DocuSign web tool +# 2. Open the sending view of the Docusign web tool # Configuration # 1. Get required variables from .\config\settings.json: @@ -72,7 +72,7 @@ $doc1String = $doc1String.Replace("{CC_NAME}", $CC_NAME) [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" @@ -184,10 +184,10 @@ Write-Output "Requesting the sender view url" }; } | ConvertTo-Json -Depth 32 >> $senderViewRequestData -# The returnUrl is normally your own web app. DocuSign will redirect +# The returnUrl is normally your own web app. Docusign will redirect # the signer to returnUrl when the embedded sending completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/sender" ` -Method 'POST' ` diff --git a/examples/eSignature/eg012EmbeddedConsole.ps1 b/examples/eSignature/eg012EmbeddedConsole.ps1 index 4f6ae4b..dcecf22 100644 --- a/examples/eSignature/eg012EmbeddedConsole.ps1 +++ b/examples/eSignature/eg012EmbeddedConsole.ps1 @@ -1,6 +1,6 @@ $apiUri = "https://demo.docusign.net/restapi" -# Redirect to the DocuSign console web tool +# Redirect to the Docusign console web tool # Step 1. Obtain your Oauth access token @@ -19,10 +19,10 @@ if (-not (Test-Path .\config\ENVELOPE_ID)) { # Check that we have an envelope id $envelopeId = Get-Content .\config\ENVELOPE_ID -# The returnUrl is normally your own web app. DocuSign will redirect +# The returnUrl is normally your own web app. Docusign will redirect # the signer to returnUrl when the embedded signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign # The web tool console can be opened in either of two views: # The sending editor can be opened in either of two views: diff --git a/examples/eSignature/eg013AddDocToTemplate.ps1 b/examples/eSignature/eg013AddDocToTemplate.ps1 index 8ea3a3c..0d0fde5 100644 --- a/examples/eSignature/eg013AddDocToTemplate.ps1 +++ b/examples/eSignature/eg013AddDocToTemplate.ps1 @@ -31,7 +31,7 @@ $doc1Base64 = New-TemporaryFile # Fetch docs and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\added_document.html"))) > $doc1Base64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "A template is used, it has one document. A second document will be" Write-Output "added by using Composite Templates" @@ -120,7 +120,7 @@ Write-Output "added by using Composite Templates" } | ConvertTo-Json -Depth 32 > $requestData #ds-snippet-end:eSign13Step2 -# Step 3. Call DocuSign to create the envelope +# Step 3. Call Docusign to create the envelope #ds-snippet-start:eSign13Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -143,10 +143,10 @@ Write-Output "EnvelopeId: $envelopeId" # Step 4. Create the recipient view definition # that the signer will directly open in their browser to sign. # -# The returnUrl is normally your own web app. DocuSign will redirect +# The returnUrl is normally your own web app. Docusign will redirect # the signer to returnUrl when the signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign #ds-snippet-start:eSign13Step4 Write-Output "Requesting the url for the embedded signing..." diff --git a/examples/eSignature/eg014CollectPayment.ps1 b/examples/eSignature/eg014CollectPayment.ps1 index ef5a598..6bb413d 100644 --- a/examples/eSignature/eg014CollectPayment.ps1 +++ b/examples/eSignature/eg014CollectPayment.ps1 @@ -13,7 +13,7 @@ $accessToken = Get-Content .\config\ds_access_token.txt # the default picture. $accountId = Get-Content .\config\API_ACCOUNT_ID -# Step 2. Log in to DocuSign Admin and from the top +# Step 2. Log in to Docusign Admin and from the top # navigation, select Admin. From there look # to the left under INTEGRATIONS and select # Payments to retrieve your Gateway account ID. @@ -29,7 +29,7 @@ $doc1Base64 = New-TemporaryFile # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\order_form.html"))) > $doc1Base64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." # Concatenate the different parts of the request #ds-snippet-start:eSign14Step3 diff --git a/examples/eSignature/eg016SetTabValues.ps1 b/examples/eSignature/eg016SetTabValues.ps1 index de468ae..107e9d0 100644 --- a/examples/eSignature/eg016SetTabValues.ps1 +++ b/examples/eSignature/eg016SetTabValues.ps1 @@ -29,7 +29,7 @@ $requestData = New-TemporaryFile $response = New-TemporaryFile $doc1Base64 = New-TemporaryFile -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_salary.docx"))) > $doc1Base64 @@ -149,10 +149,10 @@ Write-Output $envelopeId > .\config\ENVELOPE_ID # Step 6. Create a recipient view (an embedded signing view) # that the signer will directly open in their browser to sign # -# The return URL is normally your own web app. DocuSign will redirect -# the signer to the return URL when the DocuSign signing completes. +# The return URL is normally your own web app. Docusign will redirect +# the signer to the return URL when the Docusign signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign Write-Output "Requesting the url for the embedded signing..." diff --git a/examples/eSignature/eg017SetTemplateTabValues.ps1 b/examples/eSignature/eg017SetTemplateTabValues.ps1 index e09b06d..2129d22 100644 --- a/examples/eSignature/eg017SetTemplateTabValues.ps1 +++ b/examples/eSignature/eg017SetTemplateTabValues.ps1 @@ -33,7 +33,7 @@ else { exit 0 } -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." # Step 3. Create tabs and custom fields #ds-snippet-start:eSign17Step3 $text_custom_fields = @{ @@ -173,10 +173,10 @@ Write-Output "EnvelopeId: $envelopeId" # Step 6. Create a recipient view (an embedded signing view) # that the signer will directly open in their browser to sign # -# The return URL is normally your own web app. DocuSign will redirect -# the signer to the return URL when the DocuSign signing completes. +# The return URL is normally your own web app. Docusign will redirect +# the signer to the return URL when the Docusign signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign Write-Output "Requesting the url for the embedded signing..." diff --git a/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 b/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 index 7d9e72e..fb7a7dc 100644 --- a/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 +++ b/examples/eSignature/eg018EnvelopeCustomFieldData.ps1 @@ -25,7 +25,7 @@ else { exit 1 } -Write-Output "Sending the EnvelopeCustomFields::list request to DocuSign..." +Write-Output "Sending the EnvelopeCustomFields::list request to Docusign..." # Step 2. Create your authorization headers #ds-snippet-start:eSign18Step2 diff --git a/examples/eSignature/eg034UseConditionalRecipients.ps1 b/examples/eSignature/eg034UseConditionalRecipients.ps1 index 7d8593a..ff86d11 100644 --- a/examples/eSignature/eg034UseConditionalRecipients.ps1 +++ b/examples/eSignature/eg034UseConditionalRecipients.ps1 @@ -224,7 +224,7 @@ catch [System.Net.WebException] { if ( $errorCode -eq "WORKFLOW_UPDATE_RECIPIENTROUTING_NOT_ALLOWED" ) { Write-Output "" Write-Output "The following Error happened: WORKFLOW_UPDATE_RECIPIENTROUTING_NOT_ALLOWED" - Write-Output "Please contact DocuSign support..." + Write-Output "Please contact Docusign support..." } else { $_ diff --git a/examples/eSignature/eg035ScheduledSending.ps1 b/examples/eSignature/eg035ScheduledSending.ps1 index 48979f3..1397119 100644 --- a/examples/eSignature/eg035ScheduledSending.ps1 +++ b/examples/eSignature/eg035ScheduledSending.ps1 @@ -28,7 +28,7 @@ $docBase64 = New-TemporaryFile # Fetch docs and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "The envelope has one document. Processing time will be about 15 seconds." Write-Output "Results:" diff --git a/examples/eSignature/eg036DelayedRouting.ps1 b/examples/eSignature/eg036DelayedRouting.ps1 index e0c1006..89a7e4c 100644 --- a/examples/eSignature/eg036DelayedRouting.ps1 +++ b/examples/eSignature/eg036DelayedRouting.ps1 @@ -30,7 +30,7 @@ $docBase64 = New-TemporaryFile # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $docBase64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" diff --git a/examples/eSignature/eg037SMSDelivery.ps1 b/examples/eSignature/eg037SMSDelivery.ps1 index 690b63b..75c3904 100644 --- a/examples/eSignature/eg037SMSDelivery.ps1 +++ b/examples/eSignature/eg037SMSDelivery.ps1 @@ -127,7 +127,7 @@ $MSGNumberCC = Read-Host "Please enter a Mobile number for the Carbon Copied rec } | ConvertTo-Json -Depth 32 > $requestData #ds-snippet-end:eSign37Step2 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" Write-Output $requestData diff --git a/examples/eSignature/eg038ResponsiveSigning.ps1 b/examples/eSignature/eg038ResponsiveSigning.ps1 index e62c164..0395b34 100644 --- a/examples/eSignature/eg038ResponsiveSigning.ps1 +++ b/examples/eSignature/eg038ResponsiveSigning.ps1 @@ -34,7 +34,7 @@ $doc_html = New-TemporaryFile -replace '/l1q/', '' ` -replace '/l2q/', '') | Set-Content $doc_html -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." $price1 = 5 $price2 = 150 @@ -126,7 +126,7 @@ $price2 = 150 } | ConvertTo-Json -Depth 32 > $requestData #ds-snippet-end:eSign38Step2 -# Step 3. Call DocuSign to create the envelope +# Step 3. Call Docusign to create the envelope #ds-snippet-start:eSign38Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -148,10 +148,10 @@ Write-Output "EnvelopeId: $envelopeId" # Step 4. Create a recipient view definition # The signer will directly open this link from the browser to sign. # -# The returnUrl is normally your own web app. DocuSign will redirect +# The returnUrl is normally your own web app. Docusign will redirect # the signer to returnUrl when the signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign Write-Output "Requesting the url for the embedded signing..." @@ -164,7 +164,7 @@ $json = [ordered]@{ } | ConvertTo-Json -Compress -# Step 5. Create the recipient view and begin the DocuSign signing +# Step 5. Create the recipient view and begin the Docusign signing Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` -Method 'POST' ` diff --git a/examples/eSignature/eg039SigningInPerson.ps1 b/examples/eSignature/eg039SigningInPerson.ps1 index 95af498..9a0b805 100644 --- a/examples/eSignature/eg039SigningInPerson.ps1 +++ b/examples/eSignature/eg039SigningInPerson.ps1 @@ -40,7 +40,7 @@ Invoke-RestMethod ` $hostEmail = $(Get-Content $response | ConvertFrom-Json).email $hostName = $(Get-Content $response | ConvertFrom-Json).name -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." # Concatenate the different parts of the request #ds-snippet-start:eSign39Step2 @@ -79,7 +79,7 @@ Write-Output "Sending the envelope request to DocuSign..." } | ConvertTo-Json -Depth 32 > $requestData #ds-snippet-end:eSign39Step2 -# Step 3. Call DocuSign to create the envelope +# Step 3. Call Docusign to create the envelope #ds-snippet-start:eSign39Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -101,10 +101,10 @@ Write-Output "EnvelopeId: $envelopeId" # Step 4. Create a recipient view definition # The signer will directly open this link from the browser to sign. # -# The returnUrl is normally your own web app. DocuSign will redirect +# The returnUrl is normally your own web app. Docusign will redirect # the signer to returnUrl when the signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign Write-Output "Requesting the url for the embedded signing..." @@ -117,7 +117,7 @@ $json = [ordered]@{ } | ConvertTo-Json -Compress #ds-snippet-end:eSign39Step4 -# Step 5. Create the recipient view and begin the DocuSign signing +# Step 5. Create the recipient view and begin the Docusign signing #ds-snippet-start:eSign39Step5 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` diff --git a/examples/eSignature/eg040SetDocumentVisibility.ps1 b/examples/eSignature/eg040SetDocumentVisibility.ps1 index ae3fb09..a44ef2a 100644 --- a/examples/eSignature/eg040SetDocumentVisibility.ps1 +++ b/examples/eSignature/eg040SetDocumentVisibility.ps1 @@ -57,7 +57,7 @@ $doc1String = $doc1String.Replace("{CC_NAME}", $CC_NAME) [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx"))) > $doc2Base64 [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\World_Wide_Corp_lorem.pdf"))) > $doc3Base64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "The envelope has three documents. Processing time will be about 15 seconds." Write-Output "Results:" @@ -159,7 +159,7 @@ catch { Write-Host "" if ( $errorMessage.Contains("ACCOUNT_LACKS_PERMISSIONS") ) { - Write-Host "See https://developers.docusign.com/docs/esign-rest-api/how-to/set-document-visibility in the DocuSign Developer Center for instructions on how to enable document visibility in your developer account." + Write-Host "See https://developers.docusign.com/docs/esign-rest-api/how-to/set-document-visibility in the Docusign Developer Center for instructions on how to enable document visibility in your developer account." } } diff --git a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 index ed3de2f..feb582e 100644 --- a/examples/eSignature/eg041EmbeddedSigningCFR.ps1 +++ b/examples/eSignature/eg041EmbeddedSigningCFR.ps1 @@ -71,7 +71,7 @@ $SIGNER_COUNTRY_CODE = Read-Host "Please enter a country phone number prefix for $SIGNER_PHONE_NUMBER = Read-Host "Please enter an SMS-enabled Phone number for the Signer" -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." # Construct your envelope JSON body #ds-snippet-start:eSign41Step3 @@ -142,10 +142,10 @@ $envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId # Create a recipient view definition # The signer will directly open this link from the browser to sign. # -# The returnUrl is normally your own web app. DocuSign will redirect +# The returnUrl is normally your own web app. Docusign will redirect # the signer to returnUrl when the signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign # temp files: $requestData = New-TemporaryFile @@ -162,7 +162,7 @@ $json = [ordered]@{ } | ConvertTo-Json -Compress #ds-snippet-end:eSign41Step5 -# Create the recipient view and begin the DocuSign signing +# Create the recipient view and begin the Docusign signing #ds-snippet-start:eSign41Step6 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` diff --git a/examples/eSignature/eg042DocumentGeneration.ps1 b/examples/eSignature/eg042DocumentGeneration.ps1 index a7b6ba7..a0902e6 100644 --- a/examples/eSignature/eg042DocumentGeneration.ps1 +++ b/examples/eSignature/eg042DocumentGeneration.ps1 @@ -27,7 +27,7 @@ $response = New-TemporaryFile $templateName = "Example document generation template" -Write-Output "Sending the template create request to DocuSign..." +Write-Output "Sending the template create request to Docusign..." # Fetch document and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents\Offer_Letter_Dynamic_Table.docx"))) > $doc1Base64 diff --git a/examples/eSignature/eg044FocusedView.ps1 b/examples/eSignature/eg044FocusedView.ps1 index 97a5517..fe7f569 100644 --- a/examples/eSignature/eg044FocusedView.ps1 +++ b/examples/eSignature/eg044FocusedView.ps1 @@ -31,7 +31,7 @@ if ((Test-Path $docPath) -eq $false) { # Fetch doc and encode [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $doc1Base64 -Write-Output "Sending the envelope request to DocuSign..." +Write-Output "Sending the envelope request to Docusign..." Write-Output "" # Concatenate the different parts of the request @@ -71,7 +71,7 @@ Write-Output "" } | ConvertTo-Json -Depth 32 > $requestData #ds-snippet-end:eSign44Step2 -# Step 3. Call DocuSign to create the envelope +# Step 3. Call Docusign to create the envelope #ds-snippet-start:eSign44Step3 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` @@ -95,10 +95,10 @@ Write-Output "" # Step 4. Create a recipient view definition # The signer will directly open this link from the browser to sign. # -# The returnUrl is normally your own web app. DocuSign will redirect +# The returnUrl is normally your own web app. Docusign will redirect # the signer to returnUrl when the signing completes. # For this example, we'll use http://httpbin.org/get to show the -# query parameters passed back from DocuSign +# query parameters passed back from Docusign #ds-snippet-start:eSign44Step4 Write-Output "Requesting the url for the embedded signing..." @@ -117,7 +117,7 @@ $json = @{ $jsonString = $json | ConvertTo-Json #ds-snippet-end:eSign44Step4 -# Step 5. Create the recipient view and begin the DocuSign signing +# Step 5. Create the recipient view and begin the Docusign signing #ds-snippet-start:eSign44Step5 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}/views/recipient" ` diff --git a/launcher.ps1 b/launcher.ps1 index c89b762..b1232e7 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -206,7 +206,7 @@ function startAuth ($apiVersion) { Write-Output "$([int][AuthType]::CodeGrant)) Authorization Code Grant" Write-Output "$([int][AuthType]::JWT)) Json Web Token (JWT)" Write-Output "$([int][AuthType]::Exit)) Exit" - [int]$AuthTypeView = Read-Host "Select an OAuth method to Authenticate with your DocuSign account" + [int]$AuthTypeView = Read-Host "Select an OAuth method to Authenticate with your Docusign account" } while (-not [AuthType]::IsDefined([AuthType], $AuthTypeView)); } @@ -848,8 +848,8 @@ function startAdmin { Write-Output "$([int][listAdminExamples]::bulkExportUserData)) Bulk-export user data" Write-Output "$([int][listAdminExamples]::addUsersViaBulkImport)) Add users via bulk import" Write-Output "$([int][listAdminExamples]::auditUsers)) Audit users" - Write-Output "$([int][listAdminExamples]::getUserDSProfilesByEmail)) Retrieve the user's DocuSign profile using an email address" - Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Retrieve the user's DocuSign profile using a User ID" + Write-Output "$([int][listAdminExamples]::getUserDSProfilesByEmail)) Retrieve the user's Docusign profile using an email address" + Write-Output "$([int][listAdminExamples]::getUserProfileByUserId)) Retrieve the user's Docusign profile using a User ID" Write-Output "$([int][listAdminExamples]::updateUserProductPermissionProfile)) Update user product permission profiles using an email address" Write-Output "$([int][listAdminExamples]::deleteUserProductPermissionProfile)) Delete user product permission profiles using an email address" Write-Output "$([int][listAdminExamples]::deleteUserDataFromOrganization)) Delete user data from organization" diff --git a/utils/createWebFormTemplate.ps1 b/utils/createWebFormTemplate.ps1 index ccd6aac..fb370ba 100644 --- a/utils/createWebFormTemplate.ps1 +++ b/utils/createWebFormTemplate.ps1 @@ -34,7 +34,7 @@ $requestData = New-TemporaryFile $requestDataTemp = New-TemporaryFile $doc1Base64 = New-TemporaryFile -Write-Output "Sending the template create request to DocuSign..." +Write-Output "Sending the template create request to Docusign..." [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path ".\demo_documents/World_Wide_Corp_Web_Form.pdf"))) > $doc1Base64 From 31686e29fbfb3e5ee8335f3d84761b98304bc1f1 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Fri, 10 Jan 2025 14:38:08 -0800 Subject: [PATCH 436/462] allow users to choose a form group to assign to an office --- examples/Rooms/eg008AccessFormGroup.ps1 | 79 +++++++++++++++++-------- 1 file changed, 53 insertions(+), 26 deletions(-) diff --git a/examples/Rooms/eg008AccessFormGroup.ps1 b/examples/Rooms/eg008AccessFormGroup.ps1 index c73aed8..44bfbfc 100644 --- a/examples/Rooms/eg008AccessFormGroup.ps1 +++ b/examples/Rooms/eg008AccessFormGroup.ps1 @@ -10,46 +10,70 @@ $headers.add("Accept", "application/json") $headers.add("Content-Type", "application/json") #ds-snippet-end:Rooms8Step2 - -# Get an office ID +# Get form groups #ds-snippet-start:Rooms8Step3 $base_path = "https://demo.rooms.docusign.com" -$uri = "$base_path/restapi/v2/accounts/$APIAccountId/offices" +$formGroupsUri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups" try { - Write-Output "Response:" - $response = Invoke-WebRequest -uri $uri -headers $headers -method GET - $response.Content - # Retrieve the form group ID - $obj = $response.Content | ConvertFrom-Json - $officeID = $obj.officeSummaries[0].officeId -} -catch { - Write-Output "Unable to retrieve an office ID" - # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + Write-Output "Retrieving form groups..." + $response = Invoke-WebRequest -uri $formGroupsUri -headers $headers -method GET + $formGroups = ($response.Content | ConvertFrom-Json).formGroups - foreach ($header in $_.Exception.Response.Headers) { - if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } - $int++ + if (-not $formGroups) { + Write-Output "No form groups found. Execute code example 7 - Create a form group..." + exit 1 } - Write-Output "Error : "$_.ErrorDetails.Message - Write-Output "Command : "$_.InvocationInfo.Line + + # Display the form groups + Write-Host "Available form groups:" + for ($i = 0; $i -lt $formGroups.Count; $i++) { + Write-Host "$($i + 1): $($formGroups[$i].name) (ID: $($formGroups[$i].formGroupId))" + } + + # Prompt the user to select a form group + $selection = Read-Host "Enter the number of the form group you want to use" + if (-not ($selection -as [int]) -or $selection -lt 1 -or $selection -gt $formGroups.Count) { + Write-Output "Invalid selection. Please enter a number between 1 and $($formGroups.Count)." + exit 1 + } + + # Get the selected form group + $selectedFormGroup = $formGroups[$selection - 1] + $formGroupID = $selectedFormGroup.formGroupId + Write-Host "You selected: $($selectedFormGroup.name)" +} +catch { + Write-Output "Unable to retrieve form groups." + Write-Output "Error: $($_.Exception.Message)" + exit 1 } #ds-snippet-end:Rooms8Step3 -# Get form group ID from the .\config\FORM_GROUP_ID file -if (Test-Path .\config\FORM_GROUP_ID) { +# Get an office ID #ds-snippet-start:Rooms8Step4 - $formGroupID = Get-Content .\config\FORM_GROUP_ID -#ds-snippet-end:Rooms8Step4 +$officeUri = "$base_path/restapi/v2/accounts/$APIAccountId/offices" + +try { + Write-Output "Retrieving office ID..." + $response = Invoke-WebRequest -uri $officeUri -headers $headers -method GET + $officeSummaries = ($response.Content | ConvertFrom-Json).officeSummaries + + if (-not $officeSummaries) { + Write-Output "No offices found." + exit 1 + } + + $officeID = $officeSummaries[0].officeId } -else { - Write-Output "A form group ID is needed. Fix: execute code example 7 - Create a form group..." +catch { + Write-Output "Unable to retrieve an office ID." + Write-Output "Error: $($_.Exception.Message)" exit 1 } +#ds-snippet-end:Rooms8Step4 - -# Call the Rooms API +# Call the Rooms API to grant office access to the selected form group #ds-snippet-start:Rooms8Step5 $uri = "$base_path/restapi/v2/accounts/$APIAccountId/form_groups/$formGroupID/grant_office_access/$officeID" @@ -57,6 +81,9 @@ try { Write-Output "Response:" $response = Invoke-WebRequest -uri $uri -headers $headers -method POST -body $body $response.StatusCode + if ($response.StatusCode -eq "204") { + Write-Output "Form group has been assigned to office ID." + } # check that we have got a 204 Status code response if ($response.StatusCode -ne "204" ) { From 43c44c3db2683e30d1f25ae53943fea8a2531fd1 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Fri, 10 Jan 2025 15:06:07 -0800 Subject: [PATCH 437/462] adding url decoding --- examples/Maestro/eg001TriggerWorkflow.ps1 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index 9ebc3d0..fc52e05 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -48,6 +48,7 @@ Invoke-RestMethod ` $jsonContent = Get-Content -Path $response -Raw | ConvertFrom-Json $triggerUrl = $jsonContent.trigger_http_config.url +$triggerUrl = $triggerUrl -replace "\\u0026", "&" #ds-snippet-end:Maestro1Step3 $instance_name = Read-Host "Please input a name for the workflow instance" @@ -74,10 +75,13 @@ $body = @" $triggerResult = Invoke-WebRequest -uri $triggerUrl -headers $headers -body $body -method POST #ds-snippet-end:Maestro1Step5 -Write-Output "Response: $triggerResult" + +$instanceUrl = $($triggerResult | ConvertFrom-Json).instance_url +$instanceUrl = $instanceUrl -replace "\\u0026", "&" +Write-Output "Response: $instanceUrl" # pull out the envelopeId -$instanceId = $($triggerResult | ConvertFrom-Json).instanceId +$instanceId = $($triggerResult | ConvertFrom-Json).instance_id # Store the instance_id into the config file Write-Output $instanceId > .\config\INSTANCE_ID From 7d191756e22d8f0ca2c00835695b297ca1cad2e4 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Mon, 13 Jan 2025 15:13:46 -0800 Subject: [PATCH 438/462] modifying workflow creation script --- examples/Maestro/createWorkflowUtils.ps1 | 12 ++++++++---- examples/Maestro/eg001TriggerWorkflow.ps1 | 18 +++++++++--------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/examples/Maestro/createWorkflowUtils.ps1 b/examples/Maestro/createWorkflowUtils.ps1 index 00cb83f..4b18b05 100644 --- a/examples/Maestro/createWorkflowUtils.ps1 +++ b/examples/Maestro/createWorkflowUtils.ps1 @@ -145,7 +145,7 @@ $body = @" }, "steps": [ { - "id": "step1", + "id": "step2", "name": "Get Signatures", "moduleName": "ESign", "configurationProgress": "Completed", @@ -512,7 +512,7 @@ $body = @" } }, { - "id": "step2", + "id": "step3", "name": "Show a Confirmation Screen", "moduleName": "ShowConfirmationScreen", "configurationProgress": "Completed", @@ -530,7 +530,8 @@ $body = @" } } }, - "output": {} + "output": {}, + "triggerType": "API" } ] } @@ -558,6 +559,10 @@ catch { # Define redirect_url $redirect_url = "http://localhost:8080" +if (-not (Test-Path -Path "config/WORKFLOW_ID")) { + New-Item -ItemType File -Path "config/WORKFLOW_ID" +} + # Publish workflow $published = $false while (-not $published) { @@ -565,7 +570,6 @@ while (-not $published) { Invoke-RestMethod -Uri "$base_path/management/accounts/$accountId/workflowDefinitions/$workflow_id/publish?isPreRunCheck=true" -Method POST -Headers $Headers $published = $true - $filePath = "config/WORKFLOW_ID" $workflow_id | Out-File -FilePath "config/WORKFLOW_ID" Write-Host "Successfully created and published workflow $workflow_id, ID saved to config/WORKFLOW_ID" } diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index fc52e05..c5300cb 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -12,7 +12,7 @@ $workflowId = Get-Content .\config\WORKFLOW_ID if (Test-Path .\config\WORKFLOW_ID) { $workflowId = Get-Content .\config\WORKFLOW_ID } else { - Write-Output "Please create a worklow before running this example" + Write-Output "Please create a workflow before running this example" exit 1 } @@ -52,20 +52,20 @@ $triggerUrl = $triggerUrl -replace "\\u0026", "&" #ds-snippet-end:Maestro1Step3 $instance_name = Read-Host "Please input a name for the workflow instance" -$signer_name = Read-Host "Please input the full name for the signer participant" -$signer_email = Read-Host "Please input an email for the signer participant" -$cc_name = Read-Host "Please input the full name for the cc participant" -$cc_email = Read-Host "Please input an email for the cc participant" +$signerName = Read-Host "Please input the full name for the signer participant" +$signerEmail = Read-Host "Please input an email for the signer participant" +$ccName = Read-Host "Please input the full name for the cc participant" +$ccEmail = Read-Host "Please input an email for the cc participant" #ds-snippet-start:Maestro1Step4 $body = @" { "instance_name": "$instance_name", "trigger_inputs": { - "signer_email": "$signer_email", - "signer_name": "$signer_name", - "cc_email": "$cc_email", - "cc_name": "$cc_name" + "signerEmail": "$signerEmail", + "signerName": "$signerName", + "ccEmail": "$ccEmail", + "ccName": "$ccName" } } "@ From 7ed5cae331f02d759833233f6fc5da9013a83a72 Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Tue, 14 Jan 2025 09:52:24 -0800 Subject: [PATCH 439/462] adding fix to paige's error --- examples/Maestro/eg001TriggerWorkflow.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index c5300cb..bdb2d25 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -72,7 +72,7 @@ $body = @" #ds-snippet-end:Maestro1Step4 #ds-snippet-start:Maestro1Step5 -$triggerResult = Invoke-WebRequest -uri $triggerUrl -headers $headers -body $body -method POST +$triggerResult = Invoke-WebRequest -uri $triggerUrl -headers $headers -body $body -method POST -UseBasicParsing #ds-snippet-end:Maestro1Step5 From aa1cdf26a63274e59722cc193ba53c82d4b84ef4 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Fri, 31 Jan 2025 13:56:43 +0200 Subject: [PATCH 440/462] add example 4 --- examples/Notary/sendWithThirdPartyNotary.ps1 | 156 +++++++++++++++++++ launcher.ps1 | 6 +- 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 examples/Notary/sendWithThirdPartyNotary.ps1 diff --git a/examples/Notary/sendWithThirdPartyNotary.ps1 b/examples/Notary/sendWithThirdPartyNotary.ps1 new file mode 100644 index 0000000..12af507 --- /dev/null +++ b/examples/Notary/sendWithThirdPartyNotary.ps1 @@ -0,0 +1,156 @@ +$apiUri = "https://demo.docusign.net/restapi" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $configPath) -eq $false) { + $configPath = "..\config\settings.json" +} +if ((Test-Path $tokenPath) -eq $false) { + $tokenPath = "..\config\ds_access_token.txt" +} +if ((Test-Path $accountIdPath) -eq $false) { + $accountIdPath = "..\config\API_ACCOUNT_ID" +} + +# Send an envelope with a third-party notary service + +# Get required variables from .\config\settings.json file +$variables = Get-Content $configPath -Raw | ConvertFrom-Json + +# 1. Obtain your OAuth token +$accessToken = Get-Content $tokenPath + +# Obtain your accountId from demo.docusign.net -- the account id is shown in +# the drop down on the upper right corner of the screen by your picture or +# the default picture. +$accountID = Get-Content $accountIdPath + +# Step 2. Create the envelope definition. +# The signer recipient includes a clientUserId setting + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$docBase64 = New-TemporaryFile + +$docPath = ".\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx" + +# Check the folder structure to switch paths for Quick ACG +if ((Test-Path $docPath) -eq $false) { + $docPath = "..\demo_documents\World_Wide_Corp_Battle_Plan_Trafalgar.docx" +} + +# Fetch doc and encode +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $docBase64 + +Write-Output "Sending the envelope request to Docusign..." +Write-Output "Please wait, this may take a few moments." + +# Concatenate the different parts of the request +#ds-snippet-start:Notary4Step2 +@{ + emailSubject = "Please sign this document set"; + documents = @( + @{ + documentBase64 = "$(Get-Content $docBase64)"; + name = "Order acknowledgement"; + fileExtension = "html"; + documentId = "1"; + }; + ); + recipients = @{ + signers = @( + @{ + clientUserId = "1000"; + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "2"; + routingOrder = "1"; + notaryId = "1"; + tabs = @{ + signHereTabs = @( + @{ + documentId = "1"; + xPosition = "200"; + yPosition = "235"; + pageNumber = "1"; + }; + @{ + stampType = "stamp"; + documentId = "1"; + xPosition = "200"; + yPosition = "150"; + pageNumber = "1"; + }; + ); + }; + }; + ); + notaries = @( + @{ + email = ""; + name = "Notary"; + recipientId = "1"; + routingOrder = "1"; + tabs = @{ + notarySealTabs = @( + @{ + xPosition = "300"; + yPosition = "235"; + documentId = "1"; + pageNumber = "1"; + }; + ); + signHereTabs = @( + @{ + xPosition = "300"; + yPosition = "150"; + documentId = "1"; + pageNumber = "1"; + }; + ); + }; + notaryType = "remote"; + notarySourceType = "thirdparty"; + notaryThirdPartyPartner = "onenotary"; + recipientSignatureProviders = @( + @{ + sealDocumentsWithTabsOnly = "false"; + signatureProviderName = "ds_authority_idv"; + signatureProviderOptions = @{}; + }; + ); + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:Notary4Step2 + +# Step 3. Call Docusign to create the envelope +#ds-snippet-start:Notary4Step3 +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response +#ds-snippet-end:Notary4Step3 + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId +Write-Output "EnvelopeId: $envelopeId" + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $docBase64 + +Write-Output "Done." \ No newline at end of file diff --git a/launcher.ps1 b/launcher.ps1 index de3dcdb..7d376b1 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -950,7 +950,8 @@ function startNotary { signatureRequestToNotaryGroup = 1; inviteNotaryToPool = 2; jurisdictions = 3; - Pick_An_API = 4; + sendWithThirdPartyNotary = 4; + Pick_An_API = 5; } $listNotaryExamplesView = $null; do { @@ -959,6 +960,7 @@ function startNotary { Write-Output "$([int][listNotaryExamples]::signatureRequestToNotaryGroup)) Send signature request to Notary group" Write-Output "$([int][listNotaryExamples]::inviteNotaryToPool)) Invite Notary to pool" Write-Output "$([int][listNotaryExamples]::jurisdictions)) Jurisdictions" + Write-Output "$([int][listNotaryExamples]::sendWithThirdPartyNotary)) Notary On-Demand" Write-Output "$([int][listNotaryExamples]::Pick_An_API)) Pick_An_API" [int]$listNotaryExamplesView = Read-Host "Select the action" } while (-not [listNotaryExamples]::IsDefined([listNotaryExamples], $listNotaryExamplesView)); @@ -971,6 +973,8 @@ function startNotary { Invoke-Script -Command "`".\examples\Notary\inviteNotaryToPool.ps1" } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::jurisdictions) { Invoke-Script -Command "`".\examples\Notary\Jurisdictions.ps1`"" + } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::sendWithThirdPartyNotary) { + Invoke-Script -Command "`".\examples\Notary\sendWithThirdPartyNotary.ps1`"" } } until ($listNotaryExamplesView -eq [listNotaryExamples]::Pick_An_API) startLauncher From f22e5244e0d43bb52e444cdca4f8d8bd0bde5982 Mon Sep 17 00:00:00 2001 From: meihDS <70775251+meihDS@users.noreply.github.com> Date: Tue, 11 Feb 2025 10:25:04 -0800 Subject: [PATCH 441/462] fixing codeDepot markers --- examples/Notary/sendWithThirdPartyNotary.ps1 | 21 +++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/examples/Notary/sendWithThirdPartyNotary.ps1 b/examples/Notary/sendWithThirdPartyNotary.ps1 index 12af507..f50432d 100644 --- a/examples/Notary/sendWithThirdPartyNotary.ps1 +++ b/examples/Notary/sendWithThirdPartyNotary.ps1 @@ -48,8 +48,15 @@ if ((Test-Path $docPath) -eq $false) { Write-Output "Sending the envelope request to Docusign..." Write-Output "Please wait, this may take a few moments." -# Concatenate the different parts of the request #ds-snippet-start:Notary4Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Notary4Step2 + +# Concatenate the different parts of the request +#ds-snippet-start:Notary4Step3 @{ emailSubject = "Please sign this document set"; documents = @( @@ -90,7 +97,6 @@ Write-Output "Please wait, this may take a few moments." ); notaries = @( @{ - email = ""; name = "Notary"; recipientId = "1"; routingOrder = "1"; @@ -127,20 +133,17 @@ Write-Output "Please wait, this may take a few moments." }; status = "sent"; } | ConvertTo-Json -Depth 32 > $requestData -#ds-snippet-end:Notary4Step2 +#ds-snippet-end:Notary4Step3 # Step 3. Call Docusign to create the envelope -#ds-snippet-start:Notary4Step3 +#ds-snippet-start:Notary4Step4 Invoke-RestMethod ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` - -Headers @{ - 'Authorization' = "Bearer $accessToken"; - 'Content-Type' = "application/json"; -} ` + -Headers $headers ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response -#ds-snippet-end:Notary4Step3 +#ds-snippet-end:Notary4Step4 Write-Output "Response: $(Get-Content -Raw $response)" From d838b567ccf54200af8e4fb44ecac6dcae3c99e2 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Tue, 11 Mar 2025 14:48:11 +0200 Subject: [PATCH 442/462] add example --- OAuth/code_grant.ps1 | 4 +- OAuth/jwt.ps1 | 47 ++-- .../eg001SetConnectedFields.ps1 | 264 ++++++++++++++++++ launcher.ps1 | 32 ++- 4 files changed, 323 insertions(+), 24 deletions(-) create mode 100644 examples/ConnectedFields/eg001SetConnectedFields.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 483f45b..4507cb1 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -41,10 +41,12 @@ elseif ($apiVersion -eq "maestro") { elseif ($apiVersion -eq "webForms") { $scopes = "signature%20webforms_read%20webforms_instance_read%20webforms_instance_write" } - elseif ($apiVersion -eq "navigator") { $scopes = "signature%20adm_store_unified_repo_read" } +elseif ($apiVersion -eq "connectedFields") { + $scopes = "signature adm_store_unified_repo_read" +} function GenerateCodeVerifier { return -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 43 | ForEach-Object {[char]$_}) diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index 97fe664..ea55f17 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -33,30 +33,33 @@ $INTEGRATION_KEY_JWT = $variables.INTEGRATION_KEY_JWT $timestamp = [int][double]::Parse((Get-Date (Get-Date).ToUniversalTime() -UFormat %s)) if ($apiVersion -eq "rooms") { - $scopes = "signature%20impersonation%20dtr.rooms.read%20dtr.rooms.write%20dtr.documents.read%20dtr.documents.write%20dtr.profile.read%20dtr.profile.write%20dtr.company.read%20dtr.company.write%20room_forms" - } elseif (($apiVersion -eq "eSignature") -or ($apiVersion -eq "idEvidence")) { - $scopes = "signature%20impersonation" - } elseif ($apiVersion -eq "click") { - $scopes = "click.manage%20click.send%20signature%20impersonation" - } - elseif ($apiVersion -eq "monitor") { - $scopes = "signature%20impersonation" - } - elseif ($apiVersion -eq "admin") { - $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read%20organization_sub_account_write%20organization_sub_account_read" - } - elseif ($apiVersion -eq "notary") { - $scopes = "signature%20organization_read%20notary_read%20notary_write" - } - elseif ($apiVersion -eq "maestro") { - $scopes = "signature%20aow_manage%20impersonation" - } - elseif ($apiVersion -eq "webForms") { - $scopes = "signature%20webforms_read%20webforms_instance_read%20webforms_instance_write" - } - elseif ($apiVersion -eq "navigator") { + $scopes = "signature%20impersonation%20dtr.rooms.read%20dtr.rooms.write%20dtr.documents.read%20dtr.documents.write%20dtr.profile.read%20dtr.profile.write%20dtr.company.read%20dtr.company.write%20room_forms" +} elseif (($apiVersion -eq "eSignature") -or ($apiVersion -eq "idEvidence")) { + $scopes = "signature%20impersonation" +} elseif ($apiVersion -eq "click") { + $scopes = "click.manage%20click.send%20signature%20impersonation" +} +elseif ($apiVersion -eq "monitor") { + $scopes = "signature%20impersonation" +} +elseif ($apiVersion -eq "admin") { + $scopes = "signature%20impersonation%20organization_read%20group_read%20permission_read%20user_read%20user_write%20account_read%20domain_read%20identity_provider_read%20user_data_redact%20asset_group_account_read%20asset_group_account_clone_write%20asset_group_account_clone_read%20organization_sub_account_write%20organization_sub_account_read" +} +elseif ($apiVersion -eq "notary") { + $scopes = "signature%20organization_read%20notary_read%20notary_write" +} +elseif ($apiVersion -eq "maestro") { + $scopes = "signature%20aow_manage%20impersonation" +} +elseif ($apiVersion -eq "webForms") { + $scopes = "signature%20webforms_read%20webforms_instance_read%20webforms_instance_write" +} +elseif ($apiVersion -eq "navigator") { $scopes = "signature%20adm_store_unified_repo_read" } +elseif ($apiVersion -eq "connectedFields") { + $scopes = "signature%20adm_store_unified_repo_read%20impersonation" +} # Request application consent $PORT = '8080' diff --git a/examples/ConnectedFields/eg001SetConnectedFields.ps1 b/examples/ConnectedFields/eg001SetConnectedFields.ps1 new file mode 100644 index 0000000..6be906d --- /dev/null +++ b/examples/ConnectedFields/eg001SetConnectedFields.ps1 @@ -0,0 +1,264 @@ +$apiUri1 = "https://api-d.docusign.com" +$apiUri2 = "https://demo.docusign.net/restapi" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" + +# Get required variables from .\config\settings.json file +$variables = Get-Content $configPath -Raw | ConvertFrom-Json + +# 1. Obtain your OAuth token +$accessToken = Get-Content $tokenPath + +# Obtain your accountId from demo.docusign.net -- the account id is shown in +# the drop down on the upper right corner of the screen by your picture or +# the default picture. +$accountID = Get-Content $accountIdPath + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile +$docBase64 = New-TemporaryFile + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") + +Invoke-RestMethod ` + -Uri "${apiUri1}/v1/accounts/${accountId}/connected-fields/tab-groups" ` + -Method 'GET' ` + -Headers $headers ` + -OutFile $response + +function Extract-VerifyInfo { + param ( + [string]$responseFile + ) + + # Read the response file content + $content = Get-Content $responseFile -Raw + + # Extract JSON + $jsonStart = $content.IndexOf('[') + if ($jsonStart -ge 0) { + $json = $content.Substring($jsonStart) | ConvertFrom-Json + } else { + Write-Error "No JSON array found in the response." + return + } + + # Filter the JSON to keep only verification extension apps + $filtered = $json | Where-Object { + $_.tabs -and ($_.tabs | Where-Object { $_.extensionData.actionContract -like "*Verify*" }) + } + + return $filtered | ConvertTo-Json -Depth 10 +} + +function Prompt-UserChoice { + param ( + [string]$jsonData + ) + + if (-not $jsonData -or $jsonData -eq "[]") { + Write-Host "No data verification were found in the account. Please install a data verification app." + Write-Host "You can install a phone number verification extension app by copying the following link to your browser: " + Write-Host "https://apps.docusign.com/app-center/app/d16f398f-8b9a-4f94-b37c-af6f9c910c04" + exit 1 + } + + $data = $jsonData | ConvertFrom-Json + + # Extract unique app IDs and application names + $uniqueApps = @{} + foreach ($item in $data) { + if ($item.appId -and $item.tabs[0].extensionData.applicationName) { + $uniqueApps[$item.appId] = $item.tabs[0].extensionData.applicationName + } + } + + # If no unique apps are found + if ($uniqueApps.Count -eq 0) { + Write-Host "No valid apps found in the JSON data." + exit 1 + } + + # Display available apps + Write-Host "Please select an app by entering a number:" + $appList = $uniqueApps.Keys | Sort-Object + for ($i = 0; $i -lt $appList.Count; $i++) { + Write-Host "$($i + 1). $($uniqueApps[$appList[$i]])" + } + + # Get user choice + $choice = Read-Host "Enter choice (1-$($appList.Count))" + if ($choice -match "^\d+$" -and [int]$choice -ge 1 -and [int]$choice -le $appList.Count) { + $chosenAppId = $appList[[int]$choice - 1] + + # Filter JSON data for the selected app ID + $selectedData = $data | Where-Object { $_.appId -eq $chosenAppId } + + # Call another function to process selected data (assuming Parse-VerificationData exists) + Parse-VerificationData -jsonData ($selectedData | ConvertTo-Json -Depth 10) + } else { + Write-Host "Invalid choice. Exiting." + exit 1 + } +} + +function Parse-VerificationData { + param ( + [string]$jsonData + ) + + # Convert JSON string to PowerShell object + $data = $jsonData | ConvertFrom-Json + + # Extract required fields from the first element + $extractedData = @{ + appId = $data.appId + extensionGroupId = $data.tabs[0].extensionData.extensionGroupId + publisherName = $data.tabs[0].extensionData.publisherName + applicationName = $data.tabs[0].extensionData.applicationName + actionName = $data.tabs[0].extensionData.actionName + actionInputKey = $data.tabs[0].extensionData.actionInputKey + actionContract = $data.tabs[0].extensionData.actionContract + extensionName = $data.tabs[0].extensionData.extensionName + extensionContract = $data.tabs[0].extensionData.extensionContract + requiredForExtension = $data.tabs[0].extensionData.requiredForExtension + tabLabel = ($data.tabs | ForEach-Object { $_.tabLabel }) -join ", " + connectionKey = $data.tabs[0].extensionData.connectionInstances[0].connectionKey + connectionValue = $data.tabs[0].extensionData.connectionInstances[0].connectionValue + } + + # Output the extracted information + Write-Host "App ID: $($extractedData.appId)"; + Write-Host "Extension Group ID: $($extractedData.extensionGroupId)"; + Write-Host "Publisher Name: $($extractedData.publisherName)"; + Write-Host "Application Name: $($extractedData.applicationName)"; + Write-Host "Action Name: $($extractedData.actionName)"; + Write-Host "Action Contract: $($extractedData.actionContract)"; + Write-Host "Action Input Key: $($extractedData.actionInputKey)"; + Write-Host "Extension Name: $($extractedData.extensionName)"; + Write-Host "Extension Contract: $($extractedData.extensionContract)"; + Write-Host "Required for Extension: $($extractedData.requiredForExtension)"; + Write-Host "Tab Label: $($extractedData.tabLabel)"; + Write-Host "Connection Key: $($extractedData.connectionKey)"; + Write-Host "Connection Value: $($extractedData.connectionValue)"; + + return $extractedData +} + +$filteredData = Extract-VerifyInfo -responseFile $response + +$verificationData = Prompt-UserChoice -jsonData $filteredData + +Write-Output "Sending the envelope request to Docusign..." + +# Fetch doc and encode +$docPath = ".\demo_documents\World_Wide_Corp_Lorem.pdf" +[Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $docBase64 + +# Construct the request body +@{ + emailSubject = "Please sign this document"; + documents = @( + @{ + documentBase64 = "$(Get-Content $docBase64)"; + name = "Lorem Ipsum"; + fileExtension = "pdf"; + documentId = "1"; + }; + ); + status = "sent"; + recipients = @{ + signers = @( + @{ + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "1"; + routingOrder = "1"; + tabs = @{ + signHereTabs = @( + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + textTabs = @( + @{ + requireInitialOnSharedChange = $false; + requireAll = $false; + name = $verificationData.applicationName; + required = $true; + locked = $false; + disableAutoSize = $false; + maxLength = 4000; + tabLabel = $verificationData.tabLabel; + font = "lucidaconsole"; + fontColor = "black"; + fontSize = "size9"; + documentId = "1"; + recipientId = "1"; + pageNumber = "1"; + xPosition = "273"; + yPosition = "191"; + width = "84"; + height = "22"; + templateRequired = $false; + tabType = "text"; + extensionData = @{ + extensionGroupId = $verificationData.extensionGroupId; + publisherName = $verificationData.publisherName; + applicationId = $verificationData.appId; + applicationName = $verificationData.applicationName; + actionName = $verificationData.actionName; + actionContract = $verificationData.actionContract; + extensionName = $verificationData.extensionName; + extensionContract = $verificationData.extensionContract; + requiredForExtension = $verificationData.requiredForExtension; + actionInputKey = $verificationData.actionInputKey; + extensionPolicy = "None"; + connectionInstances = @( + @{ + connectionKey = $verificationData.connectionKey; + connectionValue = $verificationData.connectionValue; + }; + ); + }; + }; + ); + }; + }; + ); + }; +} | ConvertTo-Json -Depth 32 > $requestData + +Invoke-RestMethod ` + -Uri "${apiUri2}/v2.1/accounts/${accountId}/envelopes" ` + -Method 'POST' ` + -Headers @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "application/json"; +} ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response + +Write-Output "Response: $(Get-Content -Raw $response)" + +# pull out the envelopeId +$envelopeId = $(Get-Content $response | ConvertFrom-Json).envelopeId + +# Save the envelope id for use by other scripts +Write-Output "EnvelopeId: $envelopeId" +Write-Output $envelopeId > .\config\ENVELOPE_ID + +# cleanup +Remove-Item $requestData +Remove-Item $response +Remove-Item $docBase64 + +Write-Output "Done. When signing the envelope, ensure the connection to your data verification extension app is active." diff --git a/launcher.ps1 b/launcher.ps1 index 7d376b1..afbd91d 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -106,7 +106,8 @@ function startLauncher { WebForms = 8; Maestro = 9; Navigator = 10; - Exit = 11; + ConnectedFields = 11; + Exit = 12; } $listApiView = $null; @@ -147,6 +148,7 @@ function startLauncher { Write-Output "$([int][listApi]::WebForms)) Web Forms" Write-Output "$([int][listApi]::Maestro)) Maestro (beta)" Write-Output "$([int][listApi]::Navigator)) Navigator (beta)" + Write-Output "$([int][listApi]::ConnectedFields)) Connected Fields" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); @@ -181,6 +183,9 @@ function startLauncher { elseif ($listApiView -eq [listApi]::Navigator) { startAuth "navigator" } + elseif ($listApiView -eq [listApi]::ConnectedFields) { + startAuth "connectedFields" + } elseif ($listApiView -eq [listApi]::Exit) { exit 1 } @@ -259,6 +264,9 @@ function startAuth ($apiVersion) { elseif ($listApiView -eq [listApi]::Maestro) { startMaestro } + elseif ($listApiView -eq [listApi]::ConnectedFields) { + startConnectedFields + } } function startCFRSignature { @@ -1053,5 +1061,27 @@ function startNavigator { startLauncher } +function startConnectedFields { + do { + Enum listConnectedFieldsExamples { + setConnectedFields = 1; + Pick_An_API = 2; + } + $listConnectedFieldsExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listConnectedFieldsExamples]::setConnectedFields)) Set_Connected_Fields" + Write-Output "$([int][listConnectedFieldsExamples]::Pick_An_API)) Pick_An_API" + [int]$listConnectedFieldsExamplesView = Read-Host "Select the action" + } while (-not [listConnectedFieldsExamples]::IsDefined([listConnectedFieldsExamples], $listConnectedFieldsExamplesView)); + + if ($listConnectedFieldsExamplesView -eq [listConnectedFieldsExamples]::setConnectedFields) { + Invoke-Script -Command "`".\examples\ConnectedFields\eg001SetConnectedFields.ps1`"" + } + } until ($listConnectedFieldsExamplesView -eq [listConnectedFieldsExamples]::Pick_An_API) + startLauncher +} + Write-Output "Welcome to the Docusign PowerShell Launcher" startLauncher From ada3fb606f50ee7c8b0591de5076163947e6b5e7 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Wed, 12 Mar 2025 18:40:29 +0200 Subject: [PATCH 443/462] check if connectionInstances exist --- examples/ConnectedFields/eg001SetConnectedFields.ps1 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/ConnectedFields/eg001SetConnectedFields.ps1 b/examples/ConnectedFields/eg001SetConnectedFields.ps1 index 6be906d..8c3a36b 100644 --- a/examples/ConnectedFields/eg001SetConnectedFields.ps1 +++ b/examples/ConnectedFields/eg001SetConnectedFields.ps1 @@ -115,6 +115,13 @@ function Parse-VerificationData { # Convert JSON string to PowerShell object $data = $jsonData | ConvertFrom-Json + $connectionKeyData = '' + $connectionValueData = '' + if ($data.tabs[0].extensionData.connectionInstances) { + $connectionKeyData = $data.tabs[0].extensionData.connectionInstances[0].connectionKey + $connectionValueData = $data.tabs[0].extensionData.connectionInstances[0].connectionValue + } + # Extract required fields from the first element $extractedData = @{ appId = $data.appId @@ -128,8 +135,8 @@ function Parse-VerificationData { extensionContract = $data.tabs[0].extensionData.extensionContract requiredForExtension = $data.tabs[0].extensionData.requiredForExtension tabLabel = ($data.tabs | ForEach-Object { $_.tabLabel }) -join ", " - connectionKey = $data.tabs[0].extensionData.connectionInstances[0].connectionKey - connectionValue = $data.tabs[0].extensionData.connectionInstances[0].connectionValue + connectionKey = $connectionKeyData + connectionValue = $connectionValueData } # Output the extracted information From 9fbc04d50db03947a85870c0e906d3d6e2316ebf Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Thu, 13 Mar 2025 16:21:48 +0200 Subject: [PATCH 444/462] include connected fields app --- .../ConnectedFields/eg001SetConnectedFields.ps1 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/examples/ConnectedFields/eg001SetConnectedFields.ps1 b/examples/ConnectedFields/eg001SetConnectedFields.ps1 index 8c3a36b..b2a21a0 100644 --- a/examples/ConnectedFields/eg001SetConnectedFields.ps1 +++ b/examples/ConnectedFields/eg001SetConnectedFields.ps1 @@ -20,17 +20,22 @@ $requestData = New-TemporaryFile $response = New-TemporaryFile $docBase64 = New-TemporaryFile +#ds-snippet-start:ConnectedFields1Step2 $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.add("Authorization", "Bearer $accessToken") $headers.add("Content-Type", "application/json") $headers.add("Accept", "application/json") +#ds-snippet-end:ConnectedFields1Step2 +#ds-snippet-start:ConnectedFields1Step3 Invoke-RestMethod ` -Uri "${apiUri1}/v1/accounts/${accountId}/connected-fields/tab-groups" ` -Method 'GET' ` -Headers $headers ` -OutFile $response +#ds-snippet-end:ConnectedFields1Step3 +#ds-snippet-start:ConnectedFields1Step4 function Extract-VerifyInfo { param ( [string]$responseFile @@ -50,7 +55,10 @@ function Extract-VerifyInfo { # Filter the JSON to keep only verification extension apps $filtered = $json | Where-Object { - $_.tabs -and ($_.tabs | Where-Object { $_.extensionData.actionContract -like "*Verify*" }) + $_.tabs -and ($_.tabs | Where-Object { + ($_.extensionData.actionContract -like "*Verify*") -or + ($_.PSObject.Properties['tabLabel'] -and $_.tabLabel -like "*connecteddata*") + }) } return $filtered | ConvertTo-Json -Depth 10 @@ -160,6 +168,7 @@ function Parse-VerificationData { $filteredData = Extract-VerifyInfo -responseFile $response $verificationData = Prompt-UserChoice -jsonData $filteredData +#ds-snippet-end:ConnectedFields1Step4 Write-Output "Sending the envelope request to Docusign..." @@ -168,6 +177,7 @@ $docPath = ".\demo_documents\World_Wide_Corp_Lorem.pdf" [Convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path $docPath))) > $docBase64 # Construct the request body +#ds-snippet-start:ConnectedFields1Step5 @{ emailSubject = "Please sign this document"; documents = @( @@ -243,7 +253,9 @@ $docPath = ".\demo_documents\World_Wide_Corp_Lorem.pdf" ); }; } | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:ConnectedFields1Step5 +#ds-snippet-start:ConnectedFields1Step6 Invoke-RestMethod ` -Uri "${apiUri2}/v2.1/accounts/${accountId}/envelopes" ` -Method 'POST' ` @@ -253,6 +265,7 @@ Invoke-RestMethod ` } ` -InFile (Resolve-Path $requestData).Path ` -OutFile $response +#ds-snippet-end:ConnectedFields1Step6 Write-Output "Response: $(Get-Content -Raw $response)" From 75b473c69f2ed5d148ece4df969d6b36cb3c9cd7 Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Thu, 20 Mar 2025 12:20:05 -0700 Subject: [PATCH 445/462] Add helper function to code depot as context --- examples/eSignature/eg010SendBinaryDocs.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/eSignature/eg010SendBinaryDocs.ps1 b/examples/eSignature/eg010SendBinaryDocs.ps1 index 8c5a868..18fb0cc 100644 --- a/examples/eSignature/eg010SendBinaryDocs.ps1 +++ b/examples/eSignature/eg010SendBinaryDocs.ps1 @@ -1,3 +1,4 @@ +#ds-snippet-start:eSign10Step3 function Add-OemContent { param( $destination, @@ -5,6 +6,7 @@ function Add-OemContent { ) Add-Content -Path $destination -Value $content -Encoding oem -NoNewline } +#ds-snippet-end:eSign10Step3 # Configuration # Get required variables from .\config\settings.json: From 5d6d325d5fe484456c6b98f7567d2b454c40c0e9 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Fri, 4 Apr 2025 14:31:02 +0300 Subject: [PATCH 446/462] update code example --- .../eg001SetConnectedFields.ps1 | 177 ++++++++++-------- 1 file changed, 97 insertions(+), 80 deletions(-) diff --git a/examples/ConnectedFields/eg001SetConnectedFields.ps1 b/examples/ConnectedFields/eg001SetConnectedFields.ps1 index b2a21a0..f3cc9ea 100644 --- a/examples/ConnectedFields/eg001SetConnectedFields.ps1 +++ b/examples/ConnectedFields/eg001SetConnectedFields.ps1 @@ -106,9 +106,7 @@ function Prompt-UserChoice { # Filter JSON data for the selected app ID $selectedData = $data | Where-Object { $_.appId -eq $chosenAppId } - - # Call another function to process selected data (assuming Parse-VerificationData exists) - Parse-VerificationData -jsonData ($selectedData | ConvertTo-Json -Depth 10) + return $selectedData } else { Write-Host "Invalid choice. Exiting." exit 1 @@ -117,57 +115,40 @@ function Prompt-UserChoice { function Parse-VerificationData { param ( - [string]$jsonData + $selectedAppId, + $tab ) - # Convert JSON string to PowerShell object - $data = $jsonData | ConvertFrom-Json - $connectionKeyData = '' $connectionValueData = '' - if ($data.tabs[0].extensionData.connectionInstances) { - $connectionKeyData = $data.tabs[0].extensionData.connectionInstances[0].connectionKey - $connectionValueData = $data.tabs[0].extensionData.connectionInstances[0].connectionValue + if ($tab.extensionData.connectionInstances) { + $connectionKeyData = $tab.extensionData.connectionInstances[0].connectionKey + $connectionValueData = $tab.extensionData.connectionInstances[0].connectionValue } # Extract required fields from the first element $extractedData = @{ - appId = $data.appId - extensionGroupId = $data.tabs[0].extensionData.extensionGroupId - publisherName = $data.tabs[0].extensionData.publisherName - applicationName = $data.tabs[0].extensionData.applicationName - actionName = $data.tabs[0].extensionData.actionName - actionInputKey = $data.tabs[0].extensionData.actionInputKey - actionContract = $data.tabs[0].extensionData.actionContract - extensionName = $data.tabs[0].extensionData.extensionName - extensionContract = $data.tabs[0].extensionData.extensionContract - requiredForExtension = $data.tabs[0].extensionData.requiredForExtension - tabLabel = ($data.tabs | ForEach-Object { $_.tabLabel }) -join ", " + appId = $selectedAppId + extensionGroupId = $tab.extensionData.extensionGroupId + publisherName = $tab.extensionData.publisherName + applicationName = $tab.extensionData.applicationName + actionName = $tab.extensionData.actionName + actionInputKey = $tab.extensionData.actionInputKey + actionContract = $tab.extensionData.actionContract + extensionName = $tab.extensionData.extensionName + extensionContract = $tab.extensionData.extensionContract + requiredForExtension = $tab.extensionData.requiredForExtension + tabLabel = $tab.tabLabel connectionKey = $connectionKeyData connectionValue = $connectionValueData } - # Output the extracted information - Write-Host "App ID: $($extractedData.appId)"; - Write-Host "Extension Group ID: $($extractedData.extensionGroupId)"; - Write-Host "Publisher Name: $($extractedData.publisherName)"; - Write-Host "Application Name: $($extractedData.applicationName)"; - Write-Host "Action Name: $($extractedData.actionName)"; - Write-Host "Action Contract: $($extractedData.actionContract)"; - Write-Host "Action Input Key: $($extractedData.actionInputKey)"; - Write-Host "Extension Name: $($extractedData.extensionName)"; - Write-Host "Extension Contract: $($extractedData.extensionContract)"; - Write-Host "Required for Extension: $($extractedData.requiredForExtension)"; - Write-Host "Tab Label: $($extractedData.tabLabel)"; - Write-Host "Connection Key: $($extractedData.connectionKey)"; - Write-Host "Connection Value: $($extractedData.connectionValue)"; - return $extractedData } $filteredData = Extract-VerifyInfo -responseFile $response -$verificationData = Prompt-UserChoice -jsonData $filteredData +$selectedApp = Prompt-UserChoice -jsonData $filteredData #ds-snippet-end:ConnectedFields1Step4 Write-Output "Sending the envelope request to Docusign..." @@ -178,6 +159,84 @@ $docPath = ".\demo_documents\World_Wide_Corp_Lorem.pdf" # Construct the request body #ds-snippet-start:ConnectedFields1Step5 +function Get-Extension-Data { + param ( + $verificationData + ) + + return @{ + extensionGroupId = $verificationData.extensionGroupId; + publisherName = $verificationData.publisherName; + applicationId = $verificationData.appId; + applicationName = $verificationData.applicationName; + actionName = $verificationData.actionName; + actionContract = $verificationData.actionContract; + extensionName = $verificationData.extensionName; + extensionContract = $verificationData.extensionContract; + requiredForExtension = $verificationData.requiredForExtension; + actionInputKey = $verificationData.actionInputKey; + extensionPolicy = "MustVerifyToSign"; + connectionInstances = @( + @{ + connectionKey = $verificationData.connectionKey; + connectionValue = $verificationData.connectionValue; + }; + ); + }; +} + +function Make-Text-Tab { + param ( + $verificationData, + $extensionData, + $textTabCount + ) + + return @{ + requireInitialOnSharedChange = $false; + requireAll = $false; + name = $verificationData.applicationName; + required = $true; + locked = $false; + disableAutoSize = $false; + maxLength = 4000; + tabLabel = $verificationData.tabLabel; + font = "lucidaconsole"; + fontColor = "black"; + fontSize = "size9"; + documentId = "1"; + recipientId = "1"; + pageNumber = "1"; + xPosition = 70 + 100 * [math]::Floor($textTabCount / 10); + yPosition = 560 + 20 * ($textTabCount % 10); + width = "84"; + height = "22"; + templateRequired = $false; + tabType = "text"; + tooltip = $verificationData.actionInputKey; + extensionData = $extensionData + }; +} + +function Make-Text-Tab-List { + param ( + $app + ) + + $text_tabs = @() + foreach ($tab in $app.tabs | Where-Object { $_.tabLabel -notlike '*SuggestionInput*' }) { + $verificationData = Parse-VerificationData -selectedAppId $app.appId -tab $tab + $extensionData = Get-Extension-Data -verificationData $verificationData + + $text_tab = Make-Text-Tab -verificationData $verificationData -extensionData $extensionData -textTabCount $text_tabs.Count + $text_tabs += $text_tab + } + + return $text_tabs +} + +$text_tabs = Make-Text-Tab-List -app $selectedApp + @{ emailSubject = "Please sign this document"; documents = @( @@ -205,49 +264,7 @@ $docPath = ".\demo_documents\World_Wide_Corp_Lorem.pdf" anchorYOffset = "10"; }; ); - textTabs = @( - @{ - requireInitialOnSharedChange = $false; - requireAll = $false; - name = $verificationData.applicationName; - required = $true; - locked = $false; - disableAutoSize = $false; - maxLength = 4000; - tabLabel = $verificationData.tabLabel; - font = "lucidaconsole"; - fontColor = "black"; - fontSize = "size9"; - documentId = "1"; - recipientId = "1"; - pageNumber = "1"; - xPosition = "273"; - yPosition = "191"; - width = "84"; - height = "22"; - templateRequired = $false; - tabType = "text"; - extensionData = @{ - extensionGroupId = $verificationData.extensionGroupId; - publisherName = $verificationData.publisherName; - applicationId = $verificationData.appId; - applicationName = $verificationData.applicationName; - actionName = $verificationData.actionName; - actionContract = $verificationData.actionContract; - extensionName = $verificationData.extensionName; - extensionContract = $verificationData.extensionContract; - requiredForExtension = $verificationData.requiredForExtension; - actionInputKey = $verificationData.actionInputKey; - extensionPolicy = "None"; - connectionInstances = @( - @{ - connectionKey = $verificationData.connectionKey; - connectionValue = $verificationData.connectionValue; - }; - ); - }; - }; - ); + textTabs = $text_tabs; }; }; ); From 81866e11a5a4b39559f17f08203d06cee79a6e6b Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware Date: Fri, 4 Apr 2025 15:57:01 +0300 Subject: [PATCH 447/462] fixes for mac --- .../eg001SetConnectedFields.ps1 | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/ConnectedFields/eg001SetConnectedFields.ps1 b/examples/ConnectedFields/eg001SetConnectedFields.ps1 index f3cc9ea..e55c31c 100644 --- a/examples/ConnectedFields/eg001SetConnectedFields.ps1 +++ b/examples/ConnectedFields/eg001SetConnectedFields.ps1 @@ -193,13 +193,13 @@ function Make-Text-Tab { ) return @{ - requireInitialOnSharedChange = $false; - requireAll = $false; + requireInitialOnSharedChange = "false"; + requireAll = "false"; name = $verificationData.applicationName; - required = $true; - locked = $false; - disableAutoSize = $false; - maxLength = 4000; + required = "true"; + locked = "false"; + disableAutoSize = "false"; + maxLength = "4000"; tabLabel = $verificationData.tabLabel; font = "lucidaconsole"; fontColor = "black"; @@ -207,11 +207,11 @@ function Make-Text-Tab { documentId = "1"; recipientId = "1"; pageNumber = "1"; - xPosition = 70 + 100 * [math]::Floor($textTabCount / 10); - yPosition = 560 + 20 * ($textTabCount % 10); + xPosition = [string](70 + 100 * [math]::Floor($textTabCount / 10)); + yPosition = [string](560 + 20 * ($textTabCount % 10)); width = "84"; height = "22"; - templateRequired = $false; + templateRequired = "false"; tabType = "text"; tooltip = $verificationData.actionInputKey; extensionData = $extensionData @@ -235,7 +235,7 @@ function Make-Text-Tab-List { return $text_tabs } -$text_tabs = Make-Text-Tab-List -app $selectedApp +$textTabs = Make-Text-Tab-List -app $selectedApp @{ emailSubject = "Please sign this document"; @@ -264,7 +264,7 @@ $text_tabs = Make-Text-Tab-List -app $selectedApp anchorYOffset = "10"; }; ); - textTabs = $text_tabs; + textTabs = @($textTabs); }; }; ); From 3b2d3079b4dcb9f6dc48af36ec210a09f620581b Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 15 May 2025 15:19:22 -0700 Subject: [PATCH 448/462] Update README.md Signed-off-by: Inbar Gazit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cd536e1..f871033 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ For information about the scopes used for obtaining authorization to use the Mon For a list of code examples that use the Monitor API, see the [How-to guides overview](https://developers.docusign.com/docs/monitor-api/how-to/) on the Docusign Developer Center. -## Notary API (closed beta) +## Notary API **Note:** For closed beta participants interested in adding Notary API functionality to your production account, contact your Docusign representative. From ae3dfbfc4a8922c8f26e8b4d3f8db8ae7f1bff31 Mon Sep 17 00:00:00 2001 From: Inbar Gazit Date: Thu, 15 May 2025 15:20:55 -0700 Subject: [PATCH 449/462] Update README.md Signed-off-by: Inbar Gazit --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index f871033..1a33db9 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,6 @@ For a list of code examples that use the Monitor API, see the [How-to guides ove ## Notary API -**Note:** For closed beta participants interested in adding Notary API functionality to your production account, contact your Docusign representative. - Example 1 requires a Sender Docusign developer account API account ID that has been provisioned for the [Notary API base URI](https://developers.docusign.com/docs/notary-api/go-live/). Example 2 requires that you [create an organization](https://support.docusign.com/en/guides/org-admin-guide-create-org) in your Sender Docusign developer account. From e6977e1b7d4b625ad62f44c3f9429f9b522eb5ae Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 27 May 2025 15:25:25 +0200 Subject: [PATCH 450/462] added embedding of the maestro workflow --- examples/Maestro/eg001TriggerWorkflow.ps1 | 20 +++--- .../startServerForEmbeddingWorkflow.ps1 | 68 +++++++++++++++++++ 2 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 examples/Maestro/startServerForEmbeddingWorkflow.ps1 diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index bdb2d25..68d0114 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -77,15 +77,19 @@ $triggerResult = Invoke-WebRequest -uri $triggerUrl -headers $headers -body $bod $instanceUrl = $($triggerResult | ConvertFrom-Json).instance_url +# Decode escaped characters $instanceUrl = $instanceUrl -replace "\\u0026", "&" -Write-Output "Response: $instanceUrl" +Write-Host "Use this URL to complete the workflow steps:" +Write-Host $instanceUrl -# pull out the envelopeId -$instanceId = $($triggerResult | ConvertFrom-Json).instance_id -# Store the instance_id into the config file -Write-Output $instanceId > .\config\INSTANCE_ID +Write-Host "" +Write-Host "Opening a browser with the embedded workflow..." -# cleanup -Remove-Item $response +# Wait a bit to let the server start +Start-Sleep -Seconds 2 -Write-Output "Done." \ No newline at end of file +# Start script for the embedded workflow +& "./examples/Maestro/startServerForEmbeddingWorkflow.ps1" -triggerUrl $instanceUrl + +# Open the browser +Start-Process "http://localhost:8080" diff --git a/examples/Maestro/startServerForEmbeddingWorkflow.ps1 b/examples/Maestro/startServerForEmbeddingWorkflow.ps1 new file mode 100644 index 0000000..723e5f5 --- /dev/null +++ b/examples/Maestro/startServerForEmbeddingWorkflow.ps1 @@ -0,0 +1,68 @@ +param ( + [string]$triggerUrl +) + +$PORT = 8080 +$IP = "localhost" +$listener = New-Object System.Net.HttpListener +$prefix = "http://$IP`:$PORT/" +$listener.Prefixes.Add($prefix) +$listener.Start() +Write-Host "Listening on $prefix" + +# Correct HTML without raw HTTP headers +$responseHtml = @" + +
+

The document has been embedded using Maestro Embedded Workflow.

+
+ + + + + + Example Workflow + + + +
+ +
+ + + +
+ +"@ + +try { + while ($true) { + $context = $listener.GetContext() + $request = $context.Request + $response = $context.Response + + if ($request.HttpMethod -eq "GET") { + $response.ContentType = "text/html" + $buffer = [System.Text.Encoding]::UTF8.GetBytes($responseHtml) + $response.ContentLength64 = $buffer.Length + $response.OutputStream.Write($buffer, 0, $buffer.Length) + $response.OutputStream.Close() + break + } + } +} catch { + Write-Error "Server error: $_" +} finally { + $listener.Stop() + Write-Host "Server stopped." +} \ No newline at end of file From 77842329cd16228c683f6f6776db3f8eed5c61d1 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 4 Jun 2025 14:13:31 +0200 Subject: [PATCH 451/462] saving only first template id in case there are few of them --- examples/eSignature/eg008CreateTemplate.ps1 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/eSignature/eg008CreateTemplate.ps1 b/examples/eSignature/eg008CreateTemplate.ps1 index ae41d7e..0603e3b 100644 --- a/examples/eSignature/eg008CreateTemplate.ps1 +++ b/examples/eSignature/eg008CreateTemplate.ps1 @@ -30,13 +30,14 @@ Invoke-RestMethod ` -OutFile $response # pull out the templateId if it was returned -$templateId = $(Get-Content $response | ConvertFrom-Json).envelopeTemplates.templateId +$templateIds = $(Get-Content $response | ConvertFrom-Json).envelopeTemplates.templateId -Write-Output "Did we find any templateIds?: $templateId" +Write-Output "Did we find any templateIds?: $templateIds" -if (-not ([string]::IsNullOrEmpty($templateId))) { +if (-not ([string]::IsNullOrEmpty($templateIds))) { Write-Output "Your account already includes the '${templateName}' template." # Save the template id for use by other scripts + $templateId = $templateIds -split ' ' | Select-Object -First 1 Write-Output "${templateId}" > .\config\TEMPLATE_ID Remove-Item $response Write-Output "Done." From 1f63b9715fa7ec7117e94202e0e633b0c4b95f9f Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 4 Jun 2025 14:23:42 +0200 Subject: [PATCH 452/462] added mistake output --- examples/Maestro/eg001TriggerWorkflow.ps1 | 38 +++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index 68d0114..419efd7 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -71,25 +71,29 @@ $body = @" "@ #ds-snippet-end:Maestro1Step4 -#ds-snippet-start:Maestro1Step5 -$triggerResult = Invoke-WebRequest -uri $triggerUrl -headers $headers -body $body -method POST -UseBasicParsing -#ds-snippet-end:Maestro1Step5 +if (-not ([string]::IsNullOrEmpty($triggerUrl))) { + #ds-snippet-start:Maestro1Step5 + $triggerResult = Invoke-WebRequest -uri $triggerUrl -headers $headers -body $body -method POST -UseBasicParsing + #ds-snippet-end:Maestro1Step5 + $instanceUrl = $($triggerResult | ConvertFrom-Json).instance_url + # Decode escaped characters + $instanceUrl = $instanceUrl -replace "\\u0026", "&" + Write-Host "Use this URL to complete the workflow steps:" + Write-Host $instanceUrl -$instanceUrl = $($triggerResult | ConvertFrom-Json).instance_url -# Decode escaped characters -$instanceUrl = $instanceUrl -replace "\\u0026", "&" -Write-Host "Use this URL to complete the workflow steps:" -Write-Host $instanceUrl + Write-Host "" + Write-Host "Opening a browser with the embedded workflow..." -Write-Host "" -Write-Host "Opening a browser with the embedded workflow..." + # Wait a bit to let the server start + Start-Sleep -Seconds 2 -# Wait a bit to let the server start -Start-Sleep -Seconds 2 + # Start script for the embedded workflow + & "./examples/Maestro/startServerForEmbeddingWorkflow.ps1" -triggerUrl $instanceUrl -# Start script for the embedded workflow -& "./examples/Maestro/startServerForEmbeddingWorkflow.ps1" -triggerUrl $instanceUrl - -# Open the browser -Start-Process "http://localhost:8080" + # Open the browser + Start-Process "http://localhost:8080" +} else { + Write-Host "" + Write-Host "The WORKFLOW_ID file contains the ID of the unpublished maestro workflow. Please, delete this file and try running the example again." +} \ No newline at end of file From 0062b38b5e715086202e1fe7418a3a619aebf499 Mon Sep 17 00:00:00 2001 From: nianiB9 Date: Wed, 4 Jun 2025 15:40:20 -0500 Subject: [PATCH 453/462] code snippets --- examples/Maestro/eg001TriggerWorkflow.ps1 | 2 +- .../Maestro/startServerForEmbeddingWorkflow.ps1 | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index 419efd7..6bb081d 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -89,7 +89,7 @@ if (-not ([string]::IsNullOrEmpty($triggerUrl))) { Start-Sleep -Seconds 2 # Start script for the embedded workflow - & "./examples/Maestro/startServerForEmbeddingWorkflow.ps1" -triggerUrl $instanceUrl +& "./examples/Maestro/startServerForEmbeddingWorkflow.ps1" -instanceUrl $instanceUrl # Open the browser Start-Process "http://localhost:8080" diff --git a/examples/Maestro/startServerForEmbeddingWorkflow.ps1 b/examples/Maestro/startServerForEmbeddingWorkflow.ps1 index 723e5f5..92aeb6f 100644 --- a/examples/Maestro/startServerForEmbeddingWorkflow.ps1 +++ b/examples/Maestro/startServerForEmbeddingWorkflow.ps1 @@ -1,5 +1,5 @@ param ( - [string]$triggerUrl + [string]$instanceUrl ) $PORT = 8080 @@ -12,9 +12,6 @@ Write-Host "Listening on $prefix" # Correct HTML without raw HTTP headers $responseHtml = @" -

The document has been embedded using Maestro Embedded Workflow.


@@ -33,16 +30,19 @@ $responseHtml = @" +
- +
+

Continue

- "@ try { From e55a628c5297b68f604ef741dad44d5a4b50c50b Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Mon, 9 Jun 2025 15:41:39 -0700 Subject: [PATCH 454/462] add maestro 2 --- examples/Maestro/eg002PauseWorkflow.ps1 | 63 +++++++++++++++++++++++++ launcher.ps1 | 7 ++- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 examples/Maestro/eg002PauseWorkflow.ps1 diff --git a/examples/Maestro/eg002PauseWorkflow.ps1 b/examples/Maestro/eg002PauseWorkflow.ps1 new file mode 100644 index 0000000..6e37578 --- /dev/null +++ b/examples/Maestro/eg002PauseWorkflow.ps1 @@ -0,0 +1,63 @@ +# Pause a running workflow instance + +# Check for workflow_id file existence and content +if (Test-Path "config/WORKFLOW_ID") { + $workflowId = Get-Content "config/WORKFLOW_ID" + if ([string]::IsNullOrWhiteSpace($workflowId)) { + Write-Host "Workflow ID file is empty. Please run example 1 to create a workflow before running this example." + exit 0 + } +} else { + Write-Host "Workflow ID file does not exist. Please run example 1 to create a workflow before running this example." + exit 1 +} +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +$basePath = "https://api-d.docusign.com/v1" + +# Construct your API headers +#ds-snippet-start:Maestro2Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Maestro2Step2 + +Write-Host "" +Write-Host "Attempting to pause the Workflow.." +Write-Host "" + +# Send the POST request + +$response = New-TemporaryFile +try { + #ds-snippet-start:Maestro2Step3 + Invoke-RestMethod ` + -Uri "${basePath}/accounts/${accountId}/workflows/${workflowId}/actions/pause" ` + -Method 'POST' ` + -Headers $headers ` + -OutFile $response + #ds-snippet-end:Maestro2Step3 + + Write-Host "" + Write-Host "Workflow has been paused." + Write-Host "" + Write-Output "Response: $(Get-Content -Raw $response)" +} catch { + Write-Output "Unable to pause creation of workflow instances." + # On failure, display a notification, X-DocuSign-TraceToken, error message, and the command that triggered the error + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] } + $int++ + } + Write-Output "Error : "$_.ErrorDetails.Message + Write-Output "Command : "$_.InvocationInfo.Line +} +Write-Host "" + diff --git a/launcher.ps1 b/launcher.ps1 index afbd91d..0aa03a7 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1014,13 +1014,15 @@ function startMaestro { do { Enum listMaestroExamples { triggerWorkflow = 1; - Pick_An_API = 2; + pauseWorkflow = 2; + Pick_An_API = 3; } $listMaestroExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMaestroExamples]::triggerWorkflow)) How to trigger a Maestro workflow" + Write-Output "$([int][listMaestroExamples]::pauseWorkflow)) How to pause the creation of workflow instances" Write-Output "$([int][listMaestroExamples]::Pick_An_API)) Pick_An_API" [int]$listMaestroExamplesView = Read-Host "Select the action" } while (-not [listMaestroExamples]::IsDefined([listMaestroExamples], $listMaestroExamplesView)); @@ -1029,6 +1031,9 @@ function startMaestro { Invoke-Script -Command "`".\examples\Maestro\eg001TriggerWorkflow.ps1`"" } + elseif ($listMaestroExamplesView -eq [listMaestroExamples]::pauseWorkflow) { + Invoke-Script -Command "`".\examples\Maestro\eg002PauseWorkflow.ps1`"" + } } until ($listMaestroExamplesView -eq [listMaestroExamples]::Pick_An_API) startLauncher From 621d72f8691d4c999dd986db6c5b69ddf39ba506 Mon Sep 17 00:00:00 2001 From: nianiB9 Date: Wed, 11 Jun 2025 11:25:40 -0500 Subject: [PATCH 455/462] new powershell example --- examples/Maestro/eg003ResumeWorkflow.ps1 | 62 ++++++++++++++++++++++++ launcher.ps1 | 7 ++- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 examples/Maestro/eg003ResumeWorkflow.ps1 diff --git a/examples/Maestro/eg003ResumeWorkflow.ps1 b/examples/Maestro/eg003ResumeWorkflow.ps1 new file mode 100644 index 0000000..e513d82 --- /dev/null +++ b/examples/Maestro/eg003ResumeWorkflow.ps1 @@ -0,0 +1,62 @@ +# Resume creation of a workflow instance + +# Check for workflow_id file existence and content +if (Test-Path "config/WORKFLOW_ID") { + $workflowId = Get-Content "config/WORKFLOW_ID" + if ([string]::IsNullOrWhiteSpace($workflowId)) { + Write-Host "Workflow ID file is empty. Please run example 1 to create a workflow before running this example." + exit 0 + } +} else { + Write-Host "Workflow ID file does not exist. Please run example 1 to create a workflow before running this example." + exit 1 +} + +# Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID +$basePath = "https://api-d.docusign.com/v1" + +# Construct your API headers +#ds-snippet-start:Maestro3Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Maestro3Step2 + +Write-Host "" +Write-Host "Attempting to resume the Workflow..." +Write-Host "" + +# Make the API call to resume +$response = New-TemporaryFile +try { +#ds-snippet-start:Maestro3Step3 + Invoke-RestMethod ` + -Uri "${basePath}/accounts/${accountId}/workflows/${workflowId}/actions/resume" ` + -Method 'POST' ` + -Headers $headers ` + -OutFile $response +#ds-snippet-end:Maestro3Step3 + + Write-Host "" + Write-Host "Workflow has been resumed." + Write-Host "" + Write-Output "Response: $(Get-Content -Raw $response)" +} catch { + Write-Output "Unable to resume creation of workflow instances." + foreach ($header in $_.Exception.Response.Headers) { + if ($header -eq "X-DocuSign-TraceToken") { + Write-Output "TraceToken : " $_.Exception.Response.Headers[$int] + } + $int++ + } + Write-Output "Error : " $_.ErrorDetails.Message + Write-Output "Command : " $_.InvocationInfo.Line +} +Write-Host "" diff --git a/launcher.ps1 b/launcher.ps1 index 0aa03a7..4760885 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1015,7 +1015,8 @@ function startMaestro { Enum listMaestroExamples { triggerWorkflow = 1; pauseWorkflow = 2; - Pick_An_API = 3; + resumeWorkflow = 3; + Pick_An_API = 4; } $listMaestroExamplesView = $null; do { @@ -1023,6 +1024,7 @@ function startMaestro { Write-Output 'Select the action: ' Write-Output "$([int][listMaestroExamples]::triggerWorkflow)) How to trigger a Maestro workflow" Write-Output "$([int][listMaestroExamples]::pauseWorkflow)) How to pause the creation of workflow instances" + Write-Output "$([int][listMaestroExamples]::resumeWorkflow)) How to resume the creation of workflow instances" Write-Output "$([int][listMaestroExamples]::Pick_An_API)) Pick_An_API" [int]$listMaestroExamplesView = Read-Host "Select the action" } while (-not [listMaestroExamples]::IsDefined([listMaestroExamples], $listMaestroExamplesView)); @@ -1034,6 +1036,9 @@ function startMaestro { elseif ($listMaestroExamplesView -eq [listMaestroExamples]::pauseWorkflow) { Invoke-Script -Command "`".\examples\Maestro\eg002PauseWorkflow.ps1`"" } + elseif ($listMaestroExamplesView -eq [listMaestroExamples]::resumeWorkflow) { + Invoke-Script -Command "`".\examples\Maestro\eg003ResumeWorkflow.ps1`"" + } } until ($listMaestroExamplesView -eq [listMaestroExamples]::Pick_An_API) startLauncher From bfdc1f472e6d324e4368be920ca01a35c72cbf8b Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Mon, 16 Jun 2025 09:22:22 -0700 Subject: [PATCH 456/462] adding maestro example 4 --- examples/Maestro/eg001TriggerWorkflow.ps1 | 10 +++- examples/Maestro/eg004CancelWorkflow.ps1 | 56 +++++++++++++++++++++++ launcher.ps1 | 6 ++- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 examples/Maestro/eg004CancelWorkflow.ps1 diff --git a/examples/Maestro/eg001TriggerWorkflow.ps1 b/examples/Maestro/eg001TriggerWorkflow.ps1 index 6bb081d..bb479ad 100644 --- a/examples/Maestro/eg001TriggerWorkflow.ps1 +++ b/examples/Maestro/eg001TriggerWorkflow.ps1 @@ -37,7 +37,7 @@ $headers.add("Content-Type", "application/json") $headers.add("Accept", "application/json") #ds-snippet-end:Maestro1Step2 -Write-Output "Attempting to retrieve Workflow definition..." +Write-Output "Attempting to retrieve the workflow definition..." #ds-snippet-start:Maestro1Step3 Invoke-RestMethod ` @@ -75,6 +75,13 @@ if (-not ([string]::IsNullOrEmpty($triggerUrl))) { #ds-snippet-start:Maestro1Step5 $triggerResult = Invoke-WebRequest -uri $triggerUrl -headers $headers -body $body -method POST -UseBasicParsing #ds-snippet-end:Maestro1Step5 + Write-Host $triggerResult + Write-Host "" + + $workflowInstanceId = $($triggerResult | ConvertFrom-Json).instance_id + $workflowInstanceId | Out-File -FilePath "config/INSTANCE_ID" -Encoding utf8 -Force + Write-Host "Successfully created and published workflow $workflowInstanceId, ID saved to config/INSTANCE_ID" + $instanceUrl = $($triggerResult | ConvertFrom-Json).instance_url # Decode escaped characters @@ -82,6 +89,7 @@ if (-not ([string]::IsNullOrEmpty($triggerUrl))) { Write-Host "Use this URL to complete the workflow steps:" Write-Host $instanceUrl + Write-Host "" Write-Host "Opening a browser with the embedded workflow..." diff --git a/examples/Maestro/eg004CancelWorkflow.ps1 b/examples/Maestro/eg004CancelWorkflow.ps1 new file mode 100644 index 0000000..b8a40c3 --- /dev/null +++ b/examples/Maestro/eg004CancelWorkflow.ps1 @@ -0,0 +1,56 @@ +# Cancel a workflow instance + +# Check that there is a workflow +if (Test-Path .\config\WORKFLOW_ID) { + $workflowId = Get-Content .\config\WORKFLOW_ID +} else { + Write-Output "Please run example 1 to create and trigger a workflow before running this example," + exit 0 +} + +# Check that there is a running workflow instance to cancel +if (Test-Path .\config\INSTANCE_ID) { + $workflowInstanceId = Get-Content .\config\INSTANCE_ID +} else { + Write-Output "Please run example 1 to trigger a workflow before running this example." + exit 0 +} + +$base_path = "https://api-d.docusign.com/v1" + +# Step 1: Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$apiAccountId = Get-Content .\config\API_ACCOUNT_ID + +# temp file: +$response = New-TemporaryFile + +# Construct your API headers +#ds-snippet-start:Maestro4Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:Maestro4Step2 + +Write-Output "Attempting to cancel the Workflow instance..." + +#ds-snippet-start:Maestro4Step3 +Invoke-RestMethod ` + -Uri "${base_path}/accounts/${apiAccountId}/workflows/${workflowId}/instances/${workflowInstanceId}/actions/cancel" ` + -Method 'POST' ` + -Headers $headers ` + -OutFile $response + +#Write-Output "Workflow instance $workflowInstanceId has been canceled." +Write-Output "Response: $(Get-Content -Raw $response)" +#ds-snippet-end:Maestro4Step3 + +# cleanup +Remove-Item $response + +Write-Output "Done." \ No newline at end of file diff --git a/launcher.ps1 b/launcher.ps1 index afbd91d..98cd1f7 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1014,13 +1014,15 @@ function startMaestro { do { Enum listMaestroExamples { triggerWorkflow = 1; - Pick_An_API = 2; + cancelWorkflow = 4; + Pick_An_API = 5; } $listMaestroExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listMaestroExamples]::triggerWorkflow)) How to trigger a Maestro workflow" + Write-Output "$([int][listMaestroExamples]::cancelWorkflow)) How to cancel a Maestro workflow" Write-Output "$([int][listMaestroExamples]::Pick_An_API)) Pick_An_API" [int]$listMaestroExamplesView = Read-Host "Select the action" } while (-not [listMaestroExamples]::IsDefined([listMaestroExamples], $listMaestroExamplesView)); @@ -1028,6 +1030,8 @@ function startMaestro { if ($listMaestroExamplesView -eq [listMaestroExamples]::triggerWorkflow) { Invoke-Script -Command "`".\examples\Maestro\eg001TriggerWorkflow.ps1`"" + } elseif ($listMaestroExamplesView -eq [listMaestroExamples]::cancelWorkflow) { + Invoke-Script -Command "`".\examples\Maestro\eg004CancelWorkflow.ps1`"" } } until ($listMaestroExamplesView -eq [listMaestroExamples]::Pick_An_API) From 46c75d32a5fb5974201882d733d086e5a5a8b413 Mon Sep 17 00:00:00 2001 From: RomanBachaloSigmaSoftware <77355790+RomanBachaloSigmaSoftware@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:46:41 +0300 Subject: [PATCH 457/462] Add Workspaces API code examples (#122) * add examples * update example 2 * update ex 2 and name of ex 3 --------- Co-authored-by: Karissa Jacobsen --- OAuth/code_grant.ps1 | 3 + OAuth/jwt.ps1 | 3 + examples/Workspaces/eg001CreateWorkspace.ps1 | 51 ++++++++ .../eg002AddDocumentToWorkspace.ps1 | 73 ++++++++++++ .../eg003SendEnvelopeWithRecipientInfo.ps1 | 112 ++++++++++++++++++ launcher.ps1 | 42 ++++++- 6 files changed, 282 insertions(+), 2 deletions(-) create mode 100644 examples/Workspaces/eg001CreateWorkspace.ps1 create mode 100644 examples/Workspaces/eg002AddDocumentToWorkspace.ps1 create mode 100644 examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 diff --git a/OAuth/code_grant.ps1 b/OAuth/code_grant.ps1 index 4507cb1..70ed118 100644 --- a/OAuth/code_grant.ps1 +++ b/OAuth/code_grant.ps1 @@ -47,6 +47,9 @@ elseif ($apiVersion -eq "navigator") { elseif ($apiVersion -eq "connectedFields") { $scopes = "signature adm_store_unified_repo_read" } +elseif ($apiVersion -eq "workspaces") { + $scopes = "signature%20impersonation%20dtr.company.read%20dtr.rooms.read%20dtr.rooms.write%20dtr.documents.write" +} function GenerateCodeVerifier { return -join ((65..90) + (97..122) + (48..57) | Get-Random -Count 43 | ForEach-Object {[char]$_}) diff --git a/OAuth/jwt.ps1 b/OAuth/jwt.ps1 index ea55f17..7f6f885 100644 --- a/OAuth/jwt.ps1 +++ b/OAuth/jwt.ps1 @@ -60,6 +60,9 @@ elseif ($apiVersion -eq "navigator") { elseif ($apiVersion -eq "connectedFields") { $scopes = "signature%20adm_store_unified_repo_read%20impersonation" } +elseif ($apiVersion -eq "workspaces") { + $scopes = "signature%20impersonation%20dtr.company.read%20dtr.rooms.read%20dtr.rooms.write%20dtr.documents.write" +} # Request application consent $PORT = '8080' diff --git a/examples/Workspaces/eg001CreateWorkspace.ps1 b/examples/Workspaces/eg001CreateWorkspace.ps1 new file mode 100644 index 0000000..c5ebf70 --- /dev/null +++ b/examples/Workspaces/eg001CreateWorkspace.ps1 @@ -0,0 +1,51 @@ +$apiUri = "https://api-d.docusign.com/v1" + +# Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +#ds-snippet-start:Workflows1Step2 +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Accept' = 'application/json'; + 'Content-Type' = 'application/json'; +} +#ds-snippet-end:Workflows1Step2 + +try { + # Create the workspace definition + #apx-snippet-start:createWorkspace + #ds-snippet-start:Workflows1Step3 + $body = @{ + name = "Example workspace"; + } | ConvertTo-Json + #ds-snippet-end:Workflows1Step3 + + #ds-snippet-start:Workflows1Step4 + $response = $(Invoke-WebRequest ` + -Uri "${apiUri}/accounts/${accountId}/workspaces" ` + -Method 'POST' ` + -headers $headers ` + -body $body) + #ds-snippet-end:Workflows1Step4 + #apx-snippet-end:createWorkspace +} catch { + Write-Output "Failed to create Workspace." + Write-Output $_ + exit 0 +} + +Write-Output "Response: $response" + +# pull out the workspaceId +$workspaceId = $($response.Content | ConvertFrom-Json).workspace_id + +# Save the envelope id for use by other scripts +Write-Output "Workspace created! ID: $workspaceId" +Write-Output $workspaceId > .\config\WORKSPACE_ID + +Write-Output "Done." diff --git a/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 b/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 new file mode 100644 index 0000000..934353a --- /dev/null +++ b/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 @@ -0,0 +1,73 @@ +$apiUri = "https://api-d.docusign.com/v1" + +# check that a workspace exists +$workspaceId = Get-Content .\config\WORKSPACE_ID +if ([string]::IsNullOrWhiteSpace($workspaceId)) { + Write-Host "Please create a workspace before running this example" + exit 0 +} + +# Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# temp files: +$requestData = New-TemporaryFile + +#ds-snippet-start:Workflows2Step2 +$boundary = [System.Guid]::NewGuid().ToString() +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Content-Type' = "multipart/form-data; boundary=${boundary}"; +} +#ds-snippet-end:Workflows2Step2 + +try { + #apx-snippet-start:addWorkspaceDocument + + $filePath = Read-Host "Enter the path to the document you want to add to the workspace" + if (-Not (Test-Path -Path $filePath -PathType Leaf)) { + Write-Host "File does not exist: $filePath" + exit 1 + } + + $docName = Read-Host "Enter the name for the document in the workspace" + + #ds-snippet-start:Workflows2Step3 + $form = @{ + file = Get-Item $filePath # The file to upload + name = $docName # The document name + } + #ds-snippet-end:Workflows2Step3 + + #ds-snippet-start:Workflows2Step4 + $response = $(Invoke-WebRequest ` + -Uri "${apiUri}/accounts/${accountId}/workspaces/${workspaceId}/documents" ` + -Method 'POST' ` + -headers $headers ` + -Form $form) + #ds-snippet-end:Workflows2Step4 + #apx-snippet-end:addWorkspaceDocument +} catch { + Write-Output "Failed to add document to workspace." + Write-Output $_ + exit 0 +} + +Write-Output "Response: $response" + +# pull out the documentId +$documentId = $($response.Content | ConvertFrom-Json).document_id + +# Save the document id for use by other scripts +Write-Output "Document added! ID: $documentId" +Write-Output $documentId > .\config\DOCUMENT_ID + +# cleanup +Remove-Item $requestData + +Write-Output "Done." diff --git a/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 b/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 new file mode 100644 index 0000000..da0a0fd --- /dev/null +++ b/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 @@ -0,0 +1,112 @@ +$apiUri = "https://api-d.docusign.com/v1" + +# check that a workspace exists +$workspaceId = Get-Content .\config\WORKSPACE_ID +if ([string]::IsNullOrWhiteSpace($workspaceId)) { + Write-Host "Please create a workspace before running this example" + exit 0 +} + +# check that a document exists in the workspace +$documentId = Get-Content .\config\DOCUMENT_ID +if ([string]::IsNullOrWhiteSpace($documentId)) { + Write-Host "Please create a document in the workspace before running this example" + exit 0 +} + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + +# Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +#ds-snippet-start:Workflows3Step2 +$headers = @{ + 'Authorization' = "Bearer $accessToken"; + 'Accept' = 'application/json'; + 'Content-Type' = "application/json"; +} +#ds-snippet-end:Workflows3Step2 + +try { + # Create the workspace envelope definition + #apx-snippet-start:createWorkspaceEnvelope + #ds-snippet-start:Workflows3Step3 + $body = @{ + "envelope_name" = "Example Workspace Envelope"; + "document_ids" = @("${documentId}") + } | ConvertTo-Json + #ds-snippet-end:Workflows3Step3 + + #ds-snippet-start:Workflows3Step4 + $response = $(Invoke-WebRequest ` + -Uri "${apiUri}/accounts/${accountId}/workspaces/${workspaceId}/envelopes" ` + -Method 'POST' ` + -headers $headers ` + -body $body) + #ds-snippet-end:Workflows3Step4 + #apx-snippet-end:createWorkspaceEnvelope +} catch { + Write-Output "Failed to send envelope." + Write-Output $_ + exit 0 +} + +Write-Output "Response: $response" + +# pull out the envelopeId +$envelopeId = $($response.Content | ConvertFrom-Json).envelope_id +Write-Output "Envelope created! ID: $envelopeId" + +# Set the eSignature REST API base path +$apiUri = "https://demo.docusign.net/restapi" + +#ds-snippet-start:Workflows3Step5 +$body = @{ + emailSubject = "Please sign this document"; + recipients = @{ + signers = @( + @{ + email = $variables.SIGNER_EMAIL; + name = $variables.SIGNER_NAME; + recipientId = "1"; + routingOrder = "1"; + tabs = @{ + signHereTabs = @( + @{ + anchorString = "/sn1/"; + anchorUnits = "pixels"; + anchorXOffset = "20"; + anchorYOffset = "10"; + }; + ); + }; + }; + ); + }; + status = "sent"; +} | ConvertTo-Json -Depth 32 +#ds-snippet-end:Workflows3Step5 + +try { + #ds-snippet-start:Workflows3Step6 + $response = $(Invoke-WebRequest ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}" ` + -Method 'PUT' ` + -headers $headers ` + -body $body) + #ds-snippet-end:Workflows3Step6 +} catch { + Write-Output "Failed to send envelope." + Write-Output $_ + exit 0 +} + +Write-Output "Response: $response" +Write-Output "Envelope Sent!" +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index afbd91d..1b474c3 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -107,7 +107,8 @@ function startLauncher { Maestro = 9; Navigator = 10; ConnectedFields = 11; - Exit = 12; + Workspaces = 12; + Exit = 13; } $listApiView = $null; @@ -149,6 +150,7 @@ function startLauncher { Write-Output "$([int][listApi]::Maestro)) Maestro (beta)" Write-Output "$([int][listApi]::Navigator)) Navigator (beta)" Write-Output "$([int][listApi]::ConnectedFields)) Connected Fields" + Write-Output "$([int][listApi]::Workspaces)) Workspaces" Write-Output "$([int][listApi]::Exit)) Exit" [int]$listApiView = Read-Host "Please make a selection" } while (-not [listApi]::IsDefined([listApi], $listApiView)); @@ -186,6 +188,9 @@ function startLauncher { elseif ($listApiView -eq [listApi]::ConnectedFields) { startAuth "connectedFields" } + elseif ($listApiView -eq [listApi]::Workspaces) { + startAuth "workspaces" + } elseif ($listApiView -eq [listApi]::Exit) { exit 1 } @@ -267,6 +272,9 @@ function startAuth ($apiVersion) { elseif ($listApiView -eq [listApi]::ConnectedFields) { startConnectedFields } + elseif ($listApiView -eq [listApi]::Workspaces) { + startWorkspaces + } } function startCFRSignature { @@ -978,7 +986,7 @@ function startNotary { if ($listNotaryExamplesView -eq [listNotaryExamples]::signatureRequestToNotaryGroup) { Invoke-Script -Command "`".\examples\Notary\signatureRequestToNotaryGroup.ps1`"" } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::inviteNotaryToPool) { - Invoke-Script -Command "`".\examples\Notary\inviteNotaryToPool.ps1" + Invoke-Script -Command "`".\examples\Notary\inviteNotaryToPool.ps1`"" } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::jurisdictions) { Invoke-Script -Command "`".\examples\Notary\Jurisdictions.ps1`"" } elseif ($listNotaryExamplesView -eq [listNotaryExamples]::sendWithThirdPartyNotary) { @@ -1083,5 +1091,35 @@ function startConnectedFields { startLauncher } +function startWorkspaces { + do { + Enum listWorkspacesExamples { + createWorkspace = 1; + addDocumentToWorkspace = 2; + sendEnvelopeWithRecipientInfo = 3; + Pick_An_API = 4; + } + $listWorkspacesExamplesView = $null; + do { + Write-Output "" + Write-Output 'Select the action: ' + Write-Output "$([int][listWorkspacesExamples]::createWorkspace)) Create_Workspace" + Write-Output "$([int][listWorkspacesExamples]::addDocumentToWorkspace)) Add_Document_To_Workspace" + Write-Output "$([int][listWorkspacesExamples]::sendEnvelopeWithRecipientInfo)) Send_Envelope_With_Recipient_Info" + Write-Output "$([int][listWorkspacesExamples]::Pick_An_API)) Pick_An_API" + [int]$listWorkspacesExamplesView = Read-Host "Select the action" + } while (-not [listWorkspacesExamples]::IsDefined([listWorkspacesExamples], $listWorkspacesExamplesView)); + + if ($listWorkspacesExamplesView -eq [listWorkspacesExamples]::createWorkspace) { + Invoke-Script -Command "`".\examples\Workspaces\eg001CreateWorkspace.ps1`"" + } elseif ($listWorkspacesExamplesView -eq [listWorkspacesExamples]::addDocumentToWorkspace) { + Invoke-Script -Command "`".\examples\Workspaces\eg002AddDocumentToWorkspace.ps1`"" + } elseif ($listWorkspacesExamplesView -eq [listWorkspacesExamples]::sendEnvelopeWithRecipientInfo) { + Invoke-Script -Command "`".\examples\Workspaces\eg003SendEnvelopeWithRecipientInfo.ps1`"" + } + } until ($listWorkspacesExamplesView -eq [listWorkspacesExamples]::Pick_An_API) + startLauncher +} + Write-Output "Welcome to the Docusign PowerShell Launcher" startLauncher From 5625868436e724c2c97bbed56e6a8af817827c00 Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Tue, 17 Jun 2025 13:58:45 -0700 Subject: [PATCH 458/462] codeDepot updates --- examples/Workspaces/eg001CreateWorkspace.ps1 | 12 +++++------ .../eg002AddDocumentToWorkspace.ps1 | 12 +++++------ .../eg003SendEnvelopeWithRecipientInfo.ps1 | 20 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/examples/Workspaces/eg001CreateWorkspace.ps1 b/examples/Workspaces/eg001CreateWorkspace.ps1 index c5ebf70..3644584 100644 --- a/examples/Workspaces/eg001CreateWorkspace.ps1 +++ b/examples/Workspaces/eg001CreateWorkspace.ps1 @@ -8,30 +8,30 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountId = Get-Content .\config\API_ACCOUNT_ID -#ds-snippet-start:Workflows1Step2 +#ds-snippet-start:Workspaces1Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Accept' = 'application/json'; 'Content-Type' = 'application/json'; } -#ds-snippet-end:Workflows1Step2 +#ds-snippet-end:Workspaces1Step2 try { # Create the workspace definition #apx-snippet-start:createWorkspace - #ds-snippet-start:Workflows1Step3 + #ds-snippet-start:Workspaces1Step3 $body = @{ name = "Example workspace"; } | ConvertTo-Json - #ds-snippet-end:Workflows1Step3 + #ds-snippet-end:Workspaces1Step3 - #ds-snippet-start:Workflows1Step4 + #ds-snippet-start:Workspaces1Step4 $response = $(Invoke-WebRequest ` -Uri "${apiUri}/accounts/${accountId}/workspaces" ` -Method 'POST' ` -headers $headers ` -body $body) - #ds-snippet-end:Workflows1Step4 + #ds-snippet-end:Workspaces1Step4 #apx-snippet-end:createWorkspace } catch { Write-Output "Failed to create Workspace." diff --git a/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 b/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 index 934353a..a55b55c 100644 --- a/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 +++ b/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 @@ -18,13 +18,13 @@ $accountId = Get-Content .\config\API_ACCOUNT_ID # temp files: $requestData = New-TemporaryFile -#ds-snippet-start:Workflows2Step2 +#ds-snippet-start:Workspaces2Step2 $boundary = [System.Guid]::NewGuid().ToString() $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Content-Type' = "multipart/form-data; boundary=${boundary}"; } -#ds-snippet-end:Workflows2Step2 +#ds-snippet-end:Workspaces2Step2 try { #apx-snippet-start:addWorkspaceDocument @@ -37,20 +37,20 @@ try { $docName = Read-Host "Enter the name for the document in the workspace" - #ds-snippet-start:Workflows2Step3 + #ds-snippet-start:Workspaces2Step3 $form = @{ file = Get-Item $filePath # The file to upload name = $docName # The document name } - #ds-snippet-end:Workflows2Step3 + #ds-snippet-end:Workspaces2Step3 - #ds-snippet-start:Workflows2Step4 + #ds-snippet-start:Workspaces2Step4 $response = $(Invoke-WebRequest ` -Uri "${apiUri}/accounts/${accountId}/workspaces/${workspaceId}/documents" ` -Method 'POST' ` -headers $headers ` -Form $form) - #ds-snippet-end:Workflows2Step4 + #ds-snippet-end:Workspaces2Step4 #apx-snippet-end:addWorkspaceDocument } catch { Write-Output "Failed to add document to workspace." diff --git a/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 b/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 index da0a0fd..430e3bd 100644 --- a/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 +++ b/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 @@ -25,31 +25,31 @@ $accessToken = Get-Content .\config\ds_access_token.txt # Note: Substitute these values with your own $accountId = Get-Content .\config\API_ACCOUNT_ID -#ds-snippet-start:Workflows3Step2 +#ds-snippet-start:Workspaces3Step2 $headers = @{ 'Authorization' = "Bearer $accessToken"; 'Accept' = 'application/json'; 'Content-Type' = "application/json"; } -#ds-snippet-end:Workflows3Step2 +#ds-snippet-end:Workspaces3Step2 try { # Create the workspace envelope definition #apx-snippet-start:createWorkspaceEnvelope - #ds-snippet-start:Workflows3Step3 + #ds-snippet-start:Workspaces3Step3 $body = @{ "envelope_name" = "Example Workspace Envelope"; "document_ids" = @("${documentId}") } | ConvertTo-Json - #ds-snippet-end:Workflows3Step3 + #ds-snippet-end:Workspaces3Step3 - #ds-snippet-start:Workflows3Step4 + #ds-snippet-start:Workspaces3Step4 $response = $(Invoke-WebRequest ` -Uri "${apiUri}/accounts/${accountId}/workspaces/${workspaceId}/envelopes" ` -Method 'POST' ` -headers $headers ` -body $body) - #ds-snippet-end:Workflows3Step4 + #ds-snippet-end:Workspaces3Step4 #apx-snippet-end:createWorkspaceEnvelope } catch { Write-Output "Failed to send envelope." @@ -66,7 +66,7 @@ Write-Output "Envelope created! ID: $envelopeId" # Set the eSignature REST API base path $apiUri = "https://demo.docusign.net/restapi" -#ds-snippet-start:Workflows3Step5 +#ds-snippet-start:Workspaces3Step5 $body = @{ emailSubject = "Please sign this document"; recipients = @{ @@ -91,16 +91,16 @@ $body = @{ }; status = "sent"; } | ConvertTo-Json -Depth 32 -#ds-snippet-end:Workflows3Step5 +#ds-snippet-end:Workspaces3Step5 try { - #ds-snippet-start:Workflows3Step6 + #ds-snippet-start:Workspaces3Step6 $response = $(Invoke-WebRequest ` -Uri "${apiUri}/v2.1/accounts/${accountId}/envelopes/${envelopeId}" ` -Method 'PUT' ` -headers $headers ` -body $body) - #ds-snippet-end:Workflows3Step6 + #ds-snippet-end:Workspaces3Step6 } catch { Write-Output "Failed to send envelope." Write-Output $_ From d1df1c99fd6756e676a83b25986aca5e2969e341 Mon Sep 17 00:00:00 2001 From: Karissa Jacobsen Date: Tue, 17 Jun 2025 14:48:09 -0700 Subject: [PATCH 459/462] remove api ref markers --- examples/Workspaces/eg001CreateWorkspace.ps1 | 2 -- examples/Workspaces/eg002AddDocumentToWorkspace.ps1 | 3 --- examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 | 2 -- 3 files changed, 7 deletions(-) diff --git a/examples/Workspaces/eg001CreateWorkspace.ps1 b/examples/Workspaces/eg001CreateWorkspace.ps1 index 3644584..061bb88 100644 --- a/examples/Workspaces/eg001CreateWorkspace.ps1 +++ b/examples/Workspaces/eg001CreateWorkspace.ps1 @@ -18,7 +18,6 @@ $headers = @{ try { # Create the workspace definition - #apx-snippet-start:createWorkspace #ds-snippet-start:Workspaces1Step3 $body = @{ name = "Example workspace"; @@ -32,7 +31,6 @@ try { -headers $headers ` -body $body) #ds-snippet-end:Workspaces1Step4 - #apx-snippet-end:createWorkspace } catch { Write-Output "Failed to create Workspace." Write-Output $_ diff --git a/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 b/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 index a55b55c..fb1940f 100644 --- a/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 +++ b/examples/Workspaces/eg002AddDocumentToWorkspace.ps1 @@ -27,8 +27,6 @@ $headers = @{ #ds-snippet-end:Workspaces2Step2 try { - #apx-snippet-start:addWorkspaceDocument - $filePath = Read-Host "Enter the path to the document you want to add to the workspace" if (-Not (Test-Path -Path $filePath -PathType Leaf)) { Write-Host "File does not exist: $filePath" @@ -51,7 +49,6 @@ try { -headers $headers ` -Form $form) #ds-snippet-end:Workspaces2Step4 - #apx-snippet-end:addWorkspaceDocument } catch { Write-Output "Failed to add document to workspace." Write-Output $_ diff --git a/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 b/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 index 430e3bd..011037d 100644 --- a/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 +++ b/examples/Workspaces/eg003SendEnvelopeWithRecipientInfo.ps1 @@ -35,7 +35,6 @@ $headers = @{ try { # Create the workspace envelope definition - #apx-snippet-start:createWorkspaceEnvelope #ds-snippet-start:Workspaces3Step3 $body = @{ "envelope_name" = "Example Workspace Envelope"; @@ -50,7 +49,6 @@ try { -headers $headers ` -body $body) #ds-snippet-end:Workspaces3Step4 - #apx-snippet-end:createWorkspaceEnvelope } catch { Write-Output "Failed to send envelope." Write-Output $_ From 085b87caacd941b622f765b4632d0e821481a89a Mon Sep 17 00:00:00 2001 From: Raileen Del Rosario Date: Thu, 21 Aug 2025 12:17:59 -0700 Subject: [PATCH 460/462] remote web forms code example --- demo_documents/web-form-config.json | 3 +- .../WebForms/eg002CreateRemoteInstance.ps1 | 87 +++++++++++++++++++ launcher.ps1 | 6 +- 3 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 examples/WebForms/eg002CreateRemoteInstance.ps1 diff --git a/demo_documents/web-form-config.json b/demo_documents/web-form-config.json index 46145e2..047e90e 100644 --- a/demo_documents/web-form-config.json +++ b/demo_documents/web-form-config.json @@ -1,3 +1,2 @@ -{"id":"3d761225-xxxx-xxxx-xxxx-683bb52fff21","accountId":"0820f9c5-xxxx-xxxx-xxxx-8a0df87f44aa","isPublished":true,"isEnabled":true,"hasDraftChanges":false,"formState":"active","formProperties":{"name":"Web Form Example Template","isPrivateAccess":false},"formMetadata":{"source":"templates","createdDateTime":"2023-12-07T21:35:55.245Z","publishedSlug":"3f766ec2815665dbc257f97a9b7f97df","owner":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastModifiedDateTime":"2023-12-07T21:38:04.910Z","lastModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"publishedComponentNames":{"SignerName":"TextBox","SignerEmail":"Email","PhoneNumber":"TextBox","Yes":"CheckboxGroup","Company":"TextBox","JobTitle":"TextBox"},"admModelNamespace":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21","formContentModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formContentModifiedDateTime":"2023-12-07T21:37:54.094Z","admModelVersion":"1.0.0","formPropertiesModifiedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"formPropertiesModifiedDateTime":"2023-12-07T21:35:55.245Z","sender":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastSenderConsentDateTime":"2023-12-07T21:37:57.247Z","lastPublishedBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastPublishedDateTime":"2023-12-07T21:38:04.910Z","lastEnabledBy":{"userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","userName":"Test"},"lastEnabledDateTime":"2023-12-07T21:38:04.910Z"},"formContent":{"components":{"Root_Of_Journey":{"componentKey":"Root_Of_Journey","componentType":"Root","componentName":"Root_Of_Journey","componentRules":{},"text":"","children":["Welcome_kyK6x_Uj","Step_vGLuKyzy","Summary_j0FzHU8Q","ESignAction_qqwx19h7","Thankyou_RmjV_bGg"]},"Welcome_kyK6x_Uj":{"text":"Part time work application","subText":"","startButtonText":"Start","componentKey":"Welcome_kyK6x_Uj","componentType":"Welcome"},"Step_vGLuKyzy":{"componentKey":"Step_vGLuKyzy","componentType":"Step","componentName":"Step_vGLuKyzy","text":"Applicant information","children":["TextBox_lTHn2kiH","Email_wRqtKmus","TextBox_kLQ5AMLA","CheckboxGroup_cAHNBDer","TextBox_SiYcnTUz","TextBox_LsASX8b1"]},"Summary_j0FzHU8Q":{"text":"Summary","subText":"Please review the information you have entered:","componentKey":"Summary_j0FzHU8Q","componentType":"Summary"},"ESignAction_qqwx19h7":{"componentKey":"ESignAction_qqwx19h7","componentType":"ESignAction","primaryRecipientId":"1","templateInfoMap":{"eb388ad9-29de-40c9-90f3-211cf7dcefdd":{"templateId":"template-id","lastModified":"2023-12-07T21:35:55.9300000Z","name":"Web Form Copy - Web Form Example Template","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"}}},"recipientInfoMap":{"1":{"nameComponentKey":"TextBox_lTHn2kiH","emailComponentKey":"Email_wRqtKmus","recipientId":"1","recipientType":"signer","roleName":"signer","routingOrder":"1","nameFromTemplate":"","emailFromTemplate":""}},"tabInfoMap":{"a4f174b8-647d-4c96-9b91-ff548a0c0930":{"componentKey":"TextBox_lTHn2kiH","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","recipientId":"1","tabLabel":"FullName","tabType":"text"},"9bcf6cba-05cf-4088-8c85-e5a905ca1efb":{"componentKey":"TextBox_kLQ5AMLA","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","recipientId":"1","tabLabel":"PhoneNumber","tabType":"text"},"d2d23949-ce13-48de-9043-ce1b4d7d594a":{"componentKey":"TextBox_SiYcnTUz","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","recipientId":"1","tabLabel":"Company","tabType":"text"},"6308de2e-cea9-48aa-ab03-25d53a54cc5a":{"componentKey":"TextBox_LsASX8b1","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","recipientId":"1","tabLabel":"JobTitle","tabType":"text"},"d1d70d31-d7d4-462b-b41a-cc1f55698ae2":{"componentKey":"CheckboxGroup_cAHNBDer","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","recipientId":"1","tabLabel":"Yes","tabType":"checkbox","name":"Yes","selected":"false"}},"requireRemoteSigning":false,"enableDocumentFieldEditing":true},"Thankyou_RmjV_bGg":{"text":"Thank you","subText":"We've received your form.","showConfirmationButton":false,"confirmationButtonText":"Done","confirmationButtonUrl":"","componentKey":"Thankyou_RmjV_bGg","componentType":"Thankyou"},"TextBox_lTHn2kiH":{"componentKey":"TextBox_lTHn2kiH","componentType":"TextBox","componentName":"SignerName","label":"Signer name","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"Email_wRqtKmus":{"componentKey":"Email_wRqtKmus","componentType":"Email","componentName":"SignerEmail","label":"Signer email","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_kLQ5AMLA":{"componentKey":"TextBox_kLQ5AMLA","componentType":"TextBox","componentName":"PhoneNumber","label":"Phone Number","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"CheckboxGroup_cAHNBDer":{"componentKey":"CheckboxGroup_cAHNBDer","componentType":"CheckboxGroup","componentName":"Yes","label":"I prefer to be contacted by text","description":"","options":[{"optionKey":"fk4RHsoj","value":"Yes","label":"Yes","selected":false}]},"TextBox_SiYcnTUz":{"componentKey":"TextBox_SiYcnTUz","componentType":"TextBox","componentName":"Company","label":"Current company","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000},"TextBox_LsASX8b1":{"componentKey":"TextBox_LsASX8b1","componentType":"TextBox","componentName":"JobTitle","label":"Current job title","description":"","multiLine":false,"placeholder":"","required":true,"maxLength":4000}},"isStandalone":false,"templates":[{"originalTemplateId":"template-id","clonedTemplateId":"template-id","importedDateTime":"2023-12-07T21:35:56.511Z","recipientIds":["1"]}]},"versionId":1,"eSignTemplates":[{"templateId":"template-id","uri":"/templates/template-id","name":"Web Form Copy - Web Form Example Template","shared":"false","passwordProtected":"false","description":"Example template created via the API","created":"2023-12-07T21:35:55.6300000Z","lastModified":"2023-12-07T21:38:04.3800000Z","lastModifiedBy":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com","uri":"/users/8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1"},"lastUsed":"2023-12-07T21:35:55.9430000Z","owner":{"userName":"Test","userId":"8cb9aa3f-xxxx-xxxx-xxxx-f6ce2e16dad1","email":"example@example.com"},"pageCount":"1","folderId":"1e649420-aee9-4f2e-8265-0082f733e8f6","folderName":"Deleted Items","folderIds":["1e649420-aee9-4f2e-8265-0082f733e8f6"],"autoMatch":"true","autoMatchSpecifiedByUser":"false","documents":[{"documentId":"1","uri":"/envelopes/eb388ad9-29de-40c9-90f3-211cf7dcefdd/documents/1","name":"World_Wide_Web_Form","order":"1","pages":"1","documentBase64":"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","display":"inline","includeInDownload":"true","signerMustAcknowledge":"no_interaction","templateLocked":"false","templateRequired":"false"}],"emailSubject":"Please sign this document","emailBlurb":"","signingLocation":"Online","authoritativeCopy":"false","enforceSignerVisibility":"false","enableWetSign":"true","allowMarkup":"false","allowReassign":"true","messageLock":"false","recipientsLock":"false","brandLock":"false","customFields":{"textCustomFields":[{"fieldId":"11003755255","name":"##SFSource","show":"true","required":"false","value":""},{"fieldId":"11003755256","name":"##SFDocumentWriteBack","show":"true","required":"false","value":""},{"fieldId":"11003756051","name":"ModelNamespace","show":"false","required":"false","value":"docusign.forms._0820f9c5_0d81_489a_bcc9_8a0df87f44aa._3d761225_6960_4bd0_a657_683bb52fff21"},{"fieldId":"11003756052","name":"ModelVersion","show":"false","required":"false","value":"1"},{"fieldId":"11003756053","name":"ModelAccount","show":"false","required":"false","value":"0820f9c5-0d81-489a-bcc9-8a0df87f44aa"}],"listCustomFields":[]},"recipients":{"signers":[{"defaultRecipient":"false","tabs":{"signHereTabs":[{"stampType":"signature","name":"SignHere","tabLabel":"Signature","scaleValue":"1","optional":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"126","yPosition":"374","anchorString":"/SignHere/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"779409ee-df52-4560-82f5-d036273703ae","tabType":"signhere"}],"dateSignedTabs":[{"name":"DateSigned","value":"","tabLabel":"DateSigned","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"409","yPosition":"396","anchorString":"/Date/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"4f92b805-4bd3-41e3-94cb-343cea58c9b8","tabType":"datesigned"}],"textTabs":[{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"FullName","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"145","yPosition":"234","width":"0","height":"0","anchorString":"/FullName/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"a4f174b8-647d-4c96-9b91-ff548a0c0930","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.SignerName\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"PhoneNumber","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"167","yPosition":"261","width":"0","height":"0","anchorString":"/PhoneNumber/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"9bcf6cba-05cf-4088-8c85-e5a905ca1efb","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"Company","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"182","yPosition":"315","width":"0","height":"0","anchorString":"/Company/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d2d23949-ce13-48de-9043-ce1b4d7d594a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Company\"}}","tabType":"text"},{"requireAll":"false","value":"","originalValue":"","required":"true","locked":"false","concealValueOnDocument":"false","disableAutoSize":"false","maxLength":"4000","tabLabel":"JobTitle","bold":"false","italic":"false","underline":"false","localePolicy":{},"documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"137","yPosition":"342","width":"0","height":"0","anchorString":"/Title/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"6308de2e-cea9-48aa-ab03-25d53a54cc5a","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}","tabType":"text"}],"checkboxTabs":[{"name":"Yes","tabLabel":"Yes","selected":"false","selectedOriginal":"false","requireInitialOnSharedChange":"false","bold":"false","italic":"false","underline":"false","required":"true","locked":"false","documentId":"1","recipientId":"1","pageNumber":"1","xPosition":"237","yPosition":"288","width":"0","height":"0","anchorString":"/SMS/","anchorXOffset":"20","anchorYOffset":"10","anchorUnits":"pixels","anchorCaseSensitive":"false","anchorMatchWholeWord":"true","anchorHorizontalAlignment":"left","anchorTabProcessorVersion":"v1_3","tabId":"d1d70d31-d7d4-462b-b41a-cc1f55698ae2","mergeFieldXml":"{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}","tabType":"checkbox"}]},"signInEachLocation":"false","agentCanEditEmail":"false","agentCanEditName":"false","requireUploadSignature":"false","name":"","email":"","recipientId":"1","recipientIdGuid":"00000000-0000-0000-0000-000000000000","accessCode":"","requireIdLookup":"false","routingOrder":"1","note":"","roleName":"signer","completedCount":"0","deliveryMethod":"email","templateLocked":"false","templateRequired":"false","inheritEmailNotificationConfiguration":"false","recipientType":"signer"}],"agents":[],"editors":[],"intermediaries":[],"carbonCopies":[],"certifiedDeliveries":[],"inPersonSigners":[],"seals":[],"witnesses":[],"notaries":[],"recipientCount":"1"},"envelopeIdStamping":"true","autoNavigation":"true","allowComments":"true","disableResponsiveDocument":"true","anySigner":null,"envelopeLocation":"current_site"}]} - +{ "id": "608a6c8a-16b2-4419-92f4-d06bc3af6e53", "accountId": "85443307-xxxx-xxxx-xxxx-87671e153075", "isPublished": true, "isEnabled": true, "hasDraftChanges": false, "formState": "active", "formProperties": { "name": "Web Form Example Template", "isPrivateAccess": false, "allowSending": true }, "formMetadata": { "source": "templates", "createdDateTime": "2025-08-19T21:15:03.323Z", "publishedSlug": "d12c1e15b310d55b4e530edfd64c1b63", "owner": { "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "userName": "Raileen Del Rosario" }, "lastModifiedDateTime": "2025-08-19T21:18:40.409Z", "lastModifiedBy": { "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "userName": "Raileen Del Rosario" }, "publishedComponentNames": { "signer_name": "TextBox", "signer_email": "Email", "FullName": "TextBox", "PhoneNumber": "TextBox", "Yes": "CheckboxGroup", "Company": "TextBox", "JobTitle": "TextBox", "$recipients": { "41f3109b-ff3a-4c48-a40c-eac994ad0988": { "components": { "signer_name": { "type": "TextBox" }, "signer_email": { "type": "Email" }, "FullName": { "type": "TextBox" }, "PhoneNumber": { "type": "TextBox" }, "Yes": { "type": "CheckboxGroup" }, "Company": { "type": "TextBox" }, "JobTitle": { "type": "TextBox" } } } } }, "admModelNamespace": "docusign.forms._85443307_664c_4c85_882f_87671e153075._608a6c8a_16b2_4419_92f4_d06bc3af6e53", "formContentModifiedBy": { "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "userName": "Raileen Del Rosario" }, "formContentModifiedDateTime": "2025-08-19T21:18:09.337Z", "admModelVersion": "1.0.0", "type": "hasEsignTemplate", "formPropertiesModifiedBy": { "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "userName": "Raileen Del Rosario" }, "formPropertiesModifiedDateTime": "2025-08-19T21:15:39.578Z", "sender": { "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "userName": "Raileen Del Rosario" }, "lastSenderConsentDateTime": "2025-08-19T21:18:34.468Z", "lastPublishedBy": { "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "userName": "Raileen Del Rosario" }, "lastPublishedDateTime": "2025-08-19T21:18:40.409Z", "lastEnabledBy": { "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "userName": "Raileen Del Rosario" }, "lastEnabledDateTime": "2025-08-19T21:18:40.409Z" }, "formContent": { "components": { "Root_Of_Journey": { "children": [ "View_41f3109b-ff3a-4c48-a40c-eac994ad0988" ], "componentKey": "Root_Of_Journey", "componentName": "Root_Of_Journey", "componentRules": {}, "componentType": "Root", "schemaVersion": 2, "text": "" }, "View_41f3109b-ff3a-4c48-a40c-eac994ad0988": { "children": [ "Welcome_qXWJJEvM", "Step_69uweXrH", "Summary_2KLFQRxQ", "ESignAction_7XmnXEcI", "Thankyou_feHjbCWS" ], "componentKey": "View_41f3109b-ff3a-4c48-a40c-eac994ad0988", "componentType": "View", "isEnabled": true, "isSender": false, "roleName": "signer" }, "Welcome_qXWJJEvM": { "startButtonText": "Start", "subText": "Part-Time Work Application", "text": "Welcome", "componentKey": "Welcome_qXWJJEvM", "componentType": "Welcome" }, "Step_69uweXrH": { "children": [ "TextBox_OWBHFHgL", "Email_cJoe6lNy", "TextBox_FPT2Gs29", "TextBox_BOTyRGju", "CheckboxGroup_MyyHfWle", "TextBox_mwg3Cl1O", "TextBox_AHodbvx_" ], "componentKey": "Step_69uweXrH", "componentName": "Step_69uweXrH", "componentType": "Step", "text": "Part-Time Work Application" }, "Summary_2KLFQRxQ": { "subText": "Please review the information you have entered:", "text": "Summary", "componentKey": "Summary_2KLFQRxQ", "componentType": "Summary" }, "ESignAction_7XmnXEcI": { "componentKey": "ESignAction_7XmnXEcI", "componentType": "ESignAction", "documentInfoMap": { "Document_fRTvNpa8": { "documentId": "1", "name": "World_Wide_Web_Form", "order": "1" } }, "enableDocumentFieldEditing": true, "primaryRecipientId": "1", "recipientInfoMap": { "1": { "emailComponentKey": "Email_cJoe6lNy", "emailFromTemplate": "", "nameComponentKey": "TextBox_OWBHFHgL", "nameFromTemplate": "", "recipientId": "1", "recipientType": "signer", "roleName": "signer", "routingOrder": "1", "recipientViewId": "41f3109b-ff3a-4c48-a40c-eac994ad0988" } }, "requireRemoteSigning": false, "tabInfoMap": { "c995df10-9141-4686-b9bf-f1dfc4121d33": { "componentKey": "TextBox_FPT2Gs29", "locked": "false", "recipientId": "1", "tabId": "c995df10-9141-4686-b9bf-f1dfc4121d33", "tabLabel": "FullName", "tabType": "text" }, "71ccfefa-5469-493e-b0c7-886c65b84742": { "componentKey": "TextBox_BOTyRGju", "locked": "false", "recipientId": "1", "tabId": "71ccfefa-5469-493e-b0c7-886c65b84742", "tabLabel": "PhoneNumber", "tabType": "text" }, "184f8a65-f2be-48b9-a30e-15592c59b335": { "componentKey": "TextBox_mwg3Cl1O", "locked": "false", "recipientId": "1", "tabId": "184f8a65-f2be-48b9-a30e-15592c59b335", "tabLabel": "Company", "tabType": "text" }, "e7d30733-ce70-4fee-93a0-ea10ecc014b1": { "componentKey": "TextBox_AHodbvx_", "locked": "false", "recipientId": "1", "tabId": "e7d30733-ce70-4fee-93a0-ea10ecc014b1", "tabLabel": "JobTitle", "tabType": "text" }, "0f1e242d-550d-4729-a141-de0dce1d1b6c": { "componentKey": "CheckboxGroup_MyyHfWle", "locked": "false", "name": "Yes", "recipientId": "1", "selected": "false", "tabId": "0f1e242d-550d-4729-a141-de0dce1d1b6c", "tabLabel": "Yes", "tabType": "checkbox" } }, "templateInfoMap": { "2230c545-1680-47aa-8581-7d2284093f46": { "lastModified": "2025-08-19T21:15:03.9670000Z", "name": "Web Form Copy - Web Form Example Template", "owner": { "userName": "Raileen Del Rosario", "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "email": "example@email.com" }, "templateId": "e8af8a0d-f7ab-4cd2-b6f5-c84d5ecc1bf8" } } }, "Thankyou_feHjbCWS": { "confirmationButtonText": "Done", "confirmationButtonUrl": "", "showConfirmationButton": false, "subText": "We've received your form.", "text": "Thank you", "componentKey": "Thankyou_feHjbCWS", "componentType": "Thankyou" }, "TextBox_OWBHFHgL": { "componentKey": "TextBox_OWBHFHgL", "componentName": "signer_name", "componentType": "TextBox", "description": "", "label": "Signer Name", "maxLength": 4000, "multiLine": false, "placeholder": "", "required": true }, "Email_cJoe6lNy": { "componentKey": "Email_cJoe6lNy", "componentName": "signer_email", "componentType": "Email", "description": "", "label": "Signer Email", "maxLength": 4000, "multiLine": false, "placeholder": "", "required": true }, "TextBox_FPT2Gs29": { "componentKey": "TextBox_FPT2Gs29", "componentName": "FullName", "componentType": "TextBox", "description": "", "label": "Full Name", "maxLength": 4000, "multiLine": false, "placeholder": "", "required": true }, "TextBox_BOTyRGju": { "componentKey": "TextBox_BOTyRGju", "componentName": "PhoneNumber", "componentType": "TextBox", "description": "", "label": "Phone Number", "maxLength": 4000, "multiLine": false, "placeholder": "", "required": true }, "CheckboxGroup_MyyHfWle": { "componentKey": "CheckboxGroup_MyyHfWle", "componentName": "Yes", "componentType": "CheckboxGroup", "description": "", "label": "I prefer to be contacted by text.", "options": [ { "label": "Yes", "optionKey": "i_BVfm2G", "selected": false, "value": "Yes" } ] }, "TextBox_mwg3Cl1O": { "componentKey": "TextBox_mwg3Cl1O", "componentName": "Company", "componentType": "TextBox", "description": "", "label": "Company", "maxLength": 4000, "multiLine": false, "placeholder": "", "required": true }, "TextBox_AHodbvx_": { "componentKey": "TextBox_AHodbvx_", "componentName": "JobTitle", "componentType": "TextBox", "description": "", "label": "Job Title", "maxLength": 4000, "multiLine": false, "placeholder": "", "required": true } }, "isStandalone": false, "templates": [ { "originalTemplateId": "e8af8a0d-f7ab-4cd2-b6f5-c84d5ecc1bf8", "clonedTemplateId": "e8af8a0d-f7ab-4cd2-b6f5-c84d5ecc1bf8", "importedDateTime": "2025-08-19T21:15:05.277Z", "recipientIds": [ "1" ] } ] }, "formLocale": "en", "versionId": 1, "eSignTemplates": [ { "templateId": "e8af8a0d-f7ab-4cd2-b6f5-c84d5ecc1bf8", "uri": "/templates/e8af8a0d-f7ab-4cd2-b6f5-c84d5ecc1bf8", "name": "Web Form Copy - Web Form Example Template", "shared": "false", "passwordProtected": "false", "description": "Example template created via the API", "created": "2025-08-19T21:15:03.7170000Z", "lastModified": "2025-08-19T21:18:40.2070000Z", "lastModifiedBy": { "userName": "Raileen Del Rosario", "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "email": "example@email.com", "uri": "/users/53d98270-xxxx-xxxx-xxxx-6d080391b538" }, "lastUsed": "2025-08-19T21:15:03.9830000Z", "owner": { "userName": "Raileen Del Rosario", "userId": "53d98270-xxxx-xxxx-xxxx-6d080391b538", "email": "example@email.com" }, "pageCount": "1", "folderId": "cf5522c4-cac6-4f81-9a57-d5fe179cae1c", "folderName": "Deleted Items", "folderIds": [ "cf5522c4-cac6-4f81-9a57-d5fe179cae1c" ], "autoMatch": "true", "autoMatchSpecifiedByUser": "false", "documents": [ { "documentId": "1", "uri": "/envelopes/2230c545-1680-47aa-8581-7d2284093f46/documents/1", "name": "World_Wide_Web_Form", "order": "1", "pages": "1", "documentBase64": "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MDc6MDA8L3htcDpDcmVhdGVEYXRlPg0KICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMjUtMDgtMTlUMTQ6MTg6NDAtMDc6MDA8L3htcDpNb2RpZnlEYXRlPg0KICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAyNS0wOC0xOVQxNDoxODo0MC0wNzowMDwveG1wOk1ldGFkYXRhRGF0ZT4NCiAgICA8L3JkZjpEZXNjcmlwdGlvbj4NCiAgICA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgcmRmOmFib3V0PSIiPg0KICAgICAgPGRjOmNyZWF0b3I+DQogICAgICAgIDxyZGY6U2VxIC8+DQogICAgICA8L2RjOmNyZWF0b3I+DQogICAgICA8ZGM6dGl0bGU+DQogICAgICAgIDxyZGY6QWx0Pg0KICAgICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+V29ybGRfV2lkZV9Db3JwX1dlYl9Gb3JtPC9yZGY6bGk+DQogICAgICAgIDwvcmRmOkFsdD4NCiAgICAgIDwvZGM6dGl0bGU+DQogICAgICA8ZGM6Zm9ybWF0PmFwcGxpY2F0aW9uL3BkZjwvZGM6Zm9ybWF0Pg0KICAgIDwvcmRmOkRlc2NyaXB0aW9uPg0KICA8L3JkZjpSREY+DQo8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/PgplbmRzdHJlYW0KZW5kb2JqCjM2IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGgxIDIxNzA0L0xlbmd0aCAxNDAzNT4+c3RyZWFtCnicpXwJfBTV/fh7b2Z2dmev2U32zGZ3NptsIBuuJBACkUyAgBruI2YxKUFAbjmCigoSFAEjCtp6Uat444FsDiAcllRRK0qhxdqKB7SiojVCW4oXyf6/7+3Osmnt79PP57+b73vfee877/yeb2aDMELIgJoQh+T5c2fNWf5p//ug5DGAIfOhwF6sPwv4ewC5i5fOnoU4Xzvg3wE0LZm1apmw1fA4QngVXCuzb1qpvLjhoxvg+hGEdDOWrZi77N5gVyVC4gWEjF/MW3zL9Yu+8PAIZXyE0NCX5y9ZuWrdINOzCI3bBPevvn7ZvCVvHzwpIDQeaMTfsLHpPv2T6Y6mm2day/+lz9Kjf//8sKt7noz0k9ksMLsD0VQc0TMBjZKh/odbZZQsv/wJJPPFSYA5EZgTD6Q6uNZvR0g6jpAJyqwlAKdhzNC5I4aQ04SQG+i9boSydiDk+wVC2XCP/zBCwXEIhVYilAfzy4c5912NUATm1q8ToQHvIlQyGpa1kM6djShAdqNydASJiCAZDUBRGMEh4WskICLsRx4Ar/A88vBhBH3FvwA4S/OeBfGztJ7m5CtopyMJCO1AO/ECtBMdQq/h83DXLrQP5vZb5EKjYU9Xo1+gjUiHZkDJ3WgKfAUo/wX2xNuh9yeBB55ER4H2GnQ72o+c2B3/Eq1Fd3En4K67kBnloEo0CS1F9+Jx8RtRHTrF34lK0Th0A1qGm+K18fviD8SfQc+ifdxv493IiLxoNnyPxr8R/hz/CPWDOx5Ej6JT+AHDbqRCL01A+Su0Am3j6nkcnxf/AUYQRDfDGHg0Hh3FnSQCrc9FX2A3Xs2Nglaejsfih4HKh+rRfLQN7ceD8VgSFOri4+NHkRP6WAWtPopa0R74dqBX0UlsEs7Hn4mfRx5UiK6C+bSj3+FOrqd7XU8FrJgAq9QXlUHNUvRr9BY6jkP4N2SpYBKKBFW4Nf4eykSD0HQY7fNw5+f4W3I7fNdyb/Jj4iORBdblfrra6A30F+zFA/BEXEP6kqXkcW4F0kOPg+A7By2A9X4EWv8ER/AeYiLHuKf5l/gfddk9p+MW2JEw+iX6FfoNNsNMFdyI78Dv40/JKDKT/JL8lfsF/wL/B3EWzPpnaAm6F72EvsV2PBRPxtfi+Xg13ojvx4/io/g4PksqyTSyiJzj5nPLuVf5kfCdyjfydwobhHt0Z3tqew73/L7n23hRfAOaDPywDkb/IHocZrYPHUMfwPcU+isWsBFb4KvgIJ6Ob4Pv7fhe/BTegV/A7dDLcfxX/CX+B/4X/pEA6xIdySJBkgPfEFlBbia/II+RY/A9Tr4m33MuLoeLcIO5ci7KLYVRbeS2wnc39xfeyx/j47DORcJDwhPCDuEl4TXhvM4k3qFH+ncvPd1d0P1JD+rZ1PNQT2tPe/wvyAF76IVVCIDUTEaz4LsQ9vsh4Lhd6AQ2wdp5cQEegcfByszEC/FyvApWcj3ehp9lY38FH4RV+hM+B2M2Ex8bc38ymIwkE+H7MzKXLCdbyQOknbxPfuBEzshZOQdXwI3l6rm53EruFu4hLsa9y33M/ZW7yF2Cb5yX+ACfw4f5CD+Wn8nfyD/Of8F/IdQJ7wif6STdEt0GXYfu7+IQcYQ4SZws1otbxD3ie/oG4M7X0W60N10p4dPcOq6K243uI8W8h/yO/A74eSaaw40nwKlkB95E1uB2kius0g0nw/EEdJ4Pw1q/SZ4gF8lwbjyuxlPRQjIo0Zouk38RsnL+ddTFH4S5/Q5aXqUz4dvJOZ0JtWJEyqDPN7iBfIR7B53kTmGRfxJ9yEvYhbvI89wk4IJX+RFCLQpyj6FXuOV4DdpNqkAz/qjfDHw8Ab8IemEaLsLfcXHEkQnARaXcp+hOtIj8GXWBHG9CD+M5/Dx0HyrGq9EX6DmQir7CDboCnQO/TRbwzSQDtyPCvwCzK8O5mBMy0Xpcz23TnSMfoBvRMV5Cn3Avw+iPkVe48fx5YQqeDxKwBm1Ay+Pr0C1CLf8HPA9xuAbl8adBu63mivgg5GtBq9SBTtsD0r0f9EAlNx5K3MA544AvpoOG2AbfR0BP8MBBC0DGrwEt9jvUrptGOtA8wYJB64A2fqdnCpoRfw49Gp+Hbog/gPqBPtgYXw0t7kCfoS1oB76r5za0DPlBcj7B44Qx5JgwJt6PNJMPyFTyUO/9hdXOw270FXxfgYsRwgHUzP8JTUUV8c3xPwJ39wEN+yi6Dl2NzsAsv4EeruQ6UXHPBNISH8Mtg/meQpPjz8cDWELz44vRRHQQPSsKaJYYgT2O4T/AfG9Dc8mU+Epubs8CWIctsAoqrNaNoH/u5pfzd/LfI1RpQtO4QvolOSgbBUA6C0CiAlxBqy470MH1aQu7A8cPcn3RaQDC9W2NZAf2cflcduvwgNrBhdrsjiJrZT9OASs2gKUKpEsBdgEcAuDRTM4P5TKkawGaAHYBHAI4DqBDCFJaqwAsBXgC4DSt4bI5X6sSkCvzOQ/c6wEFY+Vc6BxAHICDcbqgVxeaCDATYAvAEwA6RkdLlgKsBTgEcJ7VqJyr9YFiGLur9R6WtS1cXMQuZyUu6+rZZds10UQ+fnIiH31VgmxYgmxQSaK4/8hEnl+YyO15RU00l8xFnZVOzgmTdMLAl0GKyWFkxRhYbzvnQDEAwumSJSpnb8sNFz1xiOMR5giHwVQE4p0cbjXbiiolEifnkB3chG9IV6KGdLVZbEVPVF5N/op2ARwC4Mhf4fsX8he0lpymaw5pBcATAIcAjgGcA9CR0/A9Bd9PyCfISj5GAwAqAGYCPAFwCOAcgEg+hlQmH1EvhaUUrwAg5CNIZfIhTOtDSK3kJGAnyUkY2onW0rKifQyJDEgigbwk4spKInZnUQf5Q+v3fYGjwrDTwFEHuBw0AhVzOa15g4D93K3lCwId5NM2JRLYXjmQvIdiAARG8h70/B5SACYBNAAsA9AB9j5g76MmgK0A2wFiAMBlkMoACjkC8C7A+2gggAowCUBPjrdCNx3kWGt4ZKDSCUr3LXCAAuQo+S3L3yVvsvwd8gbL34bcD/kR8marP4AqjVCP4B4ZchnyAVAvkN+05doD8UobOQRrF4B0AEAFwESAmQBbAHTkEMlpnROwQyMH0BE99Qdb0Zcsfw49pUfqwoAaHgUMqNAkPOwKwCB5QnkiTNTwQ4/CJU3C9z0AGE3C6zcDRpPwresAo0l48U2A0SQ8ZyFgNAnPmAkYTcITpwEGSQd5fG9ufqB04iKsVFrJzbBKN8Mq3QyrdDPiwabDF33P07H9srWgAFZsmxrpWxBo2o+bDuKmKbjpKdw0FzfdjpvW4aZy3PQz3BTBTT7c5MdNKm46gIfCUjRhtb3XZZnqxk1HcNNO3NSIm8K4KQ835eImBZeqHSTYelUxy6pY1lZJhQ7yK0aA9rGSIKxoEHg+CDrhEKTHAOLsSgUiJSdB7PHTPKetoCJx3X9Y0VIQn9fhxtdhG15HpwB42KDXgY1eh0ZehwaskFYAzAToBDgHEAfQAXUODHwLS62QDgCoAJgJsBbgHICODeccAEFLk0PcxQZGBz0gOfCJADx5Hb7UcQqSoJot++SIfCW3xYetfjzRH/eTUuR0gqmw2/S2Dmze8635u2/NyFBpIPeRLVR1g7uSyLe0fg+qGz/SGj4QqHTgh5GfB87DZSiM8yAfihrZ9WDk09O8BPnIS5AXtfpq4DZra7gwsB9b6F17At/7zgS+9HUQQM/6DgT+pHTwuDXwRyh5aU/gPd/dgbcHdOih5GC4A0O2X2Gk+3xDAzuPMNJ1ULGtNXA7zfYE1vjGBhb5WMXcRMXPGuFKtQamhGcEroT2RvuuC6iN0OaeQIXvZ4HyBNVges+ewEAYQiSBFsBg+/pYpyE/a3B6aQeerxaKD4m14kTwsorEQjEoBsRsMUvM1Nv1st6iN+klvV6v0/N6An5lZkf8tBqhEWGmjgWGOp6mPMNlQlOSCCEJ1hMwxbEMrppUTx2Jq2Ods1H1dUrs4tRQB5Ymz4gJoZE4Zq9G1dNGxoZGqjvE+JRYaaQ6Jk66trYF4/uiUBojmzowmlbbgeO06K6smH1U7T6Ese2ue7No3ueue6NR5HbeVOGusI+wlY0Z/RNJQzKNXP64e+HZsYeqp9bGXsyOxoooEs+OVsd+PlWpq90Hjvr5qtH78N9pFq3dx43A/6iaQsu5EaOj0eoOXMPokIL/DnTAMX9ndHowzpQOKXp/gm5bgi4P7ge6XJoBncGA8hhdnsHA6HhM6Voac6tGt+TmMhqXghoZTaNLSac5kgc0eXmMxtmEjjCaI84mShMbwUh8PiDx+xgJBu+fkfiwl5HUXCYZkCS5O0VyN+uJw5dpfAka82mNxnwaaCL/62fuyEgEtw2Pzq6rmhuqaghVzQVoiN1z03x3rOk6RWmZHaUVSowLN1w3ez7NZ82NRUNzR8dmh0YrLcPrfqK6jlYPD41uQXVV02pb6tS5o1uHq8OrQrNGR9vGTiop7dXX3am+Sib9RGOTaGMltK+xpT9RXUqrx9K+SmlfpbSvsepY1hdiPD6ptkWPRkZH1SXyNmKUgF8bsoLRkU552QjGvMOD7tuz9oPHsgMZI9GYKTQyZgagVf0q+1XSKpApWmWBYmuyyn378GDWfrwjWSVDsS00EkVW3th4I3JXLRid+GuEDxStvJEueCKNNP63D9RVxdRZoxtXIlQdK5haHauYPKO2RRShtIFOKTZMKzMaqzrinYnC/lA4jBZyXIqQlpXTMoMhSfif+39jMh9FpaCJHGjDqh+vRI1RLuavnkZAFUybAXOtm1G7H/wpaiIaozDBRgiWGrU2ksOORFDiGtE5a7DyxiSWXIuVyTxxJ9zSqC1J6kMXK5JasZWsWbacEarB2AGHAM42EtHIdoLP6MQO8qiagQT+DIckkT+DkUevE84Q7iAEjgb8KO6P3BH5Ynl3+QT5Qvn47nJUAbh8CZJBA4O2oC0PEtCX6JLCdV5SBfQjUvhOqjArcQdZSJZAX4WqZxlZxpHxeDwhOISIV1gGBB5+2b3uyAT5TL38ORowvmvQQLQc12cMDjoqSV/csXs3DZEImh7/grcJnUhG2fjjFkJGTatVJa+fFzL9ZrPL0BE/2261kukUUT1mM2A2ZKIlyGkyQWqiZWgArMNRSI6iiq4K6CqrRfefLV2AlnS0pc/bzWaGfKN6jEYdbVKmJUg2mWhKy1JNXm5TncDrNpJNxk3Wty2CQTS6SVXGOMfVnlFZ0zLqHHWeKVmLxEXG2RmLHYs8DVm3kJt1NxlvtW7UPSI+JL/tPkne171v/NDqTQ2pUo5fQCZkwiqqQa74P5ARGZP4d8iMzFhVbTWuRoMaDJUMNGBkkA3EUCnBTRqhIX42Qbi3xrA1YDOZTB3gc9XYLEZjAtGbzYC01dgaEbC5aoKWFAgRCdJIkT5JihKke2rQVv9b91CmgKnXR7ogpWj9coYmlwLXL0f1MTIqpk6qbdcpHtnXET/fShTjr+OnkRPADmAFGEo/GCAajWbI9iHFRU6n3SETXSgnP5whO4uLhtjkcChH1E1fdGL7Ta0rRy488eR7t9y/74XVq1944fbVV9eTE5jHV7w8s60nfrKnp+f1nY/sxb/qefjceTwfL/xmwQbKi6eAkX4EHpLQ121SamYaImmrgTRESsw1NWk1WMOpZlvJIn4t2UIe1fMv89iAdALhDAI2EXxEYqsn0X1AmEbA4Fa0yzIwXkf8K9XG2NHH2NHC2BFWQ/VQZtM4inGX1ySoZmuJQNuy0LYErAiqQASPcT8ux3ehhLgsT6w4+8BFQiorXGXYVkZXHtVHcKIyGLLpdOLgIUNKi8mP7ZUnpj381wEr+dtGrA68MvbITBhlOUK8COvix98m5cFgk83ujAzddDMVB5uNId+oBlkGzJ8p+KmYuSiB309r/T4L1PhNdPz+DnJANRHJ5YJ43UaIErDZywa8d5SmR9EAyh6RCpoeLqICSFIdmux2wjpUDVYb0fo5rRrtGWS6P5OW0bZboWkq7kYjmQ7I1ypby5/qjcok7Y/2xjpTxw4XhusOCId0B8S39G/7xKtMUdM0yyLTHMut9lsz7rYftH/m/SzrvNd0yLg3g/glWa/THfF5M30+r97n5TDRe32c2S93kGfaJtowuN/u3XSciA6sDROT1EtYpTRhlVLCaq6RGl0ngCGpwOIDZB1SkIyHqibb7goykywlawlP9pNc8MS3tDARq7/QBVtdLl9IyBZo3Yqu7vozNjvdbUg2WvpHLGvkw3ABe58UONWQBaFDtuyXdb+On0ciiJkecgOAJm1Do6ge16+IRvMcwXApMMiQIYNLQMx0Yv4QKoOOTGAc+OPFS6XElff0tnM7Hr3tjsfwvozvfn/i4pXPv/ZUnX/nzsry2Z23H/7s+kU/f6w549gHX+2sffHgM5tmDWIOc038c94JvBXBrcmtNnrcKt0xtw9hyuIRE1zgviHJbDVZ/ZLU1+H38f6+PqGvOWQ2uT0Y2RWZCo0ihum+U/LwAKpzjw6gX2Qvq6iQu+Qu2PGuN+U37WXy4UgRBbrjAwWz01xl3mDmq2zX2G7K4qY4F8sLM+c4bzTfkrnB3Jx5d9azZsloMlt4EUN/mG6tCgM/gOkjADMe3G4yOXj3fvIM8pD5qgFGJ8DwzPZeO21P22l7mlq2N85UlipEcVPJUJrEXjeJaTeJaTeJjWGmy8MYheUwgVlf2EvvD2/t5+7AQ1s9J/B+CN4QLJ4xpam3FnbgB5LsEuliDJNUxhci9Smd3H2GCkaXzLgnwTwphmkVFA7kDRgjStUHXh7NKHVS1ct4QixNoRp7UP4QaYpCOeGa9sCDi9buempN8bhMu7GxY8PCBZsz24NfvbLqyKLr59yxtefs+7+J4zvdj26M3bH6yczHyao1s+9Yv17Z/da81jkzH+vvf/W+zp5/fU5tvZc+cxP2g542438eRKb4D4kla68x65LKWtC0tk5DDCk9riGCpsd1GmJIaXYNEfVJYr2GiJql0+tTNEkzoNcQQUN0GmLQkKTNUEtr7LWm+aZtphdMb5uEcdw48y94zg4KBJl0nChIRk4Ey2M2H+H4TI7jOTMiJjMvcgfIAaQHH227KiGeBxJ0ROI7yPV7BUFSswMlkmZSpIR/wpBvmKMideBS1SyqOaESsSk4WNxqJVS+jObMEkRkohCO0JvpPYCc2UPvIbstHXgzY5uvqR2nFuUC1dDl8ucyMyjg710st5VRXikr29g/woOesVqtYGKYw2uOf9JqLwOt/Z5qLC7jcvqVcXx2djltIgpMBDRqpkk1lpmaJpWZ1HCZKccHeb8yZpmi+CfiKRQBX3IwLrYVO0I2zobJQ93rya9+/uab7T2D8cxnuT2Xrn6250lQkQ92L0o816W+YVB4DuzX620Z2u7bNSTDlNxHu4ZkmJKbZQdkHxW/hGqCwBvWy0wXCPsskt/h8NmpMTNaed7vM1swEt1gyJmjyRCmxqiZoWqIihfIVvdhUD1U85TYmTm0srTae0t2c/ZDGc9nvG563/Rhlt6Q4bYUeLkMyWHPyDhisWZaMjItVjNoHzWDdq1atluIxWJVHTg5jL1WHp+gmgmMjmqjA7LNlJfKa+UtMi//z5rFzTSLGyO37CZuTbO4tyr2g3gwsuIHgXJoq2X3T2mYQG8N00vH1AOvUJvE1qDeBgAq+cxGff+IAAyD0g1Tu2GgMNC4H+wRx7QN1TfL64EbEvufrnRA02QEHUEOtA1yZIrgDoanv+p4dPEd7Ts3X7O5zwv3kQ+6905cf38n1q+898Jvu3GT3HzP4ae2tU6scJK/v9xzU13Pxd+/dX/raRZDjAc+cYAtykYFKWsUsOIAnok5nNXHr5qx2QxOR5aQ4880S36M8mTqjrB4Qva7ZLrxLmaLXCyecCWd/6PvHZXf0Bigvks+XE8ZoN8iDx4tqo7RntHKDPs0ZRE3R5yjX2ifo6zU3+i7S7/B977+PadNVOgO5CdEUzc9RF2eLIoFWQUd1iQzgYFl4RPUW+ugVkgbJKb2AO3O67X7eWm7n5e2+3mNMtt9GSMZVAjM7fxe6nfKWwtBdwxt82si49fUox+02QHWjh+XqeYK10zXUtdaF++SkwSwGkzdWWpcTtqUy0nH7OoguW2RVHiQsD/p3NKVMEbMCMGCpVhjH3VT2vOVkBLs0HiDNkDtURSL4XwWA+hEan7s1DsJ5SCbXEqNEc5MYxvuxzZ34VWLaiqnX0cqD85r7775+Pq/9Jz51d1nd37cXTrxvgkrnnnqtltf5KdaFg4cP3DENx/Nbuj59g/NXbfjarwav/CbHa9d+rj+xWjH44/s2pXQMbPAJjmF52Etl6mWw2bMwx/R8wZQ3FRFDCSYN5jMjRxH6BJPZH4cR7xWfaPhb2gicNhMwlVAthSvhUDFY0mKEoTT9cvLx1/omiBfpD68DCtD/bsyW1nCmQPJoLGwDnE6MTTEbi+dxe3e3NNVPcS6j7vjn3fzP+zc/GCPvefHjg934q/wW4/RqH4q8LkH+NyFQmgg+XmC09tNKMvfnxoE8NvJ9P797UG/Tujjt5v91HSy0PnCHhY5R6zAGUzLWTVHmyKs0urmaCW1QJxGxaWEhMt1mCi5g7XoYELiuBwh9w6/qYfeVVaWisL3soHotIHoEgM5w6Jxq2awkv3TMkAuqTm0kHZL73QwXetgM708P60z6AsPSA5AAyqn4wc7cV/nVc6rwp+bvhwoGAbiNWgNXs2v1C83rjDdaL7VdQ9qxpv5Dfp1xvWmDeZ7Xe/a3sywm5DfjUzQ0/b+OG0xe0miP00S/Zok7qnxNx4yYEOlncxDkTTqSBp1JE1uI41WVQG5tWJkla3E2oHvby9ya8Lq1oTVrYXm7sYYh7kOMq8tVyPK1YhytVA/t9GhBZiKQ3UQx9ZBb2m6nSl0FtJfSOn3lAtpL6tnS0n9gTTBzYmfbvUpXhDbVkUZQLN+Cniup1v6KkyOE3q+fsVytDwaxeHw4JJkhKF5kAhKMjLTZDhdoPHCZYs/P9T51aIlG+/tufjBBz0X779uw6L5d919/bxNw67aOnXdjp13rH2ey+r7yMLtJ09tv/7hvoWHNx2MI4w7t/wGT5u//s6ZszeuvxQfv3Xic013vLgjdaZE5cSPCkgoyYPGANjGPBtYxouMyaiJZHrZTYP1PpTL3DbGZjYWs9vctsKIsY/faglYJlo4iyUTTcKYBTZmGSJjTA11Dg0R6dodjtQXMY1XxJYPOJCKhEztx8dvpKLhtEFcdjbUAuZt2Jhk/Zdee/f1b10NSO9IHTvMO86phq51XhO6nlvsXOKdF7rVu8a/2XuPf5vzBe9B71fOz5WLSsYVzsedO53csL5zdKSPf6JlJvVKfLQTfGJSwhq1024DlflpnBxI4+SAxskUx2XImEZnjF9M0RnT6IwQDtt6uypbC6mt2w22TuPpPI2n8zSezmu0pXjaptqIbWukF0+DCUryc5KbUw7LZRN0AOWDZxKKn24LKjpFi5KX4/poMhwaQQaX5FPLAzkCFrbb2DlVGDNGdTAOXrbTuXrW1DWThuAhB5bsuYTFN7d03Xbr3596+SR559mVq1pfWL3mSTxVvvWGcWv/vMzkrlmE9X8+heVtPZ/2/KPni562Vw5xJb/cc/ixzWB+CNoHBmgDH2bntUNVhReQTjQQXTnPlWMdL5FycD4RoedNT+qffMTNpJbaEYiJ2d4zQc0YXOzgAPYdPXqUix49eun5o0cRiXcjJEQh1hKRhcyuzAYP+Lu044tLKdyQVi6k4byGp4VQOj4VS5lMv07e8kNio4FMZzT+OnnvBa2QmLRCfLlQJ2kRmFM7mtNceKMWCEqSFu1piMGiDUMrERMle2uwxSqz4Ocf7UnkOybbhBqwKLM9zI4ILB0gD5Tn6ecbGuRN3Fb5beFNXad8XjbqhSiuIZPk+caY/E/TP83/tBh4E2/mLZxRMgg8bzJb9DpRNAGu15lEjBB0o1rZsZ8imjKhinAcLXPQMk7hTZlwl8EvCHq/jtN1kGWqAelNX6oEE7IfG0GJGVW7SUFzRW7KJP4Yf4rntvKY78BYNU4ydYqnTNxWEzbRa9kqHhPJWrFJJOLPre//KcEMHgD4cwNDeD1yVxdyV5R7uyrOlMtd8LdR6B+JgJO+sb+b5YxnIOLbKB8+bDl8eKOQyMEXqY4Zp1bH/JNnJGRlRm07b+X04v74eQgVvkto+BXUlf/vnxAuxiEuyGUEuXC+TuRI8e9J7ccvdf/yyQ/w3x8dk+MrFvb/MAYf7BlNZuCH9t187z0J/+v6+BfCTcIJ8N27d88mC7MJTrgmOnqKeladSTEFFZlno2VoZXYTWp+9FW0TXuKeNe/j2s1vmY+jM9n/zLZZ7Nm27GyuQNfHVuBTAmPNNZnXOGo884VF2bfZ77Fv4x61bPPtwM+QHbY/WjJQJvLKmbKXBwb5pLVPGVPrSp8y2Yown5XhN3FZft4gh61Xo7AC+tcbcJEkz7k05eSSEh6yVOMKK3oMEsEuzTV6Ex2z3uOfXcf8QHCTx1O1BJ4gIEkX2UbPZyBKrqcn6eAHr8AuHR/KyQXdY88tLuJdYphqHeLItFO9w7e/dkXP65919fzpl7vwqNc+woXDDxW/9vMXPq1b8vmGp/9KyKBzP/4G3/CHz/D0ltPv9Nv+wFM95+4/0PNl80FqDx8HXTADdIEVZeN+ql0J4FF6X7Yf2NAm+61IT59E9PyXJxEXoZx6KwE6TQMOsCM+g0L9RIPEnsy4WQmVtISX5w1ky9oiyVIyIpcTyh3iCVlhJ+hK8vj8IjOEDEkenf/QzkSqI/5tOzs8pxIlsQP0ev/wOnfqcLy+vJudZyQu6y8fobKHV6NuUYdwWaJepxf0vJ7XedxeN9EZJZNkljidw5npzHByuizOFcR2CyRuvS+InZItiCL0fL0APutwfbEtWORyupwQkxALCeUFi5JnqRCwBB/H37804/boysYJt95/9K6eFlx2/7ODqsY/vHjCzp53hf2O7HHX9Rw7/HxPzwuzinYOGVT15XOff1tA35N7CmIO+k63Ef1adegEv14viojj6YZIBr8R6UXKj5myvUScxl2tSIqZSF4zbyApTaide0lalGb4n1f1h3aDIVWiSzyrSC6vafi1SY5NLvB4tsKMcS+cuby6YFjLZbrIsDyOYBKe4nMvPc5FLv2RWy/s39lT8XKPeSeMCDwy/i6YqwG9rOawuW4RcWq6MNXHFKIYCfEa/z/npxoTzwOTqqPnP2YnDa/7r7M7k4jOqMfw7zPbwX186TMS655EZzVsZ/f1Cb11CJJ1MC8OV7QRbeCchhAxOQMOkEpz0gB+n5IrpOFAKpgSIsIBkiL9MSF2jDSJ76mh60Xo46O2oVewx0htxSWJvN/ARN6nbyIP5SXybH8id3sTj50KzHKJImwVdgkcp4AF24K2oxjiByAVTUKn0Hkk2BUo3Io4IXHESBfXnVz0r7VF/0Zb9IuqnDB/bNGf4t+PponnqLra1iawcfXR5SvKu1PGg549MtWnfYptxbZDr1HrQNd1Uvws18WPQF4y4CCon/OaEyJpTohBQ6waImuIDZC0Yz+1xLLWiq10xSeB9eAQb/cZRbePN2KLQ9RbLGS6yCJZkfneokwjXJE67pGj773J1LQMzjYF5lkbTDjgG5UxyjU1Y6qrIaPB9UvyS26b+Rn5Ga9Jb/ZIC8kCbqFwo2mZucn8nGm3YY+022RymjaYPiWcJWemdal1rZWz4g7yohoeyFa8AYa1FbbgNKy8AVmtRnR5jD4YOnvYq+llq6aXVWuNNdeip1xtycmiz+LTyVD8mxQZyjVGAhjDJmDVEmFrhNWkRsZqctXwEMarqgJFdB/B2ZAhvZLKD/bSXvBVPod2Du7QvHRHQkjVYI0j95iIA2IFuCYW2oAo0QZEO21A1I5kxcR9e2rEQVklh1NsAg5tJO15Z6R+RfXUUPXkGYkz26FRqF1xgXr1K7Ro31Y2QK4/A3+DBjL3fbl22AwWlB0blbDHzEkDmnDbufKW7HOvnOz5dsWXd+/8KLDLs3bGphefWb/wPnyXa+8xnI2llzFZt+vJrEWLXz/x/mt3gM2sjp/l/cCHDrCZB1RXAPkc4NPVC/WG6ca53CJhqWGuUe+gxxgsZgREnUKxbB879bN/IPyQedHLD7IP8wzyVdrHeyt9k+11nim+WfYl3lm+VbpVjovkoltGTmw1u1yTnA3OZU7O6bNulbfLRJb5LJ8kov3kRboO7FiGOSkWurQy7OeDGcAj1HCf/79fIWircanmjvhHTGTN2iMFM41A6f6YaaOG/IKSmBmbvQGqK/LCJTTf64cgLYADzgMQLSTPN5zFKVm7bOKTD0YyauRcUc0tKKGcMFHkRI1RkiygRmpEhUmYm0mbj0legmF8jFXYEaPo8ZeUpuvpSH2EKeozULY8Erm4nJaNT8V5UJGI9Mq7l5cno6LkY3JgieUrNK6QIaRDtkwxyA4fcJAdOeq4n+0v/Gbflz3ncOZHf8QWfOms1HrX7M3dJ8lk09Cau1e/gGtcT7fjAOawCffp+aTne1nZtX8+fnDDqPnPsbOGkT2Tua+AT/yoAH+hNhiNQmahMS9znLEqU2fI9mQXGsOZhaEy45DMq41jMmvEWuN84w/SvxyW/qHC/BGhEfnj8rcWbi8UhwSH9K0oHGMcE6zqOy04re8CcXZwdt+GwqbCk/lng9+EzuXbXE6do4O0tPfxZYhMi8gKGsh0SBPqRMch1Osga1RZ8PmsUlWOzyQ5HcV5xfTJdfrT6n+khYHaUVRujZTndh93YdmluhpcTS6+EMwpmV7IvD2XnbKfi3p47FUHl46qTnoizEq/Aq0Bm0ip6AkxcBg7MO6IX2Ks5gLt9EMaj/6Q7NNU41ppxXkoJ6BxUkDTMYGks+iqCeQesh6znrLGrXzAWmGdCPpTYyurnGCr/jVWxlZWL2Uraw47zPTRESWe0NBySD2RwpXBkkkQCU24zFnLxyePD7rTQ5n65eWs4MxF+uzjTPI04UxFefLFl+Uu6hIWU1cwP3FcQDWOa3CxjR1ch9MPu67fZSwatXLNJrcF3xT78PwNv7/34K3Pzf1w+6+/evS5Nat37Lx11Y5a7+S8ojkzSmP34PKPH8F48yNNlxZ+d2zVS1zB7zsPvfv6m69TPtsExrGc+htIxP9oI1oEzWnI5ZgakEpP0o24lOZxXMaFNJzXcPBEjJoboyE6DREBSTXanWZrutMOD7rTDg+6NbtN+OSmchqi0xARkLSRmlMOz2VcSMN5DVdLawxD6JZPNGw1bDfEDJ2GU4bzBhEZAoZlhibDE8mi04a4QQoYwPyJPOEMOu5AvDPZQkENdztGOkHHSzoxT0D8E/x2PsZ38qd5XSd/nieIV/jjcMXz9CyB8j9PfUwX5XwI6oHTeIkOgc+knMZTdUrZn6eOJ+U6np5hS5Tz+An6sZPc6SaOukPUCyqv6IokYnJ2kEPPUP9reM1OecBR2tTe3s7/7dixHx18+MeTYPvvBL4oZX7ost5ckXIlf4IH/m2vU6Q/sbP/toNprf7Hfu2tEdi2MI+zdGjC8ywZnMgHDkrkOQnPVM1zuEqsQkB4Qjgl8BMhOS9wAWGZ0CTEBR48U4lwefQ9K9YSe/3KUTy45AmEO8FXIggpoPBOIx5p28NCgGy6PYhtD2Lbg9j2ID3dG6TtDSBxLTpIbhKawPfeJLpL4Kt2J71VdvXvH+q43tnOHFeMNiLEfQ52wIkPqxkCp8sgO+QO+VPui4zz3MUMHU8DkRyjueQWGT8iH3efdsfdvKLPtGQ67T5BxDqnWTJbTBZQ1pdPSy1pituiuXiqr8aS61bpnN0qnaOxD8WNmXTuRvrelI2qQCNbBWMOo6CqmylpYyZdCbj+nvr2gEn0LNxIPXnmrhnV4iElcSOGP+MEN111b8mQkpj7vJssc293x9ydbt7NkWKHU9PVTk17OzXF7GT7drHdZkuGmantcf3H9vDJaO0HalkAI2wz+OQudap2GM55+nq+tt0TXOyoN/VJnAFcKJehsFdFJHEWXC7TV1orKrpsZZg6BqNuUZ06m0HSS6LE6eSwTWfJwlbJnoURC/vXUQ0Pm0/fUmCvwricDlvIVpJwJm0bn7rx44YnJ8lSe8GiKxuf58MP76paNr5oTXcj2XDDksoH3u0+CMw5GnzHfOAFM/LgT/Y42DtCGfRYi9kjeqw1l2IeVmEXJY9prO5KfY0uqp+nW6DXl8jD7MOcg91VcrW92lnlrhPqDFPkenu9c4p7ibDEMEdeYl/inOO+GTsMOsF8LTdNmCZda1rMzRXmSotNksvHizawgJm9LH9mWoyQmbL8ck1mbhaz8lmMmcTUC40iO9dJBkX00Rzz1CjC3DTtYR1DmPvG3NPcvJKBIkaiLCrgAh6APpOuozjoVBbOYkEldSwBt2gsZNE4x5IMKSqBw5HJQoNNO4s0WXyGfIxlmMdI37OE1MTkmj2gRip0HaDn5UgLOS6/5Jo4Xd5TgwZ5qXOZfLc1nU/Atay/GKmv78092uuuy+vRcvrGi2GqMNVwnXCdgYeolr3SncEeUqPkI+t0yz/6mbvf+BA7b/vbPad6uva1btzQ2nbXxlaSgfPvu6nnL91H/3YH9mPzu++8+/s33jmSeBd6Y88CPgh8Y0d+/KK60iT3k6+Qq2W+QokpJKD0NYWyixxF2SOzlylbFf0w17Csq11XZ0X115rqXHVZC/WLTAvkJa5FWZ3KicyP3R97T/jPZJ7xn1biijPER+SIYzA/TB7DXy3PkD8z/i27RzbaLBBy+HRU//gsRmTx9GIZTxrLeFIs46vx5B6XsCypUoPUJPEKYxxFTb6z9LlqpOwjuZPXiYMn9jIT3TlJew9bonJgpVsnrcQZxaTYrvGD3ZJ6sSfhB3pq7HkIdWK8FW/HMXwe8wFcgSeCU04VOFP6WGZv97DjCMx4FrOTIEw1EYtnKamTdozZMSW2s8jWExhb6sbp4Qazz+OZA3jhzGXHMBGo0ocvTJlQXULfsVy+Ai3PoLoi+d4ce2KUb+PSGGHjM8MemL/p+MIbT902Y0t/23M3rXrp+ZWNLT0LhFebJ0/eHH/k6Z4f7xk3rPtH7pmjh9/54ztH/kTPQSriZ7kW4IWB3OdtqTPn1CNhDyCVpWxj+qRtUvqjunCvF0cu47lpeCgNz0nDg2m4kjI8q2v4nMycYYarDaNza3Lm5qw23GdYn/tcxkuFr3Fmg8vrdg2sLnzfJWSR6YTIRVhy1+nrDHVSnbHOVGdeqF9oWCgtNC40LTS3h9vzrfnh3PzcvkNyZ0hR45zwnD4rQytzm3J/Lj1meqDPw4UPDnxGesH0dP4zfdrCb4SdfbTHtTkaEtKQXA1hNHRvczQkpCG5GpLdEf9EtfvLZujz80wS71XCDt7YP9tLw6kcTyFlnICnwjPRM9Ozy3PMo7N6Ap6lnlMePuDZ4iGeV0EBOUBUWVSuZlJyGauYyPg4JgjLmD6+6GzLdJawaF222Eow7l+XvTibZPscIk+HwdxG+pJf0mH8XM2gbMn7+hsDXuzN9agZ7pIiensRFSSPO5FS/vaw3zx4FHqnR6F3edjDag8LnWltpSEhreTay++KtdWIuQXQ3m5f2fECXEC7ps0UaL+tYAhtpiDx7hsgB7RNb6sp8LKxBPMLShqKOotIRVFTESmiRxC5iA0q+Xa7ktgG0AQUoSOkyF46SCWp1501Sq6VCaeVTcSqsGCNmv9M9laKhYVqibAt8SBQtdVYc04hXIEmgoL0DEqeDUDkdiFNT4Nui3StmMCcAFa4nJ4QXBZpqETs1fSKruXs/XHqz4Fwswy878uvzIJ/oOb384cgig/bZLucIXO6HLOShQx9xCws9IPEnwmXQUsoC+WEzCZ9XykL98k3SLoIn4UCcjb1JCIy+B2JhB1OFUTWrVuH0jQM9fXrLxdQotTrcfnh/P4QU9IHDcwB0Q6yaNDp8pOEqQlXtFrvvm31qsF5P3/z0YmVQwvun7rm1Rm2mKlxweqFTueArPWHHq5Z8OaaYx/gK3yLVswdfUXInVd01boJY2/pE4hceds895S6KaUhX3aGlFtcubpuxhPXvMzOte8EvXOa/g8a/NA+5KWHQ+CoEyXDWWJlv2qwZ5ZEMnCuPsNpwhlOow5JNh9nRMXOXp6rM82KONM8V2ee20VdTC/zX13Mc3XZ2XEC9VzZebOLOYiulM/qykweLHyX8FldJspTLuqzmim/xF2404VdE7yUTZ3UXfWe95Jl3u3emDfu5enZbMKumDTtaUrYlbYaU56BiSn1MukPbBTDcYgaeYMWVFBEtdHhGdigDBL7uRDtmpkSA/NXDYS91DTB0yuESL6Q8J+OKXNZz1DXoqK8LPk2GLCdl5ctZquZ6BLPrMA55U1ZyKy3ZSHqmhYUrAN7A3cGB9PtD+eHB0P4AUxBmWYIxbmK1X/82dMTZWO70XbD5Mn3DW9/rP3KJRMHN5IHutvuHTR28tQtm0gZBI1sn70Qr5yFfZbI+INIr20XRHuWVOiI4l+lNlSv4UDhTIWBKM1O6C+f1RO59zm8S9AjSa/DOgkJBr2AiZBLxV0YEPn4qPzxUVtxMdjVCroOWXsHCxjl2MokqqfNtjIDhEclepoQUE5tkONkDhR/Vg3+YAnqAwnzJgwQXCInJHB1Ur29T/8SpEBiNfVFfQxhqQwNlq5EY6UaXEOi+lrD9fh6skC/wLAK3YxvJrfoVxluljbijWQDd7e4Sd9s+BV6xHC/9DJ6SnoV7RVbpLfRG9JJ9Efpa/Sp9CO6IBXCdCQ3ckp9UFgqlSYiVTIIqt1ZIgCjlmi/uIH50Kkj6vioVvY+N2Iajq4FLWOOCF0VVkoEwWSkb09+HIG1ATgaORpBAyoqGJ9kqaWSqNfnGaRMg0FCHCEQbGViDAORkGTQ6wnBOlEycAgLA0zYlKNXVdXQZCCGDpy1W4XomgiAqQaFqDjH+NUfKMN2eT3d9d31XnfXmfrkayUQM1HtVVFuK6NvEWxcw14igCwKbg89V+31LgB9h1PDg7g4w+kaUppRjPErPYt/fSYv4I58va/nBj7cvX7e0mk3kU0/ntShxP+jATtayTei6QCnAMoBagC8ybLxALMAptJroN8n1MS7hbfQ9QCPCzXoKf5TtAPKD/EITQKaaoCR+C20CeBOwDcCjGY5QhWQ3wm5Vx1Te03N9GmVasWIK8qHDysbWjq4pLho0MAB/fsVRgr69skP5+WGcoJKwJ/ty/J63BAAZmbYbbLVYjYZYYlFncBzBKPCqtCYBiUWbojx4dCVV/aj16FZUDArraAhpkDRmN40MaWBkSm9KVWgvP7fKNUEpZqixLJSjsr7FSpVISV2dHRI6cAzJtcCfu/oUFSJdTF8PMO3MtwMeDAINyhV7vmjlRhuUKpiY26a31zVMBqaazFKo0Kj5kr9ClGLZATUCFjMFVrWgl0jMEOIq2pYC0F6Mwwq5g2Nrop5QqPpCGJcXtWsObFJk2urRmcFg9F+hTE8anbouhiiPwSOMBI0inUT042KiawbZQGdDbpHaSnsbN7cIaPrGiKmOaE5s+pqY9ysKO3DFoF+R8dct55xX76Exu2jajem12ZxzVXuBQq9bG7eqMS2T65Nrw3SNBqFNuBekjemoXkMdL0ZFrGa/kY8Ru6K1sbwXdClQmdCZ5WYX+KX1HkNC5WYITQyNL95YQNsjbc5hqbcEmz1etV98dPIW6U0T6sNBWMVWaHorNG+lkzUPOWWNo+qeHrX9CtskW2JhW2xWJOIyZyOzE3VMYyRU6x6SmplMR1R6CpgiJgyW4GR1IZgTkNpMncoap49FMjgE8VwV2wO7MiCmGFUQ7M8jJbT+2NCnhxSmv+FgANCXV/3LpmVLNHlyf9CFKV8kmI1qNfwWCQSKyigLCKOgj2FMY5g14P7Fd7UQUKhZbICGSwfmgRrOys6bAAsfzBIN/ieDhVdBxexpsm1iWsFXZfVitQBkWiMNNCaTq3GMZ3WNGk1qdsbQsDJ7ey/6Tli+nDqzyo7M6rmD4th5/9RPTdRn3y+qFQ1NyTXtnpar6tE/dBUXRKLZYyq5bJIEiNZHKtN/ABcI4GLWlOMz4M/HWPqOR2iHriSlWBlTExuuDKRRqVg8H+8CdwuehfLLt+WHGZsWKT39fBe172GZ2rmYMB8mFRPm9HcLPWqA1ZLdHhVMgOOR9Nqg8qoGJoOkpkHf+AqDaUQzYqpsGSjKAHwX6IoedmLMCuJR+FDubNf4RhQdM3NY0LKmOaG5lkd8abrQoocat5HXiOvNS+ratAYpyO+/56s2JjNUVir+XgYCAVBI1tCeNPkFhVvmjqjdp+MkLJpWm0rwWRUw8hoSy7U1e5TEFJZKaGltJBeKPQCVWOYZCvRM/qsfSpCTayWZwXsenYHRqxMr5VhNLuDJMrkREdh1hH93czsDj5Ro2rUPJTpE2VNCeo+SWo91Mi0Zj/7nT6rTHyocgJHIZ3tmCzTimsitSbSXD0VNo1WSkOzpLRqhd4Yw6HYzNCqYAu0GasJ3RKEwlBMAQUHRC1orC/a3KzANwTdz66pTaS0Chf6oKUo/fcSSdosXzSUdmmCW9lWtPmo2KV6u03rbQX0RpFmrbvY7J/sDUYfw9fSlP2x4bcMQaFE/2DYEp021zXPCAVBb2bTjpPjgEuLL8pagJE8QkcC0v3/AJiiPAIKZW5kc3RyZWFtCmVuZG9iagozNSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDIxND4+c3RyZWFtCnic7c43DgIwEEXBT845x/sfk5U7CiignZGepbW3cP7V+fjSbWcv/QwyzCjjTDLNLPMs3vaW1SrrbLJt8+6HX+yrQ3WsTu3mXF1yza1N9+qRZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAvXu1JAdIKZW5kc3RyZWFtCmVuZG9iagozMiAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE2NDg+PnN0cmVhbQp4nG3YzWoluQEF4H0/xV3OLIZuqaSSBE1DmBDoRX5IJw8gqaTBkHYbt2fRbx/b32SSGXLBNnWuyxy+czGF3v748Y8f7++ebm//9vhlflpPt313fz2ur19+fpzrNtZPd/dvQrxdd/Ppl6vX7/Nzf3jzcvOnb1+f1ueP9/vLm/fvb2///vzm16fHb7fv/nB9Gev7N2//+nitx7v7n27f/fPHT9/f3n76+eHhX+vzun+6vbt9+HC71n7+Q3/uD3/pn9ft7ettP3y8nt+/e/r2w/M9//2Nf3x7WLf4eh2UmV+u9fWhz/XY739ab96/e359uL3/0/Prw5t1f/3u/fDunfvG/u0N797t/frj+eo5DMIgDMIojMIoPISH8BAmYRImYRZmYRaewlN4CouwCIuwCquwCpuwCZuwC7uwC4dwCIdwCqdwCi/hJbyES7iES7iFW7hfw8Az8Aw8A8/AM/AMPAPPwDPwDDwDz8Az8Aw8A8/AM/AMPAPPwDPwDDwDz8Az8Aw8A8/AM/AMPAPPwDPwDDwDz8Az8Aw8A8/AM/AMPAPPwDPwDDwDz8gz8ow8I8/IM/KMPCPPyDPyjDwjz8gz8ow8I8/IM/KMPCPPyDPyjDwjz8gz8ow8I8/IM/KMPCPPyDPyjDwjz8gz8ow8I8/IM/KMPCPPyDPyjDwjz4PnwfPgefA8eB48D54Hz4PnwfPgefA8eB48D54Hz4PnwfPgefA8eB48D54Hz4PnwfPgefA8eB48D54Hz4PnwfPgefA8eB48D54Hz4PnwfPgefA8eB48D54Hz8Qz8Uw8E8/EM/FMPBPPxDPxTDwTz8Qz8Uw8E8/EM/FMPBPPxDPxTDwTz8Qz8Uw8E8/EM/FMPBPPxDPxTDwTz8Qz8Uw8E8/EM/FMPBPPxDPxTDwTz8wz88w8M8/MM/PMPDPPzDPzzDwzz8wz88w8M8/MM/PMPDPPzDPzzDwzz8wz88w8M8/MM/PMPDPPzDPzzDwzz8wz88w8M8/MM/PMPDPPzDPzzDwzz5PnyfPkefI8eZ48T54nz5PnyfPk+Xr18ljxn8eH//NAccI+YZ+wT9gn7BP2CfuEfcI+YZ+wT9gn7BP2CfuEfcI+YZ+wT9gn7BP2CfuEfcI+YZ+wT9gn7BP2CfuEfcI+YZ+wT9gFdoFdYBfYBXaBXWAX2AV2gV1gFx/ewrPwLDwLz8Kz8Cw8C8/Cs/AsPAvPwrPwLDwLz8Kz8Cw8C8/Cs/AsPAvPwrPwLDwLz8Kz8Cw8C8/Cs/AsPAvPyrPyrDwrz8qz8qw8K8/Ks/KsPCvPyrPyrDwrz8qz8qw8K8/Ks/KsPCvPyrPyrDwrz8qz8qw8K8/Ks/KsPCvPyrPyrDwrz8qz8qw8K8/Ks/KsPCvPxrPxbDwbz8az8Ww8G8/Gs/FsPBvPxrPxbDwbz8az8Ww8G8/Gs/FsPBvPxrPxbDwbz8az8Ww8G8/Gs/FsPBvPxrPxbDwbz8az8Ww8G8/Gs/FsPBvPzrPz7Dw7z86z8+w8O8/Os/PsPDvPzrPz7Dw7z86z8+w8O8/Os/PsPDvPzrPz7Dw7z86z8+w8O8/Os/PsPDvPzrPz7Dw7z86z8+w8O8/Os/PsPDvPwXPwHDwHz8Fz8Bw8B8/Bc/AcPAfPwXPwHDwHz8Fz8Bw8B8/Bc/AcPAfPwXPwHDwHz8Fz8Bw8B8/Bc/AcPAfPwXPwHDwHz8Fz8Bw8B8/Bc/AcPAfPyXPynDwnz8lz8pw8J8/Jc/KcPCfPyXPynDwnz8lz8pw8J8/Jc/KcPF+vfvNAkervnicm68l6sp6sJ+vJerKerCfryXqynqwn68l6sp6sJ+vJerKerCfryXqynqwv1hfri/XF+mJ9sb5YX6wv1hfri/XF+mJ9sb5YX6wv1hfri/XF+mJ9sb5YXz67S8+l59Jz6bn0XHouPZeeS8+l59Jz6bn0XHouPZeeS8+l59Jz6bn0XHouPdcvPe2+7L7svuy+7L7svuy+7L7svuy+7L7svuy+7L7svuy+7L7svuy+7L7svuy+7L7svnlunpvn5rl5bp6b5+a5eW6em+fmuXlunpvn5rl5bp6b5+a5eW6em+fmuXlunpvn5rl5bp6b5+a5eW6em+fmuXlunpvn5rl5bp6b5+a5eW6em+fr1f/+L3g5vnw5Zf31bHT+/Pi47p9ej2Jfz0NfTkLv7tevp7UPXx5e7nr5+jfBSz5eCmVuZHN0cmVhbQplbmRvYmoKNSAwIG9iago8PC9UeXBlL09ialN0bS9OIDE5L0ZpcnN0IDEzNy9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE1NDI+PnN0cmVhbQp4nMVXa08bRxT9zq+YbwFFzM77UUVIYAdCExIU3EBlWWixp2Qr40XrRUr+fc8dL7A4LqGq1Fp+7DzuY+655861YYJ5JkVkiimn8MSMlAxvowWThpkQmbTMCcekY14ZJgML2jOFZaUDUxByFmODRw89Fo+RtOEdLdNMhYi92BGxpiXTAuJa49dgbPCG5jdvitH321Scltep+JyW9V0zTUv4Jtjn4iTNqvKg/jYWGDqpmI9qUgzqRZsW7XLsaBOL+TvQ96Q4a5u7aXtaNrSBiWL1BGewurcHY6dNPT1L7bg4HR6yYpS+taw4voHxg+530P0eT4q339qjs7ZsE+SONMWInDryFKasr7j4dPVnmrZYvwgIS16/QBg7e8UhXMXioaGQ0uKhpajmpxzYvC07NqraeWLb53Uzn12eV7N0Oaib28vzdHV5WDc3O+T57G6aGrYN199XLf/4dgSbXHPrNBdsePJFip1i0KSyrerFEH6z7eEvSigrgozSyGDErvCvhHi1U5zUs+d3ZKemJZPFwUnxER6U8zw12MdUnv8wQIA//Epf50xyTa/i5APiVJztMwCR1kQz0BSS4uzuqqUBzYjioFymPL2fX69HTbq6m35N7clZ8XYxrWfV4ro4ngHIqv2++64YpuU0LWbloiWp5Vh24I/q3xYVticm4wPgPzV6sDI6KOfVVVPtHtTz2YusKrFuVcmXWx08sfoyg+oHg3qDQfoi0aa6beuG+Enp9lyM710cHA9pC6lSNBjVR8fDk/L2wSmaPPu+bNPN8eKPGlY/p+tq2Tbf2fb+rL5KO8WnZpYanINt38vsQP3t7TzdEA8FOHE+RvUY2xi4NMZq8FpzFaSyE2YMGysfuFZCUywFs8JxbbxzE2YhFaziwgofJsxLKLGeS5QZyayx3EgBRmkXuctzJK+C5dI6ZVejaHhUMlAlExxqQNQta2AiOK+Y1Q6iVBQfFQumQ+DOk5ARhvtgM20fpVApuTdOxMmkGJ7DY/ETQOxTQDbl33+NiEAsEemgbTQ5Uii3wvJovdCARWNZK66UswSEZeOI3YSYg6SJmjurtMEwYigDNyTYKbJCAxof/YRtBYCmABWUG4wR07HxkccgDN0k3QIDLhygW9eDBIq05zbmXJCCPO6tASaLDHDBr5DWgMf56CL2Wjil4a/MPmaQfgaRewrRGln/T3QmdLng6OAMOKLzvWg5DqbBCVSIsbERsVOOjuAULgYEBbe1lUATAhNcvwgHMApEqxysYE0HgQMERC/ZgS4RRQH+dFA+6jbBc9zjFN+tnANAUQgdIeiI3cpyjRzRzCjFQZms4nEWqiLAtMFCgQ+ED3jqLR6NF9znoz1sR6JIhn5EKZgHfyNDY7E19ighQYX+zmwEnhnt7X2W9NYoL0BmDSEGX7mUeKRZjQCAwaZvU8ocTcmdE5nyBkGXOT8NypDTID92UZyUw2GomlC2gR0oDIAEAd2YbY+Jlocfy5u0qSofzsvrJTPFPt0CLYs6wEcTTHcvtGxXIbYSWe7R9qSbL8gELjQwKwbl7btUXX9F43MPbXHcInun+4trdBkiGz6gzmoXBTIiWtDmwHBBvJUioMxqlGQWDeDz4NgkixxW84QWz/947Ww61KbKtnYqb0XvPBh0J+nSs3cSp+WKAX97EikUtwQe25UoSav8DgE1G5VEI8vvC1r/KOFlR1mrAC87BcgUYjDmH50CvMiYPjkEeEcYhYeq1j/CWq9DnfQSTfIdnJHF+2q2HOcWYPJsY7LWbLB8//ZK4Ggw/P3L8PV+U5Xzk1GvB9GrrndDA7O3N9a5QZlstPukeq4VYG2etf5vy6pctSGKug1cQ4Yoq+mio9JFt84LPltZ1EHU0Y3kPBt71F/6YAJcFCiNXncmYqQaLqgm5b4l32H64QlaQGYIgHrdo5TiiTM0Y++V4F/Vag2jSf/qAeGfTegfs+58lZhGrIb4A5Xa6deube/lpXOG7Wr6tydQVuE8kvAxr2n8UKmE7bFByuKi22Rl6FW8DsucyOVNNSf0aG6nY4/oWKZVL9l195fpL01SCJQKZW5kc3RyZWFtCmVuZG9iagozNyAwIG9iago8PC9Sb290IDEgMCBSL0luZm8gMiAwIFIvSURbKDNjMzVhNzQwLTg4MDktNDc0YS1hNTlhLWIyYTNjZWI1ZGY0OSkgKDNjMzVhNzQwLTg4MDktNDc0YS1hNTlhLWIyYTNjZWI1ZGY0OSldL1R5cGUvWFJlZi9JbmRleFswIDM4XS9XWzEgNCA0XS9TaXplIDM4L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTUyPj5zdHJlYW0KeJxNjjEKwkAQRSeaNUaNUe9glUJFJMdIk9JjBHtrG08RsE7vOTyD6VIJFvoH5sMMLPv2/T+wovPDRCJtqY8RTtCbsCQIOkNhIJUvR2pyRlcfjQkxouRpnTD4TiBMCAkhJ0yxtdv6rRRmf/NmBnP4ejMnLAgZOseHfaN+GTSdQdv49RVMf/FmTdggep9tqzsZfO4Kf+U8FW8KZW5kc3RyZWFtCmVuZG9iagpzdGFydHhyZWYKNjM2MzIKJSVFT0YK", "display": "inline", "includeInDownload": "true", "signerMustAcknowledge": "no_interaction", "templateLocked": "false", "templateRequired": "false" } ], "emailSubject": "Please sign this document", "emailBlurb": "", "signingLocation": "Online", "authoritativeCopy": "false", "enforceSignerVisibility": "false", "enableWetSign": "true", "allowMarkup": "false", "allowReassign": "true", "customFields": { "textCustomFields": [ { "fieldId": "11230853228", "name": "ModelNamespace", "show": "false", "required": "false", "value": "docusign.forms._85443307_664c_4c85_882f_87671e153075._608a6c8a_16b2_4419_92f4_d06bc3af6e53" }, { "fieldId": "11230853229", "name": "ModelVersion", "show": "false", "required": "false", "value": "1" }, { "fieldId": "11230853230", "name": "ModelAccount", "show": "false", "required": "false", "value": "85443307-664c-4c85-882f-87671e153075" } ], "listCustomFields": [] }, "recipients": { "signers": [ { "defaultRecipient": "false", "tabs": { "signHereTabs": [ { "stampType": "signature", "name": "SignHere", "tabLabel": "Signature", "scaleValue": "1", "optional": "false", "documentId": "1", "recipientId": "1", "pageNumber": "1", "xPosition": "126", "yPosition": "374", "anchorString": "/SignHere/", "anchorXOffset": "20", "anchorYOffset": "10", "anchorUnits": "pixels", "anchorCaseSensitive": "false", "anchorMatchWholeWord": "true", "anchorHorizontalAlignment": "left", "anchorTabProcessorVersion": "v1_3", "tabId": "be01d0ca-1057-455f-9af6-95f6074b5cf6", "tabType": "signhere" } ], "dateSignedTabs": [ { "name": "DateSigned", "value": "", "tabLabel": "DateSigned", "localePolicy": {}, "documentId": "1", "recipientId": "1", "pageNumber": "1", "xPosition": "409", "yPosition": "396", "anchorString": "/Date/", "anchorXOffset": "20", "anchorYOffset": "10", "anchorUnits": "pixels", "anchorCaseSensitive": "false", "anchorMatchWholeWord": "true", "anchorHorizontalAlignment": "left", "anchorTabProcessorVersion": "v1_3", "tabId": "a0276278-95a3-4de2-a374-15e92510112e", "tabType": "datesigned" } ], "textTabs": [ { "requireAll": "false", "value": "", "originalValue": "", "required": "true", "locked": "false", "concealValueOnDocument": "false", "disableAutoSize": "false", "maxLength": "4000", "tabLabel": "FullName", "bold": "false", "italic": "false", "underline": "false", "localePolicy": {}, "documentId": "1", "recipientId": "1", "pageNumber": "1", "xPosition": "145", "yPosition": "234", "width": "0", "height": "0", "anchorString": "/FullName/", "anchorXOffset": "20", "anchorYOffset": "10", "anchorUnits": "pixels", "anchorCaseSensitive": "false", "anchorMatchWholeWord": "true", "anchorHorizontalAlignment": "left", "anchorTabProcessorVersion": "v1_3", "tabId": "c995df10-9141-4686-b9bf-f1dfc4121d33", "mergeFieldXml": "{\"adm\":{\"path\":\"ADM.Form.FullName\"}}", "tabType": "text" }, { "requireAll": "false", "value": "", "originalValue": "", "required": "true", "locked": "false", "concealValueOnDocument": "false", "disableAutoSize": "false", "maxLength": "4000", "tabLabel": "PhoneNumber", "bold": "false", "italic": "false", "underline": "false", "localePolicy": {}, "documentId": "1", "recipientId": "1", "pageNumber": "1", "xPosition": "167", "yPosition": "261", "width": "0", "height": "0", "anchorString": "/PhoneNumber/", "anchorXOffset": "20", "anchorYOffset": "10", "anchorUnits": "pixels", "anchorCaseSensitive": "false", "anchorMatchWholeWord": "true", "anchorHorizontalAlignment": "left", "anchorTabProcessorVersion": "v1_3", "tabId": "71ccfefa-5469-493e-b0c7-886c65b84742", "mergeFieldXml": "{\"adm\":{\"path\":\"ADM.Form.PhoneNumber\"}}", "tabType": "text" }, { "requireAll": "false", "value": "", "originalValue": "", "required": "true", "locked": "false", "concealValueOnDocument": "false", "disableAutoSize": "false", "maxLength": "4000", "tabLabel": "Company", "bold": "false", "italic": "false", "underline": "false", "localePolicy": {}, "documentId": "1", "recipientId": "1", "pageNumber": "1", "xPosition": "182", "yPosition": "315", "width": "0", "height": "0", "anchorString": "/Company/", "anchorXOffset": "20", "anchorYOffset": "10", "anchorUnits": "pixels", "anchorCaseSensitive": "false", "anchorMatchWholeWord": "true", "anchorHorizontalAlignment": "left", "anchorTabProcessorVersion": "v1_3", "tabId": "184f8a65-f2be-48b9-a30e-15592c59b335", "mergeFieldXml": "{\"adm\":{\"path\":\"ADM.Form.Company\"}}", "tabType": "text" }, { "requireAll": "false", "value": "", "originalValue": "", "required": "true", "locked": "false", "concealValueOnDocument": "false", "disableAutoSize": "false", "maxLength": "4000", "tabLabel": "JobTitle", "bold": "false", "italic": "false", "underline": "false", "localePolicy": {}, "documentId": "1", "recipientId": "1", "pageNumber": "1", "xPosition": "137", "yPosition": "342", "width": "0", "height": "0", "anchorString": "/Title/", "anchorXOffset": "20", "anchorYOffset": "10", "anchorUnits": "pixels", "anchorCaseSensitive": "false", "anchorMatchWholeWord": "true", "anchorHorizontalAlignment": "left", "anchorTabProcessorVersion": "v1_3", "tabId": "e7d30733-ce70-4fee-93a0-ea10ecc014b1", "mergeFieldXml": "{\"adm\":{\"path\":\"ADM.Form.JobTitle\"}}", "tabType": "text" } ], "checkboxTabs": [ { "name": "Yes", "tabLabel": "Yes", "selected": "false", "selectedOriginal": "false", "requireInitialOnSharedChange": "false", "bold": "false", "italic": "false", "underline": "false", "required": "true", "locked": "false", "documentId": "1", "recipientId": "1", "pageNumber": "1", "xPosition": "237", "yPosition": "288", "width": "0", "height": "0", "anchorString": "/SMS/", "anchorXOffset": "20", "anchorYOffset": "10", "anchorUnits": "pixels", "anchorCaseSensitive": "false", "anchorMatchWholeWord": "true", "anchorHorizontalAlignment": "left", "anchorTabProcessorVersion": "v1_3", "tabId": "0f1e242d-550d-4729-a141-de0dce1d1b6c", "mergeFieldXml": "{\"adm\":{\"path\":\"ADM.Form.Yes.Yes\"}}", "tabType": "checkbox" } ] }, "signInEachLocation": "false", "agentCanEditEmail": "false", "agentCanEditName": "false", "requireUploadSignature": "false", "name": "", "email": "", "recipientId": "1", "recipientIdGuid": "00000000-0000-0000-0000-000000000000", "accessCode": "", "requireIdLookup": "false", "routingOrder": "1", "note": "", "roleName": "signer", "completedCount": "0", "deliveryMethod": "email", "templateLocked": "false", "templateRequired": "false", "inheritEmailNotificationConfiguration": "false", "recipientType": "signer" } ], "agents": [], "editors": [], "intermediaries": [], "carbonCopies": [], "certifiedDeliveries": [], "inPersonSigners": [], "seals": [], "witnesses": [], "notaries": [], "recipientCount": "1" }, "envelopeIdStamping": "true", "autoNavigation": "true", "uSigState": "esign", "allowComments": "true", "disableResponsiveDocument": "true", "anySigner": null, "envelopeLocation": "current_site" } ] } diff --git a/examples/WebForms/eg002CreateRemoteInstance.ps1 b/examples/WebForms/eg002CreateRemoteInstance.ps1 new file mode 100644 index 0000000..7d65771 --- /dev/null +++ b/examples/WebForms/eg002CreateRemoteInstance.ps1 @@ -0,0 +1,87 @@ +. "utils/invokeScript.ps1" + +$apiUri = "https://apps-d.docusign.com/api/webforms/v1.1" +$configPath = ".\config\settings.json" +$tokenPath = ".\config\ds_access_token.txt" +$accountIdPath = ".\config\API_ACCOUNT_ID" + +# Get required variables from .\config\settings.json file +$config = Get-Content $configPath -Raw | ConvertFrom-Json +$signerName = $config.SIGNER_NAME +$signerEmail = $config.SIGNER_EMAIL + +$accessToken = Get-Content $tokenPath +$accountId = Get-Content $accountIdPath + +# Create template for the Web Form from the API +Invoke-Script -Command "`".\utils\createWebFormTemplate.ps1`"" + +$templateId = Get-Content -Path ".\config\WEB_FORM_TEMPLATE_ID" + +$webFormConfig = Get-Content -Raw demo_documents\web-form-config.json +$result = $webFormConfig -replace "template-id", $templateId +$result | Set-Content -Path demo_documents\web-form-config.json + +Write-Host "" +Write-Host "Go to your Docusign account to create the Web Form. Go to 'Templates' in your developer account, select 'Start,' select 'Web Forms,' and choose 'Upload Web Form.' Upload the JSON config file 'web-form-config.json' found under the demo_documents folder of this project. You will need to activate the web form before proceeding. Press any key to continue after doing so." +$choice = Read-Host + +#ds-snippet-start:WebForms2Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +$headers.add("Accept", "application/json") +#ds-snippet-end:WebForms2Step2 + +# List web forms in account that match the name of the web form we just created +#ds-snippet-start:WebForms2Step3 +$response = New-TemporaryFile +Invoke-RestMethod ` + -Uri "${apiUri}/accounts/${accountId}/forms?search=Web%20Form%20Example%20Template" ` + -Method 'GET ' ` + -Headers $headers ` + -OutFile $response + +$formId = $(Get-Content $response | ConvertFrom-Json).items[0].id +#ds-snippet-end:WebForms2Step3 + +#ds-snippet-start:WebForms2Step4 +$json = @" +{ + "sendOption": "now", + "formValues": { + "PhoneNumber": "555-555-5555", + "Yes": ["Yes"], + "Company": "Tally", + "JobTitle": "Programmer Writer" + }, + "recipients": [ + { + "roleName": "signer", + "name": "$signerName", + "email": "$signerEmail" + } + ] +} +"@ +#ds-snippet-end:WebForms2Step4 + +#ds-snippet-start:WebForms2Step5 +Invoke-RestMethod ` + -Uri "${apiUri}/accounts/${accountId}/forms/${formId}/instances" ` + -Method 'POST' ` + -Headers $headers ` + -Body $json ` + -OutFile $response + +$responseContent = $(Get-Content $response | ConvertFrom-Json) +#ds-snippet-end:WebForms2Step5 + +Write-Host "" +Write-Host "Creating a new remote instance of the web form..." +Write-Host "" +Write-Host "Response:" +Write-Host $responseContent + +Write-Output "" +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 9e8771a..154756e 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -1000,19 +1000,23 @@ function startWebForms { do { Enum listWebFormsExamples { createInstance = 1; - Pick_An_API = 2; + createRemoteInstance = 2; + Pick_An_API = 3; } $listWebFormsExamplesView = $null; do { Write-Output "" Write-Output 'Select the action: ' Write-Output "$([int][listWebFormsExamples]::createInstance)) Create_Instance" + Write-Output "$([int][listWebFormsExamples]::createRemoteInstance)) Create_Remote_Instance" Write-Output "$([int][listWebFormsExamples]::Pick_An_API)) Pick_An_API" [int]$listWebFormsExamplesView = Read-Host "Select the action" } while (-not [listWebFormsExamples]::IsDefined([listWebFormsExamples], $listWebFormsExamplesView)); if ($listWebFormsExamplesView -eq [listWebFormsExamples]::createInstance) { Invoke-Script -Command "`".\examples\WebForms\eg001CreateInstance.ps1`"" + } elseif ($listWebFormsExamplesView -eq [listWebFormsExamples]::createRemoteInstance) { + Invoke-Script -Command "`".\examples\WebForms\eg002CreateRemoteInstance.ps1`"" } } until ($listWebFormsExamplesView -eq [listWebFormsExamples]::Pick_An_API) startLauncher From 9f201110c7159f9746f09817f0df2dee8c4f1dbf Mon Sep 17 00:00:00 2001 From: inbargazit Date: Tue, 16 Sep 2025 11:40:50 -0700 Subject: [PATCH 461/462] Updating timeout to 24 hours --- examples/WebForms/eg001CreateInstance.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/WebForms/eg001CreateInstance.ps1 b/examples/WebForms/eg001CreateInstance.ps1 index a262787..59a2491 100644 --- a/examples/WebForms/eg001CreateInstance.ps1 +++ b/examples/WebForms/eg001CreateInstance.ps1 @@ -53,7 +53,7 @@ $json = @" "Company": "Tally", "JobTitle": "Programmer Writer" }, - "expirationOffset": 3600 + "expirationOffset": 24 } "@ #ds-snippet-end:WebForms1Step4 From 21f284d55e65b680f703bedcd5ac44f0ee52db81 Mon Sep 17 00:00:00 2001 From: Balaji Jayaraman Date: Wed, 1 Oct 2025 11:15:59 +0530 Subject: [PATCH 462/462] Added code snippets and codedepot markers for delete and undelete envelope howto --- .../eSignature/eg045DeleteRestoreEnvelope.ps1 | 152 ++++++++++++++++++ launcher.ps1 | 7 +- 2 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 examples/eSignature/eg045DeleteRestoreEnvelope.ps1 diff --git a/examples/eSignature/eg045DeleteRestoreEnvelope.ps1 b/examples/eSignature/eg045DeleteRestoreEnvelope.ps1 new file mode 100644 index 0000000..8b8114d --- /dev/null +++ b/examples/eSignature/eg045DeleteRestoreEnvelope.ps1 @@ -0,0 +1,152 @@ +$apiUri = "https://demo.docusign.net/restapi" + +# Delete and Undelete an Envelope + +# Get required environment variables from .\config\settings.json file +$variables = Get-Content .\config\settings.json -Raw | ConvertFrom-Json + + +# Obtain your OAuth token +# Note: Substitute these values with your own +$accessToken = Get-Content .\config\ds_access_token.txt + +# Set up variables for full code example +# Note: Substitute these values with your own +$accountId = Get-Content .\config\API_ACCOUNT_ID + +# temp files: +$requestData = New-TemporaryFile +$response = New-TemporaryFile + +$recycle_bin_folder_id = "recyclebin" + +Write-Output "Select the envelope ID to use for the delete and undelete operations." +if (Test-Path .\config\ENVELOPE_ID) { + $envelopeIdFromFile = Get-Content .\config\ENVELOPE_ID + + $userSavedEnvelope = Read-Host "Use the envelope ID from 'config/ENVELOPE_ID' (${envelopeIdFromFile})? (y/n)" + switch ($userSavedEnvelope.ToLower()) { + "y" { + $envelopeId = $envelopeIdFromFile + } + default { + $envelopeId = Read-Host "Please enter the new envelope ID" + } + } +} else { + $envelopeId = Read-Host "No envelope ID found. Please enter the envelope ID" +} + +if (-not $envelopeId) { + Write-Output "ERROR: No envelope ID was provided" + exit 1 +} + +Write-Output "Deleting the Envelope with ID: ${envelopeId}" +Write-Output "Sending PUT request to Docusign..." +Write-Output "Results:" + +#ds-snippet-start:eSign45Step2 +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.add("Authorization", "Bearer $accessToken") +$headers.add("Content-Type", "application/json") +#ds-snippet-end:eSign45Step2 + +# Concatenate the different parts of the request +#ds-snippet-start:eSign45Step3 +@{ + envelopeIds = @("$envelopeId") +} | ConvertTo-Json -Depth 32 > $requestData +#ds-snippet-end:eSign45Step3 + +# Create and send the folders request +#ds-snippet-start:eSign45Step4 +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/folders/${recycle_bin_folder_id}" ` + -Method 'PUT' ` + -Headers $headers ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response ` +#ds-snippet-end:eSign45Step4 + +Write-Output "The deleted envelope is now in your Docusign Recycle Bin." +Write-Output "You can check your web app to confirm the deletion." + +Read-Host "Press Enter to proceed with undeleting the envelope from the Recycle Bin..." +$destinationFolderName = Read-Host "Please enter the name of the folder to undelete the envelope to (e.g., 'Sent Items') or press Enter to use the default" + +if (-not $destinationFolderName) { + $destinationFolderName = "Sent Items" + Write-Output "The undeleted item will be moved to the Sent Items folder" +} + +Write-Output "Searching for folder with name: '${destinationFolderName}'..." + +#ds-snippet-start:eSign45Step5 +function Get-FolderIdByName { + param ( + [object]$folders, + [string]$targetName + ) + + foreach ($folder in $folders) { + # Check this folder + if ($folder.name -eq $targetName) { + return $folder.folderId + } + + # If this folder has subfolders, search inside them + if ($folder.folders) { + $result = Get-FolderIdByName -folders $folder.folders -targetName $targetName + if ($result) { + return $result + } + } + } + + return $null +} + +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/folders" ` + -Method 'GET' ` + -Headers $headers ` + -OutFile $response + +$folders = $(Get-Content $response | ConvertFrom-Json).folders +$folderId = Get-FolderIdByName -folders $folders -targetName $destinationFolderName +#ds-snippet-end:eSign45Step5 + +if (-not $folderId) { + Write-Output "ERROR: Could not find a folder with the name '${destinationFolderName}'. Please check the spelling." + exit 1 +} + +Write-Output "Found folder ID: ${folderId} for folder name: '${destinationFolderName}'" + +Write-Output "Undeleting the Envelope from Recycle Bin to the '${destinationFolderName}' folder." +Write-Output "Sending PUT request to Docusign..." +Write-Output "Results:" + +#ds-snippet-start:eSign45Step6 +@{ + envelopeIds = @("$envelopeId"); + fromFolderId = "$recycle_bin_folder_id" +} | ConvertTo-Json -Depth 32 > $requestData + +# Create and send the folders request +Invoke-RestMethod ` + -Uri "${apiUri}/v2.1/accounts/${accountId}/folders/${folderId}" ` + -Method 'PUT' ` + -Headers $headers ` + -InFile (Resolve-Path $requestData).Path ` + -OutFile $response +#ds-snippet-end:eSign45Step6 + +Write-Output "The envelope has been undeleted and is now in your '${destinationFolderName}' folder." + +# cleanup +Remove-Item $requestData +Remove-Item $response + +Write-Output "Done." diff --git a/launcher.ps1 b/launcher.ps1 index 154756e..09f1643 100644 --- a/launcher.ps1 +++ b/launcher.ps1 @@ -501,7 +501,8 @@ function startSignature { Document_Generation = 42; Shared_Access = 43; Focused_View = 44; - Pick_An_API = 45; + Delete_Restore_Envelope = 45; + Pick_An_API = 46; } $ApiExamplesView = $null; @@ -550,6 +551,7 @@ function startSignature { Write-Output "$([int][ApiExamples]::Document_Generation)) Document_Generation" Write-Output "$([int][ApiExamples]::Shared_Access)) Shared_Access" Write-Output "$([int][ApiExamples]::Focused_View)) Focused_View" + Write-Output "$([int][ApiExamples]::Delete_Restore_Envelope)) Delete_Restore_Envelope" Write-Output "$([int][ApiExamples]::Pick_An_API)) Pick_An_API" [int]$ApiExamplesView = Read-Host "Select the action" } while (-not [ApiExamples]::IsDefined([ApiExamples], $ApiExamplesView)); @@ -700,6 +702,9 @@ function startSignature { checkEmailAddresses Invoke-Script -Command "`".\examples\eSignature\eg044FocusedView.ps1`"" } + elseif ($ApiExamplesView -eq [ApiExamples]::Delete_Restore_Envelope) { + Invoke-Script -Command "`".\examples\eSignature\eg045DeleteRestoreEnvelope.ps1`"" + } } until ($ApiExamplesView -eq [ApiExamples]::Pick_An_API) startLauncher }

Continue