Organisation des Intranets (Automatisierung der IT-Produktion). Teil 1 - Benutzer und Mail


Früher oder später hat jedes IT-Unternehmen (Outsourcing oder Lebensmittelgeschäft) den Wunsch, einen eigenen Bereich zu organisieren, in dem Sie Informationen zu Projekten, Mitarbeitern und Verkäufen speichern können. Pflegen Sie die Arbeitskorrespondenz und besprechen Sie Aufgaben / Strategien / Dokumente. Meistens beginnen solche Unternehmen, alles selbst zu codieren oder haben etwas für Bitrix24 usw. gesehen. In dieser Artikelserie werde ich über unsere sprechenein Fahrrad- Erfahrung in der Prozessautomatisierung. Wie erwartet, fast alle selbst gehostet, OpenSource und versuchen, fast ohne Codierung zu tun.


Disclamer


Eine Reihe von Artikeln beschreibt ein Beispiel für die Implementierung von Infrastruktur, der Autor drängt nicht darauf, dies zu wiederholen, und gibt nicht vor, in solchen Ansätzen "korrekt" zu sein. Einige Teile des beschriebenen Systems werden tatsächlich und erfolgreich in mehreren Organisationen für 3 Jahre verwendet. Der Autor nimmt gerne Vorschläge zur Verbesserung des Systems oder Vorschläge für alternative Lösungen an. Bitte züchten Sie keine Diskussionen wie "Wer braucht das?" Und "Welche Krücken", die nicht brauchen, lesen Sie nicht und stören Sie die Kommentatoren nicht

Was kann ein durchschnittliches Outsourcing-Unternehmen von einem ähnlichen System erwarten:


  1. Datenbank von Mitarbeitern mit Verteilung der Zugriffsrechte auf Informationen
  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:
F: Warum ist Node-RED ĂĽberhaupt, wenn die Anfrage direkt von PHP an Yandex gestellt werden kann?
A: Durch die Integration auf der Node-RED-Seite können wir die Konfiguration ändern, neue Dienste und Hooks zu Benutzeränderungen hinzufügen, ohne zusätzliche Codierung (ohne die kleinen Funktionen auf Node-RED). Das Bereitstellen von Updates erfolgt auf eine Schaltfläche.

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


All Articles