diff --git a/resource/sqlupgrade/DM/sql202312270603.sql b/resource/sqlupgrade/DM/sql202312270603.sql new file mode 100644 index 000000000..99adc68e5 --- /dev/null +++ b/resource/sqlupgrade/DM/sql202312270603.sql @@ -0,0 +1,5 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +); +/ + diff --git a/resource/sqlupgrade/GS/sql202312270603.sql b/resource/sqlupgrade/GS/sql202312270603.sql new file mode 100644 index 000000000..99adc68e5 --- /dev/null +++ b/resource/sqlupgrade/GS/sql202312270603.sql @@ -0,0 +1,5 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +); +/ + diff --git a/resource/sqlupgrade/JC/sql202312270603.sql b/resource/sqlupgrade/JC/sql202312270603.sql new file mode 100644 index 000000000..99adc68e5 --- /dev/null +++ b/resource/sqlupgrade/JC/sql202312270603.sql @@ -0,0 +1,5 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +); +/ + diff --git a/resource/sqlupgrade/Mysql/sql202312270603.sql b/resource/sqlupgrade/Mysql/sql202312270603.sql new file mode 100644 index 000000000..3b1e70e48 --- /dev/null +++ b/resource/sqlupgrade/Mysql/sql202312270603.sql @@ -0,0 +1,2 @@ +ALTER TABLE hrsa_tax_declaration_value +ADD COLUMN source int(0) NULL ; \ No newline at end of file diff --git a/resource/sqlupgrade/Oracle/sql202312270603.sql b/resource/sqlupgrade/Oracle/sql202312270603.sql new file mode 100644 index 000000000..3865d0084 --- /dev/null +++ b/resource/sqlupgrade/Oracle/sql202312270603.sql @@ -0,0 +1,4 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +) +/ \ No newline at end of file diff --git a/resource/sqlupgrade/PG/sql202312270603.sql b/resource/sqlupgrade/PG/sql202312270603.sql new file mode 100644 index 000000000..2c6535f86 --- /dev/null +++ b/resource/sqlupgrade/PG/sql202312270603.sql @@ -0,0 +1 @@ +ALTER TABLE hrsa_tax_declaration_value ADD COLUMN source int NULL ; \ No newline at end of file diff --git a/resource/sqlupgrade/SQLServer/sql202312270603.sql b/resource/sqlupgrade/SQLServer/sql202312270603.sql new file mode 100644 index 000000000..a136431d3 --- /dev/null +++ b/resource/sqlupgrade/SQLServer/sql202312270603.sql @@ -0,0 +1,2 @@ +ALTER TABLE hrsa_tax_declaration_value ADD source int NULL +GO \ No newline at end of file diff --git a/resource/sqlupgrade/ST/sql202312270603.sql b/resource/sqlupgrade/ST/sql202312270603.sql new file mode 100644 index 000000000..99adc68e5 --- /dev/null +++ b/resource/sqlupgrade/ST/sql202312270603.sql @@ -0,0 +1,5 @@ +ALTER TABLE hrsa_tax_declaration_value add ( + source number +); +/ + diff --git a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationCommon.java b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationCommon.java index 904e638e4..2fb43ef1a 100644 --- a/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationCommon.java +++ b/src/com/engine/salary/entity/taxdeclaration/bo/TaxDeclarationCommon.java @@ -14,6 +14,7 @@ import com.engine.salary.entity.taxdeclaration.po.TaxReportColumnPO; import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.enums.taxdeclaration.SourceEnum; import com.engine.salary.util.SalaryDateUtil; import com.engine.salary.util.SalaryEntityUtil; import com.google.common.collect.Lists; @@ -42,11 +43,9 @@ public class TaxDeclarationCommon implements TaxDeclarationStrategy { public TaxDeclarationGenerateResult generate(TaxDeclareContext taxDeclareContext, Long employeeId) { Date now = new Date(); // 薪资核算结果按照薪资核算人员id聚合分类 - Map> salaryAcctResultValueMap = SalaryEntityUtil.group2Map( - taxDeclareContext.getSalaryAcctResultValues(), SalaryAcctResultPO::getSalaryAcctEmpId); + Map> salaryAcctResultValueMap = SalaryEntityUtil.group2Map(taxDeclareContext.getSalaryAcctResultValues(), SalaryAcctResultPO::getSalaryAcctEmpId); // 薪资核算人员按照人员id聚合分类 - Map> employeeIdKeyMap = SalaryEntityUtil.group2Map( - taxDeclareContext.getSalaryAcctEmployees(), SalaryAcctEmployeePO::getEmployeeId); + Map> employeeIdKeyMap = SalaryEntityUtil.group2Map(taxDeclareContext.getSalaryAcctEmployees(), SalaryAcctEmployeePO::getEmployeeId); List taxDeclarationValues = Lists.newArrayListWithExpectedSize(employeeIdKeyMap.size()); for (Map.Entry> employeeIdEntry : employeeIdKeyMap.entrySet()) { @@ -87,6 +86,7 @@ public class TaxDeclarationCommon implements TaxDeclarationStrategy { .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) .createTime(now) .updateTime(now) + .source(SourceEnum.ACCT.getValue()) .build(); taxDeclarationValues.add(taxDeclarationValue); } diff --git a/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationValuePO.java b/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationValuePO.java index 11b97036b..9c88986dd 100644 --- a/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationValuePO.java +++ b/src/com/engine/salary/entity/taxdeclaration/po/TaxDeclarationValuePO.java @@ -1,6 +1,7 @@ package com.engine.salary.entity.taxdeclaration.po; import com.engine.salary.annotation.Encrypt; +import com.engine.salary.enums.taxdeclaration.SourceEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -88,6 +89,12 @@ public class TaxDeclarationValuePO implements Serializable { */ private Date updateTime; + /** + * 数据来源 + * @see SourceEnum + */ + private Integer source; + private Collection ids; private Collection taxDeclarationIds; diff --git a/src/com/engine/salary/enums/taxdeclaration/SourceEnum.java b/src/com/engine/salary/enums/taxdeclaration/SourceEnum.java new file mode 100644 index 000000000..999720d3f --- /dev/null +++ b/src/com/engine/salary/enums/taxdeclaration/SourceEnum.java @@ -0,0 +1,48 @@ +package com.engine.salary.enums.taxdeclaration; + +import com.engine.salary.enums.BaseEnum; + +/** + * 作废申报 + *

Copyright: Copyright (c) 2023

+ *

Company: 泛微软件

+ * + * @author qiantao + * @version 1.0 + **/ +public enum SourceEnum implements BaseEnum { + + ACCT(0, "薪资核算", 160490), + AUTO(1, "自动补充", 160490), + ADD(2, "界面新增", 160491), + EDIT(3, "界面新增", 160491), + IMP(4, "界面导入", 160491); + + + SourceEnum(int value, String defaultLabel, int labelId) { + this.value = value; + this.defaultLabel = defaultLabel; + this.labelId = labelId; + } + + private int value; + + private String defaultLabel; + + private int labelId; + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDefaultLabel() { + return defaultLabel; + } + + @Override + public Integer getLabelId() { + return labelId; + } +} diff --git a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationMapper.xml b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationMapper.xml index 5b9a8e1cc..8324daf64 100644 --- a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationMapper.xml +++ b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationMapper.xml @@ -75,6 +75,12 @@ AND tax_cycle = #{taxCycle} + + AND tax_declare_record_id = #{taxDeclareRecordId} + + + AND income_category = #{incomeCategory} + ORDER BY id DESC diff --git a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.java b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.java index 1515f916c..fc5d0415f 100644 --- a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.java +++ b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.java @@ -120,4 +120,9 @@ public interface TaxDeclarationValueMapper { */ void batchInsert(@Param("collection") Collection taxDeclarationValues); + + List queryNotWagesEmpIds(@Param("taxDeclareRecordId")Long taxDeclareRecordId); + + List queryWagesEmpIds(@Param("taxDeclareRecordId")Long taxDeclareRecordId); + } \ No newline at end of file diff --git a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.xml b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.xml index dfcaecaf1..5935df30e 100644 --- a/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.xml +++ b/src/com/engine/salary/mapper/taxdeclaration/TaxDeclarationValueMapper.xml @@ -428,4 +428,24 @@ + + + + \ No newline at end of file diff --git a/src/com/engine/salary/service/TaxDeclarationService.java b/src/com/engine/salary/service/TaxDeclarationService.java index cb12aae30..91b38c3eb 100644 --- a/src/com/engine/salary/service/TaxDeclarationService.java +++ b/src/com/engine/salary/service/TaxDeclarationService.java @@ -24,6 +24,7 @@ public interface TaxDeclarationService { List listByTaxCycleAndTaxAgentIds(YearMonth salaryMonth, Collection taxAgentIds); List listByTaxDeclareRecordId(Long taxDeclareRecordId); + List listByTaxDeclareRecordId(Long taxDeclareRecordId,Integer incomeCategory); PageInfo listPageByParam(TaxDeclarationListQueryParam queryParam); diff --git a/src/com/engine/salary/service/TaxDeclarationValueService.java b/src/com/engine/salary/service/TaxDeclarationValueService.java index ab129909c..70bd6f729 100644 --- a/src/com/engine/salary/service/TaxDeclarationValueService.java +++ b/src/com/engine/salary/service/TaxDeclarationValueService.java @@ -5,6 +5,7 @@ import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQuer import com.engine.salary.entity.taxdeclaration.param.TaxDeclareRecordDetailSaveParam; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationValuePO; +import com.engine.salary.entity.taxdeclaration.po.TaxDeclareRecordPO; import com.engine.salary.util.page.PageInfo; import java.util.Collection; @@ -71,5 +72,12 @@ public interface TaxDeclarationValueService { */ void deleteByTaxDeclareRecordIds(Collection taxDeclareRecordIds); + /** + * 因为单独申报年终奖不可行 + * 需要补充正常工资薪金的申报,按0申报 + * @param po + */ + void autoAddWagesDeclare(TaxDeclareRecordPO po); + } diff --git a/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java index 3c8391812..d69513ae0 100644 --- a/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclarationServiceImpl.java @@ -102,6 +102,15 @@ public class TaxDeclarationServiceImpl extends Service implements TaxDeclaration TaxDeclarationPO po = TaxDeclarationPO.builder().taxDeclareRecordId(taxDeclareRecordId).build(); return getTaxDeclarationMapper().listSome(po); } + @Override + public List listByTaxDeclareRecordId(Long taxDeclareRecordId,Integer incomeCategory) { + if (Objects.isNull(taxDeclareRecordId)) { + throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(84026, "参数错误")); + } + TaxDeclarationPO po = TaxDeclarationPO.builder().taxDeclareRecordId(taxDeclareRecordId).incomeCategory(incomeCategory).build(); + return getTaxDeclarationMapper().listSome(po); + } + @Override public PageInfo listPageByParam(TaxDeclarationListQueryParam queryParam) { diff --git a/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java index e45ba18f2..b8633e57b 100644 --- a/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclarationValueServiceImpl.java @@ -14,9 +14,13 @@ import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationValueListQuer import com.engine.salary.entity.taxdeclaration.param.TaxDeclareRecordDetailSaveParam; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO; import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationValuePO; +import com.engine.salary.entity.taxdeclaration.po.TaxDeclareRecordPO; import com.engine.salary.entity.taxdeclaration.po.TaxReportColumnPO; import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum; +import com.engine.salary.enums.salaryitem.SalaryDataTypeEnum; import com.engine.salary.enums.salarysob.IncomeCategoryEnum; +import com.engine.salary.enums.sicategory.DeleteTypeEnum; +import com.engine.salary.enums.taxdeclaration.SourceEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.taxdeclaration.TaxDeclarationValueMapper; import com.engine.salary.service.*; @@ -27,6 +31,7 @@ import com.engine.salary.util.db.MapperProxyFactory; import com.engine.salary.util.page.PageInfo; import com.engine.salary.util.page.SalaryPageUtil; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import dm.jdbc.util.IdGenerator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -142,7 +147,7 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar @Override public void save(TaxDeclareRecordDetailSaveParam param) { TaxDeclarationPO taxDeclaration = getTaxDeclarationService(user).getById(param.getTaxDeclarationId()); - if(taxDeclaration==null){ + if (taxDeclaration == null) { throw new SalaryRunTimeException("个税申报表不存在!"); } @@ -156,6 +161,7 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar .resultValueJson(JsonUtil.toJsonString(param.getTaxReportColumnValues())) .createTime(new Date()) .updateTime(new Date()) + .source(SourceEnum.ADD.getValue()) .creator((long) user.getUID()) .deleteType(0) .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) @@ -172,6 +178,7 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar po.setResultValue(param.getTaxReportColumnValues()); po.setResultValueJson(JsonUtil.toJsonString(param.getTaxReportColumnValues())); po.setUpdateTime(new Date()); + po.setSource(SourceEnum.EDIT.getValue()); encryptUtil.encrypt(po, TaxDeclarationValuePO.class); getTaxDeclarationValueMapper().updateIgnoreNull(po); } @@ -179,10 +186,10 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar @Override public TaxDeclarationValuePO getById(Long id) { TaxDeclarationValuePO po = getTaxDeclarationValueMapper().getById(id); - if(po==null){ + if (po == null) { throw new SalaryRunTimeException("个税申报明细不存在!"); } - encryptUtil.decrypt(po,TaxDeclarationValuePO.class); + encryptUtil.decrypt(po, TaxDeclarationValuePO.class); po.setResultValue(JsonUtil.parseMap(po.getResultValueJson(), String.class)); return po; @@ -207,4 +214,84 @@ public class TaxDeclarationValueServiceImpl extends Service implements TaxDeclar }); return taxDeclarationValues; } + + + @Override + public void autoAddWagesDeclare(TaxDeclareRecordPO taxDeclareRecord) { + + Long taxDeclareRecordId = taxDeclareRecord.getId(); + Date now = new Date(); + + //非正常薪资的人员 + List notWagesEmpIds = getTaxDeclarationValueMapper().queryNotWagesEmpIds(taxDeclareRecordId); + if (CollectionUtils.isEmpty(notWagesEmpIds)) { + return; + } + + //正常薪资人员 + List wagesEmpIds = getTaxDeclarationValueMapper().queryWagesEmpIds(taxDeclareRecordId); + + //比较差异 + List autoAddIds = notWagesEmpIds.stream().filter(id -> !wagesEmpIds.contains(id)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(autoAddIds)) { + return; + } + + //正常薪资的表头 + List taxReportColumns = getTaxReportColumnService(user).listByIncomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES); + Map valueMap = Maps.newHashMap(); + for (TaxReportColumnPO taxReportColumn : taxReportColumns) { + String value = Objects.equals(taxReportColumn.getDataType(), SalaryDataTypeEnum.NUMBER.getValue()) ? "0.00" : ""; + valueMap.put(taxReportColumn.getReportColumnDataIndex(), value); + } + + //当前申报表是否含正常申报 + List list = getTaxDeclarationService(user).listByTaxDeclareRecordId(taxDeclareRecordId, IncomeCategoryEnum.WAGES_AND_SALARIES.getValue()); + TaxDeclarationPO taxDeclarationPO; + if (CollectionUtils.isNotEmpty(list)) { + if (list.size() > 1) { + throw new SalaryRunTimeException("存在多条正常工资薪金申报表数据"); + } + taxDeclarationPO = list.get(0); + } else { + taxDeclarationPO = TaxDeclarationPO + .builder() + .id(IdGenerator.generate()) + .taxDeclareRecordId(taxDeclareRecordId) + .incomeCategory(IncomeCategoryEnum.WAGES_AND_SALARIES.getValue()) + .taxAgentId(taxDeclareRecord.getTaxAgentId()) + .salaryMonth(taxDeclareRecord.getSalaryMonth()) + .taxCycle(taxDeclareRecord.getTaxCycle()) + .description(taxDeclareRecord.getRemark()) + .controlView(0) + .creator((long) user.getUID()) + .createTime(now) + .updateTime(now) + .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .build(); + List taxList = new ArrayList<>(); + getTaxDeclarationService(user).saveBatch(taxList); + } + + //组装数据,自动补足 + List autoAddValuePOs = autoAddIds.stream().map((empId -> { + TaxDeclarationValuePO taxDeclarationValue = TaxDeclarationValuePO.builder() + .id(IdGenerator.generate()) + .taxDeclareRecordId(taxDeclarationPO.getTaxDeclareRecordId()) + .taxDeclarationId(taxDeclarationPO.getId()) + .employeeType(0) + .employeeId(empId) + .resultValue(valueMap) + .tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY) + .creator((long) user.getUID()) + .deleteType(DeleteTypeEnum.NOT_DELETED.getValue()) + .createTime(now) + .updateTime(now) + .source(SourceEnum.AUTO.getValue()) + .build(); + return taxDeclarationValue; + })).collect(Collectors.toList()); + batchSave(autoAddValuePOs); + } } diff --git a/src/com/engine/salary/service/impl/TaxDeclareRecordServiceImpl.java b/src/com/engine/salary/service/impl/TaxDeclareRecordServiceImpl.java index f84035722..06a8da778 100644 --- a/src/com/engine/salary/service/impl/TaxDeclareRecordServiceImpl.java +++ b/src/com/engine/salary/service/impl/TaxDeclareRecordServiceImpl.java @@ -376,6 +376,9 @@ public class TaxDeclareRecordServiceImpl extends Service implements TaxDeclareRe } } + //艾志正常工资薪金补足年终奖人员 + getTaxDeclarationValueService(user).autoAddWagesDeclare(taxDeclareRecord); + //更新核算记录状态 getSalaryAcctRecordService(user).updateStatusByIds(salaryAcctRecordIds, SalaryAcctRecordStatusEnum.DECLARED); } @@ -946,7 +949,7 @@ public class TaxDeclareRecordServiceImpl extends Service implements TaxDeclareRe Map>> map = new HashMap<>(); List list = getTaxDeclarationService(user).listByTaxDeclareRecordId(id); - list.stream().map(TaxDeclarationPO::getIncomeCategory).map(IncomeCategoryEnum::parseByValue).forEach(e->e.parseGetDeclareTaxResultFeedbackResponse(map,declareTaxResultFeedbackResponse)); + list.stream().map(TaxDeclarationPO::getIncomeCategory).map(IncomeCategoryEnum::parseByValue).forEach(e -> e.parseGetDeclareTaxResultFeedbackResponse(map, declareTaxResultFeedbackResponse)); return ExcelUtil.genWorkbookV2(map); }