20%劳务代缴计算

This commit is contained in:
andy 2026-05-12 09:29:17 +08:00
parent 90622c0e0b
commit 6b43aa02ae
10 changed files with 432 additions and 77 deletions

View File

@ -337,6 +337,11 @@ public class ParamUtils {
return Collections.asList(param.getParamValue().split(",")).stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
}
public static List<String> 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<Long> 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
*/

View File

@ -35,6 +35,11 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
SpringUtils.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() throws BeansException
{
return SpringUtils.applicationContext;
}
/**
* 获取对象
*

View File

@ -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{" +

View File

@ -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);
}

View File

@ -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<String, CalculationProcessor> 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));

View File

@ -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

View File

@ -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;
}
}

View File

@ -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));
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}