Commit 55a6b806 authored by Vu Duy Anh's avatar Vu Duy Anh

anhvd commit change

parents 248e5ca3 373e6d79
...@@ -12,18 +12,23 @@ import org.springframework.stereotype.Repository; ...@@ -12,18 +12,23 @@ import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
@Repository @Repository
public interface CampaignCompleteCodeRepository extends JpaRepository<CampaignCompleteCode, Long> { public interface CampaignCompleteCodeRepository extends JpaRepository<CampaignCompleteCode, Long> {
@Query(" select u FROM CampaignCompleteCode u WHERE u.status = 1")
Page<CampaignCompleteCode> findAll(Pageable pageable); Page<CampaignCompleteCode> findAll(Pageable pageable);
// Page<CampaignCompleteCode> findAllByStatus(String status, Pageable pageable);
@Query("FROM CampaignCompleteCode WHERE completeName LIKE concat('%', :name, '%') ") @Query("FROM CampaignCompleteCode WHERE completeName LIKE concat('%', :name, '%') ")
List<CampaignCompleteCode> findByName(@Param("name") String name, Pageable pageable); List<CampaignCompleteCode> findByName(@Param("name") String name, Pageable pageable);
List<CampaignCompleteCode> findByCompleteNameContains(String name, Pageable pageable); List<CampaignCompleteCode>findByCompleteNameContains(String name, Pageable pageable);
@Modifying @Modifying
@Query("delete from CampaignCompleteCode c where c.campaignCompleteCodeId in (:ids)") @Query("delete from CampaignCompleteCode c where c.campaignCompleteCodeId in (:ids)")
int deleteds(@Param("ids") List<Long> ids); int deleteds(@Param("ids") List<Long> ids);
// @Query(value="SELECT max(completeValue) FROM CampaignCompleteCode WHERE companySiteId = :companySiteId GROUP BY companySiteId")
// Short findByMaxCompanySiteId(Long companySiteId);
List<CampaignCompleteCode> findCampaignCompleteCodesByCompanySiteId(Long companySiteId);
// List<CampaignCompleteCode> findByCampaignIdContainsAndChanel(Long campaignId, String chanel);
} }
...@@ -5,4 +5,6 @@ import com.viettel.campaign.web.dto.ResultDTO; ...@@ -5,4 +5,6 @@ import com.viettel.campaign.web.dto.ResultDTO;
public interface CampaignCompleteCodeRepositoryCustom { public interface CampaignCompleteCodeRepositoryCustom {
ResultDTO updateStatusById(Long id); ResultDTO updateStatusById(Long id);
ResultDTO findMaxValueCampaignType(Long companySiteId);
} }
...@@ -18,5 +18,7 @@ public interface CampaignExecuteRepository { ...@@ -18,5 +18,7 @@ public interface CampaignExecuteRepository {
List<ApParamDTO> getComboCampaignType(String companySiteId); List<ApParamDTO> getComboCampaignType(String companySiteId);
ResultDTO getInteractiveResult(CampaignRequestDTO dto); ResultDTO getInteractiveResult(CampaignRequestDTO dto);
List<ContactCustResultDTO> getExcelInteractiveResult(CampaignRequestDTO dto);
//</editor-fold: hungtt> //</editor-fold: hungtt>
} }
package com.viettel.campaign.repository.impl;
import com.viettel.campaign.model.CampaignCompleteCode;
import com.viettel.campaign.repository.CampaignCompleteCodeRepository;
import com.viettel.campaign.utils.HibernateUtil;
import com.viettel.campaign.utils.SQLBuilder;
import com.viettel.campaign.web.dto.CampaignCompleteCodeDTO;
import com.viettel.campaign.web.dto.ResultDTO;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
import org.hibernate.type.LongType;
import org.hibernate.type.ShortType;
import org.hibernate.type.StringType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;
public class CampaignCompleteCodeRepositoryIpml implements CampaignCompleteCodeRepository {
@Autowired
EntityManager entityManager;
CampaignCompleteCodeRepository campaignCompleteCodeRepository;
private Logger log = LoggerFactory.getLogger(CampaignCompleteCodeRepositoryIpml.class);
@Override
public Page<CampaignCompleteCode> findAll(Pageable pageable) {
// Page<CampaignCompleteCode>
// try {
//
// } catch (Exception e) {
//
// }
return null;
}
@Override
public List<CampaignCompleteCode> findByName(String name, Pageable pageable) {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
List<CampaignCompleteCode> resultList = null;
try {
StringBuilder sql = new StringBuilder(SQLBuilder.getSqlQueryById(SQLBuilder.SQL_MODULE_CAMPAIGN_STATUS_MNG, "search-campaign-status-by-params"));
SQLQuery query = session.createSQLQuery(sql.toString());
query.setParameter(":p_name", name);
// add SCalar
query.addScalar("campaignId", new LongType());
query.addScalar("completeValue", new StringType());
query.addScalar("completeName", new StringType());
query.addScalar("completeType", new StringType());
query.addScalar("chanel", new ShortType());
query.addScalar("description", new StringType());
query.addScalar("status", new ShortType());
query.addScalar("chanel", new LongType());
query.setResultTransformer(Transformers.aliasToBean(CampaignCompleteCodeDTO.class));
resultList = query.list();
} catch (Exception e) {
session.close();
log.error(e.getMessage(), e);
}
return resultList;
}
@Override
public List<CampaignCompleteCode> findByCompleteNameContains(String name, Pageable pageable) {
return campaignCompleteCodeRepository.findByCompleteNameContains(name, pageable);
}
@Override
public int deleteds(List<Long> ids) {
return 0;
}
@Override
public List<CampaignCompleteCode> findAll() {
return campaignCompleteCodeRepository.findAll();
}
@Override
public List<CampaignCompleteCode> findAll(Sort sort) {
return campaignCompleteCodeRepository.findAll();
}
@Override
public List<CampaignCompleteCode> findAllById(Iterable<Long> iterable) {
return null;
}
@Override
public long count() {
return 0;
}
@Override
@Transactional
public void deleteById(Long id) {
ResultDTO result = new ResultDTO();
try {
// update Status = 0 cho cái ID truyền vào
CampaignCompleteCode entity = entityManager.find(CampaignCompleteCode.class, id);
// set giá trị Status = 0 --> tương đương với inactive
entity.setStatus(new Short("0"));
entityManager.merge(entity);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
@Override
public void delete(CampaignCompleteCode campaignCompleteCode) {
}
@Override
public void deleteAll(Iterable<? extends CampaignCompleteCode> iterable) {
}
@Override
public void deleteAll() {
}
@Override
public <S extends CampaignCompleteCode> S save(S s) {
return null;
}
@Override
public <S extends CampaignCompleteCode> List<S> saveAll(Iterable<S> iterable) {
return null;
}
@Override
public Optional<CampaignCompleteCode> findById(Long aLong) {
return Optional.empty();
}
@Override
public boolean existsById(Long aLong) {
return false;
}
@Override
public void flush() {
}
@Override
public <S extends CampaignCompleteCode> S saveAndFlush(S s) {
return null;
}
@Override
public void deleteInBatch(Iterable<CampaignCompleteCode> iterable) {
}
@Override
public void deleteAllInBatch() {
}
@Override
public CampaignCompleteCode getOne(Long aLong) {
return null;
}
@Override
public <S extends CampaignCompleteCode> Optional<S> findOne(Example<S> example) {
return Optional.empty();
}
@Override
public <S extends CampaignCompleteCode> List<S> findAll(Example<S> example) {
return null;
}
@Override
public <S extends CampaignCompleteCode> List<S> findAll(Example<S> example, Sort sort) {
return null;
}
@Override
public <S extends CampaignCompleteCode> Page<S> findAll(Example<S> example, Pageable pageable) {
return null;
}
@Override
public <S extends CampaignCompleteCode> long count(Example<S> example) {
return 0;
}
@Override
public <S extends CampaignCompleteCode> boolean exists(Example<S> example) {
return false;
}
}
...@@ -38,4 +38,19 @@ public class CampaignCompleteCompleteCodeRepositoryIpml implements CampaignCompl ...@@ -38,4 +38,19 @@ public class CampaignCompleteCompleteCodeRepositoryIpml implements CampaignCompl
} }
return dto; return dto;
} }
@Override
@Transactional
public ResultDTO findMaxValueCampaignType(Long companySiteId) {
ResultDTO result = new ResultDTO();
try{
result.setErrorCode("00");
}
catch(Exception e){
log.error(e.getMessage(), e);
result.setErrorCode("01");
result.setDescription(e.getMessage());
}
return null;
}
} }
...@@ -25,11 +25,8 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; ...@@ -25,11 +25,8 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.Query; import java.util.*;
import java.util.ArrayList; import java.util.concurrent.TimeUnit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Repository @Repository
public class CampaignExecuteRepositoryImp implements CampaignExecuteRepository { public class CampaignExecuteRepositoryImp implements CampaignExecuteRepository {
...@@ -85,30 +82,30 @@ public class CampaignExecuteRepositoryImp implements CampaignExecuteRepository { ...@@ -85,30 +82,30 @@ public class CampaignExecuteRepositoryImp implements CampaignExecuteRepository {
String sql = SQLBuilder.getSqlQueryById(Constants.SQL_MODULES.MODULE_EXECUTE, "get-execute-interactive"); String sql = SQLBuilder.getSqlQueryById(Constants.SQL_MODULES.MODULE_EXECUTE, "get-execute-interactive");
sqlBuilder.append(sql); sqlBuilder.append(sql);
if (!DataUtil.isNullOrEmpty(dto.getCampaignName().trim())) { if (!DataUtil.isNullOrEmpty(dto.getCampaignName())) {
sqlBuilder.append(" and upper(campaignName) like upper(:p_campaign_name)"); sqlBuilder.append(" and upper(campaignName) like upper(:p_campaign_name)");
} }
if (!DataUtil.isNullOrEmpty(dto.getAgentId().trim())) { if (!DataUtil.isNullOrEmpty(dto.getAgentId())) {
sqlBuilder.append(" and upper(userName) like upper(:p_user_name)"); sqlBuilder.append(" and upper(userName) like upper(:p_user_name)");
} }
SQLQuery query = session.createSQLQuery(sqlBuilder.toString()); SQLQuery query = session.createSQLQuery(sqlBuilder.toString());
query.setParameterList("p_list_campaign_id", dto.getCampaignId().trim().split(",")); query.setParameterList("p_list_campaign_id", dto.getCampaignId().split(","));
query.setParameter("p_customer_id", dto.getCustomerId().trim()); query.setParameter("p_customer_id", dto.getCustomerId());
query.setParameter("p_date_from", dto.getFromDate().trim()); query.setParameter("p_date_from", dto.getFromDate());
query.setParameter("p_date_to", dto.getToDate().trim()); query.setParameter("p_date_to", dto.getToDate());
query.setParameterList("p_list_contact_status", dto.getContactStatus().trim().split(",")); query.setParameterList("p_list_contact_status", dto.getContactStatus().split(","));
query.setParameterList("p_list_survey_status", dto.getSurveyStatus().trim().split(",")); query.setParameterList("p_list_survey_status", dto.getSurveyStatus().split(","));
query.setParameterList("p_list_record_status", dto.getRecordStatus().trim().split(",")); query.setParameterList("p_list_record_status", dto.getRecordStatus().split(","));
query.setParameter("p_phone_number", dto.getPhoneNumber().trim()); query.setParameter("p_phone_number", dto.getPhoneNumber());
query.setParameter("p_call_time_from", dto.getCallTimeFrom().trim()); query.setParameter("p_call_time_from", dto.getCallTimeFrom());
query.setParameter("p_call_time_to", dto.getCallTimeTo().trim()); query.setParameter("p_call_time_to", dto.getCallTimeTo());
if (!DataUtil.isNullOrEmpty(dto.getCampaignName().trim())) { if (!DataUtil.isNullOrEmpty(dto.getCampaignName())) {
query.setParameter("p_campaign_name", dto.getCampaignName().trim()); query.setParameter("p_campaign_name", dto.getCampaignName().trim());
} }
if (!DataUtil.isNullOrEmpty(dto.getAgentId().trim())) { if (!DataUtil.isNullOrEmpty(dto.getAgentId())) {
query.setParameter("p_user_name", dto.getAgentId().trim()); query.setParameter("p_user_name", dto.getAgentId().trim());
} }
...@@ -142,10 +139,8 @@ public class CampaignExecuteRepositoryImp implements CampaignExecuteRepository { ...@@ -142,10 +139,8 @@ public class CampaignExecuteRepositoryImp implements CampaignExecuteRepository {
} else { } else {
if (contactCustResultDTO.getRecordStatus() == 2) { if (contactCustResultDTO.getRecordStatus() == 2) {
contactCustResultDTO.setEnableEdit(true); contactCustResultDTO.setEnableEdit(true);
} else if (contactCustResultDTO.getRecordStatus() == 1){ } else if (contactCustResultDTO.getRecordStatus() == 1 && isLower24Hour(contactCustResultDTO.getCreateTime())){
/** contactCustResultDTO.setEnableEdit(true);
* Hoi chi linh xac dinh thoi gian 24h ke tu khi da luu kieu gi??????
*/
} else { } else {
contactCustResultDTO.setEnableEdit(false); contactCustResultDTO.setEnableEdit(false);
} }
...@@ -164,4 +159,75 @@ public class CampaignExecuteRepositoryImp implements CampaignExecuteRepository { ...@@ -164,4 +159,75 @@ public class CampaignExecuteRepositoryImp implements CampaignExecuteRepository {
} }
return resultDTO; return resultDTO;
} }
@Override
public List<ContactCustResultDTO> getExcelInteractiveResult(CampaignRequestDTO dto) {
List<ContactCustResultDTO> list = new ArrayList<>();
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
StringBuilder sqlBuilder = new StringBuilder();
try {
String sql = SQLBuilder.getSqlQueryById(Constants.SQL_MODULES.MODULE_EXECUTE, "get-execute-interactive");
sqlBuilder.append(sql);
if (!DataUtil.isNullOrEmpty(dto.getCampaignName())) {
sqlBuilder.append(" and upper(campaignName) like upper(:p_campaign_name)");
}
if (!DataUtil.isNullOrEmpty(dto.getAgentId())) {
sqlBuilder.append(" and upper(userName) like upper(:p_user_name)");
}
SQLQuery query = session.createSQLQuery(sqlBuilder.toString());
query.setParameterList("p_list_campaign_id", dto.getCampaignId().split(","));
query.setParameter("p_customer_id", dto.getCustomerId());
query.setParameter("p_date_from", dto.getFromDate());
query.setParameter("p_date_to", dto.getToDate());
query.setParameterList("p_list_contact_status", dto.getContactStatus().split(","));
query.setParameterList("p_list_survey_status", dto.getSurveyStatus().split(","));
query.setParameterList("p_list_record_status", dto.getRecordStatus().split(","));
query.setParameter("p_phone_number", dto.getPhoneNumber());
query.setParameter("p_call_time_from", dto.getCallTimeFrom());
query.setParameter("p_call_time_to", dto.getCallTimeTo());
if (!DataUtil.isNullOrEmpty(dto.getCampaignName())) {
query.setParameter("p_campaign_name", dto.getCampaignName().trim());
}
if (!DataUtil.isNullOrEmpty(dto.getAgentId())) {
query.setParameter("p_user_name", dto.getAgentId().trim());
}
query.addScalar("campaignCode", new StringType());
query.addScalar("campaignName", new StringType());
query.addScalar("userName", new StringType());
query.addScalar("phoneNumber", new LongType());
query.addScalar("customerName", new StringType());
query.addScalar("createTime", new DateType());
query.addScalar("contactStatus", new StringType());
query.addScalar("surveyStatus", new StringType());
query.addScalar("status", new ShortType());
query.addScalar("recordStatus", new ShortType());
query.setResultTransformer(Transformers.aliasToBean(ContactCustResultDTO.class));
list = query.list();
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
session.close();
return list;
}
}
private boolean isLower24Hour(Date createTime) {
Date currTime = new Date();
long diffMilSec = currTime.getTime() - createTime.getTime();
long hour = TimeUnit.MILLISECONDS.toHours(diffMilSec);
if (hour > 24) return false;
return true;
}
} }
...@@ -22,4 +22,6 @@ public interface CampaignCompleteCodeService { ...@@ -22,4 +22,6 @@ public interface CampaignCompleteCodeService {
ResultDTO deleteById(Long id); ResultDTO deleteById(Long id);
ResultDTO findMaxValueCampaignCompleteCode(CampaignCompleteCodeDTO completeCodeDTO);
} }
...@@ -2,6 +2,7 @@ package com.viettel.campaign.service; ...@@ -2,6 +2,7 @@ package com.viettel.campaign.service;
import com.viettel.campaign.web.dto.ResultDTO; import com.viettel.campaign.web.dto.ResultDTO;
import com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO; import com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
...@@ -12,5 +13,7 @@ public interface CampaignExecuteService { ...@@ -12,5 +13,7 @@ public interface CampaignExecuteService {
ResultDTO getComboCampaignType(String companySiteId); ResultDTO getComboCampaignType(String companySiteId);
ResultDTO searchInteractiveResult(CampaignRequestDTO dto); ResultDTO searchInteractiveResult(CampaignRequestDTO dto);
XSSFWorkbook exportInteractiveResult(CampaignRequestDTO dto);
//</editor-fold> //</editor-fold>
} }
...@@ -6,15 +6,13 @@ import com.viettel.campaign.web.dto.ResultDTO; ...@@ -6,15 +6,13 @@ import com.viettel.campaign.web.dto.ResultDTO;
import com.viettel.campaign.web.dto.request_dto.SearchCustomerRequestDTO; import com.viettel.campaign.web.dto.request_dto.SearchCustomerRequestDTO;
import com.viettel.campaign.web.dto.request_dto.CustomerRequestDTO; import com.viettel.campaign.web.dto.request_dto.CustomerRequestDTO;
import java.util.Map;
public interface CustomerService { public interface CustomerService {
ResultDTO listAllCustomer(int page, int pageSize, String sort, long customerListId, long companySiteId); ResultDTO getAllCustomer(int page, int pageSize, String sort, long customerListId, long companySiteId);
ResultDTO getCustomerId(Long customerId); ResultDTO getCustomerId(Long customerId);
Map listCustByName(int page, int pageSize, String sort, String name); ResultDTO searchAllCustomer(int page, int pageSize, String sort, long customerListId, long companySiteId, String name, String mobileNumber, String email);
ResultDTO createCustomer(CustomerDTO customerDTO); ResultDTO createCustomer(CustomerDTO customerDTO);
...@@ -24,7 +22,7 @@ public interface CustomerService { ...@@ -24,7 +22,7 @@ public interface CustomerService {
// ------------ customer list ------------ // // ------------ customer list ------------ //
Map getCustomerList(int page, int pageSize, String sort); ResultDTO getAllCustomerList(int page, int pageSize, String sort, Long companySiteId);
ResultDTO createCustomerList(CustomerListDTO customerListDTO); ResultDTO createCustomerList(CustomerListDTO customerListDTO);
......
...@@ -7,8 +7,12 @@ import com.viettel.campaign.web.dto.ResultDTO; ...@@ -7,8 +7,12 @@ import com.viettel.campaign.web.dto.ResultDTO;
import com.viettel.campaign.mapper.CampaignCompleteCodeMapper; import com.viettel.campaign.mapper.CampaignCompleteCodeMapper;
import com.viettel.campaign.model.CampaignCompleteCode; import com.viettel.campaign.model.CampaignCompleteCode;
import com.viettel.campaign.repository.CampaignCompleteCodeRepository; import com.viettel.campaign.repository.CampaignCompleteCodeRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
...@@ -20,6 +24,8 @@ import java.util.*; ...@@ -20,6 +24,8 @@ import java.util.*;
@Service @Service
public class CampaignCompleteCodeServiceImpl implements CampaignCompleteCodeService { public class CampaignCompleteCodeServiceImpl implements CampaignCompleteCodeService {
protected Logger logger = LoggerFactory.getLogger(CampaignCompleteCodeServiceImpl.class);
@Autowired @Autowired
CampaignCompleteCodeRepository completeCodeRepository; CampaignCompleteCodeRepository completeCodeRepository;
...@@ -123,12 +129,11 @@ public class CampaignCompleteCodeServiceImpl implements CampaignCompleteCodeServ ...@@ -123,12 +129,11 @@ public class CampaignCompleteCodeServiceImpl implements CampaignCompleteCodeServ
return resultDTO; return resultDTO;
} }
@Transactional @Transactional
@Override @Override
public ResultDTO deleteList(List<Long> completeCodeDtos) { public ResultDTO deleteList(List<Long> completeCodeDtos) {
ResultDTO resultDTO = new ResultDTO(); ResultDTO resultDTO = new ResultDTO();
// for (int i = 0; i < completeCodeDtos.size(); i++) {
try { try {
completeCodeRepository.deleteds(completeCodeDtos); completeCodeRepository.deleteds(completeCodeDtos);
resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS); resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS);
...@@ -160,4 +165,52 @@ public class CampaignCompleteCodeServiceImpl implements CampaignCompleteCodeServ ...@@ -160,4 +165,52 @@ public class CampaignCompleteCodeServiceImpl implements CampaignCompleteCodeServ
result.setErrorCode("0"); result.setErrorCode("0");
return result; return result;
} }
@Override
public ResultDTO findMaxValueCampaignCompleteCode(CampaignCompleteCodeDTO completeCodeDTO) {
ResultDTO resultDTO = new ResultDTO();
try {
short maxValue = 0;
List<CampaignCompleteCode> list = completeCodeRepository.findCampaignCompleteCodesByCompanySiteId(completeCodeDTO.getCompanySiteId());
for (int i = 0; i<list.size();i++) {
if (list.get(i).getCompleteValue() != null && !list.get(i).getCompleteValue().equals("")) {
if (maxValue < Short.parseShort(list.get(i).getCompleteValue())) {
maxValue = Short.parseShort(list.get(i).getCompleteValue());
}
}
}
maxValue+= 1;
resultDTO.setData(maxValue);
resultDTO.setErrorCode(Constants.ApiErrorCode.SUCCESS);
resultDTO.setDescription(Constants.ApiErrorDesc.SUCCESS);
} catch (Exception e) {
resultDTO.setErrorCode(Constants.ApiErrorCode.ERROR);
resultDTO.setDescription(e.getMessage());
}
return resultDTO;
}
// @Override
// public ResultDTO findMaxValueCampaignCompleteCode(CampaignCompleteCodeDTO completeCodeDTO) {
// ResultDTO result = new ResultDTO();
// CampaignCompleteCodeMapper campaignCompleteCodeMapper = new CampaignCompleteCodeMapper();
// CampaignCompleteCode campaignCompleteCode = new CampaignCompleteCode();
// try{
// short resultmaxValue = completeCodeRepository.findByMaxCompanySiteId(completeCodeDTO.getCompanySiteId());
// campaignCompleteCode.setCompleteValue(String.valueOf(resultmaxValue + 1));
//// if (resultmaxValue < 4) {
//// resultmaxValue =4;
//// }
// result.setData(resultmaxValue);
// result.setErrorCode(Constants.Status.ACTIVE_STR);
// result.setDescription(Constants.Status.ACTIVE_STR);
// }
// catch (Exception e){
// logger.error(e.getMessage(), e);
// result.setErrorCode("-1");
// return result;
// }
// result.setErrorCode("0");
// return result;
// }
} }
...@@ -2,22 +2,32 @@ package com.viettel.campaign.service.impl; ...@@ -2,22 +2,32 @@ package com.viettel.campaign.service.impl;
import com.viettel.campaign.repository.CampaignExecuteRepository; import com.viettel.campaign.repository.CampaignExecuteRepository;
import com.viettel.campaign.service.CampaignExecuteService; import com.viettel.campaign.service.CampaignExecuteService;
import com.viettel.campaign.utils.BundleUtils;
import com.viettel.campaign.utils.Constants; import com.viettel.campaign.utils.Constants;
import com.viettel.campaign.web.dto.ApParamDTO; import com.viettel.campaign.web.dto.ApParamDTO;
import com.viettel.campaign.web.dto.ContactCustResultDTO; import com.viettel.campaign.web.dto.ContactCustResultDTO;
import com.viettel.campaign.web.dto.ResultDTO; import com.viettel.campaign.web.dto.ResultDTO;
import com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO; import com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO;
import org.apache.commons.collections4.BagUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale;
@Service @Service
public class CampaignExecuteServiceImp implements CampaignExecuteService { public class CampaignExecuteServiceImp implements CampaignExecuteService {
private static final Logger logger = LoggerFactory.getLogger(CampaignExecuteServiceImp.class); private static final Logger logger = LoggerFactory.getLogger(CampaignExecuteServiceImp.class);
private SimpleDateFormat formatter = new SimpleDateFormat(Constants.DATE_FORMAT.FOMART_DATE_TYPE_1);
@Autowired @Autowired
CampaignExecuteRepository campaignExecuteRepository; CampaignExecuteRepository campaignExecuteRepository;
...@@ -61,5 +71,117 @@ public class CampaignExecuteServiceImp implements CampaignExecuteService { ...@@ -61,5 +71,117 @@ public class CampaignExecuteServiceImp implements CampaignExecuteService {
} }
return resultDTO; return resultDTO;
} }
@Override
public XSSFWorkbook exportInteractiveResult(CampaignRequestDTO dto) {
Locale locale = Locale.forLanguageTag("vi");
List<ContactCustResultDTO> list = campaignExecuteRepository.getExcelInteractiveResult(dto);
XSSFWorkbook workbook = new XSSFWorkbook();
Sheet sheet;
// create font style
Font defaultFont = workbook.createFont();
defaultFont.setFontHeightInPoints((short) 13);
defaultFont.setFontName("Times New Roman");
defaultFont.setColor(IndexedColors.BLACK.getIndex());
Font titleFont = workbook.createFont();
titleFont.setFontHeightInPoints((short) 18);
titleFont.setFontName("Times New Roman");
titleFont.setColor(IndexedColors.BLACK.getIndex());
titleFont.setBold(true);
Font headerFont = workbook.createFont();
headerFont.setFontHeightInPoints((short) 13);
headerFont.setFontName("Times New Roman");
headerFont.setColor(IndexedColors.BLACK.getIndex());
headerFont.setBold(true);
CellStyle styleTitle = workbook.createCellStyle();
styleTitle.setFont(titleFont);
styleTitle.setAlignment(HorizontalAlignment.CENTER);
CellStyle styleRowHeader = workbook.createCellStyle();
styleRowHeader.setFont(headerFont);
styleRowHeader.setAlignment(HorizontalAlignment.CENTER);
styleRowHeader.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
styleRowHeader.setFillPattern(FillPatternType.SOLID_FOREGROUND);
styleRowHeader.setBorderRight(BorderStyle.THIN);
styleRowHeader.setRightBorderColor(IndexedColors.BLACK.getIndex());
styleRowHeader.setBorderBottom(BorderStyle.THIN);
styleRowHeader.setBottomBorderColor(IndexedColors.BLACK.getIndex());
styleRowHeader.setBorderLeft(BorderStyle.THIN);
styleRowHeader.setLeftBorderColor(IndexedColors.BLACK.getIndex());
styleRowHeader.setBorderTop(BorderStyle.THIN);
styleRowHeader.setTopBorderColor(IndexedColors.BLACK.getIndex());
CellStyle styleRow = workbook.createCellStyle();
styleRow.setFont(defaultFont);
// list header
List<String> headerList = new ArrayList<>();
headerList.add(BundleUtils.getLangString("stt", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.campaignCode", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.campaignName", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.agentId", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.phoneNumber", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.customerId", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.customerName", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.createTime", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.contactStatus", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.surveyStatus", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.status", locale));
headerList.add(BundleUtils.getLangString("campaign.execute.interactive.recordStatus", locale));
//
String sheetName = BundleUtils.getLangString("detail", locale);
sheet = workbook.createSheet(sheetName);
// Title
String title = BundleUtils.getLangString("campaign.execute.interactive.title", locale);
int rowTitleStart = 3;
Row rowTitle = sheet.createRow(rowTitleStart);
rowTitle.setHeight((short) 800);
writeCellContent(rowTitle, styleTitle, 3, title);
sheet.addMergedRegion(new CellRangeAddress(rowTitleStart, rowTitleStart, 3, 8));
// Header
int startRowTable = 5;
int count = 1;
Row rowHeader = sheet.createRow(startRowTable);
for (int i = 0; i < headerList.size(); i++) {
writeCellContent(rowHeader, styleRowHeader, i, headerList.get(i));
}
// Content
for (int i = 0, rowIndex = 1; i < list.size(); i++) {
Row row = sheet.createRow(startRowTable + count);
int col = 0;
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).getAgentId());
writeCellContent(row, styleRow, col++, list.get(i).getPhoneNumber());
writeCellContent(row, styleRow, col++, list.get(i).getCustomerId());
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());
writeCellContent(row, styleRow, col++, list.get(i).getSurveyStatus());
writeCellContent(row, styleRow, col++, list.get(i).getStatus());
writeCellContent(row, styleRow, col++, list.get(i).getRecordStatus());
++rowIndex;
++count;
}
return workbook;
}
private void writeCellContent(Row row, CellStyle rowStyle, int colNo, Object content) {
Cell cell = row.createCell(colNo);
if (content == null) {
cell.setCellValue("");
} else {
cell.setCellValue(String.valueOf(content));
}
cell.setCellStyle(rowStyle);
}
//</editor-fold: hungtt> //</editor-fold: hungtt>
} }
package com.viettel.campaign.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* @author hungtt
*/
public class BundleUtils {
protected static final Logger logger = LoggerFactory.getLogger(BundleUtils.class);
private static volatile ResourceBundle rsConfig = null;
public static String getLangString(String key, Locale... locale) {
Locale vi = new Locale("vi");
Locale mlocale = vi;
try {
if(locale != null) {
if(locale.length == 0) {
rsConfig = ResourceBundle.getBundle(Constants.LANGUAGE.LANGUAGE, mlocale);
} else {
rsConfig = ResourceBundle.getBundle(Constants.LANGUAGE.LANGUAGE, locale[0]);
}
} else {
rsConfig = ResourceBundle.getBundle(Constants.LANGUAGE.LANGUAGE, mlocale);
}
return new String(rsConfig.getString(key).getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage(), e);
return key;
}
}
}
...@@ -35,4 +35,12 @@ public class Constants { ...@@ -35,4 +35,12 @@ public class Constants {
public interface SQL_MODULES { public interface SQL_MODULES {
String MODULE_EXECUTE = "campaign-execute"; String MODULE_EXECUTE = "campaign-execute";
} }
public interface LANGUAGE {
String LANGUAGE = "i18n/language";
}
public interface DATE_FORMAT {
String FOMART_DATE_TYPE_1 = "DD/MM/YYYY";
}
} }
...@@ -13,4 +13,5 @@ public class BaseDTO implements Serializable { ...@@ -13,4 +13,5 @@ public class BaseDTO implements Serializable {
protected int pageSize; protected int pageSize;
protected int page; protected int page;
protected String sort; protected String sort;
protected String langKey;
} }
...@@ -15,7 +15,7 @@ import javax.validation.Valid; ...@@ -15,7 +15,7 @@ import javax.validation.Valid;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@Controller @RestController
@RequestMapping("/ipcc/completeCode") @RequestMapping("/ipcc/completeCode")
@CrossOrigin(origins = "*") @CrossOrigin(origins = "*")
public class CampaignCompleteCodeController { public class CampaignCompleteCodeController {
...@@ -84,7 +84,6 @@ public class CampaignCompleteCodeController { ...@@ -84,7 +84,6 @@ public class CampaignCompleteCodeController {
ResultDTO resultDTO = completeCodeService.deleteList(completeCodeDtos); ResultDTO resultDTO = completeCodeService.deleteList(completeCodeDtos);
return new ResponseEntity<>(resultDTO, HttpStatus.OK); return new ResponseEntity<>(resultDTO, HttpStatus.OK);
} }
@CrossOrigin(origins = "*")
@PostMapping("/deleteById") @PostMapping("/deleteById")
@ResponseBody @ResponseBody
public ResultDTO deleteById(@RequestParam("id") Long id){ public ResultDTO deleteById(@RequestParam("id") Long id){
...@@ -93,5 +92,13 @@ public class CampaignCompleteCodeController { ...@@ -93,5 +92,13 @@ public class CampaignCompleteCodeController {
return resultDTO; return resultDTO;
} }
@CrossOrigin(origins = "*")
@PostMapping("/getMaxValue")
@ResponseBody
public ResultDTO findMaxValueCampaignType(@RequestBody CampaignCompleteCodeDTO completeCodeDTO){
return completeCodeService.findMaxValueCampaignCompleteCode(completeCodeDTO);
}
} }
...@@ -5,15 +5,22 @@ import com.viettel.campaign.service.CampaignService; ...@@ -5,15 +5,22 @@ import com.viettel.campaign.service.CampaignService;
import com.viettel.campaign.web.dto.CampaignDTO; import com.viettel.campaign.web.dto.CampaignDTO;
import com.viettel.campaign.web.dto.ResultDTO; import com.viettel.campaign.web.dto.ResultDTO;
import com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO; import com.viettel.campaign.web.dto.request_dto.CampaignRequestDTO;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map; import java.util.Map;
@RestController @RestController
...@@ -61,15 +68,41 @@ public class CampaignController { ...@@ -61,15 +68,41 @@ public class CampaignController {
@PostMapping("/searchInteractiveResult") @PostMapping("/searchInteractiveResult")
@ResponseBody @ResponseBody
public ResponseEntity<ResultDTO> searchInteractiveResult(@RequestBody CampaignRequestDTO dto) { public ResponseEntity<ResultDTO> searchInteractiveResult(@RequestBody CampaignRequestDTO dto) throws Exception {
ResultDTO result = campaignExecuteService.searchInteractiveResult(dto); ResultDTO result = campaignExecuteService.searchInteractiveResult(dto);
return new ResponseEntity<>(result, HttpStatus.OK); return new ResponseEntity<>(result, HttpStatus.OK);
} }
@RequestMapping(value = "/find-campaign-by-id/{campaignId}", method = RequestMethod.GET) @PostMapping("/exportInteractiveResult")
public ResponseEntity<ResultDTO> findCampaignById(@PathVariable Long campaignId) { @ResponseBody
ResultDTO resultDTO = campaignService.findCampaignById(campaignId); public ResponseEntity<?> exportInteractiveResult(HttpServletResponse response, @RequestBody CampaignRequestDTO dto) {
return new ResponseEntity<>(resultDTO, HttpStatus.OK); XSSFWorkbook workbook = null;
byte[] contentReturn = null;
try {
String fileName = "report_campaign_exec_interactive_result.xlsx";
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
OutputStream outputStream;
workbook = campaignExecuteService.exportInteractiveResult(dto);
outputStream = response.getOutputStream();
workbook.write(outputStream);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
workbook.write(byteArrayOutputStream);
contentReturn = byteArrayOutputStream.toByteArray();
} catch (Exception e) {
logger.error(e.getMessage(), e);
return new ResponseEntity<byte[]>(null, null, HttpStatus.BAD_REQUEST);
} finally {
if (workbook != null) {
try {
workbook.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/vnd.ms-excel"));
return new ResponseEntity<byte[]>(contentReturn, headers, HttpStatus.OK);
} }
@RequestMapping(value = "/changeCampaignStatus", method = RequestMethod.PUT) @RequestMapping(value = "/changeCampaignStatus", method = RequestMethod.PUT)
......
...@@ -40,7 +40,7 @@ public class CustomerController { ...@@ -40,7 +40,7 @@ public class CustomerController {
@GetMapping("/findAll") @GetMapping("/findAll")
@ResponseBody @ResponseBody
public ResponseEntity findAllCustomer(@RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam("sort") String sort, @RequestParam("customerListId") long customerListId, @RequestParam("companySiteId") long companySiteId) { public ResponseEntity findAllCustomer(@RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam("sort") String sort, @RequestParam("customerListId") long customerListId, @RequestParam("companySiteId") long companySiteId) {
ResultDTO result = customerService.listAllCustomer(page, pageSize, sort, customerListId, companySiteId); ResultDTO result = customerService.getAllCustomer(page, pageSize, sort, customerListId, companySiteId);
return new ResponseEntity<>(result, HttpStatus.OK); return new ResponseEntity<>(result, HttpStatus.OK);
} }
...@@ -51,10 +51,10 @@ public class CustomerController { ...@@ -51,10 +51,10 @@ public class CustomerController {
return new ResponseEntity(result, HttpStatus.OK); return new ResponseEntity(result, HttpStatus.OK);
} }
@GetMapping("/findCustomerByName") @GetMapping("/searchAllCustomerByParams")
@ResponseBody @ResponseBody
public ResponseEntity findAllCustomerName(@RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam("sort") String sort, @RequestParam("name") String name) { public ResponseEntity findAllCustomerName(@RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam("sort") String sort, @RequestParam("customerListId") Long customerListId, @RequestParam("companySiteId") Long companySiteId, @RequestParam("name") String name, @RequestParam("mobileNumber") String mobileNumber, @RequestParam("email") String email) {
Map result = customerService.listCustByName(page, pageSize, sort, name); ResultDTO result = customerService.searchAllCustomer(page, pageSize, sort, customerListId, companySiteId, name, mobileNumber, email);
return new ResponseEntity(result, HttpStatus.OK); return new ResponseEntity(result, HttpStatus.OK);
} }
...@@ -98,8 +98,8 @@ public class CustomerController { ...@@ -98,8 +98,8 @@ public class CustomerController {
@GetMapping("/findAlls") @GetMapping("/findAlls")
@ResponseBody @ResponseBody
public ResponseEntity findAllCustomerList(@RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam("sort") String sort) { public ResponseEntity findAllCustomerList(@RequestParam("page") int page, @RequestParam("pageSize") int pageSize, @RequestParam("sort") String sort, @RequestParam("companySiteId") Long companySiteId) {
Map result = customerService.getCustomerList(page, pageSize, sort); ResultDTO result = customerService.getAllCustomerList(page, pageSize, sort, companySiteId);
return new ResponseEntity<>(result, HttpStatus.OK); return new ResponseEntity<>(result, HttpStatus.OK);
} }
......
#Common
detail = Chi ti?t
stt = STT
#Campaign Execute Interactive
campaign.execute.interactive.title = Chi ti?t k?t qu? t??ng tc
campaign.execute.interactive.campaignCode = M chi?n d?ch
campaign.execute.interactive.campaignName = Tn chi?n d?ch
campaign.execute.interactive.agentId = M t? v?n vin
campaign.execute.interactive.phoneNumber = S? ?i?n tho?i
campaign.execute.interactive.customerId = M khch hng
campaign.execute.interactive.customerName = Tn khch hng
campaign.execute.interactive.callTime = Th?i gian lin l?c
campaign.execute.interactive.contactStatus = Tr?ng thi k?t n?i
campaign.execute.interactive.surveyStatus = Tr?ng thi kh?o st
campaign.execute.interactive.status = Tr?ng thi chi?n d?ch
campaign.execute.interactive.recordStatus = Tr?ng thi b?n ghi
#Common
detail = Chi tiết
stt = STT
#Campaign Execute Interactive
campaign.execute.interactive.title = Chi tiết kết quả tương tác
campaign.execute.interactive.campaignCode = Mã chiến dịch
campaign.execute.interactive.campaignName = Tên chiến dịch
campaign.execute.interactive.agentId = Mã tư vấn viên
campaign.execute.interactive.phoneNumber = Số điện thoại
campaign.execute.interactive.customerId = Mã khách hàng
campaign.execute.interactive.customerName = Tên khách hàng
campaign.execute.interactive.createTime = Thời gian liên lạc
campaign.execute.interactive.contactStatus = Trạng thái kết nối
campaign.execute.interactive.surveyStatus = Trạng thái khảo sát
campaign.execute.interactive.status = Trạng thái chiến dịch
campaign.execute.interactive.recordStatus = Trạng thái bản ghi
...@@ -15,7 +15,8 @@ from contact_cust_result a ...@@ -15,7 +15,8 @@ from contact_cust_result a
left join campaign_complete_code e on a.contact_status = e.complete_value left join campaign_complete_code e on a.contact_status = e.complete_value
left join campaign_complete_code f on a.call_status = e.complete_value left join campaign_complete_code f on a.call_status = e.complete_value
left join campaign g on a.campaign_id = b.campaign_id left join campaign g on a.campaign_id = b.campaign_id
where a.campaign_id in (:p_list_campaign_id) where a.status <> 0
and a.campaign_id in (:p_list_campaign_id)
and a.customer_id like '%'||:p_customer_id||'%' and a.customer_id like '%'||:p_customer_id||'%'
and a.create_time >= to_date(:p_date_from, 'DD/MM/YYYY') and a.create_time >= to_date(:p_date_from, 'DD/MM/YYYY')
and a.create_time <= to_date(:p_date_to, 'DD/MM/YYYY') and a.create_time <= to_date(:p_date_to, 'DD/MM/YYYY')
......
...@@ -12,5 +12,4 @@ SELECT ...@@ -12,5 +12,4 @@ SELECT
DEPT_CREATE deptCreate DEPT_CREATE deptCreate
FROM CUSTOMER_LIST FROM CUSTOMER_LIST
WHERE 1 = 1 WHERE 1 = 1
AND CREATE_AT BETWEEN to_date(:p_date_from, 'YYYYMMDD') AND to_date(:p_date_to, 'YYYYMMDD')
AND COMPANY_SITE_ID = :p_company_site_id AND COMPANY_SITE_ID = :p_company_site_id
DELETE FROM CAMPAIGN_COMPLETE_CODE WHERE CAMPAIGN_ID IN (0,1) DELETE FROM CAMPAIGN_COMPLETE_CODE WHERE CAMPAIGN_ID IN (0,1)
select *from CAMPAIGN_COMPLETE_CODE select *from CAMPAIGN_COMPLETE_CODE where STATUS = 1;
...@@ -15,3 +15,4 @@ LEFT JOIN AP_PARAM c ON a.CAMPAIGN_TYPE = to_char(c.AP_PARAM_ID); ...@@ -15,3 +15,4 @@ LEFT JOIN AP_PARAM c ON a.CAMPAIGN_TYPE = to_char(c.AP_PARAM_ID);
SELECT max(COMPLETE_VALUE) ,COMPANY_SITE_ID from CAMPAIGN_COMPLETE_CODE where COMPANY_SITE_ID = : p_site_id GROUP BY COMPANY_SITE_ID SELECT max(COMPLETE_VALUE) ,COMPANY_SITE_ID from CAMPAIGN_COMPLETE_CODE where COMPANY_SITE_ID = : p_site_id GROUP BY COMPANY_SITE_ID
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