Commit 4198f4d3 by 徐康

麦咖啡批量锁券和核销券

parent 5e28039c
......@@ -15,6 +15,10 @@ package cn.freemud.adapter;
import cn.freemud.base.constant.Version;
import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.coupon.MCCafeCouponRequest;
import cn.freemud.entities.dto.coupon.MCCafeCouponLockRequest;
import cn.freemud.entities.dto.coupon.MCCafeProductRedeemVo;
import cn.freemud.entities.dto.coupon.MCCafeTransactionVo;
import cn.freemud.entities.dto.openplatform.AddWeixinCardCodeRequestDto;
import cn.freemud.entities.dto.openplatform.AddWeixinCardCodeResponseDto;
import cn.freemud.entities.dto.openplatform.AddWeixinCardJudgeRequestDto;
......@@ -22,12 +26,13 @@ import cn.freemud.entities.dto.openplatform.AddWeixinCardJudgeResponseDto;
import cn.freemud.entities.dto.promotion.CouponPromotionDto;
import cn.freemud.entities.dto.promotion.OrderBeanRequest;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.ActivityChannelEnum;
import cn.freemud.enums.ActivityShareType;
import cn.freemud.enums.CouponStatus;
import cn.freemud.enums.CouponTypeEnum;
import cn.freemud.enums.*;
import cn.freemud.utils.BeanUtil;
import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.card.sdk.vo.coupon.request.MemberAddCouponVo;
import com.freemud.sdk.api.assortment.order.enums.QueryOrderAccountType;
import com.freemud.sdk.api.assortment.order.request.order.CreateOrderAccountRequest;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
......@@ -557,4 +562,75 @@ public class CouponAdapter {
couponPromotionDto.setFlg(flg);
return couponPromotionDto;
}
public MCCafeCouponRequest convert2MCCafeCouponRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, CreateOrderAccountRequest accountBean) {
List<MCCafeProductRedeemVo> products = new ArrayList<>();
//商品券核销核销参数
if (QueryOrderAccountType.PRODUCT_COUPON.equals(accountBean.getAccountType())) {
for (int i = 0; i < orderBean.getProductList().size(); i++) {
QueryOrdersResponse.DataBean.OrderBean.ProductBean productBean = orderBean.getProductList().get(i);
String pid = org.apache.commons.lang3.StringUtils.isNotBlank(productBean.getSpecification()) ? productBean.getSpecification() : productBean.getProductId();
if (!org.springframework.util.CollectionUtils.isEmpty(productBean.getDiscountList())) {
List<QueryOrdersResponse.DataBean.OrderBean.ProductBean.ProductDiscount> discounts = productBean.getDiscountList().stream().
filter(productDiscount -> productDiscount.getDiscountId().equals(accountBean.getAccountId())).collect(Collectors.toList());
for (QueryOrdersResponse.DataBean.OrderBean.ProductBean.ProductDiscount productDiscount : discounts) {
if (productDiscount.getDiscountType() == null || productDiscount.getDiscountType() == 0) {
continue;
}
MCCafeProductRedeemVo mcCafeProductRedeemVo = new MCCafeProductRedeemVo();
mcCafeProductRedeemVo.setPid(pid);
mcCafeProductRedeemVo.setKeyProductCode(productBean.getCustomerCode());
mcCafeProductRedeemVo.setCustomer_code(productBean.getCustomerCode());
mcCafeProductRedeemVo.setConsume_num(productDiscount.getDiscountQty());
mcCafeProductRedeemVo.setSeq(i + 1);
products.add(mcCafeProductRedeemVo);
}
}
}
}
MCCafeCouponRequest mcCafeCouponRequest = new MCCafeCouponRequest();
mcCafeCouponRequest.setVer(Integer.valueOf(Version.VERSION_1));
mcCafeCouponRequest.setReqtype(CouponReqTypeEnum.REDEEM.getCode());
mcCafeCouponRequest.setPartnerId(Integer.parseInt(orderBean.getCompanyId()));
mcCafeCouponRequest.setStore_id(orderBean.getShopId());
mcCafeCouponRequest.setStation_id("-1");
mcCafeCouponRequest.setOperator_id("-1");
// 订单号
mcCafeCouponRequest.setTrans_id(orderBean.getOid());
mcCafeCouponRequest.setChannel(OrderClientType.ALIPAY.getIndex().toString().equals(orderBean.getOrderClient())?MCCafeChannelEnum.MOCOFFEE_ZFB.getName():MCCafeChannelEnum.MOCOFFEE_WX.getName());
List<MCCafeTransactionVo> transactions = new ArrayList<>();
MCCafeTransactionVo mcCafeTransactionVo = new MCCafeTransactionVo();
mcCafeTransactionVo.setCode(accountBean.getAccountId());
mcCafeTransactionVo.setTotalAmount(-accountBean.getPrice());
if (CollectionUtils.isNotEmpty(products)) {
mcCafeTransactionVo.setProducts(products);
}
transactions.add(mcCafeTransactionVo);
mcCafeCouponRequest.setTransactions(transactions);
mcCafeCouponRequest.setSign("skip");
mcCafeCouponRequest.setAppFlag("kgd.N");
mcCafeCouponRequest.setBusiness_date(cn.freemud.base.util.DateUtil.convert2Str(new Date(), cn.freemud.base.util.DateUtil.FORMAT_yyyyMMdd));
return mcCafeCouponRequest;
}
public MCCafeCouponLockRequest convert2MCCafeCouponLockRequest(QueryOrdersResponse.DataBean.OrderBean orderBean, CreateOrderAccountRequest accountBean) {
MCCafeCouponLockRequest mcCafeCouponLockRequest = new MCCafeCouponLockRequest();
mcCafeCouponLockRequest.setVer(Integer.valueOf(Version.VERSION_1));
mcCafeCouponLockRequest.setReqType(CouponReqTypeEnum.UNLOCK.getCode());
mcCafeCouponLockRequest.setPartnerId(orderBean.getCompanyId());
mcCafeCouponLockRequest.setStoreId(orderBean.getShopId());
// 订单号
mcCafeCouponLockRequest.setTransId(orderBean.getOid());
mcCafeCouponLockRequest.setCoupon(accountBean.getAccountId());
mcCafeCouponLockRequest.setOfferId(accountBean.getAccountId());
mcCafeCouponLockRequest.setNumber("1");
mcCafeCouponLockRequest.setChannel(OrderSourceType.ALIPAY.getCode().equals(orderBean.getSource())?
MCCafeChannelEnum.MOCOFFEE_ZFB.getName():MCCafeChannelEnum.MOCOFFEE_WX.getName());
mcCafeCouponLockRequest.setOperatorId("-1");
mcCafeCouponLockRequest.setStationId("-1");
mcCafeCouponLockRequest.setSign("skip");
return mcCafeCouponLockRequest;
}
}
......@@ -13,7 +13,7 @@ import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MCCafeConponRequest {
public class MCCafeCouponRequest {
/**
* 接口版本
*/
......
......@@ -17,7 +17,7 @@ import cn.freemud.base.util.DateUtil;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.constant.StoreConstant;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.coupon.MCCafeConponRequest;
import cn.freemud.entities.dto.coupon.MCCafeCouponRequest;
import cn.freemud.entities.dto.order.BusinessDate;
import cn.freemud.entities.dto.shoppingCart.GetShoppingCartGoodsApportionDto;
import cn.freemud.entities.dto.shoppingCart.ShoppingCartGoodsDto;
......@@ -568,7 +568,7 @@ public class CheckMCCafeOrder {
// }
if (StringUtils.isNotBlank(createOrderVo.getCouponCode())) {
// 校验couponCode
CouponQueryResponse couponQueryResponse = couponClientService.query(MCCafeConponRequest.builder()
CouponQueryResponse couponQueryResponse = couponClientService.query(MCCafeCouponRequest.builder()
.ver(Integer.valueOf(Version.VERSION_1))
.reqtype(CouponReqTypeEnum.QUERY.getCode())
.partnerId(Integer.parseInt(createOrderVo.getPartnerId()))
......
......@@ -3,7 +3,7 @@ package cn.freemud.service.mccafe;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponQueryResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import cn.freemud.entities.dto.coupon.MCCafeConponRequest;
import cn.freemud.entities.dto.coupon.MCCafeCouponRequest;
import cn.freemud.entities.dto.coupon.MCCafeCouponLockRequest;
import com.freemud.sdk.api.assortment.order.request.order.CreateOrderAccountRequest;
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
......@@ -14,15 +14,19 @@ public interface CouponClientService {
CouponRedeemResponse redeem(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponRedeemResponse redeem(MCCafeConponRequest mcCafeConponRequest);
CouponRedeemResponse redeem(MCCafeCouponRequest mcCafeCouponRequest);
CouponRedeemResponse redeemBatch(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponRedeemResponse cancelRedeem(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponQueryResponse query(MCCafeConponRequest mcCafeConponRequest);
CouponQueryResponse query(MCCafeCouponRequest mcCafeCouponRequest);
CouponBaseResponse lock(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponBaseResponse lock(MCCafeCouponLockRequest mcCafeCouponLockRequest);
CouponBaseResponse lockBatch(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts);
CouponBaseResponse unlock(MCCafeCouponLockRequest mcCafeCouponLockRequest);
}
package cn.freemud.service.mccafe.impl;
import cn.freemud.adapter.CouponAdapter;
import cn.freemud.base.constant.Version;
import cn.freemud.entities.dto.coupon.MCCafeConponRequest;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.dto.coupon.MCCafeCouponRequest;
import cn.freemud.entities.dto.coupon.MCCafeCouponLockRequest;
import cn.freemud.entities.dto.coupon.MCCafeProductRedeemVo;
import cn.freemud.entities.dto.coupon.MCCafeTransactionVo;
......@@ -18,6 +20,7 @@ import com.freemud.sdk.api.assortment.order.request.order.CreateOrderAccountRequ
import com.freemud.sdk.api.assortment.order.response.order.QueryOrdersResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -30,6 +33,9 @@ public class CouponClientServiceImpl implements CouponClientService {
@Autowired
private CouponOfflineMCCafeClient couponOfflineMCCafeClient;
@Autowired
private CouponAdapter couponAdapter;
@Override
public CouponRedeemResponse redeem(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts) {
if (null == orderBean || CollectionUtils.isEmpty(accounts)) {
......@@ -67,16 +73,16 @@ public class CouponClientServiceImpl implements CouponClientService {
}
}
}
MCCafeConponRequest mcCafeConponRequest = new MCCafeConponRequest();
mcCafeConponRequest.setVer(Integer.valueOf(Version.VERSION_1));
mcCafeConponRequest.setReqtype(CouponReqTypeEnum.REDEEM.getCode());
mcCafeConponRequest.setPartnerId(Integer.parseInt(orderBean.getCompanyId()));
mcCafeConponRequest.setStore_id(orderBean.getShopId());
mcCafeConponRequest.setStation_id("-1");
mcCafeConponRequest.setOperator_id("-1");
MCCafeCouponRequest mcCafeCouponRequest = new MCCafeCouponRequest();
mcCafeCouponRequest.setVer(Integer.valueOf(Version.VERSION_1));
mcCafeCouponRequest.setReqtype(CouponReqTypeEnum.REDEEM.getCode());
mcCafeCouponRequest.setPartnerId(Integer.parseInt(orderBean.getCompanyId()));
mcCafeCouponRequest.setStore_id(orderBean.getShopId());
mcCafeCouponRequest.setStation_id("-1");
mcCafeCouponRequest.setOperator_id("-1");
// 订单号
mcCafeConponRequest.setTrans_id(orderBean.getOid());
mcCafeConponRequest.setChannel(OrderClientType.ALIPAY.getIndex().toString().equals(orderBean.getOrderClient())?MCCafeChannelEnum.MOCOFFEE_ZFB.getName():MCCafeChannelEnum.MOCOFFEE_WX.getName());
mcCafeCouponRequest.setTrans_id(orderBean.getOid());
mcCafeCouponRequest.setChannel(OrderClientType.ALIPAY.getIndex().toString().equals(orderBean.getOrderClient())?MCCafeChannelEnum.MOCOFFEE_ZFB.getName():MCCafeChannelEnum.MOCOFFEE_WX.getName());
List<MCCafeTransactionVo> transactions = new ArrayList<>();
MCCafeTransactionVo mcCafeTransactionVo = new MCCafeTransactionVo();
mcCafeTransactionVo.setCode(accountBean.getAccountId());
......@@ -85,34 +91,58 @@ public class CouponClientServiceImpl implements CouponClientService {
mcCafeTransactionVo.setProducts(products);
}
transactions.add(mcCafeTransactionVo);
mcCafeConponRequest.setTransactions(transactions);
mcCafeConponRequest.setSign("skip");
mcCafeCouponRequest.setTransactions(transactions);
mcCafeCouponRequest.setSign("skip");
mcCafeConponRequest.setAppFlag("kgd.N");
mcCafeConponRequest.setBusiness_date(cn.freemud.base.util.DateUtil.convert2Str(new Date(), cn.freemud.base.util.DateUtil.FORMAT_yyyyMMdd));
mcCafeCouponRequest.setAppFlag("kgd.N");
mcCafeCouponRequest.setBusiness_date(cn.freemud.base.util.DateUtil.convert2Str(new Date(), cn.freemud.base.util.DateUtil.FORMAT_yyyyMMdd));
return couponOfflineMCCafeClient.redeem(mcCafeConponRequest);
return couponOfflineMCCafeClient.redeem(mcCafeCouponRequest);
}
@Override
public CouponRedeemResponse redeem(MCCafeConponRequest mcCafeConponRequest) {
return couponOfflineMCCafeClient.redeem(mcCafeConponRequest);
public CouponRedeemResponse redeem(MCCafeCouponRequest mcCafeCouponRequest) {
return couponOfflineMCCafeClient.redeem(mcCafeCouponRequest);
}
@Override
public CouponRedeemResponse redeemBatch(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts) {
if (null == orderBean || CollectionUtils.isEmpty(accounts)) {
return null;
}
List<CreateOrderAccountRequest> accountList = accounts.stream().filter(
account -> (account.getAccountType().equals(QueryOrderAccountType.COUPON)
|| account.getAccountType().equals(QueryOrderAccountType.PRODUCT_COUPON)
|| account.getAccountType().equals(QueryOrderAccountType.DISCOUNT_COUPON)) && account.getPrice() != 0l).collect(Collectors.toList());
if (CollectionUtils.isEmpty(accountList)) {
return null;
}
CouponRedeemResponse couponRedeemResponse = new CouponRedeemResponse();
List<MCCafeCouponRequest> list = new ArrayList<>();
accountList.forEach(accountBean -> list.add(couponAdapter.convert2MCCafeCouponRequest(orderBean, accountBean)));
for (MCCafeCouponRequest request : list) {
CouponRedeemResponse redeemResponse = redeem(request);
if(!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(redeemResponse.getStatusCode())) {
BeanUtils.copyProperties(redeemResponse, couponRedeemResponse);
break;
}
}
return couponRedeemResponse;
}
@Override
public CouponRedeemResponse cancelRedeem(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts) {
MCCafeConponRequest mcCafeConponRequest = new MCCafeConponRequest();
return couponOfflineMCCafeClient.cancelRedeem(mcCafeConponRequest);
MCCafeCouponRequest mcCafeCouponRequest = new MCCafeCouponRequest();
return couponOfflineMCCafeClient.cancelRedeem(mcCafeCouponRequest);
}
@Override
public CouponQueryResponse query(MCCafeConponRequest mcCafeConponRequest) {
return couponOfflineMCCafeClient.query(mcCafeConponRequest);
public CouponQueryResponse query(MCCafeCouponRequest mcCafeCouponRequest) {
return couponOfflineMCCafeClient.query(mcCafeCouponRequest);
}
@Override
......@@ -148,6 +178,40 @@ public class CouponClientServiceImpl implements CouponClientService {
}
@Override
public CouponBaseResponse lock(MCCafeCouponLockRequest mcCafeCouponLockRequest) {
return null;
}
@Override
public CouponBaseResponse lockBatch(QueryOrdersResponse.DataBean.OrderBean orderBean, List<CreateOrderAccountRequest> accounts) {
if (null == orderBean || CollectionUtils.isEmpty(accounts)) {
return null;
}
List<CreateOrderAccountRequest> accountList = accounts.stream().filter(
account -> (account.getAccountType().equals(QueryOrderAccountType.COUPON)
|| account.getAccountType().equals(QueryOrderAccountType.PRODUCT_COUPON)
|| account.getAccountType().equals(QueryOrderAccountType.DISCOUNT_COUPON)) && account.getPrice() != 0l).collect(Collectors.toList());
if (CollectionUtils.isEmpty(accountList)) {
return null;
}
CouponBaseResponse couponBaseResponse = new CouponBaseResponse();
List<MCCafeCouponLockRequest> list = new ArrayList<>();
accountList.forEach(accountBean -> list.add(couponAdapter.convert2MCCafeCouponLockRequest(orderBean, accountBean)));
for (MCCafeCouponLockRequest request : list) {
CouponBaseResponse baseResponse = lock(request);
if(!ResponseCodeConstant.RESPONSE_SUCCESS_STR.equals(baseResponse.getStatusCode())) {
BeanUtils.copyProperties(baseResponse, couponBaseResponse);
break;
}
}
return couponBaseResponse;
}
@Override
public CouponBaseResponse unlock(MCCafeCouponLockRequest mcCafeCouponLockRequest) {
return couponOfflineMCCafeClient.unlock(mcCafeCouponLockRequest);
}
......
......@@ -204,7 +204,7 @@ public class MCCafeOrderCenterSdkServiceImpl implements MCCafeOrderCenterSdkServ
// 如果是自提,则冻结优惠券,失败提示下单失败并冲正库存积分等
// 如果是外卖,则核销优惠券,失败提示下单失败并冲正库存积分等
if(OldOrderType.TAKE_OUT.getCode().equals(orderBean.getType())) {
CouponRedeemResponse couponRedeemResponse = couponClientService.redeem(orderBean, accounts);
CouponRedeemResponse couponRedeemResponse = couponClientService.redeemBatch(orderBean, accounts);
if (couponRedeemResponse!=null){
......@@ -219,7 +219,7 @@ public class MCCafeOrderCenterSdkServiceImpl implements MCCafeOrderCenterSdkServ
}
}
} else if(OldOrderType.COLLECT_GOODS.getCode().equals(orderBean.getType()) || OldOrderType.EAT_IN.getCode().equals(orderBean.getType())) {
CouponBaseResponse couponBaseResponse = couponClientService.lock(orderBean, accounts);
CouponBaseResponse couponBaseResponse = couponClientService.lockBatch(orderBean, accounts);
if (couponBaseResponse!=null){
......
......@@ -4,7 +4,7 @@ import com.freemud.application.sdk.api.couponcenter.offline.response.CouponBaseR
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponQueryResponse;
import com.freemud.application.sdk.api.couponcenter.offline.response.CouponRedeemResponse;
import cn.freemud.entities.dto.coupon.MCCafeCouponLockRequest;
import cn.freemud.entities.dto.coupon.MCCafeConponRequest;
import cn.freemud.entities.dto.coupon.MCCafeCouponRequest;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -14,13 +14,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
public interface CouponOfflineMCCafeClient {
@PostMapping("/mccafe/redeem")
CouponRedeemResponse redeem(MCCafeConponRequest mcCafeConponRequest);
CouponRedeemResponse redeem(MCCafeCouponRequest mcCafeCouponRequest);
@PostMapping("/mccafe/cancelRedeem")
CouponRedeemResponse cancelRedeem(MCCafeConponRequest mcCafeConponRequest);
CouponRedeemResponse cancelRedeem(MCCafeCouponRequest mcCafeCouponRequest);
@PostMapping("/mccafe/query")
CouponQueryResponse query(MCCafeConponRequest mcCafeConponRequest);
CouponQueryResponse query(MCCafeCouponRequest mcCafeCouponRequest);
@PostMapping("/mccafe/lock")
CouponBaseResponse lock(MCCafeCouponLockRequest MCCafeCouponLockRequest);
......
......@@ -2,7 +2,7 @@ package cn.freemud.service;
import cn.freemud.OrderApplication;
import cn.freemud.base.constant.Version;
import cn.freemud.entities.dto.coupon.MCCafeConponRequest;
import cn.freemud.entities.dto.coupon.MCCafeCouponRequest;
import cn.freemud.entities.dto.coupon.MCCafeCouponLockRequest;
import cn.freemud.entities.dto.coupon.MCCafeProductRedeemVo;
import cn.freemud.entities.dto.coupon.MCCafeTransactionVo;
......@@ -30,7 +30,7 @@ public class CouponActivityServiceTest {
@Test
public void redeemTest() {
MCCafeConponRequest couponCodeVerificationDto = new MCCafeConponRequest();
MCCafeCouponRequest couponCodeVerificationDto = new MCCafeCouponRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqtype(CouponReqTypeEnum.REDEEM.getCode());
couponCodeVerificationDto.setPartnerId(1205);
......@@ -63,7 +63,7 @@ public class CouponActivityServiceTest {
@Test
public void cancelRedeemTest() {
MCCafeConponRequest couponCodeVerificationDto = new MCCafeConponRequest();
MCCafeCouponRequest couponCodeVerificationDto = new MCCafeCouponRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqtype(CouponReqTypeEnum.CANCEL_REDEEM.getCode());
couponCodeVerificationDto.setPartnerId(1205);
......@@ -96,7 +96,7 @@ public class CouponActivityServiceTest {
@Test
public void queryTest() {
MCCafeConponRequest couponCodeVerificationDto = new MCCafeConponRequest();
MCCafeCouponRequest couponCodeVerificationDto = new MCCafeCouponRequest();
couponCodeVerificationDto.setVer(Integer.valueOf(Version.VERSION_1));
couponCodeVerificationDto.setReqtype(CouponReqTypeEnum.QUERY.getCode());
couponCodeVerificationDto.setPartnerId(1205);
......
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