Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-csf
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
xingmin
yd-csf
Commits
363d4114
Commit
363d4114
authored
Jan 21, 2026
by
jianan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新单跟进v2
parent
58804ca6
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
102 additions
and
15 deletions
+102
-15
yd-csf-api/src/main/java/com/yd/csf/api/controller/ApiCommissionExpectedController.java
+9
-1
yd-csf-service/src/main/java/com/yd/csf/service/model/CommissionExpected.java
+0
-2
yd-csf-service/src/main/java/com/yd/csf/service/service/CommissionExpectedService.java
+2
-1
yd-csf-service/src/main/java/com/yd/csf/service/service/impl/CommissionExpectedServiceImpl.java
+90
-10
yd-csf-service/src/main/java/com/yd/csf/service/service/impl/PolicyFollowServiceImpl.java
+1
-1
No files found.
yd-csf-api/src/main/java/com/yd/csf/api/controller/ApiCommissionExpectedController.java
View file @
363d4114
...
@@ -13,7 +13,9 @@ import com.yd.csf.api.dto.ReceivableReportResponse;
...
@@ -13,7 +13,9 @@ import com.yd.csf.api.dto.ReceivableReportResponse;
import
com.yd.csf.service.common.ErrorCode
;
import
com.yd.csf.service.common.ErrorCode
;
import
com.yd.csf.service.dto.*
;
import
com.yd.csf.service.dto.*
;
import
com.yd.csf.service.model.CommissionExpected
;
import
com.yd.csf.service.model.CommissionExpected
;
import
com.yd.csf.service.model.Policy
;
import
com.yd.csf.service.service.CommissionExpectedService
;
import
com.yd.csf.service.service.CommissionExpectedService
;
import
com.yd.csf.service.service.PolicyService
;
import
com.yd.csf.service.vo.CommissionExpectedExportDTO
;
import
com.yd.csf.service.vo.CommissionExpectedExportDTO
;
import
com.yd.csf.service.vo.CommissionExpectedStatisticsVO
;
import
com.yd.csf.service.vo.CommissionExpectedStatisticsVO
;
import
com.yd.csf.service.vo.CommissionExpectedVO
;
import
com.yd.csf.service.vo.CommissionExpectedVO
;
...
@@ -45,6 +47,8 @@ public class ApiCommissionExpectedController {
...
@@ -45,6 +47,8 @@ public class ApiCommissionExpectedController {
@Resource
@Resource
private
CommissionExpectedService
commissionExpectedService
;
private
CommissionExpectedService
commissionExpectedService
;
@Resource
private
PolicyService
policyService
;
/**
/**
* 批量新增预计入账
* 批量新增预计入账
...
@@ -225,8 +229,12 @@ public class ApiCommissionExpectedController {
...
@@ -225,8 +229,12 @@ public class ApiCommissionExpectedController {
if
(
request
==
null
)
{
if
(
request
==
null
)
{
return
Result
.
fail
(
ErrorCode
.
PARAMS_ERROR
.
getCode
(),
ErrorCode
.
PARAMS_ERROR
.
getMessage
());
return
Result
.
fail
(
ErrorCode
.
PARAMS_ERROR
.
getCode
(),
ErrorCode
.
PARAMS_ERROR
.
getMessage
());
}
}
Policy
policy
=
policyService
.
lambdaQuery
().
eq
(
Policy:
:
getPolicyNo
,
request
.
getPolicyNo
()).
one
();
if
(
policy
==
null
)
{
return
Result
.
fail
(
ErrorCode
.
PARAMS_ERROR
.
getCode
(),
"保单不存在"
);
}
commissionExpectedService
.
getExpectedCommissionByProductlaunchId
(
commissionExpectedService
.
getExpectedCommissionByProductlaunchId
(
request
.
getPolicyNo
()
,
policy
,
request
.
getProductLaunchBizId
(),
request
.
getProductLaunchBizId
(),
request
.
getInsuranceCompanyBizId
(),
request
.
getInsuranceCompanyBizId
(),
request
.
getReconciliationCompany
(),
request
.
getReconciliationCompany
(),
...
...
yd-csf-service/src/main/java/com/yd/csf/service/model/CommissionExpected.java
View file @
363d4114
...
@@ -9,9 +9,7 @@ import java.io.Serializable;
...
@@ -9,9 +9,7 @@ import java.io.Serializable;
import
java.math.BigDecimal
;
import
java.math.BigDecimal
;
import
java.util.Date
;
import
java.util.Date
;
import
com.yd.csf.service.vo.FnaVO
;
import
lombok.Data
;
import
lombok.Data
;
import
org.springframework.beans.BeanUtils
;
/**
/**
* 预计来佣表
* 预计来佣表
...
...
yd-csf-service/src/main/java/com/yd/csf/service/service/CommissionExpectedService.java
View file @
363d4114
...
@@ -8,6 +8,7 @@ import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
...
@@ -8,6 +8,7 @@ import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import
com.yd.csf.service.dto.CommissionExpectedUpdateRequest
;
import
com.yd.csf.service.dto.CommissionExpectedUpdateRequest
;
import
com.yd.csf.service.model.CommissionExpected
;
import
com.yd.csf.service.model.CommissionExpected
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
com.yd.csf.service.model.Policy
;
import
com.yd.csf.service.vo.CommissionExpectedStatisticsVO
;
import
com.yd.csf.service.vo.CommissionExpectedStatisticsVO
;
import
com.yd.csf.service.vo.CommissionExpectedVO
;
import
com.yd.csf.service.vo.CommissionExpectedVO
;
import
com.yd.csf.service.vo.ReceivableReportVO
;
import
com.yd.csf.service.vo.ReceivableReportVO
;
...
@@ -59,7 +60,7 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
...
@@ -59,7 +60,7 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
CommissionExpected
getByBizId
(
String
commissionExpectedBizId
);
CommissionExpected
getByBizId
(
String
commissionExpectedBizId
);
void
getExpectedCommissionByProductlaunchId
(
String
policyNo
,
String
productLaunchBizId
,
String
insuranceCompanyBizId
,
String
reconciliationCompany
,
String
reconciliationCompanyCode
,
String
reconciliationCompanyBizId
);
void
getExpectedCommissionByProductlaunchId
(
Policy
policy
,
String
productLaunchBizId
,
String
insuranceCompanyBizId
,
String
reconciliationCompany
,
String
reconciliationCompanyCode
,
String
reconciliationCompanyBizId
);
/**
/**
* 应收款报表 - 按保单号和期数维度统计(分页)
* 应收款报表 - 按保单号和期数维度统计(分页)
...
...
yd-csf-service/src/main/java/com/yd/csf/service/service/impl/CommissionExpectedServiceImpl.java
View file @
363d4114
...
@@ -7,17 +7,19 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
...
@@ -7,17 +7,19 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.yd.common.constant.CommonConstant
;
import
com.yd.common.constant.CommonConstant
;
import
com.yd.common.constant.RedisConstants
;
import
com.yd.common.enums.DictTypeEnum
;
import
com.yd.common.enums.ResultCode
;
import
com.yd.common.enums.ResultCode
;
import
com.yd.common.exception.BusinessException
;
import
com.yd.common.exception.BusinessException
;
import
com.yd.common.result.Result
;
import
com.yd.common.result.Result
;
import
com.yd.common.utils.RandomStringGenerator
;
import
com.yd.common.utils.RandomStringGenerator
;
import
com.yd.common.utils.RedisUtil
;
import
com.yd.csf.service.component.ReceivableService
;
import
com.yd.csf.service.component.ReceivableService
;
import
com.yd.csf.service.dto.*
;
import
com.yd.csf.service.dto.*
;
import
com.yd.csf.service.enums.CommissionExpectedStatusEnum
;
import
com.yd.csf.service.enums.CommissionExpectedStatusEnum
;
import
com.yd.csf.service.model.Commission
;
import
com.yd.csf.service.model.Commission
;
import
com.yd.csf.service.model.CommissionExpected
;
import
com.yd.csf.service.model.CommissionExpected
;
import
com.yd.csf.service.model.Policy
;
import
com.yd.csf.service.model.Policy
;
import
com.yd.csf.service.model.PolicyFollow
;
import
com.yd.csf.service.service.*
;
import
com.yd.csf.service.service.*
;
import
com.yd.csf.service.dao.CommissionExpectedMapper
;
import
com.yd.csf.service.dao.CommissionExpectedMapper
;
import
com.yd.csf.service.vo.CommissionExpectedStatisticsVO
;
import
com.yd.csf.service.vo.CommissionExpectedStatisticsVO
;
...
@@ -28,9 +30,7 @@ import com.yd.product.feign.request.expectedspecies.ApiExpectedSpeciesListReques
...
@@ -28,9 +30,7 @@ import com.yd.product.feign.request.expectedspecies.ApiExpectedSpeciesListReques
import
com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse
;
import
com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse
;
import
com.yd.user.feign.client.sysdict.ApiSysDictFeignClient
;
import
com.yd.user.feign.client.sysdict.ApiSysDictFeignClient
;
import
com.yd.user.feign.response.sysdict.GetDictItemListByDictTypeResponse
;
import
com.yd.user.feign.response.sysdict.GetDictItemListByDictTypeResponse
;
import
com.yd.user.service.model.SysDictItem
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.MapUtils
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.BeanUtils
;
...
@@ -66,6 +66,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
...
@@ -66,6 +66,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
private
ApiSysDictFeignClient
apiSysDictFeignClient
;
private
ApiSysDictFeignClient
apiSysDictFeignClient
;
@Resource
@Resource
private
ApiExpectedSpeciesFeignClient
apiExpectedSpeciesFeignClient
;
private
ApiExpectedSpeciesFeignClient
apiExpectedSpeciesFeignClient
;
@Resource
private
RedisUtil
redisUtil
;
@Override
@Override
...
@@ -466,8 +468,23 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
...
@@ -466,8 +468,23 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
@Override
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
getExpectedCommissionByProductlaunchId
(
String
policyNo
,
String
productLaunchBizId
,
public
void
getExpectedCommissionByProductlaunchId
(
Policy
policy
,
String
productLaunchBizId
,
String
insuranceCompanyBizId
,
String
reconciliationCompany
,
String
reconciliationCompanyCode
,
String
reconciliationCompanyBizId
)
{
String
insuranceCompanyBizId
,
String
reconciliationCompany
,
String
reconciliationCompanyCode
,
String
reconciliationCompanyBizId
)
{
String
policyNo
=
policy
.
getPolicyNo
();
if
(
ObjectUtils
.
isEmpty
(
policyNo
))
{
throw
new
BusinessException
(
"保单号不能为空"
);
}
BigDecimal
paymentPremium
=
policy
.
getPaymentPremium
();
if
(
paymentPremium
==
null
)
{
throw
new
BusinessException
(
"保费不能为空"
);
}
Date
effectiveDate
=
policy
.
getEffectiveDate
();
if
(
effectiveDate
==
null
)
{
throw
new
BusinessException
(
"保单生效日期不能为空"
);
}
//查询redis缓存的字典列表信息
List
<
GetDictItemListByDictTypeResponse
>
dictTypeResponses
=
redisUtil
.
getCacheObject
(
RedisConstants
.
DICT_LIST
);
if
(
StringUtils
.
isNotBlank
(
productLaunchBizId
))
{
if
(
StringUtils
.
isNotBlank
(
productLaunchBizId
))
{
ApiExpectedSpeciesListRequest
apiExpectedSpeciesListRequest
=
new
ApiExpectedSpeciesListRequest
();
ApiExpectedSpeciesListRequest
apiExpectedSpeciesListRequest
=
new
ApiExpectedSpeciesListRequest
();
apiExpectedSpeciesListRequest
.
setProductLaunchBizId
(
productLaunchBizId
);
apiExpectedSpeciesListRequest
.
setProductLaunchBizId
(
productLaunchBizId
);
...
@@ -476,12 +493,19 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
...
@@ -476,12 +493,19 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
List
<
ApiExpectedSpeciesListResponse
>
expectedSpeciesList
=
result
.
getData
();
List
<
ApiExpectedSpeciesListResponse
>
expectedSpeciesList
=
result
.
getData
();
List
<
CommissionExpected
>
commissionExpectedList
=
new
ArrayList
<>();
List
<
CommissionExpected
>
commissionExpectedList
=
new
ArrayList
<>();
if
(
CollUtil
.
isNotEmpty
(
expectedSpeciesList
))
{
if
(
CollUtil
.
isNotEmpty
(
expectedSpeciesList
))
{
// 计算佣金总期数 list 中 endPeriod最大值
Integer
maxEndPeriod
=
expectedSpeciesList
.
stream
()
.
map
(
item
->
Convert
.
toInt
(
item
.
getEndPeriod
()))
.
max
(
Integer:
:
compareTo
)
.
orElse
(
0
);
for
(
ApiExpectedSpeciesListResponse
item
:
expectedSpeciesList
)
{
for
(
ApiExpectedSpeciesListResponse
item
:
expectedSpeciesList
)
{
CommissionExpected
commissionExpected
=
new
CommissionExpected
();
CommissionExpected
commissionExpected
=
new
CommissionExpected
();
commissionExpected
.
setCommissionExpectedBizId
(
RandomStringGenerator
.
generateBizId16
(
"commission_expected"
));
commissionExpected
.
setCommissionExpectedBizId
(
RandomStringGenerator
.
generateBizId16
(
"commission_expected"
));
commissionExpected
.
setReceivableNo
(
receivableService
.
generateReceivableNo
(
"R"
,
reconciliationCompanyCode
,
reconciliationCompany
));
commissionExpected
.
setReceivableNo
(
receivableService
.
generateReceivableNo
(
"R"
,
reconciliationCompanyCode
,
reconciliationCompany
));
commissionExpected
.
setCommissionBizType
(
"R"
);
commissionExpected
.
setCommissionBizType
(
"R"
);
commissionExpected
.
setPolicyNo
(
policyNo
);
commissionExpected
.
setPolicyNo
(
policyNo
);
commissionExpected
.
setPremium
(
paymentPremium
);
commissionExpected
.
setInsuranceCompanyBizId
(
insuranceCompanyBizId
);
commissionExpected
.
setInsuranceCompanyBizId
(
insuranceCompanyBizId
);
commissionExpected
.
setProductLaunchBizId
(
productLaunchBizId
);
commissionExpected
.
setProductLaunchBizId
(
productLaunchBizId
);
commissionExpected
.
setReconciliationCompany
(
reconciliationCompany
);
commissionExpected
.
setReconciliationCompany
(
reconciliationCompany
);
...
@@ -489,19 +513,25 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
...
@@ -489,19 +513,25 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
commissionExpected
.
setReconciliationCompanyBizId
(
reconciliationCompanyBizId
);
commissionExpected
.
setReconciliationCompanyBizId
(
reconciliationCompanyBizId
);
commissionExpected
.
setCommissionPeriod
(
Convert
.
toInt
(
item
.
getIssueNumber
()));
commissionExpected
.
setCommissionPeriod
(
Convert
.
toInt
(
item
.
getIssueNumber
()));
commissionExpected
.
setTotalPeriod
(
Convert
.
toInt
(
item
.
getEndPeriod
()));
commissionExpected
.
setTotalPeriod
(
Convert
.
toInt
(
item
.
getEndPeriod
()));
commissionExpected
.
setCommissionName
(
item
.
getExpenseName
());
commissionExpected
.
setCommissionName
(
GetDictItemListByDictTypeResponse
.
getItemLabel
(
dictTypeResponses
,
"csf_commission_type"
,
item
.
getExpenseName
()));
commissionExpected
.
setCommissionType
(
item
.
getExpenseName
());
commissionExpected
.
setCommissionType
(
item
.
getExpenseName
());
commissionExpected
.
setCommissionRatio
(
item
.
getCommissionRate
());
commissionExpected
.
setCommissionRatio
(
item
.
getCommissionRate
());
commissionExpected
.
setAmount
(
null
);
commissionExpected
.
setAmount
(
null
);
commissionExpected
.
setCurrency
(
item
.
getCurrency
());
commissionExpected
.
setCurrency
(
item
.
getCurrency
());
commissionExpected
.
setCommissionDate
(
new
Date
());
commissionExpected
.
setCommissionDate
(
calculateCommissionDate
(
item
.
getEndPeriod
(),
effectiveDate
));
commissionExpected
.
setActualCommissionDate
(
new
Date
());
commissionExpected
.
setStatus
(
CommissionExpectedStatusEnum
.
PENDING
.
getItemValue
());
commissionExpected
.
setStatus
(
CommissionExpectedStatusEnum
.
PENDING
.
getItemValue
());
commissionExpected
.
setStatusDesc
(
null
);
commissionExpected
.
setStatusDesc
(
null
);
commissionExpected
.
setDefaultExchangeRate
(
queryDefaultExchangeRate
(
item
.
getCurrency
()));
commissionExpected
.
setDefaultExchangeRate
(
queryDefaultExchangeRate
(
item
.
getCurrency
()));
commissionExpected
.
setExpectedAmount
(
null
);
commissionExpected
.
setExpectedAmount
(
calculateExpectedAmount
(
commissionExpected
.
setPaidAmount
(
null
);
paymentPremium
,
commissionExpected
.
setPaidRatio
(
null
);
item
.
getCommissionRate
(),
"R"
,
null
,
item
.
getCurrency
(),
commissionExpected
.
getDefaultExchangeRate
()));
commissionExpected
.
setPaidAmount
(
BigDecimal
.
ZERO
);
commissionExpected
.
setPaidRatio
(
BigDecimal
.
ZERO
);
commissionExpected
.
setRemark
(
""
);
commissionExpected
.
setRemark
(
""
);
commissionExpected
.
setIsDeleted
(
0
);
commissionExpected
.
setIsDeleted
(
0
);
commissionExpected
.
setCreatorId
(
""
);
commissionExpected
.
setCreatorId
(
""
);
...
@@ -518,6 +548,56 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
...
@@ -518,6 +548,56 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
}
}
}
}
private
BigDecimal
calculateExpectedAmount
(
BigDecimal
premium
,
BigDecimal
commissionRatio
,
String
commissionBizType
,
BigDecimal
amount
,
String
currency
,
BigDecimal
defaultExchangeRate
)
{
if
(
"R"
.
equals
(
commissionBizType
))
{
// 关联保单应收单:保费 × 佣金比例 × 默认结算汇率 ÷ 100
BigDecimal
exchangeRate
=
defaultExchangeRate
;
if
(
exchangeRate
==
null
)
{
exchangeRate
=
queryDefaultExchangeRate
(
currency
);
}
return
premium
.
multiply
(
commissionRatio
)
.
multiply
(
exchangeRate
)
.
divide
(
BigDecimal
.
valueOf
(
100
),
4
,
RoundingMode
.
HALF_UP
);
}
else
{
// 非关联保单应收单:金额 × 默认结算汇率
BigDecimal
exchangeRate
=
defaultExchangeRate
;
if
(
exchangeRate
==
null
)
{
exchangeRate
=
queryDefaultExchangeRate
(
currency
);
}
return
amount
.
multiply
(
exchangeRate
);
}
}
/**
* 根据保单生效日期和佣金期数计算预计来佣日期,首期为保单生效日次月,后续期数为首期的次年
* @param endPeriod 佣金期数
* @param effectiveDate 保单生效日期
* @return 预计来佣日期
*/
private
Date
calculateCommissionDate
(
String
endPeriod
,
Date
effectiveDate
)
{
if
(
effectiveDate
==
null
||
StringUtils
.
isBlank
(
endPeriod
))
{
return
null
;
}
Calendar
cal
=
Calendar
.
getInstance
();
cal
.
setTime
(
effectiveDate
);
// 首期:保单生效日次月
cal
.
add
(
Calendar
.
MONTH
,
1
);
Integer
period
=
Convert
.
toInt
(
endPeriod
);
if
(
period
==
null
||
period
<=
0
)
{
return
cal
.
getTime
();
}
// 后续期数:在首期基础上增加 (period - 1) 年
// 例如:第2期为首期次年,第3期为首期+2年
cal
.
add
(
Calendar
.
YEAR
,
period
-
1
);
return
cal
.
getTime
();
}
@Override
@Override
public
IPage
<
ReceivableReportVO
>
receivableReportPage
(
Page
<
ReceivableReportVO
>
page
,
List
<
Long
>
expectedIds
)
{
public
IPage
<
ReceivableReportVO
>
receivableReportPage
(
Page
<
ReceivableReportVO
>
page
,
List
<
Long
>
expectedIds
)
{
return
baseMapper
.
receivableReportPage
(
page
,
expectedIds
);
return
baseMapper
.
receivableReportPage
(
page
,
expectedIds
);
...
...
yd-csf-service/src/main/java/com/yd/csf/service/service/impl/PolicyFollowServiceImpl.java
View file @
363d4114
...
@@ -827,7 +827,7 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
...
@@ -827,7 +827,7 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
// 调用预计入账服务生成记录
// 调用预计入账服务生成记录
commissionExpectedService
.
getExpectedCommissionByProductlaunchId
(
commissionExpectedService
.
getExpectedCommissionByProductlaunchId
(
policy
No
,
policy
,
productLaunchBizId
,
productLaunchBizId
,
insuranceCompanyBizId
,
insuranceCompanyBizId
,
reconciliationCompany
,
reconciliationCompany
,
...
...
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