Tới nội dung chính
hstation
Dịch vụDự ánVề tôiBlogThư viện nhạc

Bán hàng online · 11 phút đọc · 2026-09-17

Phần mềm quản lý bán hàng mã nguồn mở: cài OSPOS, đổi tiếng Việt và bán thử đơn

Mình cài OSPOS 3.4.1, đổi sang tiếng Việt và VND, bán thử một đơn 70.000 ₫ rồi đối chiếu báo cáo lợi nhuận với tính tay. Kèm các chỗ vấp: múi giờ, ô Giá bán buôn và cách sao lưu.

Bạn muốn một phần mềm quản lý bán hàng mã nguồn mở để tự cài, dữ liệu nằm trên máy của mình và không trả phí theo tháng? Open Source Point of Sale (gọi tắt OSPOS) là một lựa chọn như vậy: giấy phép MIT, vẫn đang ra bản mới. Mình cài bản 3.4.1 lên một máy Windows chạy Laragon, đổi sang tiếng Việt, thêm hai món, bán thử một đơn 70.000 ₫ rồi đối chiếu báo cáo lợi nhuận với phép tính tay.

Bài ghi lại từng lệnh đã chạy, các con số đo được và những chỗ vấp. Đây là bản cài thử trên máy cá nhân, không phải máy chủ thật. Mình chưa thử máy in hoá đơn nhiệt, máy quét mã vạch hay hoá đơn điện tử; phần cuối bài liệt kê đủ những gì chưa kiểm.

Nếu cửa hàng còn nhỏ và bạn đang ghi sổ bằng bảng tính, đọc bài File Excel quản lý bán hàng trước. Bảng tính có thể vẫn đủ dùng, và bạn sẽ biết rõ mình đang cần phần mềm để giải quyết việc gì.

OSPOS là gì, cần gì để chạy

Thông tin mình kiểm ngày 17/09/2026:

  • Phiên bản: 3.4.1, phát hành ngày 05/06/2025, là bản mới nhất trên trang phát hành GitHub lúc kiểm.
  • Giấy phép: MIT. Đây là phần mềm POS mã nguồn mở viết bằng PHP trên CodeIgniter 4.6.0, chạy trong trình duyệt.
  • Gói tải về: tệp zip 33.321.358 byte, giải nén ra 12.866 tệp, tổng 165 MB (thư mục vendor đã có sẵn).
  • Máy chủ: tệp INSTALL.md ghi cần PHP 8.1 đến 8.4 với các extension json, gd, bcmath, intl, openssl, mbstring, curl, xml; MySQL 5.7 hoặc MariaDB 10.x; Apache 2.4. Máy thử của mình chạy PHP 8.3.30 và MySQL 8.4.3.

INSTALL.md dặn hai điều nên đọc trước khi cài:

  1. Phải tải bản phát hành. Clone thẳng repo về sẽ không chạy nếu bạn không tự build.
  2. Có sẵn cấu hình Docker, nhưng chính tài liệu ghi rằng cách cài Docker thông thường không dành cho chạy thật.

Cài phần mềm quản lý bán hàng mã nguồn mở OSPOS từng bước

Các lệnh dưới đây chạy trong Git Bash hoặc terminal Linux. Tên cơ sở dữ liệu trong bài là ospos, trùng giá trị mặc định trong tệp .env.

Bước 1: tải bản phát hành và giải nén

bash
curl -L -o ospos-3.4.1.zip https://github.com/opensourcepos/opensourcepos/releases/download/3.4.1/opensourcepos.3.4.1.5f395d.zip
unzip -q ospos-3.4.1.zip -d ospos

Xong bước này khi trong thư mục ospos có đủ app, public, vendor, writable và tệp .env.

Bước 2: tạo cơ sở dữ liệu và chạy database.sql

bash
mysql -u root -p -e "CREATE DATABASE ospos CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"
mysql -u root -p ospos < ospos/app/Database/database.sql

Trên máy thử, tệp database.sql (27.937 byte) chạy hết 2.085 ms và tạo 27 bảng. Kiểm lại số bảng:

bash
mysql -u root -p -N -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='ospos'"

Bước 3: sửa tệp .env, sửa cả hai nhóm

Bản gốc để tên người dùng cơ sở dữ liệu là admin. Mở .env và sửa:

ini
database.default.database = 'ospos'
database.default.username = 'ten_nguoi_dung'
database.default.password = 'mat_khau'
database.development.database = 'ospos'
database.development.username = 'ten_nguoi_dung'
database.development.password = 'mat_khau'

Vì sao phải sửa cả nhóm development: tệp app/Config/Database.php chọn nhóm theo CI_ENVIRONMENT. Khi giá trị là development (mặc định của bản phát hành), OSPOS kết nối bằng nhóm database.development. Khi đổi sang production, nó dùng nhóm database.default. Chỉ sửa một nhóm thì sẽ hỏng ở một trong hai chế độ.

Bước 4: mở trình duyệt và đăng nhập

Chép thư mục ospos vào thư mục web, rồi mở http://localhost/ospos/public. Trang đăng nhập trả về trong khoảng 0,15 giây. Tài khoản mặc định là admin / pointofsale.

Lần đăng nhập đầu tiên, OSPOS tự chạy 40 bản cập nhật cơ sở dữ liệu (migration) trong khoảng 8 giây. Số bảng tăng từ 27 lên 39.

Dòng encryption.key trong .env để trống trong bản phát hành. Lần đầu bạn mở trang Cấu hình, OSPOS thấy khoá trống thì tự sinh một khoá dài 64 ký tự và ghi thẳng vào .env. Khoá này dùng để mã hoá mật khẩu SMTP, mật khẩu SMS và khoá Mailchimp mà bạn lưu trong phần cấu hình. Mất tệp .env thì mất luôn khả năng giải mã những giá trị đó.

Mật khẩu pointofsale nằm công khai trong tài liệu cài đặt, nên hãy đổi nó trước khi cho máy khác truy cập.

Tệp .env chứa mật khẩu cơ sở dữ liệu. Trên Apache của máy thử, gọi thẳng http://localhost/ospos/.env trả về 403 nhờ tệp .htaccess đi kèm gói. Nginx không đọc .htaccess, nên nếu dùng Nginx, bạn trỏ thư mục gốc của web vào public thay vì cả thư mục ospos.

Bước 5: chuyển sang chế độ production

ini
CI_ENVIRONMENT = production

Với giá trị mặc định development, trang đăng nhập nhúng cả mã gỡ lỗi Kint và góc phải màn hình có nút thanh gỡ lỗi. INSTALL.md dặn chạy ổn rồi thì đổi sang production. Mình đổi xong, tải lại trang: không còn đoạn Kint nào.

Đổi sang tiếng Việt và tiền đồng

Bản OSPOS tiếng Việt có sẵn trong gói, không phải tải thêm. Vào Văn phòng → Cấu hình → tab Định dạng (bản tiếng Anh gọi là Localization). Mặc định là tiếng Anh, múi giờ America/New_York, ký hiệu $, định dạng số en_US với 2 chữ số thập phân, ngày kiểu tháng/ngày/năm. Mình đặt lại:

  1. Ngôn ngữ: Vietnamese.
  2. Định dạng số: vi_VN. Ký hiệu tiền tệ: ₫. Mã tiền tệ: VND.
  3. Số chữ số sau dấu phẩy của tiền: 0.
  4. Múi giờ: "(GMT+07:00) Bangkok, Hanoi, Jakarta".
  5. Định dạng ngày và giờ: dd/mm/yyyy và 24 giờ.

Bấm Gửi, trang báo "Cấu hình được lưu thành công." Ô ví dụ cạnh định dạng số hiện 1.234.567.890 ₫.

Đặt 0 chữ số thập phân cho gọn thì có một đánh đổi mình đo được sau đó: nếu bạn bật tính giá vốn bình quân khi nhập hàng, giá vốn có phần lẻ (ví dụ 9.830,50) sẽ bị ghi lại thành 9.830 mỗi khi bạn mở form sửa mặt hàng rồi lưu. Chi tiết ở bài Phần mềm quản lý kho miễn phí OSPOS.

Tab Định dạng trong phần cấu hình OSPOS sau khi đổi: Định dạng số vi_VN với ví dụ 1.234.567.890 đồng, Ký hiệu tiền tệ là ký hiệu đồng, Mã tiền tệ VND, số chữ số sau dấu phẩy bằng 0, Ngôn ngữ Vietnamese, Múi giờ (GMT+07:00) Bangkok, Hanoi, Jakarta, định dạng ngày dd/mm/yyyy và giờ hh:mm:ss 24h, nút Gửi ở góc phải dưới.
Tab Định dạng trong phần cấu hình OSPOS sau khi đổi: Định dạng số vi_VN với ví dụ 1.234.567.890 đồng, Ký hiệu tiền tệ là ký hiệu đồng, Mã tiền tệ VND, số chữ số sau dấu phẩy bằng 0, Ngôn ngữ Vietnamese, Múi giờ (GMT+07:00) Bangkok, Hanoi, Jakarta, định dạng ngày dd/mm/yyyy và giờ hh:mm:ss 24h, nút Gửi ở góc phải dưới.

Không có Asia/Ho_Chi_Minh trong danh sách múi giờ

Danh sách múi giờ của OSPOS là danh sách viết sẵn trong mã nguồn, không có mục Asia/Ho_Chi_Minh. Mục đúng cho Việt Nam là "(GMT+07:00) Bangkok, Hanoi, Jakarta", lưu thành giá trị Asia/Bangkok.

Mình vấp đúng chỗ này. Mình đặt cấu hình bằng script với giá trị Asia/Ho_Chi_Minh; ô chọn không có giá trị đó nên form gửi lên chuỗi rỗng, OSPOS vẫn báo lưu thành công, và từ đó mọi trang trả lỗi 500 với thông báo Timezone ID '' is invalid. Sửa trong cơ sở dữ liệu thôi thì trang vẫn lỗi, vì OSPOS giữ bản cache cấu hình trong writable/cache/settings. Cách gỡ đã thử và chạy:

bash
mysql -u root -p ospos -e 'UPDATE ospos_app_config SET value="Asia/Bangkok" WHERE `key`="timezone"'
rm ospos/writable/cache/settings

Sau hai lệnh này trang đăng nhập trả 200 trở lại.

Đổi thông tin cửa hàng trước khi bán đơn đầu

Tab Thông tin mặc định ghi tên "Open Source Point of Sale", địa chỉ "123 Nowhere street", số điện thoại 555-555-5555 và chính sách đổi trả "Test". Cả bốn dòng này in lên hoá đơn, nên hãy sửa trước. Mình đổi thành "Quán thử OSPOS", một địa chỉ mẫu và dòng "Cảm ơn quý khách!".

Thêm hàng hoá: chữ "Giá bán buôn" thực ra là giá vốn

Vào Hàng hóa → Hàng hóa mới. Các ô chữ đỏ là bắt buộc.

Hộp thoại Hàng hóa mới của OSPOS bản tiếng Việt: Tên Hàng hóa Cà phê sữa đá, Thể loại Đồ uống, Kiểu kho Có hàng, Kiểu Hàng hóa Tiêu chuẩn, Nhà cung cấp Không, Giá bán buôn 12000, Giá bán lẻ 25000, hai dòng thuế để trống, Số lượng stock 100, Số lượng nhập hàng 1, nút Gửi và Mới ở dưới.
Hộp thoại Hàng hóa mới của OSPOS bản tiếng Việt: Tên Hàng hóa Cà phê sữa đá, Thể loại Đồ uống, Kiểu kho Có hàng, Kiểu Hàng hóa Tiêu chuẩn, Nhà cung cấp Không, Giá bán buôn 12000, Giá bán lẻ 25000, hai dòng thuế để trống, Số lượng stock 100, Số lượng nhập hàng 1, nút Gửi và Mới ở dưới.

Chỗ dễ nhầm nhất là ô Giá bán buôn. Trong mã nguồn, trường này tên cost_price, tức giá vốn. Báo cáo lợi nhuận lấy đúng ô này để trừ. Nếu bạn nhập giá bán sỉ vào đây, lợi nhuận trên báo cáo sẽ sai. Mình nhập hai món:

  • Cà phê sữa đá: thể loại Đồ uống, giá bán buôn (giá vốn) 12.000, giá bán lẻ 25.000, tồn 100.
  • Bánh mì trứng: thể loại Đồ ăn, giá bán buôn (giá vốn) 10.000, giá bán lẻ 20.000, tồn 50.

Bản dịch tiếng Việt có 1.542 khoá (bản tiếng Anh 1.543), trong đó 195 khoá để trống. Những lỗi mình gặp trên màn hình:

  • Cột giảm giá trên màn hình bán hàng ghi "Ggiá %".
  • "Số chữ số sau dấy phẩy" và "Mức đặt mua bổ xung" sai chính tả.

Các lỗi này không làm sai số, nhưng nhân viên mới nhìn vào sẽ bối rối. Nếu muốn sửa, các chuỗi nằm trong thư mục app/Language/vi.

Hai chỗ trông giống lỗi dịch nhưng không phải: ô "Số lượng stock" trong form và dòng "[49 in stock]" dưới tên hàng. Ở đây "stock" là tên kho mặc định, còn chữ "in" viết cứng trong giao diện. Đổi tên kho ở Cấu hình → tab Kho thành "Kho chính" thì dòng dưới tên hàng thành "[98 in Kho chính]".

Bán thử một đơn và đọc biên lai

Vào Bán hàng, rồi làm theo thứ tự:

  1. Gõ mã số hàng hoá 1 vào ô "Tìm hay quét Hàng hóa hay Biên lai", nhấn Enter. Làm lại lần nữa để có 2 ly cà phê.
  2. Gõ 2, nhấn Enter để thêm 1 bánh mì.
  3. Chọn phương thức Tiền mặt, nhập 100.000 vào ô số tiền, bấm Thêm thanh toán.
  4. Bấm Hoàn thành.
Màn hình Bán hàng của OSPOS với hai dòng: Bánh mì trứng giá 20.000 số lượng 1 và Cà phê sữa đá giá 25.000 số lượng 2. Cột phải ghi Tổng 70.000 đồng, Đã thanh toán 100.000 đồng, Số còn lại phải thanh toán -30.000 đồng, dòng Tiền mặt 100.000 đồng, nút Hoàn thành màu xanh, nút Tạm hoãn và Thôi.
Màn hình Bán hàng của OSPOS với hai dòng: Bánh mì trứng giá 20.000 số lượng 1 và Cà phê sữa đá giá 25.000 số lượng 2. Cột phải ghi Tổng 70.000 đồng, Đã thanh toán 100.000 đồng, Số còn lại phải thanh toán -30.000 đồng, dòng Tiền mặt 100.000 đồng, nút Hoàn thành màu xanh, nút Tạm hoãn và Thôi.

Trước khi bấm Hoàn thành, cột phải ghi "Số còn lại phải thanh toán -30.000 ₫". Số âm ở đây nghĩa là phải thối lại cho khách. Nút Thôi huỷ đơn đang mở sau một hộp xác nhận; mình thử rồi, giỏ trống và không có đơn nào được tạo.

Biên lai bán hàng của Quán thử OSPOS: Mã bán hàng POS 1, nhân viên John D, Cà phê sữa đá 25.000 đồng số lượng 2 thành 50.000 đồng, Bánh mì trứng 20.000 đồng số lượng 1, Tổng 70.000 đồng, dòng Tiền mặt -100.000 đồng, Tiền thối lại 30.000 đồng, dòng Cảm ơn quý khách và mã vạch POS 1.
Biên lai bán hàng của Quán thử OSPOS: Mã bán hàng POS 1, nhân viên John D, Cà phê sữa đá 25.000 đồng số lượng 2 thành 50.000 đồng, Bánh mì trứng 20.000 đồng số lượng 1, Tổng 70.000 đồng, dòng Tiền mặt -100.000 đồng, Tiền thối lại 30.000 đồng, dòng Cảm ơn quý khách và mã vạch POS 1.

Biên lai in dòng tiền mặt thành -100.000 ₫, có dấu âm. Khách đọc có thể thấy lạ, vì vậy hãy dặn trước nhân viên đứng quầy.

Mình mở cơ sở dữ liệu để xem OSPOS ghi những gì:

  • Bảng ospos_sales có 1 đơn.
  • Bảng ospos_sales_items lưu cả giá vốn tại thời điểm bán (12.000 và 10.000). Sau này bạn sửa giá vốn thì báo cáo của đơn cũ không bị đổi theo.
  • Tồn kho tự trừ: cà phê từ 100 còn 98, bánh mì từ 50 còn 49.
  • Cột payment_type trong ospos_sales_payments lưu nguyên chữ "Tiền mặt", tức chữ theo ngôn ngữ đang dùng lúc bán. Mình chưa thử đổi ngôn ngữ sau khi đã có đơn, nên chọn tiếng Việt ngay từ đầu cho chắc.

Báo cáo lợi nhuận có khớp với tính tay không

Vào Báo cáo, ở khung Báo cáo tổng thể chọn Hàng hóa, rồi chọn ngày 17/09/2026.

Báo cáo tổng thể Hàng hóa ngày 17/09/2026: Bánh mì trứng số lượng 1, tổng 20.000 đồng, bán buôn 10.000 đồng, lợi nhuận 10.000 đồng; Cà phê sữa đá số lượng 2, tổng 50.000 đồng, bán buôn 24.000 đồng, lợi nhuận 26.000 đồng. Dòng tổng bên dưới: Tổng phụ 70.000, Thuế 0, Tổng cộng 70.000, Bán buôn 34.000, Lợi nhuận 36.000 đồng.
Báo cáo tổng thể Hàng hóa ngày 17/09/2026: Bánh mì trứng số lượng 1, tổng 20.000 đồng, bán buôn 10.000 đồng, lợi nhuận 10.000 đồng; Cà phê sữa đá số lượng 2, tổng 50.000 đồng, bán buôn 24.000 đồng, lợi nhuận 26.000 đồng. Dòng tổng bên dưới: Tổng phụ 70.000, Thuế 0, Tổng cộng 70.000, Bán buôn 34.000, Lợi nhuận 36.000 đồng.

Tính tay: (25.000 − 12.000) × 2 + (20.000 − 10.000) = 26.000 + 10.000 = 36.000 ₫. Báo cáo ghi lợi nhuận 36.000 ₫, khớp. Cột "Bán buôn" trong báo cáo chính là tổng giá vốn (34.000 ₫).

Một chi tiết nhỏ: hai cột đơn giá trong báo cáo hiện số thô 10000.00, không theo định dạng vi_VN như các cột tiền còn lại.

Sao lưu phần mềm quản lý bán hàng tự cài

Tự cài nghĩa là bạn tự lo sao lưu. Một bản sao lưu cơ sở dữ liệu:

bash
mysqldump -u root -p --single-transaction ospos > ospos-sao-luu.sql

Trên máy thử, lệnh chạy 177 ms, ra tệp 64.587 byte chứa đủ 39 bảng. Chưa khôi phục thử thì chưa thể coi là đã có bản sao lưu, nên mình khôi phục vào một cơ sở dữ liệu mới:

bash
mysql -u root -p -e "CREATE DATABASE ospos_khoiphuc CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"
mysql -u root -p ospos_khoiphuc < ospos-sao-luu.sql

Khôi phục mất 1.555 ms. Kiểm lại thấy đủ 39 bảng, 1 đơn, tồn kho 98 và 49, đúng như trước khi sao lưu. Kiểm xong thì xoá cơ sở dữ liệu thử.

Ngoài tệp .sql, cần giữ thêm hai thứ:

  1. Tệp .env, vì trong đó có khoá mã hoá.
  2. Thư mục public/uploads/item_pics nếu bạn có tải ảnh hàng hoá lên. Đường dẫn này lấy từ app/Controllers/Items.php.

Nếu bạn quản lý kho bằng bảng tính song song trong lúc chuyển sang phần mềm, cấu trúc nhật ký nhập xuất trong bài File Excel quản lý kho giúp bạn đối chiếu tồn kho giữa hai bên.

Phần mềm bán hàng mã nguồn mở này hợp với ai

Nếu bạn đang tìm phần mềm quản lý bán hàng miễn phí, cần hiểu đúng chữ miễn phí ở đây: giấy phép MIT không thu tiền, nhưng máy chạy, người cài đặt và việc sao lưu vẫn là chi phí của bạn.

Dựa trên những gì đo được, phần mềm quản lý bán hàng mã nguồn mở OSPOS hợp với bạn khi:

  • Bạn có sẵn một máy chạy được PHP và MySQL, hoặc có người lo phần đó.
  • Bạn bán tại quầy, cần giỏ hàng, biên lai, trừ tồn và báo cáo lợi nhuận theo giá vốn.
  • Bạn chấp nhận tự sửa vài chuỗi dịch và tự sao lưu.

Chưa hợp khi bạn muốn mở trình duyệt là dùng ngay mà không cài gì, hoặc không có ai kiểm tra bản sao lưu định kỳ.

Những gì mình chưa kiểm

  • Máy in hoá đơn nhiệt, máy quét mã vạch thật, két tiền.
  • Nhiều chi nhánh hay nhiều kho, trả hàng, khách hàng thân thiết và điểm thưởng, gửi email hoặc SMS.
  • Hoá đơn điện tử theo quy định Việt Nam: chưa kiểm, nên bài không khẳng định OSPOS có hay không có.
  • Chạy trên máy chủ thật có HTTPS, nhiều máy bán cùng lúc, và cách cài bằng Docker.
  • Đổi ngôn ngữ sau khi đã có đơn thì báo cáo theo phương thức thanh toán hiển thị ra sao.
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
11 phút đọc
Tất cả bài viết