| 35104 |
vikas |
1 |
package com.spice.profitmandi.dao.service;
|
|
|
2 |
|
|
|
3 |
import com.google.common.collect.Maps;
|
|
|
4 |
import com.spice.profitmandi.common.model.ProfitMandiConstants;
|
|
|
5 |
import com.spice.profitmandi.dao.entity.BrandSalesRewards;
|
|
|
6 |
import com.spice.profitmandi.dao.entity.ModelRewardPoints;
|
|
|
7 |
import com.spice.profitmandi.dao.entity.SaleRewardHistory;
|
| 35247 |
vikas |
8 |
import com.spice.profitmandi.dao.entity.StoreSalesTarget;
|
| 35104 |
vikas |
9 |
import com.spice.profitmandi.dao.model.EligibleRewardItemsModel;
|
| 35247 |
vikas |
10 |
import com.spice.profitmandi.dao.repository.GenericRepository;
|
| 35104 |
vikas |
11 |
import com.spice.profitmandi.dao.repository.ModelRewardPointsRepository;
|
|
|
12 |
import com.spice.profitmandi.dao.repository.SaleRewardHistoryRepository;
|
|
|
13 |
import org.apache.logging.log4j.LogManager;
|
|
|
14 |
import org.apache.logging.log4j.Logger;
|
|
|
15 |
import org.hibernate.Session;
|
|
|
16 |
import org.hibernate.SessionFactory;
|
|
|
17 |
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
18 |
import org.springframework.stereotype.Component;
|
|
|
19 |
import org.springframework.transaction.annotation.Transactional;
|
|
|
20 |
|
|
|
21 |
import javax.persistence.TypedQuery;
|
|
|
22 |
import java.math.BigDecimal;
|
| 35150 |
vikas |
23 |
import java.time.LocalDateTime;
|
| 35104 |
vikas |
24 |
import java.util.*;
|
|
|
25 |
|
|
|
26 |
@Component
|
|
|
27 |
public class SaleRewardServiceImpl implements SaleRewardService {
|
|
|
28 |
private static final Logger logger = LogManager.getLogger(SaleRewardServiceImpl.class);
|
|
|
29 |
|
|
|
30 |
@Autowired
|
|
|
31 |
private SaleRewardHistoryRepository saleRewardHistoryRepository;
|
|
|
32 |
|
|
|
33 |
@Autowired
|
|
|
34 |
private ModelRewardPointsRepository modelRewardPointsRepository;
|
|
|
35 |
|
|
|
36 |
@Autowired
|
|
|
37 |
private SessionFactory sessionFactory;
|
|
|
38 |
|
| 35247 |
vikas |
39 |
@Autowired
|
|
|
40 |
private GenericRepository genericRepository;
|
|
|
41 |
|
| 35104 |
vikas |
42 |
@Override
|
| 35150 |
vikas |
43 |
public void disburseRewardsByEligibility() {
|
| 35104 |
vikas |
44 |
ProfitMandiConstants.BRAND_REWARD_REGION_IDS.forEach(regionId -> {
|
| 35150 |
vikas |
45 |
LocalDateTime startDateTime = ProfitMandiConstants.OPPO_SCHEME_START_DATE;
|
|
|
46 |
LocalDateTime endDateTime = (regionId == 19) ? ProfitMandiConstants.OPPO_UK_SCHEME_END_DATE : ProfitMandiConstants.OPPO_HR_SCHEME_END_DATE;
|
|
|
47 |
List<EligibleRewardItemsModel> eligibleRewardItemsModelList = selectBrandItemsByRegionAndDate(regionId,"Oppo", startDateTime, endDateTime);
|
| 35104 |
vikas |
48 |
|
| 35152 |
vikas |
49 |
logger.info("eligibleRewardItemsModelList: {}", eligibleRewardItemsModelList);
|
| 35104 |
vikas |
50 |
for (EligibleRewardItemsModel item : eligibleRewardItemsModelList) {
|
| 35152 |
vikas |
51 |
if (item.getRewardedImei() == null) {
|
|
|
52 |
logger.info("rewardHistories after item: {}", item);
|
|
|
53 |
ModelRewardPoints modelReward = modelRewardPointsRepository.findByCatalogAndRegionId(item.getCatalogId(), regionId);
|
|
|
54 |
logger.info("modelReward after item: {}", modelReward);
|
| 35104 |
vikas |
55 |
|
| 35182 |
vikas |
56 |
BigDecimal rewardPoints = BigDecimal.valueOf(item.getQuantity());;
|
|
|
57 |
/*if (regionId == 19) {
|
| 35152 |
vikas |
58 |
if (modelReward != null) {
|
|
|
59 |
rewardPoints = BigDecimal.valueOf(modelReward.getPoints());
|
|
|
60 |
} else {
|
|
|
61 |
rewardPoints = BigDecimal.valueOf(ProfitMandiConstants.getRewardPoint(item.getDp()));
|
|
|
62 |
}
|
| 35150 |
vikas |
63 |
} else {
|
| 35152 |
vikas |
64 |
rewardPoints = BigDecimal.valueOf(item.getQuantity());
|
| 35182 |
vikas |
65 |
}*/
|
| 35150 |
vikas |
66 |
|
| 35152 |
vikas |
67 |
logger.info("rewardPoints after item: {}", rewardPoints);
|
| 35104 |
vikas |
68 |
|
| 35152 |
vikas |
69 |
SaleRewardHistory saleRewardHistory = new SaleRewardHistory();
|
|
|
70 |
saleRewardHistory.setCatalogId(item.getCatalogId());
|
|
|
71 |
saleRewardHistory.setFofoId(item.getFofoStoreId());
|
|
|
72 |
saleRewardHistory.setOrderId(item.getOrderId());
|
|
|
73 |
saleRewardHistory.setPointEarned(rewardPoints);
|
|
|
74 |
saleRewardHistory.setImeis(item.getSerialNumber());
|
|
|
75 |
saleRewardHistory.setQty(item.getQuantity());
|
|
|
76 |
logger.info("saleRewardHistory: {}", saleRewardHistory);
|
|
|
77 |
saleRewardHistoryRepository.persist(saleRewardHistory);
|
|
|
78 |
}
|
| 35104 |
vikas |
79 |
}
|
|
|
80 |
});
|
|
|
81 |
|
|
|
82 |
}
|
|
|
83 |
|
|
|
84 |
@Override
|
|
|
85 |
public Map<String, Object> findByFofoAndRegionId(int fofoId, int regionId) {
|
|
|
86 |
|
|
|
87 |
List<SaleRewardHistory> saleRewardHistories = saleRewardHistoryRepository.findByFofoId(fofoId);
|
|
|
88 |
|
|
|
89 |
if (saleRewardHistories == null) {
|
|
|
90 |
saleRewardHistories = Collections.emptyList();
|
|
|
91 |
}
|
|
|
92 |
|
|
|
93 |
int totalQuantity = saleRewardHistories.stream()
|
|
|
94 |
.map(SaleRewardHistory::getQty)
|
|
|
95 |
.filter(Objects::nonNull)
|
|
|
96 |
.mapToInt(Integer::intValue)
|
|
|
97 |
.sum();
|
|
|
98 |
|
|
|
99 |
double totalPoints = saleRewardHistories.stream()
|
|
|
100 |
.map(SaleRewardHistory::getPointEarned)
|
|
|
101 |
.filter(Objects::nonNull)
|
|
|
102 |
.mapToDouble(p -> p.doubleValue())
|
|
|
103 |
.sum();
|
|
|
104 |
|
|
|
105 |
List<BrandSalesRewards> brandSalesRewardsList = modelRewardPointsRepository.selectAllByRegionId(regionId);
|
| 35116 |
vikas |
106 |
BrandSalesRewards reward = null;
|
|
|
107 |
if (regionId == 19) {
|
|
|
108 |
reward = brandSalesRewardsList.stream()
|
|
|
109 |
.filter(r -> r.getSalesScore() <= (int) Math.floor(totalPoints))
|
|
|
110 |
.max(Comparator.comparingInt(BrandSalesRewards::getSalesScore))
|
|
|
111 |
.orElse(null);
|
|
|
112 |
} else {
|
|
|
113 |
reward = brandSalesRewardsList.stream()
|
|
|
114 |
.filter(r -> totalQuantity >= r.getSalesScore() && totalQuantity <= r.getPerPointBonus())
|
|
|
115 |
.findFirst()
|
|
|
116 |
.orElse(null);
|
|
|
117 |
}
|
| 35104 |
vikas |
118 |
logger.info("reward after item: {}", reward);
|
|
|
119 |
|
|
|
120 |
Map<String, Object> map = Maps.newHashMap();
|
|
|
121 |
map.put("quantity",totalQuantity);
|
|
|
122 |
map.put("points",totalPoints);
|
|
|
123 |
if (reward != null) {
|
|
|
124 |
map.put("gift", reward.getRewardName()+" ("+reward.getQty()+") or "+reward.getRewardValue());
|
|
|
125 |
} else {
|
|
|
126 |
map.put("gift", "No Reward");
|
|
|
127 |
}
|
|
|
128 |
return map;
|
|
|
129 |
}
|
|
|
130 |
|
| 35150 |
vikas |
131 |
public List<EligibleRewardItemsModel> selectBrandItemsByRegionAndDate(int regionId, String brand, LocalDateTime startDateTime, LocalDateTime endDateTime) {
|
| 35104 |
vikas |
132 |
Session session = sessionFactory.getCurrentSession();
|
|
|
133 |
final TypedQuery<EligibleRewardItemsModel> typedQuery =
|
|
|
134 |
session.createNamedQuery("FofoOrderItem.selectBrandItemsByRegionAndDate", EligibleRewardItemsModel.class);
|
|
|
135 |
|
|
|
136 |
typedQuery.setParameter("brand", brand);
|
|
|
137 |
typedQuery.setParameter("regionId", regionId);
|
| 35150 |
vikas |
138 |
typedQuery.setParameter("orderStartDate", startDateTime);
|
|
|
139 |
typedQuery.setParameter("orderEndDate", endDateTime);
|
| 35104 |
vikas |
140 |
return typedQuery.getResultList();
|
|
|
141 |
}
|
| 35247 |
vikas |
142 |
|
|
|
143 |
public StoreSalesTarget findTargetsByFofoId(int fofoId) {
|
|
|
144 |
return genericRepository.selectByEqual(StoreSalesTarget.class, "fofoId", fofoId);
|
|
|
145 |
}
|
| 35104 |
vikas |
146 |
}
|