Subversion Repositories SmartDukaan

Rev

Rev 35247 | 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;
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
}