Subversion Repositories SmartDukaan

Rev

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