Files
TurboHR/backend/src/services/template.service.ts
T
selfrelease 255af519d2 feat: Phase 1-3 优化全部完成
Phase 1 紧急修复(8项):
- 社保城市选择改为可输入
- 社保上下限拆分(三险/医保独立基数)
- 公积金试算结果展示修复
- 花名册合同保存修复(日期ISO格式)
- 薪酬批次创建失败修复(城市过滤+错误处理)
- 证据链查看修复
- 个税计算修复(blank_employees读取基本工资)
- 加班费倍率读取配置

Phase 2 功能完善(3项):
- 批量导入per-row异常捕获+导入按钮
- 单人发薪UI入口优化
- 解除协议模板补充(员工提出离职版)

Phase 3 后期规划(4项):
- 工资表导入功能(POST /import/payroll + 前端入口)
- 大病险/长护险附加险种(extraInsurances JSON + 计算适配)
- 专项附加扣除按月录入(SpecialDeductionRecord模型 + 前端Tab)
- 预置河北省社保政策(seed数据)
2026-07-27 18:55:08 +08:00

317 lines
12 KiB
TypeScript
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.
/**
* 用工文本模板库
* 提供合同、制度、通知等常用文本模板,HR 可基于模板快速生成文档
*/
export interface DocumentTemplate {
id: string
name: string
category: 'CONTRACT' | 'RULES' | 'NOTICE' | 'AGREEMENT' | 'OTHER'
description: string
content: string
variables: string[] // 模板变量列表,如 ['employeeName', 'startDate', 'salary']
}
export const documentTemplates: DocumentTemplate[] = [
{
id: 'tpl_fixed_term_contract',
name: '固定期限劳动合同',
category: 'CONTRACT',
description: '标准固定期限劳动合同模板,适用于大多数正式员工',
variables: ['companyName', 'employeeName', 'idCard', 'address', 'phone', 'startDate', 'endDate', 'position', 'workplace', 'probationMonths', 'monthlySalary', 'socialInsBase'],
content: `劳动合同书
甲方(用人单位):{{companyName}}
乙方(劳动者):{{employeeName}}
根据《中华人民共和国劳动合同法》及相关法律法规,甲乙双方在平等自愿、协商一致的基础上,签订本劳动合同。
第一条 合同期限
本合同为固定期限劳动合同,自{{startDate}}起至{{endDate}}止,其中试用期{{probationMonths}}个月。
第二条 工作内容和工作地点
乙方担任{{position}}岗位,工作地点为{{workplace}}。
第三条 工作时间和休息休假
甲方执行标准工时制度,乙方每日工作时间不超过8小时,每周不超过40小时。
第四条 劳动报酬
乙方试用期月工资为人民币{{monthlySalary}}元,转正后月工资为人民币{{monthlySalary}}元,甲方于每月15日前支付上月工资。
第五条 社会保险和福利
甲方依法为乙方缴纳社会保险,缴费基数为{{socialInsBase}}元。
第六条 劳动保护、劳动条件和职业危害防护
甲方为乙方提供符合国家规定的劳动保护条件。
第七条 合同解除和终止
双方解除和终止劳动合同,应严格按照《劳动合同法》的规定执行。
第八条 违约责任
任何一方违反本合同约定,应承担相应的违约责任。
第九条 争议解决
因履行本合同发生的争议,双方应协商解决;协商不成的,可向劳动争议仲裁委员会申请仲裁。
第十条 其他
本合同一式两份,甲乙双方各执一份,自双方签字盖章之日起生效。
甲方(盖章):____________ 乙方(签字):____________
日期:____年__月__日 日期:____年__月__日`,
},
{
id: 'tpl_open_ended_contract',
name: '无固定期限劳动合同',
category: 'CONTRACT',
description: '无固定期限劳动合同模板,适用于符合签订条件的情况',
variables: ['companyName', 'employeeName', 'startDate', 'position', 'monthlySalary'],
content: `无固定期限劳动合同书
甲方(用人单位):{{companyName}}
乙方(劳动者):{{employeeName}}
根据《中华人民共和国劳动合同法》及相关法律法规,甲乙双方在平等自愿、协商一致的基础上,签订无固定期限劳动合同。
第一条 合同期限
本合同为无固定期限劳动合同,自{{startDate}}起生效,至法定终止条件出现时终止。
第二条 工作内容
乙方担任{{position}}岗位。
第三条 劳动报酬
乙方月工资为人民币{{monthlySalary}}元。
(其余条款参照固定期限劳动合同模板)
甲方(盖章):____________ 乙方(签字):____________
日期:____年__月__日 日期:____年__月__日`,
},
{
id: 'tpl_termination_agreement',
name: '解除劳动合同协议书',
category: 'AGREEMENT',
description: '协商一致解除劳动合同协议书模板(用人单位提出)',
variables: ['companyName', 'employeeName', 'idCard', 'terminationDate', 'compensation', 'lastWorkDay', 'socialInsEndMonth', 'housingFundEndMonth'],
content: `解除劳动合同协议书
甲方(用人单位):{{companyName}}
乙方(劳动者):{{employeeName}},身份证号:{{idCard}}
甲乙双方经协商一致,就解除劳动合同事宜达成如下协议:
一、解除日期
双方同意于{{terminationDate}}解除劳动合同,乙方最后工作日为{{lastWorkDay}}。
二、经济补偿
甲方同意向乙方支付经济补偿金人民币{{compensation}}元,于乙方办理完工作交接手续后__个工作日内一次性支付。
三、工资结算
甲方结清乙方截至解除日的所有工资、加班费等劳动报酬。
四、社会保险和公积金
甲方为乙方缴纳社会保险至{{socialInsEndMonth}}月,住房公积金缴存至{{housingFundEndMonth}}月。
五、工作交接
乙方应在解除日前完成工作交接,归还甲方所有财物和资料。
六、保密义务
乙方解除劳动合同后,仍应遵守保密义务,不得泄露甲方商业秘密。
七、争议解决
本协议履行过程中如发生争议,双方应协商解决;协商不成的,可向劳动争议仲裁委员会申请仲裁。
八、其他
本协议一式两份,甲乙双方各执一份,自双方签字盖章之日起生效。
甲方(盖章):____________ 乙方(签字):____________
日期:____年__月__日 日期:____年__月__日`,
},
{
id: 'tpl_termination_agreement_employee',
name: '解除劳动合同协议书(员工提出离职)',
category: 'AGREEMENT',
description: '员工主动提出离职的解除劳动合同协议书模板',
variables: ['companyName', 'employeeName', 'idCard', 'terminationDate', 'lastWorkDay', 'socialInsEndMonth', 'housingFundEndMonth', 'resignationReason'],
content: `解除劳动合同协议书
甲方(用人单位):{{companyName}}
乙方(劳动者):{{employeeName}},身份证号:{{idCard}}
乙方因个人原因主动提出离职,经甲乙双方友好协商,就解除劳动合同事宜达成如下协议:
一、离职原因
乙方因{{resignationReason}},自愿提出解除劳动合同。
二、解除日期
双方同意于{{terminationDate}}解除劳动合同,乙方最后工作日为{{lastWorkDay}}。
三、工资结算
甲方结清乙方截至解除日的所有工资、加班费等劳动报酬,于乙方办理完工作交接手续后__个工作日内一次性支付。
四、社会保险和公积金
甲方为乙方缴纳社会保险至{{socialInsEndMonth}}月,住房公积金缴存至{{housingFundEndMonth}}月。
五、工作交接
乙方应在最后工作日前完成工作交接,归还甲方所有财物和资料。
六、经济补偿
因乙方主动提出离职,甲方无需向乙方支付经济补偿金。乙方确认对此无异议。
七、保密义务
乙方解除劳动合同后,仍应遵守保密义务,不得泄露甲方商业秘密。
八、竞业限制
如双方另行签有竞业限制协议,乙方应继续履行竞业限制义务。
九、争议解决
本协议履行过程中如发生争议,双方应协商解决;协商不成的,可向劳动争议仲裁委员会申请仲裁。
十、其他
1. 本协议签订后,双方劳动关系即告终止,双方不再存在任何劳动争议。
2. 本协议一式两份,甲乙双方各执一份,自双方签字盖章之日起生效。
甲方(盖章):____________ 乙方(签字):____________
日期:____年__月__日 日期:____年__月__日`,
},
{
id: 'tpl_employee_handbook_notice',
name: '员工手册公示通知',
category: 'NOTICE',
description: '员工手册公示通知模板,用于民主程序第四步公示',
variables: ['companyName', 'publishDate', 'effectiveDate'],
content: `关于发布《员工手册》的通知
致全体员工:
经职工代表大会讨论通过,并经与工会平等协商,{{companyName}}现正式发布《员工手册》({{publishDate}}版),自{{effectiveDate}}起施行。
请全体员工认真阅读并遵守《员工手册》的各项规定。如有疑问,请联系人力资源部。
特此通知。
{{companyName}}
{{publishDate}}`,
},
{
id: 'tpl_rules_discussion_notice',
name: '规章制度讨论通知',
category: 'NOTICE',
description: '规章制度职工讨论通知,用于民主程序第二步',
variables: ['companyName', 'meetingDate', 'meetingLocation', 'policyTitle'],
content: `关于召开职工代表大会讨论{{policyTitle}}的通知
致全体职工代表:
根据《劳动合同法》第四条规定,用人单位制定规章制度应当经职工代表大会或全体职工讨论。现定于{{meetingDate}}在{{meetingLocation}}召开职工代表大会,讨论《{{policyTitle}}》草案。
请各位职工代表准时出席,充分发表意见和建议。
特此通知。
{{companyName}}
____年__月__日`,
},
{
id: 'tpl_disciplinary_notice',
name: '违纪处分通知书',
category: 'NOTICE',
description: '员工违纪处分通知书模板',
variables: ['employeeName', 'department', 'violationDate', 'violationDescription', 'disciplineType', 'policyBasis', 'companyName'],
content: `违纪处分通知书
{{employeeName}}{{department}}):
经查,你于{{violationDate}}存在以下违纪行为:
{{violationDescription}}
上述行为违反了公司《{{policyBasis}}》的相关规定。根据公司规章制度,决定给予你以下处分:
{{disciplineType}}
如对本处分决定有异议,你可以在收到本通知之日起__日内向人力资源部提出书面申诉。
特此通知。
{{companyName}}
____年__月__日
签收人:____________ 日期:____年__月__日`,
},
{
id: 'tpl_probation_notice',
name: '试用期转正通知书',
category: 'NOTICE',
description: '试用期考核合格转正通知',
variables: ['employeeName', 'position', 'probationEndDate', 'regularDate', 'monthlySalary', 'companyName'],
content: `试用期转正通知书
{{employeeName}}
经考核,你在试用期内表现合格,符合岗位要求。现通知你:
一、自{{regularDate}}起正式转正,担任{{position}}岗位。
二、转正后月工资为人民币{{monthlySalary}}元。
三、试用期至{{probationEndDate}}结束。
请继续遵守公司各项规章制度,努力工作。
{{companyName}}
____年__月__日`,
},
{
id: 'tpl_contract_expiry_notice',
name: '合同到期不续签通知书',
category: 'NOTICE',
description: '合同到期公司决定不续签的通知',
variables: ['employeeName', 'contractEndDate', 'companyName', 'compensation', 'lastWorkDay'],
content: `劳动合同到期不续签通知书
{{employeeName}}
你与公司签订的劳动合同将于{{contractEndDate}}到期。经公司研究决定,合同到期后不再与你续签劳动合同。
请你于{{lastWorkDay}}前完成工作交接手续。公司将在你完成交接后,依法支付经济补偿金人民币{{compensation}}元。
特此通知。
{{companyName}}
____年__月__日
签收人:____________ 日期:____年__月__日`,
},
]
/**
* 获取所有模板
*/
export function getAllTemplates() {
return documentTemplates.map(({ content, ...rest }) => rest)
}
/**
* 获取模板详情(含内容)
*/
export function getTemplateById(id: string) {
return documentTemplates.find(t => t.id === id) || null
}
/**
* 按分类获取模板
*/
export function getTemplatesByCategory(category: string) {
return documentTemplates.filter(t => t.category === category)
}
/**
* 渲染模板(替换变量)
*/
export function renderTemplate(id: string, variables: Record<string, string>): string | null {
const template = getTemplateById(id)
if (!template) return null
let content = template.content
for (const [key, value] of Object.entries(variables)) {
content = content.replace(new RegExp(`\\{\\{${key}\\}\\}`, 'g'), value)
}
return content
}