Files
njts-accounting-core/backend/sql/payroll_migration_20260119.sql
2026-01-20 11:15:49 +09:00

173 lines
8.3 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ========================================
-- 給与システム マイグレーション 2026-01-19
-- Payroll System Migration Script
-- ========================================
-- このスクリプトは既存のpayroll_schema.sqlを適用済みのDBに対して実行してください
-- This script should be run on databases that already have payroll_schema.sql applied
-- ========================================
-- 1. 既存テーブルへの列追加
-- ========================================
-- 従業員テーブルに新しい列を追加(介護保険判定用)
-- Add new columns to employees table (for care insurance determination)
ALTER TABLE employees
ADD COLUMN IF NOT EXISTS birth_date DATE,
ADD COLUMN IF NOT EXISTS gender VARCHAR(10),
ADD COLUMN IF NOT EXISTS postal_code VARCHAR(10),
ADD COLUMN IF NOT EXISTS address VARCHAR(200);
COMMENT ON COLUMN employees.birth_date IS '生年月日(介護保険料計算に使用)';
COMMENT ON COLUMN employees.gender IS '性別';
COMMENT ON COLUMN employees.postal_code IS '郵便番号';
COMMENT ON COLUMN employees.address IS '住所';
-- 月次給与計算テーブルに介護保険列を追加
-- Add care insurance column to monthly payroll table
ALTER TABLE monthly_payroll
ADD COLUMN IF NOT EXISTS care_insurance DECIMAL(12, 2) DEFAULT 0;
COMMENT ON COLUMN monthly_payroll.care_insurance IS '介護保険料40歳以上65歳未満対象';
-- ========================================
-- 2. 介護保険料率の初期データを追加(まだ存在しない場合)
-- ========================================
INSERT INTO insurance_rates (rate_type, employee_rate, employer_rate, valid_from, notes)
SELECT '介護保険', 0.0091, 0.0091, '2026-01-01', '介護保険料率 1.82% (労使折半、40歳以上対象)'
WHERE NOT EXISTS (
SELECT 1 FROM insurance_rates
WHERE rate_type = '介護保険' AND valid_from = '2026-01-01'
);
-- ========================================
-- 3. 新テーブル作成: 社会保険料上限設定
-- ========================================
CREATE TABLE IF NOT EXISTS insurance_limit_settings (
limit_id SERIAL PRIMARY KEY,
setting_type VARCHAR(50) NOT NULL, -- 健康保険上限/厚生年金上限/通勤手当非課税限度額
limit_amount DECIMAL(12, 2) NOT NULL,
valid_from DATE NOT NULL,
valid_to DATE,
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE insurance_limit_settings IS '社会保険料上限設定';
COMMENT ON COLUMN insurance_limit_settings.setting_type IS '設定種別: 健康保険標準報酬月額上限/厚生年金標準報酬月額上限/通勤手当非課税限度額';
COMMENT ON COLUMN insurance_limit_settings.limit_amount IS '上限額';
-- ========================================
-- 4. 新テーブル作成: 賞与計算
-- ========================================
CREATE TABLE IF NOT EXISTS bonus_payments (
bonus_id SERIAL PRIMARY KEY,
employee_id INTEGER NOT NULL REFERENCES employees(employee_id),
bonus_year INTEGER NOT NULL,
bonus_month INTEGER NOT NULL,
bonus_type VARCHAR(50) NOT NULL, -- 夏季賞与/冬季賞与/決算賞与/その他
payment_date DATE NOT NULL,
status VARCHAR(20) DEFAULT 'draft', -- draft/calculated/approved/paid
-- 支給項目
base_bonus DECIMAL(12, 2) DEFAULT 0, -- 基本賞与額
performance_bonus DECIMAL(12, 2) DEFAULT 0, -- 業績賞与
other_bonus DECIMAL(12, 2) DEFAULT 0, -- その他賞与
total_bonus DECIMAL(12, 2) DEFAULT 0, -- 総支給額
-- 控除項目
health_insurance DECIMAL(12, 2) DEFAULT 0,
care_insurance DECIMAL(12, 2) DEFAULT 0, -- 介護保険40歳以上
pension_insurance DECIMAL(12, 2) DEFAULT 0,
employment_insurance DECIMAL(12, 2) DEFAULT 0,
income_tax DECIMAL(12, 2) DEFAULT 0, -- 賞与所得税
other_deduction DECIMAL(12, 2) DEFAULT 0,
total_deduction DECIMAL(12, 2) DEFAULT 0,
-- 差引支給額
net_bonus DECIMAL(12, 2) DEFAULT 0,
notes TEXT,
calculated_at TIMESTAMP,
calculated_by VARCHAR(100),
approved_at TIMESTAMP,
approved_by VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT uc_bonus_employee_payment UNIQUE (employee_id, bonus_year, bonus_month, bonus_type)
);
COMMENT ON TABLE bonus_payments IS '賞与計算';
COMMENT ON COLUMN bonus_payments.bonus_type IS '賞与種別: 夏季賞与/冬季賞与/決算賞与/その他';
COMMENT ON COLUMN bonus_payments.status IS 'ステータス: draft/calculated/approved/paid';
-- ========================================
-- 5. 新テーブル作成: 扶養家族判定条件
-- ========================================
CREATE TABLE IF NOT EXISTS dependent_rules (
rule_id SERIAL PRIMARY KEY,
rule_type VARCHAR(50) NOT NULL, -- 所得限度額/年齢条件/同一生計
rule_value VARCHAR(100) NOT NULL,
valid_from DATE NOT NULL,
valid_to DATE,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
COMMENT ON TABLE dependent_rules IS '扶養家族判定条件';
COMMENT ON COLUMN dependent_rules.rule_type IS 'ルール種別: 所得限度額/年齢条件/同一生計';
-- ========================================
-- 6. インデックス作成
-- ========================================
CREATE INDEX IF NOT EXISTS idx_insurance_limits_valid ON insurance_limit_settings(valid_from, valid_to);
CREATE INDEX IF NOT EXISTS idx_bonus_employee_year ON bonus_payments(employee_id, bonus_year);
CREATE INDEX IF NOT EXISTS idx_bonus_status ON bonus_payments(status);
CREATE INDEX IF NOT EXISTS idx_dependent_rules_valid ON dependent_rules(valid_from, valid_to);
-- ========================================
-- 7. トリガー: 更新日時の自動更新
-- ========================================
CREATE TRIGGER trg_insurance_limits_updated_at BEFORE UPDATE ON insurance_limit_settings
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
CREATE TRIGGER trg_bonus_payments_updated_at BEFORE UPDATE ON bonus_payments
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
-- ========================================
-- 8. 初期データ: 社会保険料上限設定 (2026年度)
-- ========================================
INSERT INTO insurance_limit_settings (setting_type, limit_amount, valid_from, notes) VALUES
('健康保険標準報酬月額上限', 1390000, '2026-01-01', '健康保険の標準報酬月額上限第50級'),
('厚生年金標準報酬月額上限', 650000, '2026-01-01', '厚生年金保険の標準報酬月額上限第32級'),
('通勤手当非課税限度額', 150000, '2026-01-01', '通勤手当の非課税限度額(月額)')
ON CONFLICT DO NOTHING;
-- ========================================
-- 9. 初期データ: 扶養家族判定条件 (2026年度)
-- ========================================
INSERT INTO dependent_rules (rule_type, rule_value, valid_from, description) VALUES
('所得限度額_一般', '480000', '2026-01-01', '一般扶養親族の所得限度額年間48万円'),
('所得限度額_配偶者', '480000', '2026-01-01', '配偶者の所得限度額年間48万円'),
('所得限度額_配偶者特別', '1330000', '2026-01-01', '配偶者特別控除の所得限度額年間133万円'),
('年齢_特定扶養親族', '19-23', '2026-01-01', '特定扶養親族の年齢範囲19歳以上23歳未満'),
('年齢_老人扶養親族', '70-', '2026-01-01', '老人扶養親族の年齢70歳以上')
ON CONFLICT DO NOTHING;
-- ========================================
-- マイグレーション完了
-- ========================================
-- 以下のコマンドで適用状態を確認できます:
-- Verify migration with the following commands:
--
-- \d employees -- 従業員テーブルの構造確認
-- \d monthly_payroll -- 月次給与テーブルの構造確認
-- \dt *bonus* -- 賞与テーブルの確認
-- \dt *insurance_limit* -- 保険上限テーブルの確認
-- \dt *dependent_rule* -- 扶養判定テーブルの確認
--
-- SELECT * FROM insurance_limit_settings; -- 保険上限設定の確認
-- SELECT * FROM dependent_rules; -- 扶養判定条件の確認
-- SELECT * FROM insurance_rates WHERE rate_type = '介護保険'; -- 介護保険料率の確認