Initial commit

This commit is contained in:
Porawit Dongwang
2026-09-16 23:20:08 +07:00
commit 0041668dbb
32577 changed files with 3687927 additions and 0 deletions
@@ -0,0 +1,295 @@
-- Hospital Payroll Management System - Database Schema V1.0 & V2.0
CREATE DATABASE IF NOT EXISTS hospital_payroll CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE hospital_payroll;
-- ==========================================
-- 1. Authentication & Authorization (RBAC)
-- ==========================================
CREATE TABLE roles (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE,
description VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE permissions (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE,
description VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE role_permissions (
role_id INT NOT NULL,
permission_id INT NOT NULL,
PRIMARY KEY (role_id, permission_id),
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
role_id INT NOT NULL,
employee_id VARCHAR(50) NULL,
email VARCHAR(100),
first_name VARCHAR(100),
last_name VARCHAR(100),
status ENUM('active', 'inactive') DEFAULT 'active',
last_login TIMESTAMP NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE RESTRICT
);
-- ==========================================
-- 2. Master Settings (Income & Deduction)
-- ==========================================
CREATE TABLE income_master (
id INT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(20) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
description TEXT,
display_order INT DEFAULT 0,
color_code VARCHAR(20),
icon_class VARCHAR(50),
is_taxable BOOLEAN DEFAULT TRUE,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE deduction_master (
id INT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(20) NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL,
description TEXT,
display_order INT DEFAULT 0,
color_code VARCHAR(20),
icon_class VARCHAR(50),
is_tax_deductible BOOLEAN DEFAULT FALSE,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- ==========================================
-- 3. Payroll Management
-- ==========================================
CREATE TABLE salary_year (
id INT AUTO_INCREMENT PRIMARY KEY,
year_no INT NOT NULL UNIQUE,
status ENUM('open', 'closed') DEFAULT 'open',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE salary_month (
id INT AUTO_INCREMENT PRIMARY KEY,
year_id INT NOT NULL,
month_no INT NOT NULL,
status ENUM('Draft', 'Imported', 'Pending Review', 'HR Approved', 'Finance Approved', 'Director Approved', 'Locked', 'Published', 'Cancelled') DEFAULT 'Draft',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE(year_id, month_no),
FOREIGN KEY (year_id) REFERENCES salary_year(id) ON DELETE CASCADE
);
CREATE TABLE employee_salary (
id INT AUTO_INCREMENT PRIMARY KEY,
salary_month_id INT NOT NULL,
employee_code VARCHAR(50) NOT NULL,
national_id VARCHAR(20) NOT NULL,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
position VARCHAR(100),
department VARCHAR(100),
base_salary DECIMAL(10,2) DEFAULT 0.00,
total_income DECIMAL(10,2) DEFAULT 0.00,
total_deduction DECIMAL(10,2) DEFAULT 0.00,
net_salary DECIMAL(10,2) DEFAULT 0.00,
remark TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE(salary_month_id, employee_code),
FOREIGN KEY (salary_month_id) REFERENCES salary_month(id) ON DELETE CASCADE
);
CREATE TABLE salary_income (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
employee_salary_id INT NOT NULL,
income_master_id INT NOT NULL,
amount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (employee_salary_id) REFERENCES employee_salary(id) ON DELETE CASCADE,
FOREIGN KEY (income_master_id) REFERENCES income_master(id) ON DELETE RESTRICT
);
CREATE TABLE salary_deduction (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
employee_salary_id INT NOT NULL,
deduction_master_id INT NOT NULL,
amount DECIMAL(10,2) NOT NULL DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (employee_salary_id) REFERENCES employee_salary(id) ON DELETE CASCADE,
FOREIGN KEY (deduction_master_id) REFERENCES deduction_master(id) ON DELETE RESTRICT
);
-- ==========================================
-- 4. Import Data Logging
-- ==========================================
CREATE TABLE import_history (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
salary_month_id INT NOT NULL,
file_name VARCHAR(255),
status ENUM('success', 'failed', 'partial') DEFAULT 'success',
total_records INT DEFAULT 0,
success_records INT DEFAULT 0,
error_records INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT,
FOREIGN KEY (salary_month_id) REFERENCES salary_month(id) ON DELETE CASCADE
);
CREATE TABLE import_detail (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
import_history_id INT NOT NULL,
line_number INT,
national_id VARCHAR(20),
error_message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (import_history_id) REFERENCES import_history(id) ON DELETE CASCADE
);
-- ==========================================
-- 5. Logging and Auditing
-- ==========================================
CREATE TABLE audit_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id INT NULL,
action VARCHAR(100) NOT NULL,
table_name VARCHAR(100),
record_id INT,
old_value JSON,
new_value JSON,
ip_address VARCHAR(45),
user_agent VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
);
CREATE TABLE salary_slip_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id INT NULL,
employee_salary_id INT NOT NULL,
action ENUM('view', 'print', 'download', 'email') NOT NULL,
ip_address VARCHAR(45),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (employee_salary_id) REFERENCES employee_salary(id) ON DELETE CASCADE
);
CREATE TABLE report_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
report_name VARCHAR(100) NOT NULL,
parameters JSON,
ip_address VARCHAR(45),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- ==========================================
-- 6. Tax Certificates
-- ==========================================
CREATE TABLE tax_certificate (
id INT AUTO_INCREMENT PRIMARY KEY,
year_id INT NOT NULL,
employee_code VARCHAR(50) NOT NULL,
total_income DECIMAL(12,2) DEFAULT 0.00,
total_tax DECIMAL(12,2) DEFAULT 0.00,
total_provident_fund DECIMAL(12,2) DEFAULT 0.00,
total_social_security DECIMAL(12,2) DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (year_id) REFERENCES salary_year(id) ON DELETE CASCADE
);
CREATE TABLE tax_certificate_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id INT NULL,
tax_certificate_id INT NOT NULL,
action ENUM('view', 'print', 'download') NOT NULL,
ip_address VARCHAR(45),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (tax_certificate_id) REFERENCES tax_certificate(id) ON DELETE CASCADE
);
-- ==========================================
-- 7. File Attachments
-- ==========================================
CREATE TABLE attachments (
id INT AUTO_INCREMENT PRIMARY KEY,
related_table VARCHAR(50),
related_id INT,
file_name VARCHAR(255) NOT NULL,
file_path VARCHAR(255) NOT NULL,
file_type VARCHAR(100),
file_size INT,
uploaded_by INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (uploaded_by) REFERENCES users(id) ON DELETE SET NULL
);
-- ==========================================
-- 8. System Integrations & Settings
-- ==========================================
CREATE TABLE system_setting (
id INT AUTO_INCREMENT PRIMARY KEY,
setting_key VARCHAR(100) NOT NULL UNIQUE,
setting_value TEXT,
description VARCHAR(255),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE external_database (
id INT AUTO_INCREMENT PRIMARY KEY,
connection_name VARCHAR(100) NOT NULL UNIQUE,
host VARCHAR(100) NOT NULL,
port INT DEFAULT 3306,
db_name VARCHAR(100) NOT NULL,
db_user VARCHAR(100) NOT NULL,
db_password VARCHAR(255),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE backup_history (
id INT AUTO_INCREMENT PRIMARY KEY,
file_name VARCHAR(255) NOT NULL,
file_size INT NOT NULL,
status ENUM('success', 'failed') DEFAULT 'success',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- ==========================================
-- Default Data Inserts
-- ==========================================
INSERT INTO roles (name, description) VALUES
('Administrator', 'Full system access'),
('HR', 'Human Resources access'),
('Finance', 'Financial review access'),
('Director', 'Final approval access'),
('Auditor', 'Read-only access for auditing');
-- admin / admin123
INSERT INTO users (username, password_hash, role_id, first_name, last_name)
VALUES ('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 1, 'System', 'Administrator');
@@ -0,0 +1,63 @@
-- Script สำหรับนำเข้าข้อมูล Master Data ของรายการรับและจ่ายโรงพยาบาล
-- สามารถนำไปรันใน phpMyAdmin หรือโปรแกรมจัดการฐานข้อมูลได้เลย
-- 1. ล้างข้อมูลเก่า (ถ้าต้องการลบของเก่าออกก่อนรันใหม่)
-- TRUNCATE TABLE salary_income;
-- TRUNCATE TABLE salary_deduction;
-- DELETE FROM income_master;
-- DELETE FROM deduction_master;
-- ALTER TABLE income_master AUTO_INCREMENT = 1;
-- ALTER TABLE deduction_master AUTO_INCREMENT = 1;
-- 2. นำเข้ารายการรับ (Income)
INSERT IGNORE INTO income_master (code, name, display_order) VALUES
('SALARY', 'เงินเดือน', 1),
('FIX_EMP', 'ค่าจ้างประจำ', 2),
('TEMP_EMP', 'ค่าจ้างชั่วคราว', 3),
('SUMSAL_LAT', 'เงินเดือน/ปจต./ตอบแทน ตกเบิก', 4),
('MONT_FEE', 'ค่าตอบแทนรายเดือน', 5),
('TEMP_EARN', 'เงินช่วยค่าครองชีพ', 6),
('HOUSE_RENT', 'ค่าตอบแทนเจ้าหน้าที่', 7),
('NO_PRIVATE', 'ค่าตอบแทนไม่ประกอบเวชฯ', 8),
('P_T_S', 'ค่าตอบแทน พตส./คตส.', 9),
('P_T_S_LATE', 'ค่าตอบแทน พตส. ตกเบิก', 10),
('SUMOT', 'ค่าล่วงเวลา เงินบำรุง', 11),
('SUMOTSSN', 'ค่าล่วงเวลา เงินประกันสังคม', 12),
('OTREFER', 'ค่าล่วงเวลา Refer', 13),
('TREAT', 'ค่ารักษาพยาบาล', 14),
('EDUCATE', 'ค่าเล่าเรียนบุตร', 15),
('OTHEROT1', 'ค่าตอบแทน P4P', 16),
('OFFICERFEE', 'ค่าตอบแทน ฉ.11', 17),
('WORK_FEE', 'ค่าตอบแทนอื่นๆ (1)', 18),
('OTHEROT2', 'ค่าตอบแทนอื่นๆ (2)', 19),
('POS_FEE', 'รายรับอื่นๆ (1)', 20),
('EXTR_FEE', 'รายรับอื่นๆ (2)', 21),
('OTHERREC_1', 'รายรับอื่นๆ (3)', 22),
('OTHERREC_2', 'รายรับอื่นๆ (4)', 23),
('EARNLATE', 'รายรับอื่นๆ (5)', 24);
-- 3. นำเข้ารายการจ่าย (Deduction)
INSERT IGNORE INTO deduction_master (code, name, display_order) VALUES
('FUND_A', 'ประกันสังคม', 1),
('FUND_B', 'ประกันสังคมหักตกเบิก', 2),
('TAX', 'ภาษี', 3),
('FENERAL', 'ฌกส.', 4),
('BUILDING', 'ธ.กรุงไทย/ธ.ธอส', 5),
('WATER_A', 'ค่าน้ำ หักเงินเดือน', 6),
('WATER_B', 'ค่าน้ำ หักโอที', 7),
('ELECT', 'ค่าไฟ หักเงินเดือน', 8),
('ELECTRIC', 'ค่าไฟ หักโอที', 9),
('DOCOFFICE', 'ค่าสวัสดิการองค์กรแพทย์', 10),
('DOCTOR', 'ค่าสวัสดิการแพทย์ หักโอที', 11),
('CO_OP_A', 'สหกรณ์ หักเงินเดือน', 12),
('OTHEREXP_1', 'กสล./พกส.', 13),
('CO_OP_B', 'กสล./พกส. หักตกเบิก', 14),
('SAVING_A', 'ธ.ออมสิน หักเงินเดือน', 15),
('SAVING_B', 'ธ.ออมสิน หักโอที', 16),
('MON_BACK_A', 'คืนเงิน รพ.', 17),
('MON_BACK_B', 'คืนเงินบำรุง หักตกเบิก', 18),
('CLEANER', 'ค่าทำความสะอาดแฟลต', 19),
('CO_OP1', 'รายจ่ายอื่นๆ (1)', 20),
('CABLE', 'รายจ่ายอื่นๆ (2)', 21),
('OTHEREXP_2', 'รายจ่ายอื่นๆ (3)', 22),
('OTHEREXP', 'รายจ่ายอื่นๆ (4)', 23);