242 lines
13 KiB
Java
242 lines
13 KiB
Java
package com.engine.salary.entity.salaryacct.bo;
|
|
|
|
import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO;
|
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
|
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
|
import com.engine.salary.entity.salaryacct.po.SalaryAcctTaxAgentPO;
|
|
import com.engine.salary.entity.salarysob.po.SalarySobTaxReportRulePO;
|
|
import com.engine.salary.entity.taxagent.bo.TaxAgentTaxReturnBO;
|
|
import com.engine.salary.entity.taxagent.po.TaxAgentPO;
|
|
import com.engine.salary.entity.taxagent.po.TaxAgentTaxReturnPO;
|
|
import com.engine.salary.entity.taxdeclaration.po.TaxReportColumnPO;
|
|
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
|
|
import com.engine.salary.exception.SalaryRunTimeException;
|
|
import com.engine.salary.util.SalaryDateUtil;
|
|
import com.engine.salary.util.SalaryEntityUtil;
|
|
import com.engine.salary.util.SalaryI18nUtil;
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.Data;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/**
|
|
* 薪资核算计算个税
|
|
*
|
|
* @author xiajun
|
|
*/
|
|
@Data
|
|
@AllArgsConstructor
|
|
public class SalaryCalcTax {
|
|
|
|
/**
|
|
* 薪资核算记录
|
|
*/
|
|
private SalaryAcctRecordPO salaryAcctRecord;
|
|
|
|
/**
|
|
* 薪资核算关联的个税扣缴义务人
|
|
*/
|
|
private List<SalaryAcctTaxAgentPO> salaryAcctTaxAgents;
|
|
|
|
/**
|
|
* 薪资核算关联的薪资核算人员
|
|
*/
|
|
private List<SalaryAcctEmployeePO> salaryAcctEmployees;
|
|
|
|
/**
|
|
* 薪资核算关联的薪资核算结果
|
|
*/
|
|
private List<SalaryAcctResultPO> salaryAcctResultValues;
|
|
|
|
/**
|
|
* 个税扣缴义务人
|
|
*/
|
|
private List<TaxAgentPO> taxAgents;
|
|
|
|
/**
|
|
* 个税扣缴义务人的个税信息
|
|
*/
|
|
private List<TaxAgentTaxReturnPO> taxAgentTaxReturns;
|
|
|
|
/**
|
|
* 个税申报表字段
|
|
*/
|
|
private List<TaxReportColumnPO> taxReportColumns;
|
|
|
|
/**
|
|
* 薪资账套的个税申报表字段对应
|
|
*/
|
|
private List<SalarySobTaxReportRulePO> salarySobTaxReportRules;
|
|
|
|
/**
|
|
* 报送人员
|
|
*/
|
|
private List<EmployeeDeclarePO> employeeDeclares;
|
|
|
|
public Map<Long, Map<String, Object>> buildCalcTaxRequestParam() {
|
|
// 薪资核算关联的个税扣缴义务人
|
|
Map<Long, List<SalaryAcctTaxAgentPO>> salaryAcctAgentMap = SalaryEntityUtil.group2Map(salaryAcctTaxAgents, SalaryAcctTaxAgentPO::getTaxAgentId);
|
|
// 薪资核算关联的薪资核算人员
|
|
Map<Long, List<SalaryAcctEmployeePO>> salaryAcctEmployeeMap = SalaryEntityUtil.group2Map(salaryAcctEmployees, SalaryAcctEmployeePO::getTaxAgentId);
|
|
// 薪资核算关联的薪资核算结果
|
|
Map<Long, List<SalaryAcctResultPO>> salaryAcctResultValueMap = SalaryEntityUtil.group2Map(salaryAcctResultValues, SalaryAcctResultPO::getSalaryAcctEmpId);
|
|
// 个税扣款义务人
|
|
Map<Long, TaxAgentPO> taxAgentMap = SalaryEntityUtil.convert2Map(taxAgents, TaxAgentPO::getId);
|
|
// 个税扣款义务人的个税信息
|
|
Map<Long, TaxAgentTaxReturnPO> taxAgentTaxReturnMap = SalaryEntityUtil.convert2Map(taxAgentTaxReturns, TaxAgentTaxReturnPO::getTaxAgentId);
|
|
// 个税申报表字段
|
|
Map<String, List<TaxReportColumnPO>> taxReportColumnMap = SalaryEntityUtil.group2Map(taxReportColumns, TaxReportColumnPO::getIncomeCategory);
|
|
// 薪资账套的个税申报表字段对应
|
|
Map<String, SalarySobTaxReportRulePO> salarySobTaxReportRuleMap = SalaryEntityUtil.convert2Map(salarySobTaxReportRules, SalarySobTaxReportRulePO::getReportColumnDataIndex);
|
|
// 报送人员
|
|
Map<Long, List<EmployeeDeclarePO>> employeeDeclareMap = SalaryEntityUtil.group2Map(employeeDeclares, EmployeeDeclarePO::getTaxAgentId);
|
|
|
|
Map<Long, Map<String, Object>> resultMap = new HashMap<>();
|
|
|
|
for (Map.Entry<Long, List<SalaryAcctTaxAgentPO>> entry : salaryAcctAgentMap.entrySet()) {
|
|
TaxAgentPO taxAgent = taxAgentMap.get(entry.getKey());
|
|
if (taxAgent == null) {
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "个税扣缴义务人不存在或已被删除"));
|
|
}
|
|
TaxAgentTaxReturnPO taxAgentTaxReturn = taxAgentTaxReturnMap.get(taxAgent.getId());
|
|
if (taxAgentTaxReturn == null) {
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "个税扣缴义务人没有维护个税信息"));
|
|
}
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployees = salaryAcctEmployeeMap.get(taxAgent.getId());
|
|
if (CollectionUtils.isEmpty(salaryAcctEmployees)) {
|
|
continue;
|
|
}
|
|
List<EmployeeDeclarePO> employeeDeclares = employeeDeclareMap.get(taxAgent.getId());
|
|
if (CollectionUtils.isEmpty(employeeDeclares)) {
|
|
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(0, "该个税扣缴义务人无申报人员"));
|
|
}
|
|
|
|
// 注册的企业信息-->请求参数
|
|
Map<String, Object> requestParam = TaxAgentTaxReturnBO.convert2RequestMap(taxAgent, taxAgentTaxReturn);
|
|
// 税款所属期
|
|
requestParam.put("skssq", SalaryDateUtil.getFormatYYYYMM(entry.getValue().get(0).getTaxCycle()));
|
|
// 综合所得
|
|
requestParam.put("zhsd", buildZHSDRequestParam(salaryAcctTaxAgents, salaryAcctEmployees,
|
|
salaryAcctResultValueMap, taxReportColumnMap, salarySobTaxReportRuleMap, employeeDeclares));
|
|
// 综合所得
|
|
requestParam.put("flsd", buildFLSDRequestParam(salaryAcctTaxAgents, salaryAcctEmployees,
|
|
salaryAcctResultValueMap, taxReportColumnMap, salarySobTaxReportRuleMap, employeeDeclares));
|
|
|
|
resultMap.put(taxAgent.getId(), requestParam);
|
|
}
|
|
return resultMap;
|
|
}
|
|
|
|
private Map<String, Object> buildZHSDRequestParam(List<SalaryAcctTaxAgentPO> salaryAcctTaxAgents,
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployees,
|
|
Map<Long, List<SalaryAcctResultPO>> salaryAcctResultValueMap,
|
|
Map<String, List<TaxReportColumnPO>> taxReportColumnMap,
|
|
Map<String, SalarySobTaxReportRulePO> salarySobTaxReportRuleMap,
|
|
List<EmployeeDeclarePO> employeeDeclares) {
|
|
Map<String, List<SalaryAcctEmployeePO>> incomeCategoryKeySalaryAcctEmployeeMap = SalaryEntityUtil
|
|
.group2Map(salaryAcctEmployees, SalaryAcctEmployeePO::getIncomeCategory);
|
|
|
|
Map<String, Object> requestParam = new HashMap<>();
|
|
|
|
for (SalaryAcctTaxAgentPO salaryAcctTaxAgent : salaryAcctTaxAgents) {
|
|
IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum
|
|
.parseByValue(salaryAcctTaxAgent.getIncomeCategory());
|
|
List<TaxReportColumnPO> taxReportColumns = taxReportColumnMap.get(incomeCategoryEnum.getValue().toString());
|
|
List<SalaryAcctEmployeePO> subSalaryAcctEmployees = incomeCategoryKeySalaryAcctEmployeeMap.get(incomeCategoryEnum.getValue().toString());
|
|
Map<Long, SalaryAcctEmployeePO> salaryAcctEmployeeMap = SalaryEntityUtil.convert2Map(subSalaryAcctEmployees, SalaryAcctEmployeePO::getEmployeeId);
|
|
|
|
SalaryCalcTaxRequest salaryCalcTaxRequest = new SalaryCalcTaxRequest(salaryAcctEmployeeMap,
|
|
salaryAcctResultValueMap, taxReportColumns, salarySobTaxReportRuleMap, employeeDeclares);
|
|
|
|
switch (incomeCategoryEnum) {
|
|
case WAGES_AND_SALARIES:
|
|
requestParam.put("zcgzxj", salaryCalcTaxRequest.buildZCGZXJRequestParam());
|
|
break;
|
|
case ONETIME_ANNUAL_BONUS:
|
|
requestParam.put("qnycxjjsslb", salaryCalcTaxRequest.buildQNYCXJJSSLBRequestParam());
|
|
break;
|
|
case COMPENSATION_FOR_RETIRE:
|
|
requestParam.put("ntycxbcjlb", salaryCalcTaxRequest.buildNTYCXBCJLBRequestParam());
|
|
break;
|
|
case COMPENSATION_FOR_DISMISS:
|
|
requestParam.put("jcldhtycxbcjlb", salaryCalcTaxRequest.buildJCLDHTYCXBCJLBRequestParam());
|
|
break;
|
|
case INCOME_FOR_INDIVIDUAL_EQUITY_INCENTIVE:
|
|
requestParam.put("grgqjl", salaryCalcTaxRequest.buildGRGQJLRequestParam());
|
|
break;
|
|
case ANNUITY_RECEIPT:
|
|
requestParam.put("qynj", salaryCalcTaxRequest.buildQYNJRequestParam());
|
|
break;
|
|
case REMUNERATION_FOR_LABOR:
|
|
requestParam.put("lwbclb", salaryCalcTaxRequest.buildLWBCLBRequestParam());
|
|
break;
|
|
case INCOME_FOR_INSURANCE_SALESMAN:
|
|
requestParam.put("bxyxy", salaryCalcTaxRequest.buildBXYXYRequestParam());
|
|
break;
|
|
case INCOME_FOR_SECURITIES_BROKER:
|
|
requestParam.put("zqjjr", salaryCalcTaxRequest.buildZQJJRRequestParam());
|
|
break;
|
|
case REMUNERATION_FOR_OTHER_CONTINUOUS_LABOR:
|
|
requestParam.put("qtlxlwbc", salaryCalcTaxRequest.buildQTLXLWBCRequestParam());
|
|
break;
|
|
case REMUNERATION_FOR_OTHER_LABOR:
|
|
requestParam.put("qtflxlwbc", salaryCalcTaxRequest.buildQTFLXLWBCRequestParam());
|
|
break;
|
|
case REMUNERATION_FOR_AUTHOR:
|
|
requestParam.put("gcsdlb", salaryCalcTaxRequest.buildGCSDLBRequestParam());
|
|
break;
|
|
case ROYALTIES:
|
|
requestParam.put("txq", salaryCalcTaxRequest.buildTXQRequestParam());
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
}
|
|
return requestParam;
|
|
}
|
|
|
|
private Map<String, Object> buildFLSDRequestParam(List<SalaryAcctTaxAgentPO> salaryAcctTaxAgents,
|
|
List<SalaryAcctEmployeePO> salaryAcctEmployees,
|
|
Map<Long, List<SalaryAcctResultPO>> salaryAcctResultValueMap,
|
|
Map<String, List<TaxReportColumnPO>> taxReportColumnMap,
|
|
Map<String, SalarySobTaxReportRulePO> salarySobTaxReportRuleMap,
|
|
List<EmployeeDeclarePO> employeeDeclares) {
|
|
Map<String, List<SalaryAcctEmployeePO>> incomeCategoryKeySalaryAcctEmployeeMap = SalaryEntityUtil
|
|
.group2Map(salaryAcctEmployees, SalaryAcctEmployeePO::getIncomeCategory);
|
|
|
|
Map<String, Object> requestParam = new HashMap<>();
|
|
|
|
for (SalaryAcctTaxAgentPO salaryAcctTaxAgent : salaryAcctTaxAgents) {
|
|
IncomeCategoryEnum incomeCategoryEnum = IncomeCategoryEnum
|
|
.parseByValue(salaryAcctTaxAgent.getIncomeCategory());
|
|
List<TaxReportColumnPO> taxReportColumns = taxReportColumnMap.get(incomeCategoryEnum.getValue().toString());
|
|
List<SalaryAcctEmployeePO> subSalaryAcctEmployees = incomeCategoryKeySalaryAcctEmployeeMap.get(incomeCategoryEnum.getValue().toString());
|
|
Map<Long, SalaryAcctEmployeePO> salaryAcctEmployeeMap = SalaryEntityUtil.convert2Map(subSalaryAcctEmployees, SalaryAcctEmployeePO::getEmployeeId);
|
|
|
|
SalaryCalcTaxRequest salaryCalcTaxRequest = new SalaryCalcTaxRequest(salaryAcctEmployeeMap,
|
|
salaryAcctResultValueMap, taxReportColumns, salarySobTaxReportRuleMap, employeeDeclares);
|
|
|
|
switch (incomeCategoryEnum) {
|
|
case CLASSIFIED_INCOME_LISTED_COMPANY_DIVIDENDS_BONUSES:
|
|
List<Map<String, Object>> ssgsgxhllb = salaryCalcTaxRequest.buildRequestParams(IncomeCategoryEnum.CLASSIFIED_INCOME_LISTED_COMPANY_DIVIDENDS_BONUSES,
|
|
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
|
requestParam.put("ssgsgxhllb", ssgsgxhllb);
|
|
break;
|
|
case CLASSIFIED_INCOME_OTHER_INTEREST_DIVIDENDS_BONUSES:
|
|
List<Map<String, Object>> lxgxhllb = salaryCalcTaxRequest.buildRequestParams(IncomeCategoryEnum.CLASSIFIED_INCOME_OTHER_INTEREST_DIVIDENDS_BONUSES,
|
|
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
|
requestParam.put("lxgxhllb", lxgxhllb);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return requestParam;
|
|
}
|
|
}
|