Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
27877 amit.gupta 1
package com.spice.profitmandi.service.offers;
2
 
29783 amit.gupta 3
import com.google.common.collect.Lists;
27877 amit.gupta 4
import com.google.gson.Gson;
5
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
29683 amit.gupta 6
import com.spice.profitmandi.common.model.PartnerTargetModel;
7
import com.spice.profitmandi.common.model.ProfitMandiConstants;
31920 amit.gupta 8
import com.spice.profitmandi.common.util.Utils;
27877 amit.gupta 9
import com.spice.profitmandi.dao.entity.catalog.ItemCriteria;
10
import com.spice.profitmandi.dao.entity.catalog.Offer;
29783 amit.gupta 11
import com.spice.profitmandi.dao.entity.catalog.TagListing;
31903 amit.gupta 12
import com.spice.profitmandi.dao.entity.catalog.TargetSlabEntity;
31920 amit.gupta 13
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
14
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
31205 amit.gupta 15
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
16
import com.spice.profitmandi.dao.entity.fofo.OfferPayout;
31920 amit.gupta 17
import com.spice.profitmandi.dao.entity.transaction.LineItem;
18
import com.spice.profitmandi.dao.entity.transaction.Order;
31747 amit.gupta 19
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
31920 amit.gupta 20
import com.spice.profitmandi.dao.entity.warehouse.WarehouseInventoryItem;
21
import com.spice.profitmandi.dao.entity.warehouse.WarehouseScan;
22
import com.spice.profitmandi.dao.enumuration.catalog.AchievementType;
29783 amit.gupta 23
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
29499 amit.gupta 24
import com.spice.profitmandi.dao.enumuration.catalog.OfferSchemeType;
31205 amit.gupta 25
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
31903 amit.gupta 26
import com.spice.profitmandi.dao.model.AmountModel;
27877 amit.gupta 27
import com.spice.profitmandi.dao.model.CreateOfferRequest;
28
import com.spice.profitmandi.dao.model.ItemCriteriaPayout;
31920 amit.gupta 29
import com.spice.profitmandi.dao.model.OfferRowModel;
30066 amit.gupta 30
import com.spice.profitmandi.dao.repository.catalog.*;
31920 amit.gupta 31
import com.spice.profitmandi.dao.repository.fofo.ActivatedImeiRepository;
32
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
31205 amit.gupta 33
import com.spice.profitmandi.dao.repository.fofo.OfferPayoutRepository;
31920 amit.gupta 34
import com.spice.profitmandi.dao.repository.transaction.LineItemImeisRepository;
35
import com.spice.profitmandi.dao.repository.warehouse.WarehouseInventoryItemRepository;
36
import com.spice.profitmandi.dao.repository.warehouse.WarehouseScanRepository;
37
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
38
import com.spice.profitmandi.service.scheme.InventoryPayoutModel;
27877 amit.gupta 39
import com.spice.profitmandi.service.user.RetailerService;
31205 amit.gupta 40
import com.spice.profitmandi.service.wallet.WalletService;
41
import in.shop2020.model.v1.order.WalletReferenceType;
30066 amit.gupta 42
import org.apache.logging.log4j.LogManager;
43
import org.apache.logging.log4j.Logger;
44
import org.apache.poi.ss.usermodel.Cell;
45
import org.apache.poi.ss.usermodel.CellType;
46
import org.apache.poi.ss.usermodel.Row;
47
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
48
import org.apache.poi.xssf.usermodel.XSSFRow;
49
import org.apache.poi.xssf.usermodel.XSSFSheet;
50
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
51
import org.springframework.beans.factory.annotation.Autowired;
52
import org.springframework.cache.CacheManager;
53
import org.springframework.cache.annotation.Cacheable;
54
import org.springframework.stereotype.Component;
27877 amit.gupta 55
 
30066 amit.gupta 56
import java.io.IOException;
57
import java.io.InputStream;
58
import java.time.LocalDate;
31205 amit.gupta 59
import java.time.LocalDateTime;
32868 amit.gupta 60
import java.time.Year;
30066 amit.gupta 61
import java.time.YearMonth;
62
import java.util.*;
63
import java.util.stream.Collectors;
64
 
27877 amit.gupta 65
@Component
66
public class OfferServiceImpl implements OfferService {
67
 
31747 amit.gupta 68
    private static final List<String> targets = Arrays.asList("Target 1", "Target 2", "Target 3", "Target 4",
69
            "Target 5");
29499 amit.gupta 70
 
31747 amit.gupta 71
    @Autowired
72
    private Gson gson;
27877 amit.gupta 73
 
31747 amit.gupta 74
    @Autowired
75
    private OfferRepository offerRepository;
27877 amit.gupta 76
 
31747 amit.gupta 77
    @Autowired
78
    private RetailerService retailerService;
31920 amit.gupta 79
    @Autowired
80
    PriceCircularService priceCircularService;
27877 amit.gupta 81
 
31747 amit.gupta 82
    @Autowired
83
    OfferPayoutRepository offerPayoutRepository;
31205 amit.gupta 84
 
31747 amit.gupta 85
    @Autowired
86
    private ItemCriteriaRepository itemCriteriaRepository;
27877 amit.gupta 87
 
31747 amit.gupta 88
    @Autowired
89
    private ItemRepository itemRepository;
27877 amit.gupta 90
 
31747 amit.gupta 91
    @Autowired
92
    private TagListingRepository tagListingRepository;
29783 amit.gupta 93
 
31747 amit.gupta 94
    @Autowired
95
    private OfferTargetSlabRepository offerTargetSlabRepository;
30684 amit.gupta 96
 
31747 amit.gupta 97
    @Autowired
32868 amit.gupta 98
    CacheManager oneDayCacheManager;
27877 amit.gupta 99
 
29806 amit.gupta 100
 
31747 amit.gupta 101
    private static final Logger LOGGER = LogManager.getLogger(OfferServiceImpl.class);
27877 amit.gupta 102
 
31920 amit.gupta 103
    @Autowired
104
    private ActivatedImeiRepository activatedImeiRepository;
105
    @Autowired
106
    private WarehouseScanRepository warehouseScanRepository;
107
 
108
    @Autowired
109
    private WarehouseInventoryItemRepository warehouseInventoryItemRepository;
110
 
111
    @Autowired
112
    private LineItemImeisRepository lineItemImeisRepository;
113
    @Autowired
114
    private InventoryItemRepository inventoryItemRepository;
115
 
31747 amit.gupta 116
    @Override
117
    public void addOfferService(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
118
        LOGGER.info("createOfferRequest  -- {}", createOfferRequest);
119
        this.createOffer(createOfferRequest);
120
        this.createTargetSlabs(createOfferRequest);
121
    }
27877 amit.gupta 122
 
31747 amit.gupta 123
    private void createOffer(CreateOfferRequest createOfferRequest) {
124
        Offer offer = new Offer();
125
        offer.setName(createOfferRequest.getName());
126
        offer.setTargetType(createOfferRequest.getTargetType());
127
        offer.setBooster(createOfferRequest.isBooster());
128
        offer.setPayoutType(createOfferRequest.getPayoutType());
129
        offer.setSchemeType(createOfferRequest.getSchemeType());
130
        offer.setBaseCriteia(createOfferRequest.isBaseCriteria());
131
        offer.setEndDate(createOfferRequest.getEndDate());
132
        offer.setStartDate(createOfferRequest.getStartDate());
133
        offer.setBrandSharePercentage(createOfferRequest.getBrandShareTerms());
134
        offer.setSellinPercentage(createOfferRequest.getSellinPercentage());
135
        offer.setOfferNotes(createOfferRequest.getOfferNotes());
136
        offer.setActivationBrands(createOfferRequest.getActivationBrands());
137
        offer.setTerms(createOfferRequest.getTerms());
138
        offer.setItemCriteria(gson.toJson(createOfferRequest.getItemCriteria()));
139
        offer.setPartnerCriteria(gson.toJson(createOfferRequest.getPartnerCriteria()));
32070 amit.gupta 140
        offer.setDiscount(createOfferRequest.isDiscount());
31747 amit.gupta 141
        offerRepository.persist(offer);
142
        createOfferRequest.setId(offer.getId());
143
    }
27877 amit.gupta 144
 
31747 amit.gupta 145
    @Override
146
    public List<CreateOfferRequest> getPublishedOffers(int fofoId, YearMonth yearMonth) {
147
        List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(yearMonth).get(fofoId);
148
        List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
149
        if (publishedOffers != null) {
150
            for (Offer offer : publishedOffers) {
151
                CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
152
                createOfferRequests.add(createOfferRequest);
153
                setCriteriaPayoutAchieved(fofoId, createOfferRequest);
27877 amit.gupta 154
 
31747 amit.gupta 155
            }
156
        }
157
        return createOfferRequests;
158
    }
27877 amit.gupta 159
 
31747 amit.gupta 160
    private void setCriteriaPayoutAchieved(int fofoId, CreateOfferRequest createOfferRequest) {
161
        Map<Integer, Long> criteriaTransactionMap = null;
162
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
163
            criteriaTransactionMap = offerRepository.getPartnerWisePurchaseSum(createOfferRequest).get(fofoId);
164
        } else {
165
            criteriaTransactionMap = offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId);
166
        }
167
        LOGGER.info("I am here ------- {}", createOfferRequest.getId());
168
        List<com.spice.profitmandi.dao.model.ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest
169
                .getTargetSlabs().get(0).getItemCriteriaPayouts();
27877 amit.gupta 170
 
31747 amit.gupta 171
        for (com.spice.profitmandi.dao.model.ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
172
            itemCriteriaPayout.setNextSlab(null);
173
            LOGGER.info("I am here --- {}", itemCriteriaPayout.getPayoutSlabs());
174
            long saleAmount = 0;
175
            if (criteriaTransactionMap != null
176
                    && criteriaTransactionMap.containsKey(itemCriteriaPayout.getItemCriteria().getId())) {
31853 amit.gupta 177
                saleAmount = criteriaTransactionMap.containsKey(0) ? criteriaTransactionMap.get(0) : criteriaTransactionMap.get(itemCriteriaPayout.getItemCriteria().getId());
31747 amit.gupta 178
            }
179
            itemCriteriaPayout.setAchievedValue(saleAmount);
180
            List<com.spice.profitmandi.service.offers.PayoutSlab> payoutSlabs = itemCriteriaPayout.getPayoutSlabs();
181
            for (int i = 0; i < payoutSlabs.size(); i++) {
182
                com.spice.profitmandi.service.offers.PayoutSlab beginSlab = payoutSlabs.get(i);
183
                com.spice.profitmandi.service.offers.PayoutSlab endSlab = null;
184
                if (payoutSlabs.size() - 1 > i) {
185
                    endSlab = payoutSlabs.get(i + 1);
186
                }
187
                if (beginSlab.getOnwardsAmount() > saleAmount) {
188
                    itemCriteriaPayout.setShortValue(beginSlab.getOnwardsAmount() - saleAmount);
189
                    itemCriteriaPayout.setNextSlab(beginSlab);
190
                    LOGGER.info("I am here");
191
                    break;
192
                }
193
                if (endSlab != null) {
194
                    if (beginSlab.getOnwardsAmount() <= saleAmount && endSlab.getOnwardsAmount() > saleAmount) {
195
                        itemCriteriaPayout.setCurrentSlab(beginSlab);
196
                        beginSlab.setSelected(true);
197
                        itemCriteriaPayout.setNextSlab(endSlab);
198
                        itemCriteriaPayout.setShortValue(endSlab.getOnwardsAmount() - saleAmount);
199
                        LOGGER.info("I am here");
200
                        break;
201
                    }
202
                    // Last loop
203
                } else {
204
                    beginSlab.setSelected(true);
205
                    itemCriteriaPayout.setCurrentSlab(beginSlab);
206
                    LOGGER.info("I am here");
207
                }
208
            }
209
            LOGGER.info("I am here --- {}", itemCriteriaPayout);
210
        }
29783 amit.gupta 211
 
31747 amit.gupta 212
    }
27877 amit.gupta 213
 
31747 amit.gupta 214
    @Override
32868 amit.gupta 215
    @Cacheable(value = "allOffers", cacheManager = "oneDayCacheManager")
31747 amit.gupta 216
    public Map<Integer, CreateOfferRequest> getAllOffers(YearMonth yearMonth) {
217
        List<Offer> allOffers = offerRepository.selectAll(yearMonth, false);
218
        List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
219
        for (Offer offer : allOffers) {
220
            CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
221
            createOfferRequests.add(createOfferRequest);
222
        }
223
        return createOfferRequests.stream().collect(Collectors.toMap(CreateOfferRequest::getId, x -> x));
224
    }
27877 amit.gupta 225
 
31747 amit.gupta 226
    @Override
227
    @Cacheable(value = "partnerOffers", cacheManager = "thirtyMinsTimeOutCacheManager")
228
    public CreateOfferRequest getOffer(int fofoId, int offerId) {
229
        Offer offer = offerRepository.selectById(offerId);
230
        CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
231
        if (fofoId > 0) {
232
            this.setCriteriaPayoutAchieved(fofoId, createOfferRequest);
233
        }
29783 amit.gupta 234
 
31747 amit.gupta 235
        return createOfferRequest;
236
    }
27877 amit.gupta 237
 
31747 amit.gupta 238
    @Override
239
    public CreateOfferRequest getCreateOfferRequest(Offer fromOffer) {
240
        CreateOfferRequest createOfferRequest = new CreateOfferRequest();
241
        createOfferRequest.setName(fromOffer.getName());
32023 amit.gupta 242
        createOfferRequest.setDiscount(fromOffer.isDiscount());
31747 amit.gupta 243
        createOfferRequest.setTargetType(fromOffer.getTargetType());
244
        createOfferRequest.setPayoutType(fromOffer.getPayoutType());
245
        createOfferRequest.setSchemeType(fromOffer.getSchemeType());
246
        createOfferRequest.setActivationBrands(fromOffer.getActivationBrands());
247
        createOfferRequest.setEndDate(fromOffer.getEndDate());
248
        createOfferRequest.setProcessTimestamp(fromOffer.getProcessedTimestamp());
249
        createOfferRequest.setStartDate(fromOffer.getStartDate());
250
        createOfferRequest.setBooster(fromOffer.isBooster());
251
        createOfferRequest.setActive(fromOffer.isActive());
252
        createOfferRequest.setSellinPercentage(fromOffer.getSellinPercentage());
253
        createOfferRequest.setBrandShareTerms(fromOffer.getBrandSharePercentage());
254
        createOfferRequest.setOfferNotes(fromOffer.getOfferNotes());
255
        createOfferRequest.setTerms(fromOffer.getTerms());
256
        createOfferRequest.setBaseCriteria(fromOffer.isBaseCriteia());
257
        createOfferRequest.setItemCriteria(
258
                gson.fromJson(fromOffer.getItemCriteria(), com.spice.profitmandi.service.offers.ItemCriteria.class));
259
        createOfferRequest.setPartnerCriteria(gson.fromJson(fromOffer.getPartnerCriteria(), PartnerCriteria.class));
260
        createOfferRequest.setId(fromOffer.getId());
261
        createOfferRequest.setCreatedOn(fromOffer.getCreatedTimestamp());
262
        createOfferRequest.setItemCriteriaString(
263
                itemCriteriaRepository.getItemCriteriaDescription(createOfferRequest.getItemCriteria()));
264
        List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = offerTargetSlabRepository
265
                .getByOfferId(fromOffer.getId());
266
        createOfferRequest.setPartnerCriteriaString(
267
                retailerService.getPartnerCriteriaString(createOfferRequest.getPartnerCriteria()));
268
        createOfferRequest.setTargetSlabs(targetSlabs);
269
        for (com.spice.profitmandi.dao.model.ItemCriteriaPayout itemCriteriaPayout : createOfferRequest.getTargetSlabs()
270
                .get(0).getItemCriteriaPayouts()) {
271
            itemCriteriaPayout.setNextSlab(itemCriteriaPayout.getPayoutSlabs().get(0));
272
        }
273
        return createOfferRequest;
27877 amit.gupta 274
 
31747 amit.gupta 275
    }
27877 amit.gupta 276
 
31747 amit.gupta 277
    @Autowired
278
    private WalletService walletService;
31205 amit.gupta 279
 
31747 amit.gupta 280
    @Override
281
    public void reverseAdditionalSelloutSchemes(int fofoId, List<InventoryItem> inventoryItems) throws ProfitMandiBusinessException {
282
        List<OfferPayout> offerPayouts = new ArrayList<>();
31748 amit.gupta 283
        LOGGER.info("Reversing schemes for fofoId {}, InventoryItems {}", fofoId, inventoryItems);
31747 amit.gupta 284
        //As of now we are not handling non-serialised items
285
        inventoryItems = inventoryItems.stream().filter(x -> x.getSerialNumber() != null).collect(Collectors.toList());
31750 amit.gupta 286
        if (inventoryItems.size() > 0) {
31205 amit.gupta 287
 
31750 amit.gupta 288
            for (InventoryItem inventoryItem : inventoryItems) {
289
                offerPayouts.addAll(offerPayoutRepository.selectAllBySerialNumber(inventoryItem.getFofoId(), inventoryItem.getSerialNumber())
290
                        .stream()
291
                        .filter(x -> x.getRejectTimestamp() == null)
292
                        .collect(Collectors.toList()));
31747 amit.gupta 293
            }
31750 amit.gupta 294
            for (OfferPayout offerPayout : offerPayouts) {
295
                offerPayout.setStatus(SchemePayoutStatus.REJECTED);
296
                offerPayout.setRejectTimestamp(LocalDateTime.now());
297
            }
298
            Map<Long, Double> offerPayoutAmountMap = offerPayouts.stream().collect(Collectors.groupingBy(x -> x.getOfferId(), Collectors.summingDouble(x -> x.getAmount())));
299
            for (Map.Entry<Long, Double> offerPayoutEntry : offerPayoutAmountMap.entrySet()) {
300
                List<UserWalletHistory> histories = walletService.getAllByReference(fofoId, offerPayoutEntry.getKey().intValue(), WalletReferenceType.ADDITIONAL_SCHEME);
301
                if (histories.size() > 0) {
302
 
303
                    walletService.rollbackAmountFromWallet(fofoId, offerPayoutEntry.getValue().floatValue(), offerPayoutEntry.getKey().intValue(),
304
                            WalletReferenceType.ADDITIONAL_SCHEME, "Models/Imeis for corresponding schemes were returned", LocalDateTime.now());
305
                }
306
            }
31747 amit.gupta 307
        }
308
    }
30684 amit.gupta 309
 
31747 amit.gupta 310
    private void createTargetSlabs(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
311
        List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = createOfferRequest.getTargetSlabs().stream()
312
                .filter(x -> x.validate()).collect(Collectors.toList());
313
        if (targetSlabs.size() >= 0) {
314
            Collections.sort(targetSlabs);
315
            for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
316
                if (targetSlab.validate()) {
317
                    List<ItemCriteriaPayout> itemCriteriaPayouts = targetSlab.getItemCriteriaPayouts();
318
                    for (ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
319
                        ItemCriteria itemCriteria = itemCriteriaRepository.selectById(itemCriteriaPayout.getItemCriteria().getId());
320
                        if (itemCriteriaPayout.getItemCriteria().getId() > 0) {
321
                            itemCriteriaPayout.getItemCriteria().setId(0);
322
                        } else {
27877 amit.gupta 323
 
31747 amit.gupta 324
                            String itemCriteriaJson = gson.toJson(itemCriteriaPayout.getItemCriteria());
325
                            itemCriteria = itemCriteriaRepository.selectByCriteria(itemCriteriaJson);
326
                            // ItemCriteria Only once
327
                            if (itemCriteria == null) {
328
                                itemCriteria = new ItemCriteria();
329
                                itemCriteria.setCriteria(gson.toJson(itemCriteriaPayout.getItemCriteria()));
330
                                itemCriteriaRepository.persist(itemCriteria);
331
                            }
332
                        }
333
                        for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
31903 amit.gupta 334
                            TargetSlabEntity targetSlabEntity = new TargetSlabEntity();
335
                            targetSlabEntity.setOfferId(createOfferRequest.getId());
336
                            targetSlabEntity.setOnwardsTarget(targetSlab.getOnwardsAmount());
337
                            targetSlabEntity.setTargetDescription(targetSlab.getTargetDescription());
338
                            targetSlabEntity.setPayoutTarget(payoutSlab.getOnwardsAmount());
339
                            targetSlabEntity.setPayoutValue(payoutSlab.getPayoutAmount());
340
                            targetSlabEntity.setItemCriteriaId(itemCriteria.getId());
341
                            targetSlabEntity.setAmountType(itemCriteriaPayout.getAmountType());
342
                            offerTargetSlabRepository.persist(targetSlabEntity);
31747 amit.gupta 343
                        }
344
                    }
345
                }
346
            }
27877 amit.gupta 347
 
31747 amit.gupta 348
        } else {
349
            throw new ProfitMandiBusinessException("Invalid Target Slabs", "Invalid Target", "");
350
        }
27877 amit.gupta 351
 
31747 amit.gupta 352
    }
27877 amit.gupta 353
 
31747 amit.gupta 354
    @Override
355
    public List<CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, int catalogId) {
356
        List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(YearMonth.from(date)).get(fofoId);
357
        List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
358
        if (publishedOffers != null) {
359
            for (Offer offer : publishedOffers) {
360
                boolean found = false;
361
                List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = offerTargetSlabRepository
362
                        .getByOfferId(offer.getId());
363
                CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
364
                createOfferRequest.setTargetSlabs(targetSlabs);
365
                this.setCriteriaPayoutAchieved(fofoId, createOfferRequest);
366
                Set<com.spice.profitmandi.service.offers.ItemCriteria> itemCriteriaSet = targetSlabs.stream()
367
                        .flatMap(x -> x.getItemCriteriaPayouts().stream()).map(x -> x.getItemCriteria()).distinct()
368
                        .filter(x -> itemRepository.containsModel(x, catalogId)).collect(Collectors.toSet());
29499 amit.gupta 369
 
31747 amit.gupta 370
                for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
371
                    targetSlab.setItemCriteriaPayouts(targetSlab.getItemCriteriaPayouts().stream()
372
                            .filter(x -> itemCriteriaSet.contains(x.getItemCriteria())).collect(Collectors.toList()));
373
                    if (targetSlab.getItemCriteriaPayouts().size() > 0) {
374
                        found = true;
375
                    }
376
                }
377
                if (found) {
378
                    createOfferRequests.add(createOfferRequest);
379
                }
380
            }
381
        }
29783 amit.gupta 382
 
31747 amit.gupta 383
        return createOfferRequests;
384
    }
29783 amit.gupta 385
 
31747 amit.gupta 386
    @Override
387
    public void createOffers(InputStream fileInputStream) throws Exception {
388
        Map<CreateOfferRequest, List<PartnerTargetModel>> offerPartnerTargetMap = this.parseFromExcel(fileInputStream);
32868 amit.gupta 389
        Set<YearMonth> ymListToEvict = new HashSet<>();
31747 amit.gupta 390
        for (Map.Entry<CreateOfferRequest, List<PartnerTargetModel>> partnerTargetEntry : offerPartnerTargetMap
391
                .entrySet()) {
392
            CreateOfferRequest createOfferRequest = partnerTargetEntry.getKey();
393
            Map<List<Integer>, List<Integer>> targetPartnerMap = partnerTargetEntry.getValue().stream()
394
                    .collect(Collectors.groupingBy(PartnerTargetModel::getTargets,
395
                            Collectors.mapping(PartnerTargetModel::getFofoId, Collectors.toList())));
396
            for (Map.Entry<List<Integer>, List<Integer>> targetPartnersEntry : targetPartnerMap.entrySet()) {
397
                List<Integer> fofoIds = createOfferRequest.getPartnerCriteria().getFofoIds();
398
                List<Integer> filterFofoIds = targetPartnersEntry.getValue().stream().filter(x -> !fofoIds.contains(x))
399
                        .collect(Collectors.toList());
400
                LOGGER.info("FofoIds {}", filterFofoIds);
401
                List<Integer> targets = targetPartnersEntry.getKey();
402
                LOGGER.info("Targets  {}", targets);
29806 amit.gupta 403
 
31747 amit.gupta 404
                createOfferRequest.getPartnerCriteria().setFofoIds(filterFofoIds);
405
                int counter = 0;
406
                List<ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest.getTargetSlabs().get(0)
407
                        .getItemCriteriaPayouts();
408
                List<PayoutSlab> payoutSlabs = itemCriteriaPayouts.stream().flatMap(x -> x.getPayoutSlabs().stream()).collect(Collectors.toList());
409
                for (PayoutSlab payoutSlab : payoutSlabs) {
410
                    payoutSlab.setOnwardsAmount(targets.get(counter));
411
                    counter++;
412
                }
413
                this.addOfferService(createOfferRequest);
414
            }
32868 amit.gupta 415
            ymListToEvict.add(YearMonth.from(createOfferRequest.getStartDate()));
31747 amit.gupta 416
        }
32868 amit.gupta 417
        for (YearMonth ymToEvict : ymListToEvict) {
418
            oneDayCacheManager.getCache("allOffers").evict(ymToEvict);
419
        }
27877 amit.gupta 420
 
31747 amit.gupta 421
    }
29783 amit.gupta 422
 
31747 amit.gupta 423
    private Map<CreateOfferRequest, List<PartnerTargetModel>> parseFromExcel(InputStream inputStream)
424
            throws ProfitMandiBusinessException {
29783 amit.gupta 425
 
31747 amit.gupta 426
        Map<CreateOfferRequest, List<PartnerTargetModel>> offerPartnerTargetMap = new HashMap<>();
427
        XSSFWorkbook myWorkBook = null;
428
        try {
429
            myWorkBook = new XSSFWorkbook(inputStream);
430
            myWorkBook.setMissingCellPolicy(MissingCellPolicy.RETURN_BLANK_AS_NULL);
431
            for (int i = 0; i < myWorkBook.getNumberOfSheets(); i++) {
29683 amit.gupta 432
 
31747 amit.gupta 433
                XSSFSheet mySheet = myWorkBook.getSheetAt(i);
434
                int offerId = Integer.parseInt(mySheet.getSheetName());
435
                CreateOfferRequest existingOffer = this.getOffer(0, offerId);
436
                List<PartnerTargetModel> partnerTargetModels = new ArrayList<>();
437
                offerPartnerTargetMap.put(existingOffer, partnerTargetModels);
438
                this.printIterator(mySheet);
439
                LOGGER.info("rowCellNum {}", mySheet.getLastRowNum());
440
                for (int rowNumber = 1; rowNumber <= mySheet.getLastRowNum(); rowNumber++) {
441
                    XSSFRow row = mySheet.getRow(rowNumber);
442
                    LOGGER.info("row {}", row);
443
                    PartnerTargetModel partnerTargetModel = new PartnerTargetModel();
29783 amit.gupta 444
 
31747 amit.gupta 445
                    if (row.getCell(0) != null && row.getCell(0).getCellTypeEnum() == CellType.NUMERIC) {
446
                        partnerTargetModel.setFofoId((int) row.getCell(0).getNumericCellValue());
447
                    } else {
448
                        ProfitMandiBusinessException profitMandiBusinessException = new ProfitMandiBusinessException(
449
                                "FOFO ID", row.getCell(0).toString(), "TGLSTNG_VE_1010");
450
                        LOGGER.error("Excel file parse error : ", profitMandiBusinessException);
451
                        throw profitMandiBusinessException;
452
                    }
453
                    List<Integer> targets = new ArrayList<>();
454
                    long targetsSize = existingOffer.getTargetSlabs().get(0).getItemCriteriaPayouts().stream().flatMap(x -> x.getPayoutSlabs().stream()).collect(Collectors.counting());
455
                    for (int cellNumber = 1; cellNumber <= targetsSize; cellNumber++) {
456
                        if (row.getCell(cellNumber) != null
457
                                && row.getCell(cellNumber).getCellTypeEnum() == CellType.NUMERIC) {
458
                            targets.add((int) row.getCell(cellNumber).getNumericCellValue());
459
                        } else {
460
                            ProfitMandiBusinessException profitMandiBusinessException = new ProfitMandiBusinessException(
461
                                    "Target Column issue at " + rowNumber + ", " + cellNumber, row.getCell(cellNumber),
462
                                    "Invalid target");
463
                            LOGGER.error("Excel file parse error : ", profitMandiBusinessException);
464
                            throw profitMandiBusinessException;
465
                        }
466
                    }
467
                    partnerTargetModel.setTargets(targets);
468
                    partnerTargetModels.add(partnerTargetModel);
469
                }
470
            }
471
            myWorkBook.close();
472
        } catch (ProfitMandiBusinessException pbse) {
473
            throw pbse;
474
        } catch (IOException ioException) {
475
            ioException.printStackTrace();
476
            throw new ProfitMandiBusinessException(ProfitMandiConstants.EXCEL_FILE, ioException.getMessage(),
477
                    "EXL_VE_1000");
478
        } finally {
479
            if (myWorkBook != null) {
480
                try {
481
                    myWorkBook.close();
482
                } catch (IOException e) {
483
                    // TODO Auto-generated catch block
484
                    e.printStackTrace();
485
                }
486
            }
487
        }
488
        LOGGER.info("offerPartnerTargetMap {}", offerPartnerTargetMap);
489
        return offerPartnerTargetMap;
490
    }
29783 amit.gupta 491
 
31747 amit.gupta 492
    private void printIterator(XSSFSheet sheet) {
493
        Iterator<Row> rowIterator = sheet.iterator();
494
        while (rowIterator.hasNext()) {
495
            Row row = rowIterator.next();
496
            // For each row, iterate through all the columns
497
            Iterator<Cell> cellIterator = row.cellIterator();
29683 amit.gupta 498
 
31747 amit.gupta 499
            while (cellIterator.hasNext()) {
500
                Cell cell = cellIterator.next();
501
                // Check the cell type and format accordingly
502
                switch (cell.getCellType()) {
503
                    case Cell.CELL_TYPE_NUMERIC:
504
                        System.out.print(cell.getNumericCellValue() + "t");
505
                        break;
506
                    case Cell.CELL_TYPE_STRING:
507
                        System.out.print(cell.getStringCellValue() + "t");
508
                        break;
509
                }
510
            }
511
            System.out.println("");
512
        }
513
    }
29683 amit.gupta 514
 
31747 amit.gupta 515
    @Override
516
    public Map<Integer, CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, String brand) {
517
        // TODO Auto-generated method stub
518
        return null;
519
    }
30684 amit.gupta 520
 
31747 amit.gupta 521
    @Override
32043 amit.gupta 522
    @Cacheable(value = "slabPayoutMap1", cacheManager = "oneDayCacheManager")
31747 amit.gupta 523
    public Map<Integer, Map<Integer, Long>> getSlabPayoutMap(CreateOfferRequest createOfferRequest) {
524
        Map<Integer, Map<Integer, Long>> catalogSlabPayoutMap = new HashMap<>();
525
        com.spice.profitmandi.dao.model.TargetSlab targetSlab = createOfferRequest.getTargetSlabs().get(0);
526
        List<ItemCriteriaPayout> payouts = targetSlab.getItemCriteriaPayouts();
29783 amit.gupta 527
 
31747 amit.gupta 528
        for (ItemCriteriaPayout itemCriteriaPayout : payouts) {
529
            com.spice.profitmandi.service.offers.ItemCriteria itemCriteria = itemCriteriaPayout.getItemCriteria();
530
            List<Integer> catalogIds = itemRepository.getCatalogIds(itemCriteria);
531
            for (PayoutSlab payoutSlab : Lists.reverse(itemCriteriaPayout.getPayoutSlabs())) {
532
                if (itemCriteriaPayout.getAmountType().equals(AmountType.FIXED)) {
533
                    for (Integer catalogId : catalogIds) {
534
                        if (!catalogSlabPayoutMap.containsKey(catalogId)) {
535
                            catalogSlabPayoutMap.put(catalogId, new LinkedHashMap<>());
536
                        }
537
                        catalogSlabPayoutMap.get(catalogId).put(payoutSlab.getOnwardsAmount(),
538
                                (long) payoutSlab.getPayoutAmount());
539
                    }
540
                } else if (itemCriteriaPayout.getAmountType().equals(AmountType.SLAB_FIXED)) {
541
                    for (Integer catalogId : catalogIds) {
542
                        if (!catalogSlabPayoutMap.containsKey(catalogId)) {
543
                            catalogSlabPayoutMap.put(catalogId, new LinkedHashMap<>());
544
                        }
545
                        catalogSlabPayoutMap.get(catalogId).put(payoutSlab.getOnwardsAmount(),
546
                                (long) (payoutSlab.getPayoutAmount() / payoutSlab.getOnwardsAmount()));
547
                    }
548
                } else if (itemCriteriaPayout.getAmountType().equals(AmountType.PERCENTAGE)) {
549
                    Map<Integer, TagListing> tagListingsMap = tagListingRepository.selectAllByCatalogIds(catalogIds);
550
                    for (Map.Entry<Integer, TagListing> tagListingEntry : tagListingsMap.entrySet()) {
551
                        TagListing tagListing = tagListingEntry.getValue();
552
                        if (!catalogSlabPayoutMap.containsKey(tagListingEntry.getKey())) {
553
                            catalogSlabPayoutMap.put(tagListingEntry.getKey(), new LinkedHashMap<>());
554
                        }
555
                        catalogSlabPayoutMap.get(tagListingEntry.getKey()).put(payoutSlab.getOnwardsAmount(),
556
                                (long) (tagListing.getSellingPrice() * payoutSlab.getPayoutAmount() / 100));
557
                    }
558
                }
559
            }
560
        }
561
        return catalogSlabPayoutMap;
562
    }
563
 
31903 amit.gupta 564
    @Override
565
    @Cacheable(value = "slabPayoutMap", cacheManager = "oneDayCacheManager")
566
    public Map<Integer, Map<Integer, AmountModel>> getSlabPayoutMapNew(CreateOfferRequest createOfferRequest) {
567
        Map<Integer, Map<Integer, AmountModel>> catalogSlabPayoutMap = new HashMap<>();
568
        com.spice.profitmandi.dao.model.TargetSlab targetSlab = createOfferRequest.getTargetSlabs().get(0);
569
        List<ItemCriteriaPayout> payouts = targetSlab.getItemCriteriaPayouts();
570
 
571
        for (ItemCriteriaPayout itemCriteriaPayout : payouts) {
572
            com.spice.profitmandi.service.offers.ItemCriteria itemCriteria = itemCriteriaPayout.getItemCriteria();
573
            List<Integer> catalogIds = itemRepository.getCatalogIds(itemCriteria);
574
            for (PayoutSlab payoutSlab : Lists.reverse(itemCriteriaPayout.getPayoutSlabs())) {
575
                if (itemCriteriaPayout.getAmountType().equals(AmountType.FIXED)) {
576
                    for (Integer catalogId : catalogIds) {
577
                        if (!catalogSlabPayoutMap.containsKey(catalogId)) {
578
                            catalogSlabPayoutMap.put(catalogId, new LinkedHashMap<>());
579
                        }
580
                        AmountModel amountModel = new AmountModel();
581
                        amountModel.setAmountType(AmountType.FIXED);
582
                        amountModel.setAmount(payoutSlab.getPayoutAmount());
32021 amit.gupta 583
                        amountModel.setDiscount(createOfferRequest.isDiscount());
31903 amit.gupta 584
                        catalogSlabPayoutMap.get(catalogId).put(payoutSlab.getOnwardsAmount(),
585
                                amountModel);
586
                    }
587
                } else if (itemCriteriaPayout.getAmountType().equals(AmountType.SLAB_FIXED)) {
588
                    for (Integer catalogId : catalogIds) {
589
                        if (!catalogSlabPayoutMap.containsKey(catalogId)) {
590
                            catalogSlabPayoutMap.put(catalogId, new LinkedHashMap<>());
591
                        }
592
 
593
                        AmountModel amountModel = new AmountModel();
594
                        amountModel.setAmountType(AmountType.FIXED);
32021 amit.gupta 595
                        amountModel.setDiscount(createOfferRequest.isDiscount());
31903 amit.gupta 596
                        amountModel.setAmount(payoutSlab.getPayoutAmount() / payoutSlab.getOnwardsAmount());
597
                        catalogSlabPayoutMap.get(catalogId).put(payoutSlab.getOnwardsAmount(),
598
                                amountModel);
599
                    }
600
                } else if (itemCriteriaPayout.getAmountType().equals(AmountType.PERCENTAGE)) {
601
                    for (Integer catalogId : catalogIds) {
602
                        if (!catalogSlabPayoutMap.containsKey(catalogId)) {
603
                            catalogSlabPayoutMap.put(catalogId, new LinkedHashMap<>());
604
                        }
605
                        AmountModel amountModel = new AmountModel();
606
                        amountModel.setAmountType(AmountType.PERCENTAGE);
607
                        amountModel.setAmount(payoutSlab.getPayoutAmount());
32021 amit.gupta 608
                        amountModel.setDiscount(createOfferRequest.isDiscount());
31903 amit.gupta 609
                        catalogSlabPayoutMap.get(catalogId).put(payoutSlab.getOnwardsAmount(),
610
                                amountModel);
611
                    }
612
                }
613
            }
614
        }
615
        return catalogSlabPayoutMap;
616
    }
617
 
31920 amit.gupta 618
 
619
    private double getAmount(InventoryPayoutModel inventoryPayoutModel, AmountModel amountModel) {
620
        double rollout = 0;
621
        if (amountModel.getAmountType().equals(AmountType.PERCENTAGE)) {
622
            double effectiveDp = inventoryPayoutModel.getDp() - inventoryPayoutModel.getFixedAmount();
623
            double totalPercentage = inventoryPayoutModel.getPercentageAmount() + amountModel.getAmount();
624
            rollout = effectiveDp * (totalPercentage / (100 + totalPercentage) - (inventoryPayoutModel.getPercentageAmount() / (100 + inventoryPayoutModel.getPercentageAmount())));
625
        } else {
626
            rollout = amountModel.getAmount() * (100 / (100 + inventoryPayoutModel.getPercentageAmount()));
627
        }
628
        return rollout;
629
    }
630
 
631
    @Override
632
    public void processActivationtOffer(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
633
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByOfferId(createOfferRequest.getId());
634
        List<ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts();
635
        Map<Integer, ItemCriteriaPayout> itemCriteriaPayoutMap = itemCriteriaPayouts.stream().collect(Collectors.toMap(x -> x.getItemCriteria().getId(), x -> x));
31923 amit.gupta 636
        LOGGER.info("itemCriteriaPayoutMap {}", itemCriteriaPayoutMap);
637
        LOGGER.info("offerPayouts {}", offerPayouts);
31924 amit.gupta 638
        Map<Integer, Map<Integer, Double>> fixedSlabCriteriaPartnerMap = offerPayouts.stream().filter(x -> itemCriteriaPayoutMap.get((int) x.getCriteriaId()).getAmountType().equals(AmountType.SLAB_FIXED))
31920 amit.gupta 639
                .collect(Collectors.groupingBy(x -> (int) x.getCriteriaId(), Collectors.groupingBy(x -> (int) x.getFofoId(), Collectors.summingDouble(x -> x.getSlabAmount()))));
640
 
641
 
642
        Map<String, Double> serialNumberPaid = offerPayouts.stream().filter(x -> x.getRejectTimestamp() == null).collect(Collectors.groupingBy(x -> x.getSerialNumber(), Collectors.summingDouble(x -> x.getSlabAmount())));
643
        Map<Integer, Map<Integer, List<FofoOrderItem>>> criteriaPartnerwiseTertiary = offerRepository.getCriteriaWisePartnerTertiary(createOfferRequest);
644
 
645
 
646
        final Set<String> activatedImeis;
647
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.ACTIVATION)) {
648
            //All Serialnumbers for all eligible retailers
649
            List<String> serialNumbers = criteriaPartnerwiseTertiary.entrySet().stream().flatMap(x -> x.getValue().entrySet().stream().flatMap(foiList -> foiList.getValue().stream()))
650
                    .flatMap(y -> y.getFofoLineItems().stream()).filter(fli -> fli.getSerialNumber() != null)
651
                    .map(x -> x.getSerialNumber()).collect(Collectors.toList());
652
            if (serialNumbers.size() > 0) {
653
                activatedImeis = activatedImeiRepository.selectBySerialNumbers(serialNumbers).stream()
654
                        .filter(x -> createOfferRequest.isWithinRange(x.getActivationTimestamp()))
655
                        .map(x -> x.getSerialNumber()).collect(Collectors.toSet());
656
            } else {
657
                activatedImeis = null;
658
            }
659
        } else {
660
            activatedImeis = null;
661
        }
662
 
663
        Map<Integer, Integer> userBaseQtyMap = new HashMap<>();
664
        Map<Integer, Integer> userBaseValueMap = new HashMap<>();
665
        Map<Integer, Integer> eligibleBaseQtyMap = new HashMap<>();
666
        Map<Integer, Integer> eligibleBaseValueMap = new HashMap<>();
667
 
668
        if (createOfferRequest.isBaseCriteria()) {
669
            Map<Integer, List<FofoOrderItem>> foiMap = criteriaPartnerwiseTertiary.get(0);
670
            for (Map.Entry<Integer, List<FofoOrderItem>> orderEntry : foiMap.entrySet()) {
671
                int fofoId = orderEntry.getKey();
672
                List<FofoOrderItem> fofoOrderItems = orderEntry.getValue();
673
                int totalBaseQty = fofoOrderItems.stream().collect(Collectors.summingInt(x -> (x.getQuantity())));
674
                int totalBaseValue = fofoOrderItems.stream().collect(Collectors.summingInt(x -> (Math.round(x.getDp())) * x.getQuantity()));
675
                userBaseQtyMap.put(fofoId, totalBaseQty);
676
                userBaseValueMap.put(fofoId, totalBaseValue);
677
                if (createOfferRequest.getSchemeType().equals(OfferSchemeType.ACTIVATION)) {
678
                    Map<Integer, Integer> inventoryItemValueMap = new HashMap<>();
679
                    for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
680
                        fofoOrderItem.getFofoLineItems().stream().filter(x -> x.getSerialNumber() != null).forEach(
681
                                lineItem -> {
682
                                    if (activatedImeis == null || activatedImeis.contains(lineItem.getSerialNumber())) {
683
                                        inventoryItemValueMap.put(lineItem.getInventoryItemId(), (int) fofoOrderItem.getDp());
684
                                    }
685
                                }
686
                        );
687
                    }
688
                    eligibleBaseQtyMap.put(fofoId, inventoryItemValueMap.size());
689
                    eligibleBaseValueMap.put(fofoId, inventoryItemValueMap.entrySet().stream().collect(Collectors.summingInt(x -> x.getValue())));
690
                } else {
691
                    eligibleBaseQtyMap.put(fofoId, totalBaseQty);
692
                    eligibleBaseValueMap.put(fofoId, totalBaseValue);
693
 
694
                }
695
 
696
            }
697
        }
698
 
699
        //As of now eligible sale is considered to be without special criteria like brand/
700
        for (ItemCriteriaPayout itemCriteriaPayout : createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts()) {
701
            int criteriaId = itemCriteriaPayout.getItemCriteria().getId();
702
            Map<Integer, List<FofoOrderItem>> ordersMap = criteriaPartnerwiseTertiary.get(criteriaId);
703
            for (Map.Entry<Integer, List<FofoOrderItem>> orderEntry : ordersMap.entrySet()) {
31992 amit.gupta 704
                double totalRolloutAmount = 0;
31920 amit.gupta 705
                int fofoId = orderEntry.getKey();
706
                List<FofoOrderItem> fofoOrderItems = orderEntry.getValue();
707
                OfferRowModel offerRowModel = new OfferRowModel();
708
                int totalQty = fofoOrderItems.stream().collect(Collectors.summingInt(x -> (x.getQuantity())));
709
                int totalValue = fofoOrderItems.stream().collect(Collectors.summingInt(x -> Math.round(x.getDp()) * (x.getQuantity())));
710
                int eligibleQty = totalQty;
711
                int eligibleValue = totalValue;
712
                Map<FofoLineItem, Integer> lineItemValueMap = new HashMap<>();
713
                if (createOfferRequest.getSchemeType().equals(OfferSchemeType.ACTIVATION)) {
714
                    for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
715
                        fofoOrderItem.getFofoLineItems().stream().filter(x -> x.getSerialNumber() != null).forEach(
716
                                lineItem -> {
717
                                    if (activatedImeis == null || activatedImeis.contains(lineItem.getSerialNumber())) {
718
                                        lineItemValueMap.put(lineItem, (int) fofoOrderItem.getDp());
719
                                    }
720
                                }
721
                        );
722
                    }
723
                    eligibleQty = lineItemValueMap.size();
724
                    eligibleValue = lineItemValueMap.entrySet().stream().collect(Collectors.summingInt(x -> x.getValue()));
725
                    offerRowModel.setEligibleImeis(lineItemValueMap.keySet().stream().map(x -> x.getSerialNumber()).collect(Collectors.toList()));
726
                }
727
 
728
                int totalBaseQty = totalQty;
729
                int totalBaseValue = totalValue;
730
                int eligibleBaseQty = eligibleQty;
731
                int eligibleBaseValue = eligibleValue;
732
                if (createOfferRequest.isBaseCriteria()) {
733
                    totalBaseQty = userBaseQtyMap.get(fofoId) == null ? 0 : userBaseQtyMap.get(fofoId);
734
                    totalBaseValue = userBaseValueMap.get(fofoId) == null ? 0 : userBaseValueMap.get(fofoId);
735
                    eligibleBaseQty = eligibleBaseQtyMap.get(fofoId) == null ? 0 : eligibleBaseQtyMap.get(fofoId);
736
                    eligibleBaseValue = eligibleBaseValueMap.get(fofoId) == null ? 0 : eligibleBaseValueMap.get(fofoId);
737
                }
738
 
739
 
740
                int totalSale = totalBaseValue;
741
                int eligibleSale = eligibleBaseValue;
742
                int criteriaSale = totalValue;
743
                int eligibleCriteriaSale = eligibleValue;
744
                int eligibleCriteriaSaleDp = eligibleValue;
745
 
746
                if (createOfferRequest.getTargetType().equals(AchievementType.QUANTITY)) {
747
                    totalSale = totalBaseQty;
748
                    eligibleSale = eligibleBaseQty;
749
                    criteriaSale = totalQty;
750
                    eligibleCriteriaSale = eligibleQty;
751
                }
752
 
753
                offerRowModel.setTotalSale(totalSale);
754
                offerRowModel.setEligibleSale(eligibleSale);
755
                float eligiblePayoutValue = 0;
32345 amit.gupta 756
                double finalPayout;
31920 amit.gupta 757
                for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
758
                    if (payoutSlab.getOnwardsAmount() <= eligibleSale) {
32039 amit.gupta 759
                        LOGGER.info("Eligible Sale {}", eligibleSale);
31920 amit.gupta 760
                        offerRowModel.setPayoutTargetAchieved(payoutSlab.getOnwardsAmount());
761
                        eligiblePayoutValue = payoutSlab.getPayoutAmount();
762
                        offerRowModel.setPayoutValue(eligiblePayoutValue);
763
                    }
764
                }
765
                if (AmountType.PERCENTAGE.equals(itemCriteriaPayout.getAmountType())) {
766
                    finalPayout = (eligiblePayoutValue * eligibleCriteriaSaleDp) / 100;
767
                } else if (AmountType.FIXED.equals(itemCriteriaPayout.getAmountType())) {
768
                    finalPayout = eligiblePayoutValue * eligibleCriteriaSale;
769
                } else {
32039 amit.gupta 770
                    Map<Integer, Double> fofoCriteriaMap = fixedSlabCriteriaPartnerMap.get(criteriaId);
771
                    LOGGER.info("fofoCriteriaMap {}", fofoCriteriaMap);
31920 amit.gupta 772
                    finalPayout = eligiblePayoutValue;
773
                    if (fofoCriteriaMap != null) {
774
                        if (fofoCriteriaMap.containsKey(fofoId)) {
775
                            double totalPayout = fofoCriteriaMap.get(fofoId);
32039 amit.gupta 776
                            finalPayout = eligiblePayoutValue - totalPayout;
777
                            if (Math.abs(finalPayout) < Utils.DOUBLE_EPSILON) {
31920 amit.gupta 778
                                finalPayout = 0;
32039 amit.gupta 779
                            }
31920 amit.gupta 780
                        }
781
                    }
782
                }
783
 
32039 amit.gupta 784
                LOGGER.info("Final Payout - {}", finalPayout);
785
 
31920 amit.gupta 786
                if (finalPayout > 0) {
787
                    List<Integer> inventoryItemIds = lineItemValueMap.keySet().stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList());
788
                    Map<Integer, InventoryItem> inventoryItemsMap = inventoryItemRepository.selectAllByIds(inventoryItemIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
789
                    for (Map.Entry<FofoLineItem, Integer> lineItemValueEntry : lineItemValueMap.entrySet()) {
790
                        double amount = 0;
32039 amit.gupta 791
                        int totalDpValue = lineItemValueMap.values().stream().collect(Collectors.summingInt(x -> x));
792
                        LOGGER.info("Total DP Value {}", totalDpValue);
31920 amit.gupta 793
                        if (AmountType.SLAB_FIXED.equals(itemCriteriaPayout.getAmountType())) {
32039 amit.gupta 794
                            amount = (eligiblePayoutValue * lineItemValueEntry.getValue()) / totalDpValue;
795
                            LOGGER.info("Amount - {}", amount);
31920 amit.gupta 796
                            //Fixed slab should be treated as fixed after payout
797
                        } else {
798
                            amount = eligiblePayoutValue;
32039 amit.gupta 799
                            //Fixed slab has already taken care of that amount;
800
                            if (serialNumberPaid.containsKey(lineItemValueEntry.getKey().getSerialNumber())) {
801
                                amount = amount - serialNumberPaid.get(lineItemValueEntry.getKey().getSerialNumber());
802
                            }
31920 amit.gupta 803
                        }
32039 amit.gupta 804
                        LOGGER.info("Amount - {}", amount);
31920 amit.gupta 805
                        //ignore reasonably small
806
                        if (amount < Utils.DOUBLE_EPSILON) continue;
807
                        AmountModel amountModel = new AmountModel();
808
                        amountModel.setAmountType(itemCriteriaPayout.getAmountType());
809
                        amountModel.setAmount(amount);
32021 amit.gupta 810
                        amountModel.setDiscount(createOfferRequest.isDiscount());
31920 amit.gupta 811
                        InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(inventoryItemsMap.get(lineItemValueEntry.getKey().getInventoryItemId()));
812
                        double rolloutAmount = inventoryPayoutModel.getRolloutAmount(amountModel);
813
                        totalRolloutAmount += rolloutAmount;
814
 
815
                        OfferPayout offerPayout = new OfferPayout(fofoId, createOfferRequest.getId(), criteriaId, amount, lineItemValueEntry.getKey().getSerialNumber(), rolloutAmount, SchemePayoutStatus.CREDITED, createOfferRequest.getDescription(), LocalDateTime.now());
816
                        //offerPayout.setInventoryItemId(inventoryItemSaleModelsMap.get(lineItemValueEntry.getKey().getInventoryItemId()));
817
                        offerPayoutRepository.persist(offerPayout);
818
                    }
32039 amit.gupta 819
                    walletService.addAmountToWallet((int) fofoId, createOfferRequest.getId(), WalletReferenceType.ADDITIONAL_SCHEME, createOfferRequest.getDescription(), (float) totalRolloutAmount, LocalDateTime.now());
31920 amit.gupta 820
                }
821
            }
822
        }
823
        Offer offer = offerRepository.selectById(createOfferRequest.getId());
824
        offer.setProcessedTimestamp(LocalDateTime.now());
825
    }
826
 
32064 amit.gupta 827
    private void extracted(CreateOfferRequest createOfferRequest, Map<String, Double> serialNumberPaid, ItemCriteriaPayout itemCriteriaPayout, int criteriaId, double totalRolloutAmount, int fofoId, Map<FofoLineItem, Integer> lineItemValueMap, float eligiblePayoutValue) throws ProfitMandiBusinessException {
828
        List<Integer> inventoryItemIds = lineItemValueMap.keySet().stream().map(x -> x.getInventoryItemId()).collect(Collectors.toList());
829
        Map<Integer, InventoryItem> inventoryItemsMap = inventoryItemRepository.selectAllByIds(inventoryItemIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
830
        for (Map.Entry<FofoLineItem, Integer> lineItemValueEntry : lineItemValueMap.entrySet()) {
831
            double amount = 0;
832
            int totalDpValue = lineItemValueMap.values().stream().collect(Collectors.summingInt(x -> x));
833
            LOGGER.info("Total DP Value {}", totalDpValue);
834
            if (AmountType.SLAB_FIXED.equals(itemCriteriaPayout.getAmountType())) {
835
                amount = (eligiblePayoutValue * lineItemValueEntry.getValue()) / totalDpValue;
836
                LOGGER.info("Amount - {}", amount);
837
                //Fixed slab should be treated as fixed after payout
838
            } else {
839
                amount = eligiblePayoutValue;
840
                //Fixed slab has already taken care of that amount;
841
                if (serialNumberPaid.containsKey(lineItemValueEntry.getKey().getSerialNumber())) {
842
                    amount = amount - serialNumberPaid.get(lineItemValueEntry.getKey().getSerialNumber());
843
                }
844
            }
845
            LOGGER.info("Amount - {}", amount);
846
            //ignore reasonably small
847
            if (amount < Utils.DOUBLE_EPSILON) continue;
848
            AmountModel amountModel = new AmountModel();
849
            amountModel.setAmountType(itemCriteriaPayout.getAmountType());
850
            amountModel.setAmount(amount);
851
            amountModel.setDiscount(createOfferRequest.isDiscount());
852
            InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(inventoryItemsMap.get(lineItemValueEntry.getKey().getInventoryItemId()));
853
            double rolloutAmount = inventoryPayoutModel.getRolloutAmount(amountModel);
854
            totalRolloutAmount += rolloutAmount;
855
 
856
            OfferPayout offerPayout = new OfferPayout(fofoId, createOfferRequest.getId(), criteriaId, amount, lineItemValueEntry.getKey().getSerialNumber(), rolloutAmount, SchemePayoutStatus.CREDITED, createOfferRequest.getDescription(), LocalDateTime.now());
857
            //offerPayout.setInventoryItemId(inventoryItemSaleModelsMap.get(lineItemValueEntry.getKey().getInventoryItemId()));
858
            offerPayoutRepository.persist(offerPayout);
859
        }
860
        walletService.addAmountToWallet((int) fofoId, createOfferRequest.getId(), WalletReferenceType.ADDITIONAL_SCHEME, createOfferRequest.getDescription(), (float) totalRolloutAmount, LocalDateTime.now());
861
    }
862
 
31920 amit.gupta 863
    @Override
864
    public void processSellin(CreateOfferRequest createOfferRequest) throws Exception {
865
 
866
        //List<OfferRowModel> offerRowModels = new ArrayList<>();
867
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByOfferId(createOfferRequest.getId());
32345 amit.gupta 868
        Map<String, Double> serialNumberPaid = offerPayouts.stream().filter(x -> x.getRejectTimestamp() == null).collect(Collectors.groupingBy(x -> x.getSerialNumber(), Collectors.summingDouble(x -> x.getSlabAmount())));
869
 
870
        List<ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts();
871
        Map<Integer, ItemCriteriaPayout> itemCriteriaPayoutMap = itemCriteriaPayouts.stream().collect(Collectors.toMap(x -> x.getItemCriteria().getId(), x -> x));
872
        Map<Integer, Map<Integer, Double>> fixedSlabCriteriaPartnerMap = offerPayouts.stream().filter(x -> itemCriteriaPayoutMap.get((int) x.getCriteriaId()).getAmountType().equals(AmountType.SLAB_FIXED))
873
                .collect(Collectors.groupingBy(x -> (int) x.getCriteriaId(), Collectors.groupingBy(x -> (int) x.getFofoId(), Collectors.summingDouble(x -> x.getSlabAmount()))));
31920 amit.gupta 874
        Set<Long> fofoIds = offerPayouts.stream().map(x -> x.getFofoId()).collect(Collectors.toSet());
875
 
876
        Map<Integer, Map<Integer, List<Order>>> criteriaOrdersMap = offerRepository.getPartnerWiseSellin(createOfferRequest, true);
877
 
32345 amit.gupta 878
 
31920 amit.gupta 879
        Map<Integer, List<Order>> userBaseCriteriaOrdersMap = null;
880
        if (criteriaOrdersMap.get(0) != null && criteriaOrdersMap.get(0).size() > 0) {
881
            userBaseCriteriaOrdersMap = criteriaOrdersMap.get(0).entrySet().stream()
882
                    .filter(x -> !fofoIds.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
883
        }
884
 
32345 amit.gupta 885
 
31920 amit.gupta 886
        Map<Integer, Integer> userBaseQtyMap = null;
887
        Map<Integer, Integer> userBaseValueMap = null;
888
        if (userBaseCriteriaOrdersMap != null) {
889
            userBaseQtyMap = new HashMap<>();
890
            userBaseValueMap = new HashMap<>();
891
            for (Map.Entry<Integer, List<Order>> orderEntry : userBaseCriteriaOrdersMap.entrySet()) {
892
                int fofoId = orderEntry.getKey();
893
                List<Order> orders = orderEntry.getValue();
894
                int totalBaseQty = orders.stream().collect(Collectors.summingInt(x -> (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty())));
895
                int totalBaseValue = orders.stream().collect(Collectors.summingInt(x ->
896
                        Math.round(x.getLineItem().getUnitPrice() * (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty()))
897
                ));
898
                userBaseQtyMap.put(fofoId, totalBaseQty);
899
                userBaseValueMap.put(fofoId, totalBaseValue);
900
            }
901
        }
902
        LOGGER.info("Base Qty Map - {}", userBaseQtyMap);
903
        LOGGER.info("Base Value Map - {}", userBaseValueMap);
904
 
905
        LOGGER.info("Processing sellin");
906
        List<OfferPayout> offerPayoutsNew = new ArrayList<>();
907
        for (ItemCriteriaPayout itemCriteriaPayout : createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts()) {
908
            int criteriaId = itemCriteriaPayout.getItemCriteria().getId();
909
            Map<Integer, List<Order>> ordersMap = criteriaOrdersMap.get(criteriaId).entrySet().stream()
910
                    .filter(x -> !fofoIds.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
911
            for (Map.Entry<Integer, List<Order>> orderEntry : ordersMap.entrySet()) {
912
                int fofoId = orderEntry.getKey();
913
                //CustomRetailer retailer = retailerService.getAllFofoRetailers().get(fofoId);
914
                List<Order> orders = orderEntry.getValue();
32345 amit.gupta 915
                //Set<String> returnedSerialNumbers = orders.stream().filter(x -> x.getSerialNumber() != null).flatMap(x -> x.getReturnedImeis().stream()).collect(Collectors.toSet());
31920 amit.gupta 916
                int totalQty = orders.stream().collect(Collectors.summingInt(x -> (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty())));
917
                int totalValue = orders.stream().collect(Collectors.summingInt(x -> Math.round(x.getLineItem().
918
                        getUnitPrice() * (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty()))));
919
                int totalBaseQty = totalQty;
920
                int totalBaseValue = totalValue;
921
                if (userBaseCriteriaOrdersMap != null) {
922
                    if (userBaseQtyMap.containsKey(fofoId)) {
923
                        totalBaseQty = userBaseQtyMap.get(fofoId);
924
                        totalBaseValue = userBaseValueMap.get(fofoId);
925
                    } else {
926
                        continue;
927
                    }
928
                }
929
 
930
                int purchasedValue;
931
                if (createOfferRequest.getTargetType().equals(AchievementType.VALUE)) {
932
                    purchasedValue = totalBaseValue;
933
                } else {
934
                    purchasedValue = totalBaseQty;
935
                }
936
                PayoutSlab currentSlab = itemCriteriaPayout.getPayoutSlabs().stream()
937
                        .filter(x -> x.getOnwardsAmount() <= purchasedValue).max(Comparator.comparing(x
938
                                -> x.getOnwardsAmount())).orElse(null);
939
 
940
                //TODO-- payouts handling is here
941
                if (currentSlab == null) continue;
942
                List<Integer> orderIds = orders.stream().map(x -> x.getId()).collect(Collectors.toList());
943
                Map<Integer, LineItem> lineItemMap = orders.stream().collect(Collectors.toMap(x -> x.getLineItem().getId(), x -> x.getLineItem()));
944
                List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(orderIds);
32540 amit.gupta 945
                LOGGER.info("Warehosue scans --> {}", warehouseScans);
32345 amit.gupta 946
                List<Integer> warehouseInventoryItemIds = warehouseScans.stream().collect(Collectors.groupingBy(x -> x.getInventoryItemId())).entrySet()
31920 amit.gupta 947
                        .stream().filter(x -> x.getValue().size() == 1).map(x -> x.getKey()).collect(Collectors.toList());
32795 amit.gupta 948
 
949
                List<OfferPayout> partnerPayouts = offerPayouts.stream().filter(x -> x.getFofoId() == fofoId).collect(Collectors.toList());
32868 amit.gupta 950
                Set<String> serialNumbersRejected = partnerPayouts.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.REJECTED)).map(x -> x.getSerialNumber()).collect(Collectors.toSet());
32795 amit.gupta 951
 
31920 amit.gupta 952
                Set<String> serialNumbers;
32345 amit.gupta 953
                LOGGER.info("warehouseInventoryItemIds {}", warehouseInventoryItemIds);
954
                if (warehouseInventoryItemIds.size() > 0) {
955
                    List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectAllByIds(warehouseInventoryItemIds);
31920 amit.gupta 956
                    serialNumbers = warehouseInventoryItems.stream().map(x -> x.getSerialNumber()).collect(Collectors.toSet());
957
                } else {
958
                    serialNumbers = new HashSet<>();
959
                }
960
                LOGGER.info("SerialNumbers {}", serialNumbers);
961
                Map<String, Long> serialNumberCountMap = lineItemImeisRepository.selectByLineItemIds(new ArrayList<>(lineItemMap.keySet()))
962
                        .stream().collect(Collectors.groupingBy(x -> x.getSerialNumber(), Collectors.counting()));
963
                LOGGER.info("SerialNumbers Count Map {}", serialNumberCountMap);
964
                Map<String, LineItem> serialNumberMap = lineItemImeisRepository.selectByLineItemIds(new ArrayList<>(lineItemMap.keySet()))
32868 amit.gupta 965
                        .stream().filter(x -> !serialNumbersRejected.contains(x.getSerialNumber())).collect(Collectors.toMap(x -> x.getSerialNumber(), x -> lineItemMap.get(x.getLineItemId()), (x1, x2) -> x1.getId() > x2.getId() ? x1 : x2));
31920 amit.gupta 966
 
32795 amit.gupta 967
 
31920 amit.gupta 968
                serialNumberMap = serialNumberMap.entrySet().stream().filter(x -> serialNumbers.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
32542 amit.gupta 969
                LOGGER.info("serialNumberMap {}", serialNumberMap);
32543 amit.gupta 970
                if (serialNumberMap.size() == 0) continue;
32064 amit.gupta 971
                Map<String, InventoryItem> serialNumberInventoryItemMap = this.getInventoryItemMap(fofoId, serialNumberMap);
972
                //Continue if all imeis havent been grned
32345 amit.gupta 973
                if (serialNumberInventoryItemMap.size() < serialNumberCountMap.size()) continue;
32064 amit.gupta 974
 
32345 amit.gupta 975
 
976
                float eligiblePayoutValue = currentSlab.getPayoutAmount();
977
                double finalPayout;
978
                if (AmountType.PERCENTAGE.equals(itemCriteriaPayout.getAmountType())) {
979
                    finalPayout = (eligiblePayoutValue * purchasedValue) / 100;
980
                } else if (AmountType.FIXED.equals(itemCriteriaPayout.getAmountType())) {
981
                    finalPayout = eligiblePayoutValue * purchasedValue;
982
                } else {
983
                    Map<Integer, Double> fofoCriteriaMap = fixedSlabCriteriaPartnerMap.get(criteriaId);
984
                    LOGGER.info("fofoCriteriaMap {}", fofoCriteriaMap);
985
                    finalPayout = eligiblePayoutValue;
986
                    if (fofoCriteriaMap != null) {
987
                        if (fofoCriteriaMap.containsKey(fofoId)) {
988
                            double totalPayout = fofoCriteriaMap.get(fofoId);
989
                            finalPayout = eligiblePayoutValue - totalPayout;
990
                            if (Math.abs(finalPayout) < Utils.DOUBLE_EPSILON) {
991
                                finalPayout = 0;
992
                            }
993
                        }
31920 amit.gupta 994
                    }
995
                }
32345 amit.gupta 996
 
997
                LOGGER.info("Or - {}", finalPayout);
998
 
999
                if (finalPayout > 0) {
1000
                    double totalRolloutAmount = 0;
1001
                    int totalDpValue = serialNumberInventoryItemMap.entrySet().stream().mapToInt(x -> (int) x.getValue().getUnitPrice()).sum();
1002
                    for (Map.Entry<String, InventoryItem> serialNumberInventoryItemEntry : serialNumberInventoryItemMap.entrySet()) {
1003
                        double amount = 0;
1004
                        LOGGER.info("Total DP Value {}", totalDpValue);
1005
                        if (AmountType.SLAB_FIXED.equals(itemCriteriaPayout.getAmountType())) {
1006
                            amount = (eligiblePayoutValue * serialNumberInventoryItemEntry.getValue().getUnitPrice()) / totalDpValue;
1007
                            LOGGER.info("Amount - {}", amount);
1008
                            //Fixed slab should be treated as fixed after payout
1009
                        } else {
1010
                            amount = eligiblePayoutValue;
1011
                            //Fixed slab has already taken care of that amount;
1012
                            if (serialNumberPaid.containsKey(serialNumberInventoryItemEntry.getKey())) {
1013
                                amount = amount - serialNumberPaid.get(serialNumberInventoryItemEntry.getKey());
1014
                            }
1015
                        }
1016
                        LOGGER.info("Amount - {}", amount);
1017
                        //ignore reasonably small
1018
                        if (amount < Utils.DOUBLE_EPSILON) continue;
1019
                        AmountModel amountModel = new AmountModel();
1020
                        amountModel.setAmountType(itemCriteriaPayout.getAmountType());
1021
                        amountModel.setAmount(amount);
1022
                        amountModel.setDiscount(createOfferRequest.isDiscount());
1023
                        InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(serialNumberInventoryItemEntry.getValue());
1024
                        double rolloutAmount = inventoryPayoutModel.getRolloutAmount(amountModel);
1025
                        totalRolloutAmount += rolloutAmount;
1026
 
1027
                        OfferPayout offerPayout = new OfferPayout(fofoId, createOfferRequest.getId(), criteriaId, amount, serialNumberInventoryItemEntry.getKey(), rolloutAmount, SchemePayoutStatus.CREDITED, createOfferRequest.getDescription(), LocalDateTime.now());
1028
                        offerPayoutRepository.persist(offerPayout);
1029
                    }
1030
                    walletService.addAmountToWallet((int) fofoId, createOfferRequest.getId(), WalletReferenceType.ADDITIONAL_SCHEME, createOfferRequest.getDescription(), (float) totalRolloutAmount, LocalDateTime.now());
1031
                }
31920 amit.gupta 1032
            }
1033
        }
1034
        Offer offer = offerRepository.selectById(createOfferRequest.getId());
1035
        offer.setProcessedTimestamp(LocalDateTime.now());
1036
    }
32064 amit.gupta 1037
 
32795 amit.gupta 1038
    private void rollbackPayout(int fofoId, int offerId, List<OfferPayout> partnerPayouts, Set<String> returnedSerialNumbers) throws ProfitMandiBusinessException {
1039
        LOGGER.info("Rollback payout called for offerId {}", offerId);
1040
        float amountToRollback = 0;
1041
        int totalImeis = 0;
1042
        for (OfferPayout partnerPayout : partnerPayouts) {
1043
            LOGGER.info("serialNumberInventoryItemMap - {}", returnedSerialNumbers);
1044
            LOGGER.info("Serial Number - {}", partnerPayout.getSerialNumber());
1045
            if (returnedSerialNumbers.contains(partnerPayout.getSerialNumber()) && partnerPayout.getStatus().equals(SchemePayoutStatus.CREDITED)) {
1046
                partnerPayout.setRejectTimestamp(LocalDateTime.now());
1047
                partnerPayout.setStatus(SchemePayoutStatus.REJECTED);
1048
                amountToRollback += partnerPayout.getAmount();
1049
                totalImeis += 1;
1050
            }
1051
        }
1052
        if (amountToRollback > 0) {
1053
            LOGGER.info("Amount to Rollback - {}", amountToRollback);
1054
            walletService.rollbackAmountFromWallet(fofoId, amountToRollback, offerId, WalletReferenceType.ADDITIONAL_SCHEME, "Stock Returned, total " + totalImeis + "pc(s)", LocalDateTime.now());
1055
        }
1056
    }
1057
 
32064 amit.gupta 1058
    private Map<String, InventoryItem> getInventoryItemMap(int fofoId, Map<String, LineItem> serialNumberMap) {
1059
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectBySerialNumbers(serialNumberMap.keySet());
32345 amit.gupta 1060
        inventoryItems = inventoryItems.stream().filter(x -> x.getFofoId() == fofoId).collect(Collectors.toList());
1061
        Map<String, InventoryItem> inventoryItemMap = inventoryItems.stream().collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x, (u, v) -> v.getCreateTimestamp().isAfter(u.getCreateTimestamp()) ? v : u));
32064 amit.gupta 1062
        return inventoryItemMap;
1063
    }
27877 amit.gupta 1064
}