Hướng dẫn thực hành tạo APP XIN NGHỈ PHÉP CÓ DUYỆT 1 CẤP

Nhân viên → Trưởng bộ phận

Email tự động khi duyệt

Nền tảng: Power Apps (Canvas App – Phone) + SharePoint + Power Automate (Email)


🎯 MỤC TIÊU BUỔI HỌC

Sau bài này, học viên sẽ làm được:

  1. Nhân viên tạo đơn nghỉ phép và lưu vào SharePoint
  2. Trưởng bộ phận duyệt 1 cấp ngay trên app
  3. Khi duyệt, Power Automate tự gửi email thông báo kết quả

📂 PHẦN 1: CHUẨN BỊ DỮ LIỆU (SHAREPOINT)

1.1 Tạo SharePoint List: LeaveRequests

Tạo list mới tên LeaveRequests, gồm các cột:

Tên cộtKiểu dữ liệuÝ nghĩa nghiệp vụ
TitleSingle line of textTiêu đề đơn (để dễ tìm trong SharePoint)
EmployeeNameSingle line of textTên nhân viên gửi đơn
EmployeeEmailSingle line of textEmail nhân viên (để gửi mail thông báo)
DepartmentSingle line of textPhòng ban nhân viên
LeaveTypeChoiceLoại nghỉ (Phép năm / Ốm / Không lương)
StartDateDateNgày bắt đầu nghỉ
EndDateDateNgày kết thúc nghỉ
ReasonMultiple lines of textLý do nghỉ
StatusChoiceTrạng thái: Pending/Approved/Rejected
ManagerEmailSingle line of textEmail trưởng bộ phận (để định tuyến duyệt)

Thiết lập Choice khuyến nghị:

  • LeaveType: Annual Leave, Sick Leave, Unpaid Leave
  • Status: Pending, Approved, Rejected

Lưu ý cho người mới: SharePoint “Choice” giúp dữ liệu chuẩn, tránh gõ sai chính tả.


1.2 15 dòng dữ liệu mẫu (dạng TABLE)

👉 Cách nhập nhanh: vào list LeaveRequestsEdit in grid view → copy-paste bảng dưới.
(Dữ liệu có đủ Pending/Approved/Rejected để test quy trình và Flow email)

TitleEmployeeNameEmployeeEmailDepartmentLeaveTypeStartDateEndDateReasonStatusManagerEmail
Lan-2026-02-01Nguyễn Thị Lanlan@contoso.comHRAnnual Leave2026-02-202026-02-21Việc gia đìnhPendinghr.manager@contoso.com
Nam-2026-02-02Trần Văn Namnam@contoso.comITSick Leave2026-02-182026-02-18Sốt caoPendingit.manager@contoso.com
Huy-2026-02-03Lê Minh Huyhuy@contoso.comSalesUnpaid Leave2026-02-252026-02-26Việc cá nhânPendingsales.manager@contoso.com
Mai-2026-02-04Phạm Thu Maimai@contoso.comMarketingAnnual Leave2026-03-022026-03-04Du lịchPendingmkt.manager@contoso.com
Khoa-2026-02-05Đặng Quốc Khoakhoa@contoso.comFinanceSick Leave2026-02-192026-02-20Khám bệnhPendingfin.manager@contoso.com
Linh-2026-01-01Vũ Ngọc Linhlinh@contoso.comHRAnnual Leave2026-01-102026-01-10Nghỉ phép nămApprovedhr.manager@contoso.com
Tu-2026-01-02Nguyễn Anh Tútu@contoso.comITSick Leave2026-01-122026-01-13Cảm cúmApprovedit.manager@contoso.com
My-2026-01-03Trần Ngọc Mymy@contoso.comSalesAnnual Leave2026-01-152026-01-16Việc gia đìnhRejectedsales.manager@contoso.com
Son-2026-01-04Lê Hoàng Sơnson@contoso.comMarketingUnpaid Leave2026-01-202026-01-20Bận đột xuấtApprovedmkt.manager@contoso.com
Dung-2026-01-05Phạm Thị Dungdung@contoso.comFinanceAnnual Leave2026-01-222026-01-24Nghỉ phépRejectedfin.manager@contoso.com
Quang-2026-02-06Nguyễn Quangquang@contoso.comITAnnual Leave2026-03-052026-03-06Đám cướiPendingit.manager@contoso.com
Hanh-2026-02-07Trần Hạnhhanh@contoso.comHRSick Leave2026-02-222026-02-22Đau bụngPendinghr.manager@contoso.com
Phuc-2026-02-08Lê Phúcphuc@contoso.comSalesAnnual Leave2026-03-012026-03-01Nghỉ phép nămPendingsales.manager@contoso.com
Trang-2026-02-09Nguyễn Trangtrang@contoso.comMarketingSick Leave2026-02-172026-02-17Khám bệnhPendingmkt.manager@contoso.com
Viet-2026-02-10Trần Quốc Việtviet@contoso.comFinanceUnpaid Leave2026-03-102026-03-11Việc riêngPendingfin.manager@contoso.com

✅ Dữ liệu này giúp học viên test được:

  • Lọc danh sách theo Pending
  • Duyệt/ từ chối
  • Flow email chỉ chạy khi Approved

🛠️ PHẦN 2: TẠO APP (POWER APPS)

2.1 Tạo Canvas App (Phone)

  1. Vào make.powerapps.com
  2. CreateBlank appBlank canvas app
  3. Name: App Xin Nghỉ Phép
  4. Format: Phone
  5. Create

2.2 Kết nối SharePoint List

  1. Thanh trái chọn Data (biểu tượng hình trụ)
  2. Add data
  3. Chọn SharePoint
  4. Chọn Site → tick list LeaveRequests
  5. Connect

Nếu không thấy list: kiểm tra bạn đang ở đúng Site hoặc quyền truy cập SharePoint.


👤 PHẦN 3: MÀN HÌNH NHÂN VIÊN GỬI ĐƠN

3.1 Tạo màn hình

  • New screen → Blank
  • Đổi tên screen: scrCreateRequest

Vì sao cần screen riêng?

  • Nhân viên chỉ cần tạo đơn + xem đơn của mình
  • Trưởng bộ phận có màn hình riêng để duyệt

3.2 Thêm các control (đặt tên chuẩn)

(1) Tiêu đề màn hình

  • Insert → Label
  • Text: XIN NGHỈ PHÉP

(2) Tên nhân viên

  • Insert → Text input
  • Name: txtEmployeeName
  • HintText: Họ và tên

(3) Email nhân viên

  • Insert → Text input
  • Name: txtEmployeeEmail
  • HintText: Email (vd: lan@contoso.com)

(4) Phòng ban

  • Insert → Text input
  • Name: txtDepartment
  • HintText: Phòng ban (IT/HR/Sales...)

(5) Loại nghỉ

  • Insert → Dropdown
  • Name: drpLeaveType
  • Items:
["Annual Leave","Sick Leave","Unpaid Leave"]

Giải thích: Dropdown giúp chọn đúng giá trị (tránh gõ sai).


(6) Ngày bắt đầu / kết thúc

  • Insert → Date picker
  • Start: Name dpStartDate
  • End: Name dpEndDate

(7) Lý do nghỉ

  • Insert → Text input
  • Name: txtReason
  • Set Mode = Multiline
  • HintText: Nhập lý do nghỉ

3.3 Nút “GỬI ĐƠN”

  • Insert → Button
  • Name: btnSubmit
  • Text: GỬI ĐƠN

OnSelect (dán công thức)

Chọn btnSubmit → thuộc tính OnSelect → dán:

Patch(
    LeaveRequests,
    Defaults(LeaveRequests),
    {
        Title: txtEmployeeName.Text & " - " & Text(Today(), "yyyy-mm-dd"),
        EmployeeName: txtEmployeeName.Text,
        EmployeeEmail: txtEmployeeEmail.Text,
        Department: txtDepartment.Text,
        LeaveType: drpLeaveType.Selected.Value,
        StartDate: dpStartDate.SelectedDate,
        EndDate: dpEndDate.SelectedDate,
        Reason: txtReason.Text,
        Status: "Pending",
        ManagerEmail: "manager@contoso.com"
    }
);

Notify("Đã gửi đơn thành công!", NotificationType.Success);

Reset(txtEmployeeName);
Reset(txtEmployeeEmail);
Reset(txtDepartment);
Reset(txtReason);
Reset(drpLeaveType);
Reset(dpStartDate);
Reset(dpEndDate)

Giải thích từng phần (cho người mới)

  • Patch(...) = ghi dữ liệu vào SharePoint
  • Defaults(LeaveRequests) = tạo dòng mới
  • Title = đặt tiêu đề dễ tìm (Tên + ngày)
  • Status: "Pending" = đơn vừa gửi luôn ở trạng thái chờ duyệt
  • Notify() = hiện thông báo thành công
  • Reset() = xóa form để nhập đơn tiếp theo

Lưu ý: ManagerEmail ở đây đang để cố định. Sau này nâng cao có thể tự động theo phòng ban.


3.4 Gallery “ĐƠN CỦA TÔI” (để nhân viên theo dõi)

  • Insert → Vertical gallery
  • Name: galMyRequests

Items:

Filter(LeaveRequests, EmployeeEmail = txtEmployeeEmail.Text)

Giải thích: Khi nhân viên nhập email của mình, gallery sẽ hiện các đơn của email đó.

Nếu muốn “chuẩn” theo đăng nhập Microsoft 365 thì thường dùng User().Email, nhưng trong bài thực hành cơ bản, dùng input email giúp học viên dễ test ngay.


👨‍💼 PHẦN 4: MÀN HÌNH TRƯỞNG BỘ PHẬN DUYỆT 1 CẤP

4.1 Tạo màn hình

  • New screen → Blank
  • Đổi tên: scrManager

Thêm Label tiêu đề: DUYỆT NGHỈ PHÉP


4.2 Gallery danh sách đơn chờ duyệt

  • Insert → Vertical gallery
  • Name: galPending

Items:

Filter(LeaveRequests, Status = "Pending")

Trong gallery hiển thị các trường:

  • Title: ThisItem.EmployeeName
  • Subtitle: ThisItem.Department & " - " & ThisItem.LeaveType
  • Body: Text(ThisItem.StartDate, "dd/mm/yyyy") & " → " & Text(ThisItem.EndDate, "dd/mm/yyyy")

4.3 Nút “DUYỆT” và “TỪ CHỐI”

(A) Icon DUYỆT (✔)

  • Insert → Icon → Check
  • Name: icoApprove

OnSelect:

Patch(
    LeaveRequests,
    ThisItem,
    { Status: "Approved" }
);

Notify("Đã duyệt đơn!", NotificationType.Success)

(B) Icon TỪ CHỐI (✖)

  • Insert → Icon → Cancel
  • Name: icoReject

OnSelect:

Patch(
    LeaveRequests,
    ThisItem,
    { Status: "Rejected" }
);

Notify("Đã từ chối đơn!", NotificationType.Warning)

Giải thích:

  • ThisItem = đúng đơn bạn đang bấm trong gallery
  • Patch chỉ cập nhật field Status nên rất nhanh

📧 PHẦN 5: EMAIL TỰ ĐỘNG KHI DUYỆT (POWER AUTOMATE)

5.1 Tạo Flow tự động

  1. Mở Power Automate
  2. Create → Automated cloud flow
  3. Trigger chọn: When an item is modified (SharePoint)
  4. Chọn đúng:
    • Site Address
    • List Name: LeaveRequests

5.2 Thêm điều kiện chỉ gửi khi “Approved”

Add step → Condition

  • Left: Status Value (dynamic content từ SharePoint)
  • Operator: is equal to
  • Right: Approved

✅ Nhánh Yes = gửi email
✅ Nhánh No = không làm gì


5.3 Gửi email cho nhân viên

Nhánh Yes → Add action → Send an email (V2)

  • To: EmployeeEmail
  • Subject: Đơn nghỉ phép đã được duyệt
  • Body (gợi ý mẫu):
Chào @{triggerOutputs()?['body/EmployeeName']},

Đơn nghỉ phép của bạn đã được duyệt.

Loại nghỉ: @{triggerOutputs()?['body/LeaveType/Value']}
Thời gian: @{triggerOutputs()?['body/StartDate']} đến @{triggerOutputs()?['body/EndDate']}
Lý do: @{triggerOutputs()?['body/Reason']}

Trân trọng.

Nếu bạn dùng “Dynamic content” giao diện kéo-thả, hãy chọn đúng các trường: EmployeeName, LeaveType Value, StartDate, EndDate, Reason.


🧪 PHẦN 6: KIỂM THỬ THỰC TẾ (BẮT BUỘC LÀM)

Test 1 — Nhân viên gửi đơn

Mục tiêu: tạo đơn mới, Status phải là Pending

Thao tác:

  1. Vào scrCreateRequest
  2. Nhập:
    • Name: Nguyễn Thị Lan
    • Email: lan@contoso.com
    • Department: HR
    • LeaveType: Annual Leave
    • Start/End: chọn 2 ngày bất kỳ
    • Reason: Việc gia đình
  3. Bấm GỬI ĐƠN

Kết quả mong đợi:

  • App báo “Đã gửi đơn thành công!”
  • Trong SharePoint có dòng mới, Status = Pending

Test 2 — Trưởng bộ phận duyệt

Mục tiêu: patch đổi Status → Approved

Thao tác:

  1. Vào scrManager
  2. Thấy đơn Pending vừa tạo
  3. Bấm icon ✔

Kết quả mong đợi:

  • Status đổi thành Approved
  • Đơn biến mất khỏi danh sách Pending (vì gallery đang lọc Pending)

Test 3 — Email tự động

Mục tiêu: Flow gửi email khi Approved

Thao tác:

  1. Sau khi duyệt, mở mailbox của lan@contoso.com
  2. Kiểm tra thư đến

Kết quả mong đợi:

  • Nhận email với subject “Đơn nghỉ phép đã được duyệt”
  • Nội dung có tên, loại nghỉ, thời gian

Nếu chưa có email: vào Flow → Run history → mở lần chạy mới nhất để xem lỗi (thường do thiếu connector Outlook hoặc sai trường Status Value).


🏁 KẾT QUẢ CUỐI BÀI

Bạn đã có:

  • ✅ App xin nghỉ phép (nhân viên tạo đơn)
  • ✅ Duyệt 1 cấp (trưởng bộ phận duyệt)
  • ✅ Email tự động khi duyệt (Power Automate)

Scroll to Top