weaver-hrm-salary/src/com/engine/salary/entity/salaryacct/bo/SalaryCalcTax.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;
}
}