财务分类体系+统一账本+Excel导入+报表改造
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
-- 创建财务分类配置表
|
||||
CREATE TABLE IF NOT EXISTS expense_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
category_level1 TEXT NOT NULL,
|
||||
category_level2 TEXT NOT NULL,
|
||||
label TEXT NOT NULL,
|
||||
description TEXT,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
UNIQUE(category_level1, category_level2)
|
||||
);
|
||||
|
||||
-- 收入分类
|
||||
INSERT INTO expense_categories (category_level1, category_level2, label, description, sort_order) VALUES
|
||||
('income', 'contract_payment', '项目合同收款', '客户按合同打款到账', 1),
|
||||
('income', 'deposit_refund', '质保金退回', '项目质保期满退回的质保金', 2),
|
||||
('income', 'shareholder_investment', '股东投资入股', '股东注入的资金/股本', 3),
|
||||
('income', 'other_income', '其他收入', '利息、退税、资产处置等', 4);
|
||||
|
||||
-- 项目支出分类
|
||||
INSERT INTO expense_categories (category_level1, category_level2, label, description, sort_order) VALUES
|
||||
('project', 'material', '材料采购', '电杆、导线、电缆、横担、金具、水泥等', 1),
|
||||
('project', 'equipment', '设备采购', '变压器、开关柜、配电箱、计量箱等', 2),
|
||||
('project', 'subcontract', '施工分包', '外包施工队的劳务/工程费', 3),
|
||||
('project', 'labor', '人工工资', '项目现场工人、项目经理的工资或劳务费', 4),
|
||||
('project', 'travel', '差旅交通', '驻现场人员路费,含跨境交通、油费', 5),
|
||||
('project', 'accommodation', '食宿费用', '驻现场人员住宿费、餐饮费', 6),
|
||||
('project', 'freight', '运输物流', '材料/设备一次运输、二次转运', 7),
|
||||
('project', 'design', '勘测设计', '现场勘测、图纸设计费', 8),
|
||||
('project', 'tools', '小型工具', '零散小工具,非固定资产', 9),
|
||||
('project', 'client_relations', '客户/EDL关系', '项目相关的客户招待、电力局关系', 10),
|
||||
('project', 'other_project', '其他项目支出', '保险、临时杂费', 11);
|
||||
|
||||
-- 公司支出分类
|
||||
INSERT INTO expense_categories (category_level1, category_level2, label, description, sort_order) VALUES
|
||||
('company', 'salary', '工资薪酬', '办公室管理人员工资、社保、公积金', 1),
|
||||
('company', 'rent', '房租物业', '办公室/仓库租金、物业费、水电', 2),
|
||||
('company', 'office', '办公费用', '办公用品、打印耗材、网络、电话', 3),
|
||||
('company', 'commute', '交通通勤', '日常市内交通、公司车辆油费', 4),
|
||||
('company', 'vehicle_maintenance', '车辆维保', '车辆维修、保养、配件更换', 5),
|
||||
('company', 'assets', '固定资产', '购买车辆、大型工具、办公设备', 6),
|
||||
('company', 'marketing', '营销拓展', '业务拓展、广告推广、展会', 7),
|
||||
('company', 'entertainment', '招待费用', '公司级客户/合作方招待', 8),
|
||||
('company', 'welfare', '员工福利', '聚餐、团建、节日礼品、体检', 9),
|
||||
('company', 'logistics', '快递物流', '文件、样品快递费', 10),
|
||||
('company', 'other_company', '其他公司支出', '中介佣金、税费等', 11);
|
||||
|
||||
-- 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_expense_categories_level1 ON expense_categories(category_level1);
|
||||
CREATE INDEX IF NOT EXISTS idx_expense_categories_active ON expense_categories(is_active);
|
||||
@@ -0,0 +1,44 @@
|
||||
-- 创建统一财务账本表
|
||||
CREATE TABLE IF NOT EXISTS financial_records (
|
||||
id SERIAL PRIMARY KEY,
|
||||
record_code TEXT UNIQUE NOT NULL,
|
||||
|
||||
txn_type TEXT NOT NULL CHECK (txn_type IN ('income', 'expense')),
|
||||
category_level1 TEXT NOT NULL,
|
||||
category_level2 TEXT NOT NULL,
|
||||
|
||||
project_id INTEGER REFERENCES projects(id),
|
||||
user_id INTEGER REFERENCES users(id),
|
||||
user_name TEXT,
|
||||
|
||||
amount_original REAL NOT NULL DEFAULT 0,
|
||||
currency TEXT NOT NULL DEFAULT 'CNY',
|
||||
exchange_rate REAL NOT NULL DEFAULT 1,
|
||||
amount_cny REAL NOT NULL DEFAULT 0,
|
||||
|
||||
record_date DATE NOT NULL,
|
||||
|
||||
counterparty_name TEXT,
|
||||
counterparty_type TEXT,
|
||||
counterparty_id INTEGER,
|
||||
|
||||
source TEXT NOT NULL DEFAULT 'manual',
|
||||
source_id INTEGER,
|
||||
source_code TEXT,
|
||||
|
||||
description TEXT,
|
||||
voucher_no TEXT,
|
||||
attachments TEXT,
|
||||
|
||||
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('confirmed', 'pending', 'voided')),
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_financial_records_project ON financial_records(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_financial_records_user ON financial_records(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_financial_records_date ON financial_records(record_date);
|
||||
CREATE INDEX IF NOT EXISTS idx_financial_records_type ON financial_records(txn_type, category_level1, category_level2);
|
||||
CREATE INDEX IF NOT EXISTS idx_financial_records_source ON financial_records(source, source_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_financial_records_status ON financial_records(status);
|
||||
Reference in New Issue
Block a user