Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
23819 govind 1
package com.spice.profitmandi.web.controller;
2
 
23945 amit.gupta 3
import com.fasterxml.jackson.databind.ObjectMapper;
29926 amit.gupta 4
import com.spice.profitmandi.common.enumuration.MessageType;
23819 govind 5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
29926 amit.gupta 6
import com.spice.profitmandi.common.model.*;
23945 amit.gupta 7
import com.spice.profitmandi.common.services.ReporticoService;
23951 amit.gupta 8
import com.spice.profitmandi.common.util.FileUtil;
23945 amit.gupta 9
import com.spice.profitmandi.common.util.FormattingUtils;
28102 tejbeer 10
import com.spice.profitmandi.common.util.Utils;
23819 govind 11
import com.spice.profitmandi.dao.entity.catalog.Item;
23884 amit.gupta 12
import com.spice.profitmandi.dao.entity.catalog.TagListing;
32905 shampa 13
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
24822 amit.gupta 14
import com.spice.profitmandi.dao.entity.inventory.ItemPricingHistory;
23884 amit.gupta 15
import com.spice.profitmandi.dao.entity.inventory.VendorItemPricing;
23819 govind 16
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
24083 amit.gupta 17
import com.spice.profitmandi.dao.entity.transaction.PriceDropIMEI;
31903 amit.gupta 18
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
24083 amit.gupta 19
import com.spice.profitmandi.dao.enumuration.transaction.PriceDropImeiStatus;
31903 amit.gupta 20
import com.spice.profitmandi.dao.model.AmountModel;
23819 govind 21
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
23884 amit.gupta 22
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
29926 amit.gupta 23
import com.spice.profitmandi.dao.repository.cs.CsService;
28136 tejbeer 24
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
28102 tejbeer 25
import com.spice.profitmandi.dao.repository.dtr.Mongo;
29926 amit.gupta 26
import com.spice.profitmandi.dao.repository.dtr.UserRepository;
28102 tejbeer 27
import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;
24822 amit.gupta 28
import com.spice.profitmandi.dao.repository.inventory.ItemPricingHistoryRepository;
23884 amit.gupta 29
import com.spice.profitmandi.dao.repository.inventory.VendorItemPricingRepository;
23983 amit.gupta 30
import com.spice.profitmandi.dao.repository.transaction.LineItemImeisRepository;
24083 amit.gupta 31
import com.spice.profitmandi.dao.repository.transaction.PriceDropIMEIRepository;
23819 govind 32
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
29926 amit.gupta 33
import com.spice.profitmandi.service.NotificationService;
29951 amit.gupta 34
import com.spice.profitmandi.service.authentication.RoleManager;
32844 shampa 35
import com.spice.profitmandi.service.catalog.BrandsService;
23819 govind 36
import com.spice.profitmandi.service.inventory.InventoryService;
31903 amit.gupta 37
import com.spice.profitmandi.service.pricecircular.PriceCircularItemModelNew;
29788 amit.gupta 38
import com.spice.profitmandi.service.pricecircular.PriceCircularModel;
39
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
23983 amit.gupta 40
import com.spice.profitmandi.service.pricing.PriceDropService;
23968 amit.gupta 41
import com.spice.profitmandi.service.scheme.SchemeService;
23884 amit.gupta 42
import com.spice.profitmandi.service.transaction.TransactionService;
28102 tejbeer 43
import com.spice.profitmandi.service.user.RetailerService;
23819 govind 44
import com.spice.profitmandi.service.wallet.WalletService;
28102 tejbeer 45
import com.spice.profitmandi.web.model.LoginDetails;
46
import com.spice.profitmandi.web.util.CookiesProcessor;
23819 govind 47
import com.spice.profitmandi.web.util.MVCResponseSender;
29926 amit.gupta 48
import org.apache.commons.io.output.ByteArrayOutputStream;
49
import org.apache.logging.log4j.LogManager;
50
import org.apache.logging.log4j.Logger;
51
import org.springframework.beans.factory.annotation.Autowired;
52
import org.springframework.beans.factory.annotation.Qualifier;
53
import org.springframework.core.io.ByteArrayResource;
54
import org.springframework.http.HttpHeaders;
55
import org.springframework.http.HttpStatus;
56
import org.springframework.http.ResponseEntity;
57
import org.springframework.stereotype.Controller;
58
import org.springframework.transaction.annotation.Transactional;
59
import org.springframework.ui.Model;
60
import org.springframework.web.bind.annotation.*;
23819 govind 61
 
29926 amit.gupta 62
import javax.servlet.http.HttpServletRequest;
63
import java.io.Serializable;
64
import java.time.LocalDate;
65
import java.time.LocalDateTime;
66
import java.util.*;
67
import java.util.stream.Collectors;
68
 
23819 govind 69
@Controller
27071 amit.gupta 70
@Transactional(rollbackFor = Throwable.class)
23819 govind 71
public class PriceDropController {
72
 
31903 amit.gupta 73
    private static final Logger LOGGER = LogManager.getLogger(PriceDropController.class);
74
    private static final List<String> SELLINS = Arrays.asList("Base Payout", "Cash Discount", "Upfront Margin", "Modelwise");
31910 amit.gupta 75
    private static final List<String> SELLOUTS = Arrays.asList("Tertiary Payout", "Hygiene Payout", "Investment Payout", "Category Payout", "Activation Margin", "Special Support", "Sellout Support");
31903 amit.gupta 76
    private static final List<String> ALL_MARGINS = Arrays.asList(SELLINS, SELLOUTS).stream().flatMap(x -> x.stream()).collect(Collectors.toList());
77
    @Autowired
78
    ReporticoService reporticoService;
79
    @Autowired
80
    LineItemImeisRepository lineItemImeisRepository;
81
    @Autowired
82
    PriceCircularService priceCircularService;
83
    @Autowired
84
    private CsService csService;
85
    @Autowired
86
    private UserRepository dtrUserRepository;
87
    @Autowired
88
    private PriceDropRepository priceDropRepository;
89
    @Autowired
90
    private ObjectMapper objectMapper;
91
    @Autowired
92
    private VendorItemPricingRepository vendorItemPricingRepository;
93
    @Autowired
94
    @Qualifier("fofoInventoryService")
95
    private InventoryService inventoryService;
96
    @Autowired
97
    private MVCResponseSender mvcResponseSender;
98
    @Autowired
99
    private PriceDropService priceDropService;
100
    @Autowired
101
    private ItemPricingHistoryRepository itemPricingHistoryRepository;
102
    @Autowired
103
    private WalletService walletService;
104
    @Autowired
105
    private TagListingRepository tagListingRepository;
106
    @Autowired
107
    private TransactionService transactionService;
108
    @Autowired
109
    private PriceDropIMEIRepository priceDropIMEIRepository;
110
    @Autowired
111
    private RoleManager roleManager;
112
    @Autowired
113
    @Qualifier("catalogItemRepository")
114
    private ItemRepository itemRepository;
115
    @Autowired
116
    private SchemeService schemeService;
117
    @Autowired
118
    private Mongo mongoClient;
119
    @Autowired
120
    private CookiesProcessor cookiesProcessor;
121
    @Autowired
122
    private PartnerTypeChangeService partnerTypeChangeService;
123
    @Autowired
124
    private RetailerService retailerService;
125
    @Autowired
126
    private NotificationService notificationService;
127
    @Autowired
128
    private FofoStoreRepository fofoStoreRepository;
23819 govind 129
 
31903 amit.gupta 130
    @RequestMapping(value = "/getItemDescription", method = RequestMethod.GET)
131
    public String getItemDescription(HttpServletRequest request, Model model) throws Throwable {
132
        List<PriceDrop> priceDrops = priceDropRepository.selectAllIncomplete();
133
        Set<Integer> catalogIds = priceDrops.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet());
29926 amit.gupta 134
 
31903 amit.gupta 135
        List<Item> items = itemRepository.selectAllByCatalogIds(catalogIds);
136
        Map<Integer, String> catalogDescription = items.stream().collect(Collectors.toMap(x -> x.getCatalogItemId(),
137
                x -> x.getItemDescriptionNoColor(), (description1, description2) -> description1));
138
        model.addAttribute("priceDrops", priceDrops);
139
        model.addAttribute("catalogDescription", catalogDescription);
140
        return "price-drop";
141
    }
29926 amit.gupta 142
 
31903 amit.gupta 143
    @RequestMapping(value = "/getClosedPricedropItemDescription", method = RequestMethod.GET)
144
    public String getClosedPricedropItemDescription(HttpServletRequest request, Model model) throws Throwable {
145
        List<PriceDrop> priceDrops = priceDropRepository.selectAllComplete();
146
        int processOn = 1;
23819 govind 147
 
31903 amit.gupta 148
        List<PriceDrop> completePriceDrops = priceDrops.stream().filter(x -> x.getCompleteTimestamp() != null)
149
                .collect(Collectors.toList());
23945 amit.gupta 150
 
31903 amit.gupta 151
        Set<Integer> catalogIds = completePriceDrops.stream().map(x -> x.getCatalogItemId())
152
                .collect(Collectors.toSet());
153
        List<Item> items = itemRepository.selectAllByCatalogIds(catalogIds);
154
        LOGGER.info("catalogIds" + catalogIds);
23819 govind 155
 
31903 amit.gupta 156
        Map<Integer, String> catalogDescription = items.stream().collect(Collectors.toMap(x -> x.getCatalogItemId(),
157
                x -> x.getItemDescriptionNoColor(), (description1, description2) -> description1));
158
        model.addAttribute("priceDrops", completePriceDrops);
159
        model.addAttribute("processOn", processOn);
160
        model.addAttribute("catalogDescription", catalogDescription);
161
        return "price-drop";
162
    }
23945 amit.gupta 163
 
31903 amit.gupta 164
    @RequestMapping(value = "/item-pricing/{itemId}", method = RequestMethod.GET)
165
    public String getItemPricing(HttpServletRequest request, Model model, @PathVariable int itemId) throws Throwable {
23819 govind 166
 
31903 amit.gupta 167
        TagListing tagListing;
168
        PriceDropModel pm = new PriceDropModel();
169
        try {
170
            tagListing = tagListingRepository.selectByItemId(itemId);
171
            if (tagListing != null) {
172
                pm.setMop(tagListing.getMop());
173
                pm.setDp(tagListing.getSellingPrice());
174
                pm.setMrp(tagListing.getMrp());
175
                List<VendorItemPricing> vips = vendorItemPricingRepository.selectAll(itemId);
176
                if (vips.size() > 0) {
177
                    VendorItemPricing vip = vips.get(0);
178
                    pm.setNlc(vip.getNlc());
179
                    pm.setTp(vip.getTp());
180
                } else {
181
                    throw new ProfitMandiBusinessException("Item Id", itemId, "Vendor item pricing does not exist");
182
                }
183
            }
184
        } catch (Exception e) {
185
            LOGGER.info("Chose item that doesn't exist");
186
        }
187
        model.addAttribute("response1", mvcResponseSender.createResponseString(pm));
188
        return "response";
189
    }
27071 amit.gupta 190
 
31903 amit.gupta 191
    @RequestMapping(value = "/item", method = RequestMethod.GET)
192
    public String getItemPricing(HttpServletRequest request, Model model, @RequestParam String query,
193
                                 @RequestParam boolean anyColor) throws Throwable {
194
        String query1 = query.toLowerCase();
24083 amit.gupta 195
 
31903 amit.gupta 196
        List<ItemDescriptionModel> partnersItemDescription = inventoryService
197
                .getAllPartnerItemStringDescription(anyColor).parallelStream()
198
                .filter(x -> x.getItemDescription().toLowerCase().matches(".*?" + query1 + ".*?"))
199
                .collect(Collectors.toList());
200
        LOGGER.info("partnersItemDescription" + partnersItemDescription);
23819 govind 201
 
31903 amit.gupta 202
        model.addAttribute("response1", mvcResponseSender.createResponseString(partnersItemDescription));
203
        return "response";
204
    }
23945 amit.gupta 205
 
31903 amit.gupta 206
    @RequestMapping(value = "/price-drop/imes/download")
207
    public ResponseEntity<ByteArrayResource> downloadPriceDropImeis(HttpServletRequest request,
208
                                                                    @RequestParam LocalDateTime affectedDate, @RequestParam int itemId) throws Exception {
209
        Item item = itemRepository.selectById(itemId);
210
        ByteArrayOutputStream baos = getByteArrayOutputStream(affectedDate, item.getCatalogItemId(), null);
211
        final HttpHeaders headers = new HttpHeaders();
212
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
213
        headers.set("Content-disposition", "inline; filename=\"imei-" + item.getItemDescriptionNoColor() + ".csv\"");
214
        byte[] byteArray = baos.toByteArray();
215
        headers.setContentLength(byteArray.length);
216
        return new ResponseEntity<ByteArrayResource>(new ByteArrayResource(byteArray), headers, HttpStatus.OK);
217
    }
23819 govind 218
 
31903 amit.gupta 219
    @RequestMapping(value = "/price-drop/addPayout", method = RequestMethod.POST)
220
    public String updatePriceDrop(HttpServletRequest request, @RequestBody PriceDropProcessModel priceDropProcessModel,
221
                                  Model model) throws Exception {
222
        boolean response = false;
223
        PriceDrop priceDrop = priceDropRepository.selectById(priceDropProcessModel.getPriceDropId());
224
        if (priceDrop.getProcessTimestamp() == null) {
225
            priceDrop.setPartnerPayout(priceDropProcessModel.getPartnerPayout());
226
            priceDrop.setPriceDropIn(priceDropProcessModel.getPriceDropIn());
227
            // priceDrop.setProcessTimestamp(LocalDateTime.now());
228
            priceDropRepository.persist(priceDrop);
229
            response = true;
230
        }
231
        model.addAttribute("response1", mvcResponseSender.createResponseString(response));
232
        return "response";
233
    }
24083 amit.gupta 234
 
31903 amit.gupta 235
    @RequestMapping(value = "/priceDropImeis/{priceDropId}", method = RequestMethod.GET)
236
    public String priceDropStatus(HttpServletRequest request, @PathVariable int priceDropId, Model model)
237
            throws Exception {
29951 amit.gupta 238
 
31903 amit.gupta 239
        PriceDropImeisModel priceDropImeisModel = new PriceDropImeisModel();
23819 govind 240
 
31903 amit.gupta 241
        // This call is used to persit imeis to pricedrop imeis in case its not there.
242
        // This should be called while creating price drop.
243
        // priceDropService.priceDropStatus(priceDropId);
24083 amit.gupta 244
 
31903 amit.gupta 245
        List<String> pendingImeis = new ArrayList<>();
246
        List<String> approvedImeis = new ArrayList<>();
247
        List<String> rejectedImeis = new ArrayList<>();
248
        List<String> holdImeis = new ArrayList<>();
249
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByPriceDropId(priceDropId);
250
        for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
251
            if (priceDropIMEI.getStatus().equals(PriceDropImeiStatus.PENDING)) {
252
                pendingImeis.add(priceDropIMEI.getImei());
253
            } else if (priceDropIMEI.getStatus().equals(PriceDropImeiStatus.APPROVED)) {
254
                approvedImeis.add(priceDropIMEI.getImei());
255
            }
256
            if (priceDropIMEI.getStatus().equals(PriceDropImeiStatus.REJECTED)) {
257
                rejectedImeis.add(priceDropIMEI.getImei());
258
            } else if (priceDropIMEI.getStatus().equals(PriceDropImeiStatus.HOLD)) {
259
                holdImeis.add(priceDropIMEI.getImei());
24083 amit.gupta 260
 
31903 amit.gupta 261
            }
262
        }
263
        LOGGER.info("pendingImeis" + pendingImeis);
264
        LOGGER.info("approvedImeis" + approvedImeis);
265
        LOGGER.info("rejectedImeis" + rejectedImeis);
266
        LOGGER.info("priceDropImeis" + priceDropImeis);
23945 amit.gupta 267
 
31903 amit.gupta 268
        priceDropImeisModel.setPendingImeis(pendingImeis);
269
        priceDropImeisModel.setPriceDropId(priceDropId);
270
        priceDropImeisModel.setApprovedImeis(approvedImeis);
271
        priceDropImeisModel.setHoldImeis(holdImeis);
272
        priceDropImeisModel.setRejectedImeis(rejectedImeis);
273
        model.addAttribute("response1", mvcResponseSender.createResponseString(priceDropImeisModel));
274
        return "response";
275
    }
28102 tejbeer 276
 
31903 amit.gupta 277
    @RequestMapping(value = "/processPriceDrop", method = RequestMethod.POST)
278
    public String processPriceDrop(HttpServletRequest request, @RequestBody PriceDropProcessModel priceDropProcessModel,
279
                                   Model model) throws Exception {
280
        PriceDrop priceDrop = priceDropRepository.selectById(priceDropProcessModel.getPriceDropId());
281
        boolean response = false;
282
        if (priceDrop.getPartnerPayout() == 0) {
283
            priceDrop.setPartnerPayout(priceDropProcessModel.getPartnerPayout());
284
        }
285
        priceDrop.setProcessTimestamp(LocalDateTime.now());
286
        priceDropService.processPriceDrop(priceDrop.getId(), priceDropProcessModel.isActivatedOnly());
287
        response = true;
288
        model.addAttribute("response1", mvcResponseSender.createResponseString(response));
289
        return "response";
290
    }
28102 tejbeer 291
 
31903 amit.gupta 292
    @RequestMapping(value = "/priceDrop", method = RequestMethod.POST)
293
    public String addPriceDrop(HttpServletRequest request, Model model, @RequestBody PriceDropModel priceDropModel)
294
            throws Exception {
295
        boolean response = false;
296
        priceDropModel.setAllColors(true);
297
        if (this.validatePriceDrop(priceDropModel)) {
298
            TagListing tagListing = tagListingRepository.selectByItemId(priceDropModel.getItemId());
299
            float oldDp = tagListing.getSellingPrice();
300
            float oldMop = tagListing.getMop();
301
            float oldTp = 0;
302
            float newDp = priceDropModel.getDp();
28102 tejbeer 303
 
31903 amit.gupta 304
            if (newDp != oldDp) {
305
                List<Item> allItems = null;
306
                Item currentItem = itemRepository.selectById(priceDropModel.getItemId());
307
                if (priceDropModel.isAllColors()) {
308
                    allItems = itemRepository.selectAllByCatalogItemId(currentItem.getCatalogItemId());
28102 tejbeer 309
 
31903 amit.gupta 310
                } else {
311
                    allItems = Arrays.asList(currentItem);
312
                }
313
                for (Item item : allItems) {
314
                    TagListing itemTagListing = tagListingRepository.selectByItemId(item.getId());
315
                    if (itemTagListing == null)
316
                        continue;
317
                    itemTagListing.setSellingPrice(newDp);
318
                    itemTagListing.setMop(priceDropModel.getMop());
319
                    List<VendorItemPricing> vipList = vendorItemPricingRepository.selectAll(item.getId());
320
                    for (VendorItemPricing vip : vipList) {
321
                        oldTp = vip.getNlc();
322
                        vip.setDp(newDp);
323
                        vip.setMop(priceDropModel.getMop());
324
                        //Lets not update NLC/TP as it has to be managed by Category Tea,
325
                        //vip.setNlc(priceDropModel.getTp());
326
                        //vip.setTp(priceDropModel.getTp());
327
                        vendorItemPricingRepository.persist(vip);
328
                    }
329
                    transactionService.updatePriceDrop(item.getId(), newDp);
330
                }
29926 amit.gupta 331
 
31903 amit.gupta 332
                // Add to itemPricing history
333
                ItemPricingHistory iph = new ItemPricingHistory();
334
                iph.setCatalogId(currentItem.getCatalogItemId());
335
                iph.setTp(priceDropModel.getTp());
336
                iph.setDp(priceDropModel.getDp());
337
                iph.setMop(priceDropModel.getMop());
338
                // TODO: changedBy
339
                iph.setChangedBy("me");
340
                iph.setCreateTimestamp(LocalDateTime.now());
341
                itemPricingHistoryRepository.persist(iph);
28136 tejbeer 342
 
31903 amit.gupta 343
                PriceDrop priceDrop = new PriceDrop();
344
                priceDrop.setAffectedOn(priceDropModel.getAffectedDate());
345
                priceDrop.setTp(oldTp);
346
                priceDrop.setNlc(oldTp);
347
                priceDrop.setMop(oldMop);
348
                priceDrop.setOldDp(oldDp);
349
                priceDrop.setAmount(oldDp - newDp);
350
                priceDrop.setNewDp(newDp);
351
                priceDrop.setCreatedOn(LocalDateTime.now());
352
                priceDrop.setCatalogItemId(currentItem.getCatalogItemId());
353
                priceDropRepository.persist(priceDrop);
354
                priceDropService.priceDropStatus(priceDrop.getId());
355
                response = true;
30471 amit.gupta 356
 
31903 amit.gupta 357
                this.sendPriceChangeNotification(priceDrop);
358
            } else {
359
                throw new ProfitMandiBusinessException("Price Drop", priceDropModel.getPd(),
360
                        "Price Drop Should be greater than 0");
361
            }
362
        }
363
        model.addAttribute("response1", mvcResponseSender.createResponseString(response));
364
        return "response";
365
    }
29654 tejbeer 366
 
31903 amit.gupta 367
    private void sendPriceChangeNotification(PriceDrop priceDrop) throws ProfitMandiBusinessException {
368
        List<Item> items = itemRepository.selectAllByCatalogItemId(priceDrop.getCatalogItemId());
369
        String title = "Price has been %s for %s";
24083 amit.gupta 370
 
28568 amit.gupta 371
 
31903 amit.gupta 372
        SendNotificationModel sendNotificationModel = new SendNotificationModel();
373
        sendNotificationModel.setCampaignName("pricechange");
374
        sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
375
        sendNotificationModel.setTitle("");
376
        StringBuffer sb = new StringBuffer();
377
        String message = null;
378
        if (priceDrop.getDropAmount() > 0) {
379
            title = String.format(title, "dropped", items.get(0).getItemDescriptionNoColor());
380
            message = String.format("Price has been dropped from Rs.%s. Old DP - Rs.%s, New DP - Rs.%s", FormattingUtils.formatDecimal(priceDrop.getDropAmount()),
381
                    FormattingUtils.formatDecimal(priceDrop.getOldDp()), FormattingUtils.formatDecimal(priceDrop.getNewDp()));
382
        } else {
383
            title = String.format(title, "increased", items.get(0).getItemDescriptionNoColor());
384
            message = String.format("Price has been increased from Rs.%s. Old DP - Rs.%s, New DP - Rs.%s", FormattingUtils.formatDecimal(-priceDrop.getDropAmount()),
385
                    FormattingUtils.formatDecimal(priceDrop.getOldDp()), FormattingUtils.formatDecimal(priceDrop.getNewDp()));
386
        }
387
        sendNotificationModel.setTitle(title);
388
        sendNotificationModel.setMessage(message);
389
        sendNotificationModel.setMessageType(MessageType.pricechange);
390
        notificationService.sendNotificationToAll(sendNotificationModel);
391
    }
28568 amit.gupta 392
 
31903 amit.gupta 393
    @RequestMapping(value = "/downloadtotalPriceDropIMEI/{priceDropId}", method = RequestMethod.GET)
394
    public ResponseEntity<?> downloadTotalPriceDropIMEI(HttpServletRequest request, @PathVariable int priceDropId,
395
                                                        Model model) throws ProfitMandiBusinessException, Exception {
28568 amit.gupta 396
 
31903 amit.gupta 397
        PriceDrop priceDrop = priceDropRepository.selectById(priceDropId);
398
        Map<String, PriceDropIMEI> priceDropIMEIsMap = priceDropIMEIRepository.selectByPriceDropId(priceDropId).stream()
399
                .collect(Collectors.toMap(x -> x.getImei(), x -> x));
400
        LOGGER.info("PriceDropImeis {}, priceDropId {}", priceDropIMEIsMap, priceDropId);
401
        Item item = itemRepository.selectAllByCatalogItemId(priceDrop.getCatalogItemId()).get(0);
402
        final HttpHeaders headers = new HttpHeaders();
403
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
404
        headers.set("Content-disposition",
405
                "inline; filename=pricedrop-" + item.getItemDescriptionNoColor().replaceAll("\\s?,\\s?", " ") + "-"
406
                        + FormattingUtils.formatDate(priceDrop.getAffectedOn()) + ".csv");
407
        ByteArrayOutputStream baos = null;
408
        if (priceDropIMEIsMap.size() == 0) {
409
            priceDropService.priceDropStatus(priceDrop.getId());
410
            baos = FileUtil.getCSVByteStream(Arrays.asList("IMEI Number", "Store Name", "Store Code", "Item ID", "Brand",
411
                    "Model Name", "Model Number", "Color", "Status", "Rejection Reason", "Last Scanned", "Vendor Name",
412
                    "Grn On", "Activation Timestamp", "Activation Added On"), new ArrayList<>());
413
        } else {
28568 amit.gupta 414
 
31903 amit.gupta 415
            LOGGER.info("In else block");
416
            baos = getByteArrayOutputStream(priceDrop.getAffectedOn(), priceDrop.getCatalogItemId(),
417
                    priceDropIMEIsMap);
418
        }
419
        byte[] byteArray = baos.toByteArray();
420
        headers.setContentLength(byteArray.length);
421
        return new ResponseEntity<ByteArrayResource>(new ByteArrayResource(byteArray), headers, HttpStatus.OK);
24083 amit.gupta 422
 
31903 amit.gupta 423
    }
24083 amit.gupta 424
 
31903 amit.gupta 425
    @RequestMapping(value = "/updatePriceDropImeis", method = RequestMethod.POST)
426
    public String updatePriceDropImeis(HttpServletRequest request, @RequestBody PriceDropImeisModel priceDropImeisModel,
427
                                       Model model) throws ProfitMandiBusinessException, Exception {
32012 amit.gupta 428
        final PriceDropImeiStatus status;
28102 tejbeer 429
 
31903 amit.gupta 430
        switch (priceDropImeisModel.getUpdatedStatus()) {
431
            case "approved": {
432
                status = PriceDropImeiStatus.APPROVED;
433
                break;
434
            }
32012 amit.gupta 435
            case "pending": {
436
                status = PriceDropImeiStatus.PENDING;
31903 amit.gupta 437
                break;
438
            }
439
            case "rejected": {
440
                status = PriceDropImeiStatus.REJECTED;
441
                break;
442
            }
32012 amit.gupta 443
            case "hold": {
444
                status = PriceDropImeiStatus.HOLD;
445
                break;
446
            }
447
            default:
448
                throw new IllegalStateException("Unexpected value: " + priceDropImeisModel.getUpdatedStatus());
31903 amit.gupta 449
        }
24168 amit.gupta 450
 
31903 amit.gupta 451
        if (PriceDropImeiStatus.PENDING.equals(status)) {
32012 amit.gupta 452
            List<PriceDropIMEI> priceDropIMEIsToPending = new ArrayList<>();
453
            List<PriceDropIMEI> priceDropIMEIs = priceDropIMEIRepository.selectByStatuses(Arrays.asList(PriceDropImeiStatus.REJECTED, PriceDropImeiStatus.HOLD),
31903 amit.gupta 454
                    priceDropImeisModel.getPriceDropId());
455
            LOGGER.info("hello" + priceDropIMEIs);
32012 amit.gupta 456
            for (PriceDropIMEI priceDropIMEI : priceDropIMEIs) {
457
                if (priceDropIMEI.getStatus().equals(status) || !priceDropImeisModel.getUpdatedImeis().contains(priceDropIMEI.getImei())) {
458
                    continue;
31903 amit.gupta 459
                }
32012 amit.gupta 460
                priceDropIMEIsToPending.add(priceDropIMEI);
461
                priceDropIMEI.setStatus(PriceDropImeiStatus.PENDING);
31903 amit.gupta 462
            }
463
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
464
            return "response";
465
        }
23951 amit.gupta 466
 
32012 amit.gupta 467
        if (status.equals(PriceDropImeiStatus.APPROVED)) {
468
            priceDropService.processPriceDrop(priceDropImeisModel.getPriceDropId(),
469
                    priceDropImeisModel.getUpdatedImeis());
470
        }
471
 
31903 amit.gupta 472
        List<PriceDropIMEI> priceDropIMEIs = priceDropIMEIRepository
473
                .selectByPriceDropId(priceDropImeisModel.getPriceDropId());
474
        List<PriceDropIMEI> priceDropIMEIsToProcess = priceDropIMEIs.stream()
475
                .filter(x -> priceDropImeisModel.getUpdatedImeis().contains(x.getImei()))
32012 amit.gupta 476
                .filter(x -> !x.getStatus().equals(status)).collect(Collectors.toList());
31903 amit.gupta 477
        for (PriceDropIMEI priceDropImei : priceDropIMEIsToProcess) {
478
            if (status.equals(PriceDropImeiStatus.REJECTED)
479
                    && priceDropImei.getStatus().equals(PriceDropImeiStatus.PENDING)) {
480
                priceDropImei.setStatus(PriceDropImeiStatus.REJECTED);
481
                priceDropImei.setRejectionReason(priceDropImeisModel.getRejectionReason());
482
                priceDropImei.setRejectTimestamp(LocalDateTime.now());
483
            } else if (status.equals(PriceDropImeiStatus.HOLD)) {
484
                if (priceDropImei.getStatus().equals(PriceDropImeiStatus.PENDING)) {
485
                    priceDropImei.setStatus(PriceDropImeiStatus.HOLD);
486
                } else {
487
                    throw new ProfitMandiBusinessException("INVALID STATUS", status, "only  allowed For PENDING IMEIs");
488
                }
28568 amit.gupta 489
 
31903 amit.gupta 490
            }
28568 amit.gupta 491
 
31903 amit.gupta 492
        }
28568 amit.gupta 493
 
31903 amit.gupta 494
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
495
        return "response";
24083 amit.gupta 496
 
31903 amit.gupta 497
    }
24083 amit.gupta 498
 
31903 amit.gupta 499
    private ByteArrayOutputStream getByteArrayOutputStream(LocalDateTime affectedOn, Integer catalogItemId,
500
                                                           Map<String, PriceDropIMEI> priceDropImeis) throws Exception {
501
        List<ImeiDropSummaryModel> imeiDropSummaryModelList = priceDropService
502
                .getAllSerialNumbersByAffectedDate(affectedOn, catalogItemId);
503
        List<List<?>> rows = new ArrayList<>();
504
        for (ImeiDropSummaryModel imeiDropSummaryModel : imeiDropSummaryModelList) {
505
            if (priceDropImeis == null) {
506
                rows.add(this.getRow(imeiDropSummaryModel, null));
507
            } else if (priceDropImeis.get(imeiDropSummaryModel.getSerialNumber()) != null) {
508
                rows.add(this.getRow(imeiDropSummaryModel, priceDropImeis.get(imeiDropSummaryModel.getSerialNumber())));
509
            }
510
        }
511
        return FileUtil.getCSVByteStream(Arrays.asList("IMEI Number", "Store Name", "Store Code", "Item ID", "Brand",
512
                "Model Name", "Model Number", "Color", "Status", "Rejection Reason", "Last Scanned", "Vendor Name",
513
                "Grn On", "Activation Timestamp", "Activation Added On"), rows);
514
    }
24083 amit.gupta 515
 
31903 amit.gupta 516
    private List<? extends Serializable> getRow(ImeiDropSummaryModel imeiDropSummaryModel,
517
                                                PriceDropIMEI priceDropIMEI) {
518
        List<Serializable> row = new ArrayList<>();
519
        row.add(imeiDropSummaryModel.getSerialNumber());
520
        row.add(imeiDropSummaryModel.getStoreName());
521
        row.add(imeiDropSummaryModel.getPartnerCode());
522
        row.add(imeiDropSummaryModel.getItemId());
523
        row.add(imeiDropSummaryModel.getBrand());
524
        row.add(imeiDropSummaryModel.getModelName());
525
        row.add(imeiDropSummaryModel.getModelNumber());
526
        row.add(imeiDropSummaryModel.getColor());
527
        if (priceDropIMEI != null) {
528
            row.add(priceDropIMEI.getStatus());
529
            row.add(priceDropIMEI.getRejectionReason());
530
        } else {
531
            row.add(PriceDropImeiStatus.PENDING);
532
            row.add("");
533
        }
534
        row.add(FormattingUtils.formatReporitcoDate(imeiDropSummaryModel.getLastScanned()));
535
        row.add(imeiDropSummaryModel.getVendorName());
536
        row.add(FormattingUtils.formatReporitcoDate(imeiDropSummaryModel.getGrnOn()));
537
        row.add(imeiDropSummaryModel.getActivationTimestamp());
538
        row.add(imeiDropSummaryModel.getActivationAddedOn());
539
        return row;
540
    }
23819 govind 541
 
31903 amit.gupta 542
    private boolean validatePriceDrop(PriceDropModel priceDropModel) throws ProfitMandiBusinessException {
543
        if (priceDropModel.getMop() > 0 && priceDropModel.getDp() > 0 && priceDropModel.getTp() > 0) {
544
            return true;
545
        }
546
        return false;
547
    }
23945 amit.gupta 548
 
32844 shampa 549
    @Autowired
550
    BrandsService brandsService;
31903 amit.gupta 551
    @RequestMapping(value = "/priceCircular")
552
    public String priceCircular(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
553
        int fofoId = Utils.SYSTEM_PARTNER_ID;
32844 shampa 554
        List<String> brands = brandsService.getBrandsToDisplay(3).stream().map(x -> x.getName()).collect(Collectors.toList());
31903 amit.gupta 555
        model.addAttribute("brands", brands);
556
        model.addAttribute("isAdmin", true);
557
        model.addAttribute("date", FormattingUtils.format(LocalDateTime.now()));
28102 tejbeer 558
 
31903 amit.gupta 559
        return "partner-price-circular";
560
    }
28102 tejbeer 561
 
31903 amit.gupta 562
    @RequestMapping(value = "/partnerPriceCircular")
563
    public String partnerPriceCircular(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
564
        int fofoId = Utils.SYSTEM_PARTNER_ID;
32844 shampa 565
        Set<String> brands = brandsService.getBrandsToDisplay(3).stream().map(x -> x.getName()).collect(Collectors.toSet());
566
        brands.addAll(brandsService.getBrandsToDisplay(6).stream().map(x -> (String) x.getName())
31903 amit.gupta 567
                .collect(Collectors.toSet()));
568
        model.addAttribute("brands", brands);
569
        model.addAttribute("isAdmin", false);
28102 tejbeer 570
 
31903 amit.gupta 571
        return "partner-price-circular";
572
    }
28102 tejbeer 573
 
31903 amit.gupta 574
    @RequestMapping(value = "/priceCircularByBrand")
575
    public String priceCircularByBrand(HttpServletRequest request, @RequestParam String brand, Model model, @RequestParam(defaultValue = "0", required = false) int fofoId)
576
            throws ProfitMandiBusinessException {
577
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
578
        if (fofoId > 0 && roleManager.isAdmin(loginDetails.getRoleIds())) {
579
        } else {
580
            fofoId = loginDetails.getFofoId();
581
        }
32905 shampa 582
        FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
583
 
31903 amit.gupta 584
        //.minusDays(2)
585
        PriceCircularModel priceCircular = priceCircularService.getPriceCircularByOffer(fofoId, brand, LocalDate.now());
32905 shampa 586
        return this.getPriceCircularView(priceCircular, model,fs.getCode());
32331 amit.gupta 587
    }
588
 
32905 shampa 589
    public String getPriceCircularView( PriceCircularModel priceCircular, Model model, String partnerCode ) throws ProfitMandiBusinessException {
31903 amit.gupta 590
        List<String> schemeHeaders = new ArrayList<>(this.getSchemeHeaders(priceCircular));
591
        List<String> allMargins = ALL_MARGINS.stream().filter(x -> schemeHeaders.contains(x)).collect(Collectors.toList());
592
        List<String> sellins = SELLINS.stream().filter(x -> allMargins.contains(x)).collect(Collectors.toList());
593
        List<String> sellouts = SELLOUTS.stream().filter(x -> allMargins.contains(x)).collect(Collectors.toList());
594
        LOGGER.info("Scheme Headers = {}", schemeHeaders);
595
        LOGGER.info("allMargins {}", allMargins);
596
        LOGGER.info("Sellins - {}", sellins);
597
        LOGGER.info("Sellouts - {}", sellouts);
598
        model.addAttribute("priceCircularItemModels", priceCircular.getPriceCircularItemModelNews());
599
        model.addAttribute("allMargins", allMargins);
600
        model.addAttribute("sellins", sellins);
601
        model.addAttribute("sellouts", sellouts);
602
        model.addAttribute("offers", priceCircular.getOffers());
603
        model.addAttribute("upgradeOffer", priceCircular.isUpgradeOffer());
604
        model.addAttribute("mvcResponseSender", mvcResponseSender);
32905 shampa 605
        model.addAttribute("partnerCode", partnerCode);
32331 amit.gupta 606
        return "price-circular-table";
31903 amit.gupta 607
    }
29951 amit.gupta 608
 
31903 amit.gupta 609
    private Set<String> getSchemeHeaders(PriceCircularModel priceCircular) {
610
        Set<String> schemeHeaders = new HashSet<>();
611
        priceCircular.getPriceCircularItemModelNews().stream().forEach(priceCircularItemModelNew -> {
612
            Map<String, AmountModel> headerMap = new HashMap<>();
613
            priceCircularItemModelNew.setHeaderSchemeModelsMap(headerMap);
614
            priceCircularItemModelNew.getSchemeSummaryModels().stream().forEach(schemeSummaryModel -> {
615
                if (schemeSummaryModel == null) return;
616
                if (schemeSummaryModel.getSchemeType().equals(SchemeType.SPECIAL_SUPPORT) || schemeSummaryModel.getSchemeType().equals(SchemeType.ACTIVATION)) {
617
                    schemeSummaryModel.setHeader("Special Support");
618
                } else if (schemeSummaryModel.getDescription().equalsIgnoreCase("modelwise") && schemeSummaryModel.getSchemeType().equals(SchemeType.IN)) {
619
                    schemeSummaryModel.setHeader("Modelwise");
31911 amit.gupta 620
                } else if (schemeSummaryModel.getSchemeType().equals(SchemeType.IN)) {
621
                    schemeSummaryModel.setHeader(schemeSummaryModel.getDescription());
31903 amit.gupta 622
                } else {
31910 amit.gupta 623
                    schemeSummaryModel.setHeader(schemeSummaryModel.getSchemeType().getValue());
31903 amit.gupta 624
                }
625
                if (!headerMap.containsKey(schemeSummaryModel.getHeader())) {
626
                    headerMap.put(schemeSummaryModel.getHeader(), new AmountModel(schemeSummaryModel.getAmount(), schemeSummaryModel.getAmountType()));
627
                } else {
628
                    AmountModel model = headerMap.get(schemeSummaryModel.getHeader());
629
                    model.setAmount(model.getAmount() + schemeSummaryModel.getAmount());
630
                }
631
                schemeHeaders.add(schemeSummaryModel.getHeader());
632
            });
633
        });
28102 tejbeer 634
 
31903 amit.gupta 635
        LOGGER.info("Scheme headers - {}", schemeHeaders);
636
        return schemeHeaders;
637
    }
30250 amit.gupta 638
 
31903 amit.gupta 639
    //private static final List<String> SELLINS = Arrays.asList("Base Payout", "Cash Discount", "Upfront Margin");
640
    //private static final List<String> SELLOUTS = Arrays.asList("Tertiary Payout", "Hygiene Payout", "Investment Payout", "Category Payout", "Activation Margin", "Special Support");
30471 amit.gupta 641
 
30562 amit.gupta 642
 
31903 amit.gupta 643
    @RequestMapping(value = "/downloadNlcByBrand")
644
    public ResponseEntity<ByteArrayResource> downloadNlcByBrand(HttpServletRequest request,
645
                                                                @RequestParam String brand, Model model, @RequestParam(defaultValue = "0", required = false) int fofoId) throws Exception {
646
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
647
        if (fofoId > 0 && roleManager.isAdmin(loginDetails.getRoleIds())) {
648
        } else {
649
            fofoId = loginDetails.getFofoId();
650
        }
651
        PriceCircularModel priceCircular = priceCircularService.getPriceCircularByOffer(fofoId, brand, LocalDate.now());
652
        /*List<Integer> catalogIds = priceCircular.getPriceCircularItemModelNews().stream().limit(10).map(x->x.getCatalogId()).collect(Collectors.toList());
653
        priceCircular = priceCircularService.getPriceCircularByOffer(fofoId, catalogIds, LocalDate.now());*/
654
        ByteArrayOutputStream baos = getNlcBaos(brand, priceCircular);
655
        final HttpHeaders headers = new HttpHeaders();
656
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
657
        headers.set("Content-disposition", "inline; filename=\"" + brand + ".csv\"");
658
        byte[] byteArray = baos.toByteArray();
659
        headers.setContentLength(byteArray.length);
660
        return new ResponseEntity<>(new ByteArrayResource(byteArray), headers, HttpStatus.OK);
661
    }
30471 amit.gupta 662
 
31903 amit.gupta 663
    private ByteArrayOutputStream getNlcBaos(String brand, PriceCircularModel priceCircular) throws Exception {
664
        List<List<?>> rows = new ArrayList<>();
665
        for (PriceCircularItemModelNew priceCircularItemModel : priceCircular.getPriceCircularItemModelNews()) {
666
            List<Serializable> row = new ArrayList<>();
667
            row.add(priceCircularItemModel.getCatalogId());
668
            row.add(brand);
669
            row.add(priceCircularItemModel.getCatalogSummaryModel().getModelName());
670
            row.add(priceCircularItemModel.getCatalogSummaryModel().getModelNumber());
671
            //TODO: fix nlc
672
            //row.add(priceCircularItemModel.getNetPrice());
673
            rows.add(row);
674
        }
675
        return FileUtil.getCSVByteStream(Arrays.asList("Model Id", "Brand", "Model Name", "Model Number", "Partner Landing"), rows);
676
    }
30471 amit.gupta 677
 
31903 amit.gupta 678
    @RequestMapping(value = "/selectPriceDropStatus", method = RequestMethod.GET)
679
    public String selectPriceDropStatus(HttpServletRequest request,
680
                                        @RequestParam(name = "selectedStatus", required = true, defaultValue = "") String selectedStatus,
681
                                        Model model) throws Exception {
30250 amit.gupta 682
 
31903 amit.gupta 683
        model.addAttribute("selectedStatus", selectedStatus);
684
        return "pricedrop-status-change";
685
    }
30250 amit.gupta 686
 
23819 govind 687
}