Viết App Quản Lý Tiệm Giặt Ủi Bằng AppSheet (Phần 1)

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

Xin chào quý anh chị và các bạn! Mình lại quay trở lại với series thực hành AppSheet mới. Lần này mình sẽ cùng nhau xây dựng một App Quản Lý Tiệm Giặt Ủi Bằng AppSheet hoàn toàn miễn phí, chạy được cả trên điện thoại lẫn máy tính, không tốn một đồng nào mua phần mềm quản lý. Rất phù hợp cho các tiệm giặt ủi nhỏ hoặc hộ kinh doanh cá thể đang tìm cách số hóa quy trình bán hàng của mình.

Trong Phần 1, mình sẽ tập trung vào ba việc chính:

  1. Thiết kế cấu trúc dữ liệu trên Google Sheet
  2. Tạo app từ Google Sheet và khai báo kiểu dữ liệu
  3. Tạo view cơ bản, cột ảo tính tổng tiền, action chuyển trạng thái và in đơn hàng ra PDF

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

Video hướng dẫn:P.1-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

Thiết kế 4 bảng dữ liệu trên Google Sheet

Việc đầu tiên và cũng là quan trọng nhất khi làm app AppSheet là thiết kế đúng cấu trúc dữ liệu ngay từ đầu. Mình mở Google Sheet, tạo một bảng tính trống và đặt tên là “Giặt ủi”. Sau đó mình chia dữ liệu thành 4 sheet (bảng) riêng biệt:

Bảng Khách hàng

Gồm các cột:

  • ID: mã khách hàng
  • Tên khách hàng
  • Số điện thoại: để liên lạc khi cần, gọi hoặc nhắn tin trực tiếp từ app
  • Địa chỉ: dùng cho việc giao nhận đồ
  • Ghi chú: ví dụ khách thích dùng loại bột giặt gì, có dặn không dùng nước xả hay không…

Bảng Dịch vụ

Đây là danh mục các dịch vụ mà tiệm cung cấp:

  • ID: mã dịch vụ
  • Tên dịch vụ: ví dụ giặt máy, giặt tay…
  • Đơn vị tính: kg, cái, bộ… tùy loại dịch vụ
  • Đơn giá: giá tiền trên mỗi đơn vị tính

Bảng Đơn hàng

Đây là bảng “đầu” chứa thông tin chung của một đơn hàng:

  • ID: mã đơn hàng
  • Ngày nhận
  • Ngày hẹn trả
  • Mã khách hàng: liên kết tới bảng Khách hàng
  • Tổng tiền: cột này mình sẽ dùng công thức để tự động tính, không nhập tay
  • Ghi chú: ghi chú riêng cho đơn hàng, ví dụ “làm gấp”
  • Trạng thái: mới nhận, đang giặt, chờ thanh toán, đã hoàn thành…
  • Thanh toán: đã thanh toán / chưa thanh toán
  • File: cột lưu file PDF để in đơn hàng cho khách

Bảng Đơn hàng chi tiết

Vì một đơn hàng có thể gồm nhiều loại đồ và nhiều dịch vụ khác nhau (ví dụ vừa giặt áo sơ mi, vừa giặt mền), nên mình tách riêng ra một bảng chi tiết:

  • ID: mã dòng chi tiết
  • ID đơn hàng: liên kết ngược về bảng Đơn hàng
  • Loại đồ: áo sơ mi, mùng mền, giày, chiếu…
  • Dịch vụ: liên kết tới bảng Dịch vụ
  • Số lượng
  • Thành tiền: tự động tính bằng công thức

Việc tách thành 4 bảng như thế này giúp dữ liệu gọn gàng, không bị lặp lại, và cũng đúng chuẩn thiết kế cơ sở dữ liệu quan hệ mà sau này AppSheet sẽ tận dụng rất tốt.

Tạo app và khai báo kiểu dữ liệu cho từng cột

Sau khi có đủ 4 bảng, mình vào AppSheet, chọn “Tạo ứng dụng mẫu” (Create app from your own data) và trỏ tới file Google Sheet vừa tạo. AppSheet sẽ tự động add hết 4 bảng vào phần Data.

Bước tiếp theo, quan trọng nhất là khai báo đúng kiểu dữ liệu (type) cho từng cột, vì nó quyết định app hiển thị và xử lý dữ liệu như thế nào:

  • Cột Tên dịch vụ, Loại đồ: mình để kiểu Enum, thay vì Ref, để tránh tạo thêm bảng ảo làm app nặng. Với Enum, mình liệt kê sẵn các lựa chọn (giặt máy, giặt tay…) và có thể cho phép người dùng “chọn thêm” nếu cần.
  • Cột Đơn giá, Số lượng, Thành tiền: kiểu Number
  • Cột Ngày nhận, Ngày hẹn trả: kiểu Date
  • Cột Mã khách hàng trong bảng Đơn hàng: kiểu Ref, liên kết sang bảng Khách hàng, có auto-compute gợi ý danh sách khách hàng để chọn
  • Cột Số điện thoại: kiểu Phone – nhờ vậy app tự hiện nút gọi trực tiếp và nhắn tin ngay trên điện thoại
  • Cột Địa chỉ: kiểu Address
  • Cột Ghi chú: kiểu Long Text
  • Cột Trạng thái, Thanh toán: kiểu Enum
  • Cột File trong bảng Đơn hàng: kiểu File, dùng để lưu file PDF in ra sau này
  • Cột ID đơn hàng trong bảng Đơn hàng chi tiết: kiểu Ref trỏ về bảng Đơn hàng, có bật Is a part of? để khi xóa đơn hàng lớn thì các dòng chi tiết cũng tự xóa theo

Riêng cột Tên khách hàng trong bảng Đơn hàng, thay vì để người dùng gõ tay, mình dùng App Formula để tự động lấy tên từ bảng Khách hàng dựa vào mã khách hàng đã chọn:

[Mã khách hàng].[Tên khách hàng]

Cách này giúp dữ liệu luôn đồng bộ, không sợ gõ sai tên khách.

Tạo dữ liệu mẫu để test app

Trước khi chỉnh giao diện, mình tạo vài dòng dữ liệu mẫu để dễ hình dung: thêm 2 khách hàng (kèm số điện thoại, địa chỉ, ghi chú), thêm 2 dịch vụ (giặt thường tính theo kg, giặt tay tính theo cái), rồi tạo thử 2 đơn hàng với vài dòng chi tiết. Có dữ liệu mẫu rồi, việc chỉnh view sẽ trực quan hơn nhiều.

Tùy chỉnh view cho từng bảng

AppSheet tự tạo sẵn view cho từng bảng, mình chỉ cần đổi tên và chỉnh lại cho gọn gàng, dễ nhìn:

  • View Khách hàng: dạng Deck, dòng đầu hiện tên khách hàng, dòng phụ hiện số điện thoại, summary column hiện ghi chú.
  • View Dịch vụ: dòng đầu là tên dịch vụ, dòng phụ là đơn vị tính, summary column hiện đơn giá.
  • View Đơn hàng: mình chọn kiểu Deck, group theo cột Ngày nhận để các đơn hàng cùng ngày gom lại với nhau, dễ theo dõi trong ngày. Primary header là tên khách hàng, secondary là ghi chú.
  • View Đơn hàng chi tiết: hiện tên dịch vụ, số lượng và thành tiền, gắn dưới dạng “Related” bên trong view Đơn hàng để khi mở một đơn hàng là thấy ngay các dòng chi tiết bên trong.

Cột ảo tự động tính tổng tiền đơn hàng

Đây là phần mình thấy hay nhất trong Phần 1 này. Thay vì phải cộng tay tổng tiền mỗi đơn hàng, mình tạo một Virtual Column tên là “Tổng tiền” trong bảng Đơn hàng, với công thức:

SUM(SELECT(Đơn hàng chi tiết[Thành tiền], [ID đơn hàng] = [_THISROW].[ID]))

Công thức này sẽ cộng tất cả giá trị cột Thành tiền trong bảng Đơn hàng chi tiết, nhưng chỉ lấy những dòng có ID đơn hàng trùng với đơn hàng hiện tại. Nhờ là cột ảo (Virtual Column), giá trị này sẽ tự động cập nhật mỗi khi có thay đổi ở bảng chi tiết, không cần chạy automation hay bấm nút “update” gì cả.

Tương tự, cột Thành tiền trong bảng Đơn hàng chi tiết cũng dùng App Formula để tự tính bằng số lượng nhân đơn giá dịch vụ:

[Số lượng] * [Dịch vụ].[Đơn giá]

Action chuyển trạng thái đơn hàng theo từng bước

Để tiệm dễ theo dõi tiến độ, mình tạo một action tên “Tiếp theo” gắn vào view Đơn hàng, dùng hàm IFS để tự động chuyển trạng thái theo trình tự: Mới nhận → Đang giặt → Chờ thanh toán → Đã hoàn thành.

IFS(
  [Trạng thái] = "Mới nhận", "Đang giặt",
  [Trạng thái] = "Đang giặt", "Chờ thanh toán",
  [Trạng thái] = "Chờ thanh toán", "Đã hoàn thành"
)

Đồng thời, khi trạng thái chuyển thành “Đã hoàn thành”, cột Thanh toán cũng tự động chuyển sang “Đã thanh toán”:

IF([Trạng thái] = "Đã hoàn thành", "Đã thanh toán", "Chưa thanh toán")

Mình cũng thiết lập điều kiện hiển thị (Behavior) cho action này và các nút Sửa/Xóa: chỉ hiện khi đơn hàng chưa thanh toán. Nhờ vậy, khi đơn hàng đã hoàn thành và thanh toán xong, dữ liệu coi như được “khóa” lại, tránh sửa xóa nhầm.

In đơn hàng ra file PDF cho khách

Cuối cùng, mình làm chức năng in đơn hàng thành file PDF để đưa cho khách giữ, giống như một biên nhận dịch vụ. Cách làm gồm 2 bước:

Bước 1: Tạo action đặt giá trị cho cột File bằng công thức nối chuỗi CONCATENATE, ghép tên app, thư mục lưu và thời gian tạo để tạo ra một tên file duy nhất mỗi lần in:

CONCATENATE(CONTEXT("AppName"), "/View/", TEXT(NOW(), "yyyy-MM-dd-HH-mm"), ".pdf")

Bước 2: Tạo một Automation (Bot) lắng nghe sự kiện khi cột File thay đổi giá trị (so sánh [_THISROW_BEFORE].[File] <> [_THISROW_AFTER].[File]), rồi chạy task “Generate a new file” để xuất view đơn hàng thành PDF, lưu vào Google Drive.

Sau khi có file mẫu, mình quay lại chỉnh sửa layout cho đẹp: thêm tiêu đề “Phiếu hẹn dịch vụ”, canh giữa, tô màu nền cho dòng tiêu đề bảng chi tiết, in đậm và căn phải dòng Tổng tiền… để khi in ra trông chuyên nghiệp, đầy đủ thông tin ngày nhận, ngày hẹn trả, tên khách hàng, ghi chú, chi tiết dịch vụ và tổng tiền.

Tổng kết Phần 1

Vậy là trong Phần 1, mình đã hoàn thành:

  • Thiết kế 4 bảng dữ liệu: Khách hàng, Dịch vụ, Đơn hàng, Đơn hàng chi tiết
  • Khai báo kiểu dữ liệu phù hợp cho từng cột (Enum, Ref, Phone, Address, File…)
  • Tạo view cơ bản, dễ nhìn cho từng bảng
  • Dùng cột ảo để tự động tính tổng tiền đơn hàng
  • Tạo action chuyển trạng thái đơn hàng theo quy trình
  • Tự động xuất file PDF đơn hàng để giao cho khách

Ứng dụng lúc này đã đủ dùng để một tiệm giặt ủi nhỏ vận hành hằng ngày: nhận đơn, theo dõi tiến độ giặt, tính tiền tự động và in biên nhận cho khách – hoàn toàn miễn phí, không cần mua phần mềm quản lý nào cả.

Trong Phần 2 của series, mình sẽ tiếp tục xây dựng thêm phần thống kê và bộ lọc doanh thu theo khách hàng, theo ngày, theo tháng, giúp chủ tiệm dễ dàng nắm được tình hình kinh doanh chỉ bằng vài cú chạm trên điện thoại. Hẹn gặp lại quý anh chị và các bạn trong phần tiếp theo nhé!

Xem thêm các bài viết xây dựng ứng dụng khác bằng Appsheet, hay các mẹo Excel và Google Sheet nữa nha.

#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 *