Ни одна современная система электронного документооборота немыслима без возможности интеграции ее в существующее информационное пространство организации с помощью API или протоколов связи.



Не исключение и 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 позволяет пользователю (в данном случае, скорее, администратору) почувствовать всю гибкость ее эксплуатации и независимость при доступе к данным. Никаких ограничений!
Поделиться с друзьями
-->

Комментарии (0)