Bán hàng online · 7 phút đọc · 2026-09-17
Phần mềm quản lý quán cafe miễn phí: bật bàn ăn và đơn tạm hoãn trên OSPOS
Bật bàn ăn trên OSPOS 3.4.1 gặp hai bẫy: hai bàn đầu không bao giờ hiện có khách, và danh sách đơn tạm hoãn báo lỗi. Mình tìm nguyên nhân trong mã, vá hai dòng theo nhánh master rồi chạy trọn một lượt bàn.

Tìm phần mềm quản lý quán cafe miễn phí, thứ bạn cần nhất thường không phải báo cáo mà là hai việc tại quầy: ghi món theo bàn và giữ đơn đó mở tới khi khách gọi thêm rồi tính tiền. Open Source Point of Sale (OSPOS) 3.4.1, một phần mềm POS miễn phí cho quán cafe theo giấy phép MIT, có sẵn cả hai tính năng qua mục "bàn ăn" và nút "Tạm hoãn". Mình bật chúng trên bản OSPOS đã cài và chuyển sang tiếng Việt ở bài phần mềm quản lý bán hàng mã nguồn mở, rồi chạy trọn một lượt bàn.
Chạy được, nhưng chỉ sau khi vượt qua hai cái bẫy:
- Hai bàn có sẵn trong bản cài không bao giờ hiện là có khách, dù đã gọi món và tạm hoãn.
- Bật bàn ăn thì danh sách đơn tạm hoãn bị lỗi, không gọi lại được đơn nào. Đây là lỗi của bản 3.4.1 đã có bản sửa trên GitHub.
Bài ghi lại từng bước, nguyên nhân tìm thấy trong mã nguồn, và luồng quán cafe sau khi sửa.
Bật bàn ăn trong phần mềm quản lý quán cafe miễn phí OSPOS
Vào Văn phòng → Cấu hình → tab Bàn ăn:
- Tích Sử dụng bàn ăn (mặc định tắt).
- Đặt tên cho từng bàn. Bấm dấu + để thêm bàn mới.
- Bấm Gửi. Trang báo "Cấu hình được lưu thành công."
Tên bàn không được trùng nhau và không được chứa dấu gạch dưới _. Sau khi bật, màn hình Bán hàng có thêm ô Bàn nằm cạnh "Chế độ đăng ký".

Cách đặt tên trong ảnh trên là có lý do, xem ngay phần dưới.
Bẫy 1: hai bàn đầu tiên không bao giờ "có khách"
Với một phần mềm quản lý bàn quán cafe, trạng thái bàn trống hay có khách là thứ nhân viên nhìn nhiều nhất. Bản cài mới có sẵn hai bàn tên "Delivery" và "Take Away". Lần đầu, mình đổi tên chúng thành "Bàn 1" và "Bàn 2", gọi 2 ly cà phê cho Bàn 1 rồi bấm Tạm hoãn. Kết quả:
- Trong cơ sở dữ liệu, bàn đó vẫn ở trạng thái 0 (trống).
- Ô chọn bàn vẫn liệt kê Bàn 1 như bàn trống, nhân viên khác có thể xếp khách mới vào.
Nguyên nhân nằm trong app/Models/Dinner_table.php: hai hàm occupy() (đánh dấu có khách) và release() (trả bàn) chỉ cập nhật khi mã bàn lớn hơn 2. Hai bàn mã 1 và 2 được thiết kế cho giao hàng và mang đi, nơi nhiều đơn dùng chung một "bàn".
Cách đặt đúng mà mình đã thử:
- Giữ bàn thứ nhất và thứ hai cho Giao hàng và Mang đi.
- Bàn thật trong quán bắt đầu từ dòng thứ ba: "Bàn 1" là bàn mã 3, "Bàn 2" là bàn mã 4.
Làm vậy thì tạm hoãn đơn Bàn 1 xong, bàn chuyển sang có khách và biến khỏi ô chọn bàn. Ô chỉ còn Giao hàng, Mang đi và Bàn 2.
Bẫy 2: danh sách đơn tạm hoãn bị lỗi ở bản 3.4.1
Đơn đã tạm hoãn phải gọi lại được qua nút Đơn hàng tạm hoãn. Trên bản 3.4.1 có bật bàn ăn, nút này mở ra một hộp thoại trống, chỉ có tiêu đề và nút Đóng. Mở thẳng địa chỉ /sales/suspended thì gặp trang "Whoops! We seem to have hit a snag."
Mình tạm chuyển OSPOS về chế độ development để xem lỗi thật:
ErrorException
Undefined property: CodeIgniter\View\View::$Dinner_tableLỗi nằm ở dòng 40 của app/Views/sales/suspended.php. Tra GitHub thì thấy issue #4283 ("Suspended Sales not displaying after migration from 3.3.9 to 3.4.1"). Issue đóng ngày 28/08/2025, người bảo trì ghi bản sửa đã vào nhánh master. Nhưng tới ngày mình kiểm (17/09/2026), bản phát hành ổn định mới nhất vẫn là 3.4.1, ra ngày 05/06/2025. Sau đó chỉ có một bản gắn nhãn "unstable".
Bản vá hai dòng
Mình so tệp suspended.php của bản 3.4.1 với nhánh master. Hai bản khác nhau đúng hai dòng.
Dòng 9, ngay trước ?> của khối PHP đầu tệp, bản master thêm:
$this->dinner_table = model(Dinner_table::class);Dòng 40, bản master đổi $this->Dinner_table (chữ D hoa) thành chữ thường:
<td><?= esc($this->dinner_table->get_name($suspended_sale['dinner_table_id'])) ?></td>Mình chép tệp của master đè lên bản cài thử, sau khi giữ lại một bản sao tệp gốc. Danh sách đơn tạm hoãn hiện lại bình thường. Đây là sửa tay theo nhánh master, không phải bản phát hành chính thức; khi OSPOS ra bản mới, bạn nên cập nhật theo bản đó.
Luồng một bàn từ gọi món tới tính tiền
Sau khi đặt tên bàn đúng và vá xong, mình chạy trọn một lượt.
Gọi món và giữ đơn. Chọn "Bàn 1" ở ô Bàn, gõ mã hàng 1 hai lần để có 2 ly cà phê, tổng 50.000 ₫.

Bấm Tạm hoãn, trang báo "Đã tạm hoãn thành công lần bán hàng." Hai điều mình kiểm được lúc này:
- Bàn 1 biến khỏi danh sách bàn trống.
- Kho chưa bị trừ. Cà phê vẫn tồn 128, nhật ký tồn không có dòng mới.
Gọi lại đơn. Bấm Đơn hàng tạm hoãn:

Hai dòng đầu là hai đơn thử từ lúc mình đặt tên sai ở Bẫy 1; hai bàn mã 1 và 2 giờ mang tên Giao hàng và Mang đi. Nút ở cột Thao tác ghi "Hủy tạm hoãn", nghe như xoá đơn, nhưng thực ra là gọi lại đơn vào giỏ hàng. Nên dặn trước nhân viên chỗ này.
Bấm "Hủy tạm hoãn" ở dòng Bàn 1: giỏ hiện lại 2 ly cà phê, ô Bàn vẫn là Bàn 1. Khách gọi thêm bánh mì, gõ mã 2, tổng lên 70.000 ₫.
Tính tiền. Đây là phần phần mềm tính tiền quán cafe miễn phí này làm như một máy POS bình thường. Nhập tiền mặt 70.000 rồi bấm Hoàn thành:

- Biên lai giữ đúng số đơn lúc tạm hoãn: POS 4.
- Với cấu hình biên lai mặc định, biên lai không in tên bàn. Mình chưa dò hết các tuỳ chọn trong tab Biên lai.
- Dòng "Tiền thối lại" hiện "-0 ₫" khi khách đưa vừa đủ tiền.
- Bàn 1 trở về trống và xuất hiện lại trong ô chọn bàn.
- Kho bị trừ lúc thanh toán: cà phê từ 128 còn 126, bánh mì từ 57 còn 56, nhật ký tồn ghi "POS 4".
Vì kho chỉ trừ khi thanh toán, số tồn trên màn hình không tính những món đang nằm ở các bàn chưa tính tiền. Với quán nhỏ thường không sao, nhưng cần biết khi đối chiếu kho giữa ca.
Phần mềm quản lý quán cafe miễn phí này hợp với quán nào
Giấy phép MIT không thu tiền và không có thời hạn, nên nếu bạn tìm phần mềm cafe miễn phí vĩnh viễn thì phần giấy phép đáp ứng được. Dựa trên những gì đo được, OSPOS dùng được cho quán cafe khi:
- Quán có ít bàn, một quầy thu ngân, cần ghi món theo bàn và giữ đơn mở.
- Có người dám sửa hai dòng trong tệp PHP, hoặc chờ bản phát hành có bản sửa.
- Chấp nhận biên lai mặc định không in số bàn.
Phần cài đặt, sao lưu và báo cáo lợi nhuận đã có ở bài cài OSPOS; phần nhập hàng và kiểm tồn ở bài phần mềm quản lý kho miễn phí.
Những gì mình chưa kiểm
- In phiếu cho bếp hay quầy pha chế.
- Chuyển hoặc gộp bàn. Trong mã có hàm
swap_tables, nhưng mình chưa thử. - Tách hoá đơn cho từng khách trong cùng bàn.
- Nhiều máy bán cùng lúc, và bản "unstable" mới nhất.
- Tác giả
- Quản trị viên
- Đăng ngày
- 2026-09-17
- Cập nhật
- 2026-09-17
- Thời gian đọc
- 7 phút đọc
- Tất cả bài viết