Subversion Repositories SmartDukaan

Rev

Rev 37846 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
21577 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
37846 amit 3
import com.spice.profitmandi.service.warehouse.BillingWarehouseService;
4
 
30039 tejbeer 5
import com.fasterxml.jackson.databind.ObjectMapper;
21987 kshitij.so 6
import com.google.gson.Gson;
25698 tejbeer 7
import com.spice.profitmandi.common.enumuration.MessageType;
21577 ashik.ali 8
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
32438 amit.gupta 9
import com.spice.profitmandi.common.model.*;
22472 ashik.ali 10
import com.spice.profitmandi.common.util.ExcelUtils;
25140 amit.gupta 11
import com.spice.profitmandi.common.util.PdfUtils;
28084 amit.gupta 12
import com.spice.profitmandi.common.util.Utils.Attachment;
32402 tejbeer 13
import com.spice.profitmandi.common.web.client.RestClient;
28701 tejbeer 14
import com.spice.profitmandi.dao.entity.auth.AuthUser;
32438 amit.gupta 15
import com.spice.profitmandi.dao.entity.catalog.*;
28701 tejbeer 16
import com.spice.profitmandi.dao.entity.cs.Position;
30596 tejbeer 17
import com.spice.profitmandi.dao.entity.dtr.WebOffer;
25140 amit.gupta 18
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
24917 tejbeer 19
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
24465 tejbeer 20
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
21
import com.spice.profitmandi.dao.entity.fofo.LiveDemoSerialNumber;
32438 amit.gupta 22
import com.spice.profitmandi.dao.entity.transaction.*;
30989 tejbeer 23
import com.spice.profitmandi.dao.entity.user.Address;
28701 tejbeer 24
import com.spice.profitmandi.dao.enumuration.catalog.ByPassRequestStatus;
25
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
33888 ranu 26
import com.spice.profitmandi.dao.enumuration.inventory.CatalogMovingEnum;
32438 amit.gupta 27
import com.spice.profitmandi.dao.model.*;
28701 tejbeer 28
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
32438 amit.gupta 29
import com.spice.profitmandi.dao.repository.catalog.*;
28701 tejbeer 30
import com.spice.profitmandi.dao.repository.cs.CsService;
31
import com.spice.profitmandi.dao.repository.cs.PositionRepository;
24465 tejbeer 32
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
26482 tejbeer 33
import com.spice.profitmandi.dao.repository.dtr.Mongo;
24917 tejbeer 34
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
30596 tejbeer 35
import com.spice.profitmandi.dao.repository.dtr.WebOfferRepository;
32438 amit.gupta 36
import com.spice.profitmandi.dao.repository.fofo.*;
24917 tejbeer 37
import com.spice.profitmandi.dao.repository.inventory.NotifyStatus;
32438 amit.gupta 38
import com.spice.profitmandi.dao.repository.transaction.*;
30989 tejbeer 39
import com.spice.profitmandi.dao.repository.user.AddressRepository;
40
import com.spice.profitmandi.dao.repository.user.UserRepository;
27723 tejbeer 41
import com.spice.profitmandi.dao.repository.warehouse.WarehousePurchaseOrderRepository;
42
import com.spice.profitmandi.dao.repository.warehouse.WarehouseScanRepository;
25851 amit.gupta 43
import com.spice.profitmandi.service.NotificationService;
33888 ranu 44
import com.spice.profitmandi.service.catalog.BrandsService;
36961 amit 45
import com.spice.profitmandi.service.catalog.ComboService;
30683 tejbeer 46
import com.spice.profitmandi.service.inventory.Combo;
32339 tejbeer 47
import com.spice.profitmandi.service.inventory.ComboOptionModel;
22927 ashik.ali 48
import com.spice.profitmandi.service.inventory.InventoryService;
30683 tejbeer 49
import com.spice.profitmandi.service.inventory.MappedComboModel;
37193 ranu 50
import com.spice.profitmandi.service.mail.MailOutboxService;
27516 amit.gupta 51
import com.spice.profitmandi.service.order.OrderService;
33697 amit.gupta 52
import com.spice.profitmandi.service.transaction.SDCreditService;
24465 tejbeer 53
import com.spice.profitmandi.service.user.RetailerService;
22139 amit.gupta 54
import com.spice.profitmandi.web.model.LoginDetails;
22069 ashik.ali 55
import com.spice.profitmandi.web.util.CookiesProcessor;
24106 tejbeer 56
import com.spice.profitmandi.web.util.MVCResponseSender;
24658 tejbeer 57
import in.shop2020.model.v1.order.OrderStatus;
32438 amit.gupta 58
import org.apache.commons.csv.CSVFormat;
59
import org.apache.commons.csv.CSVParser;
60
import org.apache.commons.csv.CSVRecord;
61
import org.apache.commons.io.FileUtils;
62
import org.apache.commons.lang3.StringUtils;
63
import org.apache.logging.log4j.LogManager;
64
import org.apache.logging.log4j.Logger;
65
import org.json.JSONObject;
66
import org.springframework.beans.factory.annotation.Autowired;
67
import org.springframework.beans.factory.annotation.Qualifier;
68
import org.springframework.beans.factory.annotation.Value;
69
import org.springframework.core.io.ByteArrayResource;
70
import org.springframework.core.io.ClassPathResource;
71
import org.springframework.core.io.InputStreamResource;
72
import org.springframework.http.HttpHeaders;
73
import org.springframework.http.HttpStatus;
74
import org.springframework.http.MediaType;
75
import org.springframework.http.ResponseEntity;
76
import org.springframework.mail.javamail.JavaMailSender;
77
import org.springframework.stereotype.Controller;
78
import org.springframework.transaction.annotation.Transactional;
79
import org.springframework.ui.Model;
80
import org.springframework.web.bind.annotation.*;
81
import org.springframework.web.multipart.MultipartFile;
24658 tejbeer 82
 
32438 amit.gupta 83
import javax.servlet.http.HttpServletRequest;
84
import javax.servlet.http.HttpServletResponse;
85
import java.io.*;
86
import java.net.URISyntaxException;
87
import java.time.LocalDate;
88
import java.time.LocalDateTime;
89
import java.time.YearMonth;
90
import java.time.format.DateTimeFormatter;
37869 amit 91
import java.time.format.DateTimeFormatterBuilder;
92
import java.time.format.DateTimeParseException;
93
import java.time.temporal.ChronoField;
32438 amit.gupta 94
import java.time.temporal.ChronoUnit;
95
import java.util.*;
96
import java.util.stream.Collectors;
97
import java.util.stream.Stream;
30827 amit.gupta 98
 
32438 amit.gupta 99
 
21577 ashik.ali 100
@Controller
24123 tejbeer 101
@Transactional(rollbackFor = Throwable.class)
21577 ashik.ali 102
public class InventoryController {
21987 kshitij.so 103
 
37846 amit 104
    @Autowired
105
    private BillingWarehouseService billingWarehouseService;
106
 
107
 
31762 tejbeer 108
    private static final Logger LOGGER = LogManager.getLogger(InventoryController.class);
26482 tejbeer 109
 
37869 amit 110
    private static final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
111
            .appendPattern("M/d/yyyy[ H:mm[:ss]]")
112
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
113
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
114
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
115
            .toFormatter();
21987 kshitij.so 116
 
31762 tejbeer 117
    private static final List<String> imeis = Arrays.asList("351030944216680", "351030944217183", "351030944217886", "351030944507286", "351081710231270", "351081710238713", "351081710238796", "351081710241279", "351081710244737", "355777112655976");
27583 tejbeer 118
 
31762 tejbeer 119
    List<EscalationType> esclationType = Arrays.asList(EscalationType.L3, EscalationType.L4);
28701 tejbeer 120
 
31762 tejbeer 121
    List<String> emails = Arrays.asList("kamini.sharma@smartdukaan.com", "tarun.verma@smartdukaan.com");
28701 tejbeer 122
 
31762 tejbeer 123
    @Autowired
124
    private CookiesProcessor cookiesProcessor;
24123 tejbeer 125
 
31762 tejbeer 126
    @Autowired
37193 ranu 127
    private BrandsRepository brandsRepository;
128
 
129
    @Autowired
31762 tejbeer 130
    @Qualifier("fofoInventoryService")
131
    private InventoryService inventoryService;
24465 tejbeer 132
 
31762 tejbeer 133
    @Autowired
134
    TagListingRepository tagListingRepository;
24950 tejbeer 135
 
31762 tejbeer 136
    @Autowired
137
    private CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
24123 tejbeer 138
 
31762 tejbeer 139
    @Autowired
140
    private TagRankingRepository tagRankingRepository;
24123 tejbeer 141
 
31762 tejbeer 142
    @Autowired
143
    private InventoryItemRepository inventoryItemRepository;
24465 tejbeer 144
 
31762 tejbeer 145
    @Autowired
146
    private LiveDemoBillingRespository liveDemoBillingRespository;
24465 tejbeer 147
 
31762 tejbeer 148
    @Autowired
149
    private ItemRepository itemRepository;
24123 tejbeer 150
 
31762 tejbeer 151
    @Autowired
33888 ranu 152
    BrandsService brandsService;
153
 
154
    @Autowired
31762 tejbeer 155
    private Gson gson;
26512 amit.gupta 156
 
31762 tejbeer 157
    @Autowired
158
    private RetailerService retailerService;
24465 tejbeer 159
 
31762 tejbeer 160
    @Autowired
161
    private MVCResponseSender mvcResponseSender;
24123 tejbeer 162
 
31762 tejbeer 163
    @Autowired
164
    FofoStoreRepository fofoStoreRepository;
24465 tejbeer 165
 
31762 tejbeer 166
    @Autowired
167
    private OrderRepository orderRepository;
24658 tejbeer 168
 
31762 tejbeer 169
    @Autowired
170
    private NotifyItemRepository notifyItemRepository;
24739 tejbeer 171
 
31762 tejbeer 172
    @Autowired
173
    private NotifyColorChangeRepository notifyColorChangeRepository;
24917 tejbeer 174
 
31762 tejbeer 175
    @Autowired
176
    private NotifyOrderRespository notifyOrderRespository;
24917 tejbeer 177
 
31762 tejbeer 178
    @Autowired
179
    private NotificationService notificationService;
25851 amit.gupta 180
 
31762 tejbeer 181
    @Autowired
182
    private NotifyMessageRepository notifyMessageRepository;
25066 tejbeer 183
 
31762 tejbeer 184
    @Autowired
185
    private UserAccountRepository userAccountRepository;
24917 tejbeer 186
 
31762 tejbeer 187
    @Autowired
188
    private OrderService orderService;
27583 tejbeer 189
 
31762 tejbeer 190
    @Value("${saholic.api.host}")
191
    private String host;
23786 amit.gupta 192
 
31762 tejbeer 193
    @Value("${saholic.api.port}")
194
    private int port;
23786 amit.gupta 195
 
31762 tejbeer 196
    @Value("${saholic.api.webapp}")
197
    private String webapp;
21987 kshitij.so 198
 
31762 tejbeer 199
    @Autowired
36401 amit 200
    JavaMailSender gmailRelaySender;
24917 tejbeer 201
 
31762 tejbeer 202
    @Autowired
35957 amit 203
    MailOutboxService mailOutboxService;
204
 
205
    @Autowired
31762 tejbeer 206
    private NotifyCancelOrderRepository notifyCancelOrderRepository;
26031 tejbeer 207
 
31762 tejbeer 208
    @Autowired
209
    private WarehousePurchaseOrderRepository warehousePurchaseOrderRepository;
27723 tejbeer 210
 
31762 tejbeer 211
    @Autowired
212
    private WarehouseScanRepository warehouseScanRepository;
27723 tejbeer 213
 
31762 tejbeer 214
    @Autowired
215
    private FofoOrderRepository fofoOrderRepository;
216
    @Autowired
217
    private Mongo mongoClient;
26482 tejbeer 218
 
31762 tejbeer 219
    @Autowired
220
    private FocusedModelByPassRepository focusedModelByPassRepository;
28701 tejbeer 221
 
31762 tejbeer 222
    @Autowired
223
    private CsService csService;
28701 tejbeer 224
 
31762 tejbeer 225
    @Autowired
226
    AuthRepository authRepository;
33888 ranu 227
    @Autowired
228
    private CategorisedCatalogRepository categorisedCatalogRepository;
28701 tejbeer 229
 
31762 tejbeer 230
    @Autowired
231
    PositionRepository positionRepository;
28701 tejbeer 232
 
31762 tejbeer 233
    @Autowired
234
    ActivatedImeiRepository activatedImeiRepository;
30456 amit.gupta 235
 
31762 tejbeer 236
    @Autowired
237
    HighDemandItemsRepository highDemandItemsRepository;
28754 tejbeer 238
 
31762 tejbeer 239
    @Autowired
240
    WebOfferRepository webOfferRepository;
30596 tejbeer 241
 
31762 tejbeer 242
    @Autowired
243
    ComboModelRepository comboModelRepository;
30683 tejbeer 244
 
31762 tejbeer 245
    @Autowired
246
    ComboMappedModelRepository comboMappedModelRepository;
30683 tejbeer 247
 
31762 tejbeer 248
    @Autowired
32339 tejbeer 249
    private ComboOptionRepository comboOptionRepository;
250
 
251
    @Autowired
31762 tejbeer 252
    private UserRepository userUserRepository;
30989 tejbeer 253
 
31762 tejbeer 254
    @Autowired
255
    private AddressRepository addressRepository;
30989 tejbeer 256
 
33796 ranu 257
    @Autowired
258
    private CustomerOfferRepository customerOfferRepository;
33888 ranu 259
    @Autowired
260
    private CatalogRepository catalogRepository;
33796 ranu 261
 
262
    @Autowired
263
    private CustomerOfferItemRepository customerOfferItemRepository;
264
 
31762 tejbeer 265
    @RequestMapping(value = "/getCurrentInventorySnapshot")
266
    public String getCurrentAvailability(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model) throws ProfitMandiBusinessException {
267
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
268
        Map<String, Object> map = inventoryService.getCurrentInventorySnapshot(loginDetails.getFofoId(), offset, limit, searchTerm);
269
        model.addAllAttributes(map);
270
        return "inventory-snapshot";
271
    }
21987 kshitij.so 272
 
31762 tejbeer 273
    @RequestMapping(value = "/getBadInventorySnapshot")
274
    public String getBadAvailability(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model) throws ProfitMandiBusinessException {
275
        if (searchTerm == null) {
276
            searchTerm = "";
277
        }
278
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
279
        Map<String, Object> map = inventoryService.getBadInventorySnapshot(loginDetails.getFofoId(), offset, limit, searchTerm);
280
        model.addAllAttributes(map);
281
        return "bad-inventory-snapshot";
282
    }
21987 kshitij.so 283
 
31762 tejbeer 284
    @RequestMapping(value = "/getPaginatedCurrentInventorySnapshot")
285
    public String getPaginatedCurrentInventorySnapshot(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model) throws ProfitMandiBusinessException {
286
        if (searchTerm == null) {
287
            searchTerm = "";
288
        }
289
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
290
        Map<String, Object> map = inventoryService.getPaginatedCurrentInventorySnapshot(loginDetails.getFofoId(), offset, limit, searchTerm);
291
        model.addAllAttributes(map);
292
        return "inventory-snapshot-paginated";
293
    }
23786 amit.gupta 294
 
31762 tejbeer 295
    @RequestMapping(value = "/getCatalog")
296
    public String getCatalog(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "20") int limit, @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, @RequestParam(name = "itemId", required = false, defaultValue = "0") int itemId, @RequestParam(name = "accesories", required = false, defaultValue = "0") boolean accesories,
35726 vikas 297
         @RequestParam(name = "brand", required = false, defaultValue = "") String brand, Model model) throws ProfitMandiBusinessException {
31762 tejbeer 298
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
299
        if (searchTerm == null) {
300
            searchTerm = "";
301
        }
24739 tejbeer 302
 
31762 tejbeer 303
        Map<String, Object> map = inventoryService.getCatalog(loginDetails.getFofoId(), offset, limit, searchTerm, itemId, brand, accesories);
304
        model.addAllAttributes(map);
305
        model.addAttribute("hasGift", hasGift(loginDetails.getFofoId()));
24658 tejbeer 306
 
31762 tejbeer 307
        return "catalog";
308
    }
23786 amit.gupta 309
 
33888 ranu 310
    @RequestMapping(value = "/getCategorisedCatalog", method = RequestMethod.GET)
311
    public String getCategorisedCatalog(HttpServletRequest request, Model model) throws Exception {
312
        List<String> brands = brandsService.getBrandsToDisplay(3).stream().map(x -> x.getName()).collect(Collectors.toList());
313
        model.addAttribute("brands", brands);
314
 
34098 ranu 315
        return "categoriesed-catalog";
33888 ranu 316
 
317
    }
318
 
319
    @RequestMapping(value = "/getCatalogMovementByBrand", method = RequestMethod.GET)
320
    public String getCatalogMovementByBrand(HttpServletRequest request, Model model, @RequestParam String brand) throws Exception {
321
 
322
        List<CategorisedCatalogListModel> categorisedCatalogListModels = categorisedCatalogRepository.getBrandWiseCatalogMovement(brand);
34614 ranu 323
        List<Catalog> catalogs = new ArrayList<>();
324
        List<Catalog> mobileCatalogs = catalogRepository.selectAllByBrand(brand, ProfitMandiConstants.MOBILE_CATEGORY_ID);
325
        List<Catalog> tabletCatalogs = catalogRepository.selectAllByBrand(brand, ProfitMandiConstants.TABLET_CATEGORY_ID);
326
        catalogs.addAll(mobileCatalogs);
327
        catalogs.addAll(tabletCatalogs);
33888 ranu 328
 
329
        List<CatalogMovingEnum> catalogMovingEnumList = Arrays.asList(CatalogMovingEnum.values());
330
 
331
        model.addAttribute("categorisedCatalogListModels", categorisedCatalogListModels);
332
        model.addAttribute("catalogs", catalogs);
333
        model.addAttribute("catalogMovingEnumList", catalogMovingEnumList);
334
        model.addAttribute("brand", brand);
335
 
34098 ranu 336
        return "categoriesed-catalog-list";
33888 ranu 337
 
338
    }
339
 
340
    @RequestMapping(value = "/createUpdateCatalogMovement", method = RequestMethod.GET)
341
    public String createUpdateCatalogMovement(HttpServletRequest request, Model model, @RequestParam int catalogId, @RequestParam CatalogMovingEnum status, @RequestParam LocalDate startDate, @RequestParam String brand) throws Exception {
342
 
343
        CategorisedCatalog currentCategorisedCatalog = categorisedCatalogRepository.getCurrentCatalogMovement(catalogId);
344
 
33957 ranu 345
        LOGGER.info("currentCategorisedCatalogg - {}", currentCategorisedCatalog);
33888 ranu 346
 
347
        if (currentCategorisedCatalog != null) {
33957 ranu 348
            if (currentCategorisedCatalog.getStartDate().isEqual(startDate) && (startDate.isEqual(LocalDate.now()) || startDate.isAfter(LocalDate.now()))) {
349
                currentCategorisedCatalog.setStatus(status);
350
            } else if (startDate.isBefore(currentCategorisedCatalog.getStartDate()) || startDate.isEqual(currentCategorisedCatalog.getStartDate())) {
351
                throw new Exception("Start date cannot be less than or equal to the current catalog's start date(" + currentCategorisedCatalog.getStartDate() + ").");
352
            }
353
//            else if (currentCategorisedCatalog.getStatus().equals(status)) {
354
//                currentCategorisedCatalog.setStartDate(startDate);
355
//            }
356
            else {
357
                currentCategorisedCatalog.setEndDate(startDate.minusDays(1));
33888 ranu 358
 
359
                CategorisedCatalog categorisedCatalog = new CategorisedCatalog();
360
                categorisedCatalog.setCatalogId(catalogId);
361
                categorisedCatalog.setStatus(status);
362
                categorisedCatalog.setStartDate(startDate);
363
                categorisedCatalogRepository.persist(categorisedCatalog);
364
            }
365
 
366
        } else {
367
            CategorisedCatalog categorisedCatalog = new CategorisedCatalog();
368
            categorisedCatalog.setCatalogId(catalogId);
369
            categorisedCatalog.setStatus(status);
370
            categorisedCatalog.setStartDate(startDate);
371
            categorisedCatalogRepository.persist(categorisedCatalog);
372
 
373
        }
374
 
375
        model.addAttribute("response1", true);
376
        return "response";
377
 
378
    }
379
 
380
    @RequestMapping(value = "/getCatalogMovementHistory", method = RequestMethod.GET)
381
    public String getCatalogMovementHistory(HttpServletRequest request, Model model, @RequestParam int catalogId) throws Exception {
382
        List<CategorisedCatalogListModel> categorisedCatalogListModelList = categorisedCatalogRepository.getCatalogMovement(catalogId);
383
 
384
        model.addAttribute("categorisedCatalogListModelList", categorisedCatalogListModelList);
385
        return "catalog-movement-history";
386
 
387
    }
388
 
389
 
390
 
31762 tejbeer 391
    @RequestMapping(value = "/getWebOfferByCatalogId")
392
    public String getCatalog(HttpServletRequest request, @RequestParam int catalogItemId, Model model)
393
            throws ProfitMandiBusinessException {
30596 tejbeer 394
 
31762 tejbeer 395
        List<WebOffer> webOffers = webOfferRepository.selectAllActiveOffers().get(catalogItemId);
30596 tejbeer 396
 
33796 ranu 397
        LocalDateTime todayDateTime = LocalDateTime.now();
398
        LocalDate todayDate = LocalDate.now();
399
 
400
        List<CustomerOffer> customerOffers = customerOfferRepository.selectOffersByDate(todayDateTime);
33818 ranu 401
        List<Integer> customerOfferIds = customerOffers.stream().map(CustomerOffer::getId).collect(Collectors.toList());
402
 
403
        // Retrieve customer offer items
33796 ranu 404
        List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository.selectByOfferIds(customerOfferIds, catalogItemId, todayDate);
405
 
33818 ranu 406
        // Filter customer offer items with endDate greater than today
407
        List<CustomerOfferItem> filteredCustomerOfferItems = customerOfferItems.stream()
33822 ranu 408
                .filter(x -> x.getEndDate() != null && !x.getEndDate().isBefore(todayDate))
33818 ranu 409
                .collect(Collectors.toList());
410
 
31762 tejbeer 411
        model.addAttribute("webOffers", webOffers);
33818 ranu 412
        model.addAttribute("customerOfferItems", filteredCustomerOfferItems);
30596 tejbeer 413
 
31762 tejbeer 414
        return "web-offer-model";
415
    }
30596 tejbeer 416
 
33818 ranu 417
 
31762 tejbeer 418
    // This method is currently hardcoded to faciliate watches sold as gift.
419
    private boolean hasGift(int fofoId) {
420
        try {
421
            return currentInventorySnapshotRepository.selectByItemIdAndFofoId(ProfitMandiConstants.GIFT_ID, fofoId).getAvailability() > 0;
422
        } catch (ProfitMandiBusinessException e) {
423
            return false;
424
        }
425
    }
24203 amit.gupta 426
 
31762 tejbeer 427
    @RequestMapping(value = "/getPaginatedCatalog")
428
    public String getCatalogPaginated(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "20") int limit, @RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, @RequestParam(name = "itemId", required = false, defaultValue = "0") int itemId, @RequestParam(name = "accesories", required = false, defaultValue = "0") boolean accesories, @RequestParam(name = "brand", required = false, defaultValue = "") String brand, Model model) throws ProfitMandiBusinessException {
429
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
430
        if (searchTerm == null) {
431
            searchTerm = "";
432
        }
433
        Map<String, Object> map = inventoryService.getPaginatedCatalog(loginDetails.getFofoId(), offset, limit, searchTerm, itemId, brand, accesories);
434
        model.addAllAttributes(map);
435
        return "catalog-paginated";
436
    }
21987 kshitij.so 437
 
31762 tejbeer 438
    @RequestMapping(value = "/checkItemAvailability")
439
    public String getItemAvailability(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.ITEM_ID) int itemId, Model model) throws ProfitMandiBusinessException {
440
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
441
        CustomCurrentInventorySnapshot customCurrentInventorySnapshot = inventoryService.checkItemAvailability(itemId, loginDetails.getFofoId());
442
        /*
443
         * customCurrentInventorySnapshot
444
         * .setIconUrl(Utils.getIconUrl(customCurrentInventorySnapshot.getCatalogItemId(
445
         * ), host, port, webapp));
446
         */
447
        model.addAttribute("currentInventorySnapshot", new Gson().toJson(customCurrentInventorySnapshot));
448
        return "current-item-availability";
23786 amit.gupta 449
 
31762 tejbeer 450
    }
23786 amit.gupta 451
 
31762 tejbeer 452
    @RequestMapping(value = "/cart", method = RequestMethod.POST)
453
    public String addToCart(HttpServletRequest request, @RequestParam(name = "cartData") String cartData, Model model) throws ProfitMandiBusinessException {
454
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23786 amit.gupta 455
 
31762 tejbeer 456
        Map<String, Object> map = inventoryService.addToCart(cartData, loginDetails.getFofoId());
457
        model.addAllAttributes(map);
458
        return "cart";
459
    }
23786 amit.gupta 460
 
31762 tejbeer 461
    @RequestMapping(value = "/validate-cart", method = RequestMethod.POST)
462
    public String validateCart(HttpServletRequest request, HttpServletResponse response, @RequestParam(name = "cartData") String cartData, Model model) throws ProfitMandiBusinessException {
463
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23786 amit.gupta 464
 
31762 tejbeer 465
        Map<String, Object> map = inventoryService.validateCart(cartData, loginDetails.getFofoId());
466
        model.addAllAttributes(map);
467
        return "validate-cart";
468
    }
21987 kshitij.so 469
 
31762 tejbeer 470
    @RequestMapping(value = "/grnHistory")
471
    public String getGrnHistory(HttpServletRequest request, @RequestParam(required = false) LocalDateTime startTime, @RequestParam(required = false) LocalDateTime endTime, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = ProfitMandiConstants.PURCHASE_REFERENCE, defaultValue = "") String purchaseReference, @RequestParam(name = "searchType", defaultValue = "") String searchType, Model model) throws ProfitMandiBusinessException {
472
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
473
        Map<String, Object> map = inventoryService.getGrnHistory(loginDetails.getFofoId(), startTime, endTime, offset, limit, purchaseReference, searchType);
474
        model.addAllAttributes(map);
475
        return "grn-history";
476
    }
21987 kshitij.so 477
 
31762 tejbeer 478
    @RequestMapping(value = "/downloadPurchaseInvoices")
479
    public ResponseEntity<?> downloadPurchaseInvoices(HttpServletRequest request, @RequestParam(required = false) LocalDateTime startTime, @RequestParam(required = false) LocalDateTime endTime, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = ProfitMandiConstants.PURCHASE_REFERENCE, defaultValue = "") String purchaseReference, @RequestParam(name = "searchType", defaultValue = "") String searchType, Model model) throws ProfitMandiBusinessException {
480
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
481
        Map<String, Object> map = inventoryService.getGrnHistory(loginDetails.getFofoId(), startTime, endTime, offset, limit, purchaseReference, searchType);
25140 amit.gupta 482
 
31762 tejbeer 483
        List<FofoOrder> fofoOrders = (List<FofoOrder>) map.get("saleHistories");
25140 amit.gupta 484
 
31762 tejbeer 485
        if (fofoOrders.size() == 0) {
486
            throw new ProfitMandiBusinessException("Search criteria", "", "No orders found for criteria");
487
        }
25140 amit.gupta 488
 
31762 tejbeer 489
        final HttpHeaders headers = new HttpHeaders();
490
        headers.setContentType(MediaType.APPLICATION_PDF);
491
        headers.set("Content-disposition", "inline; filename=invoices.pdf");
492
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
493
        List<InvoicePdfModel> pdfModels = new ArrayList<>();
494
        PdfUtils.generateAndWrite(pdfModels, byteArrayOutputStream);
495
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
496
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
497
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
498
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
499
    }
25140 amit.gupta 500
 
31762 tejbeer 501
    @RequestMapping(value = "/getPaginatedGrnHistory")
502
    public String getPaginatedGrnHistory(HttpServletRequest request, @RequestParam(required = false) LocalDateTime startTime, @RequestParam(required = false) LocalDateTime endTime, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, @RequestParam(name = ProfitMandiConstants.PURCHASE_REFERENCE, defaultValue = "") String purchaseReference, @RequestParam(name = "searchType", defaultValue = "") String searchType, Model model) throws ProfitMandiBusinessException {
503
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
504
        Map<String, Object> map = inventoryService.getPaginatedGrnHistory(loginDetails.getFofoId(), startTime, endTime, offset, limit);
505
        model.addAllAttributes(map);
506
        return "grn-history-paginated";
507
    }
21987 kshitij.so 508
 
31762 tejbeer 509
    @RequestMapping(value = "/grnHistoryDetailByPurchaseId")
510
    public String grnHistoryByPurchaseId(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.PURCHASE_ID) int purchaseId, Model model) throws ProfitMandiBusinessException {
511
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
512
        Map<String, Object> map = inventoryService.getGrnHistoryDetail(loginDetails.getFofoId(), purchaseId, host, port, webapp);
513
        model.addAllAttributes(map);
514
        return "grn-details";
515
    }
21987 kshitij.so 516
 
31762 tejbeer 517
    @RequestMapping(value = "/grnHistoryDetailByPurchaseReference")
518
    public String grnHistoryByPurchaseReference(HttpServletRequest request, @RequestParam(name = ProfitMandiConstants.PURCHASE_REFERENCE) String purchaseReference, Model model) throws ProfitMandiBusinessException {
519
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
520
        Map<String, Object> map = inventoryService.getGrnHistoryDetail(loginDetails.getFofoId(), purchaseReference, host, port, webapp);
521
        model.addAllAttributes(map);
32584 raveendra. 522
 
31762 tejbeer 523
        return "grn-details";
524
    }
23786 amit.gupta 525
 
31762 tejbeer 526
    @RequestMapping(value = "/activatedImeis")
527
    public String activatedImeis(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
528
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
26248 amit.gupta 529
 
31762 tejbeer 530
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectByActivatedNotSold(loginDetails.getFofoId());
531
        inventoryItems.stream().forEach(x -> {
532
            try {
533
                x.setItem(itemRepository.selectById(x.getItemId()));
534
            } catch (Exception e) {
535
                e.printStackTrace();
536
            }
537
        });
538
        model.addAttribute("inventoryItems", inventoryItems);
539
        return "activated-imeis";
540
    }
27583 tejbeer 541
 
37593 amit 542
    @RequestMapping(value = "/agedAppleImeis")
543
    public String agedAppleImeis(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
544
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
545
 
546
        LocalDateTime beforeDate = LocalDate.now().atStartOfDay()
547
                .minusDays(ProfitMandiConstants.AGED_STOCK_APPLE_DAYS);
548
        List<InventoryItem> inventoryItems =
549
                inventoryItemRepository.selectAgedAppleStock(loginDetails.getFofoId(), beforeDate);
550
        inventoryItems.stream().forEach(x -> {
551
            try {
552
                x.setItem(itemRepository.selectById(x.getItemId()));
553
            } catch (Exception e) {
554
                e.printStackTrace();
555
            }
556
        });
557
        model.addAttribute("inventoryItems", inventoryItems);
558
        model.addAttribute("agedDays", ProfitMandiConstants.AGED_STOCK_APPLE_DAYS);
559
        return "aged-apple-imeis";
560
    }
561
 
31762 tejbeer 562
    @RequestMapping(value = "/activated-imeis-grn-pending")
563
    public String activatedImeisGrnPending(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
564
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30456 amit.gupta 565
 
33312 amit.gupta 566
        List<Order> openOrders = orderRepository.selectGrnTimestampNull(loginDetails.getFofoId(), Arrays.asList(OrderStatus.DELIVERY_SUCCESS));
31762 tejbeer 567
        List<ImeiActivationTimestampModel> imeiActivationTimestampModels = activatedImeiRepository.selectActivatedImeisByOrders(openOrders.stream().map(x -> x.getId()).collect(Collectors.toList()));
568
        Map<Integer, Order> ordersMap = openOrders.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
569
        model.addAttribute("ordersMap", ordersMap);
570
        model.addAttribute("imeiActivationTimestampModels", imeiActivationTimestampModels);
571
        return "activated-imeis-grn-pending";
572
    }
30456 amit.gupta 573
 
31762 tejbeer 574
    @RequestMapping(value = "/view-invoices")
575
    public String viewInvoices(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
576
        return "view-dummy-invoices";
577
    }
27583 tejbeer 578
 
31762 tejbeer 579
    @RequestMapping(value = "/dummy-invoices")
580
    public ResponseEntity<?> downloadInvoices(HttpServletRequest request, @RequestParam String serialNumber, Model model) throws ProfitMandiBusinessException {
581
        byte[] bytes = null;
582
        if (!imeis.contains(serialNumber)) {
27583 tejbeer 583
 
31762 tejbeer 584
            InvoicePdfModel pdfModel = orderService.getDummyPdfModel(serialNumber);
585
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
586
            PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
587
            bytes = byteArrayOutputStream.toByteArray();
588
        } else {
589
            ClassPathResource resource = new ClassPathResource("/META-INF/" + serialNumber + ".pdf");
590
            try {
591
                bytes = FileUtils.readFileToByteArray(resource.getFile());
592
            } catch (Exception e) {
27583 tejbeer 593
 
31762 tejbeer 594
            }
595
        }
596
        final HttpHeaders headers = new HttpHeaders();
597
        headers.setContentType(MediaType.APPLICATION_PDF);
598
        headers.set("Content-disposition", "inline; filename=invoice-" + serialNumber + ".pdf");
599
        headers.setContentLength(bytes.length);
600
        final InputStream inputStream = new ByteArrayInputStream(bytes);
601
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
602
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
603
    }
28714 tejbeer 604
 
31762 tejbeer 605
    @RequestMapping(value = "/dummy-invoices-bulk")
606
    public ResponseEntity<?> downloadInvoicesBulk(HttpServletRequest request, @RequestParam List<String> serialNumbers, Model model) throws Exception {
607
        byte[] bytes = null;
608
        List<Attachment> attachments = new ArrayList<>();
609
        for (String serialNumber : serialNumbers) {
610
            if (!imeis.contains(serialNumber)) {
611
                InvoicePdfModel pdfModel = null;
612
                try {
613
                    pdfModel = orderService.getDummyPdfModel(serialNumber);
614
                } catch (Exception e) {
615
                    continue;
616
                }
617
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
618
                PdfUtils.generateAndWrite(Arrays.asList(pdfModel), byteArrayOutputStream);
619
                bytes = byteArrayOutputStream.toByteArray();
620
            } else {
621
                ClassPathResource resource = new ClassPathResource("/META-INF/" + serialNumber + ".pdf");
622
                try {
623
                    bytes = FileUtils.readFileToByteArray(resource.getFile());
624
                } catch (Exception e) {
625
                    continue;
626
                }
627
            }
628
            attachments.add(new Attachment("invoice-" + serialNumber + ".pdf", new ByteArrayResource(bytes)));
629
        }
28109 tejbeer 630
 
35957 amit 631
        mailOutboxService.queueMailWithAttachments(new String[]{"kuldeep.kumar@smartdukaan.com"}, null, "Invoices List", "PFA", "InventoryController.downloadInvoicesBulk", attachments.toArray(new Attachment[attachments.size()]));
31762 tejbeer 632
        return new ResponseEntity<Boolean>(true, HttpStatus.OK);
633
    }
26248 amit.gupta 634
 
31762 tejbeer 635
    @RequestMapping(value = "/getInventoryItemAgingByInterval", method = RequestMethod.POST)
32075 tejbeer 636
    public String getInventoryItemAgingByInterval(HttpServletRequest request, @RequestBody List<Integer> intervals, Model model, @RequestParam(name = "searchContent", defaultValue = "") String searchContent, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "1000") int limit) throws ProfitMandiBusinessException {
31762 tejbeer 637
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
638
        Map<String, Object> map = inventoryService.getPaginatedItemAgingByInterval(loginDetails.getFofoId(), intervals, searchContent, offset, limit);
639
        model.addAllAttributes(map);
640
        return "item-aging";
641
    }
23786 amit.gupta 642
 
31762 tejbeer 643
    @RequestMapping(value = "/downloadInventoryItemAgingByInterval", method = RequestMethod.POST)
644
    public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request, @RequestBody List<Integer> intervals, Model model) throws ProfitMandiBusinessException {
645
        LOGGER.info("Request received at url{} with body {}", request.getRequestURI(), intervals);
646
        LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);
23786 amit.gupta 647
 
31762 tejbeer 648
        List<InventoryItemAgingModel> inventoryItemAgingModels = inventoryService.getItemAgingByInterval(fofoDetails.getFofoId(), intervals);
23786 amit.gupta 649
 
31762 tejbeer 650
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
651
        ExcelUtils.writeInventoryItemAgingModels(inventoryItemAgingModels, intervals, byteArrayOutputStream);
23786 amit.gupta 652
 
31762 tejbeer 653
        final HttpHeaders headers = new HttpHeaders();
654
        // private static final String CONTENT_TYPE_XLSX =
655
        // "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
656
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
657
        // headers.set("Content-Type", "application/vnd.ms-excel");
658
        headers.set("Content-disposition", "inline; filename=InventoryItemAging.xlsx");
659
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
660
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
661
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
662
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
663
    }
27583 tejbeer 664
 
31762 tejbeer 665
    @RequestMapping(value = "/aging-report", method = RequestMethod.GET)
666
    public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request) throws ProfitMandiBusinessException {
27583 tejbeer 667
 
31762 tejbeer 668
        List<Integer> intervals = Arrays.asList(5, 15, 30, 45);
669
        List<InventoryItemAgingModel> inventoryItemAgingModels = inventoryService.getItemAgingByInterval(intervals).values().stream().flatMap(Collection::stream).collect(Collectors.toList());
670
        LOGGER.info("Fofo Id {}", inventoryItemAgingModels.get(0).getFofoId());
671
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
672
        ExcelUtils.writeInventoryItemAgingModels(inventoryItemAgingModels, intervals, byteArrayOutputStream);
27583 tejbeer 673
 
31762 tejbeer 674
        final HttpHeaders headers = new HttpHeaders();
675
        // private static final String CONTENT_TYPE_XLSX =
676
        // "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
677
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
678
        // headers.set("Content-Type", "application/vnd.ms-excel");
679
        headers.set("Content-disposition", "inline; filename=InventoryItemAging.xlsx");
680
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
681
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
682
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
683
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
684
    }
24123 tejbeer 685
 
31762 tejbeer 686
    @RequestMapping(value = "/featurePanel", method = RequestMethod.GET)
687
    public String FeaturePanel(HttpServletRequest request, Model model) throws Exception {
21987 kshitij.so 688
 
33966 aman.kumar 689
        List<TagRanking> tagRanking = tagRankingRepository.getAllTagRanking();
31762 tejbeer 690
        LOGGER.info("tagRanking" + tagRanking);
691
        if (!tagRanking.isEmpty()) {
692
            Set<Integer> catalogIds = tagRanking.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet());
693
            List<Item> items = itemRepository.selectAllByCatalogIds(catalogIds);
33966 aman.kumar 694
            Map<Integer, String> catalogDescriptionMap = items.stream().collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x.getItemDescription(), (description1, description2) -> description1));
24798 tejbeer 695
 
33966 aman.kumar 696
            LOGGER.info("catalogDescription" + catalogDescriptionMap);
697
            model.addAttribute("catalogDescriptionsMap", catalogDescriptionMap);
24106 tejbeer 698
 
31762 tejbeer 699
        }
33966 aman.kumar 700
        model.addAttribute("tagRanking", tagRanking);
24106 tejbeer 701
 
31762 tejbeer 702
        return "feature";
24106 tejbeer 703
 
31762 tejbeer 704
    }
24123 tejbeer 705
 
31762 tejbeer 706
    @PostMapping(value = "/imei/upload")
707
    public String uploadContent(HttpServletRequest request, @RequestPart("file") MultipartFile file, Model model) throws Exception {
708
        /*
709
         * if(brand==null) { throw new
710
         * ProfitMandiBusinessException("Please select brand", "Brand empty",
711
         * "Brand required"); }
712
         */
713
        List<CSVRecord> masterDataList = readFile(file);
26279 amit.gupta 714
 
37869 amit 715
        Map<String, LocalDateTime> imeisActivationMap = new LinkedHashMap<>();
716
        List<String> errors = new ArrayList<>();
717
        for (CSVRecord record : masterDataList) {
718
            String imei = record.get(0).trim();
719
            String activationDate = record.size() > 1 ? record.get(1).trim() : "";
720
            if (imeisActivationMap.containsKey(imei)) {
721
                errors.add("Row " + record.getRecordNumber() + ": duplicate IMEI " + imei);
722
                continue;
31762 tejbeer 723
            }
37869 amit 724
            LocalDateTime activationTimestamp = null;
725
            if (!StringUtils.isEmpty(activationDate)) {
726
                try {
727
                    activationTimestamp = LocalDateTime.parse(activationDate, formatter);
728
                } catch (DateTimeParseException e) {
729
                    errors.add("Row " + record.getRecordNumber() + ": invalid date '" + activationDate + "' for IMEI " + imei);
730
                    continue;
731
                }
732
            }
733
            imeisActivationMap.put(imei, activationTimestamp);
734
        }
735
        if (!errors.isEmpty()) {
736
            throw new ProfitMandiBusinessException("Activation Date", "M/d/yyyy or M/d/yyyy H:mm or M/d/yyyy H:mm:ss",
737
                    String.join("\n", errors));
738
        }
33952 aman.kumar 739
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
740
        String email = loginDetails.getEmailId();
741
        AuthUser authUser = authRepository.selectByEmailOrMobile(email);
742
        inventoryService.addActivatedImeis(imeisActivationMap, authUser.getId());
31762 tejbeer 743
        model.addAttribute("response1", true);
744
        return "response";
745
    }
26279 amit.gupta 746
 
31762 tejbeer 747
    private List<CSVRecord> readFile(MultipartFile file) throws Exception {
748
        List<CSVRecord> records = null;
749
        try (CSVParser parser = new CSVParser(new InputStreamReader(file.getInputStream()), CSVFormat.DEFAULT)) {
750
            records = parser.getRecords();
751
            if (records.size() < 2) {
752
                throw new ProfitMandiBusinessException("Uploaded File", "", "No records Found");
753
            }
754
            records.remove(0);
755
        } catch (Exception e) {
756
            throw new ProfitMandiBusinessException("Parsing Failed", "parse failed", "file parse failed");
757
        }
758
        return records;
759
    }
26279 amit.gupta 760
 
31762 tejbeer 761
    @RequestMapping(value = "/itemfeature", method = RequestMethod.POST)
762
    public String Itemfeature(HttpServletRequest request, @RequestBody ItemFeatureDataModel itemFeatureDatatModel, Model model) throws Exception {
763
        TagRanking tagRanking = tagRankingRepository.selectBycatalogItemId(itemFeatureDatatModel.getCatalogItemId());
764
        LOGGER.info("tagRanking" + tagRanking);
765
        if (tagRanking == null) {
766
            tagRanking = new TagRanking();
767
            tagRanking.setCatalogItemId(itemFeatureDatatModel.getCatalogItemId());
768
        }
769
        tagRanking.setFeature(itemFeatureDatatModel.getFeature());
770
        tagRanking.setRankPoints(itemFeatureDatatModel.getRankPoints());
25371 tejbeer 771
 
31762 tejbeer 772
        tagRankingRepository.persist(tagRanking);
773
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
774
        return "response";
775
    }
24106 tejbeer 776
 
31762 tejbeer 777
    @RequestMapping(value = "/removeFeature", method = RequestMethod.DELETE)
778
    public String removeTagRankingEnteries(HttpServletRequest request, @RequestParam(name = "id", defaultValue = "0") int id, Model model) throws Exception {
24917 tejbeer 779
 
31762 tejbeer 780
        tagRankingRepository.deleteById(id);
781
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
782
        return "response";
783
    }
24798 tejbeer 784
 
31762 tejbeer 785
    @RequestMapping(value = "/getDemolistbyfofoId", method = RequestMethod.GET)
786
    public String DemoListbyFofoId(HttpServletRequest request, @RequestParam(required = false, defaultValue = "0") int fofoId, Model model) throws Exception {
24465 tejbeer 787
 
31762 tejbeer 788
        List<Integer> fofoIds = fofoStoreRepository.selectAll().stream().map(x -> x.getId()).collect(Collectors.toList());
30426 tejbeer 789
 
31762 tejbeer 790
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
791
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
792
        String customRetailers = JSONObject.valueToString(customRetailersMap.values());
793
        List<String> serailNumberList = liveDemoBillingRespository.selectAllSerialNumber();
794
        LOGGER.info("serailNumberList" + serailNumberList);
795
        List<InventoryItem> inventoryItem = null;
796
        List<InventoryItem> inventoryItem1 = new ArrayList<>();
797
        if (fofoId > 0) {
798
            List<Item> items = itemRepository.selectAllByBrand("Live Demo");
799
            Set<Integer> itemIds = new HashSet<>();
800
            for (Item Item : items) {
801
                itemIds.add(Item.getId());
802
            }
803
            inventoryItem = inventoryItemRepository.selectByFofoIdItemIds(fofoId, itemIds);
24465 tejbeer 804
 
31762 tejbeer 805
            Set<String> serial = new HashSet<>();
806
            for (InventoryItem invItem : inventoryItem) {
807
                if (!serailNumberList.contains(invItem.getSerialNumber())) {
808
                    inventoryItem1.add(invItem);
25371 tejbeer 809
 
31762 tejbeer 810
                }
24465 tejbeer 811
 
31762 tejbeer 812
            }
24465 tejbeer 813
 
31762 tejbeer 814
            LOGGER.info("inventoyItem" + inventoryItem1);
815
            model.addAttribute("customRetailers", customRetailers);
25371 tejbeer 816
 
31762 tejbeer 817
            model.addAttribute("liveDemo", inventoryItem1);
818
            CustomRetailer fofoIdsAndRetailerName = retailerService.getFofoRetailer(fofoId);
24465 tejbeer 819
 
31762 tejbeer 820
            model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
24465 tejbeer 821
 
31785 amit.gupta 822
        } else {
31762 tejbeer 823
            model.addAttribute("customRetailers", customRetailers);
824
            model.addAttribute("liveDemo", inventoryItem1);
825
        }
24465 tejbeer 826
 
31762 tejbeer 827
        return "live_demo_billing";
24465 tejbeer 828
 
31762 tejbeer 829
    }
24465 tejbeer 830
 
31762 tejbeer 831
    @RequestMapping(value = "/enableliveDemoSerailNumber", method = RequestMethod.POST)
832
    public String EnableliveDemoSerailNumber(HttpServletRequest request, @RequestParam String serial_number, Model model) throws Exception {
24465 tejbeer 833
 
31762 tejbeer 834
        LiveDemoSerialNumber liveDemoSerialNumber = new LiveDemoSerialNumber();
835
        liveDemoSerialNumber.setSerialNumber(serial_number);
24465 tejbeer 836
 
31762 tejbeer 837
        liveDemoBillingRespository.persist(liveDemoSerialNumber);
838
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
839
        return "response";
840
    }
24465 tejbeer 841
 
31762 tejbeer 842
    @RequestMapping(value = "/getInProcessOrder", method = RequestMethod.GET)
843
    public String getInProcessOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
24739 tejbeer 844
 
32868 amit.gupta 845
        List<com.spice.profitmandi.dao.entity.transaction.Order> inProcessOrders = orderRepository.selectAllOrder(Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.LOW_INV_PO_RAISED));
31762 tejbeer 846
        List<Integer> retailerIds = new ArrayList<>();
847
        List<Integer> orderIds = new ArrayList<>();
32868 amit.gupta 848
        if (!inProcessOrders.isEmpty()) {
849
            for (com.spice.profitmandi.dao.entity.transaction.Order order : inProcessOrders) {
31762 tejbeer 850
                retailerIds.add(order.getRetailerId());
851
                orderIds.add(order.getId());
24739 tejbeer 852
 
31762 tejbeer 853
            }
24739 tejbeer 854
 
31762 tejbeer 855
            List<NotifyOrder> notify = notifyOrderRespository.selectByorderIds(orderIds);
856
            for (NotifyOrder notifyOrder : notify) {
25449 tejbeer 857
 
31762 tejbeer 858
                Order orderdetail = orderRepository.selectById(notifyOrder.getOrderId());
859
                if (!orderdetail.getStatus().equals(OrderStatus.SUBMITTED_FOR_PROCESSING)) {
860
                    notifyOrder.setStatus(NotifyStatus.rejected);
861
                }
862
            }
24950 tejbeer 863
 
31762 tejbeer 864
            Map<Integer, Optional<NotifyOrder>> notifyOrders = notifyOrderRespository.selectByorderIds(orderIds).stream().collect(Collectors.groupingBy(NotifyOrder::getOrderId, Collectors.maxBy((x1, x2) -> x1.getId() - x2.getId())));
24950 tejbeer 865
 
31762 tejbeer 866
            Map<Integer, NotifyCancel> notifyCancelOrders = notifyCancelOrderRepository.selectByOrderIds(orderIds).stream().collect(Collectors.toMap(x -> x.getOrderId(), x -> x));
867
            Map<Integer, String> storeIdAndFofoIdMap = fofoStoreRepository.selectByRetailerIds(retailerIds).stream().collect(Collectors.toMap(FofoStore::getId, FofoStore::getCode));
24917 tejbeer 868
 
32868 amit.gupta 869
            model.addAttribute("inProcessorder", inProcessOrders);
31762 tejbeer 870
            model.addAttribute("storeIdAndFofoIdMap", storeIdAndFofoIdMap);
871
            model.addAttribute("latestNotifyOrders", notifyOrders);
872
            model.addAttribute("notifyCancelOrders", notifyCancelOrders);
873
        } else {
32868 amit.gupta 874
            model.addAttribute("inProcessorder", inProcessOrders);
31762 tejbeer 875
        }
876
        return "review_order";
877
    }
24739 tejbeer 878
 
31762 tejbeer 879
    @RequestMapping(value = "/getPaymentPendingOrder", method = RequestMethod.GET)
880
    public String getPaymentPendingOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
28109 tejbeer 881
 
31762 tejbeer 882
        List<com.spice.profitmandi.dao.entity.transaction.Order> pendingPaymentorder = orderRepository.selectAllOrderDatesBetweenByStatus(LocalDateTime.now().minusMonths(3), LocalDateTime.now(), OrderStatus.PAYMENT_PENDING);
883
        List<com.spice.profitmandi.dao.entity.transaction.Order> failedPaymentorder = orderRepository.selectAllOrderDatesBetweenByStatus(LocalDateTime.now().minusMonths(3), LocalDateTime.now(), OrderStatus.PAYMENT_FAILED);
884
        pendingPaymentorder.addAll(failedPaymentorder);
885
        model.addAttribute("pendingPaymentorder", pendingPaymentorder);
28109 tejbeer 886
 
31762 tejbeer 887
        return "payment-pending-order";
888
    }
28109 tejbeer 889
 
31762 tejbeer 890
    @RequestMapping(value = "/getKeepInTabOrder", method = RequestMethod.GET)
891
    public String getKeepInTabOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
24739 tejbeer 892
 
32868 amit.gupta 893
        List<com.spice.profitmandi.dao.entity.transaction.Order> keepatab = orderRepository.selectAllOrder(Arrays.asList(OrderStatus.KEEP_A_TAB));
24739 tejbeer 894
 
31762 tejbeer 895
        model.addAttribute("keepatab", keepatab);
24739 tejbeer 896
 
31762 tejbeer 897
        return "keep-a-tab";
898
    }
24739 tejbeer 899
 
31762 tejbeer 900
    @RequestMapping(value = "/closeOrder", method = RequestMethod.POST)
901
    public String closeOrder(HttpServletRequest request, @RequestParam int orderId, Model model) throws Exception {
24798 tejbeer 902
 
31762 tejbeer 903
        Order order = orderRepository.selectById(orderId);
904
        if (order != null) {
905
            order.setStatus(OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY);
24798 tejbeer 906
 
31762 tejbeer 907
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
24739 tejbeer 908
 
31762 tejbeer 909
        } else {
910
            model.addAttribute("response1", mvcResponseSender.createResponseString(false));
24739 tejbeer 911
 
31762 tejbeer 912
        }
913
        return "response";
914
    }
24658 tejbeer 915
 
31762 tejbeer 916
    @RequestMapping(value = "/getcancelOrderItems", method = RequestMethod.GET)
917
    public String getcancelOrderItems(HttpServletRequest request, @RequestParam int itemId, Model model) throws Exception {
25640 tejbeer 918
 
32944 amit.gupta 919
        List<Order> inProcessSelectedOrders = orderRepository.selectByItemIdOrderStatus(itemId, OrderStatus.SUBMITTED_FOR_PROCESSING);
25640 tejbeer 920
 
31762 tejbeer 921
        List<Integer> retailerIds = new ArrayList<>();
32944 amit.gupta 922
        for (com.spice.profitmandi.dao.entity.transaction.Order order : inProcessSelectedOrders) {
31762 tejbeer 923
            retailerIds.add(order.getRetailerId());
924
        }
25640 tejbeer 925
 
31762 tejbeer 926
        Map<Integer, String> storeIdAndFofoIdMap = fofoStoreRepository.selectByRetailerIds(retailerIds).stream().collect(Collectors.toMap(FofoStore::getId, FofoStore::getCode));
25640 tejbeer 927
 
32944 amit.gupta 928
        model.addAttribute("inProcessCancelOrders", inProcessSelectedOrders);
31762 tejbeer 929
        model.addAttribute("storeIdAndFofoIdMap", storeIdAndFofoIdMap);
25640 tejbeer 930
 
31762 tejbeer 931
        return "cancel-order-modal";
932
    }
25640 tejbeer 933
 
33697 amit.gupta 934
    @Autowired
935
    SDCreditService sdCreditService;
936
 
36961 amit 937
    @Autowired
938
    ComboService comboService;
33697 amit.gupta 939
 
31762 tejbeer 940
    @RequestMapping(value = "/cancelOrder", method = RequestMethod.POST)
36961 amit 941
    public String cancelOrder(HttpServletRequest request, @RequestBody OrderCancellationModel orderCancellationModel,
942
                              @RequestParam(required = false, defaultValue = "false") boolean confirmed,
943
                              Model model) throws Exception {
31762 tejbeer 944
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
945
        LOGGER.info("orderId" + orderCancellationModel.getOrderIds());
25640 tejbeer 946
 
31762 tejbeer 947
        try {
948
            List<Order> orders = orderRepository.selectByOrderIdsOrdersStatus(orderCancellationModel.getOrderIds(), OrderStatus.SUBMITTED_FOR_PROCESSING);
949
            if (!orders.isEmpty()) {
36961 amit 950
                ComboCancellationResult comboCheck = comboService.checkOrderCancellationForCombo(orders);
25640 tejbeer 951
 
36961 amit 952
                if (comboCheck.isConfirmationRequired() && !confirmed) {
953
                    model.addAttribute("response1", mvcResponseSender.createResponseString(comboCheck));
954
                    return "response";
955
                }
956
 
957
                List<Integer> allOrderIds = comboCheck.getAllOrderIdsToCancel(orderCancellationModel.getOrderIds());
958
                List<Order> allOrders = allOrderIds.size() > orderCancellationModel.getOrderIds().size()
959
                        ? orderRepository.selectByOrderIdsOrdersStatus(allOrderIds, OrderStatus.SUBMITTED_FOR_PROCESSING)
960
                        : orders;
961
 
962
                for (Order order : allOrders) {
31762 tejbeer 963
                    orderRepository.refundOrder(order.getId(), loginDetails.getEmailId(), orderCancellationModel.getReason(), OrderStatus.CANCELLED_DUE_TO_LOW_INVENTORY);
964
                    List<NotifyOrder> notifyOrders = notifyOrderRespository.selectByOrder(order.getId());
965
                    for (NotifyOrder notifyOrder : notifyOrders) {
33837 tejus.loha 966
                        if (notifyOrder.getStatus().equals(NotifyStatus.pending)) {
31762 tejbeer 967
                            notifyOrder.setStatus(NotifyStatus.rejected);
968
                        }
969
                    }
970
                    sendCancellationNotificationToPartner(order, orderCancellationModel.getReason());
25699 tejbeer 971
 
34733 amit.gupta 972
                    sdCreditService.settleBlockedLoan(order.getTransactionId(), order.getWalletAmount());
31762 tejbeer 973
                }
36961 amit 974
                model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31762 tejbeer 975
            }
36626 amit 976
        } catch (Exception e) {
31762 tejbeer 977
            model.addAttribute("response1", mvcResponseSender.createResponseString(false));
978
        }
25640 tejbeer 979
 
31762 tejbeer 980
        return "response";
981
    }
24739 tejbeer 982
 
31762 tejbeer 983
    private void sendCancellationNotificationToPartner(Order order, String reason) throws Exception {
984
        Item item = itemRepository.selectById(order.getLineItem().getItemId());
25383 tejbeer 985
 
35210 vikas 986
        String title = "Order Cancellation Notice!";
987
        String message = String.format("Pls note that the Order %s %d(Pcs) has been cancelled", item.getItemDescription(), order.getLineItem().getQuantity());
30989 tejbeer 988
 
31762 tejbeer 989
        com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(order.getRetailerId());
30989 tejbeer 990
 
31762 tejbeer 991
        Address address = addressRepository.selectById(user.getAddressId());
30989 tejbeer 992
 
31762 tejbeer 993
        SendNotificationModel sendNotificationModel = new SendNotificationModel();
994
        sendNotificationModel.setCampaignName(title);
995
        sendNotificationModel.setTitle(message);
996
        sendNotificationModel.setType("url");
997
        sendNotificationModel.setMessage(reason);
998
        sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/orderDetails");
999
        sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
1000
        sendNotificationModel.setMessageType(MessageType.notification);
1001
        int userId = userAccountRepository.selectUserIdByRetailerId(order.getRetailerId());
1002
        sendNotificationModel.setUserIds(Arrays.asList(userId));
1003
        notificationService.sendNotification(sendNotificationModel);
25140 amit.gupta 1004
 
31762 tejbeer 1005
        // notificationService.sendWhatsappMessage(message, title,
1006
        // address.getPhoneNumber());
30989 tejbeer 1007
 
31762 tejbeer 1008
    }
25039 amit.gupta 1009
 
31762 tejbeer 1010
    @RequestMapping(value = "/getNotifyItemColor", method = RequestMethod.GET)
1011
    public String getNotifyItemColor(HttpServletRequest request, @RequestParam int catalogItemId, @RequestParam int itemId, Model model) throws ProfitMandiBusinessException {
24917 tejbeer 1012
 
31762 tejbeer 1013
        List<Item> availableColorItems = itemRepository.selectAllByCatalogItemId(catalogItemId);
1014
        Iterator<Item> itemsIterator = availableColorItems.iterator();
24917 tejbeer 1015
 
31762 tejbeer 1016
        while (itemsIterator.hasNext()) {
1017
            Item item = itemsIterator.next();
1018
            TagListing itemTagListing = tagListingRepository.selectByItemId(item.getId());
24950 tejbeer 1019
 
31762 tejbeer 1020
            if (itemTagListing == null) {
1021
                itemsIterator.remove();
24950 tejbeer 1022
 
31785 amit.gupta 1023
            } else if (!itemTagListing.isActive()) {
31762 tejbeer 1024
                itemsIterator.remove();
24950 tejbeer 1025
 
31762 tejbeer 1026
            }
1027
        }
24950 tejbeer 1028
 
31762 tejbeer 1029
        List<Order> inProcessselectedOrder = orderRepository.selectByItemIdOrderStatus(itemId, OrderStatus.SUBMITTED_FOR_PROCESSING);
1030
        List<Integer> retailerIds = new ArrayList<>();
24917 tejbeer 1031
 
31762 tejbeer 1032
        for (com.spice.profitmandi.dao.entity.transaction.Order order : inProcessselectedOrder) {
1033
            retailerIds.add(order.getRetailerId());
24917 tejbeer 1034
 
31762 tejbeer 1035
        }
24917 tejbeer 1036
 
31762 tejbeer 1037
        Map<Integer, String> storeIdAndFofoIdMap = fofoStoreRepository.selectByRetailerIds(retailerIds).stream().collect(Collectors.toMap(FofoStore::getId, FofoStore::getCode));
1038
        LOGGER.info("item" + availableColorItems);
1039
        model.addAttribute("item", availableColorItems);
1040
        model.addAttribute("inProcessselectedOrder", inProcessselectedOrder);
1041
        model.addAttribute("storeIdAndFofoIdMap", storeIdAndFofoIdMap);
24917 tejbeer 1042
 
31762 tejbeer 1043
        return "notify-order-modal";
1044
    }
24917 tejbeer 1045
 
31762 tejbeer 1046
    @RequestMapping(value = "/notifyOrder", method = RequestMethod.POST)
1047
    public String NotifyOrder(HttpServletRequest request, @RequestBody NotifyOrderModel notifyOrderModel, Model model) throws Exception {
24917 tejbeer 1048
 
31762 tejbeer 1049
        com.spice.profitmandi.dao.entity.transaction.NotifyItem notifyItem = null;
1050
        List<Integer> orderIds = new ArrayList<>();
24917 tejbeer 1051
 
31762 tejbeer 1052
        NotifyColorChange notifytimestamp = new NotifyColorChange();
1053
        notifytimestamp.setCreated(LocalDateTime.now());
1054
        notifyColorChangeRepository.persist(notifytimestamp);
1055
        NotifyMessage notifyMessage = new NotifyMessage();
1056
        notifyMessage.setNotifyId(notifytimestamp.getId());
1057
        notifyMessage.setNotifyMessages(notifyOrderModel.getMessage());
1058
        notifyMessageRepository.persist(notifyMessage);
1059
        for (NotifyItemIdModel itemid : notifyOrderModel.getItemIds()) {
24917 tejbeer 1060
 
31762 tejbeer 1061
            notifyItem = new com.spice.profitmandi.dao.entity.transaction.NotifyItem();
1062
            notifyItem.setItemId(itemid.getItemId());
1063
            notifyItem.setResponseTime(itemid.getResponseTime());
1064
            notifyItem.setProcuredDate(itemid.getProcuredTime());
1065
            notifyItem.setNotifyColorchangeId(notifytimestamp.getId());
1066
            notifyItemRepository.persist(notifyItem);
1067
            LOGGER.info("notifyItem" + notifyItem);
1068
        }
1069
        for (NotifyOrderIdModel st : notifyOrderModel.getOrderIds()) {
1070
            List<NotifyOrder> existingOrder = notifyOrderRespository.selectByOrder(st.getOrderId());
1071
            if (!existingOrder.isEmpty()) {
1072
                LOGGER.info("existingOrder" + existingOrder);
1073
                for (NotifyOrder notifyOrder : existingOrder) {
33741 amit.gupta 1074
                    if (NotifyStatus.pending.equals(notifyOrder.getStatus())) {
31762 tejbeer 1075
                        notifyOrder.setStatus(NotifyStatus.rejected);
1076
                        notifyOrder.setUpdateTimestamp(LocalDateTime.now());
1077
                    }
1078
                }
1079
            }
1080
            NotifyOrder orderStatus = new NotifyOrder();
1081
            orderStatus.setOrderId(st.getOrderId());
1082
            orderStatus.setNotifyId(notifytimestamp.getId());
1083
            orderStatus.setItemId(st.getOlditemId());
1084
            Order id = orderRepository.selectById(st.getOrderId());
1085
            orderStatus.setFofoId(id.getRetailerId());
1086
            orderStatus.setStatus(NotifyStatus.pending);
1087
            notifyOrderRespository.persist(orderStatus);
24917 tejbeer 1088
 
31762 tejbeer 1089
            LOGGER.info("itemStatus" + orderStatus);
1090
            orderIds.add(st.getOrderId());
1091
        }
24917 tejbeer 1092
 
31762 tejbeer 1093
        LOGGER.info("orderIds" + orderIds);
1094
        List<Order> orders = orderRepository.selectByOrderIds(orderIds);
1095
        for (Order order : orders) {
1096
            LOGGER.info("order" + order.getId());
24917 tejbeer 1097
 
31762 tejbeer 1098
            String title = "Alert!";
30989 tejbeer 1099
 
31762 tejbeer 1100
            NotifyMessage message = notifyMessageRepository.selectByNotifyId(notifytimestamp.getId());
25140 amit.gupta 1101
 
31762 tejbeer 1102
            com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(order.getRetailerId());
30989 tejbeer 1103
 
31762 tejbeer 1104
            Address address = addressRepository.selectById(user.getAddressId());
30989 tejbeer 1105
 
31762 tejbeer 1106
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
1107
            sendNotificationModel.setCampaignName("Notify Partner");
1108
            sendNotificationModel.setMessage(message.getNotifyMessages());
1109
            sendNotificationModel.setType("url");
1110
            sendNotificationModel.setTitle("Alert");
1111
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifyOrder");
1112
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
1113
            sendNotificationModel.setMessageType(MessageType.notification);
1114
            int userId = userAccountRepository.selectUserIdByRetailerId(order.getRetailerId());
25873 tejbeer 1115
 
31762 tejbeer 1116
            sendNotificationModel.setUserIds(Arrays.asList(userId));
1117
            notificationService.sendNotification(sendNotificationModel);
25140 amit.gupta 1118
 
31762 tejbeer 1119
            // notificationService.sendWhatsappMessage(message.getNotifyMessages(), title,
1120
            // address.getPhoneNumber());
30989 tejbeer 1121
 
31762 tejbeer 1122
        }
1123
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1124
        return "response";
1125
    }
24917 tejbeer 1126
 
31762 tejbeer 1127
    @RequestMapping(value = "/getAllNotifyOrder", method = RequestMethod.GET)
1128
    public String getAllNotifyOrder(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1129
        List<NotifyOrder> notifyOrders = null;
32868 amit.gupta 1130
        List<com.spice.profitmandi.dao.entity.transaction.Order> inProcessorder = orderRepository.selectAllOrder(Arrays.asList(OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW));
24950 tejbeer 1131
 
31762 tejbeer 1132
        List<Integer> orderIds = new ArrayList<>();
1133
        if (!inProcessorder.isEmpty()) {
1134
            for (com.spice.profitmandi.dao.entity.transaction.Order order : inProcessorder) {
24950 tejbeer 1135
 
31762 tejbeer 1136
                orderIds.add(order.getId());
24917 tejbeer 1137
 
31762 tejbeer 1138
            }
1139
            notifyOrders = notifyOrderRespository.selectByorderIds(orderIds);
1140
            Set<Integer> oldItemIds = new HashSet<>();
1141
            List<Integer> fofoIds = new ArrayList<>();
1142
            List<Integer> notifyIds = new ArrayList<>();
1143
            if (!notifyOrders.isEmpty()) {
1144
                for (NotifyOrder notifyOrder : notifyOrders) {
1145
                    oldItemIds.add(notifyOrder.getItemId());
1146
                    fofoIds.add(notifyOrder.getFofoId());
1147
                    notifyIds.add(notifyOrder.getNotifyId());
1148
                }
24917 tejbeer 1149
 
31762 tejbeer 1150
                List<NotifyColorChange> notifyColorChanges = notifyColorChangeRepository.selectByNotifyId(notifyIds);
1151
                Map<Integer, NotifyColorChange> notifyIdNotifyColorMap = this.notifyOrdersToNotifyId(notifyColorChanges);
1152
                Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
1153
                Map<Integer, CustomRetailer> fofoIdsAndRetailerName = fofoIds.stream().distinct().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1154
                Map<Integer, String> itemdescription = inventoryService.getItemIdDescriptionMap(oldItemIds);
24917 tejbeer 1155
 
31762 tejbeer 1156
                model.addAttribute("notifyOrders", notifyOrders);
1157
                model.addAttribute("notifyIdNotifyColorMap", notifyIdNotifyColorMap);
1158
                model.addAttribute("itemdescription", itemdescription);
1159
                model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
24917 tejbeer 1160
 
31762 tejbeer 1161
            } else {
1162
                model.addAttribute("notifyOrders", notifyOrders);
1163
            }
1164
        } else {
1165
            model.addAttribute("notifyOrders", notifyOrders);
1166
        }
1167
        return "notify_order";
1168
    }
24917 tejbeer 1169
 
31762 tejbeer 1170
    private Map<Integer, NotifyColorChange> notifyOrdersToNotifyId(List<NotifyColorChange> notifyColorChanges) {
1171
        Map<Integer, NotifyColorChange> notifyIdNotifyColorMap = new HashMap<>();
1172
        for (NotifyColorChange notifyColorChange : notifyColorChanges) {
1173
            notifyIdNotifyColorMap.put(notifyColorChange.getId(), notifyColorChange);
1174
        }
1175
        return notifyIdNotifyColorMap;
1176
    }
24917 tejbeer 1177
 
31762 tejbeer 1178
    @RequestMapping(value = "/getItems", method = RequestMethod.GET)
1179
    public String getItems(HttpServletRequest request, @RequestParam int catalogItemId, Model model) throws Exception {
26031 tejbeer 1180
 
31762 tejbeer 1181
        Set<Integer> itemIds = itemRepository.selectAllByCatalogItemId(catalogItemId).stream().map(x -> x.getId()).collect(Collectors.toSet());
26031 tejbeer 1182
 
31762 tejbeer 1183
        List<Order> notAvailableProcessingOrder = orderRepository.selectByItemIdsOrderStatus(itemIds, OrderStatus.SUBMITTED_FOR_PROCESSING);
1184
        LOGGER.info("notAvailableProcessingOrder" + notAvailableProcessingOrder);
26031 tejbeer 1185
 
31762 tejbeer 1186
        List<Integer> retailerIds = new ArrayList<>();
1187
        for (com.spice.profitmandi.dao.entity.transaction.Order order : notAvailableProcessingOrder) {
1188
            retailerIds.add(order.getRetailerId());
26031 tejbeer 1189
 
31762 tejbeer 1190
        }
26031 tejbeer 1191
 
31762 tejbeer 1192
        Map<Integer, String> storeIdAndFofoIdMap = fofoStoreRepository.selectByRetailerIds(retailerIds).stream().collect(Collectors.toMap(FofoStore::getId, FofoStore::getCode));
26031 tejbeer 1193
 
31762 tejbeer 1194
        model.addAttribute("notAvailableProcessingOrder", notAvailableProcessingOrder);
1195
        model.addAttribute("storeIdAndFofoIdMap", storeIdAndFofoIdMap);
26031 tejbeer 1196
 
31762 tejbeer 1197
        return "partner-cancel-order-modal";
1198
    }
26031 tejbeer 1199
 
31762 tejbeer 1200
    @RequestMapping(value = "/notifyCancelOrder", method = RequestMethod.POST)
1201
    public String NotifyCancelOrder(HttpServletRequest request, @RequestBody NotifyOrderModel notifyOrderModel, Model model) throws Exception {
1202
        for (NotifyOrderIdModel st : notifyOrderModel.getOrderIds()) {
1203
            LOGGER.info("orderId" + st.getOrderId());
1204
            Order order = orderRepository.selectById(st.getOrderId());
1205
            NotifyCancel nc = notifyCancelOrderRepository.selectByOrderId(st.getOrderId());
1206
            if (nc == null) {
1207
                nc = new NotifyCancel();
1208
                nc.setOrderId(st.getOrderId());
1209
                nc.setItemId(st.getOlditemId());
1210
                nc.setFofoId(order.getRetailerId());
1211
                nc.setCancellation(false);
1212
                nc.setCreatedTimestamp(LocalDateTime.now());
1213
                nc.setUpdatedTimestamp(LocalDateTime.now());
1214
                notifyCancelOrderRepository.persist(nc);
1215
            } else {
1216
                nc.setOrderId(st.getOrderId());
1217
                nc.setItemId(st.getOlditemId());
1218
                nc.setFofoId(order.getRetailerId());
1219
                nc.setCancellation(false);
1220
                nc.setUpdatedTimestamp(LocalDateTime.now());
1221
                notifyCancelOrderRepository.persist(nc);
1222
            }
26031 tejbeer 1223
 
31762 tejbeer 1224
            SendNotificationModel sendNotificationModel = new SendNotificationModel();
1225
            sendNotificationModel.setCampaignName("Notify Partner");
1226
            sendNotificationModel.setMessage(notifyOrderModel.getMessage());
1227
            sendNotificationModel.setType("url");
1228
            sendNotificationModel.setTitle("Alert");
1229
            sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifyCancelOrder");
1230
            sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(2));
1231
            sendNotificationModel.setMessageType(MessageType.notification);
1232
            int userId = userAccountRepository.selectUserIdByRetailerId(order.getRetailerId());
26031 tejbeer 1233
 
31762 tejbeer 1234
            sendNotificationModel.setUserIds(Arrays.asList(userId));
1235
            notificationService.sendNotification(sendNotificationModel);
26031 tejbeer 1236
 
31762 tejbeer 1237
        }
26031 tejbeer 1238
 
31762 tejbeer 1239
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1240
        return "response";
1241
    }
26039 tejbeer 1242
 
31762 tejbeer 1243
    @RequestMapping(value = "/getNotifiedCancelOrder", method = RequestMethod.GET)
1244
    public String getNotifiedCancelOrder(HttpServletRequest request, Model model) throws Exception {
26039 tejbeer 1245
 
31762 tejbeer 1246
        List<NotifyCancel> notifyCancels = notifyCancelOrderRepository.selectAllNonCancelOrder();
1247
        if (!notifyCancels.isEmpty()) {
1248
            List<Integer> retailerIds = new ArrayList<>();
1249
            Set<Integer> itemIds = new HashSet<>();
1250
            for (NotifyCancel nc : notifyCancels) {
1251
                retailerIds.add(nc.getFofoId());
1252
                itemIds.add(nc.getItemId());
1253
            }
26039 tejbeer 1254
 
31762 tejbeer 1255
            Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
26039 tejbeer 1256
 
31762 tejbeer 1257
            Map<Integer, CustomRetailer> fofoIdsAndRetailerName = retailerIds.stream().map(x -> customRetailerMap.get(x)).filter(x -> x != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
1258
            Map<Integer, String> itemdescription = inventoryService.getItemIdDescriptionMap(itemIds);
1259
            model.addAttribute("notifyCancels", notifyCancels);
1260
            model.addAttribute("itemdescription", itemdescription);
1261
            model.addAttribute("fofoIdsAndRetailerName", fofoIdsAndRetailerName);
1262
        } else {
26039 tejbeer 1263
 
31762 tejbeer 1264
            model.addAttribute("notifyCancels", notifyCancels);
26039 tejbeer 1265
 
31762 tejbeer 1266
        }
1267
        return "notify_cancel";
1268
    }
26039 tejbeer 1269
 
31762 tejbeer 1270
    @RequestMapping(value = "/getNotifyItems", method = RequestMethod.GET)
1271
    public String getNotifyItems(HttpServletRequest request, @RequestParam int itemId, Model model) throws Exception {
1272
        Item item = itemRepository.selectById(itemId);
26039 tejbeer 1273
 
31762 tejbeer 1274
        List<Integer> itemIds = itemRepository.selectAllByCatalogItemId(item.getCatalogItemId()).stream().map(x -> x.getId()).collect(Collectors.toList());
26039 tejbeer 1275
 
31762 tejbeer 1276
        List<NotifyCancel> ncs = notifyCancelOrderRepository.selectByItemIdsAndStatus(itemIds);
1277
        List<Integer> retailerIds = new ArrayList<>();
1278
        Map<Integer, Object> orders = new HashMap<>();
1279
        for (NotifyCancel nc : ncs) {
1280
            retailerIds.add(nc.getFofoId());
1281
            Order od = orderRepository.selectById(nc.getOrderId());
1282
            orders.put(nc.getOrderId(), od);
1283
        }
26039 tejbeer 1284
 
31762 tejbeer 1285
        Map<Integer, String> storeIdAndFofoIdMap = fofoStoreRepository.selectByRetailerIds(retailerIds).stream().collect(Collectors.toMap(FofoStore::getId, FofoStore::getCode));
26039 tejbeer 1286
 
31762 tejbeer 1287
        model.addAttribute("notifyItems", ncs);
1288
        model.addAttribute("orders", orders);
1289
        model.addAttribute("storeIdAndFofoIdMap", storeIdAndFofoIdMap);
26039 tejbeer 1290
 
31762 tejbeer 1291
        return "notify_cancel_order_modal";
1292
    }
26039 tejbeer 1293
 
31762 tejbeer 1294
    @RequestMapping(value = "/changeNotifyCancelRequest", method = RequestMethod.POST)
1295
    public String changeNotifyCancelRequest(HttpServletRequest request, @RequestBody NotifyOrderModel notifyOrderModel, Model model) throws Exception {
1296
        List<Integer> orderIds = notifyOrderModel.getOrderIds().stream().map(x -> x.getOrderId()).collect(Collectors.toList());
26039 tejbeer 1297
 
31762 tejbeer 1298
        List<NotifyCancel> ncs = notifyCancelOrderRepository.selectByOrderIds(orderIds);
1299
        for (NotifyCancel nc : ncs) {
1300
            nc.setCancellation(true);
1301
        }
26039 tejbeer 1302
 
31762 tejbeer 1303
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1304
        return "response";
1305
    }
26482 tejbeer 1306
 
31762 tejbeer 1307
    @RequestMapping(value = "/getProducts", method = RequestMethod.GET)
1308
    public String getProducts(HttpServletRequest request, Model model) throws ProfitMandiBusinessException, URISyntaxException, IOException {
26482 tejbeer 1309
 
31762 tejbeer 1310
        return "product-detail";
1311
    }
26482 tejbeer 1312
 
31762 tejbeer 1313
    @RequestMapping(value = "/getProductInfo", method = RequestMethod.GET)
1314
    public String getProductInfo(HttpServletRequest request, long catalogId, Model model) throws Exception {
1315
        ContentPojo cp = mongoClient.getEntityById(catalogId);
1316
        model.addAttribute("cp", cp);
1317
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1318
        return "product-info";
1319
    }
26493 tejbeer 1320
 
31762 tejbeer 1321
    @RequestMapping(value = "/getProductCompareInfo", method = RequestMethod.GET)
1322
    public String getProductCompareInfo(HttpServletRequest request, @RequestParam List<Long> catalogIds, Model model) throws Exception {
1323
        List<ContentPojo> cps = new ArrayList<>();
1324
        Set<Integer> cataogIds = catalogIds.stream().mapToInt(Long::intValue).boxed().collect(Collectors.toSet());
1325
        LOGGER.info("tagListingMOP" + cataogIds);
1326
        for (Long cId : catalogIds) {
1327
            ContentPojo cp = mongoClient.getEntityById(cId);
1328
            if (cp.getName() == null) {
1329
                cp.setName(itemRepository.selectAllByCatalogItemId(cId.intValue()).get(0).getItemDescriptionNoColor());
1330
            }
1331
            List<Item> items = itemRepository.selectAllByCatalogItemId(cId.intValue());
1332
            LOGGER.info("itemsMop" + items);
1333
            int i = 0;
1334
            for (Item item : items) {
1335
                TagListing tagListing = tagListingRepository.selectByItemId(items.get(i).getId());
27618 tejbeer 1336
 
31762 tejbeer 1337
                if (tagListing != null) {
1338
                    cp.setPrice(tagListing.getMop());
27618 tejbeer 1339
 
31762 tejbeer 1340
                    LOGGER.info("tagListingMOP" + tagListing);
27618 tejbeer 1341
 
31762 tejbeer 1342
                    break;
27618 tejbeer 1343
 
31762 tejbeer 1344
                }
1345
                i++;
1346
            }
1347
            cps.add(cp);
27583 tejbeer 1348
 
31762 tejbeer 1349
        }
26959 tejbeer 1350
 
31762 tejbeer 1351
        List<Map<String, String>> entityList = new ArrayList<>();
1352
        for (ContentPojo cp : cps) {
1353
            Map<String, String> specsMap = new HashMap<>();
1354
            for (SpecificationGroup sg : cp.getDetailedSpecs()) {
1355
                String title = sg.getTitle();
1356
                for (Specification s : sg.getSpecs()) {
1357
                    String key = title + s.getName();
1358
                    specsMap.put(key, String.join(", ", s.getValues()));
1359
                }
1360
            }
1361
            entityList.add(specsMap);
27723 tejbeer 1362
 
31762 tejbeer 1363
        }
26959 tejbeer 1364
 
31762 tejbeer 1365
        LOGGER.info("cps" + cps);
1366
        model.addAttribute("cps", cps);
1367
        model.addAttribute("catalogIds", gson.toJson(catalogIds, List.class));
1368
        model.addAttribute("entityList", entityList);
1369
        return "product-compare";
1370
    }
27723 tejbeer 1371
 
31762 tejbeer 1372
    @RequestMapping(value = "/inventory", method = RequestMethod.GET)
1373
    public String Inventory(HttpServletRequest request, @RequestParam(name = "warehouseIds", required = true, defaultValue = "0") List<Integer> warehouseIds, Model model) throws Exception {
1374
        model.addAttribute("warehouseId", warehouseIds);
1375
        LOGGER.info("warehouseIds" + warehouseIds);
27723 tejbeer 1376
 
37846 amit 1377
        Map<Integer, String> warehouseMap = billingWarehouseService.getActiveWarehouses();
31762 tejbeer 1378
        if (warehouseIds.contains(0)) {
1379
            warehouseIds.addAll(warehouseMap.keySet());
1380
        }
27723 tejbeer 1381
 
31762 tejbeer 1382
        long poTodayValue = 0;
1383
        long poThreedaysValue = 0;
1384
        long poSevendaysValue = 0;
1385
        long poTodayQty = 0;
1386
        long poThreedaysQty = 0;
1387
        long poSevendaysQty = 0;
27739 tejbeer 1388
 
31762 tejbeer 1389
        List<OpenPoModel> openPO = warehousePurchaseOrderRepository.selectOpenPo(warehouseIds);
1390
        for (OpenPoModel po : openPO) {
1391
            poTodayValue += po.getTodayValue();
1392
            poThreedaysValue += po.getThreedaysValue();
1393
            poSevendaysValue += po.getSevendaysValue();
1394
            poTodayQty += po.getTodayQty();
1395
            poThreedaysQty += po.getThreedaysQty();
1396
            poSevendaysQty += po.getSevendaysQty();
1397
        }
1398
        OpenPoModel poModel = new OpenPoModel();
1399
        poModel.setBrand("Total Values");
1400
        poModel.setTodayValue(poTodayValue);
1401
        poModel.setThreedaysValue(poThreedaysValue);
1402
        poModel.setSevendaysValue(poSevendaysValue);
1403
        poModel.setSevendaysQty(poSevendaysQty);
1404
        poModel.setThreedaysQty(poThreedaysQty);
1405
        poModel.setTodayQty(poTodayQty);
1406
        openPO.add(poModel);
27739 tejbeer 1407
 
31762 tejbeer 1408
        long purtodayValue = 0;
1409
        long purthreedaysValue = 0;
1410
        long purlmsValue = 0;
1411
        long purmtd = 0;
1412
        long purtodayQty = 0;
1413
        long purthreedaysQty = 0;
1414
        long purlmsQty = 0;
1415
        long purmtdQty = 0;
27739 tejbeer 1416
 
32763 amit.gupta 1417
        List<OurPurchaseModel> ourPurchaseModels = warehouseScanRepository.selectOurPurchase(warehouseIds);
27739 tejbeer 1418
 
32763 amit.gupta 1419
        for (OurPurchaseModel pm : ourPurchaseModels) {
31762 tejbeer 1420
            purtodayValue += pm.getTodayValue();
1421
            purthreedaysValue += pm.getThreedaysValue();
1422
            purlmsValue += pm.getLms();
1423
            purmtd += pm.getMtd();
1424
            purtodayQty += pm.getTodayQty();
1425
            purthreedaysQty += pm.getThreedaysQty();
1426
            purlmsQty += pm.getLmsQty();
1427
            purmtdQty += pm.getMtdQty();
1428
        }
1429
        OurPurchaseModel omp = new OurPurchaseModel();
1430
        omp.setBrand("Total Values");
1431
        omp.setTodayValue(purtodayValue);
1432
        omp.setThreedaysValue(purthreedaysValue);
1433
        omp.setLms(purlmsValue);
1434
        omp.setMtd(purmtd);
1435
        omp.setTodayQty(purtodayQty);
1436
        omp.setThreedaysQty(purthreedaysQty);
1437
        omp.setLmsQty(purlmsQty);
1438
        omp.setMtdQty(purmtdQty);
32763 amit.gupta 1439
        ourPurchaseModels.add(omp);
27749 tejbeer 1440
 
31762 tejbeer 1441
        List<BrandWiseTertiaryModel> tertiary = fofoOrderRepository.selectGroupByBrandPartnerTertiary(warehouseIds);
1442
        long tertodayValue = 0;
1443
        long terthreedaysValue = 0;
1444
        long termtd = 0;
1445
        long terlmtd = 0;
1446
        long terlms = 0;
1447
        long tertodayQty = 0;
1448
        long terthreedaysQty = 0;
1449
        long termtdQty = 0;
1450
        long terlmtdQty = 0;
1451
        long terlmsQty = 0;
1452
        for (BrandWiseTertiaryModel btm : tertiary) {
1453
            tertodayValue += btm.getTodayValue();
1454
            terthreedaysValue += btm.getThreedaysValue();
1455
            termtd += btm.getMtd();
1456
            terlmtd += btm.getLmtd();
1457
            terlms += btm.getLms();
1458
            tertodayQty += btm.getTodayQty();
1459
            terthreedaysQty += btm.getThreedaysQty();
1460
            termtdQty += btm.getMtdQty();
1461
            terlmtdQty += btm.getLmtdQty();
1462
            terlmsQty += btm.getLmsQty();
1463
        }
1464
        BrandWiseTertiaryModel bwt = new BrandWiseTertiaryModel();
1465
        bwt.setBrand("Total Values");
1466
        bwt.setTodayValue(tertodayValue);
1467
        bwt.setThreedaysValue(terthreedaysValue);
1468
        bwt.setMtd(termtd);
1469
        bwt.setLmtd(terlmtd);
1470
        bwt.setLms(terlms);
1471
        bwt.setTodayQty(tertodayQty);
1472
        bwt.setThreedaysQty(terthreedaysQty);
1473
        bwt.setMtdQty(termtdQty);
1474
        bwt.setLmtdQty(terlmtdQty);
1475
        bwt.setLmsQty(terlmsQty);
1476
        tertiary.add(bwt);
27749 tejbeer 1477
 
31762 tejbeer 1478
        List<SecondaryOrderBillingModel> billing = orderRepository.selectAllBilledOrderGroupByBrand(warehouseIds);
1479
        long sectodayValue = 0;
1480
        long secthreedaysValue = 0;
1481
        long secmtd = 0;
1482
        long seclmtd = 0;
1483
        long seclms = 0;
1484
        long sectodayQty = 0;
1485
        long secthreedaysQty = 0;
1486
        long secmtdQty = 0;
1487
        long seclmtdQty = 0;
1488
        long seclmsQty = 0;
1489
        for (SecondaryOrderBillingModel sbm : billing) {
1490
            sectodayValue += sbm.getTodayValue();
1491
            secthreedaysValue += sbm.getThreedaysValue();
1492
            secmtd += sbm.getMtd();
1493
            seclmtd += sbm.getLmtd();
1494
            seclms += sbm.getLms();
1495
            sectodayQty += sbm.getTodayQty();
1496
            secthreedaysQty += sbm.getThreedaysQty();
1497
            secmtdQty += sbm.getMtdQty();
1498
            seclmtdQty += sbm.getLmtdQty();
1499
            seclmsQty += sbm.getLmsQty();
1500
        }
27739 tejbeer 1501
 
31762 tejbeer 1502
        SecondaryOrderBillingModel som = new SecondaryOrderBillingModel();
1503
        som.setBrand("Total Values");
1504
        som.setTodayValue(sectodayValue);
1505
        som.setThreedaysValue(secthreedaysValue);
1506
        som.setMtd(secmtd);
1507
        som.setLmtd(seclmtd);
1508
        som.setLms(seclms);
1509
        som.setTodayQty(sectodayQty);
1510
        som.setThreedaysQty(secthreedaysQty);
1511
        som.setMtdQty(secmtdQty);
1512
        som.setLmtdQty(seclmtdQty);
1513
        som.setLmsQty(seclmsQty);
1514
        billing.add(som);
1515
        LOGGER.info("openPO" + openPO);
32763 amit.gupta 1516
        LOGGER.info("purchase" + ourPurchaseModels);
31762 tejbeer 1517
        LOGGER.info("tertiary" + tertiary);
1518
        LOGGER.info("billing" + billing);
27723 tejbeer 1519
 
31762 tejbeer 1520
        LOGGER.info("warehouseIds" + warehouseIds);
1521
        model.addAttribute("warehouseMap", warehouseMap);
1522
        model.addAttribute("openPO", openPO);
32763 amit.gupta 1523
        model.addAttribute("ourPurchaseModels", ourPurchaseModels);
31762 tejbeer 1524
        model.addAttribute("tertiary", tertiary);
1525
        model.addAttribute("billing", billing);
27723 tejbeer 1526
 
31762 tejbeer 1527
        return "inventory-listing";
27723 tejbeer 1528
 
31762 tejbeer 1529
    }
27738 tejbeer 1530
 
31762 tejbeer 1531
    @RequestMapping(value = "/getOpenPoItemByBrand", method = RequestMethod.GET)
1532
    public String Inventory(HttpServletRequest request, @RequestParam(name = "warehouseIds", required = true, defaultValue = "0") List<Integer> warehouseIds, @RequestParam(name = "brand", required = true, defaultValue = "") List<String> brand, int timeValue, Model model) throws Exception {
1533
        model.addAttribute("warehouseId", warehouseIds);
1534
        LOGGER.info("warehouseIds" + warehouseIds);
27738 tejbeer 1535
 
37846 amit 1536
        Map<Integer, String> warehouseMap = billingWarehouseService.getActiveWarehouses();
31762 tejbeer 1537
        if (warehouseIds.contains(0)) {
1538
            warehouseIds.addAll(warehouseMap.keySet());
1539
        }
37193 ranu 1540
        // Band-aid for URL '+' decode issue on brand names (e.g. "Ai+"):
1541
        // if a brand doesn't exist in catalog.brand as-is but "<brand>+" does,
1542
        // switch to the plus variant. Zero regression for the other brands.
1543
        brand = brand.stream().map(b -> {
1544
            if (b == null || b.trim().isEmpty()) return b;
1545
            String probe = b.replaceAll("\\s+$", "");
1546
            try {
1547
                if (brandsRepository.selectByBrand(b) == null
1548
                        && (probe.equals(b) || brandsRepository.selectByBrand(probe) == null)) {
1549
                    String withPlus = probe + "+";
1550
                    if (brandsRepository.selectByBrand(withPlus) != null) {
1551
                        LOGGER.info("getOpenPoItemByBrand brand fallback: '{}' -> '{}'", b, withPlus);
1552
                        return withPlus;
1553
                    }
1554
                }
1555
            } catch (Exception e) {
1556
                LOGGER.warn("getOpenPoItemByBrand brand fallback failed for '{}': {}", b, e.getMessage());
1557
            }
1558
            return b;
1559
        }).collect(Collectors.toList());
31762 tejbeer 1560
        LOGGER.info("brand" + brand);
27749 tejbeer 1561
 
31762 tejbeer 1562
        if (brand.contains("Total Values")) {
1563
            List<String> poBrands = warehousePurchaseOrderRepository.selectOpenPo(warehouseIds).stream().map(x -> x.getBrand()).collect(Collectors.toList());
27749 tejbeer 1564
 
31762 tejbeer 1565
            brand.addAll(poBrands);
1566
        }
27749 tejbeer 1567
 
31762 tejbeer 1568
        LOGGER.info("brand" + brand);
1569
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
1570
        List<OpenPoItemModel> openPOItem = null;
1571
        if (timeValue != 0) {
1572
            openPOItem = warehousePurchaseOrderRepository.selectOpenPoItem(warehouseIds, brand, curDate.minusDays(timeValue), curDate);
1573
        } else {
1574
            openPOItem = warehousePurchaseOrderRepository.selectTodayOpenPoItem(warehouseIds, brand, curDate);
1575
        }
1576
        LOGGER.info("openPOItem" + openPOItem);
27738 tejbeer 1577
 
31762 tejbeer 1578
        model.addAttribute("openPOItem", openPOItem);
27738 tejbeer 1579
 
31762 tejbeer 1580
        return "inventory-listing-po-item";
27738 tejbeer 1581
 
31762 tejbeer 1582
    }
27738 tejbeer 1583
 
31762 tejbeer 1584
    @RequestMapping(value = "/getOurPurchaseItemByBrand", method = RequestMethod.GET)
1585
    public String getOurPurchaseItemByBrand(HttpServletRequest request, @RequestParam(name = "warehouseIds", required = true, defaultValue = "0") List<Integer> warehouseIds, @RequestParam(name = "brand", required = true, defaultValue = "") List<String> brand, int timeValue, Model model) throws Exception {
1586
        model.addAttribute("warehouseId", warehouseIds);
1587
        LOGGER.info("warehouseIds" + warehouseIds);
27738 tejbeer 1588
 
37846 amit 1589
        Map<Integer, String> warehouseMap = billingWarehouseService.getActiveWarehouses();
31762 tejbeer 1590
        if (warehouseIds.contains(0)) {
1591
            warehouseIds.addAll(warehouseMap.keySet());
1592
        }
37193 ranu 1593
        // Band-aid for URL '+' decode issue on brand names (e.g. "Ai+"):
1594
        // if a brand doesn't exist in catalog.brand as-is but "<brand>+" does,
1595
        // switch to the plus variant. Zero regression for the other brands.
1596
        brand = brand.stream().map(b -> {
1597
            if (b == null || b.trim().isEmpty()) return b;
1598
            String probe = b.replaceAll("\\s+$", "");
1599
            try {
1600
                if (brandsRepository.selectByBrand(b) == null
1601
                        && (probe.equals(b) || brandsRepository.selectByBrand(probe) == null)) {
1602
                    String withPlus = probe + "+";
1603
                    if (brandsRepository.selectByBrand(withPlus) != null) {
1604
                        LOGGER.info("getOurPurchaseItemByBrand brand fallback: '{}' -> '{}'", b, withPlus);
1605
                        return withPlus;
1606
                    }
1607
                }
1608
            } catch (Exception e) {
1609
                LOGGER.warn("getOurPurchaseItemByBrand brand fallback failed for '{}': {}", b, e.getMessage());
1610
            }
1611
            return b;
1612
        }).collect(Collectors.toList());
31762 tejbeer 1613
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
27749 tejbeer 1614
 
31762 tejbeer 1615
        if (brand.contains("Total Values")) {
1616
            List<String> purchasebrands = warehouseScanRepository.selectOurPurchase(warehouseIds).stream().map(x -> x.getBrand()).collect(Collectors.toList());
27749 tejbeer 1617
 
31762 tejbeer 1618
            brand.addAll(purchasebrands);
1619
        }
1620
        List<OurPurchaseItemModel> ourPurchaseItem = null;
1621
        if (timeValue != 0) {
1622
            if (timeValue == 1) {
1623
                ourPurchaseItem = warehouseScanRepository.selectOurPurchaseItemByBrand(warehouseIds, brand, curDate.withDayOfMonth(1), curDate.plusDays(1));
27749 tejbeer 1624
 
31762 tejbeer 1625
            } else if (timeValue == -1) {
27749 tejbeer 1626
 
31762 tejbeer 1627
                ourPurchaseItem = warehouseScanRepository.selectOurPurchaseItemByBrand(warehouseIds, brand, curDate.minusMonths(1).withDayOfMonth(1), curDate.withDayOfMonth(1));
27749 tejbeer 1628
 
31762 tejbeer 1629
            } else {
1630
                ourPurchaseItem = warehouseScanRepository.selectOurPurchaseItemByBrand(warehouseIds, brand, curDate.minusDays(timeValue), curDate);
27749 tejbeer 1631
 
31762 tejbeer 1632
            }
1633
        } else {
1634
            ourPurchaseItem = warehouseScanRepository.selectTodayOurPurchaseItemByBrand(warehouseIds, brand, curDate);
1635
        }
1636
        LOGGER.info("ourPurchaseItem" + ourPurchaseItem);
27738 tejbeer 1637
 
31762 tejbeer 1638
        model.addAttribute("ourPurchaseItem", ourPurchaseItem);
1639
        model.addAttribute("warehouseMap", warehouseMap);
27738 tejbeer 1640
 
31762 tejbeer 1641
        return "inventory-listing-purchase-item";
27738 tejbeer 1642
 
31762 tejbeer 1643
    }
27738 tejbeer 1644
 
31762 tejbeer 1645
    @RequestMapping(value = "/getWarehouseWiseSecondaryBillingByBrand", method = RequestMethod.GET)
1646
    public String getWarehouseWiseSecondaryBillingByBrand(HttpServletRequest request, @RequestParam(name = "brand", required = true, defaultValue = "") String brand, int timeValue, Model model) throws Exception {
27738 tejbeer 1647
 
37193 ranu 1648
        // Band-aid for URL '+' decode issue on brand names (e.g. "Ai+"):
1649
        // if the incoming brand isn't found in catalog.brand but "<brand>+" is,
1650
        // switch to the plus variant. Zero regression for the other brands.
1651
        if (brand != null && !brand.trim().isEmpty()) {
1652
            String probe = brand.replaceAll("\\s+$", "");
1653
            try {
1654
                if (brandsRepository.selectByBrand(brand) == null
1655
                        && (probe.equals(brand) || brandsRepository.selectByBrand(probe) == null)) {
1656
                    String withPlus = probe + "+";
1657
                    if (brandsRepository.selectByBrand(withPlus) != null) {
1658
                        LOGGER.info("getWarehouseWiseSecondaryBillingByBrand brand fallback: '{}' -> '{}'", brand, withPlus);
1659
                        brand = withPlus;
1660
                    }
1661
                }
1662
            } catch (Exception e) {
1663
                LOGGER.warn("getWarehouseWiseSecondaryBillingByBrand brand fallback failed for '{}': {}", brand, e.getMessage());
1664
            }
1665
        }
1666
 
31762 tejbeer 1667
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
1668
        int dayOfMonth = curDate.getDayOfMonth();
1669
        LocalDateTime startOfMonth = curDate.withDayOfMonth(1);
1670
        int lengthOfMonth = YearMonth.from(startOfMonth.minusMonths(1)).lengthOfMonth();
27749 tejbeer 1671
 
37846 amit 1672
        Map<Integer, String> warehouseMap = billingWarehouseService.getActiveWarehouses();
31762 tejbeer 1673
        SecondaeryOrderDateRange sr = null;
1674
        if (brand.equals("Total Values")) {
1675
            brand = null;
1676
        }
1677
        if (timeValue != 0) {
1678
            if (timeValue == 1) {
27738 tejbeer 1679
 
31762 tejbeer 1680
                sr = getSecondaryModel(brand, curDate.withDayOfMonth(1), curDate.plusDays(1));
27867 tejbeer 1681
 
31762 tejbeer 1682
            } else if (timeValue == 2) {
1683
                LOGGER.info("curDate" + curDate.withDayOfMonth(1).minusMonths(1));
1684
                LOGGER.info("curDate" + curDate.minusMonths(1).plusDays(Math.min(dayOfMonth, lengthOfMonth)));
27749 tejbeer 1685
 
31762 tejbeer 1686
                sr = getSecondaryModel(brand, curDate.withDayOfMonth(1).minusMonths(1), startOfMonth.minusMonths(1).plusDays(Math.min(dayOfMonth, lengthOfMonth)));
27867 tejbeer 1687
 
31762 tejbeer 1688
            } else if (timeValue == -1) {
27867 tejbeer 1689
 
31762 tejbeer 1690
                sr = getSecondaryModel(brand, curDate.minusMonths(1).withDayOfMonth(1), startOfMonth);
27867 tejbeer 1691
 
31762 tejbeer 1692
            } else {
27738 tejbeer 1693
 
31762 tejbeer 1694
                sr = getSecondaryModel(brand, curDate.minusDays(timeValue), curDate);
1695
            }
27738 tejbeer 1696
 
31762 tejbeer 1697
        } else {
1698
            sr = getSecondaryModel(brand, curDate, curDate.plusDays(1));
1699
        }
27738 tejbeer 1700
 
32438 amit.gupta 1701
        Map<BrandRegionModel, Map<LocalDate, SecondaryWarehouseWiseOrderBilllingModel>> brandWarehouseOrderMap = sr.getSecondaryModel().stream().collect(Collectors.groupingBy(x -> new BrandRegionModel(x.getWarehouseId(), x.getBrand()),
1702
                Collectors.collectingAndThen(Collectors.toList(), x -> x.stream().collect(Collectors.toMap(y -> y.getBillingTimestamp(), y -> y)))));
27738 tejbeer 1703
 
31762 tejbeer 1704
        Map<LocalDate, Integer> dateWiseTotal = sr.getSecondaryModel().stream().collect(
1705
                Collectors.groupingBy(x -> x.getBillingTimestamp(), Collectors.summingInt(x -> (int) x.getValue())));
27893 tejbeer 1706
 
31762 tejbeer 1707
        Map<LocalDate, Integer> dateWiseQtyTotal = sr.getSecondaryModel().stream().collect(
1708
                Collectors.groupingBy(x -> x.getBillingTimestamp(), Collectors.summingInt(x -> (int) x.getQty())));
27893 tejbeer 1709
 
31762 tejbeer 1710
        LOGGER.info("dateWiseTotal" + dateWiseTotal);
27893 tejbeer 1711
 
31762 tejbeer 1712
        brandWarehouseOrderMap.entrySet().stream().forEach(x -> {
1713
            x.getKey().setTotal(x.getValue().entrySet().stream().collect(Collectors.summingInt(y -> (int) y.getValue().getValue())));
1714
        });
27867 tejbeer 1715
 
31762 tejbeer 1716
        brandWarehouseOrderMap.entrySet().stream().forEach(x -> {
1717
            x.getKey().setQty(
1718
                    x.getValue().entrySet().stream().collect(Collectors.summingInt(y -> (int) y.getValue().getQty())));
1719
        });
1720
        LOGGER.info("brandWarehouseOrderMap" + brandWarehouseOrderMap);
27867 tejbeer 1721
 
31762 tejbeer 1722
        model.addAttribute("brandWarehouseOrderMap", brandWarehouseOrderMap);
1723
        model.addAttribute("dateWiseTotal", dateWiseTotal);
1724
        model.addAttribute("dateWiseQtyTotal", dateWiseQtyTotal);
1725
        model.addAttribute("dateRange", sr.getDateRange());
1726
        model.addAttribute("warehouseMap", warehouseMap);
1727
        return "secondary-warehouse-billing-order";
27867 tejbeer 1728
 
31762 tejbeer 1729
    }
27867 tejbeer 1730
 
31762 tejbeer 1731
    public SecondaeryOrderDateRange getSecondaryModel(String brand, LocalDateTime startDate, LocalDateTime endDate) {
27867 tejbeer 1732
 
31762 tejbeer 1733
        SecondaeryOrderDateRange sr = new SecondaeryOrderDateRange();
1734
        List<SecondaryWarehouseWiseOrderBilllingModel> secondaryOrderbilling = orderRepository.selectAllBilledOrderGroupByBrandWarehouse(brand, startDate, endDate).stream().sorted(Comparator.comparing(SecondaryWarehouseWiseOrderBilllingModel::getBillingTimestamp)).collect(Collectors.toList());
1735
        long noOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate);
27867 tejbeer 1736
 
31762 tejbeer 1737
        List<LocalDate> dateRange = Stream.iterate(startDate.toLocalDate(), date -> date.plusDays(1)).limit(noOfDaysBetween).collect(Collectors.toList());
27867 tejbeer 1738
 
31762 tejbeer 1739
        sr.setDateRange(dateRange);
1740
        sr.setSecondaryModel(secondaryOrderbilling);
27867 tejbeer 1741
 
31762 tejbeer 1742
        return sr;
27867 tejbeer 1743
 
31762 tejbeer 1744
    }
27867 tejbeer 1745
 
31762 tejbeer 1746
    @RequestMapping(value = "/getSecondaryBillingItemByBrand", method = RequestMethod.GET)
1747
    public String getSecondaryBillingItemByBrand(HttpServletRequest request, @RequestParam(name = "warehouseId", required = true, defaultValue = "0") int warehouseId, @RequestParam(name = "brand", required = true, defaultValue = "") String brand, @RequestParam List<LocalDate> date, Model model) throws Exception {
27867 tejbeer 1748
 
37285 ranu 1749
        // Band-aid for URL '+' decode issue on brand names (e.g. "Ai+"):
1750
        // if the incoming brand isn't found in catalog.brand but "<brand>+" is,
1751
        // switch to the plus variant. Zero regression for the other brands.
1752
        if (brand != null && !brand.trim().isEmpty()) {
1753
            String probe = brand.replaceAll("\\s+$", "");
1754
            try {
1755
                if (brandsRepository.selectByBrand(brand) == null
1756
                        && (probe.equals(brand) || brandsRepository.selectByBrand(probe) == null)) {
1757
                    String withPlus = probe + "+";
1758
                    if (brandsRepository.selectByBrand(withPlus) != null) {
1759
                        LOGGER.info("getSecondaryBillingItemByBrand brand fallback: '{}' -> '{}'", brand, withPlus);
1760
                        brand = withPlus;
1761
                    }
1762
                }
1763
            } catch (Exception e) {
1764
                LOGGER.warn("getSecondaryBillingItemByBrand brand fallback failed for '{}': {}", brand, e.getMessage());
1765
            }
1766
        }
1767
 
31762 tejbeer 1768
        List<SecondaryOrderItemBillingModel> orderItemBilling = orderRepository.selectAllBilledOrderItemByBrand(warehouseId, brand, date);
27867 tejbeer 1769
 
31762 tejbeer 1770
        LOGGER.info("orderItemBilling" + orderItemBilling);
1771
        model.addAttribute("billedItem", orderItemBilling);
1772
        model.addAttribute("date", date);
1773
        model.addAttribute("brand", brand);
1774
        return "inventory-listing-billing-item";
27738 tejbeer 1775
 
31762 tejbeer 1776
    }
27738 tejbeer 1777
 
31762 tejbeer 1778
    @RequestMapping(value = "/getPartnerTertiaryItemByBrand", method = RequestMethod.GET)
1779
    public String getPartnerTertiaryItemByBrand(HttpServletRequest request, @RequestParam(name = "warehouseIds", required = true, defaultValue = "0") List<Integer> warehouseIds, @RequestParam(name = "brand", required = true, defaultValue = "") List<String> brand, int timeValue, Model model) throws Exception {
1780
        model.addAttribute("warehouseId", warehouseIds);
1781
        LOGGER.info("warehouseIds" + warehouseIds);
27738 tejbeer 1782
 
37846 amit 1783
        Map<Integer, String> warehouseMap = billingWarehouseService.getActiveWarehouses();
31762 tejbeer 1784
        if (warehouseIds.contains(0)) {
1785
            warehouseIds.addAll(warehouseMap.keySet());
1786
        }
37193 ranu 1787
        // Band-aid for URL '+' decode issue on brand names (e.g. "Ai+"):
1788
        // if a brand doesn't exist in catalog.brand as-is but "<brand>+" does,
1789
        // switch to the plus variant. Zero regression for the other brands.
1790
        brand = brand.stream().map(b -> {
1791
            if (b == null || b.trim().isEmpty()) return b;
1792
            String probe = b.replaceAll("\\s+$", "");
1793
            try {
1794
                if (brandsRepository.selectByBrand(b) == null
1795
                        && (probe.equals(b) || brandsRepository.selectByBrand(probe) == null)) {
1796
                    String withPlus = probe + "+";
1797
                    if (brandsRepository.selectByBrand(withPlus) != null) {
1798
                        LOGGER.info("getPartnerTertiaryItemByBrand brand fallback: '{}' -> '{}'", b, withPlus);
1799
                        return withPlus;
1800
                    }
1801
                }
1802
            } catch (Exception e) {
1803
                LOGGER.warn("getPartnerTertiaryItemByBrand brand fallback failed for '{}': {}", b, e.getMessage());
1804
            }
1805
            return b;
1806
        }).collect(Collectors.toList());
31762 tejbeer 1807
        LocalDateTime curDate = LocalDate.now().atStartOfDay();
1808
        int dayOfMonth = curDate.getDayOfMonth();
1809
        LocalDateTime startOfMonth = curDate.withDayOfMonth(1);
1810
        int lengthOfMonth = YearMonth.from(startOfMonth.minusMonths(1)).lengthOfMonth();
1811
        if (brand.contains("Total Values")) {
1812
            List<String> tertiaryBrands = fofoOrderRepository.selectGroupByBrandPartnerTertiary(warehouseIds).stream().map(x -> x.getBrand()).collect(Collectors.toList());
27738 tejbeer 1813
 
31762 tejbeer 1814
            brand.addAll(tertiaryBrands);
1815
        }
1816
        List<BrandItemWiseTertiaryModel> tertiaryItem = null;
1817
        if (timeValue != 0) {
1818
            if (timeValue == 1) {
27749 tejbeer 1819
 
31762 tejbeer 1820
                tertiaryItem = fofoOrderRepository.selectItemPartnerTertiaryByBrand(warehouseIds, brand, curDate.withDayOfMonth(1), curDate.plusDays(1));
27738 tejbeer 1821
 
31762 tejbeer 1822
            } else if (timeValue == 2) {
1823
                LOGGER.info("curDate" + startOfMonth.minusMonths(1));
1824
                LOGGER.info("curDate" + startOfMonth.minusMonths(1).plusDays(Math.min(dayOfMonth, lengthOfMonth)));
27738 tejbeer 1825
 
31762 tejbeer 1826
                tertiaryItem = fofoOrderRepository.selectItemPartnerTertiaryByBrand(warehouseIds, brand, startOfMonth.minusMonths(1), startOfMonth.minusMonths(1).plusDays(Math.min(dayOfMonth, lengthOfMonth)));
27738 tejbeer 1827
 
31762 tejbeer 1828
            } else if (timeValue == -1) {
1829
                LOGGER.info("date" + curDate.minusMonths(1).withDayOfMonth(1));
1830
                LOGGER.info("date" + curDate.minusMonths(1).withDayOfMonth(lengthOfMonth).plusDays(1));
27749 tejbeer 1831
 
31762 tejbeer 1832
                tertiaryItem = fofoOrderRepository.selectItemPartnerTertiaryByBrand(warehouseIds, brand, curDate.minusMonths(1).withDayOfMonth(1), startOfMonth);
1833
            } else {
1834
                tertiaryItem = fofoOrderRepository.selectItemPartnerTertiaryByBrand(warehouseIds, brand, curDate.minusDays(timeValue), curDate);
1835
            }
27738 tejbeer 1836
 
31762 tejbeer 1837
        } else {
1838
            tertiaryItem = fofoOrderRepository.selectTodayItemPartnerTertiaryByBrand(warehouseIds, brand, curDate);
1839
        }
1840
        LOGGER.info("tertiaryItem" + tertiaryItem);
27738 tejbeer 1841
 
31762 tejbeer 1842
        model.addAttribute("tertiaryItem", tertiaryItem);
27738 tejbeer 1843
 
31762 tejbeer 1844
        return "inventory-item-tertiary-item";
27738 tejbeer 1845
 
31762 tejbeer 1846
    }
28701 tejbeer 1847
 
31762 tejbeer 1848
    @RequestMapping(value = "/planogram")
1849
    public String Planogram(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
1850
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1851
        String email = loginDetails.getEmailId();
1852
        AuthUser authUser = authRepository.selectByEmailOrMobile(email);
1853
        List<FocusedModelByPassRequest> byPassRequest = null;
1854
        Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
28701 tejbeer 1855
 
31762 tejbeer 1856
        Set<Integer> authfofoIds = null;
28701 tejbeer 1857
 
31762 tejbeer 1858
        List<Position> positions = positionRepository.selectPositionByAuthId(authUser.getId());
28701 tejbeer 1859
 
31762 tejbeer 1860
        if (emails.contains(authUser.getEmailId())) {
1861
            authfofoIds = storeGuyMap.get("tarun.verma@smartdukaan.com");
1862
            LOGGER.info("fofoIds" + authfofoIds);
1863
        } else {
28701 tejbeer 1864
 
31762 tejbeer 1865
            for (Position ps : positions) {
1866
                if (esclationType.contains(ps.getEscalationType())) {
1867
                    authfofoIds = storeGuyMap.get(email);
1868
                    break;
1869
                }
28701 tejbeer 1870
 
31762 tejbeer 1871
            }
1872
        }
1873
        if (authfofoIds != null) {
1874
            byPassRequest = focusedModelByPassRepository.selectByStatusAndFofoIds(new ArrayList<>(authfofoIds), ByPassRequestStatus.PENDING);
1875
        }
1876
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
1877
        model.addAttribute("customRetailerMap", customRetailerMap);
1878
        model.addAttribute("byPassRequest", byPassRequest);
1879
        return "planogram";
1880
    }
28701 tejbeer 1881
 
31762 tejbeer 1882
    @RequestMapping(value = "/byPassRequestAction", method = RequestMethod.PUT)
1883
    public String addAmountToWalletRequestRejected(HttpServletRequest request, @RequestParam(name = "id", defaultValue = "0") int id, @RequestParam ByPassRequestStatus status, @RequestParam(name = "reason", required = false) String reason, Model model) throws Exception {
28701 tejbeer 1884
 
31762 tejbeer 1885
        FocusedModelByPassRequest byPassRequest = focusedModelByPassRepository.selectById(id);
1886
        if (status.equals(ByPassRequestStatus.APPROVED)) {
1887
            byPassRequest.setByPass(true);
1888
            byPassRequest.setStatus(ByPassRequestStatus.APPROVED);
1889
            byPassRequest.setUpdatedTimestamp(LocalDateTime.now());
1890
            byPassRequest.setReason(reason);
1891
        } else if (status.equals(ByPassRequestStatus.REJECTED)) {
1892
            byPassRequest.setByPass(false);
1893
            byPassRequest.setStatus(ByPassRequestStatus.REJECTED);
1894
            byPassRequest.setUpdatedTimestamp(LocalDateTime.now());
1895
            byPassRequest.setReason(reason);
1896
        }
28701 tejbeer 1897
 
31762 tejbeer 1898
        com.spice.profitmandi.dao.entity.user.User user = userUserRepository.selectById(byPassRequest.getFofoId());
30989 tejbeer 1899
 
31762 tejbeer 1900
        Address address = addressRepository.selectById(user.getAddressId());
30989 tejbeer 1901
 
31762 tejbeer 1902
        String title = "Billing Request";
30989 tejbeer 1903
 
31762 tejbeer 1904
        String message = String.format("Your Billing  Request is " + status + ". Please ensure to order the missing focus models as soon as possible.");
30989 tejbeer 1905
 
31762 tejbeer 1906
        SendNotificationModel sendNotificationModel = new SendNotificationModel();
1907
        sendNotificationModel.setCampaignName("Billing Request");
1908
        sendNotificationModel.setTitle(title);
1909
        sendNotificationModel.setMessage(message);
1910
        sendNotificationModel.setType("url");
1911
        sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
1912
        sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
1913
        sendNotificationModel.setMessageType(MessageType.notification);
1914
        sendNotificationModel.setUserIds(Arrays.asList(userAccountRepository.selectUserIdByRetailerId(byPassRequest.getFofoId())));
28701 tejbeer 1915
 
31762 tejbeer 1916
        notificationService.sendNotification(sendNotificationModel);
32778 amit.gupta 1917
        //TODO-Whatsapp
1918
        //notificationService.sendWhatsappMessage(message, title, address.getPhoneNumber());
28701 tejbeer 1919
 
31762 tejbeer 1920
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1921
        return "response";
1922
    }
28701 tejbeer 1923
 
31762 tejbeer 1924
    @RequestMapping(value = "/highDemandItem", method = RequestMethod.GET)
1925
    public String highDemandItem(HttpServletRequest request, Model model) throws Exception {
1926
        List<HighDemandItem> hdis = highDemandItemsRepository.selectAll();
1927
        if (!hdis.isEmpty()) {
1928
            Map<Integer, Item> itemMap = this.getItemByCatalogId(hdis);
1929
            model.addAttribute("itemMap", itemMap);
1930
        }
28754 tejbeer 1931
 
31762 tejbeer 1932
        model.addAttribute("hdis", hdis);
28754 tejbeer 1933
 
31762 tejbeer 1934
        return "high_demand_item";
1935
    }
28754 tejbeer 1936
 
31762 tejbeer 1937
    private Map<Integer, Item> getItemByCatalogId(List<HighDemandItem> hdis) {
1938
        Map<Integer, Item> itemMap = new HashMap<>();
1939
        for (HighDemandItem hdi : hdis) {
1940
            List<Item> items = itemRepository.selectAllByCatalogItemId(hdi.getCatalogId());
1941
            itemMap.put(items.get(0).getCatalogItemId(), items.get(0));
1942
        }
28754 tejbeer 1943
 
31762 tejbeer 1944
        return itemMap;
1945
    }
28754 tejbeer 1946
 
31762 tejbeer 1947
    @RequestMapping(value = "/addHighDemandItem", method = RequestMethod.POST)
1948
    public String addHighDemandItem(HttpServletRequest request, @RequestParam int catalogId, @RequestParam int qty, Model model) throws Exception {
1949
        HighDemandItem hdi = highDemandItemsRepository.selectByFofoIdAndCatalogId(catalogId);
28754 tejbeer 1950
 
31762 tejbeer 1951
        if (hdi == null) {
1952
            hdi = new HighDemandItem();
1953
            hdi.setCatalogId(catalogId);
1954
            hdi.setQty(qty);
1955
            hdi.setCreateTimestamp(LocalDateTime.now());
1956
            hdi.setUpdateTimestamp(LocalDateTime.now());
1957
            highDemandItemsRepository.persist(hdi);
1958
        }
28754 tejbeer 1959
 
31762 tejbeer 1960
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1961
        return "response";
1962
    }
28754 tejbeer 1963
 
31762 tejbeer 1964
    @RequestMapping(value = "/removeHighDemandItem", method = RequestMethod.DELETE)
1965
    public String removeHighDemandItem(HttpServletRequest request, @RequestParam(name = "id", defaultValue = "0") int id, Model model) throws Exception {
1966
        highDemandItemsRepository.deleteById(id);
1967
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1968
        return "response";
1969
    }
28754 tejbeer 1970
 
31762 tejbeer 1971
    @GetMapping(value = "/imei")
1972
    public String getImei(HttpServletRequest request, Model model, @RequestParam int fofoId, @RequestParam String query) throws Exception {
28795 tejbeer 1973
 
31762 tejbeer 1974
        List<String> serialNumber = inventoryItemRepository.selectAllByFofoId(fofoId, query).stream().map(x -> x.getSerialNumber()).collect(Collectors.toList());
1975
        LOGGER.info("serialNumber" + serialNumber);
1976
        LOGGER.info("query" + query);
28795 tejbeer 1977
 
31762 tejbeer 1978
        model.addAttribute("response1", mvcResponseSender.createResponseString(serialNumber));
28795 tejbeer 1979
 
31762 tejbeer 1980
        return "response";
1981
    }
28795 tejbeer 1982
 
31762 tejbeer 1983
    @GetMapping(value = "/allimei")
1984
    public String getAllImei(HttpServletRequest request, Model model, @RequestParam String query) throws Exception {
30039 tejbeer 1985
 
31762 tejbeer 1986
        List<String> serialNumber = inventoryItemRepository.selectAll(query).stream().map(x -> x.getSerialNumber()).collect(Collectors.toList());
1987
        LOGGER.info("serialNumber" + serialNumber);
1988
        LOGGER.info("query" + query);
30039 tejbeer 1989
 
31762 tejbeer 1990
        model.addAttribute("response1", mvcResponseSender.createResponseString(serialNumber));
30244 tejbeer 1991
 
31762 tejbeer 1992
        return "response";
1993
    }
30039 tejbeer 1994
 
31762 tejbeer 1995
    @Autowired
1996
    private ObjectMapper objectMapper;
30039 tejbeer 1997
 
31762 tejbeer 1998
    @RequestMapping(value = "/imei/validate", method = RequestMethod.GET)
1999
    public String validateImei(HttpServletRequest request, @RequestParam String imei, Model model) throws Exception {
2000
        boolean isImei = false;
30039 tejbeer 2001
 
31762 tejbeer 2002
        try {
2003
            InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumber(imei);
30683 tejbeer 2004
 
31762 tejbeer 2005
            isImei = true;
30683 tejbeer 2006
 
31762 tejbeer 2007
        } catch (Exception e) {
2008
            isImei = false;
2009
        }
30683 tejbeer 2010
 
31762 tejbeer 2011
        model.addAttribute("response1", objectMapper.writeValueAsString(isImei));
2012
        return "response";
2013
    }
30683 tejbeer 2014
 
32402 tejbeer 2015
    @Autowired
2016
    RestClient restClient;
2017
 
2018
 
2019
    @Autowired
2020
    private CustomerRepository customerRepository;
2021
 
2022
 
36563 amit 2023
    @Autowired
2024
    private com.spice.profitmandi.dao.repository.catalog.ModelFlagshipRepository modelFlagshipRepository;
2025
 
37056 amit 2026
    @Autowired
2027
    private com.spice.profitmandi.dao.event.TagListingEventPublisher tagListingEventPublisher;
2028
 
36563 amit 2029
    @RequestMapping(value = "/manageFlagship", method = RequestMethod.GET)
2030
    public String manageFlagship(HttpServletRequest request, Model model) throws Exception {
2031
        List<com.spice.profitmandi.dao.entity.catalog.ModelFlagship> flagshipModels = modelFlagshipRepository.selectAll();
2032
        if (!flagshipModels.isEmpty()) {
2033
            List<Integer> catalogIds = flagshipModels.stream()
2034
                    .map(com.spice.profitmandi.dao.entity.catalog.ModelFlagship::getCatalogItemId)
2035
                    .distinct().collect(Collectors.toList());
2036
            try {
2037
                Map<Integer, String> descMap = catalogRepository.selectAllByIds(catalogIds).stream()
2038
                        .collect(Collectors.toMap(Catalog::getId, Catalog::getDescription, (a, b) -> a));
2039
                for (com.spice.profitmandi.dao.entity.catalog.ModelFlagship fm : flagshipModels) {
2040
                    fm.setCatalogDescription(descMap.getOrDefault(fm.getCatalogItemId(), "Unknown"));
2041
                }
2042
            } catch (Exception e) {
2043
                LOGGER.error("Error fetching catalog descriptions for flagship models", e);
2044
            }
2045
        }
2046
        model.addAttribute("flagshipModels", flagshipModels);
2047
        return "manage-flagship";
2048
    }
2049
 
2050
    @RequestMapping(value = "/addFlagship", method = RequestMethod.POST)
2051
    public String addFlagship(HttpServletRequest request, @RequestParam int catalogItemId,
2052
                              @RequestParam String startDate, @RequestParam(required = false) String endDate,
2053
                              Model model) throws Exception {
2054
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
2055
        com.spice.profitmandi.dao.entity.catalog.ModelFlagship fm = new com.spice.profitmandi.dao.entity.catalog.ModelFlagship();
2056
        fm.setCatalogItemId(catalogItemId);
2057
        fm.setStartDate(java.time.LocalDate.parse(startDate));
2058
        if (endDate != null && !endDate.isEmpty()) {
2059
            fm.setEndDate(java.time.LocalDate.parse(endDate));
2060
        }
2061
        fm.setCreatedOn(java.time.LocalDateTime.now());
2062
        fm.setCreatedBy(loginDetails.getEmailId());
2063
        modelFlagshipRepository.persist(fm);
37056 amit 2064
        tagListingEventPublisher.publishFlagshipChange(catalogItemId);
36563 amit 2065
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
2066
        return "response";
2067
    }
2068
 
2069
    @RequestMapping(value = "/flagship/remove", method = RequestMethod.POST)
2070
    public String removeFlagship(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
2071
        com.spice.profitmandi.dao.entity.catalog.ModelFlagship fm = modelFlagshipRepository.selectById(id);
2072
        if (fm != null) {
37056 amit 2073
            int catalogItemId = fm.getCatalogItemId();
36563 amit 2074
            modelFlagshipRepository.delete(fm);
37056 amit 2075
            tagListingEventPublisher.publishFlagshipChange(catalogItemId);
36563 amit 2076
        }
2077
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
2078
        return "response";
2079
    }
2080
 
36598 amit 2081
    @RequestMapping(value = "/catalogItem", method = RequestMethod.GET)
2082
    public String getCatalogItemSearch(HttpServletRequest request, Model model,
2083
                                       @RequestParam String query,
2084
                                       @RequestParam(required = false, defaultValue = "0") float minPrice) throws Throwable {
2085
        String query1 = query.toLowerCase();
2086
        List<Catalog> allCatalogs = catalogRepository.selectAll();
2087
        List<Catalog> matchingCatalogs = allCatalogs.stream()
2088
                .filter(c -> c.getDescription().toLowerCase().contains(query1))
2089
                .collect(Collectors.toList());
2090
 
2091
        if (minPrice > 0 && !matchingCatalogs.isEmpty()) {
2092
            List<Integer> catalogIds = matchingCatalogs.stream()
2093
                    .map(Catalog::getId).collect(Collectors.toList());
2094
            Map<Integer, TagListing> tagMap = tagListingRepository.selectAllByCatalogIds(catalogIds);
2095
            matchingCatalogs = matchingCatalogs.stream()
2096
                    .filter(c -> {
2097
                        TagListing tl = tagMap.get(c.getId());
2098
                        return tl != null && tl.getSellingPrice() >= minPrice;
2099
                    })
2100
                    .collect(Collectors.toList());
2101
        }
2102
 
2103
        List<ItemDescriptionModel> result = matchingCatalogs.stream().map(c -> {
2104
            ItemDescriptionModel m = new ItemDescriptionModel();
2105
            m.setCatalogId(c.getId());
2106
            m.setItemDescription(c.getDescription() + " (" + c.getId() + ")");
2107
            return m;
2108
        }).collect(Collectors.toList());
2109
 
2110
        model.addAttribute("response1", mvcResponseSender.createResponseString(result));
2111
        return "response";
2112
    }
2113
 
31762 tejbeer 2114
    @RequestMapping(value = "/createCombo", method = RequestMethod.GET)
2115
    public String createCombo(HttpServletRequest request, Model model) throws Exception {
30683 tejbeer 2116
 
37846 amit 2117
        Map<Integer, String> warehouseMap = billingWarehouseService.getOperationalWarehouses();
30683 tejbeer 2118
 
32402 tejbeer 2119
 
31762 tejbeer 2120
        List<ComboModel> comboModels = comboModelRepository.selectAll();
30683 tejbeer 2121
 
31762 tejbeer 2122
        model.addAttribute("warehouseMap", warehouseMap);
2123
        model.addAttribute("comboModels", comboModels);
2124
        return "create-combo";
2125
    }
30683 tejbeer 2126
 
31762 tejbeer 2127
    @RequestMapping(value = "/addCombo", method = RequestMethod.POST)
2128
    public String addCombo(HttpServletRequest request, @RequestBody Combo combo, Model model) throws Exception {
32339 tejbeer 2129
        List<Integer> warehouseIds = new ArrayList<Integer>();
30683 tejbeer 2130
 
2131
 
32339 tejbeer 2132
        if (combo.getWarehouseId().isEmpty()) {
37846 amit 2133
            Map<Integer, String> warehouseMap = billingWarehouseService.getOperationalWarehouses();
32339 tejbeer 2134
 
2135
            warehouseIds.addAll(warehouseMap.entrySet().stream().map(x -> x.getKey()).collect(Collectors.toList()));
2136
 
2137
        } else {
2138
            warehouseIds.addAll(combo.getWarehouseId());
2139
        }
2140
        for (Integer warehouseId : warehouseIds) {
2141
 
31762 tejbeer 2142
            ComboModel comboModel = comboModelRepository.selectByCatalogIdWarehouseIdAndQty(combo.getCatalogId(), warehouseId, combo.getQty());
2143
            if (comboModel != null) {
32339 tejbeer 2144
 
2145
                List<Integer> comboOptions = comboOptionRepository.selectByComboId(comboModel.getId()).stream().map(x -> x.getId()).collect(Collectors.toList());
2146
                for (Integer comboOption : comboOptions) {
2147
                    comboMappedModelRepository.deleteByEquals(comboOption);
31762 tejbeer 2148
                }
30683 tejbeer 2149
 
32339 tejbeer 2150
                comboOptionRepository.deleteByEquals(comboModel.getId());
2151
 
2152
 
31762 tejbeer 2153
                comboModelRepository.delete(comboModel);
2154
            }
32339 tejbeer 2155
 
31762 tejbeer 2156
            ComboModel cm = new ComboModel();
2157
            cm.setCatalogId(combo.getCatalogId());
2158
            cm.setQty(combo.getQty());
2159
            cm.setWarehouseId(warehouseId);
2160
            comboModelRepository.persist(cm);
30683 tejbeer 2161
 
31762 tejbeer 2162
            LOGGER.info("cm" + cm);
32339 tejbeer 2163
            for (ComboOptionModel comboOptionModel : combo.getComboOptionModel()) {
2164
                ComboOption comboOption = new ComboOption();
2165
                comboOption.setComboId(cm.getId());
2166
                comboOptionRepository.persist(comboOption);
2167
                for (MappedComboModel mappedComboModel : comboOptionModel.getMappedComboModel()) {
2168
                    ComboMappedModel cmm = new ComboMappedModel();
2169
                    cmm.setComboCatalogId(mappedComboModel.getCatalogId());
2170
                    cmm.setComboQty(mappedComboModel.getQty());
2171
                    cmm.setComboOptionId(comboOption.getId());
2172
                    comboMappedModelRepository.persist(cmm);
30683 tejbeer 2173
 
32339 tejbeer 2174
                }
30683 tejbeer 2175
 
31762 tejbeer 2176
            }
30683 tejbeer 2177
 
31762 tejbeer 2178
        }
2179
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
30683 tejbeer 2180
 
31762 tejbeer 2181
        return "response";
2182
 
2183
    }
2184
 
2185
    @RequestMapping(value = "/combo/remove", method = RequestMethod.POST)
2186
    public String removeCombo(HttpServletRequest request, @RequestParam int id, Model model) throws Exception {
32339 tejbeer 2187
 
2188
        List<Integer> comboOptions = comboOptionRepository.selectByComboId(id).stream().map(x -> x.getId()).collect(Collectors.toList());
2189
        for (Integer comboOption : comboOptions) {
2190
            comboMappedModelRepository.deleteByEquals(comboOption);
2191
        }
2192
 
2193
        comboOptionRepository.deleteByEquals(id);
31762 tejbeer 2194
        comboModelRepository.deleteById(id);
2195
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
2196
 
2197
        return "response";
2198
 
2199
    }
32075 tejbeer 2200
 
2201
 
27867 tejbeer 2202
}