zhyManagement/src/main/java/com/management/controller/ReimbursementController.java

653 lines
28 KiB
Java
Raw Normal View History

2025-06-11 13:58:36 +08:00
package com.management.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.management.constant.ERPURLConstant;
import com.management.constant.URLConstant;
import com.management.entity.Filter;
import com.management.utils.CrmRequestUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
@RestController
@RequestMapping("/api/reimbursement")
@Slf4j
public class ReimbursementController {
private RestTemplate restTemplate = new RestTemplate();
public static void main(String[] args) {
new ReimbursementController().syncReimbursement();
//new ReimbursementController().syncPublicExpenses();
}
/**
* 报销查询同步 todo 需要完善
*
* @return void
* @Author weiloong_zhang
*/
@PostMapping("/sync/reimburse")
public void syncReimbursement() {
CrmRequestUtil crmRequestUtil = new CrmRequestUtil();
log.info("开始同步银行信息");
//获取当前时间
LocalDateTime now = LocalDateTime.now();
log.info("当前时间:{}", now);
//获取两天前的时间
LocalDateTime twoDaysAgo = now.minusDays(1);
//将时间转换样式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String twoDaysAgoStr = twoDaysAgo.format(formatter);
String nowStr = now.format(formatter);
//开始查询f费用报销单
Map data = new HashMap<>();
data.put("startTime", twoDaysAgoStr);
data.put("endTime", nowStr);
Map expensesMap = new HashMap<>();
expensesMap.put("data", data);
expensesMap.put("pageNo", 1);
expensesMap.put("pageSize", 1999);
//开始获取金蝶token
String accessToken = new KDTokenController().getKDAccessTokenTest();
if (accessToken == null || accessToken.equals("")) {
log.info("金蝶token为空或不存在");
return;
}
//开始封装请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("accessToken", accessToken);
HttpEntity expensesEntity = new HttpEntity(expensesMap, headers);
String expensesUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/em/er_dailyreimbursebill/dailyreimbursebillQuery";
JSONObject expensesRes = new JSONObject();
try {
expensesRes = restTemplate.postForObject(expensesUrl, expensesEntity, JSONObject.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(expensesRes);
//开始判断是否存在符合条件的数据
if (!"0".equals(expensesRes.getString("errorCode")) || expensesRes.getJSONObject("data").getJSONArray("rows").isEmpty()) {
log.info("查询失败或者没有符合条件的单据");
return;
}
log.info("数据存在,将继续向下执行");
for (Object expensesObj : expensesRes.getJSONObject("data").getJSONArray("rows")) {
JSONObject expensesData = JSON.parseObject(JSON.toJSONString(expensesObj));
System.out.println("当前正在处理的报销单数据为:" + expensesData);
//开始截取关键数据
//ERPID
String expensesId = expensesData.getString("erpid");
//String expensesId = "6467554454212545";
String expensesCode = expensesData.getString("billno");//编码
String modifyTime = expensesData.getString("modifytime");//最后修改时间
JSONObject isLogRes = new JSONObject();
try {
isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_fybx&log_type=FY&dataId=" + expensesId + "&mark=" + modifyTime, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!isLogRes.getJSONArray("data").isEmpty()) {
log.info("当前报销单存在日志,将不再向下执行");
continue;
}
log.info("不存在日志,继续向下执行");
//开始封装请求
Map expensesMapReq = new HashMap<>();
expensesMapReq.put("erp_document_number__c", expensesCode);//单据编号
expensesMapReq.put("erp_id__c", expensesId);//单据ERPID
expensesMapReq.put("record_type", "record_kYs9j__c");//业务类型
expensesMapReq.put("dataObjectApiName", "ExpenseClaimFormObj");//对象名称
//开始获取时间数据并转换为字符串
String bizDate = expensesData.getString("bizdate");
// 定义时间格式
DateTimeFormatter formatterB = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析字符串为 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.parse(bizDate, formatterB);
// 转换为时间戳(毫秒)
long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
expensesMapReq.put("application_date", timestamp);//申请日期
//获取负责人信息
String ownerCode = "ID-000016";//todo 负责人编码
JSONObject getOwner = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "field_T1xid__c", Arrays.asList(ownerCode))
), "PersonnelObj");
JSONObject ownerRes = new JSONObject();
try {
ownerRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, getOwner, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(ownerRes.getString("errorDescription")) || ownerRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("负责人不存在或者请求失败");
continue;
}
System.out.println("负责人数据为:" + ownerRes);
//开始截取负责人user_id
String ownerUserId = ownerRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("user_id");
expensesMapReq.put("owner", Arrays.asList(ownerUserId));
expensesMapReq.put("applicant", Arrays.asList(ownerUserId));
//todo 费用承担公司
String costCompany = expensesData.getString("costcompany_number");
//事由
String description = expensesData.getString("description") != null ? expensesData.getString("description") : "";
expensesMapReq.put("reason_for_event__c", description);//事由
//开始判断CRM里面是否已经存在该单据
Boolean isExist = false;
JSONObject getExpenses = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "erp_id__c", Arrays.asList(expensesId)),
new Filter("EQ", "erp_document_number__c", Arrays.asList(expensesCode))
), "ExpenseClaimFormObj");
JSONObject expensesCRMRes = new JSONObject();
try {
expensesCRMRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getExpenses, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if ("success".equals(expensesCRMRes.getString("errorDescription")) && !expensesCRMRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("该报销单已经存在");
isExist = true;
expensesMapReq.put("_id", expensesCRMRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("_id"));
}
//开始封装明细数据
List expensesDetails = new ArrayList<>();
for (Object expensesDetailObj : expensesData.getJSONArray("expenseentryentity")) {
JSONObject expensesDetailData = JSON.parseObject(JSON.toJSONString(expensesDetailObj));
System.out.println("当前正在处理的报销单明细数据为:" + expensesDetailData);
//开始封装明细数据
Map expensesDetailMap = new HashMap<>();
expensesDetailMap.put("record_type", "default__c");
String costProject = expensesDetailData.getString("std_project_number");
//项目号
if (costProject.contains("SJ")) {
//商机编号
JSONObject getBusiness = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "opportunity_id__c", Arrays.asList(costProject))
), "NewOpportunityObj");
JSONObject businessRes = new JSONObject();
try {
businessRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getBusiness, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if ("success".equals(businessRes.getString("errorDescription")) && !businessRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
JSONObject businessData = businessRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0);
expensesDetailMap.put("", businessData.getString("_id"));
}
} else if (costProject.contains("XM")) {
//项目编号
JSONObject getProject = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "project_no__c", Arrays.asList(costProject))
), "ProjectObj");
JSONObject projectRes = new JSONObject();
try {
projectRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getProject, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if ("success".equals(projectRes.getString("errorDescription")) && !projectRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
JSONObject projectData = projectRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0);
expensesDetailMap.put("project_id", projectData.getString("_id"));
}
}
//todo 成本中心
String costCenter = expensesDetailData.getString("expensesDetailData") != null ? expensesDetailData.getString("expensesDetailData") : "";
expensesDetailMap.put("amount", expensesDetailData.getBigDecimal("expenseamount"));//金额(价税合计)
expensesDetailMap.put("erp_row_id__c", expensesDetailData.getString("entryId"));//ERP行ID
//开始根据ERP行ID判断是否已经集成过该单据
JSONObject getExpensesDetail = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "_id", Arrays.asList(expensesDetailData.getString("entryId")))
), "ExpenseClaimFormDetailObj");
JSONObject expensesDetailCRMRes = new JSONObject();
try {
expensesDetailCRMRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getExpensesDetail, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if ("success".equals(expensesDetailCRMRes.getString("errorDescription")) && !expensesDetailCRMRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("该报销单明细已经存在");
expensesDetailMap.put("_id", expensesDetailCRMRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("_id"));
}
expensesDetails.add(expensesDetailMap);
}
Map detailsMap = new HashMap<>();
detailsMap.put("ExpenseClaimFormDetailObj", expensesDetails);
JSONObject expensesReq = crmRequestUtil.crmWithDetail(expensesMapReq, detailsMap);
System.out.println("费用报销请求结果为:" + expensesReq);
//开始封装日志
Map logMap = new HashMap<>();
logMap.put("log_id", UUID.randomUUID().toString().replace("-", ""));
logMap.put("log_type", "FY");
logMap.put("data_name", expensesCode);
logMap.put("data_id", expensesId);
logMap.put("mark", modifyTime);
logMap.put("send_body", JSON.toJSONString(expensesReq));
logMap.put("tableName", "send_log_fybx");
JSONObject expensesCRMReq = new JSONObject();
if (isExist) {
//已存在该单据,将进行更新
logMap.put("syn_type", "1");
try {
expensesCRMReq = restTemplate.postForObject(URLConstant.UPDATE_CRM_CUSTOMIZE, expensesReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("费用报销更新请求结果为:" + expensesCRMReq);
} else {
logMap.put("syn_type", "0");
try {
expensesCRMReq = restTemplate.postForObject(URLConstant.CREATE_CRM_CUSTOMER_MAIN, expensesReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("费用报销创建请求结果为:" + expensesCRMReq);
}
if ("success".equals(expensesCRMReq.getString("errorDescription"))) {
logMap.put("log_status", "0");
logMap.put("res_body", "同步成功");
} else {
logMap.put("log_status", "1");
logMap.put("res_body", "同步失败" + expensesCRMReq.getString("errorMessage"));
}
JSONObject logRes = new JSONObject();
try {
logRes = restTemplate.postForObject("http://localhost:18085/Log/insert/log_data", logMap, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("日志插入结果为:" + logRes);
}
}
/**
* 对公报销 todo 待完善
*
* @return void
* @Author weiloong_zhang
*/
@PostMapping
public void syncPublicExpenses() {
CrmRequestUtil crmRequestUtil = new CrmRequestUtil();
log.info("开始同步对公报销信息");
//获取当前时间
LocalDateTime now = LocalDateTime.now();
log.info("当前时间:{}", now);
//获取两天前的时间
LocalDateTime twoDaysAgo = now.minusDays(5);
//将时间转换样式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String twoDaysAgoStr = twoDaysAgo.format(formatter);
String nowStr = now.format(formatter);
//开始查询f费用报销单
Map data = new HashMap<>();
data.put("startTime", twoDaysAgoStr);
data.put("endTime", nowStr);
Map expensesMap = new HashMap<>();
expensesMap.put("data", data);
expensesMap.put("pageNo", 1);
expensesMap.put("pageSize", 1999);
//开始获取金蝶token
String accessToken = new KDTokenController().getKDAccessTokenTest();
if (accessToken == null || accessToken.equals("")) {
log.info("金蝶token为空或不存在");
return;
}
//开始封装请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("accessToken", accessToken);
HttpEntity expensesEntity = new HttpEntity(expensesMap, headers);
String expensesUrl = ERPURLConstant.ERP_URL + "/ierp/kapi/v2/f9w5/em/er_publicreimbursebill/publicreimbursebillQuery";
JSONObject expensesRes = new JSONObject();
try {
expensesRes = restTemplate.postForObject(expensesUrl, expensesEntity, JSONObject.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(expensesRes);
//判断是否成功或者数据是否存在
if (!"0".equals(expensesRes.getString("errorCode")) || expensesRes.getJSONObject("data").getJSONArray("rows").isEmpty()) {
log.info("查询失败或者没有符合条件的单据");
return;
}
for (Object expensesObj : expensesRes.getJSONObject("data").getJSONArray("rows")) {
JSONObject expensesData = JSON.parseObject(JSON.toJSONString(expensesObj));
System.out.println("当前正在处理数据为:" + expensesData);
//开始截取关键数据
//ERPID
String erpId = expensesData.getString("erpid");
//单据名称
String erpNo = expensesData.getString("billno");
//最后修改时间
String modifyTime = expensesData.getString("modifytime");
//开始判断是否已经集成过该单据
JSONObject isLogRes = new JSONObject();
try {
isLogRes = restTemplate.getForObject("http://localhost:18085/Log/query/log_data?table=send_log_fybx&log_type=FYDG&dataId=" + erpId + "&mark=" + modifyTime, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!isLogRes.getJSONArray("data").isEmpty()) {
log.info("当前数据已经执行过了,将不再向下执行");
continue;
}
log.info("日志不存在,将继续向下执行");
//开始封装请求参数
Map expensesMainReq = new HashMap();
expensesMainReq.put("erp_document_number__c", erpNo);//ERP单据编码
expensesMainReq.put("erp_id__c", erpId);//ERP单据ID
expensesMainReq.put("record_type", "record_Lu2Cc__c");
expensesMainReq.put("dataObjectApiName", "ExpenseClaimFormObj");//对象名称
expensesMainReq.put("reason_for_event__c", expensesData.getString("description") != null ? expensesData.getString("description") : "");//事由
//开始获取时间数据并转换为字符串
String bizDate = expensesData.getString("bizdate");
// 定义时间格式
DateTimeFormatter formatterB = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析字符串为 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.parse(bizDate, formatterB);
// 转换为时间戳(毫秒)
long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
expensesMainReq.put("application_date", timestamp);//申请日期
//获取负责人信息
String ownerCode = "ID-000016";//todo 负责人编码
JSONObject getOwner = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "field_T1xid__c", Arrays.asList(ownerCode))
), "PersonnelObj");
JSONObject ownerRes = new JSONObject();
try {
ownerRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, getOwner, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if (!"success".equals(ownerRes.getString("errorDescription")) || ownerRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("负责人不存在或者请求失败");
continue;
}
System.out.println("负责人数据为:" + ownerRes);
//开始截取负责人user_id
String ownerUserId = ownerRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("user_id");
expensesMainReq.put("owner", Arrays.asList(ownerUserId));
expensesMainReq.put("applicant", Arrays.asList(ownerUserId));
//开始判断CRM里面是否已经存在该单据
Boolean isExist = false;
JSONObject getExpenses = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "erp_id__c", Arrays.asList(erpId)),
new Filter("EQ", "erp_document_number__c", Arrays.asList(erpNo))
), "ExpenseClaimFormObj");
JSONObject expensesCRMRes = new JSONObject();
try {
expensesCRMRes = restTemplate.postForObject(URLConstant.GET_CRM_LIST_URL, getExpenses, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if ("success".equals(expensesCRMRes.getString("errorDescription")) && !expensesCRMRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("该报销单已经存在");
isExist = true;
expensesMainReq.put("_id", expensesCRMRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("_id"));
}
List expensesDetailReq = new ArrayList();
//开始封装明细数据
for (Object expenseDetailObj : expensesData.getJSONArray("expenseentryentity")) {
JSONObject expenseDetailData = JSON.parseObject(JSON.toJSONString(expenseDetailObj));
System.out.println("当前正在处理明细数据为:" + expenseDetailData);
//开始封装明细数据
Map expensesDetail = new HashMap();
expensesDetail.put("record_type", "record_Eex1M__c");//对公报销
String projectCode = expenseDetailData.getString("std_project_number") != null ? expenseDetailData.getString("std_project_number") : "";
//开始判断项目来源
if (projectCode.contains("SJ")) {
//商机编号
JSONObject getBusiness = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "opportunity_id__c", Arrays.asList(projectCode))
), "NewOpportunityObj");
JSONObject businessRes = new JSONObject();
try {
businessRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getBusiness, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if ("success".equals(businessRes.getString("errorDescription")) && !businessRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
JSONObject businessData = businessRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0);
expensesDetail.put("", businessData.getString("_id"));
}
} else if (projectCode.contains("XM")) {
//项目编号
JSONObject getProject = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "project_no__c", Arrays.asList(projectCode))
), "ProjectObj");
JSONObject projectRes = new JSONObject();
try {
projectRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getProject, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if ("success".equals(projectRes.getString("errorDescription")) && !projectRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
JSONObject projectData = projectRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0);
expensesDetail.put("project_id", projectData.getString("_id"));
}
}
expensesDetail.put("amount", expenseDetailData.getBigDecimal("expenseamount"));//金额(价税合计)
expensesDetail.put("erp_row_id__c", expenseDetailData.getString("entryId"));//ERP行ID
//开始根据ERP行ID判断是否已经集成过该单据
JSONObject getExpensesDetail = crmRequestUtil.getCRMList(Arrays.asList(
new Filter("EQ", "_id", Arrays.asList(expenseDetailData.getString("entryId")))
), "ExpenseClaimFormDetailObj");
JSONObject expensesDetailCRMRes = new JSONObject();
try {
expensesDetailCRMRes = restTemplate.postForObject(URLConstant.GET_CUSTOMIZE_LIST_URL, getExpensesDetail, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
if ("success".equals(expensesDetailCRMRes.getString("errorDescription")) && !expensesDetailCRMRes.getJSONObject("data").getJSONArray("dataList").isEmpty()) {
log.info("该报销单明细已经存在");
expensesDetail.put("_id", expensesDetailCRMRes.getJSONObject("data").getJSONArray("dataList").getJSONObject(0).getString("_id"));
}
expensesDetailReq.add(expensesDetail);
}
Map detailsMap = new HashMap<>();
detailsMap.put("ExpenseClaimFormDetailObj", expensesDetailReq);
JSONObject expensesReq = crmRequestUtil.crmWithDetail(expensesMainReq, detailsMap);
System.out.println("费用报销请求结果为:" + expensesReq);
//开始封装日志
Map logMap = new HashMap<>();
logMap.put("log_id", UUID.randomUUID().toString().replace("-", ""));
logMap.put("log_type", "FYDG");
logMap.put("data_name", erpNo);
logMap.put("data_id", erpId);
logMap.put("mark", modifyTime);
logMap.put("send_body", JSON.toJSONString(expensesReq));
logMap.put("tableName", "send_log_fybx");
JSONObject expensesCRMReq = new JSONObject();
if (isExist) {
//已存在该单据,将进行更新
logMap.put("syn_type", "1");
try {
expensesCRMReq = restTemplate.postForObject(URLConstant.UPDATE_CRM_CUSTOMIZE, expensesReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("费用报销更新请求结果为:" + expensesCRMReq);
} else {
logMap.put("syn_type", "0");
try {
expensesCRMReq = restTemplate.postForObject(URLConstant.CREATE_CRM_CUSTOMER_MAIN, expensesReq, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("费用报销创建请求结果为:" + expensesCRMReq);
}
if ("success".equals(expensesCRMReq.getString("errorDescription"))) {
logMap.put("log_status", "0");
logMap.put("res_body", "同步成功");
} else {
logMap.put("log_status", "1");
logMap.put("res_body", "同步失败" + expensesCRMReq.getString("errorMessage"));
}
JSONObject logRes = new JSONObject();
try {
logRes = restTemplate.postForObject("http://localhost:18085/Log/insert/log_data", logMap, JSONObject.class);
} catch (RestClientException e) {
e.printStackTrace();
}
System.out.println("日志插入结果为:" + logRes);
}
}
}