Subversion Repositories SmartDukaan

Rev

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