Dự Án NHÂN LỰC KHÔNG GIAN 

Chương trình Quản lý Nhân Viên: Xây Dựng Hệ Thống HRMS Cho Trạm Không Gian Vũ Trụ!

Môn học: Lập trình Python cơ bản. Bài tập số: 03 Tên bài tập: Chương trình Quản lý Nhân viên Thời gian làm bài dự kiến: 240 phút (hãy coi đây là thời gian nhiệm vụ dự kiến của phi hành đoàn!)

Mở Đầu (Hook & Mục Tiêu):

Chào mừng, Pythonista

Tưởng tượng bạn đang điều hành một trạm không gian khổng lồ, nơi hàng trăm phi hành gia, kỹ sư và nhà khoa học đang làm việc ngày đêm để duy trì hoạt động và khám phá những bí ẩn của vũ trụ. Mỗi cá nhân là một mảnh ghép quan trọng, và việc quản lý họ – từ thông tin cá nhân, chức vụ, đến việc tính toán “lương năng lượng” hàng tháng – là tối quan trọng để đảm bảo trạm hoạt động trơn tru. Một hệ thống HRMS (Human Resources Management System) hiệu quả không chỉ giúp bạn theo dõi từng thành viên mà còn tự động hóa việc chi trả, đảm bảo công bằng và minh bạch.

Bạn đã học được cách xây dựng các “module” riêng biệt với OOP, cách xử lý các “tín hiệu bất ngờ” (lỗi), và cách “thu thập thông tin” từ các “nguồn dữ liệu ngoài không gian” (Web Scraping, JSON, API). Giờ là lúc kết hợp tất cả các “công nghệ” này để xây dựng một Hệ thống Quản lý Nguồn Nhân lực Phi Hành Đoàn hoàn chỉnh bằng Python!

Trong dự án này, bạn sẽ:

• Thiết kế và xây dựng các lớp (Classes) cho các thực thể trong hệ thống: Employee, Manager, và Department, giống như việc bạn thiết kế các bộ phận chức năng cho trạm không gian.

• Xây dựng hệ thống menu tương tác, cho phép bạn quản lý nhân viên một cách dễ dàng.

• Tích hợp khả năng “thu thập dữ liệu thông minh” từ Internet để tính toán các yếu tố như thuế và mức phạt.

• Áp dụng xử lý lỗi để chương trình của bạn luôn vững vàng trước mọi “bão không gian”.

• Lưu trữ dữ liệu một cách bền vững, đảm bảo rằng mọi thông tin quan trọng đều được bảo toàn.

Hãy sẵn sàng cho nhiệm vụ lớn lao này! Tương lai của trạm không gian phụ thuộc vào hệ thống bạn sắp xây dựng.

1. Lý Thuyết & Khái Niệm (HaivanStory’s Voice):

Trong các câu chuyện về những đế chế vũ trụ, việc tổ chức và quản lý quân đội hay công dân luôn là yếu tố then chốt. Một hệ thống máy tính tự động hóa, có khả năng xử lý thông tin phức tạp và đưa ra các quyết định chính xác, là vô cùng cần thiết. Dự án này chính là cơ hội để bạn tạo ra một phiên bản thu nhỏ của hệ thống đó.

Các Khái Niệm Chính Sẽ Được Áp Dụng:

1 Lập trình Hướng Đối Tượng (OOP) – “Kiến trúc Module của Trạm Không Gian”:

• Bạn sẽ định nghĩa các Class (Employee, Manager, Department) như những bản thiết kế cho các “module” độc lập của trạm. Mỗi module có các “thuộc tính” (dữ liệu) và “hành vi” (phương thức) riêng biệt.

• Kế thừa (Inheritance): Manager sẽ “kế thừa” từ Employee. Điều này giống như việc một “phi hành gia cấp cao” vẫn mang những đặc điểm cơ bản của một “phi hành gia thông thường” nhưng có thêm những “năng lực đặc biệt” của riêng họ. (Tham khảo lại Tính kế thừa trong Python.docx và Lab Kế thừa trong Python.docx).

2 Xử lý Lỗi (Try-Except) – “Lá chắn Bão Không Gian”:

• Khi bạn tương tác với người dùng hoặc đọc dữ liệu từ bên ngoài, “trục trặc” là không thể tránh khỏi. try-except sẽ là hệ thống cảnh báo và phục hồi của bạn. Nó đảm bảo rằng chương trình không “sụp đổ” khi gặp phải dữ liệu không hợp lệ, tệp không tìm thấy, hay các sự cố bất ngờ khác. (Tham khảo lại Bài 13: Xử Lý Lỗi Try-Except).

• Liên hệ HaivanStory: Giống như một phi thuyền được trang bị lớp vỏ chống va đập và hệ thống tự sửa chữa nhỏ, giúp nó tiếp tục hành trình ngay cả khi gặp thiên thạch.

3 Làm việc với Tệp (Files) – “Bộ Nhớ Vĩnh Viễn của Trạm”:

• Dữ liệu nhân viên, bộ phận, thuế, phạt cần được lưu trữ vĩnh viễn, không bị mất khi chương trình tắt. Bạn sẽ sử dụng tệp (cụ thể là JSON) để lưu trữ và tải dữ liệu.

• Liên hệ HaivanStory: Đây là nơi trạm không gian lưu trữ tất cả các “hồ sơ phi hành đoàn” và “quy định hoạt động”, đảm bảo mọi thông tin quan trọng đều được truy cập mọi lúc. (Tham khảo Files.pdf và Processing Files.pdf).

4 Trích xuất Dữ liệu từ Web (Web Scraping & JSON/API) – “Thu thập Tín hiệu từ Vũ Trụ Xa Xôi”:

• Bạn sẽ “thu thập” dữ liệu về thuế và mức phạt từ các “vệ tinh thông tin” (URL được cung cấp) bằng cách đọc tệp XML và JSON qua HTTP requests.

• Liên hệ HaivanStory: Giống như việc trạm không gian của bạn nhận các gói dữ liệu được mã hóa từ Trái Đất hoặc các hành tinh khác để cập nhật quy định và chính sách mới nhất. (Tham khảo Trích xuất dữ liệu từ web tronh Python.docx).

5 Testcase – “Kiểm Tra Độ Bền của Hệ Thống”:

• Mặc dù tài liệu chỉ đề cập khái niệm testcase ở Bài 13, trong dự án thực tế, bạn sẽ cần tự mình nghĩ ra các testcase để đảm bảo mọi chức năng đều hoạt động đúng, đặc biệt là các trường hợp lỗi hoặc dữ liệu không hợp lệ. Điều này giống như việc bạn chạy các bài kiểm tra mô phỏng để đảm bảo phi thuyền hoạt động hoàn hảo trước khi phóng.

Coursera Videos (Tích hợp):

Trong quá trình thực hiện dự án này, hãy nhớ lại và tham khảo các video sau từ Coursera để củng cố kiến thức:

• Về OOP (từ “Python Classes and Inheritance”):

• Class and Object: Xem lại cách định nghĩa lớp và tạo đối tượng. (Nội dung bài 12.docx, Object Oritented Programing.pptx)

• Inheritance: Nhớ lại cách tạo lớp con Manager kế thừa từ Employee. (Đặc biệt xem Tính kế thừa trong Python.docx và các video liên quan nếu có)

• Về Xử lý Lỗi (từ “Python Classes and Inheritance”):

• Exception Handling: Flow of Control: https://www.coursera.org/learn/python-classes-inheritance/lecture/QpsRE/exception-handling-flow-of-control

• When to use try-except: https://www.coursera.org/lecture/python-classes-inheritance/when-to-use-try-except-3XscW

• Handling Different Exception Types: https://www.coursera.org/lecture/python-classes-inheritance/handling-different-exception-types-OYQ7c

• Về Tệp (từ “Python for Everybody”):

• Xem lại cách open(), read(), write(), và close() tệp. (Tham khảo Files.pdf, Processing Files.pdf, và Bản sao của Bài 7.docx).

• Cách làm việc với JSON có thể được tìm thấy trong các module về Web Services/API nếu bạn đã học qua hoặc tìm kiếm thêm.

Google Search Keywords (Từ khóa Google phù hợp):

Để tìm kiếm thêm tài liệu và ví dụ, bạn có thể sử dụng các từ khóa sau:

• python object oriented programming example

• python class inheritance example

• python try except finally example

• python read write json file

• python parse xml from url

• python requests json example

• python web scraping basic example

• python employee management system example

• python format currency string (để chuẩn hóa chuỗi tiền tệ)

2. Thực Hành & Vận Dụng (Hands-on & Interactive):

Đây là bản đồ nhiệm vụ của bạn, Chỉ huy. Hãy thực hiện từng bước một để xây dựng hệ thống HRMS vững chắc này!

Google Colab (Thực hành cốt lõi):

Bạn sẽ tạo một Notebook Google Colab mới và thực hiện toàn bộ dự án trên đó. Đặt tên file là MaSV_PYB101_asm3.ipynb (hoặc .py nếu bạn thích).

Hướng dẫn từng bước (Guided Mission Steps):

1 Thiết kế Các Lớp (Classes) – “Thiết Kế Các Module Phi Hành Đoàn”:

• Class Employee:

• Thuộc tính: id, name, salary_base, working_days, department, working_performance, bonus, late_coming_days.

• Hàm khởi tạo (__init__) để gán giá trị.

• Phương thức để tính lương (chưa cần hoàn chỉnh, chỉ là khung).

• Class Manager:

• Kế thừa từ Employee.

• Có thể có thêm thuộc tính hoặc phương thức đặc trưng của quản lý (nếu bạn muốn nâng cao, ví dụ: project_managed_bonus).

• Ghi đè (override) phương thức tính lương để phù hợp với cách tính của quản lý (nếu có sự khác biệt).

• Class Department:

• Thuộc tính: id, bonus_salary (thưởng bộ phận).

• Phương thức để thêm/xóa nhân viên vào bộ phận (ví dụ: một danh sách employees thuộc bộ phận đó).

2 Trích xuất Dữ liệu từ Web – “Thu Thập Dữ Liệu Quy Định từ Liên Minh Thiên Hà”:

• Sử dụng thư viện requests để tải file XML (tax.xml) và JSON (late_coming.json) từ các URL đã cho.

• Xử lý XML (Thuế TNCN):

• Sử dụng thư viện xml.etree.ElementTree để phân tích cú pháp file XML.

• Đọc và lưu trữ các mức thuế (min, max, value) vào một cấu trúc dữ liệu phù hợp (ví dụ: list of dictionaries).

• Thử thách nhỏ: Xử lý lỗi nếu file XML không thể tải hoặc định dạng sai.

• Xử lý JSON (Mức phạt đi muộn):

• Sử dụng thư viện json để phân tích cú pháp file JSON.

• Đọc và lưu trữ các mức phạt (min, max, value) vào một cấu trúc dữ liệu phù hợp (ví dụ: list of dictionaries).

• Thử thách nhỏ: Xử lý lỗi nếu file JSON không thể tải hoặc định dạng sai.

3 Viết Hàm Tính Lương – “Bộ Xử Lý Lương Năng Lượng”:

• Viết các hàm tính lương cho Employee và Manager dựa trên công thức được cung cấp (sẽ chi tiết hơn trong file Hướng dẫn dự án 3.docx). Đảm bảo các hàm này sử dụng dữ liệu thuế và phạt đã trích xuất.

• Lưu ý: Hãy dùng try-except để xử lý các phép tính có thể gây lỗi (ví dụ: chia cho 0 nếu có).

4 Lưu trữ Dữ liệu Nhân viên xuống File JSON – “Lưu Trữ Hồ Sơ Phi Hành Đoàn Vĩnh Viễn”:

• Sử dụng thư viện json để lưu trữ danh sách các đối tượng Employee và Department xuống một file JSON cục bộ (ví dụ: employees.json, departments.json).

• Khi chương trình khởi động, đọc dữ liệu từ file JSON này để “load” lại hệ thống.

• Khi thêm/xóa/sửa nhân viên, đảm bảo dữ liệu trong file JSON cũng được cập nhật.

• Thử thách: Xử lý lỗi nếu không tìm thấy file JSON khi khởi động lần đầu.

5 Tạo Menu & Chức Năng – “Bảng Điều Khiển Chính của Trạm”:

• Thiết kế một màn hình menu với các lựa chọn:

• Thêm nhân viên mới (Add Employee / Manager)

• Xóa nhân viên (Delete Employee)

• Chỉnh sửa thông tin nhân viên (Edit Employee Info) (nâng cao)

• Hiển thị bảng lương (Display Salary Report)

• Thoát (Exit)

• Sử dụng vòng lặp while để hiển thị menu liên tục cho đến khi người dùng chọn thoát.

• Dùng if-elif-else để điều hướng các chức năng.

• Quan trọng: Sử dụng try-except để xử lý các lỗi nhập liệu của người dùng (ví dụ: nhập chữ thay vì số, nhập lựa chọn không hợp lệ).

6 Triển khai Chức năng Thêm/Xóa/Sửa/Hiển thị – “Vận Hành Các Hệ Thống Chính”:

• Thêm: Yêu cầu người dùng nhập thông tin, tạo đối tượng Employee hoặc Manager và thêm vào danh sách quản lý.

• Xóa: Yêu cầu id nhân viên, kiểm tra xem có tồn tại không, nếu có thì xóa. Xử lý lỗi nếu nhân viên không tồn tại hoặc bộ phận có nhân viên muốn xóa.

• Chỉnh sửa (Nâng cao): Yêu cầu id và cho phép người dùng chọn trường để sửa, sau đó cập nhật giá trị. Xử lý lỗi nhập liệu.

• Hiển thị bảng lương: Lặp qua tất cả nhân viên, tính lương và in ra theo định dạng yêu cầu. Chuẩn hóa chuỗi tiền tệ cho dễ nhìn.

SoloLearn Quiz (Kiểm tra nhanh):

Trong quá trình thực hiện dự án, hãy thường xuyên ghé thăm SoloLearn để củng cố các kỹ năng:

• OOP: Luyện tập các bài quiz về Class, Object, Inheritance.

• File Handling: Ôn lại cách đọc/ghi tệp.

• Exception Handling: Các bài tập về try-except. https://www.sololearn.com/en/learn/courses/python-intermediate (Tìm kiếm các mục tương ứng).

CodeLearn Lab (Thử thách nâng cao):

Dự án này là một bài lab lớn, nhưng bạn có thể tham khảo các bài tập nhỏ hơn trên CodeLearn để luyện tập các kỹ năng cụ thể:

• Lab 12.3: Bài luyện tập II (Bài 55 – 59): Nếu bạn muốn củng cố thêm về OOP. https://codelearn.io/learning/python-fundamentals?activityType=12&activityId=343

• Tìm kiếm các bài tập khác: Về xử lý chuỗi, list, dictionary để nâng cao kỹ năng xử lý dữ liệu và định dạng.

3. Câu Chuyện HaivanStory & Liên Hệ Thực Tế:

“Trong vũ trụ Parallel-X, mỗi Trạm Không Gian không chỉ là một pháo đài khoa học mà còn là một cộng đồng sống động. Và như mọi cộng đồng, việc quản lý nhân lực là yếu tố cốt lõi. Hệ thống HRMS bạn vừa xây dựng không chỉ là những dòng code; nó là ‘trái tim’ điều phối hoạt động của phi hành đoàn, đảm bảo mỗi thành viên được ghi nhận công sức và nhận được ‘nguồn năng lượng’ xứng đáng.

Khi AI quản lý một thành phố bay hay một căn cứ trên Sao Hỏa, nó không chỉ đơn thuần là thực thi lệnh. Nó phải có khả năng:

• Tích hợp dữ liệu đa nguồn: Lấy thông tin từ hồ sơ nhân sự, dữ liệu thị trường, và thậm chí là các bản tin thời tiết vũ trụ để đưa ra quyết định.

• Tự động hóa tác vụ lặp: Thay vì con người phải tính toán hàng trăm bảng lương thủ công, AI làm điều đó trong tích tắc.

• Chống chịu lỗi: Dù cho một vệ tinh thông tin bị hỏng hay dữ liệu bị nhiễu loạn, hệ thống vẫn phải tiếp tục hoạt động, có thể chỉ là với chế độ an toàn, và báo cáo sự cố để kỹ sư có thể can thiệp.

• Khả năng mở rộng: Khi số lượng phi hành gia tăng lên, hệ thống phải dễ dàng nâng cấp mà không cần phải viết lại từ đầu. Chính OOP mang lại khả năng này.

Dự án này là bước đầu tiên để bạn trở thành kiến trúc sư của những hệ thống thông minh tương lai, nơi Python là ngôn ngữ chính để ‘giao tiếp’ với dữ liệu và ‘định hình’ thế giới xung quanh.”

4. Tổng Kết & Hướng Đi Tiếp Theo:

Chúc mừng, Pythonista ! Bạn đã hoàn thành một nhiệm vụ quan trọng: Xây dựng Hệ thống Quản lý Nhân viên. Đây là một minh chứng rõ ràng cho việc bạn đã nắm vững các khái niệm cốt lõi của lập trình Python, đặc biệt là OOP, xử lý lỗi, và tương tác với dữ liệu từ nhiều nguồn.

Những gì bạn đã vận dụng:

• Thiết kế OOP: Tạo các lớp (Employee, Manager, Department) và sử dụng tính kế thừa.

• Quản lý dữ liệu: Đọc/ghi dữ liệu từ/vào tệp JSON.

• Tích hợp dữ liệu ngoài: Lấy dữ liệu XML/JSON từ web.

• Xử lý lỗi: Sử dụng try-except để chương trình hoạt động ổn định.

• Giao diện người dùng: Xây dựng menu tương tác.

Hướng đi tiếp theo: Dự án này chỉ là bước khởi đầu. Bạn có thể tiếp tục phát triển hệ thống này bằng cách:

• Nâng cao giao diện: Sử dụng thư viện đồ họa như Tkinter hoặc PyQt để tạo giao diện người dùng (GUI) thay vì chỉ dùng console.

• Thêm chức năng: Quản lý lịch làm việc, chấm công, tạo báo cáo thống kê, tích hợp cơ sở dữ liệu (ví dụ: SQLite) thay vì chỉ lưu JSON.

• Mở rộng tính năng quản lý: Thêm chức năng tìm kiếm, sắp xếp nhân viên.

• Kiểm thử tự động: Sử dụng các framework kiểm thử như unittest (nếu đã học hoặc muốn khám phá) để viết các testcase tự động.

Hãy tiếp tục khám phá và xây dựng! Mỗi dự án là một cơ hội để bạn củng cố kiến thức và phát triển kỹ năng.

5. Kêu Gọi Hành Động (Call to Action):

Bạn đã vượt qua một thử thách lớn! Hãy nộp file dự án của mình theo đúng định dạng (Mã SV_PYB101_asm3.zip chứa file .ipynb hoặc .py) để hoàn thành nhiệm vụ này.

Bạn đã học được điều gì thú vị nhất trong quá trình xây dựng hệ thống HRMS này? Hãy để lại bình luận bên dưới!

Đừng quên theo dõi HaivanStory Blog để không bỏ lỡ các dự án và bài học tiếp theo, nơi chúng ta sẽ cùng nhau khám phá những vùng đất mới của Khoa học Dữ liệu và AI!

Chia sẻ bài viết này nếu bạn thấy nó hữu ích!

Gợi ý làm bài dự án

1. Phân Tích Yêu Cầu: Chúng Ta Cần Gì?

Trước khi viết bất kỳ dòng code nào, hãy cùng “mổ xẻ” yêu cầu của dự án đã nhé. Một chương trình quản lý nhân viên cần có những gì?

• Đối tượng quản lý: Chúng ta có Nhân viên (Employee)Quản lý (Manager). À, họ còn làm việc trong các Phòng ban (Department) nữa.

• Thông tin cần lưu trữ:

• Nhân viên: Mã nhân viên, họ tên, hệ số lương, số ngày làm việc, hệ số hiệu quả, thưởng riêng, số ngày đi muộn, và thuộc phòng ban nào.

• Quản lý: Tương tự nhân viên, vì quản lý cũng là một nhân viên.

• Phòng ban: Mã phòng ban và mức thưởng chung của phòng ban đó.

• Công thức tính lương: Đây là phần “xương” nhất! Lương của một nhân viên sẽ được tính dựa trên nhiều yếu tố: lương cơ bản, hiệu suất, thưởng, phạt và cả thuế thu nhập cá nhân (TNCN) nữa.

• Dữ liệu ngoài: Thông tin về thuế TNCN và mức phạt đi muộn không cố định mà được lấy từ các file online (XML và JSON).

• Chức năng chương trình: Người dùng cần một menu đơn giản để có thể:

• Xem danh sách nhân viên & phòng ban.

• Thêm nhân viên mới.

• Xóa nhân viên hoặc phòng ban theo ID.

• Xem bảng lương của tất cả mọi người.

• Lưu trữ dữ liệu để không bị mất khi tắt chương trình.

Và một yêu cầu “nâng cao” cho các bạn pro hơn: chức năng chỉnh sửa thông tin nhân viên.

2. Dựng “Khung Xương”: Xây Dựng Các Class

Với một dự án hướng đối tượng, việc đầu tiên luôn là thiết kế các “khuôn mẫu” – hay còn gọi là Class. Class giống như một bản thiết kế chi tiết cho các đối tượng mà chúng ta sẽ tạo ra sau này.

Class Department

Đơn giản nhất, chúng ta bắt đầu với Department. Mỗi phòng ban sẽ có hai thông tin chính: mã và thưởng bộ phận.

class Department:
    def __init__(self, id, bonus_salary):
        self.id = id
        self.bonus_salary = bonus_salary

Class Employee

Đây là class trung tâm. Dựa vào yêu cầu, chúng ta sẽ định nghĩa các thuộc tính (attribute) cho nhân viên.

class Employee:
    def __init__(self, id, name, salary_base, working_days, department, working_performance, bonus, late_coming_days):
        self.id = id
        self.name = name
        self.salary_base = salary_base
        self.working_days = working_days
        self.department = department
        self.working_performance = working_performance
        self.bonus = bonus
        self.late_coming_days = late_coming_days

Class Manager và Tính Kế Thừa

Quản lý về cơ bản cũng là một nhân viên, nhưng có thêm đặc quyền (và trách nhiệm!). Thay vì copy-paste toàn bộ thuộc tính từ Employee, chúng ta sẽ sử dụng một trong những sức mạnh của OOP: tính kế thừa (Inheritance).

Class Manager sẽ kế thừa toàn bộ “đặc điểm” của Employee. Điều này giúp code của chúng ta ngắn gọn và dễ bảo trì hơn rất nhiều.

class Manager(Employee):
    def __init__(self, id, name, salary_base, working_days, department, working_performance, bonus, late_coming_days):
        # super().__init__() dùng để gọi hàm khởi tạo của lớp cha (Employee)
        # để tái sử dụng lại logic khởi tạo mà không cần viết lại.
        super().__init__(id, name, salary_base, working_days, department, working_performance, bonus, late_coming_days)

3. Lấy Dữ Liệu Từ “Trên Mạng”: Sử Dụng requests và BeautifulSoup

Để tính lương, chúng ta cần dữ liệu về thuế và mức phạt. Các dữ liệu này nằm trên web, vì vậy chúng ta cần viết hàm để “cào” chúng về.

Chúng ta sẽ dùng thư viện requests để gửi yêu cầu HTTP và lấy nội dung từ URL, sau đó dùng BeautifulSoup để bóc tách dữ liệu từ file XML (thuế) và json để xử lý file JSON (phạt).

import requests
from bs4 import BeautifulSoup
import json

def get_tax_data(url):
    “””Hàm lấy và phân tích dữ liệu thuế từ file XML.”””
    response = requests.get(url)
    soup = BeautifulSoup(response.content, “xml”)
    tax_levels = []
    for tax in soup.findAll(‘tax’):
        min_income = float(tax.find(‘min’).text)
        max_income = float(tax.find(‘max’).text)
        value = float(tax.find(‘value’).text)
        tax_levels.append({‘min’: min_income, ‘max’: max_income, ‘value’: value})
    return tax_levels

def get_late_coming_penalty_data(url):
    “””Hàm lấy và phân tích dữ liệu phạt đi muộn từ file JSON.”””
    response = requests.get(url)
    return response.json()

# URLs từ tài liệu dự án
TAX_URL = “https://firebasestorage.googleapis.com/v0/b/funix-way.appspot.com/o/xSeries%2FChung%20chi%20dieu%20kien%2FPYB101x_1.1%2FASM_Resources%2Ftax.xml?alt=media&token=f7a6f73d-9e6d-4807-bb14-efc6875442c7”
PENALTY_URL = “https://firebasestorage.googleapis.com/v0/b/funix-way.appspot.com/o/xSeries%2FChung%20chi%20dieu%20kien%2FPYB101x_1.1%2FASM_Resources%2Flate_coming.json?alt=media&token=55246ee9-44fa-4642-aca2-dde101d705de”

tax_data = get_tax_data(TAX_URL)
penalty_data = get_late_coming_penalty_data(PENALTY_URL)

4. “Bộ Não” Của Chương Trình: Hàm Tính Lương

Giờ là lúc viết phương thức (method) tính lương cho các nhân viên. Đây là một phương thức thuộc về Employee và Manager.

Theo công thức:

1 Tổng thu nhập chưa thưởng: (Hệ số lương * Số ngày làm) * Hệ số hiệu quả

2 Tổng thu nhập: Tổng thu nhập chưa thưởng + Thưởng riêng + Thưởng bộ phận – Phạt đi muộn

3 Thu nhập chịu thuế: Tổng thu nhập * 89.5% (sau khi trừ 10.5% bảo hiểm)

4 Lương thực nhận: Thu nhập chịu thuế – Thuế TNCN

Một điểm cần lưu ý: các quản lý sẽ được thưởng thêm 10% thưởng bộ phận. Đây là lúc tính đa hình (Polymorphism) phát huy tác dụng. Chúng ta sẽ định nghĩa lại (override) hàm tính lương trong class Manager.

# Trong Class Employee
def calculate_salary(self, department_bonus, penalty_rules):
    # Tính phạt đi muộn
    penalty = 0
    for rule in penalty_rules:
        if rule[‘min’] <= self.late_coming_days <= rule[‘max’]:
            penalty = self.late_coming_days * rule[‘value’]
            break

    income_before_bonus = (self.salary_base * self.working_days) * self.working_performance
    total_income = income_before_bonus + self.bonus + department_bonus – penalty
    income_before_tax = total_income * 0.895 # Trừ 10.5% bảo hiểm
   
    # Tính thuế TNCN
    tax_to_pay = 0
    for level in tax_data:
        # Giả sử lương tính bằng triệu đồng
        income_in_millions = income_before_tax / 1_000_000
        if level[‘min’] < income_in_millions <= level[‘max’]:
            tax_to_pay = income_before_tax * (level[‘value’] / 100)
            break
           
    return income_before_tax – tax_to_pay

# Trong Class Manager
def calculate_salary(self, department_bonus, penalty_rules):
    # Quản lý được thưởng thêm 10% thưởng bộ phận
    managed_department_bonus = department_bonus * 1.10
   
    # Gọi lại hàm tính lương của lớp cha (Employee) với mức thưởng mới
    # Đây là một ví dụ tuyệt vời về việc tái sử dụng code!
    return super().calculate_salary(managed_department_bonus, penalty_rules)

5. “Giao Diện” Người Dùng: Xây Dựng Menu Tương Tác

Một chương trình sẽ không hoàn chỉnh nếu thiếu đi cách để người dùng tương tác. Chúng ta sẽ tạo một menu dòng lệnh (command-line menu) đơn giản với các lựa chọn từ 1 đến 7.

def main_menu():
    print(“\n— CHƯƠNG TRÌNH QUẢN LÝ NHÂN VIÊN —“)
    print(“1. Hiển thị danh sách nhân viên”)
    print(“2. Hiển thị danh sách bộ phận”)
    print(“3. Thêm nhân viên mới”)
    print(“4. Xóa nhân viên theo ID”)
    print(“5. Xóa bộ phận theo ID”)
    print(“6. Hiển thị bảng lương”)
    print(“7. Thoát”)

# Vòng lặp chính của chương trình
while True:
    main_menu()
    choice = input(“Mời bạn nhập chức năng mong muốn: “)

    if choice == ‘1’:
        # Code hiển thị danh sách nhân viên
        pass
    elif choice == ‘2’:
        # Code hiển thị danh sách bộ phận
        pass
    # … thêm các elif cho các chức năng khác
    elif choice == ‘7’:
        print(“Cảm ơn đã sử dụng chương trình!”)
        break
    else:
        print(“Lựa chọn không hợp lệ, vui lòng nhập lại.”)

Xử Lý Lỗi Với try-except

Khi nhận dữ liệu từ người dùng, chúng ta không thể tin tưởng họ 100% được. Họ có thể nhập chữ thay vì số, hoặc bỏ trống thông tin. Đây là lúc khối lệnh try-except trở thành “vị cứu tinh”, giúp chương trình không bị “crash” một cách vô duyên.

Ví dụ khi thêm nhân viên mới:

try:
    salary_base = float(input(“Nhập hệ số lương: “))
    if salary_base < 0:
        print(“Lỗi: Bạn phải nhập một số không âm.”)
except ValueError:
    print(“Lỗi: Bạn cần nhập đúng định dạng số.”)

6. Lưu Trữ Dữ Liệu: Không Để Công Sức “Đổ Sông Đổ Bể”

Sẽ thật tệ nếu mỗi lần khởi động lại, toàn bộ dữ liệu nhân viên bạn đã nhập biến mất. Để giải quyết vấn đề này, chúng ta sẽ lưu danh sách nhân viên và phòng ban vào các file JSON.

Mỗi khi chương trình khởi động, nó sẽ đọc dữ liệu từ file JSON (nếu có) để khôi phục trạng thái. Và mỗi khi có thay đổi (thêm, sửa, xóa), chương trình sẽ cập nhật lại các file này.

import json

def save_data(employees, departments):
    # Chuyển đổi list đối tượng thành list từ điển để lưu vào JSON
    employee_data = [vars(emp) for emp in employees]
    department_data = [vars(dep) for dep in departments]
   
    with open(’employees.json’, ‘w’) as f:
        json.dump(employee_data, f, indent=4)
    with open(‘departments.json’, ‘w’) as f:
        json.dump(department_data, f, indent=4)

def load_data():
    try:
        with open(’employees.json’, ‘r’) as f:
            employee_data = json.load(f)
        with open(‘departments.json’, ‘r’) as f:
            department_data = json.load(f)
       
        # Tạo lại các đối tượng từ dữ liệu đã đọc
        # (Phần code này cần xử lý chi tiết hơn để tạo đúng Employee/Manager)
       
        return employees, departments
    except FileNotFoundError:
        # Nếu file chưa có, trả về danh sách rỗng
        return [], []

Lời Kết

Vậy là chúng ta đã cùng nhau phác thảo toàn bộ sườn của dự án “Chương trình Quản lý Nhân viên”. Từ việc thiết kế các lớp đối tượng, xử lý dữ liệu online, tính toán logic phức tạp cho đến việc xây dựng một giao diện người dùng thân thiện và lưu trữ dữ liệu.

Dự án này là một cơ hội tuyệt vời để bạn tổng hợp và thực hành các kiến thức quan trọng nhất trong lập trình Python. Đừng ngần ngại bắt tay vào code và biến những ý tưởng này thành một chương trình hoàn chỉnh nhé!

Trong các bài viết tiếp theo, có thể chúng ta sẽ đi sâu vào việc hoàn thiện từng chức năng, đặc biệt là phần “nâng cao” – chỉnh sửa thông tin nhân viên. Chúc các bạn code vui và hẹn gặp lại trong các bài viết khác trên HaivanStory!