Merge branch 'feature/250101_编辑个税申报表' into custom/西部信托
# Conflicts: # src/com/engine/salary/service/impl/TaxDeclarationDetailServiceImpl.java
This commit is contained in:
commit
2135989cdb
|
|
@ -1,6 +1,9 @@
|
|||
package com.engine.salary.entity.taxdeclaration.dto;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 个税申报表中的人员(组织架构中的人员+外部人员)
|
||||
|
|
@ -10,6 +13,9 @@ import lombok.Data;
|
|||
* @author qiantao
|
||||
* @version 1.0
|
||||
**/
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Data
|
||||
public class TaxDeclarationEmployeeDTO {
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
package com.engine.salary.entity.taxdeclaration.param;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@Accessors(chain = true)
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class TaxDeclarationDetailFormEditParam {
|
||||
|
||||
//"个税申报记录id")
|
||||
private Long taxDeclarationId;
|
||||
|
||||
private Long employeeId;
|
||||
|
||||
private String taxDeclarationIdStr;
|
||||
|
||||
private Map<String, Object> valueMap;
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package com.engine.salary.entity.taxdeclaration.param;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@Accessors(chain = true)
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class TaxDeclarationDetailFormQueryParam {
|
||||
|
||||
//"个税申报记录id")
|
||||
private Long taxDeclarationId;
|
||||
|
||||
private String taxDeclarationIdStr;
|
||||
|
||||
private Long employeeId;
|
||||
}
|
||||
|
|
@ -70,4 +70,6 @@ public interface TaxDeclarationDetailMapper {
|
|||
List<TaxDeclarationDetailPO> listAll();
|
||||
|
||||
int batchUpdate(@Param("collection") List<TaxDeclarationDetailPO> taxDeclarationDetailPos);
|
||||
|
||||
void deleteByTaxDeclarationIdAndEmployeeId(@Param("taxDeclarationId") Long taxDeclarationId, @Param("employeeId") Long employeeId);
|
||||
}
|
||||
|
|
@ -31,6 +31,13 @@
|
|||
, t.update_time
|
||||
, t.employee_type
|
||||
</sql>
|
||||
<update id="deleteByTaxDeclarationIdAndEmployeeId">
|
||||
UPDATE hrsa_tax_declaration_detail
|
||||
SET delete_type = 1
|
||||
WHERE delete_type = 0
|
||||
AND tax_declaration_id = #{taxDeclarationId}
|
||||
AND employee_id = #{employeeId}
|
||||
</update>
|
||||
|
||||
|
||||
<resultMap id="resultMap" type="com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationEmployeeDTO">
|
||||
|
|
@ -39,7 +46,7 @@
|
|||
</resultMap>
|
||||
|
||||
<select id="listPage4EmployeeId" resultMap="resultMap">
|
||||
SELECT employee_type, employee_id
|
||||
SELECT employee_type, employee_id
|
||||
FROM hrsa_tax_declaration_detail t
|
||||
LEFT JOIN hrmresource e ON e.id = t.employee_id
|
||||
LEFT JOIN hrmdepartment d ON d.id = e.DEPARTMENTID
|
||||
|
|
|
|||
|
|
@ -1,12 +1,15 @@
|
|||
package com.engine.salary.service;
|
||||
|
||||
import com.engine.salary.entity.taxdeclaration.dto.*;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormEditParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormQueryParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
|
||||
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO;
|
||||
import com.engine.salary.util.page.PageInfo;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 个税申报表明细
|
||||
|
|
@ -84,4 +87,8 @@ public interface TaxDeclarationDetailService {
|
|||
* @param taxDeclarationIds 个税申报表id
|
||||
*/
|
||||
void deleteByTaxDeclarationIds(Collection<Long> taxDeclarationIds);
|
||||
|
||||
Map<String, Object> getTaxDeclarationDetailForm(TaxDeclarationDetailFormQueryParam param);
|
||||
|
||||
void editTaxDeclarationDetailData(TaxDeclarationDetailFormEditParam param);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,15 +2,19 @@ package com.engine.salary.service.impl;
|
|||
|
||||
import com.engine.common.util.ServiceUtil;
|
||||
import com.engine.core.impl.Service;
|
||||
import com.engine.salary.constant.SalaryDefaultTenantConstant;
|
||||
import com.engine.salary.encrypt.EncryptUtil;
|
||||
import com.engine.salary.entity.datacollection.DataCollectionEmployee;
|
||||
import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationBO;
|
||||
import com.engine.salary.entity.taxdeclaration.bo.TaxDeclarationDetailBO;
|
||||
import com.engine.salary.entity.taxdeclaration.dto.*;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormEditParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormQueryParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
|
||||
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationDetailPO;
|
||||
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
|
||||
import com.engine.salary.enums.salaryaccounting.EmployeeTypeEnum;
|
||||
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
|
||||
import com.engine.salary.exception.SalaryRunTimeException;
|
||||
import com.engine.salary.mapper.taxdeclaration.TaxDeclarationDetailMapper;
|
||||
import com.engine.salary.service.SalaryEmployeeService;
|
||||
|
|
@ -21,12 +25,17 @@ import com.engine.salary.sys.entity.vo.OrderRuleVO;
|
|||
import com.engine.salary.sys.service.SalarySysConfService;
|
||||
import com.engine.salary.sys.service.impl.SalarySysConfServiceImpl;
|
||||
import com.engine.salary.util.SalaryEntityUtil;
|
||||
import com.engine.salary.util.db.IdGenerator;
|
||||
import com.engine.salary.util.db.MapperProxyFactory;
|
||||
import com.engine.salary.util.page.Column;
|
||||
import com.engine.salary.util.page.PageInfo;
|
||||
import com.engine.salary.util.page.SalaryPageUtil;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.BooleanUtils;
|
||||
import org.apache.commons.lang3.math.NumberUtils;
|
||||
import weaver.hrm.User;
|
||||
import weaver.wechat.util.Utils;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
|
@ -202,6 +211,45 @@ public class TaxDeclarationDetailServiceImpl extends Service implements TaxDecla
|
|||
return TaxDeclarationDetailBO.convert2ListDTO4Annual(taxDeclarationDetailPOS, taxDeclarationEmployees, simpleEmployees);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据权限范围过滤
|
||||
*
|
||||
* @param taxDeclarationPO
|
||||
* @param taxDeclarationEmployeeDTOS
|
||||
* @return
|
||||
*/
|
||||
private List<TaxDeclarationEmployeeDTO> filterByAuthority(TaxDeclarationPO taxDeclarationPO, List<TaxDeclarationEmployeeDTO> taxDeclarationEmployeeDTOS) {
|
||||
long employeeId = user.getUID();
|
||||
if (CollectionUtils.isEmpty(taxDeclarationEmployeeDTOS)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// 判断是否开启了分权
|
||||
Boolean openDevolution = getTaxAgentService(user).isOpenDevolution();
|
||||
// 是否是总管理员
|
||||
Boolean isChief = getTaxAgentService(user).isChief(employeeId);
|
||||
if (BooleanUtils.isFalse(openDevolution) || isChief) {
|
||||
return taxDeclarationEmployeeDTOS;
|
||||
}
|
||||
// 查询权限范围内的人员
|
||||
List<TaxAgentEmployeeDTO> taxAgentEmployeeDTOS = getTaxAgentService(user).listTaxAgentAndEmployee(employeeId);
|
||||
Set<String> simpleEmployeeKeySet = SalaryEntityUtil.properties(taxAgentEmployeeDTOS, taxAgentEmployeeDTO -> taxAgentEmployeeDTO.getEmployeeId() + "-" + taxAgentEmployeeDTO.getTaxAgentId());
|
||||
// 查询权限范围内的外部人员
|
||||
// List<ExtEmployeePO> extEmployeePOS = extEmployeeService.listCanUseByEmployeeId(employeeId, tenantKey);
|
||||
// Set<String> extEmployeeKeySet = SalaryEntityUtil.properties(extEmployeePOS, extEmployeePO -> extEmployeePO.getId() + "-" + extEmployeePO.getTaxAgentId());
|
||||
// 根据权限范围过滤
|
||||
return taxDeclarationEmployeeDTOS.stream().filter(taxDeclarationEmployeeDTO -> {
|
||||
if (taxDeclarationEmployeeDTO.getEmployeeType() == null || Objects.equals(taxDeclarationEmployeeDTO.getEmployeeType(), EmployeeTypeEnum.ORGANIZATION.getValue())
|
||||
&& simpleEmployeeKeySet.contains(taxDeclarationEmployeeDTO.getEmployeeId() + "-" + taxDeclarationPO.getTaxAgentId())) {
|
||||
return true;
|
||||
}
|
||||
// if (Objects.equals(taxDeclarationEmployeeDTO.getEmployeeType(), EmployeeTypeEnum.EXT_EMPLOYEE.getValue())
|
||||
// && extEmployeeKeySet.contains(taxDeclarationEmployeeDTO.getEmployeeId() + "-" + taxDeclarationPO.getTaxAgentId())) {
|
||||
// return true;
|
||||
// }
|
||||
return false;
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PageInfo<TaxDeclarationWageListDTO> listDtoPageByParam4Wage(TaxDeclarationDetailListQueryParam queryParam) {
|
||||
|
|
@ -254,4 +302,102 @@ public class TaxDeclarationDetailServiceImpl extends Service implements TaxDecla
|
|||
public void deleteByTaxDeclarationIds(Collection<Long> taxDeclarationIds) {
|
||||
getTaxDeclarationDetailMapper().deleteByTaxDeclarationIds(taxDeclarationIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> getTaxDeclarationDetailForm(TaxDeclarationDetailFormQueryParam param) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
if (param.getTaxDeclarationId() == null || param.getEmployeeId() == null) {
|
||||
return resultMap;
|
||||
}
|
||||
// 查询个税申报主表
|
||||
TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(param.getTaxDeclarationId());
|
||||
if (taxDeclarationPO == null) {
|
||||
return resultMap;
|
||||
}
|
||||
List<TaxDeclarationDetailPO> taxDeclarationDetailPOS = listByTaxDeclarationIdAndEmployeeIds(param.getTaxDeclarationId(), Collections.singletonList(param.getEmployeeId()));
|
||||
if (CollectionUtils.isEmpty(taxDeclarationDetailPOS)) {
|
||||
return resultMap;
|
||||
}
|
||||
Integer employeeType = taxDeclarationDetailPOS.stream().map(TaxDeclarationDetailPO::getEmployeeType).findFirst().orElse(0);
|
||||
List<TaxDeclarationEmployeeDTO> taxDeclarationEmployeeDTOS = Collections.singletonList(TaxDeclarationEmployeeDTO.builder().employeeType(employeeType).employeeId(param.getEmployeeId()).build());
|
||||
List<DataCollectionEmployee> simpleEmployees = getSalaryEmployeeService(user).getEmployeeByIds(Collections.singletonList(param.getEmployeeId()));
|
||||
// 正常工资薪金所得
|
||||
if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.WAGES_AND_SALARIES.getValue())) {
|
||||
List<TaxDeclarationWageListDTO> taxDeclarationWageListDTOS = TaxDeclarationDetailBO.convert2ListDTO4Wage(taxDeclarationDetailPOS, taxDeclarationEmployeeDTOS, simpleEmployees);
|
||||
PageInfo<TaxDeclarationWageListDTO> pageInfo = new PageInfo<>(TaxDeclarationWageListDTO.class);
|
||||
List<Column> columns = pageInfo.getColumns();
|
||||
resultMap.put("column", columns);
|
||||
if (CollectionUtils.isNotEmpty(taxDeclarationWageListDTOS)) {
|
||||
resultMap.put("data", taxDeclarationWageListDTOS.get(0));
|
||||
}
|
||||
}
|
||||
// 劳务报酬所得
|
||||
if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.REMUNERATION_FOR_LABOR.getValue())) {
|
||||
List<TaxDeclarationLaborListDTO> taxDeclarationLaborListDTOS = listDto4Labor(param.getTaxDeclarationId(), taxDeclarationEmployeeDTOS);
|
||||
PageInfo<TaxDeclarationLaborListDTO> pageInfo = new PageInfo<>(TaxDeclarationLaborListDTO.class);
|
||||
List<Column> columns = pageInfo.getColumns();
|
||||
resultMap.put("column", columns);
|
||||
if (CollectionUtils.isNotEmpty(taxDeclarationLaborListDTOS)) {
|
||||
resultMap.put("data", taxDeclarationLaborListDTOS.get(0));
|
||||
}
|
||||
}
|
||||
|
||||
// 全年一次性奖金收入
|
||||
if (Objects.equals(taxDeclarationPO.getIncomeCategory(), IncomeCategoryEnum.ONETIME_ANNUAL_BONUS.getValue())) {
|
||||
List<TaxDeclarationAnnualListDTO> taxDeclarationLaborListDTOS = listDto4Annual(param.getTaxDeclarationId(), taxDeclarationEmployeeDTOS);
|
||||
PageInfo<TaxDeclarationAnnualListDTO> pageInfo = new PageInfo<>(TaxDeclarationAnnualListDTO.class);
|
||||
List<Column> columns = pageInfo.getColumns();
|
||||
resultMap.put("column", columns);
|
||||
if (CollectionUtils.isNotEmpty(taxDeclarationLaborListDTOS)) {
|
||||
resultMap.put("data", taxDeclarationLaborListDTOS.get(0));
|
||||
}
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void editTaxDeclarationDetailData(TaxDeclarationDetailFormEditParam param) {
|
||||
if (param.getTaxDeclarationId() == null || param.getEmployeeId() == null || param.getValueMap() == null || param.getValueMap().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 查询个税申报主表
|
||||
TaxDeclarationPO taxDeclarationPO = getTaxDeclarationService(user).getById(param.getTaxDeclarationId());
|
||||
if (taxDeclarationPO == null) {
|
||||
throw new SalaryRunTimeException("个税申报表不存在,请刷新页面后重试");
|
||||
}
|
||||
List<TaxDeclarationDetailPO> taxDeclarationDetailPOS = getTaxDeclarationDetailMapper().listByTaxDeclarationIdAndEmployeeIds(param.getTaxDeclarationId(), Collections.singletonList(param.getEmployeeId()));
|
||||
Integer employeeType = taxDeclarationDetailPOS.stream().map(TaxDeclarationDetailPO::getEmployeeType).distinct().collect(Collectors.toList()).get(0);
|
||||
|
||||
// 插入数据
|
||||
List<TaxDeclarationDetailPO> needInsertList = Lists.newArrayListWithExpectedSize(param.getValueMap().size());
|
||||
param.getValueMap().forEach((fieldCode, fieldValue) -> {
|
||||
TaxDeclarationDetailPO taxDeclarationDetailPO = TaxDeclarationDetailPO.builder()
|
||||
.id(IdGenerator.generate())
|
||||
.taxDeclarationId(param.getTaxDeclarationId())
|
||||
.employeeType(employeeType)
|
||||
.employeeId(param.getEmployeeId())
|
||||
.fieldCode(fieldCode)
|
||||
.fieldValue(Utils.null2String(fieldValue))
|
||||
.creator(Long.valueOf(user.getUID()))
|
||||
.createTime(new Date())
|
||||
.updateTime(new Date())
|
||||
.deleteType(NumberUtils.INTEGER_ZERO)
|
||||
.tenantKey(SalaryDefaultTenantConstant.DEFAULT_TENANT_KEY)
|
||||
.build();
|
||||
needInsertList.add(taxDeclarationDetailPO);
|
||||
});
|
||||
if (CollectionUtils.isNotEmpty(needInsertList)) {
|
||||
// 先删除原有数据
|
||||
deleteByTaxDeclarationIdAndEmployeeId(param.getTaxDeclarationId(), param.getEmployeeId());
|
||||
batchSave(needInsertList);
|
||||
}
|
||||
}
|
||||
|
||||
private void deleteByTaxDeclarationIdAndEmployeeId(Long taxDeclarationId, Long employeeId) {
|
||||
if (taxDeclarationId == null || employeeId == null) {
|
||||
return;
|
||||
}
|
||||
getTaxDeclarationDetailMapper().deleteByTaxDeclarationIdAndEmployeeId(taxDeclarationId, employeeId);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,9 +4,7 @@ import com.engine.common.util.ServiceUtil;
|
|||
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationFormDTO;
|
||||
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationInfoDTO;
|
||||
import com.engine.salary.entity.taxdeclaration.dto.TaxDeclarationListDTO;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationListQueryParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationSaveParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.*;
|
||||
import com.engine.salary.service.TaxDeclarationExcelService;
|
||||
import com.engine.salary.service.TaxDeclarationService;
|
||||
import com.engine.salary.service.impl.TaxDeclarationExcelServiceImpl;
|
||||
|
|
@ -32,6 +30,7 @@ import javax.ws.rs.core.StreamingOutput;
|
|||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@Slf4j
|
||||
|
|
@ -109,6 +108,25 @@ public class TaxDeclarationController {
|
|||
return new ResponseResult<TaxDeclarationDetailListQueryParam, PageInfo>(user).run(getTaxDeclarationDetailWrapper(user)::listPage, param);
|
||||
}
|
||||
|
||||
//个税申报表 表单数据
|
||||
@POST
|
||||
@Path("/detail/getFormData")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public String getTaxDeclarationDetailFormData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclarationDetailFormQueryParam param) {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
param.setTaxDeclarationId(Long.parseLong(param.getTaxDeclarationIdStr()));
|
||||
return new ResponseResult<TaxDeclarationDetailFormQueryParam, Map<String, Object>>(user).run(getTaxDeclarationDetailWrapper(user)::getTaxDeclarationDetailFormData, param);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/detail/editFormData")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public String editTaxDeclarationDetailData(@Context HttpServletRequest request, @Context HttpServletResponse response, @RequestBody TaxDeclarationDetailFormEditParam param) {
|
||||
User user = HrmUserVarify.getUser(request, response);
|
||||
param.setTaxDeclarationId(Long.parseLong(param.getTaxDeclarationIdStr()));
|
||||
return new ResponseResult<TaxDeclarationDetailFormEditParam, String>(user).run(getTaxDeclarationDetailWrapper(user)::editTaxDeclarationDetailData, param);
|
||||
}
|
||||
|
||||
//个税申报表相关信息
|
||||
@GET
|
||||
@Path("/export")
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ package com.engine.salary.wrapper;
|
|||
|
||||
import com.engine.common.util.ServiceUtil;
|
||||
import com.engine.core.impl.Service;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormEditParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailFormQueryParam;
|
||||
import com.engine.salary.entity.taxdeclaration.param.TaxDeclarationDetailListQueryParam;
|
||||
import com.engine.salary.entity.taxdeclaration.po.TaxDeclarationPO;
|
||||
import com.engine.salary.enums.salarysob.IncomeCategoryEnum;
|
||||
|
|
@ -13,6 +15,7 @@ import com.engine.salary.util.page.PageInfo;
|
|||
import lombok.extern.slf4j.Slf4j;
|
||||
import weaver.hrm.User;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
|
|
@ -62,4 +65,12 @@ public class TaxDeclarationDetailWrapper extends Service {
|
|||
|
||||
return new PageInfo();
|
||||
}
|
||||
|
||||
public Map<String, Object> getTaxDeclarationDetailFormData(TaxDeclarationDetailFormQueryParam param) {
|
||||
return getTaxDeclarationDetailService(user).getTaxDeclarationDetailForm(param);
|
||||
}
|
||||
|
||||
public void editTaxDeclarationDetailData(TaxDeclarationDetailFormEditParam param) {
|
||||
getTaxDeclarationDetailService(user).editTaxDeclarationDetailData(param);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue