Subversion Repositories SmartDukaan

Rev

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

Rev 35334 Rev 35394
Line 466... Line 466...
466
                                list -> {
466
                                list -> {
467
                                    list.sort(Integer::compareTo); // sort ascending
467
                                    list.sort(Integer::compareTo); // sort ascending
468
                                    return list;
468
                                    return list;
469
                                })));
469
                                })));
470
 
470
 
-
 
471
        // Batch fetch all schemeItems for all filtered schemes at once
-
 
472
        Map<Integer, List<SchemeItem>> schemeItemsBySchemeId = schemeItemRepository.selectBySchemeIds(schemesMap.keySet())
-
 
473
                .stream().collect(Collectors.groupingBy(SchemeItem::getSchemeId));
-
 
474
 
-
 
475
        // Collect all catalogIds for batch fetching items
-
 
476
        Set<Integer> allCatalogIdsForFetch = schemeItemsBySchemeId.values().stream()
-
 
477
                .flatMap(List::stream)
-
 
478
                .map(SchemeItem::getCatalogId)
-
 
479
                .collect(Collectors.toSet());
-
 
480
 
-
 
481
        // Batch fetch all items by catalogIds once
-
 
482
        Map<Integer, List<Item>> itemsByCatalogId = allCatalogIdsForFetch.isEmpty()
-
 
483
                ? Collections.emptyMap()
-
 
484
                : itemRepository.selectAllByCatalogIds(allCatalogIdsForFetch).stream()
-
 
485
                        .collect(Collectors.groupingBy(Item::getCatalogItemId));
-
 
486
 
471
        Map<List<Integer>, Map<String, List<Scheme>>> groupedByRegionDate = filteredSchemes.stream()
487
        Map<List<Integer>, Map<String, List<Scheme>>> groupedByRegionDate = filteredSchemes.stream()
472
                .collect(Collectors.groupingBy(s -> schemeIdRegionIdsMap.get(s.getId()), Collectors.groupingBy(s ->
488
                .collect(Collectors.groupingBy(s -> schemeIdRegionIdsMap.get(s.getId()), Collectors.groupingBy(s ->
473
                        String.valueOf(s.getStartDateTime()).substring(0, 10) + " - " +
489
                        String.valueOf(s.getStartDateTime()).substring(0, 10) + " - " +
474
                                String.valueOf(s.getEndDateTime()).substring(0, 10)
490
                                String.valueOf(s.getEndDateTime()).substring(0, 10)
475
                )));
491
                )));
Line 495... Line 511...
495
                        schemeTypeLabel = "Sellout Scheme";
511
                        schemeTypeLabel = "Sellout Scheme";
496
                    } else if (scheme.getType().equals(SchemeType.SELLIN)) {
512
                    } else if (scheme.getType().equals(SchemeType.SELLIN)) {
497
                        schemeTypeLabel = "Sellin Scheme";
513
                        schemeTypeLabel = "Sellin Scheme";
498
                    }
514
                    }
499
 
515
 
500
                    List<SchemeItem> schemeItems =
516
                    // Use pre-fetched schemeItems instead of N+1 query
501
                            schemeItemRepository.selectBySchemeIds(Collections.singleton(scheme.getId()));
517
                    List<SchemeItem> schemeItems = schemeItemsBySchemeId.getOrDefault(scheme.getId(), Collections.emptyList());
502
 
518
 
503
                    Set<Integer> catalogIds = schemeItems.stream()
519
                    Set<Integer> catalogIds = schemeItems.stream()
504
                            .map(SchemeItem::getCatalogId)
520
                            .map(SchemeItem::getCatalogId)
505
                            .collect(Collectors.toSet());
521
                            .collect(Collectors.toSet());
506
                    allCatalogIds.addAll(catalogIds);
522
                    allCatalogIds.addAll(catalogIds);
507
 
523
 
-
 
524
                    // Use pre-fetched items instead of duplicate DB calls
-
 
525
                    List<Item> catalogItems = catalogIds.stream()
-
 
526
                            .flatMap(cid -> itemsByCatalogId.getOrDefault(cid, Collections.emptyList()).stream())
-
 
527
                            .collect(Collectors.toList());
-
 
528
 
508
                    List<String> itemBrand = itemRepository.selectAllByCatalogIds(catalogIds).stream()
529
                    List<String> itemBrand = catalogItems.stream()
509
                            .map(Item::getBrand)
530
                            .map(Item::getBrand)
510
                            .filter(Objects::nonNull)
531
                            .filter(Objects::nonNull)
511
                            .distinct()
532
                            .distinct()
512
                            .collect(Collectors.toList());
533
                            .collect(Collectors.toList());
513
                    allBrands.addAll(itemBrand);
534
                    allBrands.addAll(itemBrand);
514
 
535
 
515
                    List<String> itemDescriptions = itemRepository.selectAllByCatalogIds(catalogIds).stream()
536
                    List<String> itemDescriptions = catalogItems.stream()
516
                            .filter(Utils.distinctByKey(Item::getCatalogItemId))
537
                            .filter(Utils.distinctByKey(Item::getCatalogItemId))
517
                            .map(Item::getItemDescriptionNoColor)
538
                            .map(Item::getItemDescriptionNoColor)
518
                            .collect(Collectors.toList());
539
                            .collect(Collectors.toList());
519
 
540
 
520
                    messageBuilder.append(String.format("%s of Rs.%s on Models: %s\n",
541
                    messageBuilder.append(String.format("%s of Rs.%s on Models: %s\n",
Line 597... Line 618...
597
                    List<SchemeType> rejectedCDTypes = HALF_DAYS_CD_REJECT_SCHEME_TYPES;
618
                    List<SchemeType> rejectedCDTypes = HALF_DAYS_CD_REJECT_SCHEME_TYPES;
598
                    if (loan.getCdFreeDays() == ProfitMandiConstants.LOAN_FULL_CREDIT_DAYS) {
619
                    if (loan.getCdFreeDays() == ProfitMandiConstants.LOAN_FULL_CREDIT_DAYS) {
599
                        rejectedCDTypes = FULL_DAYS_CD_SCHEME_TYPES;
620
                        rejectedCDTypes = FULL_DAYS_CD_SCHEME_TYPES;
600
                    }
621
                    }
601
                    for (SchemeType rejectedCDType : rejectedCDTypes) {
622
                    for (SchemeType rejectedCDType : rejectedCDTypes) {
-
 
623
                        // Fixed: single DB call instead of duplicate calls
602
                        SchemeInOut sio = schemeInOutRepository.selectAllByType(rejectedCDType, inventoryItem.getId()).size() > 0 ?
624
                        List<SchemeInOut> cdSios = schemeInOutRepository.selectAllByType(rejectedCDType, inventoryItem.getId());
603
                                schemeInOutRepository.selectAllByType(rejectedCDType, inventoryItem.getId()).get(0) : null;
625
                        SchemeInOut sio = cdSios.isEmpty() ? null : cdSios.get(0);
604
                        if (sio == null) continue;
626
                        if (sio == null) continue;
605
                        sio.setStatus(SchemePayoutStatus.REJECTED);
627
                        sio.setStatus(SchemePayoutStatus.REJECTED);
606
                        //Noone should change this
628
                        //Noone should change this
607
                        sio.setStatusDescription("Rejected due to free days availed");
629
                        sio.setStatusDescription("Rejected due to free days availed");
608
                        sio.setRolledBackTimestamp(LocalDateTime.now());
630
                        sio.setRolledBackTimestamp(LocalDateTime.now());
Line 779... Line 801...
779
    }
801
    }
780
 
802
 
781
    private Set<Integer> filterImeisByAgeing(Set<Integer> inventoryItemIds, FofoOrder fofoOrder) {
803
    private Set<Integer> filterImeisByAgeing(Set<Integer> inventoryItemIds, FofoOrder fofoOrder) {
782
        Set<Integer> filteredInventoryIds = new HashSet<>();
804
        Set<Integer> filteredInventoryIds = new HashSet<>();
783
        List<PartnerAgeingModel> partnerAgeingModels = ageingService.filterAgedInventory(inventoryItemIds);
805
        List<PartnerAgeingModel> partnerAgeingModels = ageingService.filterAgedInventory(inventoryItemIds);
-
 
806
 
-
 
807
        // Batch fetch all Samsung activated imeis at once to avoid N+1 queries
-
 
808
        List<String> samsungSerialNumbers = partnerAgeingModels.stream()
-
 
809
                .filter(p -> "Samsung".equalsIgnoreCase(p.getBrand()))
-
 
810
                .map(PartnerAgeingModel::getSerialNumber)
-
 
811
                .collect(Collectors.toList());
-
 
812
        Map<String, ActivatedImei> activatedImeiMap = samsungSerialNumbers.isEmpty()
-
 
813
                ? Collections.emptyMap()
-
 
814
                : activatedImeiRepository.selectBySerialNumbers(samsungSerialNumbers).stream()
-
 
815
                        .collect(Collectors.toMap(ActivatedImei::getSerialNumber, x -> x, (a, b) -> a));
-
 
816
 
784
        for (PartnerAgeingModel partnerAgeingModel : partnerAgeingModels) {
817
        for (PartnerAgeingModel partnerAgeingModel : partnerAgeingModels) {
785
            LOGGER.info("Serial Number - {}", partnerAgeingModel.getSerialNumber());
818
            LOGGER.info("Serial Number - {}", partnerAgeingModel.getSerialNumber());
786
            if (partnerAgeingModel.getBrand().equalsIgnoreCase("Samsung")) {
819
            if (partnerAgeingModel.getBrand().equalsIgnoreCase("Samsung")) {
787
                ActivatedImei activatedImei = activatedImeiRepository.selectBySerialNumber(partnerAgeingModel.getSerialNumber());
820
                ActivatedImei activatedImei = activatedImeiMap.get(partnerAgeingModel.getSerialNumber());
788
                if (activatedImei != null && activatedImei.getActivationTimestamp().toLocalDate()
821
                if (activatedImei != null && activatedImei.getActivationTimestamp().toLocalDate()
789
                        .isBefore(partnerAgeingModel.getBillingDate().plusDays(partnerAgeingModel.getMaxAgeingDays()))) {
822
                        .isBefore(partnerAgeingModel.getBillingDate().plusDays(partnerAgeingModel.getMaxAgeingDays()))) {
790
                    //Lets give money if activation is there and is before the ageing limit of that brand.
823
                    //Lets give money if activation is there and is before the ageing limit of that brand.
791
                    filteredInventoryIds.add(partnerAgeingModel.getInventoryItemId());
824
                    filteredInventoryIds.add(partnerAgeingModel.getInventoryItemId());
792
                } else {
825
                } else {
Line 830... Line 863...
830
            LOGGER.info("scanRecords --- {}", scanRecords);
863
            LOGGER.info("scanRecords --- {}", scanRecords);
831
            LOGGER.info("inventoryItemIds --- {}", inventoryItemIds);
864
            LOGGER.info("inventoryItemIds --- {}", inventoryItemIds);
832
 
865
 
833
            if (inventoryItemIds.size() == 0) return 0;
866
            if (inventoryItemIds.size() == 0) return 0;
834
 
867
 
-
 
868
            // Cache blocked imeis to avoid repeated DB calls inside stream
-
 
869
            Set<String> blockedImeisSet = new HashSet<>(this.getBlockedImeis());
-
 
870
 
835
            Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
871
            Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
836
                    .filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
872
                    .filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
837
                    .collect(Collectors.toSet());
873
                    .collect(Collectors.toSet());
838
            inventoryItems = inventoryItems.stream().filter(inventoryItem -> !this.getBlockedImeis().contains(inventoryItem.getSerialNumber())).collect(Collectors.toSet());
874
            inventoryItems = inventoryItems.stream().filter(inventoryItem -> !blockedImeisSet.contains(inventoryItem.getSerialNumber())).collect(Collectors.toSet());
839
 
875
 
840
            //Do not consider imei above 90 days for samsung
876
            //Do not consider imei above 90 days for samsung
841
            List<String> samsungSerialNumbers = inventoryItems.stream().filter(x -> x.getItem().getBrand().equalsIgnoreCase("samsung")).map(x -> x.getSerialNumber()).collect(Collectors.toList());
877
            List<String> samsungSerialNumbers = inventoryItems.stream().filter(x -> x.getItem().getBrand().equalsIgnoreCase("samsung")).map(x -> x.getSerialNumber()).collect(Collectors.toList());
842
 
878
 
843
            if (samsungSerialNumbers.size() > 0) {
879
            if (samsungSerialNumbers.size() > 0) {
Line 865... Line 901...
865
                List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue().stream().filter(x -> x != null).collect(Collectors.toList());
901
                List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue().stream().filter(x -> x != null).collect(Collectors.toList());
866
 
902
 
867
                schemeSummaryModels.stream().filter(x -> x.getSchemeType().getTransactionType().equals(StockTransactionType.OUT)).forEach(x -> x.setProcess(true));
903
                schemeSummaryModels.stream().filter(x -> x.getSchemeType().getTransactionType().equals(StockTransactionType.OUT)).forEach(x -> x.setProcess(true));
868
                if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
904
                if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
869
 
905
 
-
 
906
                // Create map once per catalog instead of per inventoryItem
-
 
907
                Map<Integer, SchemeSummaryModel> schemeSummaryModelMap = schemeSummaryModels.stream().collect(Collectors.toMap(x -> x.getSchemeId(), x -> x));
-
 
908
 
870
                List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
909
                List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
871
                for (InventoryItem inventoryItem : modelInventoryItems) {
910
                for (InventoryItem inventoryItem : modelInventoryItems) {
872
                    Map<Integer, SchemeSummaryModel> schemeSummaryModelMap = schemeSummaryModels.stream().collect(Collectors.toMap(x -> x.getSchemeId(), x -> x));
-
 
873
                    List<SchemeInOut> sios = schemeInOutRepository.selectAll(inventoryItem.getId());
911
                    List<SchemeInOut> sios = schemeInOutRepository.selectAll(inventoryItem.getId());
874
 
912
 
875
                    List<Integer> creditedSchemeIds = sios.stream()
913
                    List<Integer> creditedSchemeIds = sios.stream()
876
                            .filter(x -> x.getStatus().equals(SchemePayoutStatus.CREDITED))
914
                            .filter(x -> x.getStatus().equals(SchemePayoutStatus.CREDITED))
877
                            .map(x -> x.getSchemeId()).collect(Collectors.toList());
915
                            .map(x -> x.getSchemeId()).collect(Collectors.toList());
Line 894... Line 932...
894
                            //Reject invalid scheme payouts due to upgrade in Category or any change in schemes historically
932
                            //Reject invalid scheme payouts due to upgrade in Category or any change in schemes historically
895
                            //Lets not touchs
933
                            //Lets not touchs
896
                        }
934
                        }
897
                        for (SchemeInOut sio : sios) {
935
                        for (SchemeInOut sio : sios) {
898
                            if (schemeIdsToReject.contains(sio.getSchemeId()) && !schemeSummaryModelMap.containsKey(sio.getSchemeId())) {
936
                            if (schemeIdsToReject.contains(sio.getSchemeId()) && !schemeSummaryModelMap.containsKey(sio.getSchemeId())) {
899
                                Scheme scheme = schemeRepository.selectById(sio.getSchemeId());
937
                                // Removed unused schemeRepository.selectById call
900
                                sio.setStatusDescription("Rolledback due to Category upgrade/invalid scheme");
938
                                sio.setStatusDescription("Rolledback due to Category upgrade/invalid scheme");
901
                                sio.setStatus(SchemePayoutStatus.REJECTED);
939
                                sio.setStatus(SchemePayoutStatus.REJECTED);
902
                                sio.setRolledBackTimestamp(LocalDateTime.now());
940
                                sio.setRolledBackTimestamp(LocalDateTime.now());
903
                                sioRejectedValue += sio.getAmount();
941
                                sioRejectedValue += sio.getAmount();
904
                            }
942
                            }
Line 1370... Line 1408...
1370
        LOGGER.info("Total Size - " + schemesImeisModels.size());
1408
        LOGGER.info("Total Size - " + schemesImeisModels.size());
1371
        List<Integer> orderIds = schemesImeisModels.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
1409
        List<Integer> orderIds = schemesImeisModels.stream().map(x -> x.getOrderId()).collect(Collectors.toList());
1372
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
1410
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectAllByOrderIds(orderIds);
1373
        Map<Integer, FofoOrder> validOrdersMap = fofoOrders.stream().filter(x -> x.getCancelledTimestamp() == null).collect(Collectors.toMap(x -> x.getId(), x -> x));
1411
        Map<Integer, FofoOrder> validOrdersMap = fofoOrders.stream().filter(x -> x.getCancelledTimestamp() == null).collect(Collectors.toMap(x -> x.getId(), x -> x));
1374
        Map<String, List<SchemesImeisModel>> validImeiSchemesModelMap = schemesImeisModels.stream().filter(x -> validOrdersMap.containsKey(x.getOrderId())).collect(Collectors.groupingBy(x -> x.getImei()));
1412
        Map<String, List<SchemesImeisModel>> validImeiSchemesModelMap = schemesImeisModels.stream().filter(x -> validOrdersMap.containsKey(x.getOrderId())).collect(Collectors.groupingBy(x -> x.getImei()));
-
 
1413
 
-
 
1414
        // Batch fetch all inventoryItems to avoid N+1 queries
-
 
1415
        Set<Integer> inventoryItemIds = validImeiSchemesModelMap.values().stream()
-
 
1416
                .map(list -> list.get(0).getInventoryItemId())
-
 
1417
                .collect(Collectors.toSet());
-
 
1418
        Map<Integer, InventoryItem> inventoryItemsMap = inventoryItemIds.isEmpty()
-
 
1419
                ? Collections.emptyMap()
-
 
1420
                : inventoryItemRepository.selectAllByIds(new ArrayList<>(inventoryItemIds)).stream()
-
 
1421
                        .collect(Collectors.toMap(InventoryItem::getId, x -> x));
-
 
1422
 
1375
        for (Map.Entry<String, List<SchemesImeisModel>> imeiListEntry : validImeiSchemesModelMap.entrySet()) {
1423
        for (Map.Entry<String, List<SchemesImeisModel>> imeiListEntry : validImeiSchemesModelMap.entrySet()) {
1376
            SchemesImeisModel schemesImeisModel = imeiListEntry.getValue().get(0);
1424
            SchemesImeisModel schemesImeisModel = imeiListEntry.getValue().get(0);
1377
            List<Integer> schemeIds = imeiListEntry.getValue().stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
1425
            List<Integer> schemeIds = imeiListEntry.getValue().stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
1378
            LOGGER.info("Serial Number  - {}, Scheme IDs - {}", schemesImeisModel.getImei(), schemeIds);
1426
            LOGGER.info("Serial Number  - {}, Scheme IDs - {}", schemesImeisModel.getImei(), schemeIds);
1379
            InventoryItem inventoryItem = inventoryItemRepository.selectById(schemesImeisModel.getInventoryItemId());
1427
            InventoryItem inventoryItem = inventoryItemsMap.get(schemesImeisModel.getInventoryItemId());
-
 
1428
            if (inventoryItem == null) continue;
1380
            List<Scheme> schemes = schemeRepository.selectBySchemeIds(schemeIds);
1429
            List<Scheme> schemes = schemeRepository.selectBySchemeIds(schemeIds);
1381
            List<Scheme> supportSchemes = schemes.stream().filter(x -> Arrays.asList(SchemeType.SPECIAL_SUPPORT).contains(x.getType())).collect(Collectors.toList());
1430
            List<Scheme> supportSchemes = schemes.stream().filter(x -> Arrays.asList(SchemeType.SPECIAL_SUPPORT).contains(x.getType())).collect(Collectors.toList());
1382
            if (supportSchemes.size() > 0) {
1431
            if (supportSchemes.size() > 0) {
1383
                for (Scheme scheme : supportSchemes) {
1432
                for (Scheme scheme : supportSchemes) {
1384
                    List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
1433
                    List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());