Subversion Repositories SmartDukaan

Rev

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