Commit 9584ba55 authored by Vu Duy Anh's avatar Vu Duy Anh

anhvd commit for merge

parents d04f3bdb 4aa07a6e
package com.viettel.campaign.mapper;
import com.viettel.campaign.model.CustomerList;
import com.viettel.campaign.web.dto.CustomerListDTO;
public class CustomerListMapper extends BaseMapper<CustomerList, CustomerListDTO> {
@Override
public CustomerListDTO toDtoBean(CustomerList customerList) {
CustomerListDTO obj = new CustomerListDTO();
if (customerList != null) {
obj.setCreateAt(customerList.getCreateAt());
obj.setCreateBy(customerList.getCreateBy());
obj.setCustomerListCode(customerList.getCustomerListCode());
obj.setCustomerListId(customerList.getCustomerListId());
obj.setCustomerSiteId(customerList.getCustomerSiteId());
obj.setCustomerListName(customerList.getCustomerListName());
obj.setDeptCreate(customerList.getDeptCreate());
obj.setSource(customerList.getSource());
obj.setStatus(customerList.getStatus());
obj.setUpdateAt(customerList.getUpdateAt());
obj.setUpdateBy(customerList.getUpdateBy());
}
return obj;
}
@Override
public CustomerList toPersistenceBean(CustomerListDTO dtoBean) {
CustomerList obj = new CustomerList();
if (dtoBean != null) {
obj.setCreateAt(dtoBean.getCreateAt());
obj.setCreateBy(dtoBean.getCreateBy());
obj.setCustomerListCode(dtoBean.getCustomerListCode());
obj.setCustomerListId(dtoBean.getCustomerListId());
obj.setCustomerListName(dtoBean.getCustomerListName());
obj.setCustomerSiteId(dtoBean.getCustomerSiteId());
obj.setDeptCreate(dtoBean.getDeptCreate());
obj.setSource(dtoBean.getSource());
obj.setStatus(dtoBean.getStatus());
obj.setUpdateAt(dtoBean.getUpdateAt());
obj.setUpdateBy(dtoBean.getUpdateBy());
}
return obj;
}
}
package com.viettel.campaign.repository;
import com.viettel.campaign.model.CustomerList;
import com.viettel.campaign.web.dto.ResultDTO;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface CustomerListRepository extends JpaRepository<CustomerList, Long> {
CustomerList findCustomerListByCustomerListId(long customerListId);
@Query("delete from CustomerList c where c.customerListId in :ids")
ResultDTO deleteIds(@Param("ids") List<Long> ids);
}
...@@ -17,4 +17,5 @@ public interface CustomerRepository extends JpaRepository<Customer, Long> { ...@@ -17,4 +17,5 @@ public interface CustomerRepository extends JpaRepository<Customer, Long> {
@Query("SELECT COUNT(0) FROM Customer t WHERE t.mobileNumber = ?1 and t.siteId = ?2 and t.status = 1 ") @Query("SELECT COUNT(0) FROM Customer t WHERE t.mobileNumber = ?1 and t.siteId = ?2 and t.status = 1 ")
Long findByMobileNumberAndSiteId(String mobileNumber, Long siteId); Long findByMobileNumberAndSiteId(String mobileNumber, Long siteId);
} }
...@@ -5,6 +5,7 @@ import com.viettel.campaign.utils.*; ...@@ -5,6 +5,7 @@ import com.viettel.campaign.utils.*;
import com.viettel.campaign.web.dto.CampaignDTO; import com.viettel.campaign.web.dto.CampaignDTO;
import com.viettel.campaign.web.dto.ResultDTO; import com.viettel.campaign.web.dto.ResultDTO;
import com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO; import com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO;
import org.bouncycastle.util.test.FixedSecureRandom;
import org.hibernate.SQLQuery; import org.hibernate.SQLQuery;
import org.hibernate.Session; import org.hibernate.Session;
import org.hibernate.SessionFactory; import org.hibernate.SessionFactory;
...@@ -70,20 +71,20 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom { ...@@ -70,20 +71,20 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
if (!DataUtil.isNullOrEmpty(requestDto.getCampaignName())) { if (!DataUtil.isNullOrEmpty(requestDto.getCampaignName())) {
sqlStr.append(" AND UPPER(a.CAMPAIGN_NAME) LIKE :p_name"); sqlStr.append(" AND UPPER(a.CAMPAIGN_NAME) LIKE :p_name");
} }
if (requestDto.getStatus() != null) { if (requestDto.getStatus() != null && requestDto.getStatus() > 0) {
sqlStr.append(" AND a.STATUS = :p_status"); sqlStr.append(" AND a.STATUS = :p_status");
} }
if (requestDto.getFromDateFr() != null && DateTimeUtil.isValid(requestDto.getFromDateFr().getTime())) { if (!DataUtil.isNullOrEmpty(requestDto.getFromDateFr())) {
sqlStr.append(" AND a.START_TIME >= :p_frDateFr"); sqlStr.append(" AND TO_DATE(a.START_TIME, 'DD/MM/YYYY') >= :p_frDateFr");
} }
if (requestDto.getFromDateTo() != null && DateTimeUtil.isValid(requestDto.getFromDateTo().getTime())) { if (!DataUtil.isNullOrEmpty(requestDto.getFromDateTo())) {
sqlStr.append(" AND a.START_TIME <= :p_frDateTo"); sqlStr.append(" AND TO_DATE(a.START_TIME, 'DD/MM/YYYY') <= :p_frDateTo");
} }
if (requestDto.getToDateFr() != null && DateTimeUtil.isValid(requestDto.getToDateFr().getTime())) { if (!DataUtil.isNullOrEmpty(requestDto.getToDateFr())) {
sqlStr.append(" AND a.END_TIME >= :p_toDateFr"); sqlStr.append(" AND TO_DATE(a.END_TIME, 'DD/MM/YYYY') >= :p_toDateFr");
} }
if (requestDto.getToDateTo() != null && DateTimeUtil.isValid(requestDto.getToDateTo().getTime())) { if (!DataUtil.isNullOrEmpty(requestDto.getToDateTo())) {
sqlStr.append(" AND a.END_TIME <= :p_toDateTo"); sqlStr.append(" AND TO_DATE(a.END_TIME, 'DD/MM/YYYY') <= :p_toDateTo");
} }
if (!DataUtil.isNullOrZero(requestDto.getNumOfCusFr())) { if (!DataUtil.isNullOrZero(requestDto.getNumOfCusFr())) {
sqlStr.append(" AND a.CUSTOMER_NUMBER >= :p_cusNumFr"); sqlStr.append(" AND a.CUSTOMER_NUMBER >= :p_cusNumFr");
...@@ -94,11 +95,18 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom { ...@@ -94,11 +95,18 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
if (requestDto.getType() != null) { if (requestDto.getType() != null) {
sqlStr.append(" AND a.CAMPAIGN_TYPE = :p_type"); sqlStr.append(" AND a.CAMPAIGN_TYPE = :p_type");
} }
if (requestDto.getChanel() != null) { if (requestDto.getChanel() != null && requestDto.getChanel() > 0) {
sqlStr.append(" AND a.CHANEL = :p_chanel"); sqlStr.append(" AND a.CHANEL = :p_chanel");
} }
if(!DataUtil.isNullOrZero(requestDto.getNumOfCusFr())) {
sqlStr.append(" AND a.CUSTOMER_NUMBER >= :p_cusNumFr");
}
if(!DataUtil.isNullOrZero(requestDto.getNumOfCusTo())) {
sqlStr.append(" AND a.CUSTOMER_NUMBER <= :p_cusNumTo");
}
sqlStr.append(" ORDER BY a.START_TIME DESC ");
// Query query = entityManager.createNativeQuery(sqlStr.toString(), Campaign.class);
SQLQuery query = session.createSQLQuery(sqlStr.toString()); SQLQuery query = session.createSQLQuery(sqlStr.toString());
if (!DataUtil.isNullOrEmpty(requestDto.getCampaignCode())) { if (!DataUtil.isNullOrEmpty(requestDto.getCampaignCode())) {
query.setParameter("p_code", "%" + query.setParameter("p_code", "%" +
...@@ -118,42 +126,42 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom { ...@@ -118,42 +126,42 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
+ "%"); + "%");
} }
if (requestDto.getStatus() != null) { if (requestDto.getStatus() != null && requestDto.getStatus() > 0) {
query.setParameter("p_status", requestDto.getStatus()); query.setParameter("p_status", requestDto.getStatus());
} }
if (requestDto.getFromDateFr() != null && DateTimeUtil.isValid(requestDto.getFromDateFr().getTime())) { if (!DataUtil.isNullOrEmpty(requestDto.getFromDateFr())) {
query.setParameter("p_frDateFr", requestDto.getFromDateFr()); query.setParameter("p_frDateFr", requestDto.getFromDateFr());
} }
if (requestDto.getFromDateTo() != null && DateTimeUtil.isValid(requestDto.getFromDateTo().getTime())) { if (!DataUtil.isNullOrEmpty(requestDto.getFromDateTo())) {
query.setParameter("p_frDateTo", requestDto.getFromDateTo()); query.setParameter("p_frDateTo", requestDto.getFromDateTo());
} }
if (requestDto.getToDateFr() != null && DateTimeUtil.isValid(requestDto.getToDateFr().getTime())) { if (!DataUtil.isNullOrEmpty(requestDto.getToDateFr())) {
query.setParameter("p_toDateFr", requestDto.getToDateFr()); query.setParameter("p_toDateFr", requestDto.getToDateFr());
} }
if (requestDto.getToDateTo() != null && DateTimeUtil.isValid(requestDto.getToDateTo().getTime())) { if (!DataUtil.isNullOrEmpty(requestDto.getToDateTo())) {
query.setParameter("p_toDateTo", requestDto.getToDateTo()); query.setParameter("p_toDateTo", requestDto.getToDateTo());
} }
if (requestDto.getType() != null) { if (requestDto.getType() != null) {
query.setParameter("p_type", requestDto.getType()); query.setParameter("p_type", requestDto.getType());
} }
if (requestDto.getChanel() != null) { if (requestDto.getChanel() != null && requestDto.getChanel() > 0) {
query.setParameter("p_chanel", requestDto.getChanel()); query.setParameter("p_chanel", requestDto.getChanel());
} }
if (!DataUtil.isNullOrZero(requestDto.getNumOfCusFr())) { if (!DataUtil.isNullOrZero(requestDto.getNumOfCusFr())) {
query.setParameter("p_cusNumFr", requestDto.getNumOfCusFr()); query.setParameter("p_cusNumFr", requestDto.getNumOfCusFr() == 0 ? null : requestDto.getNumOfCusFr());
} }
if (!DataUtil.isNullOrZero(requestDto.getNumOfCusTo())) { if (!DataUtil.isNullOrZero(requestDto.getNumOfCusTo())) {
query.setParameter("p_cusNumTo", requestDto.getNumOfCusTo()); query.setParameter("p_cusNumTo", requestDto.getNumOfCusTo() == 0 ? null : requestDto.getNumOfCusTo());
} }
query.addScalar("campaignId", new LongType()); query.addScalar("campaignId", new BigDecimalType());
query.addScalar("campaignCode", new StringType()); query.addScalar("campaignCode", new StringType());
query.addScalar("campaignName", new StringType()); query.addScalar("campaignName", new StringType());
query.addScalar("campaignType", new StringType()); query.addScalar("campaignType", new StringType());
query.addScalar("chanel", new ShortType()); query.addScalar("chanel", new ShortType());
query.addScalar("startTime", new DateType()); query.addScalar("startTime", new DateType());
query.addScalar("endTime", new DateType()); query.addScalar("endTime", new DateType());
query.addScalar("customerNumber", new LongType()); query.addScalar("customerNumber", new BigDecimalType());
query.addScalar("status", new ShortType()); query.addScalar("status", new ShortType());
query.addScalar("numOfJoinedCus", new LongType()); query.addScalar("numOfJoinedCus", new LongType());
query.addScalar("numOfNotJoinedCus", new LongType()); query.addScalar("numOfNotJoinedCus", new LongType());
...@@ -187,9 +195,13 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom { ...@@ -187,9 +195,13 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
private Pageable buildPageable(CampaignRequestDTO obj) { private Pageable buildPageable(CampaignRequestDTO obj) {
Pageable pageable = null; Pageable pageable = null;
String[] sorts = obj.getSort().split(","); if(DataUtil.isNullOrEmpty(obj.getSort())){
Sort sort = new Sort(Sort.Direction.fromString(sorts[1]), sorts[0]); pageable = new PageRequest(obj.getPage(), obj.getPageSize(), null);
pageable = new PageRequest(obj.getPage(), obj.getPageSize(), sort); }else {
String[] sorts = obj.getSort().split(",");
Sort sort = new Sort(Sort.Direction.fromString(sorts[1]), sorts[0]);
pageable = new PageRequest(obj.getPage(), obj.getPageSize(), sort);
}
return pageable; return pageable;
} }
} }
package com.viettel.campaign.service;
import com.viettel.campaign.web.dto.CustomerListDTO;
import com.viettel.campaign.web.dto.ResultDTO;
import java.util.List;
import java.util.Map;
public interface CustomerListService {
Map getCustomerList(int page, int pageSize, String sort);
ResultDTO createCustomerList(CustomerListDTO customerListDTO);
ResultDTO updateCustomerList(CustomerListDTO customerListDTO);
ResultDTO deleteCustomerList(CustomerListDTO customerListDTO);
ResultDTO deleteIds(List<Long> ids);
}
package com.viettel.campaign.service;
import com.viettel.campaign.mapper.CustomerListMapper;
import com.viettel.campaign.model.CustomerList;
import com.viettel.campaign.repository.CustomerListRepository;
import com.viettel.campaign.utils.Constants;
import com.viettel.campaign.web.dto.CustomerListDTO;
import com.viettel.campaign.web.dto.ResultDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import java.util.*;
@Service
public class CustomerListServiceImpl implements CustomerListService {
@Autowired
EntityManager entityManager;
@Autowired
CustomerListRepository customerListRepository;
@Override
public Map getCustomerList(int page, int pageSize, String sort) {
Map result = new HashMap();
List<CustomerList> list = new ArrayList<>();
Pageable pageable = PageRequest.of(page, pageSize, Sort.by(sort));
Page<CustomerList> pc = customerListRepository.findAll(pageable);
result.put("totalItem", pc.getTotalElements());
result.put("customerList", pc.iterator());
return result;
}
@Override
public ResultDTO createCustomerList(CustomerListDTO customerListDTO) {
ResultDTO resultDTO = new ResultDTO();
CustomerListMapper customerListMapper = new CustomerListMapper();
Date today = new Date();
CustomerList customerList = new CustomerList();
try {
if (customerListDTO != null) {
// insert
customerList = customerListMapper.toPersistenceBean(customerListDTO);
customerListRepository.save(customerList);
resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS);
resultDTO.setDescription(Constants.ApiErrorDesc.SUCCESS);
} else {
resultDTO.setErrorCode(Constants.ApiErrorCode.ERROR);
resultDTO.setDescription(Constants.ApiErrorDesc.ERROR);
}
} catch (Exception e) {
e.printStackTrace();
}
return resultDTO;
}
@Override
public ResultDTO updateCustomerList(CustomerListDTO customerListDTO) {
ResultDTO resultDTO = new ResultDTO();
CustomerListMapper customerListMapper = new CustomerListMapper();
Date today = new Date();
CustomerList customerList = customerListRepository.findCustomerListByCustomerListId(customerListDTO.getCustomerListId());
try {
if (customerListDTO != null) {
// update
customerList = customerListMapper.toPersistenceBean(customerListDTO);
customerList = customerListRepository.save(customerList);
resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS);
resultDTO.setDescription(Constants.ApiErrorDesc.SUCCESS);
} else {
resultDTO.setErrorCode(Constants.ApiErrorCode.ERROR);
resultDTO.setDescription(Constants.ApiErrorDesc.ERROR);
}
} catch (Exception e) {
e.printStackTrace();
}
return resultDTO;
}
@Override
public ResultDTO deleteCustomerList(CustomerListDTO customerListDTO) {
ResultDTO resultDTO = new ResultDTO();
CustomerListMapper customerListMapper = new CustomerListMapper();
Date today = new Date();
CustomerList customerList = new CustomerList();
try {
if (customerListDTO != null) {
// delete
customerListRepository.deleteById(customerListDTO.getCustomerListId());
resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS);
resultDTO.setDescription(Constants.ApiErrorDesc.SUCCESS);
} else {
resultDTO.setErrorCode(Constants.ApiErrorCode.ERROR);
resultDTO.setDescription(Constants.ApiErrorDesc.ERROR);
}
} catch (Exception e) {
e.printStackTrace();
}
return resultDTO;
}
@Override
public ResultDTO deleteIds(List<Long> ids) {
ResultDTO resultDTO = new ResultDTO();
try {
if (ids != null) {
customerListRepository.deleteIds(ids);
resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS);
resultDTO.setDescription(Constants.ApiErrorDesc.SUCCESS);
} else {
resultDTO.setErrorCode(Constants.ApiErrorCode.ERROR);
resultDTO.setDescription(Constants.ApiErrorDesc.ERROR);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
...@@ -14,11 +14,11 @@ public class CampaignDTO extends BaseDTO { ...@@ -14,11 +14,11 @@ public class CampaignDTO extends BaseDTO {
private BigDecimal companySiteId; private BigDecimal companySiteId;
private String campaignCode; private String campaignCode;
private String campaignName; private String campaignName;
private BigDecimal chanel; private Short chanel;
private String content; private String content;
private BigDecimal customerNumber; private BigDecimal customerNumber;
private String target; private String target;
private BigDecimal status; private Short status;
private Date startTime; private Date startTime;
private Date endTime; private Date endTime;
private Integer maxRecall; private Integer maxRecall;
......
...@@ -3,20 +3,22 @@ package com.viettel.campaign.web.dto; ...@@ -3,20 +3,22 @@ package com.viettel.campaign.web.dto;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.Date;
@Getter @Getter
@Setter @Setter
public class CustomerListDTO extends BaseDTO { public class CustomerListDTO extends BaseDTO {
private String customerListId; private long customerListId;
private String customerListPK; // private String customerListPK;
private String customerSiteId; private long customerSiteId;
private String customerListCode; private String customerListCode;
private String customerListName; private String customerListName;
private String status; private short status;
private String createBy; private String createBy;
private String createAt; private Date createAt;
private String updateBy; private String updateBy;
private String updateAt; private Date updateAt;
private String source; private String source;
private String deptCreate; private String deptCreate;
} }
...@@ -17,10 +17,10 @@ public class CampaignRequestDTO extends BaseDTO { ...@@ -17,10 +17,10 @@ public class CampaignRequestDTO extends BaseDTO {
String campaignCode; String campaignCode;
String campaignName; String campaignName;
Short status; Short status;
Date fromDateFr; String fromDateFr;
Date fromDateTo; String fromDateTo;
Date toDateTo; String toDateTo;
Date toDateFr; String toDateFr;
Long numOfCusFr; Long numOfCusFr;
Long numOfCusTo; Long numOfCusTo;
Short type; Short type;
......
...@@ -15,6 +15,7 @@ import java.util.Map; ...@@ -15,6 +15,7 @@ import java.util.Map;
@Controller @Controller
@RequestMapping("/ipcc/customer") @RequestMapping("/ipcc/customer")
@CrossOrigin("*")
public class CustomerController { public class CustomerController {
private static final Logger LOGGER = Logger.getLogger(CustomerController.class); private static final Logger LOGGER = Logger.getLogger(CustomerController.class);
......
package com.viettel.campaign.web.rest;
import com.viettel.campaign.model.CustomerList;
import com.viettel.campaign.service.CustomerListService;
import com.viettel.campaign.web.dto.CustomerListDTO;
import com.viettel.campaign.web.dto.ResultDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping(path = "/ipcc/customerlist")
@CrossOrigin(origins = "*")
public class CustomerListController {
@Autowired(required=true)
CustomerListService customerListService;
@GetMapping("/findAll")
@ResponseBody
public ResponseEntity findAllCustomerList(@RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam("sort") String sort) {
Map result = customerListService.getCustomerList(page, pageSize, sort);
return new ResponseEntity<>(result, HttpStatus.OK);
}
@PostMapping("/create")
@ResponseBody
public ResultDTO createCustomerList(@RequestBody @Valid CustomerListDTO customerListDTO) {
ResultDTO result = new ResultDTO();
//LogUtil logUtil = new LogUtil();
//logUtil.initKpiLog("createCust")
try {
//LOGGER.info("Returning createCustomer: start");
result = customerListService.createCustomerList(customerListDTO);
//LOGGER.info("Returning createCustomer:" + result.getErrorCode());
//logUtil.endKpiLog(customerDTO, 0, result.getErrorCode(), result.getDetail(), CustomerController.class, customerDTO.getAgentProcess(), this.serverPort);
} catch (Exception e) {
result.setErrorCode("-1");
// LOGGER.error(e);
//logUtil.endKpiLog(customerDTO, 1, result.getErrorCode(), e.getMessage(), CustomerController.class, customerDTO.getAgentProcess(), this.serverPort);
}
return result;
// return new ResponseEntity<>("", HttpStatus.OK);
}
@PutMapping("/update")
@ResponseBody
public ResultDTO updateCompleteCode(@RequestBody @Valid CustomerListDTO customerListDTO) {
ResultDTO result = new ResultDTO();
//LogUtil logUtil = new LogUtil();
//logUtil.initKpiLog("createCust");
try {
//LOGGER.info("Returning createCustomer: start");
result = customerListService.updateCustomerList(customerListDTO);
//LOGGER.info("Returning createCustomer:" + result.getErrorCode());
//logUtil.endKpiLog(customerDTO, 0, result.getErrorCode(), result.getDetail(), CustomerController.class, customerDTO.getAgentProcess(), this.serverPort);
} catch (Exception e) {
result.setErrorCode("-1");
// LOGGER.error(e);
//logUtil.endKpiLog(customerDTO, 1, result.getErrorCode(), e.getMessage(), CustomerController.class, customerDTO.getAgentProcess(), this.serverPort);
}
return result;
}
@PostMapping("/delete")
@ResponseBody
public ResultDTO deleteCompleteCode(@RequestBody @Valid CustomerListDTO customerListDTO) {
ResultDTO result = new ResultDTO();
result = customerListService.deleteCustomerList(customerListDTO);
return result;
}
@PostMapping("/ids")
@ResponseBody
public ResultDTO deleteIds(@RequestBody @Valid List<CustomerListDTO> customerListDTOList) {
List<Long> ids = new ArrayList<>();
ResultDTO result = new ResultDTO();
for (CustomerListDTO customerList: customerListDTOList) {
ids.add(customerList.getCustomerListId());
}
result = customerListService.deleteIds(ids);
return result;
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment