==WORKFLOW ENGINE==
===
[TOC]
# ==:book: ĐỊNH NGHĨA VÀ MÔ TẢ ĐỐI TƯỢNG==
:::info
* **Workflow** là việc quy trình hóa thứ tự các bước, các tác vụ, các sự kiện để thực hiện một công việc nào đó trong thực tế.
* **Workflow** bao gồm một chuỗi các hoạt động, chẳng hạn như tạo các bản ghi, thông báo cho người dùng về các phê duyệt đang chờ xử lý hoặc chạy các tập lệnh.
* **Workflow** có thể có nhiều đối tượng cùng tham gia.
:::
# ==:book: MỤC TIÊU==
:::info
* Mô hình hóa một cách trực quan và rõ ràng các luồng điều khiển dữ liệu của một quy trình ứng dụng cụ thể (Input, Processing, Output).
* Kiểm tra logic quy trình, trực quan hóa, truy vết khi thực thi.
* Cho phép phối hợp làm việc giữa con người và phần mềm bằng các loại giao diện tương tác khác nhau (Web-form, Mobile App, ...)
:::
# ==:book: THÀNH PHẦN==
:::info
|Thành phần|Mô tả|
|:---:|---|
|WF OBJECT|Là đối tượng đầu vào và được coi là đối tượng xuyên suốt trong Workflow. Ví dụ: Đơn nghỉ phép, 1 báo cáo,KPI, ...|
|WF SCOPE|Là phạm vi áp dụng của đối tượng: KĐN, TCT, Local, ... Giống phạm vi áp dụng của phân quyền|
|WF CONDITION|Là điều kiện để Trigger Workflow. WF CONDITION có thể bao gồm WF SCOPE và trạng thái của đối tượng,...|
|ACTIVITY|Các node thành phần chứa các xử lý bên trong Workflow. Một ACTIVITY bao gồm nhiều ACTION và nhiều TRANSITION|
|ACTION|Là các hành động được thực thi trong ACTIVITY hoặc TRANSITION như Phê duyệt, Gởi email, ...|
|TRANSITION|Là sự chuyển tiếp giữa 2 ACTIVITY, xảy ra khi TRIGGER được kích hoạt và thỏa mãn một số CONDITION|
|TRIGGER|Là sự kiện được kích hoạt để kiểm tra điều kiện của các TRANSITION trên 1 ACTIVITY.|
|COMMAND|Là một loại TRIGGER cho phép người dùng tương tác vào (VD: Button).|
|CONDITION|Là các điều kiện, biểu thức logic để kiểm tra so sánh|
<!--
|CONNECTOR|Là đối tượng dùng để điều hướng luồng đi giữa 2 Activity|
|WF CONDITION|Là điều kiện để đối tượng được nạp vào Workflow ==[Tuu.Pham]: Bản chất của đối tượng này cũng là 1 Activity==|
-->
:::
# ==:book: QUY TRÌNH THỰC HIỆN==
:::info
```flow
st=>start: Start-WF
e=>end: End-WF
op1=>operation: Start Activity
op2=>operation: Go to Next Activity
op3=>subroutine: Do Activity
cond=>condition: Is End Activity ?
st->op1->op2->cond
cond(yes)->e
cond(no)->op3->op2
```
:::
## ==:bulb: Do Activity==
:::warning
```flow
st=>start: Start-Activity
e=>end: End-Activity
op1=>subroutine: Do Actions (Pre)
op2=>subroutine: Waiting Trigger
op3=>operation: Get Matching Transition
op4=>subroutine: Do Actions (Post-Transitions)
op5=>operation: Check Assignment
cond=>condition: Match conditions ?
st->op5->op1->op2->op3->cond(yes)->op4->e
cond(no)->op2
```
:::
## ==:bulb: Do Action==
:::warning
```flow
st=>start: Start-Actions
e=>end: End-Actions
op1=>operation: [Pause WF]
op2=>operation: Get next Action
op3=>subroutine: Excute Action
cond=>condition: Not Action ?
cond1=>condition: Pause-WF ?
st->op2->cond
cond(yes)->e
cond(no)->op3->cond1
cond1(no)->op2
cond1(yes)->op1(left)
```
:::
## ==:bulb: Excute Action==
:::warning
```flow
st=>start: Start-Execute
e=>end: End-Excute
op1=>operation: Execute Action
op2=>inputoutput: Set Return Value
op3=>subroutine: Do Action
op4=>operation: Go to Next Activity
op5=>operation: Go to Next Transition
cond=>condition: Complete ?
cond1=>condition: Out Max Retry ?
st->op1->cond->e
cond(yes)->op2->e
cond(no)->cond1
cond1(yes)->op2->e
cond1(no)->op1
```
:::
<!--
## ==:bulb: Do Transition==
:::info
```flow
st=>start: Start-Transition
e=>end: End-Transition
op1=>operation: Check Trigger
op2=>operation: Check Condition
op3=>subroutine: Do Action
op4=>operation: Go to Next Activity
op5=>operation: Go to Next Transition
cond=>condition: OK ?
cond1=>condition: OK ?
st->op1->cond
cond(yes)->op2->cond1
cond(no)->op5->op1
cond1(yes)->op3->op4->e
cond1(no)->op5->op1
```
:::
-->
# ==:book: CÁC TOÁN TỬ DÙNG TRONG WORKFLOW==
:::info
|Toán tử|Mô tả|
|---|---|
|AND|Toán tử VÀ|
|OR|Toán tử HOẶC|
|>|Toán tử LỚN HƠN|
|>=|Toán tử LỚN HƠN HOẶC BẰNG|
|=|Toán tử BẰNG|
|<|Toán tử NHỎ HƠN|
|<=|Toán tử NHỎ HƠN HOẶC BẰNG|
|BETWEEN|Toán tử so sánh TRONG KHOẢNG|
|NOT BETWEEN|Toán tử so sánh NGOÀI KHOẢNG|
|IN|Toán tử so sánh TRONG DANH SÁCH|
|NOT IN|Toán tử so sánh NGOÀI DANH SÁCH|
:::
# ==:book: MÔ TẢ THÀNH PHẦN==
## ==:bulb: WF OBJECT (ĐỐI TƯỢNG DỮ LIỆU)==
### ==:pencil2: Mô tả==
:::info
* Là các đối tượng dữ liệu tác động vào **Workflow** và xuyên suốt trong **Workflow**.
* Đối tượng dữ liệu là thành phần không thể thiếu trong **Workflow**. Đối tượng dữ liệu có thể là tác nhân quy định các hành vi, thuộc tính, dữ liệu ra/vào của từng **Activity/Action** trong **Workflow**.
:::
### ==:pencil2: Thành phần==
:::info
|Phân loại|Mô tả|
|---|---|
|Internal Data|Là đối tượng dữ liệu do hệ thống định nghĩa cho mỗi **Workflow**.|
|External Data|Các tham số Đầu vào/Đầu ra của **Workflow/Activity** được truyền từ ngoài vào trong **Workflow**.|
<!--
|User Define data|Là đối tượng dữ liệu do hệ thống định nghĩa cho mỗi **Workflow**. Các thuộc tính của đối tượng này do người định nghĩa **Workflow** quy định.|
-->
:::
#### ==:information_source: Internal Data==
:::info
* Là đối tượng dữ liệu do hệ thống định nghĩa cho mỗi **Workflow**.
* Các thuộc tính của đối tượng là không thay đổi.
* Thông thường, đối tượng này là đối tượng quy định dữ liệu đầu vào cho **Workflow** và xuyên suốt trong **Workflow**.
* VD: Một **Workflow** đặt hàng online thì khi bắt đầu **Workflow** cần phải cung cấp đối tượng thông tin sđơn hàng với các thuộc tính như Mã đơn hàng, Mã sản phẩm, Số lượng, Đơn giá, ...
:::
<!--
#### ==:information_source: User Define Data==
:::info
* Là đối tượng dữ liệu do người quản trị **Workflow** định nghĩa.
* Ở mỗi **Workflow/Activity** khác nhau có thể định nghĩa đối tượng User defined data khác nhau để phục vụ cho từng quy trình nghiệp vụ cũng như yêu cầu tham số đầu vào/đầu ra cụ thể.
:::
-->
#### ==:information_source: External Data==
:::info
* Các tham số Đầu vào/Đầu ra của **Workflow/Activity** được truyền từ ngoài vào trong **Workflow**.
* Có thể Đầu ra (Output) của **Workflow/Activity** này sẽ là đầu vào (Input) của **Workflow/Activity** khác.
:::
## ==:bulb: WF SCOPE==
---
### ==:pencil2: Mô tả==
:::info
* Là phạm vi áp dụng của **Workflow**: KĐN, TCT, Local, … Giống phạm vi áp dụng của phân quyền.
:::
### ==:pencil2: Thành phần==
:::info
* Tập đối tượng dữ liệu để xác định phạm vi áp dụng của WF.
* Phạm vi áp dụng có thể là:
* Orgchart
* User
* Role
:::
### ==:pencil2: Đặc điểm==
:::info
* Đối với các Workflow có WF SCOPE bị chồng chéo dữ liệu thì ưu tiên lấy Workflow có thiết lập nhỏ hơn.
:::
## ==:bulb: WF CONDITION==
---
### ==:pencil2: Mô tả==
:::info
* Là các tập **Trigger** - **Condition** để Start **Workflow**.
* **WF CONDITION** bao gồm **WF SCOPE** và trạng thái của đối tượng.
:::
### ==:pencil2: Thành phần==
:::info
* **Trigger**: Là sự kiện dùng để kích hoạt việc kiểm tra điều kiện trong **Transition** để Start WF.
* **Condition**: Là tập các điều kiện logic để start WF. **Condition** có thể bao gồm nhiều điều kiện logic.
:::
### ==:pencil2: Đặc điểm==
:::info
:zap: N/A
:::
## ==:bulb: COMMAND==
### ==:pencil2: Mô tả==
:::info
* Là một loại **Trigger** chứa những chỉ thị hành động ở mỗi **Transition**.
* **Command** do người quản trị định nghĩa trong **Workflow**.
* Thông thường việc định nghĩa đối tượng **Command** là việc định nghĩa ra từng nút lệnh thao tác sẽ xuất hiện ở mỗi **Activity** trong **Workflow**.
:::
### ==:pencil2: Thành phần==
:::info
* **Command** bao gồm 2 thành phần chính:
* Các thuộc tính liên quan đến đối tượng **Command** như Code, Name.
* Các trường thông tin yêu cầu cung cấp dữ liệu (hoặc tự động gán giá trị) khi người dùng thao tác lên **Command** đó trên **Activity**.
* Các trường thông tin yêu cầu cung cấp dữ liệu ở **Command** có thể bị ghi đè hoặc định nghĩa lại khi ở mỗi **Transition**.
:::
### ==:pencil2: Đặc điểm==
:::info
* Mỗi **Command** có thể có hoặc không có định nghĩa các trường thông tin cần cung cấp dữ liệu khi người dùng tương tác lên **Command**.
* Không thể xóa được khi **Command** đã được sử dụng ở một **Transition** nào đó.
:::
## ==:bulb: CONDITION==
### ==:pencil2: Mô tả==
:::info
* Là tập hợp các biểu thức logic để kiểm tra so sánh.
:::
### ==:pencil2: Thành phần==
:::info
* **Condition** bao gồm 2 thành phần chính:
* Biểu thức Logic
* Giá trị tham chiếu
* **Condition** có các loại sau:
* AND/OR Group: Biểu thức logic với điều kiện VÀ / HOẶC
* Action Condition: Các hành động được định nghĩa sẵn trong **Workflow**.
:::
### ==:pencil2: Đặc điểm==
:::info
:zap: N/A
:::
## ==:bulb: TRIGGER==
### ==:pencil2: Mô tả==
:::info
* Là thành phần của **Transition** dùng để quy định phương thức kích hoạt **Transition** thực thi.
* **Trigger** kết hợp với **Condition** là thành phần chính để điều hướng luồng đi của **Activity** trong **Workflow**.
:::
### ==:pencil2: Thành phần==
:::info
* **Trigger** có 2 thành phần cơ bản:
* Loại trigger
|Phân loại|Mô tả|
|---|---|
|Auto|Tự động chạy|
|Command|Tác động lên đối tượng command|
|Timer|Hẹn giờ|
|Wait|Chờ đợi WF khác hay tác vụ khác thực hiện xong|
* Giá trị tham chiếu.
* Tùy vào mỗi loại **Trigger** mà hệ thống có những phản ứng khác nhau.
:::
### ==:pencil2: Định nghĩa các loại Trigger==
#### ==:information_source: Auto==
:::info
* Là loại **Trigger** tự động chạy mà không cần có cần có sự tác động gì.
* Thông thường loại **Trigger** này dùng để thực thi các tác vụ mặc định.
:::
#### ==:information_source: Command==
:::info
* Là loại **Trigger** được kích hoạt thực thi khi có sự tác động lên đối tượng **Command** được định nghĩa trong **Workflow**.
* Thông thường loại **Trigger** này được sử dụng vào các tác vụ cần có sự tương tác hành động với người dùng (Phê duyệt, Từ chối, Hoàn tất).
:::
#### ==:information_source: Timer==
:::info
* Là loại **Trigger** kích hoạt thực thi theo một chu kỳ thời gian nhất định.
* Các thuộc tính:
* Chu kỳ: Minutes, Hours, Daily, Weekly, Monthly, Yearly.
* Tần suất hoạt động
* Số lần loop tối đa
* Thông thường loại **Trigger** này được sử dụng vào các tác vụ nhắc nhở hay những tác vụ có tính chất lặp đi lặp lại theo một chu kỳ nhất định.
:::
#### ==:information_source: Wait==
:::info
* Là loại **Trigger** được kích hoạt thực thi khi một **Activity** khác trong Workflow hiện tại hoặc một Workflow khác hoàn tất.
* Có 2 loại:
* Wait for Activity: chờ đợi một **Activity** khác trong cùng **Workflow** thực thi xong.
* Wait for WF: Chờ đợi một **Workflow** khác thực thi xong.
:::
## ==:bulb: ACTION==
### ==:pencil2: Mô tả==
:::info
* Là các tác vụ chịu trách nhiệm thực thi logic.
* Action là thành phần của **Activity** và **Transition**.
:::
### ==:pencil2: Thuộc tính chung==
:::info
* Action có những thuộc tính chung và những thuộc tính riêng tùy vào từng loại Action.
* Bảng mô tả các thuộc tính chung của 1 **Action**:
|Tên thành phần|Mô tả|
|---|---|
|Loại Action|Hệ thống quy định 2 loại Action: System Action và User Action|
|Đối tượng thực thi|Là các đối tượng được quyền thao tác, tác động lên **Action**. Đối tượng này mặc định được kế thừa từ **Activity**.|
|Nội dung thực thi|Xem mô tả chi tiết của từng loại **Action**|
|Thứ tự|là số thứ tự quy định việc thực thi của **Action** trong **Activity** hoặc **Transition**.|
|Trạng thái|Là trạng thái thực thi của **Action** (Waiting, Executing, Complete, Incomplete, Error).|
|Timeout|Thời gian tối đa cho một lần thực thi tác vụ.|
|Max Loop|Số lần tối đa thực thi lại của tác vụ.|
|Interval|Là chu kỳ thực thi lại tác vụ nếu thực thi thất bại và có **Max Loop** > 0.|
|Condition For Next|Điều kiện để chuyển sang **Action** kế tiếp trong **Activity** hoặc **Transition**.|
:::
#### **==:information_source: Đối tượng thực thi==**
:::info
* Hệ thống quy định 2 loại **Action**:
|Type|Description|Default|
|---|---|:---:|
|System Action|Các tác vụ do hệ thống thực thi|x|
|User Action|Các tác vụ do người sử dụng thực thi||
* **Action** mặc định sẽ không cần đối tượng thực thi nhưng nếu người dùng chọn **User Action** thì cần phải định nghĩa thêm đối tượng thực thi.
:::
#### **==:information_source: Đối tượng thực thi==**
:::info
* Là tập đối tượng được quyền tác thực thi **Action** có loại **User Action**.
* Kiểu dữ liệu: Object.
* Đối tượng thực thi có 4 loại:
* **Orgchart**: thiết lập theo cơ cấu tổ chức. VD như các CBNV có Chức danh Trưởng Phòng của Công ty Vận Chuyển Khí Đông Nam.
* **Position** (User): thiết lập theo vị trí công việc hoặc nhân viên cụ thể. VD như oanh.ttk, phuong.dt, ...
* **Role**: Thiết lập theo việc gom nhóm người dùng. Phần này sẽ kế thừa từ Role của Phân quyền.
* **Special**: Là đối tượng đặc biệt không được định nghĩa trước mà được gán dữ liệu từ một Param/Object trong WF.
* Nếu đã thiết lập đối tượng thực thi là Special thì không được thiết lại các loại khác.
:::
#### **==:information_source: Nội dung thực thi==**
:::info
* Là phần chính của **Action** dùng để thực hiện các xử lý Logic. VD như chuyển trạng thái WF, gán giá trị cho biến, ...
* Có sáu nhóm **Action** cơ bản trong hệ thống và mỗi nhóm **Action** đó sẽ có nhiều loại **Action** khác nhau để đảm nhận các vai trò khác nhau trong WF.
* Tùy vào loại **Action** mà hình thức thể hiện của Nội dung thực thi sẽ thay đổi tưởng ứng.
* Kiểu dữ liệu: Tùy vào mỗi **Action** cụ thể.
:::
#### **==:information_source: Thứ tự==**
:::info
* là số thứ tự quy định việc thực thi của **Action** trong **Activity**.
* Thứ tự có kiểu số nguyên, lớn hơn 0 và không được trùng nhau trong mỗi **Activity** hoặc **Transition**.
* Thứ tự thể hiện sự quan trọng của các **Action** trong **Activity** hoặc **Transition**.
:::
#### **==:information_source: Trạng thái==**
:::info
* Là trạng thái thực thi của mỗi **Action**. Có 5 trạng thái cơ bản:
* **Waiting**: Đang đợi. Chưa tới lượt thực thi. Đây là trạng thái mặc định khi tạo ra một **Action**.
* **Executing**: Đang thực thi.
* **Complete**: Đã thực thi thành công.
* **Incomplete**: Đã thực thi không thành công.
* **Error**: Thực thi bị lỗi.
* Danh mục các trạng thái thực thi là cố định và không được phép thay đổi hay tạo mới.
* Kiểu dữ liệu: List.
:::
#### **==:information_source: Timeout==**
:::info
* Là thời gian tối đa cho một lần thực thi một **Action**.
* Nếu vượt quá thời gian này xem như **Action** thực thi thất bại ==> Cập nhật **Action** về trạng thái **Incomplete**.
* Kiểu dữ liệu: Object và Default = 30s.
:::
#### **==:information_source: Max Loop==**
:::info
* Là số lần tối đa thực thi lại **Action**.
* Giá trị **Max Loop** phải là số nguyên dương >= 0 và không được để trống khi thiết lập **Action**.
* **Action** bị **Timeout** có thể được thực thi lại hay không tùy vào cấu hình của **Max Loop**.
* **Max Loop = 0**: không thực thi lại.
* **Max Loop > 0**: cho phép thực thi lại theo chu kỳ được thiết lập trong thuộc tính **Interval**.
* Giá trị Default của **Max Loop** trong mỗi **Action** là 1.
* Kiểu dữ liệu: INT và >= 0.
:::
#### **==:information_source: Interval==**
:::info
* Là chu kỳ thực thi lại nếu **Action** có trạng thái **Incomplete** hoặc **Error** và **Max Loop > 0**.
* **Interval** bao gồm 2 thành phần:
* Tần suất: Chu kỳ thực thi lại (Second, Minute, Hourly, Daily, Weekly, Monthly) dựa vào thời gian thực thi của lần gần nhất.
* Trigger: Mặc định auto.
* Kiểu dữ liệu: Object.
:::
#### **==:information_source: Condition For Next==**
:::info
* Là điều kiện để chuyển sang **Action** kế tiếp trong **Activity**.
* **Condition For Next** mặc định để trống với mục đích luôn luôn chuyển qua **Action** tiếp theo.
* Kiểu dữ liệu: Object.
:::
### ==:pencil2: Đặc điểm==
:::info
* Các **Action** được thực thi theo **Số thứ tự TĂNG DẦN.**.
* Nếu tác vụ thực thi không thành công thì tuỳ theo thiết lập mà tác vụ đó có thể thực thi lại.
:::
### ==:pencil2: Các nhóm ACTION==
:::info
|Phân loại|Ý nghĩa|
|:---|:---|
|WF Action|Đảm nhận công việc tác động vào đối tượng dữ liệu của WF như Set Value, Set Status|
|Notification Action|Đảm nhận công việc thông báo, nhắc nhở trong WF như Send Email, Send SMS, Reminder,...|
<!--
|Intenal Action|Đảm nhận việc thực thi các Action đã được định nghĩa sẵn trong hệ thống|
|Wait Action|Chờ đợi cho đến khi thõa các điều kiện nào đó|
|Log Action|Đảm nhận việc ghi log trong WF|
|Utillity Action|Đảm nhận các tác vụ tính tiện ích của WF|
|Lookup Task|Đảm nhận việc tìm kiếm Giá trị/Đối tượng trong Workflow trả về kết quả|
-->
:::
#### ==:information_source: WF Action==
---
##### ==:fire: Mô tả==
:::info
* Đảm nhận công việc tác động vào đối tượng dữ liệu của WF như
* Set Value Object
* Set Status WF
:::
##### ==:fire: Thành phần==
:::info
|Action|Mô tả|
|:---|---|
|Set WF Variable|Đảm nhận vai trò gán giá trị cho các đối tượng dữ liệu trong WF|
|...||
<!--
|Set WF Status|Đảm nhân vai trò gán giá trị để thay đổi tình trạng của WF|
|Stop WF|Đảm nhận chức năng dừng WF lại vô thời hạn mà không cần chạy tới node End cho đến khi có sự can thiệp của người quản trị|
|Pause for Duration|Đảm nhận vai trò dừng WF lại trong 1 khoảng thời gian nhất định|
|Pause Intil Date|Đảm nhận vai trò dừng WF lại đến một mốc thời gian cụ thể mới có thể tiếp tục chạy WF|
|Set Content Approval Status|Đảm nhận việc cho phép định nghĩa quy tắc cụ thể cho từng tình trạng của WF|
|Set WF Status|Đảm nhận vai trò thay đổi trạng thái của WF|
-->
:::
<!--
###### ==:pencil2: Set WF Status==
:::info
* **Action** đảm nhận vai trò thay đổi trạng thái của WF.
* WF có 4 trạng thái mặc định:
|Status|Description|Default|
|---|---|:---:|
|**New**|Trang thái Tạo mới mặc định khi WF được khởi tạo|x|
|**Running**|Đang thực thi||
|**Stoped**|Đã dừng WF||
|**Complete**|Hoàn tất||
* Người quản trị có thể định nghĩa thêm những trạng thái khác cho WF.
* Các trạng thái do người dùng tự định nghĩa sẽ không được đổi tên và không xóa được.
* Các trạng thái do người dùng tự định nghĩa chỉ duy nhất sử dụng trong WF được định nghĩa.
* Để định nghĩa **Set WF Status** cần định nghĩa các thuộc tính sau:
|Property|Description|DataType|Requirement|Default value|Note|
|---|---|---|:---:|:---:|---|
|Value|Giá trị gán cho Field|List|x|**null**|Lấy theo danh mục trạng thái WF đã định nghĩa|
* Kết quả trả về
|Variable|Description|
|---|---|
|Status|Trạng thái thực thi của Action|
:::
-->
###### ==:pencil2: Set WF Variable==
:::info
* **Action** đảm nhận vai trò gán giá trị cho các đối tượng trong WF
|Action|Description|
|---|---|
|Set Field Value|Gán giá trị cho biến, trường dữ liệu trong object|
|Set Object Value|Gán giá trị cho đối tượng dữ liệu|
* Các phương thức thực thi
|Method|Description|
|---|---|
|Input|Gán giá trị cố định|
|Execute Script|Thực thi tập lệnh để nhận kết quả trả về|
|Call API|Gọi API và nhận kết quả trả về|
* Các thuộc tính
|Property|Description|DataType|Requirement|Default value|Note|
|---|---|---|:---:|:---:|---|
|Method|Phương thức thực thi||x|**Input**|Mỗi phương thức thực thi quy định những thuộc tính khác nhau|
|Param[ ]|Tham số đầu vào|object||**null**||
|Default Value|Giá trị mặc định|obejct||**null**||
* Giá trị trả về
|Variable|Description|
|---|---|
|Status|Trạng thái thực thi của Action|
|Value[ ]|Đối tượng dữ liệu trả về|
:::
###### ==:pencil: Phương thức Input==
:::warning
* Phương thức dùng để gán giá trị cho một biến hoặc một trường dữ liệu của object.
* Các thuộc tính cần định nghĩa:
|Property|Description|DataType|Requirement|Default Value|Note|
|---|---|---|:---:|:---:|---|
|Field|Là biến hoặc trường dữ liệu cần gán giá trị|object|x|||
|DataType|Kiểu dữ liệu của Field|List|x|**text**|dạng danh mục và có Valid theo từng loại|
|Value|Giá trị gán cho Field|object|x|**null**|Valid theo từng loại DataType|
:::
###### ==:pencil: Phương thức Execute Script==
:::warning
* Phương thức dùng để thực thi tập lệnh và nhận kết quả trả về gán vào biến hoặc object.
* Các thuộc tính cần định nghĩa:
|Property|Description|DataType|Requirement|Default Value|Note|
|---|---|---|:---:|:---:|---|
|Variable Type|Loại đối tượng cần gán giá trị|object|x|**Field**|Có 3 loại là Param, Field hoặc Object|
|Variable|Đối tượng cần gán giá trị|object|x|**null**|Thay đổi theo Variable Type|
|DataType|Kiểu dữ liệu của Variable|List|x|**text**|dạng danh mục và có Valid theo từng loại|
|Content Type|Loại tập lệnh thực thi|List|x|**null**|dạng danh mục (Python, SQL, JS, ...)|
|Content|Nội dung thực thi tập lệnh|text|x|**null**||
:::
###### ==:pencil: Phương thức Call API==
:::warning
* Phương thức dùng để gọi tới một API và nhận kết quả trả về gán vào biến hoặc object.
* Các thuộc tính cần định nghĩa:
|Property|Description|DataType|Requirement|Default Value|Note|
|---|---|---|:---:|:---:|---|
|Variable Type|Loại đối tượng cần gán giá trị|object|x|**Field**|Có 3 loại là Param, Field hoặc Object|
|Variable|Đối tượng cần gán giá trị|object|x|**null**|Thay đổi theo Variable Type|
|DataType|Kiểu dữ liệu của Variable|List|x|**text**|dạng danh mục và có Valid theo từng loại|
|Method |Phương thức gọi API|List|x|**null**|Dạng danh mục (POST, GET, PUSH, ...)|
|EndPoint|Link để gọi tới API|text|x|**null**||
:::
<!--
###### ==:pencil2: Stop WF==
:::info
* Task đảm nhận vai trò dừng WF lại vô thời hạn mà không cần chạy tới node End cho đến khi có sự can thiệp của người quản trị.
* Thường thì Stop WF sẽ đi chung với Log Task. VD: Dừng WF lại và ghi log khi node loop hơn 40 lần (Loop maximum).
* Thành phần:
* Tham số đầu vào (Param[]).
* Condition để xảy ra việc Stop WF (VD: Loop maximum >= 40).
* Log Message.
* Condition để start lại WF.
* Kết quả trả về:
* Status: Tình trạng thực thi task.
* Stoped: đã dừng.
* Complete: Thực thi thành công và WF đang chạy.
* Incomplete: Thực thi không thành công và WF đang dừng.
* Error: Thực thi có lỗi hệ thống và WF đang dừng.
* Value[]: Giá trị của WF sau khi thực thi.
:::
###### ==:pencil2: Pause for Duration==
:::info
* Task đảm nhận vai trò dừng WF lại trong 1 khoảng thời gian nhất định.
* Thường thì task Pause for Duration sẽ đi kèm với Log Task và đôi khi là gửi email đến các đối tượng liên quan để thông báo việc tạm dừng WF .
* VD: sau khi nộp hồ sơ phải chờ 30 ngày sau hồ sơ mới được xem xét; lúc này WF sẽ dừng lại 30 ngày.
* Thành phần:
* Tham số đầu vào (Param[]).
* Khoảng thời gian để tiếp tục WF (VD: 2 hours; 3 days, ...).
* Log Message.
* Condition for next Task.
* Kết quả trả về:
* Status: Tình trạng thực thi task.
* Waiting: đang dừng.
* Complete: Thực thi thành công và WF đang tiếp tục chạy.
* Incomplete: Thực thi không thành công và WF đang dừng.
* Error: Thực thi có lỗi hệ thống và WF đang dừng.
* Value[]: Giá trị của WF sau khi thực thi.
:::
###### ==:pencil2: Pause Until Date==
:::info
* Task đảm nhận vai trò dừng WF lại đến một mốc thời gian cụ thể mới có thể tiếp tục chạy WF.
* Thường thì task Pause Until Date sẽ đi kèm với Log task và đôi khi là gửi email đến các đối tượng liên quan để thông báo việc tạm dừng WF.
* VD: WF sẽ dừng lại đến 16:00 02/01/2019 sẽ tiếp tục WF.
* Thành phần:
* Tham số đầu vào (Param[]).
* Thời gian để tiếp tục WF (16:00 02/01/2018).
* Log Message.
* Condition for next Task.
* Kết quả trả về:
* Status: Tình trạng thực thi task.
* Waiting: đang dừng.
* Complete: Thực thi thành công và WF đang tiếp tục chạy.
* Incomplete: Thực thi không thành công và WF đang dừng.
* Error: Thực thi có lỗi hệ thống và WF đang dừng.
* Value[]: Giá trị của WF sau khi thực thi.
:::
-->
<!--
###### ==:pencil2: Set Content Approval Status==
:::info
* Nếu trong một node có nhiều người cùng phê duyệt thì lúc trạng thái của node sẽ sẽ phụ thuộc vào trạng thái phê duyệt của từng thành viên.
* Task đảm nhận việc cho phép định nghĩa quy tắc cụ thể cho từng tình trạng của WF. VD:
* WF có trạng thái Approved khi tất cả cùng Approve.
* WF có trạng thái Rejected khi chỉ cần có một người Reject.
* WF có trạng thái Canceled khi chỉ cần có một người Cancel.
* Thành phần:
* Tham số đầu vào (Param[]).
* WF Status (Trạng thái WF).
* Condition cho từng WF Status.
* Thời gian chờ tối đa (Maximun Time).
* Giá trị WF Status mặc định khi quá hạn xử lý.
* Log Message.
* Condition for next Task.
* Kết quả trả về:
* Status: Tình trạng thực thi task.
* Complete: Thực thi thành công.
* Incomplete: Thực thi không thành công.
* Error: Thực thi có lỗi hệ thống.
* Value[]: Giá trị của WF sau khi thực thi.
:::
-->
#### ==:information_source: Notification Action==
---
##### ==:fire: Send Email==
:::info
* **Action** đảm nhận vai trò **Send Email** đến các người dùng liên quan trong WF.
* Các thuộc tính
|Property|Description|DataType|Requirement|Default value|Note|
|---|---|---|:---:|:---:|---|
|FromMai|Email dùng để gửi đi|text|x||Xem mô tả|
|DisplayName|Tên hiển thị cho email gửi đi|text||||
|TO|Danh sách đối tượng được TO email|object|x||Xem mô tả|
|CC|Danh sách đối tượng được CC email|object|||Xem mô tả|
|BCC|Danh sách đối tượng được BCC email|object|||Xem mô tả|
|Title|Tiêu đề email|text|x|**null**||
|Body|Nội dung email|text|x|**null**||
|Replace[]|Danh sách biến cần replace trong email|object||**null**||
|Param[]|Danh sách biến|object||**null**||
* **FromMail**: Bao gồm 2 option sau và chỉ được chọn một trong 2 option:
* **Use System**: Sử dụng email cấu hình mặc định của hệ thống để gửi đi.
* **Manual**: Chọn email có trong hệ thống để gửi đi.
* **TO**: Bao gồm 2 option sau và chỉ được chọn một trong 2 option
* **RULE**: Cho phép định nghĩa các quy tắc động để trả về tập email cần TO.
* **MANUAL**: Chọn email có trong hệ thống để gửi đi.
* **CC**: tương tự như **TO**
* **BCC**: tương tự như **TO**
* **Title**: Là tiêu đề của Email được gửi đi. Title được gán mặc định theo template mail được định nghĩa sẵn trong hệ thống và cho phép chỉnh sửa nội dung.
* **Body**: Là nội dung của Email được gửi đi. Nội dung được gán mặc định theo template mail được định nghĩa sẵn trong hệ thống và cho phép chỉnh sửa nội dung.
* **Replace[ ]**: Là danh sách các biến cần replace trong Email được gửi đi. Danh sách này được gán mặc định theo template mail được định nghĩa sẵn trong hệ thống và cho phép chỉnh sửa nội dung.
* **Param[ ]**: Là danh sách các biến cần sử dụng cho việc gửi email.
* Các thuộc tính cần định nghĩa khi thiết lập **RULE** cho các đối tượng **TO, CC, BCC**:
* **Đối tượng áp dụng**: Giống như đối tượng áp dụng của phần phân quyền
* **Đối tượng nhận email**: Mặc dịnh lấy giá trị của Assignment trong Activity.
* Giống như đối tượng thực thi của phần phân quyền.
* Đối tượng Follower.
* Giá trị trả về
|Variable|Description|
|---|---|
|Status|Trạng thái thực thi của Action|
|Value[ ]|Đối tượng dữ liệu trả về|
:::
##### ==:fire: Send SMS==
:::info
* **Action** đảm nhận vai trò **Send SMS** đến các người dùng liên quan trong WF.
* Các thuộc tính
|Property|Description|DataType|Requirement|Default value|Note|
|---|---|---|:---:|:---:|---|
|DisplayName|Tên hiển thị khi Send SMS|text||||
|TO|Danh sách đối tượng nhận SMS|object|x||Xem mô tả|
|Body|Nội dung email|text|x|**null**||
|Replace[]|Danh sách biến cần replace trong SMS|object||**null**||
|Param[]|Danh sách biến|object||**null**||
* Giá trị trả về
|Variable|Description|
|---|---|
|Status|Trạng thái thực thi của Action|
|Value[ ]|Đối tượng dữ liệu trả về|
:::
##### ==:fire: Push Notification==
:::info
* **Action** đảm nhận vai trò **Push notification** đến các người dùng liên quan trong WF.
* Các thuộc tính
|Property|Description|DataType|Requirement|Default value|Note|
|---|---|---|:---:|:---:|---|
|TO|Danh sách đối tượng cần Push Notification|object|x||Xem mô tả|
|Body|Nội dung Notification|text|x|**null**||
|Replace[]|Danh sách biến cần replace trong Notification|object||**null**||
|Param[]|Danh sách biến|object||**null**||
* Giá trị trả về
|Variable|Description|
|---|---|
|Status|Trạng thái thực thi của Action|
|Value[ ]|Đối tượng dữ liệu trả về|
:::
<!--
#### ==:information_source: Internal Action==
---
:::info
* **Action** đảm nhận vai thực thi các tác vụ của WF được định nghĩa sẵn trong hệ thống.
* Các tác vụ này thường thực hiện các chức năng nhiệm vụ cố định và ít thay đổi.
* Các thuộc tính
|Property|Description|DataType|Requirement|Default value|Note|
|---|---|---|:---:|:---:|---|
|Action|Danh sách các tác vụ định định nghĩa sẵn trong hệ thống|List|x|||
|Param[]|Danh sách biến|object||**null**||
* Giá trị trả về
|Variable|Description|
|---|---|
|Status|Trạng thái thực thi của Action|
|Value[ ]|Đối tượng dữ liệu trả về|
* Thành phần:
* Tham số đầu vào (Param[]).
* Nội dung **Action** thể hiện.
* Tham số đầu vào.
* Nội dung thực thi.
* Log Message.
* Condition for next.
* Kết quả trả về:
* Status: Tình trạng thực thi **Action**.
* Complete: Thực thi thành công.
* Incomplete: Thực thi không thành công.
* Error: Thực thi có lỗi hệ thống.
* Value[]: Giá trị của WF sau khi thực thi.
:::
-->
<!--
#### ==:information_source: Wait Action==
---
##### ==:fire: Wait for Condition==
:::info
* **Action** đảm nhận việc kiểm tra và loop WF **Action** cho đến khi nào thõa điều kiện được thiết lập.
* Thành phần:
* Tham số đầu vào (Param[]).
* Condition for Wait.
* Log Message.
* Interval: Chu kỳ loop.
* Time for wait limit (Thời gian chờ tối đa). Có thể là số lần loop hoặc thời gian cụ thể.
* Kết quả trả về:
* Status: Tình trạng thực thi **Action**.
* Waiting: đang dừng để loop.
* Complete: Thực thi thành công và WF đang tiếp tục chạy.
* Incomplete: Thực thi không thành công và WF đang dừng.
* Error: Thực thi có lỗi hệ thống và WF đang dừng.
* Value[]: Giá trị của WF sau khi thực thi.
:::
-->
<!--
#### ==:information_source: Log Action==
---
:::info
* **Action** đảm nhận việc ghi lại lịch sử hành động của tất cả các đối tượng trong WF.
* Các thuộc tính:
|Property|Description|DataType|Requirement|Default value|Note|
|---|---|---|:---:|:---:|---|
|||||||
|||||||
* Kết quả trả về:
|Variable|Description|
|---|---|
|Status|Trạng thái thực thi của của đối tượng|
|Value[ ]|Đối tượng dữ liệu trả về|
:::
-->
<!--
#### ==:information_source: Utillity Action==
---
-->
<!--
##### ==:fire: Execute Script==
:::info
* **Action** đảm nhận việc thực thi các scipt (Python, SQL) do người quản trị WF định nghĩa.
* Chỉ có người Quản trị mới có thể định nghĩa được **Action** này.
* Thành phần:
* Tham số đầu vào (Param[]).
* Nội dung Script.
* Tham số chứa giá trị trả về.
* Log Message.
* Condition for next.
* Kết quả trả về:
* Status: Tình trạng thực thi **Action**.
* Complete: Thực thi thành công.
* Incomplete: Thực thi không thành công.
* Error: Thực thi có lỗi hệ thống.
* Value[]: Giá trị của WF sau khi thực thi.
:::
-->
<!--
##### ==:fire: Call API==
:::info
* **Action** đảm nhận việc gọi đến các API ngoài hệ thống để thực thi các tác vụ liên quan.
* Thành phần:
* Tham số đầu vào (Param[]).
* Nội dung gọi API.
* Tham số chưa giá trị trả về sau khi gọi API.
* Log Message.
* Condition for next.
* Kết quả trả về:
* Status: Tình trạng thực thi **Action**.
* Complete: Thực thi thành công.
* Incomplete: Thực thi không thành công.
* Error: Thực thi có lỗi hệ thống.
* Value[]: Giá trị của WF sau khi thực thi.
:::
-->
<!--
##### ==:fire: Get/Set Value Variable==
:::info
* **Action** đảm nhận việc lấy hoặc gán giá trị cho các biến trong WF.
* Thành phần:
* Variable field: biến cần lấy hoặc gán giá trị.
* Variable reference: biến tham chiếu tới để lấy hoặc gán giá trị.
* Kết quả trả về:
* Status: Tình trạng thực thi **Action**.
* Complete: Thực thi thành công.
* Incomplete: Thực thi không thành công.
* Error: Thực thi có lỗi hệ thống.
* Value[]: Giá trị của WF sau khi thực thi.
:::
-->
<!--
##### ==:fire: Add/Remove List Item Permissions==
:::info
* **Action** đảm nhận việc Add/Remove đối tượng có quyền tham gia thực thi thao tác vào WF.
* Thành phần:
* Tham số đầu vào (Param[]).
* Type: AddNew hoặc Remove
* Danh sách đối tượng tham gia theo WF SCOPE.
* Log Message.
* Condition for next.
* Kết quả trả về:
* Status: Tình trạng thực thi **Action**.
* Complete: Thực thi thành công.
* Incomplete: Thực thi không thành công.
* Error: Thực thi có lỗi hệ thống.
* Value[]: Giá trị của WF sau khi thực thi.
:::
##### ==:fire: Create Object==
:::info
* Chức năng đảm nhận việc tạo ra đối tượng dữ liệu mới trong WF.
* Kết quả trả về:
* Status: Tình trạng thực thi **Action**.
* Complete: Thực thi thành công.
* Incomplete: Thực thi không thành công.
* Error: Thực thi có lỗi hệ thống.
* Value[]: Giá trị của WF sau khi thực thi.
:::
-->
## ==:bulb: TRANSITION==
### ==:pencil2: Mô tả==
:::info
* Là các biểu thức logic quy định sự chuyển tiếp giữa 2 **Activity**, xảy ra khi **TRIGGER** được kích hoạt và thỏa mãn một số **CONDITION**.
:::
### ==:pencil2: Thành phần==
:::info
|Element|Description|DataType|Requirement|Default value|Note|
|---|---|---|:---:|:---:|---|
|Thứ tự|Là thứ tự sắp xếp của **Transition** bên trong **Activity**|INT|x|**null**||
|Trigger|Là phương thức kích hoạt **Transition** thực thi|object|x|**Auto**||
|Condition|Là điều kiện để kết hợp với **Trigger** để kích hoạt **Transition**|object|x|**null**||
|Action List|Danh sách các hành động được thực thi trong **Transition**|object||**null**||
:::
### ==:pencil2: Đặc điểm==
:::info
* Ở **Transition**, hệ thống cho phép ghi đè các trường thông tin yêu cầu cung cấp dữ liệu (hoặc tự động gán giá trị) khi người dùng thao tác lên **Command** của **Trigger**.
* Các **Transition** trong mỗi **Activity** là độc lập và không có sự ràng buộc qua lại với nhau.
:::
## ==:bulb: ACTIVITY==
### ==:pencil2: Mô tả==
:::info
* Là các node thành phần chứa các xử lý logic ở mỗi bước bên trong **Workflow**.
* Một **Activity** có thể có 1 hoặc nhiều **Action** và **Transition** khác nhau.
:::
### ==:pencil2: Thành phần==
:::info
* Các thành phần của Activity
|Element|Description|
|---|---|
|**Assignment**|Là các đối tượng thực thi có quyền tác động lên **Activity**.|
|**Communication**|Tác vụ truyền thông trước khi vào Action và Reminder đến các đối tượng liên quan.||
|**Action List**|Các tác vụ logic xử lý của **Activity** trước khi chạy vào **Transition**.|
|**Transition**|Là các thành phần đảm nhận việc chuyển tiếp đến các **Activity** khác trong WF|
:::
#### ==:information_source: Assignment==
:::info
* Là phần định nghĩa thông tin các đối tượng thực thi có thể tác động lên Activity.
* Các thành phần cần định nghĩa cho Assignment:
|Element|Description|Note|
|---|---|---|
|Đối tượng thực thi|Là các đối tượng có quyền tác động lên Activity||
|Follower|Là các đối tượng không có quyền tác động lên Activity nhưng sẽ nhận được các thông tin cảnh báo về hoạt động của Activity||
* Đối tượng thực thi và Follower có thể là một trong các loại sau:
|Type|Description|Note|
|---|---|---|
|CƠ CẤU TỔ CHỨC|Là đơn vị, phòng ban có trong hệ thống||
|ROLE|Là ROLE của hệ thống được kế thừa từ phần phân quyền||
|POSITION|Vị trí công việc có trong hệ thống||
|QUẢN LÝ TRỰC TIẾP|||
|SPECIAL|Các tham số, các biến trong WF||
:::
##### ==:fire: CƠ CẤU TỔ CHỨC==
:::info
* Là các đơn vị, phòng ban có trong hệ thống.
* Mặc định sẽ bao gồm cả cơ cấu con.
* Khi chọn CƠ CẤU TỔ CHỨC; WF cũng cho phép kết hợp với các thông tin quan trọng khác như Chức danh, Chức vụ, Loại nhân viên, Location để tạo thành bộ thiết lập.
:::
##### ==:fire: ROLE==
:::info
* Vai trò trong hệ thống.
* Được lấy thông tin phần Phân Quyền.
:::
##### ==:fire: POSITION==
:::info
* Mỗi một cơ cấu tổ chức sẽ có các vị trí công việc. Các vị trí công việc này gọi là Position.
:::
##### ==:fire: SPECIAL==
:::info
:::
#### ==:information_source: Communication==
:::info
* Là tác vụ truyền thông bao gồm 2 thông tin chính.
|Task|Description|Note|
|---|---|---|
|Send email|Tác vụ gửi email đến các **đối tượng thực thi** và **Follower** ở phần định nghĩa **Assignment** trước khi thực hiện các **Action**||
|Reminder|Tác vụ nhắc nhở các **đối tượng thực thi** và **Follower** ở phần định nghĩa **Assignment** theo một Chu kỳ được được thiết lập||
* Các thành phần của Task **Send email** bao gồm tất cả các thuộc tính cần định nghĩa của **Send Email Action**.
* Task Reminder của Communication là **Send Email Action** nhưng có tính lặp đi lặp lại theo một chu kỳ. Các thành phần cần định nghĩa:
* Tất cả các thuộc tính của **Send Email Action**.
* **Interval**: Chu kỳ lặp lại.
* **Condition**: Điều kiện để **Reminder**.
:::
#### ==:information_source: Action List==
:::info
* Tập các tác vụ logic xử lý của **Activity** trước khi chạy vào **Transition**.
* Mỗi thành phần trong Action List là một Action và được thực thi theo thứ tự thiết lập.
:::
#### ==:information_source: Transition==
:::info
* Là các thành phần đảm nhận việc chuyển tiếp đến các **Activity** khác trong WF.
:::
### ==:pencil2: Các loại Activity==
:::info
|Type|Description|
|---|---|
|General Activity|là **Activity** đảm nhận việc xử lý Logic của **Workflow**|
|Join Activity|Là **Activity** có sự gặp nhau của 2 **Transition** trở lên|
|Slpit Activity|Là **Activity** có sự rẽ nhánh trong **Workflow**|
|Start Activity|Là điểm khởi đầu của **Workflow**|
|End Activity|Là điểm kết thúc của **Workflow**|
:::
### ==:pencil2: Đặc điểm==
:::info
* Các **Action** trong **Activity** được thực thi tuần tự theo độ ưu tiên đã quy định.
* Mỗi **Activity** đều phải có ít nhất 1 **Transition** đầu vào và 1 **Transition** đầu ra.
* Các **Transition** trong **Activity** được thực hiện theo độ ưu tiên và khi gặp **Transition** thoả mãn sẽ chuyển tiếp qua **Activity** khác mà không tiếp tục kiểm tra và thực thi các **Transition** bên ở phía sau.
* Một **Activity** có thể có nhiều **Transition** đầu vào (JOIN Activity).
* Một **Transition** trong **Activity** có thể chuyển tiếp đến nhiều **Activity** khác nhau (SPLIT Activity).
:::
#### ==:information_source: GENERAL Activity==
:::info
* Là **Activity** chuẩn của WF để xử lý các tác vụ logic.
* Có tất cả các thành phần của một và đặc điểm của một **Logic Activity**.
* Chỉ có duy nhất 1 **Transition** đầu vào và mỗi thành phần **Transition** bên trong chỉ chuyển tiếp đến một **Activity** khác.
* **GENERAL Activity** Luôn có 2 **Action** default sau:
* **Action Notification** dùng để thiết lập việc **Send Email**.
* **Action Log** dùng để log lại hoạt động của **Activity**.
:::
#### ==:information_source: JOIN Activity==
:::info
* **JOIN Activity** về bản chất là một **GENERAL Activity** nên có đầy đủ các thành phần thuộc tính của **GENERAL Activity**.
* Có ít nhất 2 **Transition** đầu vào.
* **JOIN Activity** luôn chờ cho đến khi tất cả các **Transition** tham gia thực thi hoàn tất.
:::
#### ==:information_source: SPLIT Activity==
:::info
* **SPLIT Activity** về bản chất là một **GENERAL Activity** nên có đầy đủ các thành phần thuộc tính của **GENERAL Activity**.
* Là **Activity** bắt đầu cho việc rẽ nhánh chạy các tác vụ song song trong WF.
* Các **Transition** trong SPLIT phải chuyển tiếp ít nhất tới 2 **Activity** khác trong WF.
:::
#### ==:information_source: START Activity==
:::info
* Chỉ là Node bắt đầu của **Workflow**.
* Chứa duy nhất **Transition** với **Trigger** loại Auto và không có **Condition** để mặc định chuyển tiếp qua **Activity** tiếp theo.
:::
#### ==:information_source: END Activity==
:::info
* Là Node thành phần cuối cùng đánh dấu việc kết thúc **Workflow**.
* **END Activity** không thực hiện tác vụ gì cả.
:::
### ==:pencil2: Template Activity==
:::info
|Template|Description|
|---|---|
|Approval Activity|Là Template chuẩn dùng cho các node có tính chất Phê duyệt|
|Send Mail|Là Template chuẩn dùng cho các node có tính chất truyền thông, gửi email|
|...||
:::
#### ==:information_source: Approval Activity==
##### ==:fire:Mô tả==
:::info
* Là template chuẩn dùng cho các Activity cần phê duyệt thông tin.
* Được kế thừa từ **GENERAL Activity** nên có đầy đủ các thuộc tính, đặc điểm của **GENERAL Activity**.
:::
##### ==:fire:Quy trình thực hiện==
:::info
```flow
st=>start: Start-Approval-Activity
e=>end: End-Approval-Activity
op1=>subroutine: Do Actions (Pre)
op2=>subroutine: Waiting Trigger
op3=>operation: Get Matching Transition
op4=>subroutine: Do Actions (Post-Transitions)
op5=>operation: Check Assignment
cond=>condition: Match conditions ?
st->op5->op1->op2->op3->cond(yes)->op4->e
cond(no)->op2
```
:::
##### ==:fire: Thành phần==
:::info
|Element|Description|Note|
|---|---|---|
|Assignment|Đối tượng thực thi có quyền tác động lên **Approval Activity**.||
|Notification Action|Hành động Gửi Email trước khi thực hiện **Action List**||
|Action List|Là tập **Action** chứa các logic xử lý của **Activity** trước khi chạy vào **Transition**. <br />VD: Chuyển trạng thái của đối tượng từ Approving ==> Approved.||
|Transition Approve|**Transition** mang tính chất Phê duyệt thông tin.||
|Transition Reject|**Transition** mang tính chất Từ chối thông tin.||
|Transition Timeout|**Transition** để xử lý khi đối tượng thực thi không tác động lên **Activity** trong khoảng thời gian quy định.||
|Approval Condition|Điều kiện để thay đổi trạng thái của đối tượng nếu có nhiều đối tượng thực thi cùng tác động lên template.||
|Log Action|Hành động ghi log audit tất cả các hoạt động diễn ra trong Template.||
:::
##### ==:fire: Mô tả đặc điểm==
:::info
* **Template**: Không cho phép thêm **Transition** khác vào template.
* **Assignment**: Là đối tượng thực thi có quyền tác động lên **Approval Activity**.
* **Notification Action**: Kế thừa tất cả đặc điểm của Action Send Email và chịu trách nhiệm định nghĩa các đối tượng liên quan sẽ nhận được email như **TO, CC, BCC, FOLLOWER**.
* **Action List**: Là tập **Action** thực thi các xử lý Logic của **Approval Activity**. Các thành phần trong **Action List** là **Action** và kế thừa tất cả đặc điểm của **Action**.
* **Transition Approve**:
* Loại Trigger: **COMMAND**
* Hiển thị: APPROVE
* Ý nghĩa: **Transition** mang ý nghĩa đồng ý phê duyệt đối tượng dữ liệu.
* **Transition Reject**:
* Loại Trigger: **COMMAND**
* Hiển thị: REJECT
* Ý nghĩa: **Transition** mang ý nghĩa không đồng ý phê duyệt đối tượng dữ liệu.
* **Transition Timeout**:
* Loại Trigger: Timer có giá trị mặc định là 1 ngày.
* Hiển thị: Không.
* Ý nghĩa: **Transition** mang ý nghĩa cho các tác vụ xử lý tự động khi quá thời gian tác động lên Activity.
* **Approval Condition**: Điều kiện để thõa mãn **Transition** APPROVE trong trường hợp có nhiều đối tượng thực thi cùng tác động lên template.
* **Wait for**:
* **Everyone**: Tất cả các đối tượng thực thi phải cùng thao tác để thõa điều kiện.
* **Anyone**: Chỉ cần một đối tượng thực thi trong tập thực thi thao tác để thõa điều kiện.
* Các trường hợp không thõa **Approval Condition** thì template sẽ mặc định chọn **Transition REJECT** để chuyển tiếp **Activity** khác.
> Tạm thời dùng cách rẽ nhánh nếu có nhiều đối tượng được quyền tác động lên **Approval Activity**.
* **Log Action**: Kế thừa tất cả đặc điểm của **Action Log**.
:::
#### ==:information_source: Send Email Template==
##### ==:fire:Mô tả==
:::info
* Là template chuẩn dùng cho các Activity có chức năng chính là Send Email.
* Được kế thừa từ **GENERAL Activity** nên có đầy đủ các thuộc tính, đặc điểm của **GENERAL Activity**.
:::
##### ==:fire:Thành phần==
:::info
|Element|Description|Note|
|---|---|---|
|Assignment|Đối tượng thực thi có quyền tác động lên **Send Email Activity**.||
|Transition Auto|**Transition** mặc định để thực hiện hành động gửi email.||
|Send Email Activity|Là **Activity** **Send Email** cho phép người dùng định nghĩa các thuộc tính của việc Send Email.||
|Log Action|Hành động ghi log audit tất cả các hoạt động diễn ra trong Template.||
:::
##### ==:fire: Mô tả đặc điểm==
:::info
* **Assignment**:
* Đối tượng thực thi có quyền tác động lên **Send Email Activity**.
* Là một thuộc tính chung của tất cả các **Activity** nên sẽ xuất hiện ở tất cả các **Activity** có trong hệ thống.
* Đối với **Send Email Activity** thì có thể không cần định nghĩa Assignment.
* **Transition Auto**:
* Loại TRIGGER: Auto
* Hiển thị: không
* Ý nghĩa: mặc định luôn luôn thực hiện Send Email.
* **Send Email Activity**:
* Có tất cả các thuộc tính của Send Email Activity.
* Log Action: Kế thừa tất cả đặc điểm của **Action Log**.
:::