рдЗрдВрдЯреНрд░рд╛рдиреЗрдЯ рдХрд╛ рд╕рдВрдЧрдарди (рдЖрдИрдЯреА рдЙрддреНрдкрд╛рджрди рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рди)ред рднрд╛рдЧ 1 - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдореЗрд▓


рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ, рдХрд┐рд╕реА рднреА рдЖрдИрдЯреА рдХрдВрдкрдиреА (рдЖрдЙрдЯрд╕реЛрд░реНрд╕рд┐рдВрдЧ рдпрд╛ рдХрд┐рд░рд╛рдиреЗ) рдХреЛ рдЕрдкрдиреА рдЦреБрдж рдХреА рдЬрдЧрд╣ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ, рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдФрд░ рдмрд┐рдХреНрд░реА рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╛рд░реНрдп рдкрддреНрд░рд╛рдЪрд╛рд░ рдмрдирд╛рдП рд░рдЦреЗрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ / рд░рдгрдиреАрддрд┐рдпреЛрдВ / рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВред рдЕрдХреНрд╕рд░, рдРрд╕реА рдХрдВрдкрдирд┐рдпрд╛рдВ рдЦреБрдж рдХреЛ рд╕рдм рдХреБрдЫ рдХреЛрдб рдХрд░рдиреЗ рд▓рдЧрддреА рд╣реИрдВ рдпрд╛ рдмрд┐рдЯреНрд░рд┐рдХреНрд╕ 24 рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджреЗрдЦрд╛ рд╣реИред рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдореИрдВ рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛рдПрдХ рдмрд╛рдЗрдХ- рдкреНрд░реЛрд╕реЗрд╕ рдСрдЯреЛрдореЗрд╢рди рдореЗрдВ рдЕрдиреБрднрд╡ред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рд▓рдЧрднрдЧ рд╕рднреА рд╕реНрд╡рдпрдВ-рд╣реЛрд╕реНрдЯ, рдУрдкрдирд╕реЛрд░реНрд╕ рдФрд░ рд▓рдЧрднрдЧ рдмрд┐рдирд╛ рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред


Disclamer


рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрддрд╛рддреА рд╣реИ; рд▓реЗрдЦрдХ рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рдЖрдЧреНрд░рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ "рд╕рд╣реА" рд╣реЛрдиреЗ рдХрд╛ рдирд╛рдЯрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрдгрд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ 3 рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдВрдЧрдардиреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдЦрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╕реБрдЭрд╛рдиреЗ рдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд╕рд╣рд░реНрд╖ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ "рдЬреЛ рдЗрд╕реЗ рдЬрд╝рд░реВрд░рдд рд╣реИ" рдФрд░ "рдХреНрдпрд╛ рдмреИрд╕рд╛рдЦреА" рдЬреИрд╕реА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЛ рди рдХрд░реЗрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рди рдкрдврд╝реЗрдВ рдФрд░ рди рд╣реА рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░реЗрдВ

рддреЛ, рдПрдХ рд╕рдорд╛рди рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдПрдХ рдФрд╕рдд рдЖрдЙрдЯрд╕реЛрд░реНрд╕рд┐рдВрдЧ рдХрдВрдкрдиреА рдХреНрдпрд╛ рдЪрд╛рд╣рддреА рд╣реИ:


  1. рд╕реВрдЪрдирд╛ рддрдХ рдкрд╣реБрдВрдЪ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕
  2. GIT , , 1
  3. Chat-Server (Messenger ) 1
  4. , 1
  5. / HR
  6. -
  7. ( )

тАУ . - , - .



, " GIT ?", " ?" . .


, . , , LDAP . LDAP , , . 3 LDAP OpenLDAP , , , .


, RESTapi. , LDAP .


, OpenSource ERP/CRM (Odoo, Axellor ), OpenProject . , . - PHP, .


, EspoCRM. , " " , . , , CMS, .


.


, Espo :


  1. HR
  2. -
  3. (CRM :))


PHP .


:



CRM. .
( , ).


-> -> User ().
. ( ) :



, Skype, Telegram, VK, Facebook . (, ), , , , , ( ).


, .
/ .


-> -> -> .


- :



, , . , .
, - " " .


EspoCRM, . , - , - .

, . .



тАФ . , . , тАФ email.


тАФ self-hosted . , , . .. 1000 , web- RESTapi. , тАФ .


.


, , espo.


, , Node-RED.


Node-RED


, , .
Node-RED , : , - . , , , , .


Node-RED . , , API ..


API Token.


"-" - " URL ".



, .


. Directory API, , , :



( )


- :



, . , .
https://oauth.yandex.ru/authorize?response_type=token&client_id=<ID>,



.


, , Node-RED.



global.set('YaConnectToken', 'AgAAAA......');
return msg;

global.get() .


Inject , Flow 1. , . ,


Node-RED + .


  • Flow : inject, function, http request

  • inject, , , JSON
    {
    "userName":"testuser",
    "firstName":"Test",
    "lastName":"User",
    "emailAddress":"testuser@mydomain.ru",
    "dob":"1988-01-01",
    "gender":"male",
    "passwordConfirm":"12345678Eiru",
    "isActive":true
    }

.


  • function :
    const TOKEN = global.get('YaConnectToken');
    const user = msg.payload; //       
    const body = {
    'department_id': 1, // ID   .,    1
    'is_admin': false, //    
    'nickname': user.userName,
    'name': {
    'first': user.firstName,
    'last': user.lastName
    },
    'birthday': user.dob, // 'YYYY-MM-DD',
    'gender': user.gender, //'male/female/null'
    'password': user.passwordConfirm,
    'is_dismissed': user.isActive,
    'position': user.title // 
    }
    return {
    headers: {
    'Authorization': 'OAuth ' + TOKEN,
    //'X-Org-ID': 1234 //       .  : https://wilix.org/l/wlwrtj
    },
    payload: body
    }

.


  • http request, POST, url https://api.directory.yandex.net/v6/users/


  • Deploy inject ( JSON inject function )


  • , http request , msg statusCode 200 201 payload:



! !


EspoCRM Node-RED


( CRM) Node-RED .
PHP, .
UserSaved.php EspoCRM custom/Espo/Custom/Hooks/User :


<?php
namespace Espo\Custom\Hooks\User;

use Espo\ORM\Entity;

class UserSaved extends \Espo\Core\Hooks\Base {
  public function afterSave(Entity $entity, array $options = []) {
    $entityValues = $entity->getValues();
    unset($entityValues['password']);
    $entityValues['isNew'] = $entity->isNew();
    $data = array(
      'event' => 'afterSave',
      'entity' => $entityValues,
    );
    $this->_callRed($data);
  }

  public function afterRemove(Entity $entity, array $options = []) {
    $entityValues = $entity->getValues();
    unset($entityValues['password']);
    $data = array(
      'event' => 'afterRemove',
      'entity' => $entityValues
    );
    $this->_callRed($data);
  }

  private function _callRed($data) {
    $data_string = json_encode($data);
    $ch = curl_init('__NODE_RED_ENDPOINT__');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
    );
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
  }
}

Hook . ( ) , - // Espo, Node-RED. , Node-RED EspoCRM ( ) , localhost .
NODE_RED_ENDPOINT тАФ .


  • Node-RED : http in, http response, debug
  • http in

  • UserSaved.php NODE_RED_ENDPOINT _NODE_RED/user-event
  • Deploy Node-RED
  • EspoCRM ->
  • EspoCRM, ""
  • , Node-RED ( ) JSON
    {
    id: "5e430b3c59783cb41"
    name: "User Test"
    deleted: false
    isAdmin: false
    userName: "usertest"
    type: "regular"
    password: "GVhrB......"
    passwordConfirm: "oRM1..."
    authMethod: null
    salutationName: "Mr."
    firstName: "User"
    lastName: "Test"
    isActive: true
    isPortalUser: false
    isSuperAdmin: false
    title: "Frontend developer"
    emailAddress: null
    phoneNumber: null
    sendAccessInfo: false
    gender: "Male"
    createdAt: "2020-02-11 20:14:52"
    modifiedAt: "2020-02-11 20:14:52"
    dob: null
    inn: null
    emailAddressIsOptedOut: null
    phoneNumberIsOptedOut: null
    emailAddressData: array[0]
    phoneNumberData: array[0]
    defaultTeamId: null
    defaultTeamName: null
    teamsIds: array[0]
    teamsNames: object
    teamsColumns: object
    rolesIds: array[0]
    rolesNames: object
    portalsIds: array[0]
    portalsNames: object
    portalRolesIds: array[0]
    portalRolesNames: object
    createdById: "1"
    isNew: true
    }

isNew ,
passwordConfirm , .
, .


:


  • ( 2 )
  • function 2
    const user = msg.payload.entity;
    if (msg.payload.event != 'afterSave') { //      ,   
    return null
    }
  • Deploy
  • Espo ( )
  • , Node-RED JSON
  • :)


Node-RED. , . Flow, . ( ).


EspoCRM , , , .


:


  • self-hosted GIT ( GitLab :))
  • self-hosted Slack
  • HR .
  • .

рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди:
рдХреНрдпреВ: рдЕрдЧрд░ рдЕрдиреБрд░реЛрдз рд╕реАрдзреЗ PHP рд╕реЗ Yandex рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдиреЛрдб-рд▓рд╛рд▓ рдХреНрдпреЛрдВ рд╣реИ?
рдПрдХ: рдиреЛрдб-рд▓рд╛рд▓ рдкрдХреНрд╖ рдкрд░ рдПрдХреАрдХрд░рдг рд╣реЛрдиреЗ рд╕реЗ, рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдирдИ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рд╣реБрдХ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ (рдиреЛрдб-рд░реЗрдб рдкрд░ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ)ред рдЕрджреНрдпрддрдиреЛрдВ рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдмрдЯрди рдХреЗ рдиреАрдЪреЗ рдЖрддреА рд╣реИред

Source: https://habr.com/ru/post/undefined/


All Articles