259 lines
10 KiB
Java
259 lines
10 KiB
Java
package com.engine.salary.entity.salaryacct.bo;
|
||
|
||
import com.engine.salary.entity.employeedeclare.bo.EmployeeDeclareRequest;
|
||
import com.engine.salary.entity.employeedeclare.po.EmployeeDeclarePO;
|
||
import com.engine.salary.entity.salaryacct.po.SalaryAcctEmployeePO;
|
||
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
|
||
import com.engine.salary.entity.salarysob.po.SalarySobTaxReportRulePO;
|
||
import com.engine.salary.entity.taxdeclaration.po.TaxReportColumnPO;
|
||
import com.engine.salary.enums.employeedeclare.CardTypeEnum;
|
||
import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum;
|
||
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
|
||
import com.engine.salary.util.SalaryEntityUtil;
|
||
import com.google.common.collect.Lists;
|
||
import com.google.common.collect.Maps;
|
||
import com.wbi.util.Util;
|
||
import lombok.AllArgsConstructor;
|
||
import lombok.Data;
|
||
import org.apache.commons.collections4.CollectionUtils;
|
||
import org.apache.commons.collections4.MapUtils;
|
||
import org.apache.commons.lang3.StringUtils;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.math.RoundingMode;
|
||
import java.util.*;
|
||
|
||
@Data
|
||
@AllArgsConstructor
|
||
public class SalaryCalcTaxRequest {
|
||
|
||
private Map<Long, SalaryAcctEmployeePO> salaryAcctEmployeeMap;
|
||
private Map<Long, List<SalaryAcctResultPO>> salaryAcctResultValueMap;
|
||
private List<TaxReportColumnPO> taxReportColumns;
|
||
private Map<String, SalarySobTaxReportRulePO> salarySobTaxReportRuleMap;
|
||
private List<EmployeeDeclarePO> employeeDeclares;
|
||
|
||
/**
|
||
* 正常工资薪金
|
||
*
|
||
* @return
|
||
*/
|
||
public Map<String, Object> buildZCGZXJRequestParam() {
|
||
// 人员列表
|
||
List<Map<String, Object>> RYLBRequestParam = EmployeeDeclareRequest.convert2RequestParam(employeeDeclares);
|
||
// 正常工资薪金列表
|
||
List<Map<String, Object>> ZCGZXJLBRequestParams = buildRequestParams(IncomeCategoryEnum.WAGES_AND_SALARIES,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
|
||
Map<String, Object> param = new HashMap<>();
|
||
// 人员列表
|
||
param.put("rylb", RYLBRequestParam);
|
||
// 正常工资薪金列表
|
||
param.put("zcgzxjlb", ZCGZXJLBRequestParams);
|
||
// 正常工资薪金是否需要专项
|
||
param.put("zcgzxjsfxyzx", 1);
|
||
// 正常工资薪金是否传入专项累计
|
||
param.put("zcgzxjsfcrlj", 0);
|
||
// 是否传入累计个人养老金,2使用传入数据
|
||
param.put("gryljcl", 2);
|
||
|
||
return param;
|
||
}
|
||
|
||
/**
|
||
* 全年一次性奖金收入
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildQNYCXJJSSLBRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.ONETIME_ANNUAL_BONUS,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
/**
|
||
* 稿酬所得
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildGCSDLBRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.REMUNERATION_FOR_AUTHOR,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
/**
|
||
* 一般劳务报酬所得
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildLWBCLBRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.REMUNERATION_FOR_LABOR,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
/**
|
||
* 解除劳动合同一次性补偿金
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildJCLDHTYCXBCJLBRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.COMPENSATION_FOR_DISMISS,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
/**
|
||
* 保险营销员佣金收入
|
||
*
|
||
* @return
|
||
*/
|
||
public Map<String, Object> buildBXYXYRequestParam() {
|
||
List<Map<String, Object>> requestParams = buildRequestParams(IncomeCategoryEnum.INCOME_FOR_INSURANCE_SALESMAN,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
|
||
Map<String, Object> param = new HashMap<>();
|
||
// 保险营销员薪金列表
|
||
param.put("bxyxylwbclb", requestParams);
|
||
// 是否传入累计个人养老金,2使用传入数据
|
||
param.put("gryljcl", 2);
|
||
return param;
|
||
}
|
||
|
||
/**
|
||
* 证券经纪人佣金收入
|
||
*
|
||
* @return
|
||
*/
|
||
public Map<String, Object> buildZQJJRRequestParam() {
|
||
List<Map<String, Object>> requestParams = buildRequestParams(IncomeCategoryEnum.INCOME_FOR_SECURITIES_BROKER,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
|
||
Map<String, Object> param = new HashMap<>();
|
||
// 证券经纪人薪金列表
|
||
param.put("zqjjrsdlb", requestParams);
|
||
// 是否传入累计个人养老金,2使用传入数据
|
||
param.put("gryljcl", 2);
|
||
return param;
|
||
}
|
||
|
||
/**
|
||
* 其他连续劳务报酬所得
|
||
*
|
||
* @return
|
||
*/
|
||
public Map<String, Object> buildQTLXLWBCRequestParam() {
|
||
List<Map<String, Object>> requestParams = buildRequestParams(IncomeCategoryEnum.REMUNERATION_FOR_OTHER_CONTINUOUS_LABOR,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
|
||
Map<String, Object> param = new HashMap<>();
|
||
param.put("qtlxlwbclb", Lists.newArrayList());
|
||
// 是否传入累计个人养老金,2使用传入数据
|
||
param.put("gryljcl", 2);
|
||
return param;
|
||
}
|
||
|
||
/**
|
||
* 特许权使用费所得
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildTXQRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.ROYALTIES,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
/**
|
||
* 个人股权激励收入
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildGRGQJLRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.INCOME_FOR_INDIVIDUAL_EQUITY_INCENTIVE,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
/**
|
||
* 年金领取
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildQYNJRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.ANNUITY_RECEIPT,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
/**
|
||
* 内退一次性补偿金
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildNTYCXBCJLBRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.COMPENSATION_FOR_RETIRE,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
/**
|
||
* 其他非连续劳务报酬所得
|
||
*
|
||
* @return
|
||
*/
|
||
public List<Map<String, Object>> buildQTFLXLWBCRequestParam() {
|
||
return buildRequestParams(IncomeCategoryEnum.REMUNERATION_FOR_OTHER_LABOR,
|
||
employeeDeclares, salaryAcctEmployeeMap, salaryAcctResultValueMap);
|
||
}
|
||
|
||
public List<Map<String, Object>> buildRequestParams(IncomeCategoryEnum incomeCategoryEnum,
|
||
List<EmployeeDeclarePO> employeeDeclares,
|
||
Map<Long, SalaryAcctEmployeePO> salaryAcctEmployeeMap,
|
||
Map<Long, List<SalaryAcctResultPO>> salaryAcctResultValueMap) {
|
||
List<Map<String, Object>> requestParams = Lists.newArrayListWithExpectedSize(salaryAcctResultValueMap.size());
|
||
for (EmployeeDeclarePO employeeDeclare : employeeDeclares) {
|
||
SalaryAcctEmployeePO salaryAcctEmployee = salaryAcctEmployeeMap.get(employeeDeclare.getEmployeeId());
|
||
if (salaryAcctEmployee == null) {
|
||
continue;
|
||
}
|
||
List<SalaryAcctResultPO> salaryAcctResultValue = salaryAcctResultValueMap.get(salaryAcctEmployee.getId());
|
||
if (salaryAcctResultValue == null) {
|
||
continue;
|
||
}
|
||
Map<Long, String> map = SalaryEntityUtil.convert2Map(salaryAcctResultValue, SalaryAcctResultPO::getSalaryItemId, SalaryAcctResultPO::getResultValue);
|
||
Map<String, Object> requestParam = buildRequestParam(incomeCategoryEnum, employeeDeclare, map);
|
||
if (MapUtils.isNotEmpty(requestParam)) {
|
||
requestParams.add(requestParam);
|
||
}
|
||
}
|
||
return requestParams;
|
||
}
|
||
|
||
private Map<String, Object> buildRequestParam(IncomeCategoryEnum incomeCategoryEnum,
|
||
EmployeeDeclarePO employeeDeclare,
|
||
Map<Long, String> salaryAcctResultValue) {
|
||
if (CollectionUtils.isEmpty(taxReportColumns)) {
|
||
return Collections.emptyMap();
|
||
}
|
||
Map<String, Object> requestParam = Maps.newHashMap();
|
||
// 姓名
|
||
requestParam.put("xm", employeeDeclare.getEmployeeName());
|
||
// 证件类型
|
||
requestParam.put("zzlx", CardTypeEnum.getByValue(employeeDeclare.getCardType()).getDefaultLabel());
|
||
// 证件号码
|
||
requestParam.put("zzhm", employeeDeclare.getCardNum());
|
||
// 所得项目
|
||
requestParam.put("sdxm", incomeCategoryEnum.getDefaultLabel());
|
||
|
||
for (TaxReportColumnPO taxReportColumn : taxReportColumns) {
|
||
Long dataKey = null;
|
||
SalarySobTaxReportRulePO salarySobTaxReportRule = salarySobTaxReportRuleMap.get(taxReportColumn.getReportColumnDataIndex());
|
||
if (salarySobTaxReportRule != null && salarySobTaxReportRule.getSalaryItemId() != null) {
|
||
dataKey = salarySobTaxReportRule.getSalaryItemId();
|
||
}
|
||
String value = salaryAcctResultValue.getOrDefault(dataKey, StringUtils.EMPTY);
|
||
if (Objects.equals(taxReportColumn.getDataType(), SalaryDataTypeEnum.NUMBER.getValue())) {
|
||
value = Util.getBigDecimalValue(value, BigDecimal.ZERO).toPlainString();
|
||
} else if (Objects.equals(taxReportColumn.getDataType(), "integer")) {
|
||
value = Util.getBigDecimalValue(value, BigDecimal.ZERO).setScale(0, RoundingMode.HALF_UP).toPlainString();
|
||
}
|
||
requestParam.put(taxReportColumn.getRequestParamKey(), value);
|
||
}
|
||
return requestParam;
|
||
}
|
||
}
|