Organisation de l'intranet (automatisation de la production informatique). Partie 1 - Utilisateurs et courrier


Tôt ou tard, toute entreprise informatique (sous-traitance ou épicerie) souhaite organiser son propre espace où vous pouvez stocker des informations sur les projets, les employés et les ventes. Maintenir une correspondance de travail et discuter des tâches / stratégies / documents. Le plus souvent, ces entreprises commencent à tout coder elles-mêmes ou ont vu quelque chose pour Bitrix24, etc. Dans cette série d'articles, je parlerai de notreun vélo- expérience en automatisation de processus. Comme prévu, presque tous sont auto-hébergés, opensource et essaient de le faire presque sans codage.


Disclamer


Une série d'articles décrit un exemple de mise en œuvre d'infrastructures, l'auteur n'encourage pas à répéter et ne prétend pas être «correct» dans de telles approches. Certaines parties du système décrit sont effectivement et avec succès utilisées dans plusieurs organisations pendant 3 ans. L'auteur accepte volontiers les suggestions pour améliorer le système ou suggérer des solutions alternatives. Veuillez ne pas créer de discussions comme "qui en a besoin" et "quelles béquilles", qui n'en ont pas besoin, ne lisent pas et n'interfèrent pas avec les commentateurs

Alors, que peut demander une entreprise d'externalisation moyenne à un système similaire:


  1. Base de données des employés avec répartition des droits d'accès à l'information
  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 .
  • .

FAQ:
Q: Pourquoi Node-RED est-il du tout si la demande peut être faite directement de PHP à Yandex?
R: Ayant une intégration du côté Node-RED, nous pouvons changer la configuration, ajouter de nouveaux services et hooks, aux changements d'utilisateurs, sans codage supplémentaire (sans compter les petites fonctions sur Node-RED). Le processus de déploiement des mises à jour se résume à un bouton.

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


All Articles