Ребят, помойму кто работал на данную контору. Нужна не большая помощь с их функционалом.
Ну на контору я не работал)) Но интеграцию делал для демо
От смотри, мы делаем примерно так:
1. There are two checkboxes on Booking record: DBC DS (DBC_DS__c) - Depot BC and DRA DS (DRA_DS__c) - Rental Agreement.
2. As soon as any of the checkboxes changed from false to true new custom trigger fires and calls appropriate method in the future class.
3. Initiated method collects all necessary data from Booking and sends HTTP json request to the DocuSign server through the API.
4. Based on sent data DocuSign generates template (which we set for each method in the custom setting) and sends e-mail (with embedded link) to the Client.
5. Using the link Client opens the Docusign wizard where fills all the necessary data and e-signature.
6. Once the document is signed, DocuSign using it's own DocuSign API call to SalesForce to update related to Booking record(s)
То есть ссылка на подпись приходит чуваку на почту.
Теперь же надо сделать так, что бы у нас была сразу ссылка после запроса что бы показать ее у нас на веб морде сразу.
Mike V там работает
Ну заюзайте Embedded Signing и он вернет в респонсе урл
Угу изучаем.
DocuSign слушает, в чем именно проблема?
Помощь пришла)
Немного выше описано как сейчас у нас все работает.
Задача получить линк на подпись сразу, без использования мыла.
Как я понял это можно сделать используя это: https://www.docusign.co.uk/developer-center/explore/features/embedding-docusign
Проблема возникла в том что бы добавить это к нашему решению.
Вам реально не лень такой код писать?
Ну в целом все Вы правильно понимаете, вот и наверху тут советуют, это embedded signing. Работает предельно просто:
1. Я так понимаю, если вы у вас "ссылка приходит чуваку на почту", значит envelope вы создали, то есть у вас есть envelope id.
2. Надо немножно поменять запрос, которым вы этот envelope создаете, а именно добавить поле clientId к тому signer, которого вы просите подписать.
3. Вызвать вот этот метод v2/accounts/:accountId/envelopes/:envelopeId/views/recipient, параметры должны быть такие (вы все знаете к этому моменту) accountId, envelopeId, authenticationMethod (="email" в Вашем случае), email, returnUrl (если надо), userName (это name signer'а), clientId (который вы назначили в шаге 2).
У нас нету примеров для Apex, но есть для (других языков), сама библиотека open source, просто посмотрите как она собирает REST запросы и сделайте так же.
Если еще вопросы есть или что-то не работает, спрашивайте, поможем.
DevNull ты аккуратнее с исходниками. А то боюсь устану удалять темы ![]()
отличная портянка! Наверное скопирована из REST клиента или из примеров и просто заменены нужные части на переменные
Всяко лучше чем плодить кучу классов ![]()
Ну в курилке то нормально, хотя по мне ближе к "Интеграции со сторонними сервисами".
Просто я бы это реализовал раза в 2-3 меньше по объему кода, но вы же все так любить быдлокодить. :p
Я вот удержался от комментария, а ты не смог:)
Для всех кто использует REST сервисы, если лень делать классы ручками можете воспользоваться Вот этим сайтом
Грес, ну зачем же так сурово. Вот мне тоже не сильно понравилась организация твоего кода.
https://github.com/SergeyTrusov/sf-apex-rest-api/tree/master/src/classes
Как по мне сильно перебор с абстракциями. Без документации и специальных курсов не обойтись.
Такая простая вещь как получить параметр из запроса и вернуть ответ как-то сильно замудренно выглядит
Вот так и пишутся проекты в которых потом хрен разберешься.
А тут хоть и много хардкода (согласен с решением wilder) зато любой школьник поймет что должно происходить.
KISS :D
Я тоже сначала удержался, но потом не смог не написать)
Я же по-дружески
Она там всего одна.
Я не хотел тебя задеть, но, как видимо, задел за живое.
Зато гибко, расширяемо и легко модифицируемо
Выше пример в 300 строк какой-то минимально функциональности, умнож это на количество фич * количество разработчиков * хотя бы на 3 года работы получишь классы в 50000 строк ну и попробуй в этом разобраться
Мне кажется, ты не совсем правильно понимаешь этот принцип, но не буду тебя огорчать)
</thread>
Ну вы ж меня знаете! Я люблю подискутировать, особенно на злободневные темы!
Я против абстракций потому что они зло! Вариантов их реализации море и каждого программиста свои предпочтения. Вот и получается что начинается за здравие а заканчивается за упокой (проекта).
Вот ты использовал какой-то паттерн проектирования - наплодил кучу зависимых классов и уверен что твой код идеален. А придет на проект такой как к я который нихера не шарит в абстрациях и начнет вносить изменения в первый попавщийся на глаза класс. Сделает кучу костылей, сломает всю твою красоту чтобы заработала одна маленькая фича где-так там далеко от этого класса. Зато отвалятся все фичи которые делал ты. Супер! Я вижу это каждый день!!! Сам пытаюсь подстраиваться под других программистов с их мега расширяемыми решениями и плююсь потом. Вот недавно было - мега расширяемое решение - отправка письма - 8 классов, связанных просто как паутина. Я целый день убил на то чтобы разобраться как эта хрень вообще работает и как внести изменения чтобы не сломать все. В итоге пришлось писать отдельную функцию аля того что выше без всякого гемора и танцев с бубнами. Я каждый раз удивляюсь что они там курят когда все это выдумывают.
По ходу это принципы!
"Расширяемость которая никогда не будет расширяться"
"Не повторяй себя, но сломай код другого"
Сорри друзья! Разбудили во мне опять троля, который не дает мне работать уже 2 часа
Извините если зацепил кого! Gres ;)?
Пошел бабки зарабатывать!
Друг, тесты тебя спасут)
Я уже давно знаю о твоем стиле написания кода.
На самом деле у меня аналогичный опыт, т.е. постоянно встречаюсь с людьми, у которых нет желания учиться, которые пишут все в 1 классе в 1 методе и довольны собой, они не думают не о поддержке их кода не о расширяемости. Через год они возвращаются к своему коду и по 2-3 дня не могут разобраться, что нужно сделать, чтобы исправить проблему.
Дима, фломастеры для всех разные, так что спорить тут не о чем.
Mike V, благодарю.
Всегда пожалста, если что не работает, спрашивайте, поможем.
Mike V, как можно с тобой связаться, к примеру по скайпу? Есть пару вопросов.
Пиши вопросы сюда, мне тоже будет интересно, тоже занимаюсь интеграцией с DocuSign
Ок, сформирую отпишу.
Вот у меня назрел вопрос.
Столкнулся с кастомизацией чужой недописанной которая не работает.
Надо починить.
То что есть:
На Docusign_Status__c добавили кастомное поле Lookup на объект Transaction вокруг вертится вся логика.
Т.е. генерируется PDF для записи Transaction который отсылается на Docusign на подпись. После подписи я вижу что создается Docusign Status как и должен но это поле lookup пустое. Но вокруг потом крутится много другой логики. Пытаюсь теперь найти как это поле вообще должно заполняться. По коду не нашел пока, так как с Docusign не сильно знаком, то смею предположить что сам пакет по каким-то настройкам это может сделать.
Если нет. То тогда вопрос. Я перехожу с объекта на Docusign страницу для отправки своего дока. Передается Id - все инфа подтягивается актуальная - тут все ок. Docusign Status уже создается по факту подписи. Как я могу привязать этот Status к моей записи?
Все оказалось СУПЕР просто
https://support.docusign.com/guides/dfs-admin-guide-add-ds-status-to-custom-object
Для разработки я использовал свой тестовый акк на Docusign, поэтому настроек акка с прода у меня естественно не оказалось. Теперь все работает ![]()
Я так понимаю, проблема решена. Сорри, поздно подошел?
Привет Mike V
Да, разобрался.
Кстати заметил не знаю баг или фича
У меня 2 дев орга и 1 акк тестовый на Docusign.
Интеграция настроена на 1 из них и при работе на втором все отлично отрабатывает, но Docusign Status приходит на первый орг. По ходу проверки нет с какого орга идут запросы?
Там настройка есть на стороне DocuSign c каким Salesforce org работать. Наверное в ней забит неправильный org.
Все правильно. Я и говорю что настройка есть и орг вбит неправильный.
Но я бы все-таки предусмотрел защиту от дурака (типа как от меня в данный момент
) что если запрос приходит с одного орга, то не надо ответ посылать на другой орг. В принципе реализация плевая - проверять орг id. Как я понял настройка интеграции происходит автоматически и инициируется со стороны SF. Можно в этот момент кроме кредов еще записывать org id и принимать запросы только с него.
Дайте немного поумничать ![]()
Да, мысль интересная, надо подкинуть нашим PMам.
Mike V,
Все вожусь с embedding-docusign.
Глянул примеры на других языках.
Все равно не догоняю(.
Если посмотреть на код который я давал в начале темы(и да, он до сих пор в таком виде:)) то понятно что мы отправляем на docusign тупо название полей с данными, данные авторизации и template ID. Сервис мапит поля по названию, вставляет в шаблон и отправляет письмо на почту с ссылкой на подпись. Задача стоит модернизировать запрос, что бы он не отправлял письмо, а сразу дал ссылку на подпись.
Так что надо добавить в данный запрос? Или все таки надо переделывать полностью(soap там и т.д)?
Большое спасибо. Разобрались.
Mike V, подскажи плиз, а на Docusign можно как-то зарегать акк для dev целей, чтобы не триальный был (бессрочный). А то я вроде нашел как триальный регать но он экспайрится. Не хочется через каждый месяц регать новый.
Есть Developer account, он не должен expire. Вот ссылка. Вот тут подробно описано в чем разница. Но по сути DocuSign Developer Account это Salesforce Development org. Почти все фичи включены (кроме sms аутентикации и еще чето-то хитрого), но Developer Account это только для разработки (легальной силы подписанные документы не имеют).
Mike спасибо! Выручил!
Mike, помоги еще с одним моментом.
Есть ли возможность возвращаться на кастомную страницу (какой нибудь retUrl) после того как docusign отработает отправку документа. Сейчас пользователя редиректит на стандартную страницу объекта.
Я так понимаю речь про посылку документа на подпись (ну это когда нужно drag'n'drop поле подписи, инициалы и т.п.). Это описано тут.
Вкратце так, надо в запрос POST /accounts/{accountId}/envelopes/{envelopeId}/views/sender включить тело
{
"returnUrl": "https://www.docusign.com/devcenter"
}.Всем привет,
Mike, расскажи плис есть ли решение для более частного случая применения returnUrl. А именно для страницы dsfs__DocuSign_CreateEnvelope на стороне SalesForce.
Мы вызываем эту страницу из нашей кастомной страницы. И, после отсылки документов на подпись, нам нужно в эту же кастомную страницу вернуться
Mike, расскажи плис есть ли решение для более частного случая применения returnUrl. А именно для страницы dsfs__DocuSign_CreateEnvelope на стороне SalesForce.
Мы вызываем эту страницу из нашей кастомной страницы. И, после отсылки документов на подпись, нам нужно в эту же кастомную страницу вернуться
Увы, к сожалению такой возможности нет. С этой страницы всегда возвращаются на той Salesforce объект, с которого все начиналось. Если только plugin для браузера написать :)
Может мы неправильно используем эту страницу?
Этот способ придумали до прихода нашей команды на проект и ему уже много лет.
Может есть более изящный способ?
Есть кастомная страница и кастомный объект. На странице есть кнопка Send PDF. По ее нажатию и происходит вся магия со страницей dsfs__DocuSign_CreateEnvelope - формируется урл с Id записи к которой приатачивается PDF (а также еще куча других параметров, толком не уверен в их значении). Собственно после этого как на вашей странице отправляется документ надо вернуться обратно.
Мне кажется это распространенный use case
Как одно из "ленивых" решений можно написать Route VFP для Detail View Source Object. Т.е. при возвращении из Create Envelope на detail view будет происходить редирект на кастомную страницу. Это решение приемлемо если это самое detail view никому кроме админов и разработчиков не нужно.
Если посмотреть более радикально на этот вопрос то можно воспользоваться вебсервисом (детальное описание как можно найти здесь https://salesforceradical.blogspot.com/2016/04/docusign-salesforce-integration.html). В этом случаи документ будет отправляться сразу, т.е. мы никуда не будем уходить с нашей кастомной странички
А как пользователь сможет "оформить" документ - расставить маркеры на подпись. Если это не нужно, то конечно смысла в редиректе нет особого.