Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
order-group
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
order-group-application
order-group
Commits
fcea0267
Commit
fcea0267
authored
Dec 03, 2021
by
周晓航
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加注释 维护枚举类
Signed-off-by: 周晓航 <xiaohang.zhou@freemud.com>
parent
716537ee
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
64 additions
and
40 deletions
+64
-40
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/entities/OrderRefundConfigEntity.java
+6
-0
order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
+0
-15
order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
+58
-25
No files found.
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/entities/OrderRefundConfigEntity.java
View file @
fcea0267
...
@@ -91,4 +91,10 @@ public class OrderRefundConfigEntity {
...
@@ -91,4 +91,10 @@ public class OrderRefundConfigEntity {
* 1-允许
* 1-允许
*/
*/
private
String
cashierOrderRefund
;
private
String
cashierOrderRefund
;
/**
* 卖券订单是否可以申请退款
* null <=0 都不可以申请退款
*/
private
Integer
couponOrderRefundDayLimit
;
}
}
order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
View file @
fcea0267
...
@@ -2146,21 +2146,6 @@ public class OrderAdapter {
...
@@ -2146,21 +2146,6 @@ public class OrderAdapter {
return
orderPayRefundRequest
;
return
orderPayRefundRequest
;
}
}
public
com
.
freemud
.
sdk
.
api
.
assortment
.
payment
.
request
.
OrderRefundRequest
getOrderPayRefundRequest
(
OrderInfoReqs
orderBean
,
Long
refundId
,
String
fatherOrderId
)
{
com
.
freemud
.
sdk
.
api
.
assortment
.
payment
.
request
.
OrderRefundRequest
orderPayRefundRequest
=
new
com
.
freemud
.
sdk
.
api
.
assortment
.
payment
.
request
.
OrderRefundRequest
();
orderPayRefundRequest
.
setOrgTransId
(
fatherOrderId
);
orderPayRefundRequest
.
setPartnerId
(
orderBean
.
getPartnerId
());
orderPayRefundRequest
.
setStoreId
(
orderBean
.
getStoreId
());
orderPayRefundRequest
.
setOrgPayFmId
(
orderBean
.
getPayRequestNo
());
orderPayRefundRequest
.
setRefundAmount
(
orderBean
.
getActualPayAmount
().
longValue
());
orderPayRefundRequest
.
setRefundId
(
refundId
);
OrderExtInfoDto
orderExtInfoDTO
=
gson
.
fromJson
(
orderBean
.
getExtInfo
(),
OrderExtInfoDto
.
class
);
orderPayRefundRequest
.
setOpenid
(
orderExtInfoDTO
!=
null
?
orderExtInfoDTO
.
getOpenid
()
:
""
);
orderPayRefundRequest
.
setAppId
(
orderExtInfoDTO
!=
null
?
orderExtInfoDTO
.
getAppid
()
:
""
);
orderPayRefundRequest
.
setNotifyUrl
(
refundNotifyCallback
);
return
orderPayRefundRequest
;
}
public
MultiOrderRefundRequest
getMultiOrderPayRefundRequest
(
OrderBeanV1
orderBean
,
Long
refundId
)
{
public
MultiOrderRefundRequest
getMultiOrderPayRefundRequest
(
OrderBeanV1
orderBean
,
Long
refundId
)
{
MultiOrderRefundRequest
multiQueryRequest
=
new
MultiOrderRefundRequest
();
MultiOrderRefundRequest
multiQueryRequest
=
new
MultiOrderRefundRequest
();
multiQueryRequest
.
setStationId
(
"1"
);
multiQueryRequest
.
setStationId
(
"1"
);
...
...
order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
View file @
fcea0267
...
@@ -90,7 +90,6 @@ import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp;
...
@@ -90,7 +90,6 @@ import com.freemud.application.sdk.api.ordercenter.response.OrderCountResp;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderPayItemResp
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderPayItemResp
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse
;
import
com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService
;
import
com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService
;
import
com.freemud.application.sdk.api.ordercenter.service.OrderSdkService
;
import
com.freemud.application.sdk.api.ordercenter.service.OrderSdkService
;
import
com.freemud.application.sdk.api.storecenter.request.GetListByCodesRequest
;
import
com.freemud.application.sdk.api.storecenter.request.GetListByCodesRequest
;
...
@@ -3341,11 +3340,11 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3341,11 +3340,11 @@ public class OrderServiceImpl implements Orderservice {
AssortmentCustomerInfoVo
userLoginInfoDto
=
baseResponse
.
getResult
();
AssortmentCustomerInfoVo
userLoginInfoDto
=
baseResponse
.
getResult
();
// 查询订单
// 查询订单
BaseResponse
<
Order
InfoReqs
>
orderResponse
=
this
.
checkOrderAndGetOrderBean
(
orderRefundVo
.
getOid
());
BaseResponse
<
Order
BeanV1
>
orderResponse
=
this
.
checkOrderAndGetOrderBean
(
orderRefundVo
.
getOid
());
if
(!
Objects
.
equals
(
orderResponse
.
getCode
(),
ResponseResult
.
SUCCESS
.
getCode
()))
{
if
(!
Objects
.
equals
(
orderResponse
.
getCode
(),
ResponseResult
.
SUCCESS
.
getCode
()))
{
return
orderResponse
;
return
orderResponse
;
}
}
Order
InfoReqs
orderBean
=
orderResponse
.
getResult
();
Order
BeanV1
orderBean
=
orderResponse
.
getResult
();
// 校验操作
// 校验操作
BaseResponse
checkResult
=
this
.
couponOrderRefundCheck
(
userLoginInfoDto
,
orderBean
);
BaseResponse
checkResult
=
this
.
couponOrderRefundCheck
(
userLoginInfoDto
,
orderBean
);
...
@@ -3362,10 +3361,10 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3362,10 +3361,10 @@ public class OrderServiceImpl implements Orderservice {
try
{
try
{
this
.
doCouponOrderRefund
(
orderBean
,
orderRefundVo
);
this
.
doCouponOrderRefund
(
orderBean
,
orderRefundVo
);
}
catch
(
Exception
e
){
}
catch
(
Exception
e
){
RefundFailureRequestDTO
requestDTO
=
RefundFailureRequestDTO
.
builder
().
orderCode
(
orderBean
.
getO
rderCode
())
RefundFailureRequestDTO
requestDTO
=
RefundFailureRequestDTO
.
builder
().
orderCode
(
orderBean
.
getO
id
())
.
failureType
(
RefundFailureRequestDTO
.
FAILURETYPE_SYSTEM_ERROR
)
.
failureType
(
RefundFailureRequestDTO
.
FAILURETYPE_SYSTEM_ERROR
)
.
reason
(
JSON
.
toJSONString
(
e
.
getMessage
()))
.
reason
(
JSON
.
toJSONString
(
e
.
getMessage
()))
.
partnerId
(
orderBean
.
get
Partner
Id
())
.
partnerId
(
orderBean
.
get
Company
Id
())
.
operator
(
""
)
.
operator
(
""
)
.
ver
(
0
).
build
();
.
ver
(
0
).
build
();
orderServiceClient
.
refundFailures
(
requestDTO
);
orderServiceClient
.
refundFailures
(
requestDTO
);
...
@@ -3381,11 +3380,11 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3381,11 +3380,11 @@ public class OrderServiceImpl implements Orderservice {
* @param orderBean
* @param orderBean
* @return
* @return
*/
*/
private
BaseResponse
doCouponOrderRefund
(
Order
InfoReqs
orderBean
,
OrderRefundVo
orderRefundVo
)
{
private
BaseResponse
doCouponOrderRefund
(
Order
BeanV1
orderBean
,
OrderRefundVo
orderRefundVo
)
{
// 支付金额 大于0 调用支付 进行退款
// 支付金额 大于0 调用支付 进行退款
Long
refundId
=
System
.
currentTimeMillis
();
Long
refundId
=
System
.
currentTimeMillis
();
int
state
=
PayRefundStatus
.
SUCCESS
.
getCode
();
int
state
=
PayRefundStatus
.
SUCCESS
.
getCode
();
if
(
orderBean
.
getActualPayAmount
().
compareTo
(
BigDecimal
.
ZERO
)
>
0
)
{
if
(
orderBean
.
getActualPayAmount
().
compareTo
(
0L
)
>
0
)
{
//调用支付退款
//调用支付退款
com
.
freemud
.
sdk
.
api
.
assortment
.
payment
.
request
.
OrderRefundRequest
orderPayRefundRequest
=
orderAdapter
.
getOrderPayRefundRequest
(
orderBean
,
refundId
,
orderRefundVo
.
getOid
());
com
.
freemud
.
sdk
.
api
.
assortment
.
payment
.
request
.
OrderRefundRequest
orderPayRefundRequest
=
orderAdapter
.
getOrderPayRefundRequest
(
orderBean
,
refundId
,
orderRefundVo
.
getOid
());
//抖音支付退款必传
//抖音支付退款必传
...
@@ -3394,10 +3393,10 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3394,10 +3393,10 @@ public class OrderServiceImpl implements Orderservice {
if
(
response
==
null
||
response
.
getData
()
==
null
||
!
com
.
freemud
.
sdk
.
api
.
assortment
.
order
.
domain
.
ResponseCodeConstant
.
RESPONSE_SUCCESS_STR
.
equals
(
response
.
getCode
()))
{
if
(
response
==
null
||
response
.
getData
()
==
null
||
!
com
.
freemud
.
sdk
.
api
.
assortment
.
order
.
domain
.
ResponseCodeConstant
.
RESPONSE_SUCCESS_STR
.
equals
(
response
.
getCode
()))
{
String
failMsg
=
Objects
.
isNull
(
response
)
?
"支付退款失败"
:
JSON
.
toJSONString
(
response
);
String
failMsg
=
Objects
.
isNull
(
response
)
?
"支付退款失败"
:
JSON
.
toJSONString
(
response
);
//TODO 退款失败则记录到世昌的表里
//TODO 退款失败则记录到世昌的表里
RefundFailureRequestDTO
requestDTO
=
RefundFailureRequestDTO
.
builder
().
orderCode
(
orderBean
.
getO
rderCode
())
RefundFailureRequestDTO
requestDTO
=
RefundFailureRequestDTO
.
builder
().
orderCode
(
orderBean
.
getO
id
())
.
failureType
(
RefundFailureRequestDTO
.
FAILURETYPE_NOT_SUFFICIENT_FUNDS
)
.
failureType
(
RefundFailureRequestDTO
.
FAILURETYPE_NOT_SUFFICIENT_FUNDS
)
.
reason
(
failMsg
)
.
reason
(
failMsg
)
.
partnerId
(
orderBean
.
get
Partner
Id
())
.
partnerId
(
orderBean
.
get
Company
Id
())
.
operator
(
""
)
.
operator
(
""
)
.
ver
(
0
).
build
();
.
ver
(
0
).
build
();
orderServiceClient
.
refundFailures
(
requestDTO
);
orderServiceClient
.
refundFailures
(
requestDTO
);
...
@@ -3407,10 +3406,10 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3407,10 +3406,10 @@ public class OrderServiceImpl implements Orderservice {
}
}
// 调用基础服务, 进行订单状态变更
// 调用基础服务, 进行订单状态变更
CancelOrderRequest
cancelOrderRequest
=
orderAdapter
.
convent2CancelOrderRequest
(
orderBean
.
getO
rderCode
(),
CancelOrderRequest
cancelOrderRequest
=
orderAdapter
.
convent2CancelOrderRequest
(
orderBean
.
getO
id
(),
orderBean
.
get
Partner
Id
(),
AfterSalesType
.
USER_CANCEL
,
orderRefundVo
.
getReason
(),
LogThreadLocal
.
getTrackingNo
(),
refundId
.
toString
());
orderBean
.
get
Company
Id
(),
AfterSalesType
.
USER_CANCEL
,
orderRefundVo
.
getReason
(),
LogThreadLocal
.
getTrackingNo
(),
refundId
.
toString
());
cancelOrderRequest
.
setOperator
(
orderBean
.
getUserName
());
cancelOrderRequest
.
setOperator
(
orderBean
.
getUserName
());
cancelOrderRequest
.
setPartnerId
(
orderBean
.
get
Partner
Id
());
cancelOrderRequest
.
setPartnerId
(
orderBean
.
get
Company
Id
());
if
(
Objects
.
equals
(
PayRefundStatus
.
RUNNING
.
getCode
(),
state
))
{
if
(
Objects
.
equals
(
PayRefundStatus
.
RUNNING
.
getCode
(),
state
))
{
// 退款中
// 退款中
cancelOrderRequest
.
setCreateEvent
(
AfterSalesOrderCreateEventEnum
.
RETURN_COMPLETE
.
getCreateEvent
());
cancelOrderRequest
.
setCreateEvent
(
AfterSalesOrderCreateEventEnum
.
RETURN_COMPLETE
.
getCreateEvent
());
...
@@ -3429,7 +3428,7 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3429,7 +3428,7 @@ public class OrderServiceImpl implements Orderservice {
throw
new
ServiceException
(
ResponseResult
.
ORDER__ERRORREFUND
);
throw
new
ServiceException
(
ResponseResult
.
ORDER__ERRORREFUND
);
}
}
// 删除订单 通知活动添加商品库存 status 需要老订单的 ordercode
// 删除订单 通知活动添加商品库存 status 需要老订单的 ordercode
// orderQueueService.backOrdersStatusChange(orderBean.getOrderCode(),
OrderStatusV1.getOldCode(orderBean.getOrderState()
), orderBean.getPayState());
// orderQueueService.backOrdersStatusChange(orderBean.getOrderCode(),
orderBean.getOrderState(
), orderBean.getPayState());
return
ResponseUtil
.
success
();
return
ResponseUtil
.
success
();
}
}
...
@@ -3440,7 +3439,7 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3440,7 +3439,7 @@ public class OrderServiceImpl implements Orderservice {
* @param orderBean
* @param orderBean
* @return
* @return
*/
*/
private
BaseResponse
couponOrderRefundCheck
(
AssortmentCustomerInfoVo
userLoginInfoDto
,
Order
InfoReqs
orderBean
)
{
private
BaseResponse
couponOrderRefundCheck
(
AssortmentCustomerInfoVo
userLoginInfoDto
,
Order
BeanV1
orderBean
)
{
// 校验是否是用户订单
// 校验是否是用户订单
if
(!
Objects
.
equals
(
userLoginInfoDto
.
getMemberId
(),
orderBean
.
getUserId
()))
{
if
(!
Objects
.
equals
(
userLoginInfoDto
.
getMemberId
(),
orderBean
.
getUserId
()))
{
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"不能操作非本人的订单"
);
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"不能操作非本人的订单"
);
...
@@ -3450,18 +3449,55 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3450,18 +3449,55 @@ public class OrderServiceImpl implements Orderservice {
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"只可操作卖券订单"
);
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"只可操作卖券订单"
);
}
}
// 校验订单状态 卖券订单只有在6已完成状态下 才能退款
// 校验订单状态 卖券订单只有在6已完成状态下 才能退款
if
(
orderBean
.
get
OrderState
().
compareTo
(
OrderStatusV1
.
COMPLETE
.
getV2
Code
())
!=
0
)
{
if
(
orderBean
.
get
Status
().
compareTo
(
OrderStatusV1
.
COMPLETE
.
getV1
Code
())
!=
0
)
{
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"只可操作完成的订单"
);
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"只可操作完成的订单"
);
}
}
// 校验一遍是否有售后单
// 校验一遍是否有售后单
if
(
CollectionUtils
.
isNotEmpty
(
orderBean
.
get
AfterSalesOrder
List
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
orderBean
.
get
Refund
List
()))
{
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"已存在退款申请,请耐心等待处理"
);
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"已存在退款申请,请耐心等待处理"
);
}
}
// fisherman 需要核实一下 是否申请退款,订单主状态还不会变
// fisherman 需要核实一下 是否申请退款,订单主状态还不会变
// fisherman 查询配置是否能退款 未完成
// fisherman 查询配置是否能退款 未完成
return
ResponseUtil
.
success
();
boolean
isTrue
=
this
.
checkRefundButtionBizTypeIs6
(
orderBean
.
getCompanyId
(),
orderBean
.
getBizType
(),
orderBean
.
getStatus
(),
userLoginInfoDto
.
getWxAppId
(),
new
Date
(
orderBean
.
getGmtCreate
()));
if
(
isTrue
)
{
return
ResponseUtil
.
success
();
}
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
.
getCode
(),
"虚拟券退款配置未启用,请联系客服"
);
}
/**
* 校验是否配置了 虚拟券 bizTYpe=6 可以退款
*
* @param partnerId
* @param bizType
* @param orderState
* @param wxAppId
* @param createTime
* @return
*/
private
boolean
checkRefundButtionBizTypeIs6
(
String
partnerId
,
Integer
bizType
,
Integer
orderState
,
String
wxAppId
,
Date
createTime
)
{
if
(
bizType
.
compareTo
(
BizTypeEnum
.
SALE_COUPON
.
getBizType
())
!=
0
||
orderState
.
compareTo
(
OrderStatusV1
.
COMPLETE
.
getV1Code
())
!=
0
)
{
return
false
;
}
String
redisKey
=
MessageFormat
.
format
(
OrderRedisKeyConstant
.
ORDER_REFUND_CONFIG
,
partnerId
,
wxAppId
);
String
hashKey
=
OrderRedisKeyConstant
.
HashKeyForOrderRefundConfig
.
EAT_IN
;
String
configStr
=
redisCache
.
hashGet
(
redisKey
,
hashKey
);
if
(
StringUtils
.
isNotEmpty
(
configStr
))
{
OrderRefundConfigEntity
config
=
JSON
.
parseObject
(
configStr
,
OrderRefundConfigEntity
.
class
);
Integer
couponOrderRefundDayLimit
=
config
.
getCouponOrderRefundDayLimit
();
// 必须配置了, 而且创建时间 不大于 这个时间
if
(
couponOrderRefundDayLimit
!=
null
&&
couponOrderRefundDayLimit
.
compareTo
(
0
)
>
0
)
{
Date
date
=
DateUtil
.
addDays
(
createTime
,
couponOrderRefundDayLimit
);
// 当前时间在 配置时间前面 才可以申请退款
if
(
new
Date
().
before
(
date
))
{
return
true
;
}
}
}
return
false
;
}
}
/**
/**
...
@@ -3470,23 +3506,20 @@ public class OrderServiceImpl implements Orderservice {
...
@@ -3470,23 +3506,20 @@ public class OrderServiceImpl implements Orderservice {
* @param oid
* @param oid
* @return
* @return
*/
*/
private
BaseResponse
<
Order
InfoReqs
>
checkOrderAndGetOrderBean
(
String
oid
)
{
private
BaseResponse
<
Order
BeanV1
>
checkOrderAndGetOrderBean
(
String
oid
)
{
if
(
StringUtils
.
isBlank
(
oid
))
{
if
(
StringUtils
.
isBlank
(
oid
))
{
return
ResponseUtil
.
error
(
ResponseResult
.
ORDER_CODE_EMPTY
);
return
ResponseUtil
.
error
(
ResponseResult
.
ORDER_CODE_EMPTY
);
}
}
BaseQueryOrderRequest
baseQueryOrderRequest
=
new
BaseQueryOrderRequest
();
BaseQueryOrderRequest
baseQueryOrderRequest
=
new
BaseQueryOrderRequest
();
baseQueryOrderRequest
.
setOrderId
(
oid
);
baseQueryOrderRequest
.
setOrderId
(
oid
);
baseQueryOrderRequest
.
setTrackingNo
(
LogThreadLocal
.
getTrackingNo
());
baseQueryOrderRequest
.
setTrackingNo
(
LogThreadLocal
.
getTrackingNo
());
Query
ByCodeResponse
queryOrderByIdResponse
=
orderCenterSdkService
.
queryOrderByIdV2
(
baseQueryOrderRequest
);
Query
OrderByIdResponse
queryOrderByIdResponse
=
orderCenterSdkService
.
queryOrderById
(
baseQueryOrderRequest
);
if
(
queryOrderByIdResponse
==
null
||
queryOrderByIdResponse
.
get
Result
()
==
null
)
{
if
(
queryOrderByIdResponse
==
null
||
queryOrderByIdResponse
.
get
Data
()
==
null
)
{
return
ResponseUtil
.
error
(
ResponseResult
.
ORDER_NOT_EXIST
);
return
ResponseUtil
.
error
(
ResponseResult
.
ORDER_NOT_EXIST
);
}
}
OrderInfoReqs
result
=
queryOrderByIdResponse
.
getResult
();
OrderBeanV1
data
=
queryOrderByIdResponse
.
getData
();
if
(
result
.
getOrderState
().
compareTo
(
OrderStatusV1
.
COMPLETE
.
getV2Code
())
==
0
&&
PayStatus
.
HAVE_PAID
.
getCode
().
equals
(
result
.
getPayState
()))
{
return
ResponseUtil
.
success
(
data
);
return
ResponseUtil
.
success
(
result
);
}
return
ResponseUtil
.
error
(
ResponseResult
.
OPERATE_NOT_SUPPORT
);
}
}
...
...
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