Subversion Repositories SmartDukaan

Rev

Rev 35149 | Rev 35152 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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