Subversion Repositories SmartDukaan

Rev

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