Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
32044 tejbeer 1
package com.spice.profitmandi.service;
2
 
3
import com.spice.profitmandi.common.model.CustomRetailer;
4
import com.spice.profitmandi.common.util.FileUtil;
5
import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;
6
import com.spice.profitmandi.dao.entity.fofo.RetailerFilter;
7
import com.spice.profitmandi.dao.entity.transaction.Loan;
8
import com.spice.profitmandi.dao.model.BillingDaysAvg;
9
import com.spice.profitmandi.dao.model.LastSaleDateModel;
10
import com.spice.profitmandi.dao.model.RetailerFilterModel;
11
import com.spice.profitmandi.dao.model.RetailerPeformanceFilterModel;
12
import com.spice.profitmandi.dao.repository.cs.CsService;
13
import com.spice.profitmandi.dao.repository.dtr.RetailerFilterRepository;
14
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
15
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
16
import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;
17
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
32174 tejbeer 18
import com.spice.profitmandi.service.transaction.SDCreditService;
32044 tejbeer 19
import com.spice.profitmandi.service.user.RetailerService;
32229 amit.gupta 20
import org.apache.commons.io.output.ByteArrayOutputStream;
21
import org.apache.logging.log4j.LogManager;
22
import org.apache.logging.log4j.Logger;
23
import org.springframework.beans.factory.annotation.Autowired;
24
import org.springframework.core.io.ByteArrayResource;
25
import org.springframework.core.io.InputStreamSource;
26
import org.springframework.mail.javamail.JavaMailSender;
27
import org.springframework.mail.javamail.MimeMessageHelper;
28
import org.springframework.stereotype.Component;
32044 tejbeer 29
 
32229 amit.gupta 30
import javax.mail.internet.InternetAddress;
31
import javax.mail.internet.MimeMessage;
32
import java.text.DecimalFormat;
33
import java.text.NumberFormat;
34
import java.time.Duration;
35
import java.time.LocalDate;
36
import java.time.LocalDateTime;
37
import java.time.LocalTime;
38
import java.util.*;
39
import java.util.Map.Entry;
40
import java.util.stream.Collectors;
41
 
32044 tejbeer 42
@Component
43
public class PerformanceServiceImpl implements PerformanceService {
44
 
45
 
46
    @Autowired
47
    private PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
48
 
49
    @Autowired
50
    private OrderRepository orderRepository;
51
 
52
    @Autowired
53
    private FofoOrderRepository fofoOrderRepository;
54
 
55
    @Autowired
56
    private FofoOrderItemRepository fofoOrderItemRepository;
57
 
58
    @Autowired
32174 tejbeer 59
    private SDCreditService sdCreditServiceImpl;
32044 tejbeer 60
 
61
    @Autowired
62
    private RetailerService retailerService;
63
 
64
    @Autowired
65
    private CsService csService;
66
 
67
    @Autowired
68
    private JavaMailSender mailSender;
69
 
70
    @Autowired
71
    private RetailerFilterRepository retailerFilterRepository;
72
 
73
 
74
    private static final Logger LOGGER = LogManager.getLogger(PerformanceServiceImpl.class);
75
 
76
 
77
    @Override
78
    public List<RetailerPeformanceFilterModel> getPerformance(RetailerFilterModel retailerFilter, Map<Integer, CustomRetailer> customRetailers) {
79
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
80
        LocalDateTime startDate = curDate.minusMonths(3);
81
        List<RetailerPeformanceFilterModel> retailerPerPeformanceFilterModels = new ArrayList<RetailerPeformanceFilterModel>();
82
        DecimalFormat decimalFormatter = new DecimalFormat("0.#");
83
 
32096 tejbeer 84
        Map<Integer, List<Loan>> duedateMap = new HashMap<Integer, List<Loan>>();
85
 
86
        Map<Integer, List<Loan>> defaultdateMap = new HashMap<Integer, List<Loan>>();
87
 
32044 tejbeer 88
        Map<Integer, BillingDaysAvg> billingDeliverAvgMap = new HashMap<Integer, BillingDaysAvg>();
89
        Map<Integer, Long> lastPurchaseMap = new HashMap<Integer, Long>();
90
        Map<Integer, Long> lastSaleMap = new HashMap<Integer, Long>();
91
        Map<Integer, PartnerDailyInvestment> partnerDailyInvestmentMap = new HashMap<Integer, PartnerDailyInvestment>();
92
        Map<Integer, Double> secondaryPartner = new HashMap<Integer, Double>();
93
 
94
        Map<Integer, Double> tertiaryPartner = new HashMap<Integer, Double>();
95
 
96
 
97
        if (retailerFilter.isCredit()) {
32171 jai.hind 98
            List<Loan> dueDateLoans = sdCreditServiceImpl.getDueDateCrossLoan();
99
            List<Loan> defaultLoans = sdCreditServiceImpl.getDefaultLoan();
32044 tejbeer 100
 
101
            if (!defaultLoans.isEmpty()) {
32096 tejbeer 102
                defaultdateMap = defaultLoans.stream().collect(Collectors.groupingBy(x -> x.getFofoId()));
32044 tejbeer 103
            }
32096 tejbeer 104
            if (!dueDateLoans.isEmpty()) {
105
                duedateMap = dueDateLoans.stream().collect(Collectors.groupingBy(x -> x.getFofoId()));
106
            }
32044 tejbeer 107
        }
108
 
32096 tejbeer 109
 
32044 tejbeer 110
        if (retailerFilter.isBilling()) {
111
            List<BillingDaysAvg> billingDeliveryAvg = orderRepository.selectBillingToDeliverAvg(startDate, LocalDateTime.now());
112
            if (!billingDeliveryAvg.isEmpty()) {
113
                billingDeliverAvgMap = billingDeliveryAvg.stream().filter(x -> x.getAvg() > 1).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
114
            }
115
        }
116
 
117
 
118
        if (retailerFilter.getSecondaryDays() != null) {
119
            List<LastSaleDateModel> purchaseOrders = orderRepository.getLastOrders();
120
            for (LastSaleDateModel purchaseOrder : purchaseOrders) {
32091 tejbeer 121
                long daysBetween = Duration.between(purchaseOrder.getDateTime().plusDays(1), LocalDateTime.now()).toDays();
32044 tejbeer 122
                if (daysBetween >= retailerFilter.getSecondaryDays()) {
123
                    lastPurchaseMap.put(purchaseOrder.getFofoId(), daysBetween);
124
                }
125
            }
126
        }
127
 
128
 
129
        if (retailerFilter.getTertiaryDays() != null) {
130
            List<LastSaleDateModel> saleOrders = fofoOrderRepository.getLastTertiaryOrders();
131
            for (LastSaleDateModel saleOrder : saleOrders) {
32091 tejbeer 132
                long daysBetween = Duration.between(saleOrder.getDateTime().plusDays(1), LocalDateTime.now()).toDays();
32044 tejbeer 133
                if (daysBetween >= retailerFilter.getTertiaryDays()) {
134
                    lastSaleMap.put(saleOrder.getFofoId(), daysBetween);
135
                }
136
            }
137
        }
138
 
139
 
140
        if (retailerFilter.getInvestmentPct() != null) {
32118 tejbeer 141
            List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository.selectAll(LocalDate.now().minusDays(1));
32044 tejbeer 142
            partnerDailyInvestmentMap = partnerDailyInvestments.stream().filter(x -> (100 - retailerFilter.getInvestmentPct()) <= x.getShortPercentage()).collect(Collectors.toMap(x -> x.getFofoId(), x -> x));
143
        }
144
 
145
 
146
        if (retailerFilter.getMtdsPct() != null) {
147
            Map<Integer, Double> secondaryMtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX));
148
            Map<Integer, Double> secondarylmtd = orderRepository.selectBillingDatesBetweenSumGroupByRetailerId(
149
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1));
150
 
151
            Set<Integer> fofoIds = new HashSet<>();
152
            fofoIds.addAll(secondaryMtd.keySet());
153
            fofoIds.addAll(secondarylmtd.keySet());
154
 
32096 tejbeer 155
 
32044 tejbeer 156
            for (Integer fofoId : fofoIds) {
157
                double mtdVal = 0;
158
                double lmtdVal = 0;
159
                if (secondaryMtd.get(fofoId) != null) {
160
                    mtdVal = secondaryMtd.get(fofoId);
161
                }
162
                if (secondarylmtd.get(fofoId) != null) {
163
                    lmtdVal = secondarylmtd.get(fofoId);
164
                }
165
 
32118 tejbeer 166
                double value = ((lmtdVal - mtdVal) / lmtdVal) * 100;
167
                if (value >= retailerFilter.getMtdsPct()) {
32044 tejbeer 168
                    secondaryPartner.put(fofoId, value);
169
                }
32095 tejbeer 170
 
171
 
32044 tejbeer 172
            }
32095 tejbeer 173
 
32044 tejbeer 174
        }
175
 
176
 
32093 tejbeer 177
        if (retailerFilter.getMtdtPct() != null) {
32044 tejbeer 178
            Map<Integer, Double> lmtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(
179
                    curDate.withDayOfMonth(1).minusMonths(1), curDate.with(LocalTime.MAX).minusMonths(1), 0, false);
180
            Map<Integer, Double> mtdSale = fofoOrderItemRepository.selectSumMopGroupByRetailer(curDate.withDayOfMonth(1), curDate.with(LocalTime.MAX), 0, false);
181
 
182
            Set<Integer> fofoIds = new HashSet<>();
183
            fofoIds.addAll(lmtdSale.keySet());
184
            fofoIds.addAll(mtdSale.keySet());
185
 
186
            for (Integer fofoId : fofoIds) {
187
                double mtdVal = 0;
188
                double lmtdVal = 0;
189
                if (mtdSale.get(fofoId) != null) {
190
                    mtdVal = mtdSale.get(fofoId);
191
                }
192
                if (lmtdSale.get(fofoId) != null) {
193
                    lmtdVal = lmtdSale.get(fofoId);
194
                }
195
 
32119 tejbeer 196
                double value = ((lmtdVal - mtdVal) / lmtdVal) * 100;
197
                if (value >= retailerFilter.getMtdtPct()) {
32044 tejbeer 198
                    tertiaryPartner.put(fofoId, value);
199
                }
200
            }
201
 
202
 
203
        }
204
 
32091 tejbeer 205
        LOGGER.info("tertiaryPartner {}", tertiaryPartner);
206
 
207
        LOGGER.info("secondaryPartner {}", secondaryPartner);
208
 
209
 
32044 tejbeer 210
        NumberFormat numberformat = NumberFormat.getNumberInstance(new Locale("en", "IN"));
211
 
212
 
213
        for (Entry<Integer, CustomRetailer> customRetailerEntry : customRetailers.entrySet()) {
214
            int fofoId = customRetailerEntry.getKey();
215
            RetailerPeformanceFilterModel retailerPeformanceFilterModel = new RetailerPeformanceFilterModel();
32229 amit.gupta 216
            retailerPeformanceFilterModel.setActivationType(customRetailerEntry.getValue().getActivationType());
217
            retailerPeformanceFilterModel.setState(customRetailerEntry.getValue().getAddress().getState());
32044 tejbeer 218
            if (retailerFilter.isCredit()) {
32096 tejbeer 219
 
220
                if (!duedateMap.isEmpty()) {
32102 tejbeer 221
                    if (duedateMap.containsKey(fofoId)) {
222
                        retailerPeformanceFilterModel.setCredit("Due");
223
                    }
32044 tejbeer 224
                }
32096 tejbeer 225
                if (!defaultdateMap.isEmpty()) {
32102 tejbeer 226
                    if (defaultdateMap.containsKey(fofoId)) {
32096 tejbeer 227
 
32102 tejbeer 228
                        retailerPeformanceFilterModel.setCredit("Default");
229
                    }
230
 
32096 tejbeer 231
                }
32044 tejbeer 232
            }
233
 
234
            if (retailerFilter.isBilling()) {
235
                if (!billingDeliverAvgMap.isEmpty()) {
236
                    if (billingDeliverAvgMap.containsKey(fofoId)) {
237
                        retailerPeformanceFilterModel.setBilling(billingDeliverAvgMap.get(fofoId).getAvg());
238
                    }
239
                }
240
            }
241
 
242
            if (retailerFilter.getInvestmentPct() != null) {
243
 
244
                if (!partnerDailyInvestmentMap.isEmpty()) {
245
                    if (partnerDailyInvestmentMap.containsKey(fofoId)) {
246
                        retailerPeformanceFilterModel.setInvestment(100 - partnerDailyInvestmentMap.get(fofoId).getShortPercentage());
247
                    }
248
                }
249
 
250
            }
251
 
252
            if (retailerFilter.getSecondaryDays() != null) {
253
                if (!lastPurchaseMap.isEmpty()) {
254
                    if (lastPurchaseMap.containsKey(fofoId)) {
255
                        retailerPeformanceFilterModel.setSecondaryDays(lastPurchaseMap.get(fofoId));
256
                    }
257
                }
258
 
259
            }
260
 
261
 
262
            if (retailerFilter.getTertiaryDays() != null) {
263
                if (!lastSaleMap.isEmpty()) {
264
                    if (lastSaleMap.containsKey(fofoId)) {
265
                        retailerPeformanceFilterModel.setTertiaryDays(lastSaleMap.get(fofoId));
266
                    }
267
                }
268
            }
269
 
270
 
271
            if (retailerFilter.getMtdsPct() != null) {
272
                if (!secondaryPartner.isEmpty()) {
273
                    if (secondaryPartner.containsKey(fofoId)) {
274
                        retailerPeformanceFilterModel.setMtds(Double.valueOf(numberformat.format(secondaryPartner.get(fofoId))));
275
                    }
276
                }
277
            }
278
 
279
 
280
            if (retailerFilter.getMtdtPct() != null) {
281
                if (!tertiaryPartner.isEmpty()) {
282
                    if (tertiaryPartner.containsKey(fofoId)) {
283
                        retailerPeformanceFilterModel.setMtdt(Double.valueOf(numberformat.format(tertiaryPartner.get(fofoId))));
284
                    }
285
                }
286
            }
287
 
288
            if (retailerPeformanceFilterModel.getBilling() != null || retailerPeformanceFilterModel.getCredit() != null || retailerPeformanceFilterModel.getInvestment() != null || retailerPeformanceFilterModel.getSecondaryDays() != null || retailerPeformanceFilterModel.getTertiaryDays() != null || retailerPeformanceFilterModel.getMtds() != null || retailerPeformanceFilterModel.getMtdt() != null) {
289
 
290
                retailerPeformanceFilterModel.setFofoId(fofoId);
291
                retailerPerPeformanceFilterModels.add(retailerPeformanceFilterModel);
292
            }
293
 
294
 
295
        }
296
 
297
        return retailerPerPeformanceFilterModels;
298
    }
299
 
300
    public void sendPartnerPerformanceEmail(Map<Integer, RetailerPeformanceFilterModel> partnersPerformanceMap, RetailerFilterModel retailerFilterModel, Map<Integer, CustomRetailer> customRetailers) throws Exception {
301
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
302
 
303
        LOGGER.info("retailerFilterModel {}", retailerFilterModel);
304
        for (Entry<String, Set<Integer>> storeGuyEntry : storeGuyMap.entrySet()) {
305
 
306
            Set<Integer> fofoIds = storeGuyEntry.getValue();
307
            List<List<?>> rows = new ArrayList<>();
32229 amit.gupta 308
            List<String> headers = Arrays.asList("Partner Name", "Code", "ActivationType", "State", "Credit- Due/Default", "Billing To Deliver", "Investment- Lower Than " + retailerFilterModel.getInvestmentPct() + "%", "Last Secondary-" + retailerFilterModel.getSecondaryDays() + "days", "Last Tertiary-" + retailerFilterModel.getTertiaryDays() + "days", "MTD Secondary < LMTD-" + retailerFilterModel.getMtdsPct() + "%", "MTD Tertiary < LMTD-" + retailerFilterModel.getMtdtPct() + "%");
32044 tejbeer 309
 
310
 
311
            LOGGER.info("headers {}", headers);
312
 
313
            for (Integer fofoId : fofoIds) {
314
                RetailerPeformanceFilterModel retailerPerformanceFilterModel = partnersPerformanceMap.get(fofoId);
315
 
316
                LOGGER.info("retailerPerformanceFilterModel {}", retailerPerformanceFilterModel);
317
 
318
                if (retailerPerformanceFilterModel != null) {
32229 amit.gupta 319
                    rows.add(Arrays.asList(customRetailers.get(fofoId).getBusinessName(), customRetailers.get(fofoId).getCode(), retailerPerformanceFilterModel.getActivationType(), retailerPerformanceFilterModel.getState(), retailerPerformanceFilterModel.getCredit(), retailerPerformanceFilterModel.getBilling(), retailerPerformanceFilterModel.getInvestment(), retailerPerformanceFilterModel.getSecondaryDays(), retailerPerformanceFilterModel.getTertiaryDays(), retailerPerformanceFilterModel.getMtds(), retailerPerformanceFilterModel.getMtdt()));
32044 tejbeer 320
                }
321
 
322
            }
323
            if (!rows.isEmpty()) {
324
                ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, rows);
32046 tejbeer 325
                this.sendMailWithAttachment(mailSender, new String[]{storeGuyEntry.getKey()}, null, "Partner Performance", "PFA", "PartnerPerformance.csv", new ByteArrayResource(baos.toByteArray()));
32044 tejbeer 326
            }
327
 
328
        }
329
 
330
 
331
    }
332
 
333
    public void sendMailWithAttachment(JavaMailSender mailSender, String[] emailTo, String[] cc, String subject, String body, String fileName, InputStreamSource inputStreamSource) throws Exception {
334
        MimeMessage message = mailSender.createMimeMessage();
335
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
336
        helper.setSubject(subject);
337
        helper.setText(body);
338
        if (cc != null) {
339
            helper.setCc(cc);
340
        }
341
        helper.setTo(emailTo);
342
        helper.addAttachment(fileName, inputStreamSource);
343
        InternetAddress senderAddress = new InternetAddress("noreply@smartdukaan.com", "SmartDukaan Care");
344
        helper.setFrom(senderAddress);
345
        mailSender.send(message);
346
    }
347
 
348
 
349
    public RetailerFilterModel getRetailerFilterModel() {
350
        List<RetailerFilter> retailerFilters = retailerFilterRepository.selectAll();
351
 
352
        RetailerFilterModel retailerFilterModel = new RetailerFilterModel();
353
 
354
        for (RetailerFilter retailerFilter : retailerFilters) {
355
            if (retailerFilter.getName().equals("BillingToDeliverAvg")) {
356
                retailerFilterModel.setBilling(true);
357
            }
358
 
359
            if (retailerFilter.getName().equals("credit due/default")) {
360
                retailerFilterModel.setCredit(true);
361
            }
362
            if (retailerFilter.getName().equals("Investment")) {
363
                retailerFilterModel.setInvestmentPct(retailerFilter.getValue());
364
            }
365
            if (retailerFilter.getName().equals("Last Secondary")) {
366
                retailerFilterModel.setSecondaryDays(retailerFilter.getValue());
367
            }
368
            if (retailerFilter.getName().equals("Last Tertiary")) {
369
                retailerFilterModel.setTertiaryDays(retailerFilter.getValue());
370
            }
371
            if (retailerFilter.getName().equals("Secondary")) {
372
                retailerFilterModel.setMtdsPct(20);
373
            }
374
            if (retailerFilter.getName().equals("Tertiary")) {
375
                retailerFilterModel.setMtdtPct(20);
376
            }
377
 
378
 
379
        }
380
        return retailerFilterModel;
381
    }
382
 
383
 
384
}