Low-code розробка за допомогою Power Automate для продуктів Microsoft Dynamics 365

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

У своєму житті ми намагаємося максимально спростити та автоматизувати повсякденні процеси, так само і бізнес прагне зменшити навантаження рутинної роботи для працівників.

ERP-система Microsoft Dynamics 365 Business Central вже значною мірою спрощує взаємодію користувача с бізнес-процесами, оптимізуючи велику кількість процесів. Ми хочемо навести приклад як за допомогою взаємодії Microsoft Power Automate та Dynamics 365 Business Central можна використати нові шляхи автоматизації, не створюючи складних розробок у ERP-системі.

Power Automate — рішення, яке належить до родини застосунків Microsoft Power Platform. Воно створене для автоматизації певних бізнес-процесів шляхом створення розширених, але водночас спрощених робочих циклів керування різними сутностями між різними застосунками, зокрема, підтримує багато сценаріїв взаємодії застосунків з екосистеми Microsoft.

Важливо, що Power Automate не потребує знання окремої мови програмування. Здебільшого налаштування відбувається у вигляді конструювання блок-схем з елементами Low Code/No Code. Використавши можливості Power Automate, зможемо автоматизувати специфічні процеси з мінімальними технічними знаннями в галузі програмування і, як наслідок, оптимізувати фінансові витрати.

Для нашого прикладу розглянемо класичний для усіх компанії процес — Відпустка. А саме сценарій, коли співробітник хотів би отримати дозвіл від Керівника на відпустку в певний період.

Картки співробітників, сутність відпустки та його складові (тип, кількість днів, прикази, тощо) обліковуються в ERP-системі Microsoft Dynamics 365 Business Central. Співробітнику необхідно сповістити свого Керівника про терміни відпусти та тип відпусти.

Для цього співробітнику необхідно буде зайти в Business Central, перейти до документа «Наказ про відпустку», правильно його заповнити та відправити на затвердження до керівника. Залучення Power Automate потрібно для автоматизації вищезазначеного процесу без необхідності мати ліцензію ERP-системи та вміння працювати в ній.

Двигуном для автоматизації процесу буде Power Automate, але, крім нього, ми плануємо задіяти також застосунки Microsoft Forms та Microsoft Outlook, які входять до будь-якого стандартного пакету Microsoft (Office) 365.

Отже, алгоритм реалізації наступний.

Спочатку ми можемо спростити заповнення даних для Співробітника. Для цього нам ідеально підходить Microsoft Forms. Буквально за 10-15 хвилин ми створюємо форму, яка покриває всі потреби Співробітника щодо запиту.

Наступним кроком нам необхідно перенести дані, які ми отримаємо з форми до Business Central. У цьому нам допоможе Power Automate. Завдяки великій кількості елементів інтеграцій, ми можемо працювати з більшістю популярних сервісів, використовуючи вже готову функціональність.

Спочатку нам необхідно створити Flow. Це набір визначених нами інструкцій, які можуть запускатися періодично, в залежності від визначеної нами події або користувачем.

Для створення нового Flow нам необхідно перейти My Flows та обрати New Flow.

Тут ми можемо обрати тип нашого Flow або створити Flow з Шаблонів. Шаблони пропонують нам вже створенні Flow, які ми можемо змінити під свої потреби. Нам потрібно створити новий Flow, який буде запускатися коли користувач заповнить форму для цього нам потрібно брати Automated cloud flow.

Нам необхідно надати назву нашому Flow та обрати тригер, за яким він буде запускатися. Скориставшись пошуком, ми можемо знайти відповідні тригери, які працюють з Microsoft Forms. Цей тригер буде відстежувати, чи була заповнена наша форма та запускати наш Flow. Переглянути інформацію про кожен тригер та його можливості можна, скориставшись відповідною іконкою для кожного конкретного тригера.

Обравши тригер, ми потрапляємо до робочої області, де будемо будувати тіло Flow, розташовуючи функціональні або логічні блоки.

Якщо ми вперше використовуємо інтеграцію з Microsoft Forms, спочатку нам необхідно підключити наш акаунт, який має доступ до нашої форми.

Залогінившсь, ми отримаємо доступ до налаштування нашого тригера. Нам необхідно заповнити поле Form Id, щоб обрати форму, яку ми будемо відстежувати. Система автоматично пропонує доступні форми, з акаунта під яким ми авторизувалися.

Тепер наш Flow автоматично буде запускатися, якщо хтось заповнить форму. Нам потрібно додати логіку отримання та обробки даних, які ми отримуємо з форми. Для цього ми додаємо новий функціональний блок натиснувши на іконку + під нашим тригером.

Система запропонує нам обрати, який саме блок ми хочемо додати. У нашому випадку нас цікавить блоки пов’язані з Microsoft Forms, оскільки наш тригер отримує лише унікальний ID відповіді з форми. У пошуку вводимо Forms та отримуємо блоки які ми можемо обрати. Нас цікавить інтеграція з Microsoft Forms, ми можемо натиснути See more та переглянути всі доступні функції у розрізі цієї інтеграції.

У нас доступний лише один варіант — Get response details. Саме він нам і потрібен, щоб отримати дані з нашої форми. Обираємо його та переходимо до налаштувань цього блоку.

Нам необхідно вказати з якою формою ми працюємо, система самостійно запропонує нам список доступних форм, де ми зможемо обрати нашу форму.

У полі Response Id нам необхідно вказати ID запису, який нам прийшов у тригері. Щоб вказати цей ID, ми можемо скористатися підказкою системи. Перша кнопка — це Dynamic Content, яка зберігає і дає можливість обрати змінну або дані які присутні у нашому Flow. Другий варіант — це Expression, потужний функціонал, який дозволяє працювати з даними за допомогою коду.

Нас цікавить Dynamic Content, де нам доступний Response ID з нашого тригера, який ми автоматично отримуємо, коли користувач відправляє форму.

Нам вдалось отримати дані з форми. Тепер сформуймо лист до нашого Керівника і заодно подивимось, які дані нам вдалося отримати з форми. Для цього ми використаємо інтеграцію з Outlook. Додамо блок з Outlook.

У нашому випадку краще обрати Send email with options, оскільки ми відправляємо Керівнику запит на Відпустку, який він може прийняти або відхилити, тому ми хочемо отримати відповідь від Керівника і відносно цієї відповіді ухвалювати відповідні рішення.

У налаштування нам необхідно вказати кому будуть відправлятися листи. Це може бути статична пошта або текстова змінна, яку ми можемо отримати в логічному блоці. Оскільки в нас в формі є поле Пошта керівника, лист ми будемо відправляти на пошту вказану в цьому полі. Для цього нам необхідно обрати в Dynamic Content відповідні данні, які нам вдалося дістати за допомогою блоку Get response details.

Після заповнення всіх даних наша карта виглядає так. У полі Body ми вказали текст який буде вкладений у лист, використовуючи HTML та дані з блоку Get response details. У полі Subject можна вказати тему листа. У полі User Optin — ми визначено доступні відповіді від Керівника.

Спробуймо протестувати, що нам вдалося зробити. Для цього нам потрібно зберегти наш Flow та переконатися, що наш новий Flow працює.

Повернемось до нашої форми та спробуємо її заповнити.

Після того, як ми надіслали форму, на вказану пошту має прийти повідомлення такого вигляду.

Оскільки ми обрали блок для повідомлення Send email with options, у нашого Керівника є фіксований набір відповідей доступних у листі, який в нашому випадку виглядає як «Затвердити» або «Відхилити», і система буде очікувати відповідь, щоб продовжити своє виконання. Для цього нам знадобиться блок Condition з Control.

Блок Condition допоможе розділити наш Flow залежно від відповіді Керівника. Відповідь Керівника ми можемо отримати, обравши з блоку Send email with options змінну SelectedOption.

Порівнювати цю змінну ми будемо з однією з доступних опції, які ми визначили в листі, наприклад, «Затвердити».

Тепер ми можемо визначити, які дії будуть відбуватися якщо Керівник обрав «Затвердити» (гілка True) та «Відхилити» (гілка False).

Проінформуймо нашого співробітника про відповідь його Керівника. У нас є пошта працівника, який заповнював форму, тому ми можемо відправити йому лист з відповіддю. У гілці True додамо блок Send an email, вказавши почту нашого співробітника з Get response details та додамо тему листа і відповідь.

Аналогічний блок додамо в гілку False, змінивши текст повідомлення на «Відпустка Відхилена».

Тепер ми можемо повернутися до нашого листа на пошті та від лиця Керівника затвердити відпустку.

А нашому працівнику буде відправлений відповідний лист.

На цьому перший етап можна вважати завершеним. Ми змогли отримати дані з Forms і попрацювати з ними в Power Automate. Наступний етап — це перенести ці дані в Business Central. Розглянувши доступні блоки в Power Automate в секції інтеграції з Business Central, ми отримуємо доволі великий список функціональних блоків, і всі вони працюють з Business Central за допомогою API.

API у Business Central — це сторінка с з типом API, де ми можемо винести поля з таблички на яку орієнтована сторінка, описати логіку заповнення полів та багато іншого. Оскільки ми працюємо з кастомними табличками для створення документа на відпустку, нам необхідно створити кастомну API сторінку для них. Тут ми можемо піти двома шляхами.

  1. Створити класичну API-сторінку яка буде орієнтована на таблицю. У цьому випадку ми зможемо винести поля, які нас цікавлять і нам будуть доступі запити GET, POST, PATCH, DELETE.
  2. Написати функцію, яку ми зможемо викликати через API, передавши необхідні параметри та описавши логіку в самій функції.

Я пропоную розглянути спосіб № 2, оскільки в нашому випадку нам потрібна лише одна конкретна дія — створити документ на відпустку. Переглядати, видаляти або змінювати інші документи на відпустку не входить в наші плани.

Розглянемо структуру нашого документа на відпустку.

Документ розділений на дві частини:

  • загальна інформація про документ;
  • інформація про співробітників та їх відпустку.

Нас цікавить заповнення другої частини документа, оскільки саме в ції частині нам необхідно заповнити інформацію про співробітника та інформацію про саму відпустку. Перша частина документа відходить на другий план, оскільки система автоматично може заповнити всі потрібні поля.

Перейдемо до створення API сторінки та функції яка допоможе нам заповнити нашу другу частину документа. Створимо звичайну API сторінку. APIVersion, APIPublisher, APIGroup, EntityName та EntitySetName — ці властивості впливатимуть на вашу кінцеву точку запиту.

https://api.businesscentral.dynamics.com/v2.0/<Tenant Id>/<Environment Name>/api/<API Publisher>/<API Group>/<API Version>/companies(<Company System Id>)/<Entity Set Name> 

У SourceTable у нас буде таблиця Integer, оскільки ми будемо лише викликати функцію і поля таблиці нас не цікавлять.

page 50101 "Power Automate Procedure"
{
    APIGroup = 'powerAutomate';
    APIPublisher = 'powerAutomate';
    APIVersion = 'v2.0';
    DelayedInsert = true;
    EntityName = 'powerAutomateProcedure';
    EntitySetName = 'powerAutomateProcedures';
    PageType = API;
    SourceTable = Integer;
    SourceTableView = where("Number" = filter(= 1));
 
    layout
    {
        area(content)
        {
            repeater(General)
            {
            }
        }
    }

Далі нам необхідно створити функцію, яку ми зможемо викликати через API.

Параметр [ServiceEnabled] помічає, що функцію можливо викликати через API. У саму функцію ми будемо передавати параметри, які ми отримали з нашої форми.

Напишемо код, який буде створювати заголовок документа, та створювати лінію з інформацією про відпустку з нашої форми. Знайдемо потрібного співробітника через його пошту, створимо заголовок документа та заповнимо лінію відпусти даними які ми отримали з форми.

    [ServiceEnabled]
    procedure CreateVacationOrderFromPowerAutomate(EmployeeEmail: Text[100]; StartingDate: Date; EndingDate: Date): Text
    var
        CRTHPVacationHeader: Record "CRTHP Vacation Header";
        CRTHPVacationLine: Record "CRTHP Vacation Line";
        Employee: Record Employee;
    begin
        Employee.SetRange("Company E-Mail", EmployeeEmail);
        if Employee.FindFirst() then begin
            CRTHPVacationHeader.Init();
            CRTHPVacationHeader.Insert(true);
            CRTHPVacationLine.Init();
            CRTHPVacationLine.Validate("Document No.", CRTHPVacationHeader."No.");
            CRTHPVacationLine.Validate("Employee No.", Employee."No.");
            CRTHPVacationLine.Validate("Starting Date", StartingDate);
            CRTHPVacationLine.Validate("Ending Date", EndingDate);
            CRTHPVacationLine.Insert();
            exit('Vacation Order created')
        end
        else
            exit('Employee''s email was not found')
    end;
}

Тепер ми можемо повернутися до Power Automate та додати блок Run action (V3).

Нам необхідно обрати наш Environment та Компанію, де будуть створюватися наші документи на відпустку. В API Category потрібно вказати або обрати дані, які ви вказали, коли створювали API сторінку з APIPublisher та APIGroup.

Action Name — заповнюємо назвою функцію, яку ми збираємось використовувати. В Number передаємо «1», оскільки для нашої сторінки SourceTable вказана таблиця Integer. Далі заповнимо параметри функції значеннями, які ми отримали з нашої форми.

Зберігаємо наш Flow та спробуємо знову заповнити нашу форму, але вже з акаунту нашого працівника Ester Henderson.

Отримуємо повідомлення на пошту та погоджуємо відпустку.

Співробітник отримує повідомлення про затвердження відпустки, а система створює відповідний документ.

На цьому наша маленька оптимізація завершена, цей Flow можна модернізувати, додавши додаткові перевірки, повідомлення та оформлення повідомлень. Усе залежить тільки від поставлених цілей та креативності.


Дякую всій команді ERP розробників Clarity Ukraine, що долучилися до цієї креативної реалізації. Були раді поділитися зі спільнотою DOU нашим досвідом.

👍ПодобаєтьсяСподобалось11
До обраногоВ обраному7
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Тут не зовсім Low-code, навіть багато коду. Я б запропонував більш легкий варіант- використовувати тільки стандарт зовсім без розробки. Для цього є стандартні сторінки, наприклад Absence Registration, та інші більш зручні функції.

Шавновний Олександре, дякую Вам за коментар! Я би сказав, рішення, в тому числі необхідність написання коду, залежить від мети. В даному випадку на основі 4 значень на формі MS Forms у Business Central створюється і заповнюється повноцінний наказ на відпустку.
Якщо ж мета створити запис в таблиці Absence Registration, то так, рішення такого рівня задачі буде без коду.

У діскусіях породжується істина. Ще раз уточнюю, що тут не low-code — це рішення не для більшості -якщо немає розробників, то користувачам потрібно йти до інтеграторів і саме тут зникає уся простота рішення Power Automate.
Додам ще два моменти, що зразу падають в очі:
— користувач сам обирає хто йому затвердить заяву, що невірно з т.з. Business Central -в ньому э готові рішення Робочі процеси з типом Power Automate (у нової версії ВС зяявиться ще додатковий функціонал) та самі затвердження є у Power Automate (замість використання поштового листа з опцією)
— Power Automate має вбудований функціонал створення інтеграцій на базі штучного інтелекту -ШІ зразу пропонує як побудувати процесс затвердження відпусток ;) - інакше, ніж тут описано.

У прикладах коду форматування зламане

Підписатись на коментарі