Xuất PDF & Hoàn Thiện App Bán Hàng AppSheet (Phần Kết)

quản lý bán hàng quản lý kho nhập xuất tồn

Đây là phần cuối cùng của series: Tự tay xây App Bán Hàng AppSheet. Sau bốn phần dựng dữ liệu, tự động hóa và khóa phiếu, Phần 5 tập trung vào những gì biến một “bảng tính có công thức” thành một ứng dụng hoàn chỉnh: xuất phiếu ra file PDF để in/gửi khách, dựng menu điều hướng Home, và tô màu cho dễ nhìn.

Hoàn tất khóa/mở khóa cho công nợ

Ở Phần 4 mới làm khóa/mở khóa cho phiếu nhập, phiếu xuất; giờ làm nốt cho Công nợ khách hàng và Công nợ nhà cung cấp theo đúng công thức đã dùng: Action set Tình trạng = “Đã khóa” (gắn inline vào cột Tên khách hàng, icon lock, chỉ hiện khi đang mở) và Action ngược lại set về “Đang mở” (icon unlock, chỉ hiện khi đã khóa), kèm điều kiện [Tình trạng]="Đang mở" cho Edit/Delete mặc định.

Điểm thêm mới: tick tuỳ chọn “Need confirmation” cho Action khóa – khi bấm, app sẽ hỏi lại một câu xác nhận, tránh khóa nhầm vì thao tác này khó undo qua giao diện thường (phải vào tận nút mở khóa mới sửa lại được).

Video :Tự tạo phần mềm quản lý bán hàng nhập xuất tồn kho, quản lý công nợ đơn giản bằng appsheet

Xuất phiếu nhập/phiếu xuất ra file PDF

Đây là phần kỹ thuật nhất của cả series: biến một phiếu nhập/xuất trong app thành một file PDF giống hóa đơn, có thể tải về, in ra, hoặc gửi cho khách hàng.

Thêm cột File và tạo tên file

Thêm một cột File vào cả bảng Phiếu nhập và Phiếu xuất trên Google Sheet, add lại vào cấu trúc bảng trong AppSheet.

Tạo Action “Tạo phiếu nhập” ở bảng Phiếu nhập, kiểu set the value of a column cho cột File, với công thức:

CONCATENATE(
  "/", CONTEXT("AppName"), "/Phiếu nhập/",
  TEXT(NOW(), "yyyy-MM-dd HH-mm-ss"), ".pdf"
)

Dùng CONTEXT("AppName") thay vì gõ cứng tên app, để sau này copy app sang tài khoản khác thì đường dẫn vẫn tự đúng, không bị lỗi. Phần TEXT(NOW(), ...) tạo tên file theo ngày giờ hiện tại để không bị trùng. Gắn icon printer cho nút này.

Tự động sinh file PDF bằng Automation

Chỉ tạo được tên file thôi chưa đủ – cần một Automation để thực sự sinh ra file. Tạo bot mới:

  • Event: bảng Phiếu nhập, chỉ bắt Update, với điều kiện [_THISROW_BEFORE].[File] <> [_THISROW_AFTER].[File] – nghĩa là chỉ chạy khi giá trị cột File vừa thay đổi (tức vừa bấm nút “Tạo phiếu nhập” ở bước trên).
  • Step: chọn “Create a new file”, định dạng PDF, để AppSheet tự sinh ra một file mẫu (template) dựa theo dữ liệu của Phiếu nhập và Phiếu nhập chi tiết liên quan. Đường dẫn thư mục đặt là “Phiếu nhập” để khớp với tên file đã tạo ở bước trên.

Bấm chạy thử, mở file vừa tạo – AppSheet cho ra một bản PDF thô sơ. Bước tiếp theo là chỉnh sửa lại template này cho đẹp và đúng ý.

Chỉnh sửa mẫu PDF

Vào phần chỉnh sửa template (trong action Create file), thực hiện:

  • Đưa ngày lên đầu, gộp gọn với phần tiêu đề “Phiếu nhập hàng”.
  • Thay hiển thị mã nhà cung cấp (chuỗi ký tự khó đọc) bằng tên nhà cung cấp – dùng cú pháp tham chiếu [Mã nhà cung cấp].[Tên nhà cung cấp] để lấy đúng tên qua liên kết.
  • Ở bảng chi tiết: đổi cột hiển thị từ Mã sản phẩm sang Tên sản phẩm, canh giữa và tô nền xám cho dòng tiêu đề, canh phải cho các cột số (Số lượng, Đơn giá, Thành tiền) vì đây là dữ liệu dạng số.
  • Thêm một dòng Tổng số lượng và Tổng giá trị ở cuối bảng chi tiết, tô đậm và canh phải để nổi bật.
  • Chỉnh chiều cao dòng và căn nội dung xuống dưới cùng ô thay vì mặc định canh trên, giúp bảng nhìn cân đối hơn.

Làm tương tự để tạo Action “Tạo phiếu xuất” và Automation tương ứng cho bảng Phiếu xuất, đặt tên file mẫu là “Hóa đơn bán hàng” – vì phiếu xuất thường dùng để gửi cho khách hàng nên đặt tên thân thiện, dễ hiểu hơn “phiếu xuất”.

Dọn giao diện phần PDF

Đưa nút mở file (icon mở file/con mắt) lên vị trí nổi bật (Prominence), nằm cạnh nút “Tạo phiếu”, để người dùng bấm tạo xong là mở xem PDF ngay. Ẩn cột File thô (chứa đường dẫn) khỏi giao diện chính vì không cần thiết hiển thị cho người dùng thường.

Dựng Menu Home để điều hướng tập trung

Thay vì để người dùng tự tìm các view rời rạc, tạo một màn hình chính (Home) gom tất cả chức năng lại, giống như trang chủ của một app thương mại.

Tạo bảng Home

Tạo sheet mới tên “Home” với các cột: ID, Nhóm (Kho hàng / Tài chính / Thông tin), Chức năng (tên view muốn liên kết tới), Hiển thị (tên hiện ra cho người dùng), Mô tả (mô tả ngắn), Hình ảnh (link ảnh minh họa).

Nhập dữ liệu phân theo 3 nhóm:

  • Kho hàng: Sản phẩm, Nhập kho, Xuất kho, Thống kê.
  • Tài chính: Công nợ khách hàng, Công nợ nhà cung cấp.
  • Thông tin: Nhân viên, Khách hàng, Nhà cung cấp.

Lưu ý tách riêng cột Hiển thị khỏi cột Chức năng (tên view thật) – để sau này đổi tên view kỹ thuật bên trong mà không ảnh hưởng tới chữ hiển thị ra ngoài cho người dùng, đỡ phải sửa lại nhiều chỗ.

Tạo View Home dạng thẻ (Deck/Card)

Add bảng Home vào app, tạo View mới kiểu Deck (hoặc Card), chọn cột Hiển thị làm tiêu đề, Mô tả làm phụ đề, Hình ảnh hiển thị dạng Content (ảnh nhỏ). Thiết lập Group by Nhóm để các chức năng gom cụm theo Kho hàng / Tài chính / Thông tin, dễ tìm hơn.

Action điều hướng “Đi đến chức năng”

Tạo Action kiểu “Go to another view within this app”, target là công thức LINKTOVIEW([Chức năng]) – lấy giá trị cột Chức năng của dòng đang bấm để nhảy tới đúng view tương ứng. Gắn action này lên toàn bộ dòng (Row selected) trong view Home, đồng thời ẩn các nút Edit/Delete mặc định – Home chỉ dùng để điều hướng, không dùng để sửa dữ liệu.

Icon minh họa

Lấy icon miễn phí từ các trang như Flaticon: mỗi dòng trong bảng Home copy link ảnh (chuột phải → sao chép địa chỉ hình ảnh) dán vào cột Hình ảnh – ví dụ hộp hàng cho Sản phẩm, mũi tên vào kho cho Nhập kho, mũi tên ra khỏi kho cho Xuất kho, biểu tượng lọc cho Thống kê, ví tiền cho Công nợ, ngôi sao cho Khách hàng…

Đặt Home làm màn hình khởi động

Vào Settings > General > Starting view, chọn view Home – để mỗi lần mở app lên là vào thẳng menu chính, không phải các bảng dữ liệu thô. Sau đó vào từng view gốc (Sản phẩm, Khách hàng, Công nợ, Phiếu nhập…), chuyển chúng thành Reference view (ẩn khỏi thanh điều hướng chính) – chỉ còn truy cập được thông qua bấm từ Home, giúp giao diện gọn hơn hẳn.

Tô màu cho dễ nhìn

Tô màu công nợ theo loại giao dịch

Dùng Format rules (tô màu có điều kiện): với bảng Công nợ khách hàng, tạo rule khi [Loại giao dịch] = "Tăng công nợ" → cột Loại giao dịch và Số tiền hiện màu xanh; khi [Loại giao dịch] = "Giảm công nợ" → hai cột đó hiện màu đỏ. Làm tương tự cho Công nợ nhà cung cấp. Nhìn vào danh sách là biết ngay dòng nào tăng, dòng nào giảm mà không cần đọc chữ.

Tô màu trạng thái khóa của phiếu

Với Phiếu nhập, Phiếu xuất: tạo hai Format rule dựa vào cột Tình trạng – “Đang mở” thì gắn icon mở khóa màu xanh vào cột tên (ẩn) nhà cung cấp/khách hàng, “Đã khóa” thì gắn icon khóa màu đỏ. Kết quả: chỉ cần nhìn màu icon trên danh sách là biết ngay phiếu nào còn sửa được, phiếu nào đã chốt.

Gom nhóm theo ngày, ẩn ngày lặp lại

Ở các view Công nợ, Phiếu nhập, Phiếu xuất: thiết lập Sort by Ngày (giảm dần) và Group by Ngày, kèm Group aggregate = Count để biết mỗi ngày có bao nhiêu giao dịch phát sinh.

Vì group theo ngày rồi nên cột Ngày lặp lại trên từng dòng là thừa – bỏ tick Show ở cột Ngày, nhưng để nó chỉ ẩn khi xem dạng danh sách chứ vẫn hiện khi mở chi tiết từng phiếu, bằng công thức Show:

CONTEXT("ViewType") = "Form"

Nghĩa là cột này chỉ hiển thị khi đang ở màn hình Form (thêm/sửa chi tiết), còn ở view danh sách thì ẩn đi vì đã có tiêu đề nhóm theo ngày rồi.

Tổng kết cả series

Vậy là sau 5 phần, từ một Google Sheet trống, series đã dựng nên một ứng dụng quản lý bán hàng hoàn chỉnh:

  1. Phần 1 – Dựng cấu trúc dữ liệu và khung sườn app (Nhân viên, Sản phẩm, Khách hàng, Nhà cung cấp, Công nợ, Phiếu nhập/xuất).
  2. Phần 2 – Action, Automation tự động đồng bộ tên, tính tổng số lượng/giá trị, tính công nợ.
  3. Phần 3 – Bộ lọc thống kê theo ngày và cơ chế khóa phiếu để bảo vệ dữ liệu.
  4. Phần 4 – Khóa/mở khóa công nợ, chặn xuất kho vượt tồn, dọn giao diện tiếng Việt.
  5. Phần 5 – Xuất phiếu ra PDF, dựng menu Home điều hướng, tô màu hoàn thiện giao diện.

Kết quả cuối cùng là một app hoàn toàn miễn phí, chạy trên nền Google Sheet + AppSheet, đủ sức quản lý bán hàng, tồn kho và công nợ cho một cửa hàng nhỏ mà không cần viết một dòng code nào. Cảm ơn các bạn đã theo dõi suốt series .

Chúc các bạn tự tay dựng được app quản lý cho riêng mình!

Để 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 *