Subversion Repositories SmartDukaan

Rev

Rev 31911 | Rev 32331 | 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;
28136 tejbeer 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;
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
        priceDropRepository.persist(priceDrop);
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
 
31903 amit.gupta 549
    @RequestMapping(value = "/priceCircular")
550
    public String priceCircular(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
551
        int fofoId = Utils.SYSTEM_PARTNER_ID;
552
        Set<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
553
                .collect(Collectors.toSet());
554
        brands.addAll(mongoClient.getMongoBrands(fofoId, null, 6).stream().map(x -> (String) x.get("name"))
555
                .collect(Collectors.toSet()));
28102 tejbeer 556
 
31903 amit.gupta 557
        model.addAttribute("brands", brands);
558
        model.addAttribute("isAdmin", true);
559
        model.addAttribute("date", FormattingUtils.format(LocalDateTime.now()));
28102 tejbeer 560
 
31903 amit.gupta 561
        return "partner-price-circular";
562
    }
28102 tejbeer 563
 
31903 amit.gupta 564
    @RequestMapping(value = "/partnerPriceCircular")
565
    public String partnerPriceCircular(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
566
        int fofoId = Utils.SYSTEM_PARTNER_ID;
567
        Set<String> brands = mongoClient.getMongoBrands(fofoId, null, 3).stream().map(x -> (String) x.get("name"))
568
                .collect(Collectors.toSet());
569
        brands.addAll(mongoClient.getMongoBrands(fofoId, null, 6).stream().map(x -> (String) x.get("name"))
570
                .collect(Collectors.toSet()));
571
        model.addAttribute("brands", brands);
572
        model.addAttribute("isAdmin", false);
28102 tejbeer 573
 
31903 amit.gupta 574
        return "partner-price-circular";
575
    }
28102 tejbeer 576
 
31903 amit.gupta 577
    @RequestMapping(value = "/priceCircularByBrand")
578
    public String priceCircularByBrand(HttpServletRequest request, @RequestParam String brand, Model model, @RequestParam(defaultValue = "0", required = false) int fofoId)
579
            throws ProfitMandiBusinessException {
580
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
581
        if (fofoId > 0 && roleManager.isAdmin(loginDetails.getRoleIds())) {
582
        } else {
583
            fofoId = loginDetails.getFofoId();
584
        }
585
        //.minusDays(2)
586
        PriceCircularModel priceCircular = priceCircularService.getPriceCircularByOffer(fofoId, brand, LocalDate.now());
587
        //List<Integer> catalogIds = priceCircular.getPriceCircularItemModelNews().stream().limit(100).map(x->x.getCatalogId()).collect(Collectors.toList());
588
        //priceCircular = priceCircularService.getPriceCircularByOffer(fofoId, catalogIds, LocalDate.now());
589
        List<String> schemeHeaders = new ArrayList<>(this.getSchemeHeaders(priceCircular));
590
        List<String> allMargins = ALL_MARGINS.stream().filter(x -> schemeHeaders.contains(x)).collect(Collectors.toList());
591
        List<String> sellins = SELLINS.stream().filter(x -> allMargins.contains(x)).collect(Collectors.toList());
592
        List<String> sellouts = SELLOUTS.stream().filter(x -> allMargins.contains(x)).collect(Collectors.toList());
593
        LOGGER.info("Scheme Headers = {}", schemeHeaders);
594
        LOGGER.info("allMargins {}", allMargins);
595
        LOGGER.info("Sellins - {}", sellins);
596
        LOGGER.info("Sellouts - {}", sellouts);
597
        FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
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("partnerCode", fs.getCode());
605
        model.addAttribute("mvcResponseSender", mvcResponseSender);
606
        return "price-circular-detail";
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
}