| 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());
|