From 6b43aa02ae4dc13fc13a8eecd8a84398b712f418 Mon Sep 17 00:00:00 2001 From: andy <1042025947@qq.com> Date: Tue, 12 May 2026 09:29:17 +0800 Subject: [PATCH] =?UTF-8?q?20%=E5=8A=B3=E5=8A=A1=E4=BB=A3=E7=BC=B4?= =?UTF-8?q?=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/evo/common/utils/ParamUtils.java | 16 +- .../evo/common/utils/spring/SpringUtils.java | 5 + .../evo/finance/domain/RzSalaryDetail.java | 13 ++ .../processor/CalculationProcessor.java | 19 ++ ...yCalculationStrategyExchangeProcessor.java | 166 ++++++++++-------- .../DailyWageStrategyExchangeProcessor.java | 2 +- .../impl/LWTaxCalculationProcessor.java | 129 ++++++++++++++ ...onthlySalaryStrategyExchangeProcessor.java | 29 ++- .../impl/NotTaxCalculationProcessor.java | 39 ++++ .../impl/TaxCalculationProcessor.java | 91 ++++++++++ 10 files changed, 432 insertions(+), 77 deletions(-) create mode 100644 evo-admin/src/main/java/com/evo/finance/processor/CalculationProcessor.java create mode 100644 evo-admin/src/main/java/com/evo/finance/processor/impl/LWTaxCalculationProcessor.java create mode 100644 evo-admin/src/main/java/com/evo/finance/processor/impl/NotTaxCalculationProcessor.java create mode 100644 evo-admin/src/main/java/com/evo/finance/processor/impl/TaxCalculationProcessor.java diff --git a/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java b/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java index e74b24b..49af078 100644 --- a/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java +++ b/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java @@ -337,6 +337,11 @@ public class ParamUtils { return Collections.asList(param.getParamValue().split(",")).stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList()); } + public static List getWeBaoTaxCompany(){ + RzSysParam param= paramService.getRzSysParam("需要扣税的外包公司名称", "we_bao_tax_company","YTLW","需要扣税的外包公司名称)"); + return Collections.asList(param.getParamValue().split(",")).stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList()); + } + /*** * 获取80%假期 @@ -348,7 +353,16 @@ public class ParamUtils { } /*** - * 获取80%假期 + * 获取基本薪假期 + * @return + */ + public static List getBasicVacation(){ + RzSysParam param= paramService.getRzSysParam("基本薪假期类型", "basic_vacation","58","80%的假期类型; 58-陪产假"); + return Collections.asList(param.getParamValue().split(",")).stream().filter(StringUtils::isNotEmpty).map(Long::valueOf).collect(Collectors.toList()); + } + + /*** + * 特殊年度免征额计算 * @param nameAndIdCard 姓名-身份证 * @return */ diff --git a/evo-admin/src/main/java/com/evo/common/utils/spring/SpringUtils.java b/evo-admin/src/main/java/com/evo/common/utils/spring/SpringUtils.java index f8ac726..da6fe59 100644 --- a/evo-admin/src/main/java/com/evo/common/utils/spring/SpringUtils.java +++ b/evo-admin/src/main/java/com/evo/common/utils/spring/SpringUtils.java @@ -35,6 +35,11 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC SpringUtils.applicationContext = applicationContext; } + public static ApplicationContext getApplicationContext() throws BeansException + { + return SpringUtils.applicationContext; + } + /** * 获取对象 * diff --git a/evo-admin/src/main/java/com/evo/finance/domain/RzSalaryDetail.java b/evo-admin/src/main/java/com/evo/finance/domain/RzSalaryDetail.java index 185cf6d..b67e6c0 100644 --- a/evo-admin/src/main/java/com/evo/finance/domain/RzSalaryDetail.java +++ b/evo-admin/src/main/java/com/evo/finance/domain/RzSalaryDetail.java @@ -198,6 +198,11 @@ public class RzSalaryDetail extends BaseEntity @TableField(exist = false) private BigDecimal bjAmount; + /*** + * 扣减费用,. 劳务税率计算 + */ + @TableField(exist = false) + private BigDecimal kjAmount; /** 删除标识 */ private String delFlag; @@ -638,6 +643,14 @@ public class RzSalaryDetail extends BaseEntity this.socialSecurityDeduction = socialSecurityDeduction; } + public BigDecimal getKjAmount() { + return kjAmount; + } + + public void setKjAmount(BigDecimal kjAmount) { + this.kjAmount = kjAmount; + } + @Override public String toString() { return "RzSalaryDetail{" + diff --git a/evo-admin/src/main/java/com/evo/finance/processor/CalculationProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/CalculationProcessor.java new file mode 100644 index 0000000..643a103 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/finance/processor/CalculationProcessor.java @@ -0,0 +1,19 @@ +package com.evo.finance.processor; + +import com.evo.finance.domain.RzSalaryDetail; +import com.evo.system.domain.SysStaffDetail; + +/** + * @desc: 接口 + * @ClassName:CalculationProcessor + * @date: 2026年05月04日 14:36 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +public interface CalculationProcessor { + + boolean accept(String companyName); + + RzSalaryDetail calculation(SysStaffDetail detail, RzSalaryDetail rzSalaryDetail); +} diff --git a/evo-admin/src/main/java/com/evo/finance/processor/SalaryCalculationStrategyExchangeProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/SalaryCalculationStrategyExchangeProcessor.java index cf11e9a..fa0cd4a 100644 --- a/evo-admin/src/main/java/com/evo/finance/processor/SalaryCalculationStrategyExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/finance/processor/SalaryCalculationStrategyExchangeProcessor.java @@ -14,6 +14,7 @@ import com.evo.system.mapper.SysStaffDetailMapper; import com.evo.system.utils.SubsidyCalculationUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; import java.math.BigDecimal; import java.math.RoundingMode; @@ -39,6 +40,9 @@ public interface SalaryCalculationStrategyExchangeProcessor { SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat ym = new SimpleDateFormat("yyyy-MM"); SimpleDateFormat y = new SimpleDateFormat("yyyy"); + + + boolean accept(SysStaffDetail detail); /*** @@ -258,80 +262,98 @@ public interface SalaryCalculationStrategyExchangeProcessor { } //判断是否外包,外包公司员工不做税(月薪50000不上税) - if(ParamUtils.getWebCompany().contains(sysStaff.getCompanyName().toUpperCase())){ - // 实发工资 = 税前工资 - rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getMealFee())); - // 此阶税率为百分之3,速减数为0 - rzSalaryDetail.setTaxRate(DataUtils.DEFAULT_VALUE); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE); - // 本年累计已缴税额 - rzSalaryDetail.setAggregatePersonalIncomeTax(DataUtils.DEFAULT_VALUE); - rzSalaryDetail.setTaxPayable(DataUtils.DEFAULT_VALUE); - }else { - - // 判断应纳税所得额额度(额度不一样税率不一样) - if (rzSalaryDetail.getTaxableIncome().doubleValue() > 0 && rzSalaryDetail.getTaxableIncome().doubleValue() <= 36000l) { - // 此阶税率为百分之3,速减数为0 - rzSalaryDetail.setTaxRate(new BigDecimal("0.03")); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); - } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 36000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 144000L) { - // 此阶税率为百分之3,速减数为0 - rzSalaryDetail.setTaxRate(new BigDecimal("0.10")); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2520")); - } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 144000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 300000l) { - // 此阶税率为百分之3,速减数为0 - rzSalaryDetail.setTaxRate(new BigDecimal("0.20")); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("16920")); - } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 300000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 420000l) { - // 此阶税率为百分之3,速减数为0 - rzSalaryDetail.setTaxRate(new BigDecimal("0.25")); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("31920")); - } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 420000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 660000l) { - // 此阶税率为百分之3,速减数为0 - rzSalaryDetail.setTaxRate(new BigDecimal("0.30")); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("52920")); - } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 660000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 960000l) { - // 此阶税率为百分之3,速减数为0 - rzSalaryDetail.setTaxRate(new BigDecimal("0.35")); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("85920")); - } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 960000l) { - // 此阶税率为百分之3,速减数为0 - rzSalaryDetail.setTaxRate(new BigDecimal("0.45")); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("181920")); - } else { - // 应纳税所得额小于0(免征额+专项扣除>应发工资时) - // 此阶税率为百分之0,速减数为0 - rzSalaryDetail.setTaxRate(new BigDecimal("0.00")); - // 速算扣除数(速算扣除数跟税率同步) - rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); + Map calculationProcessorMap = SpringUtils.getApplicationContext().getBeansOfType(CalculationProcessor.class); + for (CalculationProcessor processor : calculationProcessorMap.values()) { + if (processor.accept(sysStaff.getCompanyName().toUpperCase())) { + rzSalaryDetail = processor.calculation(detail, rzSalaryDetail); } - - - // 判断税前工资是否大于5000,如果小于,则不在计算个税 - if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 5000.00){ - // 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税) - rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax())); - if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) { - rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); - } - } else { - // 应纳税所得额 - rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00")); - rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); - } - // 实发工资(税前工资-本月应缴个人所得税) - rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee())); - // 本年累计已缴税额 - rzSalaryDetail.setAggregatePersonalIncomeTax(detail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable())); } +// if(ParamUtils.getWebCompany().contains(sysStaff.getCompanyName().toUpperCase())){ +// // 实发工资 = 税前工资 +// rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getMealFee())); +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(DataUtils.DEFAULT_VALUE); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE); +// // 本年累计已缴税额 +// rzSalaryDetail.setAggregatePersonalIncomeTax(DataUtils.DEFAULT_VALUE); +// rzSalaryDetail.setTaxPayable(DataUtils.DEFAULT_VALUE); +// }else if (DataUtils.DEFAULT_VALUE.compareTo(ParamUtils.getWeBaoTaxCompany(sysStaff.getCompanyName().toUpperCase())) > 0){ +// //劳务 +// // 判断应纳税所得额额度(额度不一样税率不一样) +// rzSalaryDetail.setTaxRate(ParamUtils.getWeBaoTaxCompany(sysStaff.getCompanyName().toUpperCase())); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); +// rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax())); +// if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) { +// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); +// } +// rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee())); +// // 本年累计已缴税额 +// rzSalaryDetail.setAggregatePersonalIncomeTax(detail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable())); +// }else { +// // 判断应纳税所得额额度(额度不一样税率不一样) +// if (rzSalaryDetail.getTaxableIncome().doubleValue() > 0 && rzSalaryDetail.getTaxableIncome().doubleValue() <= 36000l) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.03")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); +// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 36000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 144000L) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.10")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2520")); +// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 144000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 300000l) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.20")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("16920")); +// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 300000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 420000l) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.25")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("31920")); +// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 420000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 660000l) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.30")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("52920")); +// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 660000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 960000l) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.35")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("85920")); +// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 960000l) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.45")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("181920")); +// } else { +// // 应纳税所得额小于0(免征额+专项扣除>应发工资时) +// // 此阶税率为百分之0,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.00")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); +// } +// +// +// // 判断税前工资是否大于5000,如果小于,则不在计算个税 +// if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 5000.00){ +// // 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税) +// rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax())); +// if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) { +// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); +// } +// } else { +// // 应纳税所得额 +// rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00")); +// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); +// } +// // 实发工资(税前工资-本月应缴个人所得税) +// rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee())); +// // 本年累计已缴税额 +// rzSalaryDetail.setAggregatePersonalIncomeTax(detail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable())); +// } rzSalaryDetail.setId(null); //更新下全年累计 rzSalaryDetail.setSpecialDeduction(detail.getSpecialDeduction().add(kouChu)); diff --git a/evo-admin/src/main/java/com/evo/finance/processor/impl/DailyWageStrategyExchangeProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/impl/DailyWageStrategyExchangeProcessor.java index bd2af41..525de43 100644 --- a/evo-admin/src/main/java/com/evo/finance/processor/impl/DailyWageStrategyExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/finance/processor/impl/DailyWageStrategyExchangeProcessor.java @@ -42,7 +42,7 @@ public class DailyWageStrategyExchangeProcessor implements SalaryCalculationStra @Override public boolean accept(SysStaffDetail detail) { //日薪不为空, 并且大于0 - return detail.getDailyWage() != null && detail.getDailyWage().compareTo(new BigDecimal(0)) > 0; + return detail != null && detail.getDailyWage() != null && detail.getDailyWage().compareTo(new BigDecimal(0)) > 0; } @Override diff --git a/evo-admin/src/main/java/com/evo/finance/processor/impl/LWTaxCalculationProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/impl/LWTaxCalculationProcessor.java new file mode 100644 index 0000000..c3f90d9 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/finance/processor/impl/LWTaxCalculationProcessor.java @@ -0,0 +1,129 @@ +package com.evo.finance.processor.impl; + +import com.evo.common.utils.DataUtils; +import com.evo.common.utils.ParamUtils; +import com.evo.finance.domain.RzSalaryDetail; +import com.evo.finance.processor.CalculationProcessor; +import com.evo.system.domain.SysStaffDetail; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +/** + * @desc: + * @ClassName:LWTaxCalculationProcessor + * @date: 2026年05月04日 14:42 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Service +public class LWTaxCalculationProcessor implements CalculationProcessor { + private String companyName; + @Override + public boolean accept(String companyName) { + this.companyName = companyName;; + return ParamUtils.getWeBaoTaxCompany().contains(companyName); + } + + @Override + public RzSalaryDetail calculation(SysStaffDetail detail, RzSalaryDetail rzSalaryDetail) { + //年度免征额 强制归0 + rzSalaryDetail.setAnnualExemptionAmount(DataUtils.DEFAULT_VALUE); + + if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() <= 4000) { + rzSalaryDetail.setTaxableIncome(rzSalaryDetail.getSalaryBeforeTax().subtract(BigDecimal.valueOf(800))); + if (rzSalaryDetail.getTaxableIncome().doubleValue() <= 0) { + rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00")); + } + }else{ + rzSalaryDetail.setTaxableIncome(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP))); + } + + if (rzSalaryDetail.getTaxableIncome().doubleValue() <= 20000L) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.20")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE); +// rzSalaryDetail.setKjAmount(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); + + } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 20000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 50000l) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.3")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2000")); +// rzSalaryDetail.setKjAmount(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); + } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 50000l) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.40")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("7000")); +// rzSalaryDetail.setKjAmount(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); + } + + + // 判断应纳税所得额额度(额度不一样税率不一样) +// if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() <= 800) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(DataUtils.DEFAULT_VALUE); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE); +//// rzSalaryDetail.setKjAmount(new BigDecimal("800")); +// } else if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 800l && rzSalaryDetail.getSalaryBeforeTax().doubleValue() <= 4000L) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.20")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE); +//// rzSalaryDetail.setKjAmount(new BigDecimal("800")); +//// rzSalaryDetail.setKjAmount(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); +// +// } else if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 4000l && rzSalaryDetail.getSalaryBeforeTax().doubleValue() <= 20000L) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.20")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE); +//// rzSalaryDetail.setKjAmount(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); +// +// } else if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 20000L && rzSalaryDetail.getSalaryBeforeTax().doubleValue() <= 50000l) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.3")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2000")); +//// rzSalaryDetail.setKjAmount(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); +// } else if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 50000l) { +// // 此阶税率为百分之3,速减数为0 +// rzSalaryDetail.setTaxRate(new BigDecimal("0.40")); +// // 速算扣除数(速算扣除数跟税率同步) +// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("7000")); +//// rzSalaryDetail.setKjAmount(rzSalaryDetail.getSalaryBeforeTax().multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_HALF_UP)); +// } + + + // 判断税前工资是否大于5000,如果小于,则不在计算个税 +// if (rzSalaryDetail.getTaxableIncome().doubleValue() > 800.00){ +// // 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税) +// rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax())); +// if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) { +// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); +// } +//// rzSalaryDetail.setTaxableIncome(rzSalaryDetail.getTotalWages().subtract(rzSalaryDetail.getKjAmount())); +// +// } else { +// // 应纳税所得额 +// rzSalaryDetail.setTaxableIncome(DataUtils.DEFAULT_VALUE); +// rzSalaryDetail.setTaxPayable(DataUtils.DEFAULT_VALUE); +// } + + rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax())); + if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) { + rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); + } + + // 实发工资(税前工资-本月应缴个人所得税) + rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee())); + // 本年累计已缴税额 + rzSalaryDetail.setAggregatePersonalIncomeTax(rzSalaryDetail.getTaxPayable()); + + return rzSalaryDetail; + } +} diff --git a/evo-admin/src/main/java/com/evo/finance/processor/impl/MonthlySalaryStrategyExchangeProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/impl/MonthlySalaryStrategyExchangeProcessor.java index e29d995..ec34653 100644 --- a/evo-admin/src/main/java/com/evo/finance/processor/impl/MonthlySalaryStrategyExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/finance/processor/impl/MonthlySalaryStrategyExchangeProcessor.java @@ -12,6 +12,8 @@ import com.evo.finance.processor.SalaryCalculationStrategyExchangeProcessor; import com.evo.personnelMatters.mapper.RzLeaveDetailMapper; import com.evo.system.domain.SysStaff; import com.evo.system.domain.SysStaffDetail; +import com.evo.utils.DateUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -36,12 +38,14 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation private RzAttendanceMapper rzAttendanceMapper; @Resource private RzLeaveDetailMapper rzLeaveDetailMapper; + @Autowired + private DateUtil dateUtil1; @Override public boolean accept(SysStaffDetail detail) { //基本工资不为空, 并且大于0 并且岗位工资不为空, 并且大于0 - return (detail.getBasicSalary() != null && detail.getBasicSalary().compareTo(new BigDecimal(0)) > 0) && (detail.getJobsSalary() != null && detail.getJobsSalary().compareTo(new BigDecimal(0)) > 0); + return (detail != null && detail.getBasicSalary() != null && detail.getBasicSalary().compareTo(new BigDecimal(0)) > 0) && (detail.getJobsSalary() != null && detail.getJobsSalary().compareTo(new BigDecimal(0)) > 0); } /*** @@ -117,6 +121,25 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation rzSalaryDetail.setBjAmount(gs); } + + BigDecimal basic = new BigDecimal("0"); + Long basicHour = 0l; + for (Long type: ParamUtils.getBasicVacation()) { + Long hour = rzLeaveDetailMapper.selectLeaveHourByUserIdAndDateAndType(sysStaff.getUserId(), rzSalaryDetail.getMonth(), type); + if(hour.compareTo(0l)> 0){ + basicHour = basicHour+ hour; + } + } + if(basicHour.compareTo(0l)> 0){ + //存在工伤假, 需要计算 + basic = rzSalaryDetail.getBasicSalary().divide(new BigDecimal(ParamUtils.getMonthWorkDayNum(DateUtils.getYear(rzSalaryDetail.getMonth()), DateUtils.getMonth(rzSalaryDetail.getMonth()))),2, RoundingMode.HALF_UP).multiply(new BigDecimal(total8Hour).divide(Constants.DAY_WORK_HOUR,2,RoundingMode.HALF_UP)); +// rzSalaryDetail.setMonthSalary(rzSalaryDetail.getMonthSalary().add(gs)); +// rzSalaryDetail.setBjAmount(DataUtils.findDefaultValue(rzSalaryDetail.getBjAmount(), DataUtils.DEFAULT_VALUE).add(basic)); + + } + + + BigDecimal gsj = new BigDecimal(0); Long totalAllHour = 0l; for (Long type: ParamUtils.getFullPaidLeave()) { @@ -144,7 +167,7 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation //计算社保占比 socialSecurity(sysStaff, detail, gsj, attendanceStatistical); - //请假时长 - rzSalaryDetail.setAbsenteeismSalary(hourlyWage.multiply(attendanceStatistical.getAbsenteeism().subtract(new BigDecimal(totalAllHour)))); + //缺勤扣款 + rzSalaryDetail.setAbsenteeismSalary(hourlyWage.multiply(attendanceStatistical.getAbsenteeism().subtract(new BigDecimal(totalAllHour))).subtract(basic)); } } diff --git a/evo-admin/src/main/java/com/evo/finance/processor/impl/NotTaxCalculationProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/impl/NotTaxCalculationProcessor.java new file mode 100644 index 0000000..c347594 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/finance/processor/impl/NotTaxCalculationProcessor.java @@ -0,0 +1,39 @@ +package com.evo.finance.processor.impl; + +import com.evo.common.utils.DataUtils; +import com.evo.common.utils.ParamUtils; +import com.evo.finance.domain.RzSalaryDetail; +import com.evo.finance.processor.CalculationProcessor; +import com.evo.system.domain.SysStaffDetail; +import org.springframework.stereotype.Service; + +/** + * @desc: + * @ClassName:NotTaxCalculationProcessor + * @date: 2026年05月04日 14:40 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Service +public class NotTaxCalculationProcessor implements CalculationProcessor { + @Override + public boolean accept(String companyName) { + return ParamUtils.getWebCompany().contains(companyName.toUpperCase()); + } + + @Override + public RzSalaryDetail calculation(SysStaffDetail detail, RzSalaryDetail rzSalaryDetail) { + // 实发工资 = 税前工资 + rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getMealFee())); + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(DataUtils.DEFAULT_VALUE); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE); + // 本年累计已缴税额 + rzSalaryDetail.setAggregatePersonalIncomeTax(DataUtils.DEFAULT_VALUE); + rzSalaryDetail.setTaxPayable(DataUtils.DEFAULT_VALUE); + + return rzSalaryDetail; + } +} diff --git a/evo-admin/src/main/java/com/evo/finance/processor/impl/TaxCalculationProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/impl/TaxCalculationProcessor.java new file mode 100644 index 0000000..7f6de4f --- /dev/null +++ b/evo-admin/src/main/java/com/evo/finance/processor/impl/TaxCalculationProcessor.java @@ -0,0 +1,91 @@ +package com.evo.finance.processor.impl; + +import com.evo.common.utils.DataUtils; +import com.evo.common.utils.ParamUtils; +import com.evo.finance.domain.RzSalaryDetail; +import com.evo.finance.processor.CalculationProcessor; +import com.evo.system.domain.SysStaffDetail; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +/** + * @desc: + * @ClassName:TaxCalculationProcessor + * @date: 2026年05月04日 14:42 + * @author: andy.shi + * @contact: 17330188597 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Service +public class TaxCalculationProcessor implements CalculationProcessor { + @Override + public boolean accept(String companyName) { + return !ParamUtils.getWeBaoTaxCompany().contains(companyName) && !ParamUtils.getWebCompany().contains(companyName.toUpperCase()) ; + } + + @Override + public RzSalaryDetail calculation(SysStaffDetail detail, RzSalaryDetail rzSalaryDetail) { + // 判断应纳税所得额额度(额度不一样税率不一样) + if (rzSalaryDetail.getTaxableIncome().doubleValue() > 0 && rzSalaryDetail.getTaxableIncome().doubleValue() <= 36000l) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.03")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); + } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 36000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 144000L) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.10")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2520")); + } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 144000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 300000l) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.20")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("16920")); + } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 300000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 420000l) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.25")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("31920")); + } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 420000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 660000l) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.30")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("52920")); + } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 660000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 960000l) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.35")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("85920")); + } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 960000l) { + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.45")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("181920")); + } else { + // 应纳税所得额小于0(免征额+专项扣除>应发工资时) + // 此阶税率为百分之0,速减数为0 + rzSalaryDetail.setTaxRate(new BigDecimal("0.00")); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); + } + // 判断税前工资是否大于5000,如果小于,则不在计算个税 + if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 5000.00){ + // 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税) + rzSalaryDetail.setTaxPayable(rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(detail.getAggregatePersonalIncomeTax())); + if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) { + rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); + } + } else { + // 应纳税所得额 + rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00")); + rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); + } + // 实发工资(税前工资-本月应缴个人所得税) + rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable()).subtract(rzSalaryDetail.getMealFee())); + // 本年累计已缴税额 + rzSalaryDetail.setAggregatePersonalIncomeTax(detail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable())); + + return rzSalaryDetail; + } +}