Ни одна современная система электронного документооборота немыслима без возможности интеграции ее в существующее информационное пространство организации с помощью API или протоколов связи.
Не исключение и easla.com.
Прежде всего, easla.com позволяет сотрудникам организации авторизоваться несколькими способами. Первый, разумеется, авторизация с помощью учетной записи easla.com. Второй, авторизация с помощью социальных сетей. И третий, авторизация с помощью домена организации. Да-да, онлайн система позволяет авторизоваться через домен! Не шучу.
Очевидно, что для авторизации через домен организации, администратор должен произвести соответствующую настройку в easla.com и в самом домене. В домене рекомендуется создать доп. пользователя, который обладает ограниченным набором прав достаточных для чтения данных о пользователях и только. Открыть порт или прокинуть туннель к домену. Администратор домена должен сам решить для себя, что проще, удобнее и безопаснее.
На стороне easla.com необходимо прописать IP домена, логин и пароль, а также путь для доступа к пользователям. Проверить соединение и, если оно удачно, то осуществить импорт пользователей из домена. Если пользователи уже созданы, то можно не импортировать, хотя импорт упрощает жизнь администратору на порядок.
Кстати, при импорте пользователей, импортируется не только фамилия, имя, отчество, логин и эл. почта, но и все необходимые атрибуты, а также должность и отдел.
Импорт из LDAP наглядно отображает ранее импортированных пользователей, их состояние (заблокирован или нет). Кроме этого, содержит гиперссылку на существующий аккаунт в easla.com. В случае, когда на стороне домена произведено много изменений, скажем, произошла «массовая миграция» пользователей из одних кабинетов в другие и изменились их номера телефонов и номера кабинетов, обновить данные в системе можно одной кнопкой «Обновление всех импортированных пользователей».
Все с заботой об администраторе!
Конечно, easla.com обладает своим почтовым сервером, но отправленные с его помощью письма будут от имени одного и того же виртуального пользователя. Но большинство сотрудников приучены или привыкли отвечать на входящие сообщения не глядя на адрес отправителя и невзирая на предупреждение, что этого делать ненужно. В итоге, письма уходят в никуда.
Можно научить пользователей адекватно воспринимать почтовые сообщения от системы, но можно поступить иначе – использовать почтовый сервер организации. Настройка easla.com позволяет указать имя почтового сервера организации, порт, логин и пароль. После чего, если в функции sendEmail будет заполнен параметр from, то письмо будет уходить от почтового сервера организации, а если параметр from не указан, то от почтового сервера easla.com.
Система easla.com предоставляет всем зарегистрированным администраторам и пользователям доступ к данным по протоколу SOAP. Описание функций можно найти по ссылкам (только для авторизованных пользователей и администраторов):
https://easla.com/ru/admin/soap
https://easla.com/ru/user/soap
Разумеется, доступ к данным для администратора и пользователя – разный. Пользователь даже через SOAP не сможет обратиться к объекту, к которому у него нет прав доступа, а администратор обладает полномочиями получить данные обо всех объектах.
Использовать SOAP можно самыми разными способами. Например, с помощью скрипта на VBScript:
Используя EaslaAgent установленный на рабочем месте пользователя можно писать модули и самостоятельные приложения на C# — ныне очень популярный язык программирования. Авторизацию пользователя агент возьмет на себя, что упрощает жизнь программисту. Все обращения к easla.com агент тоже преобразует в правильные запросы.
Кстати, агент предоставляет возможность отображения диалогового окна с перечнем полученных объектов, чтобы не «городить» его в каждом приложении снова и снова. Выглядит окошко примерно так:
Фрагмент кода, который получает перечень объектов из easla.com и показывает их в диалоговом окне:
Напоследок добавлю, что easla.com умеет интегрироваться в MS SQL с помощью CLR-модуля. Установив Easla.com module for MS SQL, можно прямо из SQL запроса запрашивать данные из easla.com, обрабатывать и передавать, скажем, в локально используемые системы или в отчеты.
Простой пример:
Резюмируя, повторюсь, только по-настоящему открытая система имеет право на жизнь в нынешних условиях и easla.com позволяет пользователю (в данном случае, скорее, администратору) почувствовать всю гибкость ее эксплуатации и независимость при доступе к данным. Никаких ограничений!
Не исключение и easla.com.
Авторизация и импорт пользователей
Прежде всего, easla.com позволяет сотрудникам организации авторизоваться несколькими способами. Первый, разумеется, авторизация с помощью учетной записи easla.com. Второй, авторизация с помощью социальных сетей. И третий, авторизация с помощью домена организации. Да-да, онлайн система позволяет авторизоваться через домен! Не шучу.
Очевидно, что для авторизации через домен организации, администратор должен произвести соответствующую настройку в easla.com и в самом домене. В домене рекомендуется создать доп. пользователя, который обладает ограниченным набором прав достаточных для чтения данных о пользователях и только. Открыть порт или прокинуть туннель к домену. Администратор домена должен сам решить для себя, что проще, удобнее и безопаснее.
На стороне easla.com необходимо прописать IP домена, логин и пароль, а также путь для доступа к пользователям. Проверить соединение и, если оно удачно, то осуществить импорт пользователей из домена. Если пользователи уже созданы, то можно не импортировать, хотя импорт упрощает жизнь администратору на порядок.
Кстати, при импорте пользователей, импортируется не только фамилия, имя, отчество, логин и эл. почта, но и все необходимые атрибуты, а также должность и отдел.
Импорт из LDAP наглядно отображает ранее импортированных пользователей, их состояние (заблокирован или нет). Кроме этого, содержит гиперссылку на существующий аккаунт в easla.com. В случае, когда на стороне домена произведено много изменений, скажем, произошла «массовая миграция» пользователей из одних кабинетов в другие и изменились их номера телефонов и номера кабинетов, обновить данные в системе можно одной кнопкой «Обновление всех импортированных пользователей».
Все с заботой об администраторе!
Почтовый сервер
Конечно, easla.com обладает своим почтовым сервером, но отправленные с его помощью письма будут от имени одного и того же виртуального пользователя. Но большинство сотрудников приучены или привыкли отвечать на входящие сообщения не глядя на адрес отправителя и невзирая на предупреждение, что этого делать ненужно. В итоге, письма уходят в никуда.
Можно научить пользователей адекватно воспринимать почтовые сообщения от системы, но можно поступить иначе – использовать почтовый сервер организации. Настройка easla.com позволяет указать имя почтового сервера организации, порт, логин и пароль. После чего, если в функции sendEmail будет заполнен параметр from, то письмо будет уходить от почтового сервера организации, а если параметр from не указан, то от почтового сервера easla.com.
SOAP
Система easla.com предоставляет всем зарегистрированным администраторам и пользователям доступ к данным по протоколу SOAP. Описание функций можно найти по ссылкам (только для авторизованных пользователей и администраторов):
https://easla.com/ru/admin/soap
https://easla.com/ru/user/soap
Разумеется, доступ к данным для администратора и пользователя – разный. Пользователь даже через SOAP не сможет обратиться к объекту, к которому у него нет прав доступа, а администратор обладает полномочиями получить данные обо всех объектах.
Использовать SOAP можно самыми разными способами. Например, с помощью скрипта на VBScript:
Получение списка исходящих писем из easla.com
Function EaslaSoapLogin(userName, password)
Dim strSoap
strSoap = "<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">" & Chr(13) & _
"<s:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">" & Chr(13) & _
"<login xmlns=""User"">" & Chr(13) & _
"<username>" & userName & "</username>" & Chr(13) & _
"<password>" & password & "</password>" & Chr(13) & _
"</login>" & Chr(13) & _
"</s:Body>" & Chr(13) & _
"</s:Envelope>"
EaslaSoapLogin = strSoap
End function
Function EaslaSoapLogout()
Dim strSoap
strSoap = "<s:Envelope xmlns:s=""http://schemas.xmlsoap.org/soap/envelope/"">" & Chr(13) & _
"<s:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">" & Chr(13) & _
"<logout xmlns=""User""/>" & Chr(13) & _
"</s:Body>" & Chr(13) & _
"</s:Envelope>"
EaslaSoapLogout = strSoap
End function
Function EaslaSoapOutgoings()
Dim strSoap
strSoap = "<?xml version=""1.0"" encoding=""UTF-8""?>" & Chr(13) & _
"<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">" & Chr(13) & _
"<soap:Body>" & Chr(13) & _
"<getObjectrefs xmlns=""User"">" & Chr(13) & _
"<objectdef>" & Chr(13) & _
"<id>234</id>" & Chr(13) & _
"<pid>118</pid>" & Chr(13) & _
"</objectdef>" & Chr(13) & _
"<attributerefs>" & Chr(13) & _
"<item>crs_management_outgoing_regnum</item>" & Chr(13) & _
"<item>crs_management_outgoing_document</item>" & Chr(13) & _
"<item>crs_management_outgoing_attachments</item>" & Chr(13) & _
"</attributerefs>" & Chr(13) & _
"<conditions>" & Chr(13) & _
"<item>" & Chr(13) & _
"<key>status</key>" & Chr(13) & _
"<values>" & Chr(13) & _
"<item>crs_management_outgoing_created</item>" & Chr(13) & _
"</values>" & Chr(13) & _
"</item>" & Chr(13) & _
"</conditions>" & Chr(13) & _
"</getObjectrefs>" & Chr(13) & _
"</soap:Body>" & Chr(13) & _
"</soap:Envelope>"
EaslaSoapOutgoings = strSoap
End function
Function EaslaLogin(login, password)
Dim URL
URL = "https://easla.com/ru/user/soap/ws/1"
Dim strSoapReq
strSoapReq = EaslaSoapLogin(login, password)
Dim oHttp
Set oHttp = CreateObject("Msxml2.XMLHTTP")
oHttp.open "POST", URL, false
oHttp.setRequestHeader "Content-Type", "application/soap+xml"
oHttp.setRequestHeader "charset", "utf-8"
oHttp.send strSoapReq
Dim strResult
strResult = oHttp.responseText
'проверка, ошибка или корректный результат?
dim regExp
Set regExp = CreateObject("VBScript.RegExp")
regExp.Multiline = True
regExp.Pattern = "<ns1:loginResponse><loginResult>(.*)</loginResult></ns1:loginResponse>"
'Wscript.Echo strResult
Set matches = regExp.Execute(strResult)
if matches.count = 0 then
EaslaLogin = false
Exit Function
end if
EaslaLogin = (matches(0).SubMatches(0) = "true")
End Function
Function EaslaLogout
Dim URL
URL = "https://easla.com/ru/user/soap/ws/1"
Dim strSoapReq
strSoapReq = EaslaSoapLogout()
Dim oHttp
Set oHttp = CreateObject("Msxml2.XMLHTTP")
oHttp.open "POST", URL, false
oHttp.setRequestHeader "Content-Type", "application/soap+xml"
oHttp.setRequestHeader "charset", "utf-8"
oHttp.send strSoapReq
Dim strResult
strResult = oHttp.responseText
'проверка, ошибка или корректный результат?
dim regExp
Set regExp = CreateObject("VBScript.RegExp")
regExp.Multiline = True
regExp.Pattern = "<ns1:logoutResponse><logoutResult>(.*)</logoutResult></ns1:logoutResponse>"
'Wscript.Echo strResult
Set matches = regExp.Execute(strResult)
if matches.count = 0 then
EaslaLogout = false
Exit Function
end if
EaslaLogout = (matches(0).SubMatches(0) = "true")
End Function
Function EaslaOutgoings(ByRef ids, ByRef descriptions)
Dim URL
URL = "https://easla.com/ru/user/soap/ws/1"
Dim strSoapReq
strSoapReq = EaslaSoapOutgoings()
Dim oHttp
Set oHttp = CreateObject("Msxml2.XMLHTTP")
oHttp.open "POST", URL, false
oHttp.setRequestHeader "Content-Type", "application/soap+xml"
oHttp.setRequestHeader "charset", "utf-8"
oHttp.send strSoapReq
Dim strResult
strResult = oHttp.responseText
'проверка, ошибка или корректный результат?
dim regExp
Set regExp = CreateObject("VBScript.RegExp")
regExp.Multiline = True
regExp.Pattern = "<faultstring>(.*)</faultstring>"
Set matches = regExp.Execute(strResult)
if matches.count = 1 then
EaslaOutgoings = false
Exit Function
end if
EaslaOutgoings = ParseXMLToOutgoingsArray(Progress, strResult, ids, descriptions)
End function
Sub Reverse( ByRef myArray )
Dim i, j, idxLast, idxHalf, strHolder
idxLast = UBound( myArray )
idxHalf = Int( idxLast / 2 )
For i = 0 To idxHalf
strHolder = myArray( i )
myArray( i ) = myArray( idxLast - i )
myArray( idxLast - i ) = strHolder
Next
End Sub
Function ParseXMLToOutgoingsArray(progress, strXML, ByRef ids, ByRef descriptions)
Dim xmlDoc
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = false
Dim ret
ret = xmlDoc.loadXML(strXML)
if (xmlDoc.parseError.errorCode <> 0) then
Dim myErr
Set myErr = xmlDoc.parseError
ThisApplication.AddNotify "Ошибка при разборе XML " + myErr.reason
end if
dim nodeList
Set nodeList = xmlDoc.SelectNodes("//getObjectrefsResult/item")
Dim cnt, q, n
cnt = nodeList.length
q = 0
For Each node In nodeList
dim id
'id = id_node.getElementsByTagName("value").item(0).Text
id = node.getElementsByTagName("id").item(0).Text
dim description
description = node.getElementsByTagName("description").item(0).Text
n = UBound(ids)
if (n < 0) Then n = 0
ReDim Preserve ids(n + 1)
ReDim Preserve descriptions(n + 1)
ids(UBound(ids)) = id
descriptions(UBound(descriptions)) = description
q = q + 1
Next
Call Reverse(ids)
Call Reverse(descriptions)
ParseXMLToOutgoingsArray = q
End Function
Dim auth
auth = EaslaLogin("ORGANIZATION_CODE\User_login", "User_password")
if (auth = false) then
MsgBox "Авторизация на easla.com не пройдена. Неверное имя пользователя или пароль!", vbCritical
Exit Sub
end if
Dim ids
Dim descriptions
Dim success
success = EaslaOutgoings(ids, descriptions)
Call EaslaLogout
С#
Используя EaslaAgent установленный на рабочем месте пользователя можно писать модули и самостоятельные приложения на C# — ныне очень популярный язык программирования. Авторизацию пользователя агент возьмет на себя, что упрощает жизнь программисту. Все обращения к easla.com агент тоже преобразует в правильные запросы.
Кстати, агент предоставляет возможность отображения диалогового окна с перечнем полученных объектов, чтобы не «городить» его в каждом приложении снова и снова. Выглядит окошко примерно так:
Фрагмент кода, который получает перечень объектов из easla.com и показывает их в диалоговом окне:
var result = EaslaApp.getObjectrefs(object_def,
new string[] { "crs_management_incoming_contragent_regnum" },
new Easla.KeyValuesPairSoap[]
{
new Easla.KeyValuesPairSoap() {key = "status", values = new string[] {"crs_management_incoming_created"} },
new Easla.KeyValuesPairSoap() {key = "isdeleted", values = new string[] {"0"} }
});
var m = EaslaApp.ShowSelectObjectDialog(result,
new Easla.KeyValuePairSoap[]
{
new Easla.KeyValuePairSoap() { key = "Описание", value = "description"},
new Easla.KeyValuePairSoap() { key = "Дата создания", value = "createtime"},
new Easla.KeyValuePairSoap() { key = "Статус", value = "status.name"},
new Easla.KeyValuePairSoap() { key = "Регистрационный номер отправителя", value = "attributerefs[0].values[0].values[0]"}
}) as Easla.ObjectrefComplexSoap;
SQL
Напоследок добавлю, что easla.com умеет интегрироваться в MS SQL с помощью CLR-модуля. Установив Easla.com module for MS SQL, можно прямо из SQL запроса запрашивать данные из easla.com, обрабатывать и передавать, скажем, в локально используемые системы или в отчеты.
Простой пример:
select @logined = [master].[dbo].[EASLAlogin](пользователь,пароль)
IF (@logined = 1) BEGIN
-- получение идентификаторов организации, процесса и объекта по их обозначениям
SELECT @organization_id = organization.id, @process_id = process.id, @objectdef_id = objectdef.id
FROM [master].[dbo].[EASLAgetOrganization] ('TNGP') AS organization
LEFT JOIN [master].[dbo].[EASLAgetAllProcesses] () AS process ON process.oid = organization.id
LEFT JOIN [master].[dbo].[EASLAgetAllObjectdefs] () AS objectdef ON objectdef.pid = process.id
WHERE process.code = 'crs_management' AND objectdef.code = 'crs_management_outgoing';
SELECT attributerefs.value('(ArrayOfAttributerefSimpleSoap[1]/AttributerefSimpleSoap[1]/values/item/node())[1]','varchar(30)') as letternum ,attributerefs.value('(ArrayOfAttributerefSimpleSoap[1]/AttributerefSimpleSoap[2]/values/item/node())[1]','varchar(30)') as regdate ,cast(attributerefs.query('(ArrayOfAttributerefSimpleSoap[1]/AttributerefSimpleSoap[3]/values/item/consist/item/revdata)')as varchar(max)) as revguid ,cast([status].query('(StatusSimpleSoap[1]/name[1]/node())')as varchar(max)) as sentstatus
FROM master.[dbo].[EASLAgetobjectrefs]( @process_id, @objectdef_id,CAST(' <attributerefs> <item>crs_management_outgoing_regnum</item> <item>crs_management_outgoing_sentdate</item> <item>crs_management_outgoing_attachments</item> </attributerefs> ' AS XML) ,
' <conditions> <item> <key>status</key> <values><item>crs_management_outgoing_created</item></values> </item> </conditions>',
@user_id –- какой-то пользователь
);
END
IF (@logined = 1) BEGIN
select @logined = 1 - [master].[dbo].[EASLAlogout]()
END
Итоги
Резюмируя, повторюсь, только по-настоящему открытая система имеет право на жизнь в нынешних условиях и easla.com позволяет пользователю (в данном случае, скорее, администратору) почувствовать всю гибкость ее эксплуатации и независимость при доступе к данным. Никаких ограничений!