Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
fit-finance
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fitness-server
fit-finance
Commits
7abf77d8
Commit
7abf77d8
authored
May 25, 2024
by
程裕兵
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:refund
parent
5f094ca6
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
109 additions
and
67 deletions
+109
-67
api/src/main/java/com/jiejing/fitness/finance/api/merchant/StudioMerchantApi.java
+2
-1
api/src/main/java/com/jiejing/fitness/finance/api/merchant/StudioMerchantApiFallback.java
+2
-1
api/src/main/java/com/jiejing/fitness/finance/api/merchant/request/StudioMerchantRefundRequest.java
+11
-5
api/src/main/java/com/jiejing/fitness/finance/api/merchant/vo/StudioMerchantCheckRefundVO.java
+63
-0
api/src/main/java/com/jiejing/fitness/finance/api/merchant/vo/StudioMerchantRefundVO.java
+0
-39
app/src/main/java/com/jiejing/fitness/finance/app/controller/merchant/StudioMerchantController.java
+2
-1
service/src/main/java/com/jiejing/fitness/finance/service/pay/RefundService.java
+2
-1
service/src/main/java/com/jiejing/fitness/finance/service/pay/convert/RefundConvert.java
+10
-10
service/src/main/java/com/jiejing/fitness/finance/service/pay/impl/RefundServiceImpl.java
+9
-4
service/src/main/java/com/jiejing/fitness/finance/service/pay/params/StudioMerchantRefundParams.java
+8
-5
No files found.
api/src/main/java/com/jiejing/fitness/finance/api/merchant/StudioMerchantApi.java
View file @
7abf77d8
...
...
@@ -19,6 +19,7 @@ import com.jiejing.fitness.finance.api.merchant.request.UnbindStudioMerchantRequ
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantAuthSubChannelVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantBindXcxAppIdVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantCheckRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantVO
;
import
com.jiejing.paycenter.common.model.vo.PayVO
;
...
...
@@ -99,7 +100,7 @@ public interface StudioMerchantApi {
@ApiOperation
(
value
=
"退款前置校验"
,
tags
=
{
TAG
})
@PostMapping
(
value
=
"/private/studioMerchant/checkBeforeRefund"
)
JsonResult
<
StudioMerchantRefundVO
>
checkBeforeRefund
(
StudioMerchantRefundRequest
request
);
JsonResult
<
StudioMerchant
Check
RefundVO
>
checkBeforeRefund
(
StudioMerchantRefundRequest
request
);
@ApiOperation
(
value
=
"退款"
,
tags
=
{
TAG
})
@PostMapping
(
value
=
"/private/studioMerchant/refund"
)
...
...
api/src/main/java/com/jiejing/fitness/finance/api/merchant/StudioMerchantApiFallback.java
View file @
7abf77d8
...
...
@@ -19,6 +19,7 @@ import com.jiejing.fitness.finance.api.merchant.request.UnbindStudioMerchantRequ
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantAuthSubChannelVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantBindXcxAppIdVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantCheckRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantVO
;
import
com.jiejing.paycenter.common.model.vo.PayVO
;
...
...
@@ -117,7 +118,7 @@ public class StudioMerchantApiFallback implements FallbackFactory<StudioMerchant
}
@Override
public
JsonResult
<
StudioMerchantRefundVO
>
checkBeforeRefund
(
StudioMerchantRefundRequest
request
)
{
public
JsonResult
<
StudioMerchant
Check
RefundVO
>
checkBeforeRefund
(
StudioMerchantRefundRequest
request
)
{
return
JsonResult
.
rpcError
();
}
...
...
api/src/main/java/com/jiejing/fitness/finance/api/merchant/request/StudioMerchantRefundRequest.java
View file @
7abf77d8
package
com
.
jiejing
.
fitness
.
finance
.
api
.
merchant
.
request
;
import
com.alibaba.fastjson.JSONObject
;
import
com.jiejing.fitness.enums.finance.PayOrderTypeEnum
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
...
...
@@ -26,6 +27,10 @@ public class StudioMerchantRefundRequest {
@NotNull
(
message
=
"场馆ID不能为空"
)
private
Long
studioId
;
@ApiModelProperty
(
name
=
"订单类型"
,
required
=
true
)
@NotNull
(
message
=
"订单类型不能为空"
)
private
PayOrderTypeEnum
orderType
;
@ApiModelProperty
(
name
=
"退款总金额(元)"
,
required
=
true
)
@NotNull
(
message
=
"退款总金额不能为空"
)
private
BigDecimal
transAmount
;
...
...
@@ -38,15 +43,16 @@ public class StudioMerchantRefundRequest {
@NotBlank
(
message
=
"退款原因不能为空"
)
private
String
refundReason
;
@ApiModelProperty
(
name
=
"上层业务退款单号"
,
required
=
true
)
@NotBlank
(
message
=
"上层业务退款单号不能为空"
)
@ApiModelProperty
(
name
=
"上层业务退款ID"
)
private
String
orderNo
;
@ApiModelProperty
(
name
=
"上层业务退款订单号"
)
private
String
businessNo
;
@ApiModelProperty
(
name
=
"上层业务子订单号"
)
private
String
subOrderNo
;
@ApiModelProperty
(
name
=
"订单类型"
,
required
=
true
)
@NotNull
(
message
=
"订单类型不能为空"
)
private
PayOrderTypeEnum
orderType
;
@ApiModelProperty
(
name
=
"业务扩展信息"
)
private
JSONObject
extra
;
}
api/src/main/java/com/jiejing/fitness/finance/api/merchant/vo/StudioMerchantCheckRefundVO.java
0 → 100644
View file @
7abf77d8
package
com
.
jiejing
.
fitness
.
finance
.
api
.
merchant
.
vo
;
import
com.jiejing.common.swagger.EnumMapping
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
java.util.Arrays
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.Getter
;
import
lombok.NoArgsConstructor
;
/**
* @author chengyubing
* @since 2024/5/10 13:40
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel
(
description
=
"场馆商户退款校验VO"
)
public
class
StudioMerchantCheckRefundVO
{
@EnumMapping
(
enumClass
=
CheckRefundCodeEnum
.
class
)
@ApiModelProperty
(
value
=
"退款前置校验code"
)
private
String
code
;
@ApiModelProperty
(
name
=
"失败原因"
)
private
String
failMessage
;
@Getter
@AllArgsConstructor
public
enum
CheckRefundCodeEnum
{
/**
* 退款校验CODE,退款失败CODE
*/
SUCCESS
(
"校验成功"
),
NOT_CURRENT_MERCHANT
(
"不是当前商户号收款,金额无法线上原路退回。如仍需退款请私下处理,系统会产生新的收支"
),
DATE_LIMIT
(
"仅支持350天内交易进行退款,金额无法线上原路退回。如仍需退款请私下处理,系统会产生新的收支"
),
TIME_LIMIT
(
"当前时间段不支持退款,金额无法线上原路退回。如仍需退款请私下处理,系统会产生新的收支"
),
AMOUNT_LIMIT
(
"乐动收银可退金额不足,请先通过扫码收款收款后再进行退款或者线下处理退款"
),
OTHER_ERROR
(
"其他错误"
),
;
private
final
String
code
=
name
();
private
final
String
message
;
public
static
CheckRefundCodeEnum
getByCode
(
String
code
)
{
return
Arrays
.
stream
(
CheckRefundCodeEnum
.
values
()).
filter
(
e
->
e
.
getCode
().
equals
(
code
)).
findFirst
()
.
orElse
(
OTHER_ERROR
);
}
public
static
boolean
isSuccess
(
String
code
)
{
return
CheckRefundCodeEnum
.
SUCCESS
==
getByCode
(
code
);
}
public
static
boolean
isFail
(
String
code
)
{
return
!
isSuccess
(
code
);
}
}
}
api/src/main/java/com/jiejing/fitness/finance/api/merchant/vo/StudioMerchantRefundVO.java
View file @
7abf77d8
...
...
@@ -2,15 +2,12 @@ package com.jiejing.fitness.finance.api.merchant.vo;
import
com.jiejing.common.swagger.EnumMapping
;
import
com.jiejing.paycenter.common.enums.common.TransStateEnums
;
import
com.jiejing.paycenter.common.enums.error.PayErrorEnums
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
java.util.Arrays
;
import
java.util.Date
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.Getter
;
import
lombok.NoArgsConstructor
;
/**
...
...
@@ -40,40 +37,4 @@ public class StudioMerchantRefundVO {
@ApiModelProperty
(
name
=
"完成时间"
)
private
Date
successTime
;
@EnumMapping
(
enumClass
=
CheckRefundCodeEnum
.
class
)
@ApiModelProperty
(
value
=
"具体的错误码"
,
notes
=
"退款校验或者退款失败时此code有值"
)
private
String
code
;
@Getter
@AllArgsConstructor
public
enum
CheckRefundCodeEnum
{
/**
* 退款校验CODE,退款失败CODE
*/
SUCCESS
(
"校验成功"
),
NOT_CURRENT_MERCHANT
(
"不是当前商户号收款,金额无法线上原路退回。如仍需退款请私下处理,系统会产生新的收支"
),
DATE_LIMIT
(
"仅支持350天内交易进行退款,金额无法线上原路退回。如仍需退款请私下处理,系统会产生新的收支"
),
TIME_LIMIT
(
"当前时间段不支持退款,金额无法线上原路退回。如仍需退款请私下处理,系统会产生新的收支"
),
AMOUNT_LIMIT
(
"乐动收银可退金额不足,请先通过扫码收款收款后再进行退款或者线下处理退款"
),
OTHER_ERROR
(
"其他错误"
),
;
private
final
String
code
=
name
();
private
final
String
message
;
public
static
CheckRefundCodeEnum
getByCode
(
String
code
)
{
return
Arrays
.
stream
(
CheckRefundCodeEnum
.
values
()).
filter
(
e
->
e
.
getCode
().
equals
(
code
)).
findFirst
()
.
orElse
(
OTHER_ERROR
);
}
public
static
boolean
isSuccess
(
String
code
)
{
return
CheckRefundCodeEnum
.
SUCCESS
==
getByCode
(
code
);
}
public
static
boolean
isFail
(
String
code
)
{
return
!
isSuccess
(
code
);
}
}
}
app/src/main/java/com/jiejing/fitness/finance/app/controller/merchant/StudioMerchantController.java
View file @
7abf77d8
...
...
@@ -21,6 +21,7 @@ import com.jiejing.fitness.finance.api.merchant.request.UnbindStudioMerchantRequ
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantAuthSubChannelVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantBindXcxAppIdVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantCheckRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantVO
;
import
com.jiejing.fitness.finance.service.merchant.StudioMerchantService
;
...
...
@@ -182,7 +183,7 @@ public class StudioMerchantController implements StudioMerchantApi {
@ApiOperation
(
value
=
"退款前置校验"
,
tags
=
{
TAG
})
@PostMapping
(
value
=
"/private/studioMerchant/checkBeforeRefund"
)
@Override
public
JsonResult
<
StudioMerchantRefundVO
>
checkBeforeRefund
(
public
JsonResult
<
StudioMerchant
Check
RefundVO
>
checkBeforeRefund
(
@RequestBody
@Valid
StudioMerchantRefundRequest
request
)
{
StudioMerchantRefundParams
params
=
BeanUtil
.
map
(
request
,
StudioMerchantRefundParams
.
class
);
return
JsonResult
.
success
(
refundService
.
checkBeforeMerchantRefund
(
params
));
...
...
service/src/main/java/com/jiejing/fitness/finance/service/pay/RefundService.java
View file @
7abf77d8
package
com
.
jiejing
.
fitness
.
finance
.
service
.
pay
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantCheckRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantRefundVO
;
import
com.jiejing.fitness.finance.service.pay.params.StudioMerchantRefundParams
;
import
com.jiejing.paycenter.common.event.RefundEvent
;
...
...
@@ -17,7 +18,7 @@ public interface RefundService {
* @param params 参数
* @return 结果
*/
StudioMerchantRefundVO
checkBeforeMerchantRefund
(
StudioMerchantRefundParams
params
);
StudioMerchant
Check
RefundVO
checkBeforeMerchantRefund
(
StudioMerchantRefundParams
params
);
/**
* 商户退款
...
...
service/src/main/java/com/jiejing/fitness/finance/service/pay/convert/RefundConvert.java
View file @
7abf77d8
package
com
.
jiejing
.
fitness
.
finance
.
service
.
pay
.
convert
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.toolkit.IdWorker
;
import
com.jiejing.common.exception.BizException
;
import
com.jiejing.common.utils.convert.BeanUtil
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransTypeEnum
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantCheckRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantRefundVO.CheckRefundCodeEnum
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchant
Check
RefundVO.CheckRefundCodeEnum
;
import
com.jiejing.fitness.finance.repository.entity.StudioCashierRecord
;
import
com.jiejing.fitness.finance.service.enums.FinanceErrorEnums
;
import
com.jiejing.fitness.finance.service.pay.params.StudioMerchantRefundParams
;
...
...
@@ -18,6 +20,7 @@ import com.jiejing.paycenter.common.event.RefundEvent;
import
com.jiejing.paycenter.common.model.vo.RefundVO
;
import
java.math.BigDecimal
;
import
java.util.Date
;
import
java.util.Optional
;
/**
* @author chengyubing
...
...
@@ -35,9 +38,9 @@ public class RefundConvert {
return
StudioCashierRecord
.
builder
()
.
id
(
id
)
.
transNo
(
id
.
toString
())
.
orderType
(
params
.
getOrderType
().
getCode
())
.
orderNo
(
params
.
getOrderNo
())
.
businessNo
(
params
.
getBusinessNo
())
.
orderType
(
params
.
getOrderType
().
getCode
())
.
subOrderNo
(
params
.
getSubOrderNo
())
.
transType
(
BrandCashierTransTypeEnum
.
REFUND
.
getCode
())
.
brandId
(
pay
.
getBrandId
())
...
...
@@ -58,6 +61,7 @@ public class RefundConvert {
.
remark
(
params
.
getRefundReason
())
.
existRelatedTrans
(
true
)
.
relatedTransNo
(
params
.
getPayTransNo
())
.
extra
(
Optional
.
of
(
params
.
getExtra
()).
map
(
e
->
JSON
.
toJSONString
(
e
)).
orElse
(
"{}"
))
.
tradingTime
(
now
)
.
createTime
(
now
)
.
updateTime
(
now
)
...
...
@@ -122,23 +126,19 @@ public class RefundConvert {
.
failMessage
(
vo
.
getFailMessage
())
.
refundState
(
vo
.
getRefundState
())
.
successTime
(
vo
.
getSuccessTime
())
.
code
(
TransStateEnums
.
FAIL
==
TransStateEnums
.
getByCode
(
vo
.
getRefundState
())
?
CheckRefundCodeEnum
.
OTHER_ERROR
.
getCode
()
:
null
)
.
build
();
}
public
static
StudioMerchantRefundVO
convertRefundVO
(
CheckRefundCodeEnum
code
)
{
return
StudioMerchantRefundVO
.
builder
().
code
(
code
.
getCode
()).
failMessage
(
code
.
getMessage
()).
build
();
public
static
StudioMerchant
Check
RefundVO
convertRefundVO
(
CheckRefundCodeEnum
code
)
{
return
StudioMerchant
Check
RefundVO
.
builder
().
code
(
code
.
getCode
()).
failMessage
(
code
.
getMessage
()).
build
();
}
public
static
RefundEvent
convertRefundEvent
(
StudioCashierRecord
refund
,
StudioMerchantRefundVO
vo
)
{
public
static
RefundEvent
convertRefundEvent
(
StudioCashierRecord
refund
,
StudioMerchant
Check
RefundVO
vo
)
{
return
RefundEvent
.
builder
()
.
id
(
refund
.
getId
())
.
transNo
(
refund
.
getTransNo
())
.
thirdTransNo
(
vo
.
getThirdTransNo
())
.
refundState
(
convertTransState
(
vo
.
getRefundState
()).
getCode
())
.
refundState
(
BrandCashierTransStateEnum
.
REFUND_FAIL
.
getCode
())
.
failMessage
(
vo
.
getFailMessage
())
.
successTime
(
vo
.
getSuccessTime
())
.
updateTime
(
new
Date
())
.
build
();
}
...
...
service/src/main/java/com/jiejing/fitness/finance/service/pay/impl/RefundServiceImpl.java
View file @
7abf77d8
...
...
@@ -7,8 +7,9 @@ import com.jiejing.common.utils.collection.CollectionUtil;
import
com.jiejing.common.utils.time.TimeUtil
;
import
com.jiejing.fitness.enums.auth.AuthDomainEnum
;
import
com.jiejing.fitness.enums.finance.BrandCashierTransStateEnum
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantCheckRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantCheckRefundVO.CheckRefundCodeEnum
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantRefundVO
;
import
com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantRefundVO.CheckRefundCodeEnum
;
import
com.jiejing.fitness.finance.repository.entity.PartyToMerchant
;
import
com.jiejing.fitness.finance.repository.entity.StudioCashierRecord
;
import
com.jiejing.fitness.finance.repository.service.StudioCashierRecordRpService
;
...
...
@@ -81,7 +82,7 @@ public class RefundServiceImpl implements RefundService {
private
Executor
executor
;
@Override
public
StudioMerchantRefundVO
checkBeforeMerchantRefund
(
StudioMerchantRefundParams
params
)
{
public
StudioMerchant
Check
RefundVO
checkBeforeMerchantRefund
(
StudioMerchantRefundParams
params
)
{
Long
payId
=
Long
.
parseLong
(
params
.
getPayTransNo
());
StudioCashierRecord
pay
=
studioCashierRecordRpService
.
getById
(
payId
)
.
orElseThrow
(()
->
new
BizException
(
FinanceErrorEnums
.
NOT_EXIST
));
...
...
@@ -110,10 +111,14 @@ public class RefundServiceImpl implements RefundService {
StudioCashierRecord
refund
=
this
.
initRefundRecord
(
params
);
StudioMerchantRefundVO
checkResult
=
this
.
checkBeforeMerchantRefund
(
params
);
StudioMerchant
Check
RefundVO
checkResult
=
this
.
checkBeforeMerchantRefund
(
params
);
if
(
CheckRefundCodeEnum
.
isFail
(
checkResult
.
getCode
()))
{
this
.
refundCallback
(
RefundConvert
.
convertRefundEvent
(
refund
,
checkResult
));
return
checkResult
;
return
StudioMerchantRefundVO
.
builder
()
.
transNo
(
refund
.
getTransNo
())
.
refundState
(
TransStateEnums
.
FAIL
.
getCode
())
.
failMessage
(
checkResult
.
getFailMessage
())
.
build
();
}
RefundPayRequest
request
=
RefundConvert
.
convert
(
params
,
refund
);
...
...
service/src/main/java/com/jiejing/fitness/finance/service/pay/params/StudioMerchantRefundParams.java
View file @
7abf77d8
package
com
.
jiejing
.
fitness
.
finance
.
service
.
pay
.
params
;
import
com.alibaba.fastjson.JSONObject
;
import
com.jiejing.fitness.enums.finance.PayOrderTypeEnum
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
...
...
@@ -26,6 +27,10 @@ public class StudioMerchantRefundParams {
@NotNull
(
message
=
"场馆ID不能为空"
)
private
Long
studioId
;
@ApiModelProperty
(
name
=
"订单类型"
,
required
=
true
)
@NotNull
(
message
=
"订单类型不能为空"
)
private
PayOrderTypeEnum
orderType
;
@ApiModelProperty
(
name
=
"退款总金额(元)"
,
required
=
true
)
@NotNull
(
message
=
"退款总金额不能为空"
)
private
BigDecimal
transAmount
;
...
...
@@ -38,8 +43,7 @@ public class StudioMerchantRefundParams {
@NotBlank
(
message
=
"退款原因不能为空"
)
private
String
refundReason
;
@ApiModelProperty
(
name
=
"上层业务退款ID"
,
required
=
true
)
@NotBlank
(
message
=
"上层业务退款ID不能为空"
)
@ApiModelProperty
(
name
=
"上层业务退款ID"
)
private
String
orderNo
;
@ApiModelProperty
(
name
=
"上层业务退款订单号"
)
...
...
@@ -48,8 +52,7 @@ public class StudioMerchantRefundParams {
@ApiModelProperty
(
name
=
"上层业务子订单号"
)
private
String
subOrderNo
;
@ApiModelProperty
(
name
=
"订单类型"
,
required
=
true
)
@NotNull
(
message
=
"订单类型不能为空"
)
private
PayOrderTypeEnum
orderType
;
@ApiModelProperty
(
name
=
"业务扩展信息"
)
private
JSONObject
extra
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment