chore: 添加社保公积金账户数据修复脚本
- fix-missing-standards.ts: 补齐无年度标准的账户 - fix-housing-base-limits.ts: 更新各城市公积金基数上下限 - check-test-accounts.ts: 删除不完整的测试账户 - assign-accounts.ts: 为全部员工按城市匹配社保公积金账户 Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* 批量补齐无年度标准的账户:从旧 SocialInsuranceConfig / HousingFundConfig 继承数据
|
||||
*/
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
const prisma = new PrismaClient()
|
||||
|
||||
async function main() {
|
||||
const accounts = await prisma.socialAccount.findMany()
|
||||
let created = 0
|
||||
let skipped = 0
|
||||
|
||||
for (const account of accounts) {
|
||||
// 检查是否已有标准
|
||||
const existing = await prisma.socialYearStandard.findFirst({
|
||||
where: { accountId: account.id, isCurrent: true },
|
||||
})
|
||||
if (existing) {
|
||||
skipped++
|
||||
continue
|
||||
}
|
||||
|
||||
// 查旧配置
|
||||
let oldConfig: any = null
|
||||
if (account.type === 'HOUSING') {
|
||||
oldConfig = await prisma.housingFundConfig.findFirst({
|
||||
where: { orgId: account.orgId, city: account.city },
|
||||
orderBy: { effectiveFrom: 'desc' },
|
||||
})
|
||||
} else {
|
||||
oldConfig = await prisma.socialInsuranceConfig.findFirst({
|
||||
where: { orgId: account.orgId, city: account.city },
|
||||
orderBy: { effectiveFrom: 'desc' },
|
||||
})
|
||||
}
|
||||
|
||||
if (!oldConfig) {
|
||||
console.log(`[跳过] ${account.type} ${account.name} (${account.city}) — 无旧配置可继承`)
|
||||
continue
|
||||
}
|
||||
|
||||
// 检查是否已有同 effectiveFrom 的标准(含历史标准)
|
||||
const dupCheck = await prisma.socialYearStandard.findFirst({
|
||||
where: { accountId: account.id, effectiveFrom: oldConfig.effectiveFrom },
|
||||
})
|
||||
if (dupCheck) {
|
||||
// 把已有的设为 current
|
||||
await prisma.socialYearStandard.updateMany({
|
||||
where: { accountId: account.id, effectiveFrom: oldConfig.effectiveFrom },
|
||||
data: { isCurrent: true },
|
||||
})
|
||||
console.log(`[修复] ${account.type} ${account.name} (${account.city}) — 已有标准设为 current`)
|
||||
created++
|
||||
continue
|
||||
}
|
||||
|
||||
// 创建年度标准
|
||||
const std = await prisma.socialYearStandard.create({
|
||||
data: {
|
||||
orgId: account.orgId,
|
||||
accountId: account.id,
|
||||
// 社保比例
|
||||
pensionOrg: oldConfig.pensionOrg || 16,
|
||||
pensionEmp: oldConfig.pensionEmp || 8,
|
||||
medicalOrg: oldConfig.medicalOrg || 9.8,
|
||||
medicalEmp: oldConfig.medicalEmp || 2,
|
||||
medicalOrgExtra: (oldConfig as any).medicalOrgExtra || 0,
|
||||
medicalEmpExtra: (oldConfig as any).medicalEmpExtra || 0,
|
||||
unemploymentOrg: oldConfig.unemploymentOrg || 0.5,
|
||||
unemploymentEmp: oldConfig.unemploymentEmp || 0.5,
|
||||
injuryOrg: oldConfig.injuryOrg || 0.2,
|
||||
maternityOrg: oldConfig.maternityOrg || 0.8,
|
||||
baseMin: oldConfig.baseMin || 6326,
|
||||
baseMax: oldConfig.baseMax || 33891,
|
||||
medicalBaseMin: oldConfig.medicalBaseMin || 0,
|
||||
medicalBaseMax: oldConfig.medicalBaseMax || 0,
|
||||
extraInsurances: oldConfig.extraInsurances || null,
|
||||
// 公积金比例
|
||||
housingOrg: (oldConfig as any).housingOrg || 12,
|
||||
housingEmp: (oldConfig as any).housingEmp || 12,
|
||||
housingBaseMin: 0,
|
||||
housingBaseMax: 0,
|
||||
// 最低工资
|
||||
minWage: (oldConfig as any).minWage || 0,
|
||||
// 生效信息
|
||||
effectiveFrom: oldConfig.effectiveFrom,
|
||||
effectiveTo: null,
|
||||
isCurrent: true,
|
||||
adjustmentDone: false,
|
||||
createdBy: account.createdBy,
|
||||
},
|
||||
})
|
||||
console.log(`[创建] ${account.type} ${account.name} (${account.city}) ← ${oldConfig.effectiveFrom}`)
|
||||
created++
|
||||
}
|
||||
|
||||
console.log(`\n完成:创建 ${created} 个标准,跳过 ${skipped} 个已有标准`)
|
||||
}
|
||||
|
||||
main().then(() => process.exit(0)).catch(e => { console.error(e); process.exit(1) })
|
||||
Reference in New Issue
Block a user