Subversion Repositories SmartDukaan

Rev

Rev 35205 | Rev 35595 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 35205 Rev 35394
Line 24... Line 24...
24
import com.spice.profitmandi.dao.entity.warehouse.WarehouseScan;
24
import com.spice.profitmandi.dao.entity.warehouse.WarehouseScan;
25
import com.spice.profitmandi.dao.enumuration.catalog.AchievementType;
25
import com.spice.profitmandi.dao.enumuration.catalog.AchievementType;
26
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
26
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
27
import com.spice.profitmandi.dao.enumuration.catalog.OfferSchemeType;
27
import com.spice.profitmandi.dao.enumuration.catalog.OfferSchemeType;
28
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
28
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
29
import com.spice.profitmandi.dao.model.AmountModel;
29
import com.spice.profitmandi.dao.model.*;
30
import com.spice.profitmandi.dao.model.CreateOfferRequest;
-
 
31
import com.spice.profitmandi.dao.model.ItemCriteriaPayout;
-
 
32
import com.spice.profitmandi.dao.model.OfferRowModel;
-
 
33
import com.spice.profitmandi.dao.repository.catalog.*;
30
import com.spice.profitmandi.dao.repository.catalog.*;
34
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
31
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
35
import com.spice.profitmandi.dao.repository.fofo.ActivatedImeiRepository;
32
import com.spice.profitmandi.dao.repository.fofo.ActivatedImeiRepository;
36
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
33
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
37
import com.spice.profitmandi.dao.repository.fofo.OfferPayoutRepository;
34
import com.spice.profitmandi.dao.repository.fofo.OfferPayoutRepository;
Line 70... Line 67...
70
import java.util.stream.Collectors;
67
import java.util.stream.Collectors;
71
 
68
 
72
@Component
69
@Component
73
public class OfferServiceImpl implements OfferService {
70
public class OfferServiceImpl implements OfferService {
74
 
71
 
-
 
72
    private static final Logger LOGGER = LogManager.getLogger(OfferServiceImpl.class);
-
 
73
 
-
 
74
    // Constants
75
    private static final List<String> targets = Arrays.asList("Target 1", "Target 2", "Target 3", "Target 4",
75
    private static final List<String> TARGETS = Arrays.asList("Target 1", "Target 2", "Target 3", "Target 4", "Target 5");
76
            "Target 5");
76
    private static final int STOCK_AGEING_THRESHOLD_DAYS = 300;
77
 
77
 
-
 
78
    // Dependencies - Core
78
    @Autowired
79
    @Autowired
79
    private Gson gson;
80
    private Gson gson;
80
 
81
 
81
    @Autowired
82
    @Autowired
82
    NotificationService notificationService;
83
    private CacheManager oneDayCacheManager;
83
 
84
 
-
 
85
    // Dependencies - Repositories
84
    @Autowired
86
    @Autowired
85
    private OfferRepository offerRepository;
87
    private OfferRepository offerRepository;
86
 
88
 
87
    @Autowired
89
    @Autowired
88
    private RetailerService retailerService;
90
    private OfferPayoutRepository offerPayoutRepository;
89
    @Autowired
-
 
90
    PriceCircularService priceCircularService;
-
 
91
 
91
 
92
    @Autowired
92
    @Autowired
93
    OfferPayoutRepository offerPayoutRepository;
93
    private OfferTargetSlabRepository offerTargetSlabRepository;
94
 
94
 
95
    @Autowired
95
    @Autowired
96
    private ItemCriteriaRepository itemCriteriaRepository;
96
    private ItemCriteriaRepository itemCriteriaRepository;
97
 
97
 
98
    @Autowired
98
    @Autowired
Line 100... Line 100...
100
 
100
 
101
    @Autowired
101
    @Autowired
102
    private TagListingRepository tagListingRepository;
102
    private TagListingRepository tagListingRepository;
103
 
103
 
104
    @Autowired
104
    @Autowired
105
    private OfferTargetSlabRepository offerTargetSlabRepository;
-
 
106
    @Autowired
-
 
107
    private FofoStoreRepository fofoStoreRepository;
105
    private FofoStoreRepository fofoStoreRepository;
108
 
106
 
109
    @Autowired
107
    @Autowired
110
    CacheManager oneDayCacheManager;
-
 
111
 
-
 
112
 
-
 
113
    private static final Logger LOGGER = LogManager.getLogger(OfferServiceImpl.class);
-
 
114
 
-
 
115
    @Autowired
-
 
116
    private ActivatedImeiRepository activatedImeiRepository;
108
    private ActivatedImeiRepository activatedImeiRepository;
-
 
109
 
117
    @Autowired
110
    @Autowired
118
    private WarehouseScanRepository warehouseScanRepository;
111
    private WarehouseScanRepository warehouseScanRepository;
119
 
112
 
120
    @Autowired
113
    @Autowired
121
    private WarehouseInventoryItemRepository warehouseInventoryItemRepository;
114
    private WarehouseInventoryItemRepository warehouseInventoryItemRepository;
122
 
115
 
123
    @Autowired
116
    @Autowired
124
    private LineItemImeisRepository lineItemImeisRepository;
117
    private LineItemImeisRepository lineItemImeisRepository;
-
 
118
 
125
    @Autowired
119
    @Autowired
126
    private InventoryItemRepository inventoryItemRepository;
120
    private InventoryItemRepository inventoryItemRepository;
127
 
121
 
-
 
122
    @Autowired
-
 
123
    private OfferEligibleImeiRepository offerEligibleImeiRepository;
-
 
124
 
-
 
125
    // Dependencies - Services
-
 
126
    @Autowired
-
 
127
    private NotificationService notificationService;
-
 
128
 
-
 
129
    @Autowired
-
 
130
    private RetailerService retailerService;
-
 
131
 
-
 
132
    @Autowired
-
 
133
    private PriceCircularService priceCircularService;
-
 
134
 
-
 
135
    @Autowired
-
 
136
    private WalletService walletService;
-
 
137
 
128
    @Override
138
    @Override
129
    public void addOfferService(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
139
    public void addOfferService(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
130
        LOGGER.info("createOfferRequest  -- {}", createOfferRequest);
140
        LOGGER.info("createOfferRequest  -- {}", createOfferRequest);
131
        this.createOffer(createOfferRequest);
141
        this.createOffer(createOfferRequest);
132
        this.createTargetSlabs(createOfferRequest);
142
        this.createTargetSlabs(createOfferRequest);
Line 154... Line 164...
154
        createOfferRequest.setId(offer.getId());
164
        createOfferRequest.setId(offer.getId());
155
    }
165
    }
156
 
166
 
157
    @Override
167
    @Override
158
    public List<CreateOfferRequest> getPublishedOffers(int fofoId, YearMonth yearMonth) throws ProfitMandiBusinessException {
168
    public List<CreateOfferRequest> getPublishedOffers(int fofoId, YearMonth yearMonth) throws ProfitMandiBusinessException {
159
        List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(yearMonth).get(fofoId);
169
        Map<Integer, List<Offer>> publishedMapByPartner = offerRepository.selectAllPublishedMapByPartner(yearMonth);
-
 
170
        List<Offer> publishedOffers = publishedMapByPartner != null ? publishedMapByPartner.get(fofoId) : null;
160
        List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
171
        List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
161
        if (publishedOffers != null) {
172
        if (publishedOffers != null) {
162
            for (Offer offer : publishedOffers) {
173
            for (Offer offer : publishedOffers) {
163
                CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
174
                CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
164
                createOfferRequests.add(createOfferRequest);
175
                createOfferRequests.add(createOfferRequest);
Line 170... Line 181...
170
    }
181
    }
171
 
182
 
172
    private void setCriteriaPayoutAchieved(int fofoId, CreateOfferRequest createOfferRequest) {
183
    private void setCriteriaPayoutAchieved(int fofoId, CreateOfferRequest createOfferRequest) {
173
        Map<Integer, Long> criteriaTransactionMap = null;
184
        Map<Integer, Long> criteriaTransactionMap = null;
174
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
185
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
175
            criteriaTransactionMap = offerRepository.getPartnerWisePurchaseSum(createOfferRequest).get(fofoId);
186
            Map<Integer, Map<Integer, Long>> partnerWiseMap = offerRepository.getPartnerWisePurchaseSum(createOfferRequest);
-
 
187
            criteriaTransactionMap = partnerWiseMap != null ? partnerWiseMap.get(fofoId) : null;
176
        } else {
188
        } else {
177
            criteriaTransactionMap = offerRepository.getPartnerWiseSalesSum(createOfferRequest).get(fofoId);
189
            Map<Integer, Map<Integer, Long>> partnerWiseMap = offerRepository.getPartnerWiseSalesSum(createOfferRequest);
-
 
190
            criteriaTransactionMap = partnerWiseMap != null ? partnerWiseMap.get(fofoId) : null;
178
        }
191
        }
179
        LOGGER.info("I am here ------- {}", createOfferRequest.getId());
192
        LOGGER.info("I am here ------- {}", createOfferRequest.getId());
180
        List<com.spice.profitmandi.dao.model.ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest
193
        List<com.spice.profitmandi.dao.model.ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest
181
                .getTargetSlabs().get(0).getItemCriteriaPayouts();
194
                .getTargetSlabs().get(0).getItemCriteriaPayouts();
182
 
195
 
Line 239... Line 252...
239
    @Cacheable(value = "partnerOffers", cacheManager = "thirtyMinsTimeOutCacheManager")
252
    @Cacheable(value = "partnerOffers", cacheManager = "thirtyMinsTimeOutCacheManager")
240
    public CreateOfferRequest getOffer(int fofoId, int offerId) throws ProfitMandiBusinessException {
253
    public CreateOfferRequest getOffer(int fofoId, int offerId) throws ProfitMandiBusinessException {
241
        Offer offer = offerRepository.selectById(offerId);
254
        Offer offer = offerRepository.selectById(offerId);
242
        CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
255
        CreateOfferRequest createOfferRequest = this.getCreateOfferRequest(offer);
243
        if (fofoId > 0) {
256
        if (fofoId > 0) {
244
            this.setCriteriaPayoutAchieved(fofoId, createOfferRequest);
257
            createOfferRequest.setCriteriaQtyAmountModel(this.getCriteriaQtyAmounModelMap(createOfferRequest, fofoId));
245
        }
258
        }
246
 
259
 
247
        return createOfferRequest;
260
        return createOfferRequest;
248
    }
261
    }
249
 
262
 
Line 281... Line 294...
281
        for (com.spice.profitmandi.dao.model.ItemCriteriaPayout itemCriteriaPayout : createOfferRequest.getTargetSlabs()
294
        for (com.spice.profitmandi.dao.model.ItemCriteriaPayout itemCriteriaPayout : createOfferRequest.getTargetSlabs()
282
                .get(0).getItemCriteriaPayouts()) {
295
                .get(0).getItemCriteriaPayouts()) {
283
            itemCriteriaPayout.setNextSlab(itemCriteriaPayout.getPayoutSlabs().get(0));
296
            itemCriteriaPayout.setNextSlab(itemCriteriaPayout.getPayoutSlabs().get(0));
284
        }
297
        }
285
        return createOfferRequest;
298
        return createOfferRequest;
286
 
-
 
287
    }
299
    }
288
 
300
 
289
    @Autowired
-
 
290
    private WalletService walletService;
-
 
291
 
-
 
292
    @Override
301
    @Override
293
    public void reverseAdditionalSelloutSchemes(List<InventoryItem> inventoryItems, String reversalReason) throws ProfitMandiBusinessException {
302
    public void reverseAdditionalSelloutSchemes(List<InventoryItem> inventoryItems, String reversalReason) throws ProfitMandiBusinessException {
294
        Map<Integer, List<InventoryItem>> fofoInventoryItemsMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getFofoId()));
303
        Map<Integer, List<InventoryItem>> fofoInventoryItemsMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getFofoId()));
295
        for (Map.Entry<Integer, List<InventoryItem>> fofoInventoryItemsEntry : fofoInventoryItemsMap.entrySet()) {
304
        for (Map.Entry<Integer, List<InventoryItem>> fofoInventoryItemsEntry : fofoInventoryItemsMap.entrySet()) {
296
            int fofoId = fofoInventoryItemsEntry.getKey();
305
            int fofoId = fofoInventoryItemsEntry.getKey();
297
            List<InventoryItem> partnerInventoryItems = fofoInventoryItemsEntry.getValue();
306
            List<InventoryItem> partnerInventoryItems = fofoInventoryItemsEntry.getValue();
298
            List<OfferPayout> offerPayouts = new ArrayList<>();
307
            List<OfferPayout> offerPayouts = new ArrayList<>();
299
            LOGGER.info("Reversing schemes for fofoId {}, InventoryItems {}", fofoId, inventoryItems);
308
            LOGGER.info("Reversing schemes for fofoId {}, InventoryItems {}", fofoId, inventoryItems);
300
            //As of now we are not handling non-serialised items
309
            //As of now we are not handling non-serialised items
301
            inventoryItems = inventoryItems.stream().filter(x -> x.getSerialNumber() != null).collect(Collectors.toList());
310
            List<InventoryItem> serializedItems = partnerInventoryItems.stream().filter(x -> x.getSerialNumber() != null).collect(Collectors.toList());
302
            if (inventoryItems.size() > 0) {
311
            if (serializedItems.size() > 0) {
303
 
-
 
304
                for (InventoryItem inventoryItem : inventoryItems) {
312
                // Batch fetch: collect all serial numbers and fetch in one call per fofoId
-
 
313
                Set<String> serialNumbers = serializedItems.stream().map(InventoryItem::getSerialNumber).collect(Collectors.toSet());
305
                    offerPayouts.addAll(offerPayoutRepository.selectAllBySerialNumber(inventoryItem.getFofoId(), inventoryItem.getSerialNumber())
314
                offerPayouts = offerPayoutRepository.selectAllBySerialNumbers(fofoId, serialNumbers)
306
                            .stream()
315
                        .stream()
307
                            .filter(x -> x.getRejectTimestamp() == null)
316
                        .filter(x -> x.getRejectTimestamp() == null)
308
                            .collect(Collectors.toList()));
317
                        .collect(Collectors.toList());
309
                }
-
 
310
                for (OfferPayout offerPayout : offerPayouts) {
318
                for (OfferPayout offerPayout : offerPayouts) {
311
                    offerPayout.setStatus(SchemePayoutStatus.REJECTED);
319
                    offerPayout.setStatus(SchemePayoutStatus.REJECTED);
312
                    offerPayout.setRejectTimestamp(LocalDateTime.now());
320
                    offerPayout.setRejectTimestamp(LocalDateTime.now());
313
                }
321
                }
314
                Map<Long, Double> offerPayoutAmountMap = offerPayouts.stream().collect(Collectors.groupingBy(x -> x.getOfferId(), Collectors.summingDouble(x -> x.getAmount())));
322
                Map<Long, Double> offerPayoutAmountMap = offerPayouts.stream().collect(Collectors.groupingBy(x -> x.getOfferId(), Collectors.summingDouble(x -> x.getAmount())));
Line 325... Line 333...
325
    }
333
    }
326
 
334
 
327
    private void createTargetSlabs(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
335
    private void createTargetSlabs(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
328
        List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = createOfferRequest.getTargetSlabs().stream()
336
        List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = createOfferRequest.getTargetSlabs().stream()
329
                .filter(x -> x.validate()).collect(Collectors.toList());
337
                .filter(x -> x.validate()).collect(Collectors.toList());
330
        if (targetSlabs.size() >= 0) {
338
        if (!targetSlabs.isEmpty()) {
331
            Collections.sort(targetSlabs);
339
            Collections.sort(targetSlabs);
332
            for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
340
            for (com.spice.profitmandi.dao.model.TargetSlab targetSlab : targetSlabs) {
333
                if (targetSlab.validate()) {
341
                if (targetSlab.validate()) {
334
                    List<ItemCriteriaPayout> itemCriteriaPayouts = targetSlab.getItemCriteriaPayouts();
342
                    List<ItemCriteriaPayout> itemCriteriaPayouts = targetSlab.getItemCriteriaPayouts();
335
                    for (ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
343
                    for (ItemCriteriaPayout itemCriteriaPayout : itemCriteriaPayouts) {
Line 370... Line 378...
370
 
378
 
371
    }
379
    }
372
 
380
 
373
    @Override
381
    @Override
374
    public List<CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, int catalogId) throws ProfitMandiBusinessException {
382
    public List<CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, int catalogId) throws ProfitMandiBusinessException {
375
        List<Offer> publishedOffers = offerRepository.selectAllPublishedMapByPartner(YearMonth.from(date)).get(fofoId);
383
        Map<Integer, List<Offer>> publishedMapByPartner = offerRepository.selectAllPublishedMapByPartner(YearMonth.from(date));
-
 
384
        List<Offer> publishedOffers = publishedMapByPartner != null ? publishedMapByPartner.get(fofoId) : null;
376
        List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
385
        List<CreateOfferRequest> createOfferRequests = new ArrayList<>();
377
        if (publishedOffers != null) {
386
        if (publishedOffers != null) {
378
            for (Offer offer : publishedOffers) {
387
            for (Offer offer : publishedOffers) {
379
                boolean found = false;
388
                boolean found = false;
380
                List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = offerTargetSlabRepository
389
                List<com.spice.profitmandi.dao.model.TargetSlab> targetSlabs = offerTargetSlabRepository
Line 510... Line 519...
510
 
519
 
511
    private void printIterator(XSSFSheet sheet) {
520
    private void printIterator(XSSFSheet sheet) {
512
        Iterator<Row> rowIterator = sheet.iterator();
521
        Iterator<Row> rowIterator = sheet.iterator();
513
        while (rowIterator.hasNext()) {
522
        while (rowIterator.hasNext()) {
514
            Row row = rowIterator.next();
523
            Row row = rowIterator.next();
515
            // For each row, iterate through all the columns
524
            StringBuilder rowContent = new StringBuilder();
516
            Iterator<Cell> cellIterator = row.cellIterator();
525
            Iterator<Cell> cellIterator = row.cellIterator();
517
 
526
 
518
            while (cellIterator.hasNext()) {
527
            while (cellIterator.hasNext()) {
519
                Cell cell = cellIterator.next();
528
                Cell cell = cellIterator.next();
520
                // Check the cell type and format accordingly
-
 
521
                switch (cell.getCellType()) {
529
                switch (cell.getCellType()) {
522
                    case Cell.CELL_TYPE_NUMERIC:
530
                    case Cell.CELL_TYPE_NUMERIC:
523
                        System.out.print(cell.getNumericCellValue() + "t");
531
                        rowContent.append(cell.getNumericCellValue()).append("\t");
524
                        break;
532
                        break;
525
                    case Cell.CELL_TYPE_STRING:
533
                    case Cell.CELL_TYPE_STRING:
526
                        System.out.print(cell.getStringCellValue() + "t");
534
                        rowContent.append(cell.getStringCellValue()).append("\t");
527
                        break;
535
                        break;
528
                }
536
                }
529
            }
537
            }
530
            System.out.println("");
538
            LOGGER.debug("Row content: {}", rowContent);
531
        }
539
        }
532
    }
540
    }
533
 
541
 
534
    @Override
542
    @Override
535
    public Map<Integer, CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, String brand) {
543
    public Map<Integer, CreateOfferRequest> getPublishedOffers(LocalDate date, int fofoId, String brand) {
Line 645... Line 653...
645
            rollout = amountModel.getAmount() * (100 / (100 + inventoryPayoutModel.getPercentageAmount()));
653
            rollout = amountModel.getAmount() * (100 / (100 + inventoryPayoutModel.getPercentageAmount()));
646
        }
654
        }
647
        return rollout;
655
        return rollout;
648
    }
656
    }
649
 
657
 
650
    @Autowired
658
    @Override
-
 
659
    public Map<Integer, QtyAmountModel> getCriteriaQtyAmounModelMap(CreateOfferRequest createOfferRequest, int fofoId) throws ProfitMandiBusinessException {
-
 
660
        final Map<String, LocalDateTime> activatedImeisActivationDateMap;
-
 
661
        Map<Integer, QtyAmountModel> qtyAmountMap;
-
 
662
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
-
 
663
            qtyAmountMap = getCriteriaQtyAmountModelMapForSellin(createOfferRequest, fofoId);
-
 
664
        } else {
-
 
665
            qtyAmountMap = getCriteriaQtyAmountModelMapForSelloutAndActivation(createOfferRequest, fofoId);
-
 
666
        }
-
 
667
        LOGGER.info("Qty Amount Map {}", qtyAmountMap);
-
 
668
        return qtyAmountMap;
-
 
669
    }
-
 
670
 
-
 
671
    private Map<Integer, QtyAmountModel> getCriteriaQtyAmountModelMapForSellin(CreateOfferRequest createOfferRequest, int fofoId) throws ProfitMandiBusinessException {
-
 
672
        Map<Integer, QtyAmountModel> criteriaQtyAmountMap = new HashMap<>();
-
 
673
        List<ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts();
-
 
674
        Map<Integer, ItemCriteriaPayout> itemCriteriaPayoutMap = itemCriteriaPayouts.stream().collect(Collectors.toMap(x -> x.getItemCriteria().getId(), x -> x));
-
 
675
 
-
 
676
        Map<Integer, List<Order>> criteriaOrdersMap = offerRepository.getPartnerWiseSellin(fofoId, createOfferRequest, true);
-
 
677
 
-
 
678
 
-
 
679
        List<Order> baseCriteriaOrders = null;
-
 
680
        if (criteriaOrdersMap.get(0) != null && criteriaOrdersMap.get(0).size() > 0) {
-
 
681
            baseCriteriaOrders = criteriaOrdersMap.get(0);
-
 
682
        }
-
 
683
 
-
 
684
 
-
 
685
        Integer userBaseQty = null;
-
 
686
        Integer userBaseValue = null;
-
 
687
        if (baseCriteriaOrders != null) {
-
 
688
            userBaseQty = baseCriteriaOrders.stream().collect(Collectors.summingInt(x -> (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty())));
-
 
689
            userBaseValue = baseCriteriaOrders.stream().collect(Collectors.summingInt(x ->
-
 
690
                    Math.round(x.getLineItem().getUnitPrice() * (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty()))
-
 
691
            ));
-
 
692
            criteriaQtyAmountMap.put(0, new QtyAmountModel(userBaseQty, userBaseValue));
-
 
693
 
-
 
694
        }
-
 
695
 
-
 
696
        LOGGER.info("Processing sellin");
-
 
697
        for (ItemCriteriaPayout itemCriteriaPayout : createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts()) {
-
 
698
            int criteriaId = itemCriteriaPayout.getItemCriteria().getId();
-
 
699
 
-
 
700
            QtyAmountModel qtyAmountModel = new QtyAmountModel(0, 0);
-
 
701
            criteriaQtyAmountMap.put(itemCriteriaPayout.getItemCriteria().getId(), qtyAmountModel);
-
 
702
 
-
 
703
            List<Order> orders = criteriaOrdersMap.get(criteriaId);
-
 
704
            int totalQty = orders.stream().collect(Collectors.summingInt(x -> (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty())));
-
 
705
            int totalValue = orders.stream().collect(Collectors.summingInt(x -> Math.round(x.getLineItem().
-
 
706
                    getUnitPrice() * (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty()))));
-
 
707
            int totalBaseQty = totalQty;
-
 
708
            int totalBaseValue = totalValue;
-
 
709
            criteriaQtyAmountMap.put(0, new QtyAmountModel(userBaseQty==null? 0 : userBaseQty, userBaseValue==null?0 : userBaseValue));
-
 
710
            if (userBaseQty != null) {
-
 
711
                totalBaseQty = userBaseQty;
-
 
712
                totalBaseValue = userBaseValue;
-
 
713
            }
-
 
714
 
-
 
715
            int purchasedValue;
-
 
716
            if (createOfferRequest.getTargetType().equals(AchievementType.VALUE)) {
-
 
717
                purchasedValue = totalBaseValue;
-
 
718
            } else {
-
 
719
                purchasedValue = totalBaseQty;
-
 
720
            }
-
 
721
            qtyAmountModel.setQty(totalBaseQty);
-
 
722
            qtyAmountModel.setAmount(totalBaseValue);
-
 
723
 
-
 
724
            PayoutSlab eligibleSlab = null;
-
 
725
 
-
 
726
            for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
-
 
727
                if (payoutSlab.getOnwardsAmount() <= purchasedValue) {
-
 
728
                    eligibleSlab = payoutSlab;
-
 
729
                } else {
-
 
730
                    break;
-
 
731
                }
-
 
732
            }
-
 
733
            double finalPayout = 0;
-
 
734
            if(eligibleSlab != null) {
-
 
735
                eligibleSlab.setSelected(true);
-
 
736
                float eligiblePayoutValue = eligibleSlab.getPayoutAmount();
-
 
737
                if (AmountType.PERCENTAGE.equals(itemCriteriaPayout.getAmountType())) {
-
 
738
                    finalPayout = (eligiblePayoutValue * purchasedValue) / 100;
-
 
739
                } else if (AmountType.FIXED.equals(itemCriteriaPayout.getAmountType())) {
-
 
740
                    finalPayout = eligiblePayoutValue * purchasedValue;
-
 
741
                } else {
-
 
742
                    finalPayout = eligiblePayoutValue;
-
 
743
                }
-
 
744
            }
-
 
745
            qtyAmountModel.setFinalPayout(finalPayout);
-
 
746
            createOfferRequest.setCriteriaQtyAmountModel(criteriaQtyAmountMap);
-
 
747
        }
-
 
748
        return criteriaQtyAmountMap;
-
 
749
    }
-
 
750
 
-
 
751
    private Map<Integer, QtyAmountModel> getCriteriaQtyAmountModelMapForSelloutAndActivation(CreateOfferRequest createOfferRequest, int fofoId) {
-
 
752
        Map<Integer, Map<Integer, List<FofoOrderItem>>> criteriaPartnerwiseTertiary = offerRepository.getCriteriaWisePartnerTertiary(createOfferRequest, fofoId);
-
 
753
        Map<Integer, QtyAmountModel> qtyAmountMap;
-
 
754
        final Map<String, LocalDateTime> activatedImeisActivationDateMap;
-
 
755
        qtyAmountMap = new HashMap<>();
-
 
756
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.ACTIVATION)) {
651
    OfferEligibleImeiRepository offerEligibleImeiRepository;
757
            //All Serialnumbers for all eligible retailers
-
 
758
            List<String> serialNumbers = criteriaPartnerwiseTertiary.entrySet().stream().flatMap(x -> x.getValue().entrySet().stream().flatMap(foiList -> foiList.getValue().stream()))
-
 
759
                    .flatMap(y -> y.getFofoLineItems().stream()).filter(fli -> fli.getSerialNumber() != null)
-
 
760
                    .map(x -> x.getSerialNumber()).collect(Collectors.toList());
-
 
761
            if (serialNumbers.size() > 0) {
-
 
762
            /*if (imeisAllowedManually != null) {
-
 
763
                serialNumbers = serialNumbers.stream().filter(x -> imeisAllowedManually.contains(x)).collect(Collectors.toList());
-
 
764
            }*/
-
 
765
                activatedImeisActivationDateMap = activatedImeiRepository.selectBySerialNumbers(serialNumbers).stream()
-
 
766
                        .filter(x -> createOfferRequest.isWithinRange(x.getActivationTimestamp()))
-
 
767
                        .collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x.getActivationTimestamp()));
-
 
768
            } else {
-
 
769
                activatedImeisActivationDateMap = null;
-
 
770
            }
-
 
771
        } else {
-
 
772
            activatedImeisActivationDateMap = null;
-
 
773
        }
-
 
774
 
-
 
775
        QtyAmountModel qtyAmountModel = null;
-
 
776
        if (createOfferRequest.isBaseCriteria()) {
-
 
777
            List<FofoOrderItem> fofoOrderItems = criteriaPartnerwiseTertiary.get(0).get(fofoId);
-
 
778
            int totalBaseQty = fofoOrderItems == null ? 0 : fofoOrderItems.stream().filter(x->createOfferRequest.isWithinRange(x.getCreateTimestamp())).collect(Collectors.summingInt(x -> (x.getQuantity())));
-
 
779
            int totalBaseValue = fofoOrderItems == null ? 0 : fofoOrderItems.stream().filter(x->createOfferRequest.isWithinRange(x.getCreateTimestamp())).mapToInt(x -> (Math.round(x.getDp())) * x.getQuantity()).sum();
-
 
780
            qtyAmountModel = new QtyAmountModel(totalBaseQty, totalBaseValue);
-
 
781
            if (createOfferRequest.getSchemeType().equals(OfferSchemeType.ACTIVATION)) {
-
 
782
                Map<Integer, Integer> inventoryItemValueMap = new HashMap<>();
-
 
783
                for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
-
 
784
                    fofoOrderItem.getFofoLineItems().stream().filter(x -> x.getSerialNumber() != null).forEach(
-
 
785
                            lineItem -> {
-
 
786
                                if (activatedImeisActivationDateMap == null || activatedImeisActivationDateMap.containsKey(lineItem.getSerialNumber())) {
-
 
787
                                    inventoryItemValueMap.put(lineItem.getInventoryItemId(), (int) fofoOrderItem.getDp());
-
 
788
                                }
-
 
789
                            }
-
 
790
                    );
-
 
791
                }
-
 
792
                qtyAmountModel.setActivationQty(inventoryItemValueMap.size());
-
 
793
                qtyAmountModel.setActivationAmount(inventoryItemValueMap.entrySet().stream().collect(Collectors.summingInt(x -> x.getValue())));
-
 
794
                qtyAmountMap.put(0, qtyAmountModel);
-
 
795
            }
-
 
796
        }
-
 
797
 
-
 
798
        //As of now eligible sale is considered to be without special criteria like brand/
-
 
799
        //CriteriaPayoutWise
-
 
800
        for (ItemCriteriaPayout itemCriteriaPayout : createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts()) {
-
 
801
            int criteriaId = itemCriteriaPayout.getItemCriteria().getId();
-
 
802
            Map<Integer, List<FofoOrderItem>> ordersMap = criteriaPartnerwiseTertiary.get(criteriaId);
-
 
803
            //Partywise iteration
-
 
804
            QtyAmountModel qtyAmountModel1 = new QtyAmountModel(0, 0);
-
 
805
            qtyAmountMap.put(criteriaId, qtyAmountModel1);
-
 
806
            List<FofoOrderItem> fofoOrderItems = ordersMap.get(fofoId) == null ? null : ordersMap.get(fofoId);
-
 
807
            if (fofoOrderItems != null && fofoOrderItems.size() > 0) {
-
 
808
                int totalQty = fofoOrderItems.stream().collect(Collectors.summingInt(x -> (x.getQuantity())));
-
 
809
                int totalValue = fofoOrderItems.stream().collect(Collectors.summingInt(x -> Math.round(x.getDp()) * (x.getQuantity())));
-
 
810
                int eligibleQty = totalQty;
-
 
811
                int eligibleValue = totalValue;
-
 
812
                qtyAmountModel1.setQty(totalQty);
-
 
813
                qtyAmountModel1.setAmount(totalValue);
-
 
814
                Map<FofoLineItem, Integer> lineItemValueMap = new HashMap<>();
-
 
815
                if (createOfferRequest.getSchemeType().equals(OfferSchemeType.ACTIVATION)) {
-
 
816
                    for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
-
 
817
                        fofoOrderItem.getFofoLineItems().stream().filter(x -> x.getSerialNumber() != null).forEach(
-
 
818
                                lineItem -> {
-
 
819
                                    if (activatedImeisActivationDateMap == null) {
-
 
820
                                        lineItemValueMap.put(lineItem, (int) fofoOrderItem.getDp());
-
 
821
 
-
 
822
                                    } else if (activatedImeisActivationDateMap.containsKey(lineItem.getSerialNumber())) {
-
 
823
                                        if (itemCriteriaPayout.isWithinRange(activatedImeisActivationDateMap.get(lineItem.getSerialNumber()))) {
-
 
824
                                            lineItemValueMap.put(lineItem, (int) fofoOrderItem.getDp());
-
 
825
                                        }
-
 
826
                                    }
-
 
827
                                }
-
 
828
                        );
-
 
829
                    }
-
 
830
                    eligibleQty = lineItemValueMap.size();
-
 
831
                    eligibleValue = lineItemValueMap.entrySet().stream().collect(Collectors.summingInt(x -> x.getValue()));
-
 
832
                    qtyAmountModel1.setActivationQty(eligibleQty);
-
 
833
                    qtyAmountModel1.setActivationAmount(eligibleValue);
-
 
834
                }
-
 
835
                qtyAmountMap.put(criteriaId, qtyAmountModel1);
-
 
836
 
-
 
837
                int eligibleBaseQty = eligibleQty;
-
 
838
                int eligibleBaseValue = eligibleValue;
-
 
839
                if (createOfferRequest.isBaseCriteria()) {
-
 
840
                    eligibleBaseQty = qtyAmountModel.getActivationQty();
-
 
841
                    eligibleBaseValue = (int) qtyAmountModel.getActivationAmount();
-
 
842
                }
-
 
843
 
-
 
844
 
-
 
845
                int eligibleSale = eligibleBaseValue;
-
 
846
                int eligibleCriteriaSale = eligibleValue;
-
 
847
                int eligibleCriteriaSaleDp = eligibleValue;
-
 
848
 
-
 
849
                if (createOfferRequest.getTargetType().equals(AchievementType.QUANTITY)) {
-
 
850
                    eligibleSale = eligibleBaseQty;
-
 
851
                    eligibleCriteriaSale = eligibleQty;
-
 
852
                }
-
 
853
 
-
 
854
                float eligiblePayoutValue = 0;
-
 
855
                double finalPayout = 0;
-
 
856
 
-
 
857
                PayoutSlab eligibleSlab = null;
-
 
858
                for (PayoutSlab slab : itemCriteriaPayout.getPayoutSlabs()) {
-
 
859
                    if (slab.getOnwardsAmount() <= eligibleSale) {
-
 
860
                        eligibleSlab = slab;
-
 
861
                    } else {
-
 
862
                        break;            // slabs beyond this don't qualify
-
 
863
                    }
-
 
864
                }
-
 
865
                if(eligibleSlab != null) {
-
 
866
                    eligibleSlab.setSelected(true);
-
 
867
                    LOGGER.info("Eligible Slab {}", eligibleSlab);
-
 
868
                }
-
 
869
 
-
 
870
                if (AmountType.PERCENTAGE.equals(itemCriteriaPayout.getAmountType())) {
-
 
871
                    finalPayout = (eligiblePayoutValue * eligibleCriteriaSaleDp) / 100;
-
 
872
                } else if (AmountType.FIXED.equals(itemCriteriaPayout.getAmountType())) {
-
 
873
                    finalPayout = eligiblePayoutValue * eligibleCriteriaSale;
-
 
874
                } else {
-
 
875
                    finalPayout = eligiblePayoutValue;
-
 
876
                }
-
 
877
                qtyAmountModel1.setFinalPayout(finalPayout);
-
 
878
                LOGGER.info("Final Payout - {}", finalPayout);
-
 
879
            }
-
 
880
 
-
 
881
 
-
 
882
        }
-
 
883
        return qtyAmountMap;
-
 
884
    }
652
 
885
 
653
    @Override
886
    @Override
654
    public void processActivationtOffer(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
887
    public void processActivationtOffer(CreateOfferRequest createOfferRequest) throws ProfitMandiBusinessException {
655
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByOfferId(createOfferRequest.getId());
888
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByOfferId(createOfferRequest.getId());
656
        List<ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts();
889
        List<ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts();
Line 832... Line 1065...
832
                        double amount = 0;
1065
                        double amount = 0;
833
                        if (AmountType.SLAB_FIXED.equals(itemCriteriaPayout.getAmountType())) {
1066
                        if (AmountType.SLAB_FIXED.equals(itemCriteriaPayout.getAmountType())) {
834
                            amount = (eligiblePayoutValue * lineItemValueEntry.getValue()) / totalDpValue;
1067
                            amount = (eligiblePayoutValue * lineItemValueEntry.getValue()) / totalDpValue;
835
                        } else {
1068
                        } else {
836
                            if (ageingSummaryModelsMap.containsKey(fofoLineItem.getSerialNumber())) {
1069
                            if (ageingSummaryModelsMap.containsKey(fofoLineItem.getSerialNumber())) {
837
                                if (ageingSummaryModelsMap.get(fofoLineItem.getSerialNumber()).isAgedAbove(300)) {
1070
                                if (ageingSummaryModelsMap.get(fofoLineItem.getSerialNumber()).isAgedAbove(STOCK_AGEING_THRESHOLD_DAYS)) {
838
                                    continue;
1071
                                    continue;
839
                                }
1072
                                }
840
                            }
1073
                            }
841
                            amount = eligiblePayoutValue;
1074
                            amount = eligiblePayoutValue;
842
                        }
1075
                        }
Line 1096... Line 1329...
1096
            if (partnerCriteria.getRegionIds().size() > 0) {
1329
            if (partnerCriteria.getRegionIds().size() > 0) {
1097
                sb.append("from ");
1330
                sb.append("from ");
1098
                sb.append(String.join(", ", partnerCriteria.getRegionIds().stream().map(x -> ProfitMandiConstants.WAREHOUSE_MAP.get(x)).collect(Collectors.toList())));
1331
                sb.append(String.join(", ", partnerCriteria.getRegionIds().stream().map(x -> ProfitMandiConstants.WAREHOUSE_MAP.get(x)).collect(Collectors.toList())));
1099
            }
1332
            }
1100
            if (partnerCriteria.getExcludeFofoIds() != null && partnerCriteria.getExcludeFofoIds().size() > 0) {
1333
            if (partnerCriteria.getExcludeFofoIds() != null && partnerCriteria.getExcludeFofoIds().size() > 0) {
1101
                sb.append("excluding ");
1334
                sb.append("<b>excluding</b> ");
1102
                appendPartnerCodes(partnerCriteria.getExcludeFofoIds(), sb);
1335
                appendPartnerCodes(partnerCriteria.getExcludeFofoIds(), sb);
1103
            }
1336
            }
1104
        }
1337
        }
1105
        return sb.toString();
1338
        return sb.toString();
1106
    }
1339
    }
Line 1109... Line 1342...
1109
    public ByteArrayOutputStream createCSVOfferReport(CreateOfferRequest createOfferRequest) throws Exception {
1342
    public ByteArrayOutputStream createCSVOfferReport(CreateOfferRequest createOfferRequest) throws Exception {
1110
        List<List<?>> listOfRows = new ArrayList<>();
1343
        List<List<?>> listOfRows = new ArrayList<>();
1111
        ByteArrayOutputStream baos = null;
1344
        ByteArrayOutputStream baos = null;
1112
        Collection<OfferRowModel> offerRowModels = offerRepository.getOfferRows(createOfferRequest);
1345
        Collection<OfferRowModel> offerRowModels = offerRepository.getOfferRows(createOfferRequest);
1113
        ItemCriteriaPayout itemCriteriaPayout = createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts().get(0);
1346
        ItemCriteriaPayout itemCriteriaPayout = createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts().get(0);
-
 
1347
        // Batch fetch all retailers once to avoid N+1 queries
-
 
1348
        Map<Integer, CustomRetailer> allRetailers = retailerService.getAllFofoRetailers();
1114
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
1349
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
1115
            for (OfferRowModel offerRowModel : offerRowModels) {
1350
            for (OfferRowModel offerRowModel : offerRowModels) {
1116
                CustomRetailer customRetailer = retailerService.getFofoRetailer(offerRowModel.getFofoId());
1351
                CustomRetailer customRetailer = allRetailers.get(offerRowModel.getFofoId());
1117
                listOfRows.add(Arrays.asList(
1352
                listOfRows.add(Arrays.asList(
1118
                        createOfferRequest.getId()
1353
                        createOfferRequest.getId()
1119
                        , createOfferRequest.getName()
1354
                        , createOfferRequest.getName()
1120
                        , createOfferRequest.getTargetType()
1355
                        , createOfferRequest.getTargetType()
1121
                        , createOfferRequest.getSchemeType()
1356
                        , createOfferRequest.getSchemeType()
Line 1166... Line 1401...
1166
                            , "Eligible IMEIs"
1401
                            , "Eligible IMEIs"
1167
                            , "Billing Pending Imeis"
1402
                            , "Billing Pending Imeis"
1168
                    ), listOfRows);
1403
                    ), listOfRows);
1169
        } else {
1404
        } else {
1170
            for (OfferRowModel offerRowModel : offerRowModels) {
1405
            for (OfferRowModel offerRowModel : offerRowModels) {
1171
                CustomRetailer customRetailer = retailerService.getFofoRetailer(offerRowModel.getFofoId());
1406
                CustomRetailer customRetailer = allRetailers.get(offerRowModel.getFofoId());
1172
                listOfRows.add(Arrays.asList(
1407
                listOfRows.add(Arrays.asList(
1173
                                createOfferRequest.getId()
1408
                                createOfferRequest.getId()
1174
                                , createOfferRequest.getName()
1409
                                , createOfferRequest.getName()
1175
                                , createOfferRequest.getTargetType()
1410
                                , createOfferRequest.getTargetType()
1176
                                , createOfferRequest.getSchemeType()
1411
                                , createOfferRequest.getSchemeType()