Hoàn Thiện App Quản Lý Tiệm Giặt Ủi AppSheet (Phần 2)

ứng dụng quản lý tiệm giặt ủi

Xin chào quý anh chị và các bạn! Ở Phần 1, mình đã cùng nhau dựng xong khung sườn của App Quản Lý Tiệm Giặt Ủi AppSheet: 4 bảng dữ liệu, các view cơ bản, cột ảo tính tổng tiền, action chuyển trạng thái và chức năng in đơn hàng ra PDF.

Trong Phần 2 này, mình sẽ hoàn thiện app với 3 việc chính:

  1. Khóa dữ liệu và ràng buộc để tránh sai sót khi đơn hàng đã thanh toán
  2. Định dạng màu sắc cho dễ theo dõi trạng thái đơn hàng
  3. Xây dựng bộ lọc thống kê doanh thu theo khoảng ngày

Cùng bắt tay vào làm tiếp nhé!

Video : P.2 –Tự viết ứng dụng quản lý tiệm giặt ủi xài trên điện thoại và máy tính bằng AppSheet

Đặt giá trị khởi tạo cho trạng thái đơn hàng mới

Việc đầu tiên mình xử lý là khi tạo một đơn hàng mới, cột Trạng thái và Thanh toán đang bị trống, chưa có giá trị mặc định. Mình vào bảng Đơn hàng, đặt Initial value cho hai cột này:

  • Trạng thái: "Mới nhận"
  • Thanh toán: "Chưa thanh toán"

Đồng thời, để người dùng không thể tự ý sửa hai cột này bằng tay (tránh trường hợp tạo đơn xong bấm thẳng “đã hoàn thành” là sai quy trình), mình đặt Editable_If cho cả hai cột với điều kiện:

CONTEXT("ViewType") <> "Form"

Điều kiện này có nghĩa là chỉ khi nào đang không ở màn hình Form thì mới cho sửa, tức là người dùng bắt buộc phải dùng action “Tiếp theo” mà mình đã tạo ở Phần 1 để chuyển trạng thái tuần tự, thay vì gõ tay tùy tiện.

Khóa bảng Đơn hàng chi tiết khi đơn hàng đã thanh toán

Đây là phần quan trọng để bảo vệ dữ liệu. Vấn đề là: khi một đơn hàng đã “Đã hoàn thành” và “Đã thanh toán”, nếu ai đó vẫn thêm được dòng chi tiết mới thì tổng tiền sẽ bị lệch so với số tiền khách đã trả.

Mình xử lý bằng cách đặt công thức cho cột ID (khóa chính) trong bảng Đơn hàng chi tiết, dùng Initial value:

IF([Đơn hàng].[Thanh toán] = "Đã thanh toán", "", UNIQUEID())

Nếu đơn hàng cha đã “Đã thanh toán” thì ID được gán rỗng, không tạo được dòng mới. Ngược lại thì vẫn tạo ID ngẫu nhiên như bình thường. Nhờ vậy, khi cố thêm dịch vụ vào một đơn đã thanh toán, hệ thống sẽ báo lỗi và không lưu được.

Ngoài ra, mình cũng ràng buộc thêm ở cột Số lượng:

Số lượng > 0, bắt buộc (Require)

Và cột Đơn giá trong bảng Dịch vụ:

Minimum value = 0, và Require = true

Việc này giúp ngăn người dùng nhập số âm hoặc số 0 làm sai lệch công thức tính tiền.

Ẩn nút Sửa và Xóa khi đơn hàng đã thanh toán

Chỉ chặn việc thêm mới thôi chưa đủ, vì người dùng vẫn có thể sửa hoặc xóa các dòng chi tiết cũ, làm lệch số tiền đã thu. Mình vào action Edit và Delete của bảng Đơn hàng chi tiết, đặt điều kiện hiển thị (Behavior > Show_If):

[Đơn hàng].[Thanh toán] = "Chưa thanh toán"

Với điều kiện này, hai nút Sửa và Xóa chỉ hiện ra khi đơn hàng chưa thanh toán. Một khi đơn hàng đã hoàn thành và thanh toán xong, toàn bộ dòng chi tiết coi như được “đóng băng”, không ai chỉnh sửa được nữa, giữ cho số liệu doanh thu luôn chính xác.

Tô màu và thêm icon cho trạng thái đơn hàng

Để nhìn vào app là biết ngay đơn nào xong, đơn nào chưa, mình vào view Đơn hàng, phần Format rules, tạo hai quy tắc tô màu cho cột Trạng thái:

Quy tắc 1 – Chưa hoàn thành (màu đỏ):

Điều kiện: [Thanh toán] = "Chưa thanh toán"
Màu chữ/nền: Đỏ
Icon: dấu X hoặc "no check"

Quy tắc 2 – Đã hoàn thành (màu xanh):

Điều kiện: [Thanh toán] = "Đã thanh toán"
Màu chữ/nền: Xanh
Icon: dấu check

Nhờ hai quy tắc này, mở view Đơn hàng lên là thấy ngay dòng nào màu đỏ (còn phải xử lý), dòng nào màu xanh có dấu check (đã xong, đã thu tiền), không cần mở từng đơn ra xem mới biết.

Xây dựng bảng và bộ lọc thống kê doanh thu

Phần thú vị nhất của Phần 2 là làm bộ lọc để chủ tiệm xem nhanh doanh thu theo khoảng thời gian, ví dụ xem tuần này thu được bao nhiêu, tháng này lời bao nhiêu.

Tạo sheet Thống kê

Mình quay lại Google Sheet, tạo thêm một sheet mới tên “Thống kê”, chỉ cần 2 cột:

  • ID: đặt cố định giá trị là 1 (vì bảng này chỉ có đúng 1 dòng dữ liệu, dùng làm bộ lọc)
  • Từ ngày: kiểu Date
  • Đến ngày: kiểu Date

Add bảng này vào app, tạo view dạng Detail, ẩn cột ID đi, chỉ hiện Từ ngày và Đến ngày để người dùng chọn khoảng thời gian muốn xem.

Cột ảo lọc đơn hàng theo khoảng ngày

Trong bảng Thống kê, mình tạo một Virtual Column tên “Kết quả”, kiểu List of Ref (hoặc EnumList), dùng hàm FILTER để lọc ra các đơn hàng nằm trong khoảng ngày đã chọn:

FILTER(
  "Đơn hàng",
  AND(
    IF(ISBLANK([Từ ngày]), TRUE, [_THISROW].[Ngày nhận] >= [Từ ngày]),
    IF(ISBLANK([Đến ngày]), TRUE, [_THISROW].[Ngày nhận] <= [Đến ngày])
  )
)

Lưu ý mình dùng thêm hàm ISBLANK để xử lý trường hợp người dùng chưa chọn ngày nào cả: lúc đó điều kiện sẽ luôn đúng (TRUE), giúp app tự động hiện toàn bộ đơn hàng từ trước đến nay khi chưa lọc gì. Còn khi đã chọn Từ ngày và Đến ngày cụ thể, công thức sẽ chỉ lấy các đơn hàng có Ngày nhận nằm trong khoảng đó.

Cột ảo tính tổng doanh thu

Tiếp theo, mình tạo thêm một Virtual Column nữa tên “Tổng thu”, dùng SUM kết hợp SELECT với đúng điều kiện lọc y hệt ở trên, nhưng lần này lấy tổng cột Tổng tiền thay vì lấy danh sách đơn hàng:

SUM(
  SELECT(
    Đơn hàng[Tổng tiền],
    AND(
      IF(ISBLANK([Từ ngày]), TRUE, [Ngày nhận] >= [Từ ngày]),
      IF(ISBLANK([Đến ngày]), TRUE, [Ngày nhận] <= [Đến ngày])
    )
  )
)

Nhờ công thức này, mỗi khi chủ tiệm chọn lại khoảng ngày, cột Tổng thu sẽ tự động cập nhật ngay lập tức, không cần bấm nút tính toán gì thêm. Ví dụ chọn từ ngày 1 đến ngày 2 thì ra một con số, chọn thêm ngày 3 vào thì số tiền tự động cộng dồn lên.

Làm nổi bật cột Tổng thu

Để cột Tổng thu dễ nhìn thấy, mình vào Format rules của view Thống kê, tô cho cột này một màu riêng (ví dụ hồng hoặc tím, tránh trùng với màu đỏ/xanh đã dùng ở trạng thái đơn hàng), tăng cỡ chữ lên và thêm icon biểu tượng đồng tiền ($) phía trước để nhìn vào là biết ngay đây là số tiền tổng.

Khóa view Thống kê

Vì view này chỉ dùng để xem, không phải để nhập liệu, mình ẩn hết các action Sửa và Xóa trong view Thống kê để tránh người dùng vô tình chỉnh sửa nhầm dữ liệu bộ lọc.

Hoàn thiện giao diện tổng thể

Cuối cùng, mình dành thời gian chỉnh trang lại toàn bộ ứng dụng cho gọn gàng, chuyên nghiệp hơn:

  • Trang khởi động (Starting view): đặt về view Thống kê, để mỗi lần mở app lên là thấy ngay tình hình doanh thu.
  • Icon cho từng view: gán icon phù hợp cho Đơn hàng, Khách hàng, Dịch vụ, Thống kê để phân biệt trực quan hơn trên thanh điều hướng.
  • Đổi nhãn cột sang tiếng Việt: các cột trong form (Tên dịch vụ, Đơn vị tính, Đơn giá, Ngày nhận, Ngày hẹn trả, Mã khách hàng, Ghi chú, Trạng thái, Thanh toán…) đều được đặt lại nhãn hiển thị bằng tiếng Việt rõ ràng, thay vì để tên cột kỹ thuật mặc định.
  • Sắp xếp lại vị trí các trường trong form: ví dụ đưa Tổng tiền lên đầu form Đơn hàng để nhìn thấy ngay số tiền trước khi xem chi tiết dịch vụ bên dưới, và rút gọn tên nhãn phần liên kết chi tiết đơn hàng thành “Chi tiết” cho gọn.

Sau khi chỉnh xong, mình thử lại toàn bộ luồng: mở app trên điện thoại và cả trên máy tính, vào Thống kê chọn khoảng ngày để xem doanh thu, mở một đơn hàng cũ đã thanh toán để kiểm tra chắc chắn không sửa xóa gì được nữa, tạo thử một đơn hàng mới để xem trạng thái mặc định và định dạng màu có hoạt động đúng không. Mọi thứ chạy mượt mà trên cả hai nền tảng.

Tổng kết

Vậy là qua 2 phần, mình đã hoàn thành một ứng dụng quản lý tiệm giặt ủi tương đối đầy đủ, chạy hoàn toàn miễn phí trên nền tảng AppSheet và Google Sheet, dùng được trên cả điện thoại lẫn máy tính:

  • Quản lý khách hàng, dịch vụ, đơn hàng và chi tiết đơn hàng
  • Tự động tính tổng tiền đơn hàng bằng công thức
  • Quy trình chuyển trạng thái đơn hàng theo từng bước rõ ràng
  • Ràng buộc dữ liệu chặt chẽ, khóa đơn hàng khi đã thanh toán để tránh sai sót
  • Tô màu, gắn icon để theo dõi trạng thái trực quan
  • Bộ lọc thống kê doanh thu theo khoảng ngày, tự động cập nhật
  • Xuất phiếu hẹn dịch vụ ra file PDF để giao cho khách

Với một tiệm giặt ủi nhỏ hoặc hộ kinh doanh cá thể, chỉ cần chiếc điện thoại là đã có thể quản lý toàn bộ đơn hàng, khách hàng và doanh thu, không cần bỏ tiền mua bất kỳ phần mềm quản lý nào.

Cảm ơn quý anh chị và các bạn đã theo dõi series này. Hẹn gặp lại trong những video thực hành AppSheet tiếp theo! hoặc các series về thủ thuật Excel và Google Sheet

#appsheettutorial #appsheet #quanlytiemgiatui #nocode #googlesheet

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *