Sau khi hoàn thành bài học này, người học có thể:
Thiết kế Giao diện Dòng lệnh (CLI - Command Line Interface): Xây dựng một menu tương tác trên Terminal/Command Prompt để người dùng dễ dàng thao tác với hệ thống kế toán.
Tích hợp Hệ thống (System Integration): Kết nối toàn bộ các module (tạo giao dịch, sổ cái, kết chuyển, báo cáo) thành một ứng dụng hoàn chỉnh, liền mạch.
Xây dựng Giao diện Người dùng Đơn giản (GUI - Graphical User Interface): Sử dụng thư viện tkinter có sẵn trong Python để tạo một cửa sổ ứng dụng cơ bản, giúp người dùng không chuyên IT dễ dàng nhập liệu và trích xuất báo cáo.
Ứng dụng của chúng ta sẽ được tổ chức theo kiến trúc Model-View-Controller (MVC) đơn giản hóa:
Model (Cơ sở dữ liệu & Logic): Các hàm thao tác SQLite, xử lý kết chuyển (Bài 3.1), và trích xuất dữ liệu (Bài 2, 3.2, 3.3).
Controller (Điều hướng): CLI Menu hoặc GUI nhận lệnh từ người dùng và gọi các hàm Model tương ứng.
View (Giao diện): Terminal (cho CLI) hoặc Cửa sổ Windows/macOS (cho GUI).
┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐
│ Người dùng (User) │ ◄──► │ Controller (CLI/GUI) │ ◄──► │ Model (Python+SQL)│
└───────────────────────┘ └───────────────────────┘ └───────────────────────┘
CLI là cách nhanh nhất để tương tác với các script Python. Chúng ta sẽ sử dụng vòng lặp while để tạo menu.
import sys
from datetime import datetime
# Giả sử bạn đã lưu các hàm từ các bài trước vào các module tương ứng
# from accounting_core import record_transaction, get_general_ledger
# from closing_engine import run_month_end_closing
# from report_engine import get_balance_sheet, get_direct_cash_flow
# from excel_export import create_styled_financial_report
def display_menu():
print("\n" + "="*50)
print(" HỆ THỐNG KẾ TOÁN MINI (PYTHON & SQL) ")
print("="*50)
print("1. Nhập liệu Bút toán Kế toán (Ghi Sổ)")
print("2. Xem Sổ Cái Tài khoản")
print("3. Thực hiện Kết chuyển Cuối kỳ")
print("4. Xem Bảng Cân đối Kế toán")
print("5. Xuất Báo cáo Tài chính (Excel)")
print("0. Thoát chương trình")
print("="*50)
def cli_app():
while True:
display_menu()
choice = input("Nhập lựa chọn của bạn (0-5): ")
if choice == '1':
print("\n--- NHẬP LIỆU BÚT TOÁN ---")
date = input("Ngày giao dịch (YYYY-MM-DD): ")
voucher = input("Số chứng từ: ")
desc = input("Diễn giải: ")
lines = []
while True:
acc = input("Tài khoản (Nợ/Có) [Bỏ trống để dừng]: ")
if not acc: break
debit = float(input(f"Số tiền Ghi Nợ cho TK {acc} (Nhập 0 nếu ghi Có): ") or 0)
credit = float(input(f"Số tiền Ghi Có cho TK {acc} (Nhập 0 nếu ghi Nợ): ") or 0)
lines.append({"account_code": acc, "debit": debit, "credit": credit})
# record_transaction(date, voucher, desc, lines) # Gọi hàm từ Bài 2.1
print("[XÁC NHẬN] Đã ghi sổ thành công.")
elif choice == '2':
print("\n--- XEM SỔ CÁI TÀI KHOẢN ---")
acc = input("Nhập mã Tài khoản (VD: 111, 511): ")
from_date = input("Từ ngày (YYYY-MM-DD): ")
to_date = input("Đến ngày (YYYY-MM-DD): ")
# ledger = get_general_ledger(acc, from_date, to_date) # Gọi hàm từ Bài 2.2
print(f"[THÔNG BÁO] Đang hiển thị Sổ cái TK {acc} từ {from_date} đến {to_date}...")
elif choice == '3':
print("\n--- KẾT CHUYỂN CUỐI KỲ ---")
period = input("Nhập ngày cuối kỳ (YYYY-MM-DD, VD: 2026-09-30): ")
# result = run_month_end_closing(period) # Gọi hàm từ Bài 3.1
print(f"[XÁC NHẬN] Đã hoàn tất kết chuyển cho kỳ {period}.")
elif choice == '4':
print("\n--- BẢNG CÂN ĐỐI KẾ TOÁN ---")
as_of = input("Tại ngày (YYYY-MM-DD): ")
# bs = get_balance_sheet(as_of) # Gọi hàm từ Bài 3.2
print(f"[THÔNG BÁO] Đang hiển thị Bảng Cân đối Kế toán tại ngày {as_of}...")
elif choice == '5':
print("\n--- XUẤT BÁO CÁO EXCEL ---")
print("[THÔNG BÁO] Đang tổng hợp và xuất file Báo_Cao_Tai_Chinh_2026.xlsx...")
# create_styled_financial_report(df_pnl, df_bs, df_cf) # Gọi hàm từ Bài 4.2
print("[XÁC NHẬN] Đã xuất file Excel thành công.")
elif choice == '0':
print("Đang thoát chương trình. Tạm biệt!")
sys.exit(0)
else:
print("Lựa chọn không hợp lệ. Vui lòng thử lại.")
if __name__ == "__main__":
# Bỏ comment dòng dưới để chạy CLI
# cli_app()
pass
Đối với người dùng không quen với dòng lệnh, một giao diện cửa sổ trực quan sẽ thân thiện hơn. Chúng ta sẽ dùng tkinter, thư viện GUI mặc định của Python, để tạo một cửa sổ điều khiển chính.
import tkinter as tk
from tkinter import messagebox
# from report_engine import get_balance_sheet
def run_gui_app():
# 1. Khởi tạo Cửa sổ chính
root = tk.Tk()
root.title("Hệ thống Kế toán Mini")
root.geometry("400x350")
root.configure(padx=20, pady=20)
# 2. Tiêu đề
lbl_title = tk.Label(root, text="BẢNG ĐIỀU KHIỂN KẾ TOÁN", font=("Arial", 16, "bold"), fg="#1F4E78")
lbl_title.pack(pady=(0, 20))
# 3. Các hàm xử lý sự kiện (Event Handlers)
def open_transaction_window():
messagebox.showinfo("Tính năng", "Mở cửa sổ Nhập liệu Bút toán...")
# Ở đây bạn có thể tạo một tk.Toplevel() mới để thiết kế form nhập liệu
def run_closing():
# Giả lập xác nhận kết chuyển
if messagebox.askyesno("Xác nhận", "Bạn có chắc chắn muốn chạy Kết chuyển cuối tháng 09/2026?"):
# run_month_end_closing("2026-09-30")
messagebox.showinfo("Thành công", "Đã hoàn tất kết chuyển.")
def export_excel():
messagebox.showinfo("Thông báo", "Đang xuất báo cáo ra file Báo_Cao_Tai_Chinh_2026.xlsx...")
# create_styled_financial_report(...)
# 4. Các Nút chức năng
btn_style = {"font": ("Arial", 12), "width": 25, "pady": 5}
tk.Button(root, text="1. Nhập Bút Toán", command=open_transaction_window, **btn_style).pack(pady=5)
tk.Button(root, text="2. Kết Chuyển Cuối Kỳ", command=run_closing, **btn_style).pack(pady=5)
tk.Button(root, text="3. Xuất Báo Cáo Excel", command=export_excel, **btn_style).pack(pady=5)
tk.Button(root, text="Thoát", command=root.quit, font=("Arial", 12, "bold"), fg="red", width=25, pady=5).pack(pady=20)
# 5. Chạy vòng lặp sự kiện (Event Loop)
root.mainloop()
if __name__ == "__main__":
# Bỏ comment dòng dưới để chạy GUI
# run_gui_app()
pass
tk.Tk(): Khởi tạo cửa sổ chính của ứng dụng.
tk.Label: Hiển thị văn bản tĩnh (tiêu đề).
tk.Button: Nút bấm, liên kết với một hàm thông qua tham số command.
messagebox: Hộp thoại bật lên (pop-up) để thông báo, cảnh báo hoặc yêu cầu xác nhận.
root.mainloop(): Vòng lặp liên tục chờ người dùng tương tác (click chuột, gõ phím).
Nếu bạn muốn tạo một ứng dụng kế toán chạy trên trình duyệt web (Web App) để nhiều nhân viên có thể truy cập cùng lúc từ các máy tính khác nhau, bạn sẽ chọn hướng tiếp cận nào thay vì CLI hay Tkinter?
A. Tiếp tục dùng Tkinter nhưng chia sẻ màn hình qua Zoom/Google Meet. B. Sử dụng Python framework như Django hoặc Streamlit (sẽ học ở Bài 4.1) để xây dựng ứng dụng web và chia sẻ đường dẫn (URL). C. Chuyển toàn bộ mã nguồn Python thành một file Excel có chứa macro (VBA).
Đáp án đúng là B. Tkinter và CLI chỉ phù hợp cho ứng dụng chạy trên máy tính cá nhân (Desktop App/Local script). Để làm việc cộng tác (collaboration), Web App là giải pháp tối ưu.