Subversion Repositories SmartDukaan

Rev

Rev 35143 | Rev 35149 | 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;
22
import java.time.LocalTime;
23
import java.util.*;
24
 
25
@Transactional(rollbackFor = Throwable.class)
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
 
39
    @Override
40
    public void disburseRewardsByEligibility(LocalDate date) {
41
        ProfitMandiConstants.BRAND_REWARD_REGION_IDS.forEach(regionId -> {
42
            List<EligibleRewardItemsModel> eligibleRewardItemsModelList = selectBrandItemsByRegionAndDate(regionId,"Oppo", date);
43
 
44
            for (EligibleRewardItemsModel item : eligibleRewardItemsModelList) {
45
                logger.info("rewardHistories after item: {}", item);
35116 vikas 46
                ModelRewardPoints modelReward = modelRewardPointsRepository.findByCatalogAndRegionId(item.getCatalogId(), regionId);
47
                logger.info("modelReward after item: {}", modelReward);
35104 vikas 48
 
35116 vikas 49
                BigDecimal rewardPoints;
35104 vikas 50
 
35116 vikas 51
                if (modelReward != null) {
52
                    rewardPoints = BigDecimal.valueOf(modelReward.getPoints());
53
                } else {
54
                    rewardPoints = BigDecimal.valueOf(ProfitMandiConstants.getRewardPoint(item.getDp()));
55
                }
56
                logger.info("rewardPoints after item: {}", rewardPoints);
35104 vikas 57
 
35116 vikas 58
                SaleRewardHistory saleRewardHistory = new SaleRewardHistory();
59
                saleRewardHistory.setCatalogId(item.getCatalogId());
60
                saleRewardHistory.setFofoId(item.getFofoStoreId());
61
                saleRewardHistory.setOrderId(item.getOrderId());
62
                saleRewardHistory.setPointEarned(rewardPoints);
63
                saleRewardHistory.setImeis(item.getSerialNumber());
64
                saleRewardHistory.setQty(item.getQuantity());
65
                saleRewardHistoryRepository.persist(saleRewardHistory);
35104 vikas 66
            }
67
        });
68
 
69
    }
70
 
71
    @Override
72
    public Map<String, Object> findByFofoAndRegionId(int fofoId, int regionId) {
73
 
74
        List<SaleRewardHistory> saleRewardHistories = saleRewardHistoryRepository.findByFofoId(fofoId);
75
 
76
        if (saleRewardHistories == null) {
77
            saleRewardHistories = Collections.emptyList();
78
        }
79
 
80
        int totalQuantity = saleRewardHistories.stream()
81
                .map(SaleRewardHistory::getQty)
82
                .filter(Objects::nonNull)
83
                .mapToInt(Integer::intValue)
84
                .sum();
85
 
86
        double totalPoints = saleRewardHistories.stream()
87
                .map(SaleRewardHistory::getPointEarned)
88
                .filter(Objects::nonNull)
89
                .mapToDouble(p -> p.doubleValue())
90
                .sum();
91
 
92
        List<BrandSalesRewards> brandSalesRewardsList = modelRewardPointsRepository.selectAllByRegionId(regionId);
35116 vikas 93
        BrandSalesRewards reward = null;
94
        if (regionId == 19) {
95
            reward = brandSalesRewardsList.stream()
96
                    .filter(r -> r.getSalesScore() <= (int) Math.floor(totalPoints))
97
                    .max(Comparator.comparingInt(BrandSalesRewards::getSalesScore))
98
                    .orElse(null);
99
        } else {
100
            reward = brandSalesRewardsList.stream()
101
                    .filter(r -> totalQuantity >= r.getSalesScore() && totalQuantity <= r.getPerPointBonus())
102
                    .findFirst()
103
                    .orElse(null);
104
        }
35104 vikas 105
        logger.info("reward after item: {}", reward);
106
 
107
        Map<String, Object> map = Maps.newHashMap();
108
        map.put("quantity",totalQuantity);
109
        map.put("points",totalPoints);
110
        if (reward != null) {
111
            map.put("gift", reward.getRewardName()+" ("+reward.getQty()+") or "+reward.getRewardValue());
112
        } else {
113
            map.put("gift", "No Reward");
114
        }
115
        return map;
116
    }
117
 
118
    public List<EligibleRewardItemsModel> selectBrandItemsByRegionAndDate(int regionId, String brand, LocalDate date) {
119
        Session session = sessionFactory.getCurrentSession();
120
        final TypedQuery<EligibleRewardItemsModel> typedQuery =
121
            session.createNamedQuery("FofoOrderItem.selectBrandItemsByRegionAndDate", EligibleRewardItemsModel.class);
122
 
123
        typedQuery.setParameter("brand", brand);
124
        typedQuery.setParameter("regionId", regionId);
35144 vikas 125
        typedQuery.setParameter("orderStartDate", date.atStartOfDay());
35104 vikas 126
        typedQuery.setParameter("orderEndDate", date.atTime(LocalTime.MAX));
127
        return typedQuery.getResultList();
128
    }
129
}