20%劳务代缴计算
This commit is contained in:
parent
90622c0e0b
commit
6b43aa02ae
@ -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
|
||||
*/
|
||||
|
||||
@ -35,6 +35,11 @@ public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationC
|
||||
SpringUtils.applicationContext = applicationContext;
|
||||
}
|
||||
|
||||
public static ApplicationContext getApplicationContext() throws BeansException
|
||||
{
|
||||
return SpringUtils.applicationContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取对象
|
||||
*
|
||||
|
||||
@ -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{" +
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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));
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user