Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
service-campaign
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nguyen Ha
service-campaign
Commits
9be1cbc9
Commit
9be1cbc9
authored
Aug 21, 2019
by
Vu Duy Anh
Browse files
Options
Browse Files
Download
Plain Diff
anhvd accept merge
parents
f819903b
1d26b209
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
162 additions
and
99 deletions
+162
-99
src/main/java/com/viettel/campaign/repository/ccms_full/CampaignCustomerRepository.java
...aign/repository/ccms_full/CampaignCustomerRepository.java
+17
-19
src/main/java/com/viettel/campaign/repository/ccms_full/CampaignExecuteRepository.java
...paign/repository/ccms_full/CampaignExecuteRepository.java
+2
-5
src/main/java/com/viettel/campaign/repository/ccms_full/impl/CampaignExecuteRepositoryImp.java
...pository/ccms_full/impl/CampaignExecuteRepositoryImp.java
+37
-32
src/main/java/com/viettel/campaign/repository/ccms_full/impl/CampaignRepositoryImpl.java
...ign/repository/ccms_full/impl/CampaignRepositoryImpl.java
+2
-2
src/main/java/com/viettel/campaign/service/CampaignExecuteService.java
.../com/viettel/campaign/service/CampaignExecuteService.java
+3
-0
src/main/java/com/viettel/campaign/service/CampaignService.java
...in/java/com/viettel/campaign/service/CampaignService.java
+1
-2
src/main/java/com/viettel/campaign/service/impl/CampaignExecuteServiceImp.java
...ttel/campaign/service/impl/CampaignExecuteServiceImp.java
+37
-3
src/main/java/com/viettel/campaign/service/impl/CampaignServiceImpl.java
...om/viettel/campaign/service/impl/CampaignServiceImpl.java
+4
-20
src/main/java/com/viettel/campaign/web/dto/ContactCusResDTO.java
...n/java/com/viettel/campaign/web/dto/ContactCusResDTO.java
+30
-0
src/main/java/com/viettel/campaign/web/dto/FieldsToShowDTO.java
...in/java/com/viettel/campaign/web/dto/FieldsToShowDTO.java
+7
-7
src/main/java/com/viettel/campaign/web/rest/CampaignController.java
...ava/com/viettel/campaign/web/rest/CampaignController.java
+14
-7
src/main/resources/i18n/language_en.properties
src/main/resources/i18n/language_en.properties
+3
-0
src/main/resources/i18n/language_vi.properties
src/main/resources/i18n/language_vi.properties
+3
-0
src/main/resources/sql/campaign-mng/get-list-fields-not-show.sql
...n/resources/sql/campaign-mng/get-list-fields-not-show.sql
+1
-1
src/main/resources/sql/campaign-mng/get-list-fields-to-show.sql
...in/resources/sql/campaign-mng/get-list-fields-to-show.sql
+1
-1
No files found.
src/main/java/com/viettel/campaign/repository/ccms_full/CampaignCustomerRepository.java
View file @
9be1cbc9
...
...
@@ -13,28 +13,26 @@ import java.util.List;
@Repository
@Transactional
(
DataSourceQualify
.
CCMS_FULL
)
public
interface
CampaignCustomerRepository
extends
JpaRepository
<
CampaignCustomer
,
Long
>,
CampaignCustomerRepositoryCustom
{
@Query
(
value
=
"SELECT COUNT(*) "
+
" FROM CAMPAIGN_CUSTOMER CC "
+
" JOIN CAMPAIGN C ON CC.CAMPAIGN_ID = C.CAMPAIGN_ID "
+
" LEFT JOIN CAMPAIGN_COMPLETE_CODE CCC ON CC.STATUS = CCC.COMPLETE_VALUE"
+
" WHERE CC.COMPANY_SITE_ID = :companySiteId "
+
" AND CC.AGENT_ID = :agentId"
+
" AND C.STATUS = 2 "
+
" AND CC.RECALL_TIME <= SYSDATE "
+
" AND CCC.IS_RECALL = 1"
,
nativeQuery
=
true
)
Long
countRecallCustomer
(
@Param
(
"companySiteId"
)
Long
pCompanySiteId
,
@Param
(
"agentId"
)
Long
agentId
);
@Query
(
value
=
"SELECT COUNT(*) "
+
"FROM CAMPAIGN_CUSTOMER CC JOIN CAMPAIGN_COMPLETE_CODE CCC ON CC.CAMPAIGN_ID = CCC.CAMPAIGN_ID "
+
"WHERE CC.STATUS = 3 AND CC.CAMPAIGN_ID = :campaignId AND CC.CUSTOMER_ID = :customerId AND CCC.IS_RECALL = 1 AND CCC.STATUS = 1 "
,
nativeQuery
=
true
)
"WHERE CC.CAMPAIGN_ID = :campaignId "
+
"AND CC.CUSTOMER_ID = :customerId "
+
"AND CC.STATUS = 3 "
+
"AND CCC.IS_RECALL = 1 "
+
"AND CCC.STATUS = 1 "
,
nativeQuery
=
true
)
Long
getCustomerRecall
(
@Param
(
"campaignId"
)
Long
campaignId
,
@Param
(
"customerId"
)
Long
customerId
);
@Query
(
value
=
"SELECT cc.customer_id \n"
+
"FROM campaign_customer cc LEFT JOIN receive_cust_log cl ON cc.customer_id = cl.customer_id\n"
+
"WHERE cc.campaign_id = :campaignId \n"
+
" AND cc.agent_id = :agentId \n"
+
" AND cc.in_campaign_status = 1 \n"
+
" AND cl.customer_id IS NULL \n"
+
" AND EXISTS(SELECT 1 \n"
+
" FROM campaign_complete_code ccc \n"
+
" WHERE cc.status = ccc.complete_value \n"
+
" AND ccc.status = 1 \n"
+
" AND ccc.is_recall = 1 \n"
+
" AND ccc.complete_type = 2 \n"
+
" AND ccc.company_site_id = :companySiteId) \n"
+
" AND cc.recall_time <= SYSDATE\n"
+
" AND cc.recall_time + interval :apParam MINUTE >= SYSDATE"
,
nativeQuery
=
true
)
List
<
CampaignCustomer
>
getCustomerRecallDate
(
@Param
(
"campaignId"
)
Long
campaignId
,
@Param
(
"agentId"
)
Long
agentId
,
@Param
(
"companySiteId"
)
Long
companySiteId
,
@Param
(
"apParam"
)
String
apParam
);
CampaignCustomer
findCampaignCustomerByCampaignCustomerId
(
Long
id
);
}
src/main/java/com/viettel/campaign/repository/ccms_full/CampaignExecuteRepository.java
View file @
9be1cbc9
package
com.viettel.campaign.repository.ccms_full
;
import
com.viettel.campaign.web.dto.ApParamDTO
;
import
com.viettel.campaign.web.dto.CampaignDTO
;
import
com.viettel.campaign.web.dto.ContactCustResultDTO
;
import
com.viettel.campaign.web.dto.ResultDTO
;
import
com.viettel.campaign.web.dto.*
;
import
com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.stereotype.Repository
;
...
...
@@ -23,7 +20,7 @@ public interface CampaignExecuteRepository {
ResultDTO
getInteractiveResult
(
CampaignRequestDTO
dto
);
List
<
ContactCus
tResult
DTO
>
getExcelInteractiveResult
(
CampaignRequestDTO
dto
);
List
<
ContactCus
Res
DTO
>
getExcelInteractiveResult
(
CampaignRequestDTO
dto
);
List
<
ContactCustResultDTO
>
getContactCustById
(
CampaignRequestDTO
dto
);
//</editor-fold: hungtt>
...
...
src/main/java/com/viettel/campaign/repository/ccms_full/impl/CampaignExecuteRepositoryImp.java
View file @
9be1cbc9
This diff is collapsed.
Click to expand it.
src/main/java/com/viettel/campaign/repository/ccms_full/impl/CampaignRepositoryImpl.java
View file @
9be1cbc9
...
...
@@ -519,7 +519,7 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
stringBuilder
.
append
(
" where table_name = 'CUSTOMER'"
);
stringBuilder
.
append
(
" )"
);
stringBuilder
.
append
(
" select * from column_name_temp"
);
stringBuilder
.
append
(
" where columnName not in (select column_name from campaign_customerlist_column)"
);
stringBuilder
.
append
(
" where columnName not in (select column_name from campaign_customerlist_column
where column_name is not null
)"
);
stringBuilder
.
append
(
" union all"
);
stringBuilder
.
append
(
" select title columnName, 0 isFix "
);
stringBuilder
.
append
(
" from customize_fields, dual"
);
...
...
@@ -553,7 +553,7 @@ public class CampaignRepositoryImpl implements CampaignRepositoryCustom {
// String sql = SQLBuilder.getSqlQueryById(SQLBuilder.SQL_MODULE_CAMPAIGN_MNG, "get-list-fields-to-show");
sqlBuilder
.
append
(
" select to_char(column_name) columnName, 1 isFix"
);
sqlBuilder
.
append
(
" from campaign_customerlist_column, dual"
);
sqlBuilder
.
append
(
" where campaign_id = :p_campaign_id"
);
sqlBuilder
.
append
(
" where campaign_id = :p_campaign_id
and column_name is not null
"
);
sqlBuilder
.
append
(
" union all"
);
sqlBuilder
.
append
(
" select customize_field_title columnName, 0 isFix"
);
sqlBuilder
.
append
(
" from campaign_customerlist_column"
);
...
...
src/main/java/com/viettel/campaign/service/CampaignExecuteService.java
View file @
9be1cbc9
...
...
@@ -36,4 +36,7 @@ public interface CampaignExecuteService {
ResultDTO
callCustomer
(
ContactCustResultDTO
dto
);
ResultDTO
countRecallCustomer
(
Long
companySiteId
,
Long
agentId
);
ResultDTO
getCustomerRecall
(
Long
campaignId
,
Long
customerId
);
}
src/main/java/com/viettel/campaign/service/CampaignService.java
View file @
9be1cbc9
...
...
@@ -30,8 +30,6 @@ public interface CampaignService {
ResultDTO
addNewCampaign
(
CampaignDTO
campaignDTO
);
Map
countRecallCustomer
(
Long
companySiteId
,
Long
agentId
);
ResultDTO
findCampaignById
(
Long
campaignId
);
ResultDTO
changeCampaignStatus
(
CampaignDTO
dto
);
...
...
@@ -57,4 +55,5 @@ public interface CampaignService {
ResultDTO
getListFieldsToShow
(
CampaignRequestDTO
dto
);
//</editor-fold>
}
src/main/java/com/viettel/campaign/service/impl/CampaignExecuteServiceImp.java
View file @
9be1cbc9
...
...
@@ -110,7 +110,7 @@ public class CampaignExecuteServiceImp implements CampaignExecuteService {
@Transactional
(
DataSourceQualify
.
CCMS_FULL
)
public
XSSFWorkbook
exportInteractiveResult
(
CampaignRequestDTO
dto
)
{
Locale
locale
=
Locale
.
forLanguageTag
(
"vi"
);
List
<
ContactCus
tResult
DTO
>
list
=
campaignExecuteRepository
.
getExcelInteractiveResult
(
dto
);
List
<
ContactCus
Res
DTO
>
list
=
campaignExecuteRepository
.
getExcelInteractiveResult
(
dto
);
XSSFWorkbook
workbook
=
new
XSSFWorkbook
();
Sheet
sheet
;
...
...
@@ -194,9 +194,9 @@ public class CampaignExecuteServiceImp implements CampaignExecuteService {
writeCellContent
(
row
,
styleRow
,
col
++,
rowIndex
);
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
getCampaignCode
());
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
getCampaignName
());
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
get
AgentId
());
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
get
UserName
());
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
getPhoneNumber
());
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
getCustomer
Id
());
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
getCustomer
Name
());
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
getCustomerName
());
writeCellContent
(
row
,
styleRow
,
col
++,
formatter
.
format
(
list
.
get
(
i
).
getCreateTime
()));
writeCellContent
(
row
,
styleRow
,
col
++,
list
.
get
(
i
).
getContactStatus
());
...
...
@@ -495,4 +495,38 @@ public class CampaignExecuteServiceImp implements CampaignExecuteService {
return
result
;
}
@Transactional
(
DataSourceQualify
.
CCMS_FULL
)
public
ResultDTO
countRecallCustomer
(
Long
companySiteId
,
Long
agentId
)
{
Long
count
=
campaignCustomerRepository
.
countRecallCustomer
(
companySiteId
,
agentId
);
ResultDTO
resultDTO
=
new
ResultDTO
();
if
(
count
!=
null
)
{
resultDTO
.
setErrorCode
(
Constants
.
ApiErrorCode
.
SUCCESS
);
resultDTO
.
setDescription
(
Constants
.
ApiErrorDesc
.
SUCCESS
);
resultDTO
.
setData
(
count
);
}
else
{
resultDTO
.
setErrorCode
(
Constants
.
ApiErrorCode
.
ERROR
);
resultDTO
.
setDescription
(
Constants
.
ApiErrorDesc
.
ERROR
);
resultDTO
.
setData
(
0
);
}
return
resultDTO
;
}
@Transactional
(
DataSourceQualify
.
CCMS_FULL
)
public
ResultDTO
getCustomerRecall
(
Long
campaignId
,
Long
customerId
)
{
Long
count
=
campaignCustomerRepository
.
getCustomerRecall
(
campaignId
,
customerId
);
ResultDTO
resultDTO
=
new
ResultDTO
();
if
(
count
!=
null
)
{
resultDTO
.
setErrorCode
(
Constants
.
ApiErrorCode
.
SUCCESS
);
resultDTO
.
setDescription
(
Constants
.
ApiErrorDesc
.
SUCCESS
);
resultDTO
.
setData
(
count
);
}
else
{
resultDTO
.
setErrorCode
(
Constants
.
ApiErrorCode
.
ERROR
);
resultDTO
.
setDescription
(
Constants
.
ApiErrorDesc
.
ERROR
);
resultDTO
.
setData
(
0
);
}
return
resultDTO
;
}
}
src/main/java/com/viettel/campaign/service/impl/CampaignServiceImpl.java
View file @
9be1cbc9
...
...
@@ -28,6 +28,7 @@ import java.util.HashMap;
import
java.util.List
;
import
java.util.Map
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Service
@Transactional
(
rollbackFor
=
Exception
.
class
)
...
...
@@ -170,26 +171,6 @@ public class CampaignServiceImpl implements CampaignService {
return
resultDTO
;
}
@Transactional
(
DataSourceQualify
.
CCMS_FULL
)
public
Map
countRecallCustomer
(
Long
companySiteId
,
Long
agentId
)
{
Map
result
=
new
HashMap
();
Long
count
=
campaignRepository
.
countRecallCustomer
(
companySiteId
,
agentId
);
ResultDTO
resultDTO
=
new
ResultDTO
();
if
(
count
!=
null
)
{
resultDTO
.
setErrorCode
(
Constants
.
ApiErrorCode
.
SUCCESS
);
resultDTO
.
setDescription
(
Constants
.
ApiErrorDesc
.
SUCCESS
);
result
.
put
(
"info"
,
resultDTO
);
result
.
put
(
"result"
,
count
);
}
else
{
resultDTO
.
setErrorCode
(
Constants
.
ApiErrorCode
.
ERROR
);
resultDTO
.
setDescription
(
Constants
.
ApiErrorDesc
.
ERROR
);
result
.
put
(
"info"
,
resultDTO
);
result
.
put
(
"result"
,
0
);
}
return
result
;
}
@Override
@Transactional
(
DataSourceQualify
.
CCMS_FULL
)
public
ResultDTO
findCampaignById
(
Long
campaignId
)
{
...
...
@@ -524,6 +505,9 @@ public class CampaignServiceImpl implements CampaignService {
mapColumn
.
put
(
"EMAIL_ALLOWED"
,
BundleUtils
.
getLangString
(
"EMAIL_ALLOWED"
,
locale
));
mapColumn
.
put
(
"SMS_ALLOWED"
,
BundleUtils
.
getLangString
(
"SMS_ALLOWED"
,
locale
));
mapColumn
.
put
(
"IPCC_STATUS"
,
BundleUtils
.
getLangString
(
"IPCC_STATUS"
,
locale
));
mapColumn
.
put
(
"EMAIL"
,
BundleUtils
.
getLangString
(
"EMAIL"
,
locale
));
mapColumn
.
put
(
"CUSTOMER_TYPE"
,
BundleUtils
.
getLangString
(
"CUSTOMER_TYPE"
,
locale
));
mapColumn
.
put
(
"AVATAR_LINK"
,
BundleUtils
.
getLangString
(
"AVATAR_LINK"
,
locale
));
return
mapColumn
;
}
private
String
generateCampaignCode
(
String
campaignType
,
Short
chanel
)
{
...
...
src/main/java/com/viettel/campaign/web/dto/ContactCusResDTO.java
0 → 100644
View file @
9be1cbc9
package
com.viettel.campaign.web.dto
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
lombok.NoArgsConstructor
;
import
lombok.Setter
;
import
java.io.Serializable
;
import
java.util.Date
;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public
class
ContactCusResDTO
implements
Serializable
{
private
Long
contactCustResultId
;
private
String
campaignCode
;
private
String
campaignName
;
private
String
userName
;
private
String
phoneNumber
;
private
String
customerName
;
private
Date
startCall
;
private
Date
createTime
;
private
String
contactStatus
;
private
String
surveyStatus
;
private
String
status
;
private
String
recordStatus
;
private
Long
callTime
;
private
Boolean
enableEdit
;
}
src/main/java/com/viettel/campaign/web/dto/FieldsToShowDTO.java
View file @
9be1cbc9
...
...
@@ -11,23 +11,23 @@ import java.io.Serializable;
@Setter
@NoArgsConstructor
@AllArgsConstructor
public
class
FieldsToShowDTO
extends
BaseDTO
implements
Serializable
{
public
class
FieldsToShowDTO
implements
Serializable
{
private
Long
campaignCusListColId
;
//
private Long campaignCusListColId;
private
Long
companySiteId
;
//
private Long companySiteId;
private
Long
campaignId
;
//
private Long campaignId;
private
String
columnName
;
private
String
columnTitle
;
private
Long
orderIndex
;
//
private Long orderIndex;
private
Long
customizeFieldId
;
//
private Long customizeFieldId;
private
String
customizeFieldTitle
;
//
private String customizeFieldTitle;
private
Boolean
isFix
;
}
src/main/java/com/viettel/campaign/web/rest/CampaignController.java
View file @
9be1cbc9
...
...
@@ -96,13 +96,6 @@ public class CampaignController {
return
campaignService
.
addNewCampaign
(
dto
);
}
@GetMapping
(
"/countRecallCustomer"
)
@ResponseBody
public
ResponseEntity
countRecallCustomer
(
@RequestParam
(
"companySiteId"
)
Long
companySiteId
,
@RequestParam
(
"agentId"
)
Long
agentId
)
{
Map
result
=
campaignService
.
countRecallCustomer
(
companySiteId
,
agentId
);
return
new
ResponseEntity
<>(
result
,
HttpStatus
.
OK
);
}
@GetMapping
(
"/findByCampaignId"
)
@ResponseBody
public
ResponseEntity
findByCampaignId
(
@RequestParam
(
"campaignId"
)
Long
campaignId
)
{
...
...
@@ -240,4 +233,18 @@ public class CampaignController {
ResultDTO
resultDTO
=
campaignService
.
getListFieldsToShow
(
dto
);
return
new
ResponseEntity
<>(
resultDTO
,
HttpStatus
.
OK
);
}
@GetMapping
(
"/countRecallCustomer"
)
@ResponseBody
public
ResponseEntity
countRecallCustomer
(
@RequestParam
(
"companySiteId"
)
Long
companySiteId
,
@RequestParam
(
"agentId"
)
Long
agentId
)
{
ResultDTO
result
=
campaignExecuteService
.
countRecallCustomer
(
companySiteId
,
agentId
);
return
new
ResponseEntity
<>(
result
,
HttpStatus
.
OK
);
}
@GetMapping
(
"/getCustomerRecall"
)
@ResponseBody
public
ResponseEntity
getCustomerRecall
(
@RequestParam
(
"campaignId"
)
Long
campaignId
,
@RequestParam
(
"customerId"
)
Long
customerId
)
{
ResultDTO
result
=
campaignExecuteService
.
getCustomerRecall
(
campaignId
,
customerId
);
return
new
ResponseEntity
<>(
result
,
HttpStatus
.
OK
);
}
}
src/main/resources/i18n/language_en.properties
View file @
9be1cbc9
...
...
@@ -64,3 +64,6 @@ CALL_ALLOWED = CALL_ALLOWED
EMAIL_ALLOWED
=
EMAIL_ALLOWED
SMS_ALLOWED
=
SMS_ALLOWED
IPCC_STATUS
=
IPCC_STATUS
EMAIL
=
EMAIL
CUSTOMER_TYPE
=
CUSTOMER_TYPE
AVATAR_LINK
=
AVATAR_LINK
src/main/resources/i18n/language_vi.properties
View file @
9be1cbc9
...
...
@@ -66,3 +66,6 @@ CALL_ALLOWED = CALL_ALLOWED
EMAIL_ALLOWED
=
EMAIL_ALLOWED
SMS_ALLOWED
=
SMS_ALLOWED
IPCC_STATUS
=
IPCC_STATUS
EMAIL
=
EMAIL
CUSTOMER_TYPE
=
CUSTOMER_TYPE
AVATAR_LINK
=
AVATAR_LINK
src/main/resources/sql/campaign-mng/get-list-fields-not-show.sql
View file @
9be1cbc9
...
...
@@ -2,7 +2,7 @@ with column_name_temp as (
select
column_name
columnName
,
1
isFix
from
user_tab_columns
,
dual
where
table_name
=
'CUSTOMER'
)
select
*
from
column_name_temp
where
columnName
not
in
(
select
column_name
from
campaign_customerlist_column
)
select
*
from
column_name_temp
where
columnName
not
in
(
select
column_name
from
campaign_customerlist_column
where
column_name
is
not
null
)
union
all
select
title
columnName
,
0
isFix
from
customize_fields
,
dual
where
function_code
=
'CUSTOMER'
...
...
src/main/resources/sql/campaign-mng/get-list-fields-to-show.sql
View file @
9be1cbc9
select
to_char
(
column_name
)
columnName
,
1
isFix
from
campaign_customerlist_column
,
dual
where
campaign_id
=
:
p_campaign_id
select
to_char
(
column_name
)
columnName
,
1
isFix
from
campaign_customerlist_column
,
dual
where
campaign_id
=
:
p_campaign_id
and
column_name
is
not
null
union
all
select
customize_field_title
columnName
,
0
isFix
from
campaign_customerlist_column
where
campaign_id
=
:
p_campaign_id
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