| Line 2652... |
Line 2652... |
| 2652 |
// throw new Exception();
|
2652 |
// throw new Exception();
|
| 2653 |
}
|
2653 |
}
|
| 2654 |
|
2654 |
|
| 2655 |
public void checkfocusedModelInPartnerStock() throws Exception {
|
2655 |
public void checkfocusedModelInPartnerStock() throws Exception {
|
| 2656 |
|
2656 |
|
| 2657 |
//List<FofoStore> fofoStores = fofoStoreRepository.selectAll().stream().filter(x -> x.isActive()).limit(20).collect(Collectors.toList());
|
2657 |
// ========== PHASE 1: Batch fetch all data upfront ==========
|
| 2658 |
Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectActiveStores().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
|
2658 |
Map<Integer, FofoStore> fofoStoreMap = fofoStoreRepository.selectActiveStores().stream()
|
| - |
|
2659 |
.collect(Collectors.toMap(FofoStore::getId, x -> x));
|
| - |
|
2660 |
List<Integer> allPartnerIds = new ArrayList<>(fofoStoreMap.keySet());
|
| - |
|
2661 |
|
| 2659 |
Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
|
2662 |
Map<Integer, Map<Integer, List<SaholicCIS>>> warehouseItemAvailabilityMap = saholicInventoryService.getSaholicStock();
|
| 2660 |
Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
|
2663 |
Map<Integer, String> warehouseMap = ProfitMandiConstants.WAREHOUSE_MAP;
|
| 2661 |
Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
|
2664 |
Map<Integer, FofoReportingModel> partnerIdSalesHeadersMap = this.getPartnerIdSalesHeaders();
|
| 2662 |
Map<Integer, List<FocusedModel>> regionFocusedModelsMap = focusedModelRepository.selectAll().stream().collect(Collectors.groupingBy(x -> x.getRegionId()));
|
2665 |
Map<Integer, List<FocusedModel>> regionFocusedModelsMap = focusedModelRepository.selectAll().stream()
|
| - |
|
2666 |
.collect(Collectors.groupingBy(FocusedModel::getRegionId));
|
| 2663 |
LOGGER.info("/ - {}", regionFocusedModelsMap);
|
2667 |
LOGGER.info("regionFocusedModelsMap - {}", regionFocusedModelsMap);
|
| 2664 |
Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
|
2668 |
Map<Integer, Map<Integer, List<SaholicPOItem>>> warehousePoItemAvailabilityMap = saholicInventoryService.getSaholicPOItems();
|
| - |
|
2669 |
|
| - |
|
2670 |
// Batch fetch all customRetailers upfront
|
| - |
|
2671 |
Map<Integer, CustomRetailer> customRetailerMap = retailerService.getFofoRetailers(allPartnerIds);
|
| - |
|
2672 |
LOGGER.info("Fetched {} customRetailers", customRetailerMap.size());
|
| - |
|
2673 |
|
| - |
|
2674 |
// Batch fetch all inventory snapshots upfront
|
| - |
|
2675 |
Map<Integer, List<CurrentInventorySnapshot>> allInventorySnapshotsMap = currentInventorySnapshotRepository
|
| - |
|
2676 |
.selectByFofoId(allPartnerIds).stream()
|
| - |
|
2677 |
.collect(Collectors.groupingBy(CurrentInventorySnapshot::getFofoId));
|
| - |
|
2678 |
LOGGER.info("Fetched inventory snapshots for {} partners", allInventorySnapshotsMap.size());
|
| - |
|
2679 |
|
| - |
|
2680 |
// Batch fetch all pending GRN orders upfront
|
| - |
|
2681 |
Map<Integer, List<Order>> allGrnPendingOrdersMap = orderRepository.selectPendingGrnOrders(allPartnerIds).stream()
|
| - |
|
2682 |
.collect(Collectors.groupingBy(Order::getRetailerId));
|
| - |
|
2683 |
LOGGER.info("Fetched GRN pending orders for {} partners", allGrnPendingOrdersMap.size());
|
| - |
|
2684 |
|
| - |
|
2685 |
// Batch fetch all processing orders upfront
|
| - |
|
2686 |
Map<Integer, List<Order>> allProcessingOrdersMap = orderRepository.selectOrders(allPartnerIds, orderStatusList).stream()
|
| - |
|
2687 |
.collect(Collectors.groupingBy(Order::getRetailerId));
|
| - |
|
2688 |
LOGGER.info("Fetched processing orders for {} partners", allProcessingOrdersMap.size());
|
| - |
|
2689 |
|
| - |
|
2690 |
// Collect all focused catalog IDs
|
| 2665 |
Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
|
2691 |
Set<Integer> allFocusedCatalogIds = regionFocusedModelsMap.values().stream()
|
| - |
|
2692 |
.flatMap(List::stream)
|
| - |
|
2693 |
.map(FocusedModel::getCatalogId)
|
| - |
|
2694 |
.collect(Collectors.toSet());
|
| - |
|
2695 |
|
| - |
|
2696 |
// Batch fetch all items by catalog IDs upfront
|
| 2666 |
//Map<Integer,List<Integer>> partnerRegionMap = partnerRegionRepository.selectAll().stream().collect(Collectors.groupingBy(x->x.getFofoId(),Collectors.mapping(x->x.getRegionId(),Collectors.toList())));
|
2697 |
Map<Integer, List<Item>> itemsByCatalogIdMap = itemRepository.selectAllByCatalogIds(allFocusedCatalogIds).stream()
|
| - |
|
2698 |
.collect(Collectors.groupingBy(Item::getCatalogItemId));
|
| - |
|
2699 |
LOGGER.info("Fetched items for {} catalog IDs", itemsByCatalogIdMap.size());
|
| - |
|
2700 |
|
| - |
|
2701 |
// Batch fetch all tagListings by catalog IDs upfront
|
| - |
|
2702 |
Map<Integer, TagListing> tagListingByCatalogIdMap = tagListingRepository
|
| - |
|
2703 |
.selectAllByCatalogIds(new ArrayList<>(allFocusedCatalogIds));
|
| - |
|
2704 |
LOGGER.info("Fetched {} tagListings", tagListingByCatalogIdMap.size());
|
| - |
|
2705 |
|
| - |
|
2706 |
// Collect all item IDs from inventory, GRN orders, and processing orders for batch item lookup
|
| - |
|
2707 |
Set<Integer> allItemIds = new HashSet<>();
|
| - |
|
2708 |
allInventorySnapshotsMap.values().forEach(list ->
|
| - |
|
2709 |
list.forEach(cis -> allItemIds.add(cis.getItemId())));
|
| - |
|
2710 |
allGrnPendingOrdersMap.values().forEach(orders ->
|
| - |
|
2711 |
orders.forEach(o -> allItemIds.add(o.getLineItem().getItemId())));
|
| - |
|
2712 |
allProcessingOrdersMap.values().forEach(orders ->
|
| - |
|
2713 |
orders.forEach(o -> allItemIds.add(o.getLineItem().getItemId())));
|
| - |
|
2714 |
|
| - |
|
2715 |
// Batch fetch all items and create itemId -> catalogId mapping
|
| - |
|
2716 |
Map<Integer, Integer> itemIdToCatalogIdMap = new HashMap<>();
|
| - |
|
2717 |
if (!allItemIds.isEmpty()) {
|
| - |
|
2718 |
itemRepository.selectByIds(allItemIds).forEach(item ->
|
| - |
|
2719 |
itemIdToCatalogIdMap.put(item.getId(), item.getCatalogItemId()));
|
| - |
|
2720 |
}
|
| - |
|
2721 |
LOGGER.info("Built itemId->catalogId mapping for {} items", itemIdToCatalogIdMap.size());
|
| - |
|
2722 |
|
| - |
|
2723 |
// ========== PHASE 2: Build partner region mappings ==========
|
| 2667 |
Map<Integer, Set<Integer>> partnerToRegions = partnerRegionRepository.selectAll().stream()
|
2724 |
Map<Integer, Set<Integer>> partnerToRegions = partnerRegionRepository.selectAll().stream()
|
| 2668 |
.collect(Collectors.groupingBy(
|
2725 |
.collect(Collectors.groupingBy(
|
| 2669 |
pr -> pr.getFofoId(),
|
2726 |
pr -> pr.getFofoId(),
|
| 2670 |
Collectors.mapping(pr -> pr.getRegionId(), Collectors.toSet())
|
2727 |
Collectors.mapping(pr -> pr.getRegionId(), Collectors.toSet())
|
| 2671 |
));
|
2728 |
));
|
| 2672 |
Map<Set<Integer>, List<Integer>> regionPartnerMap = partnerToRegions.entrySet().stream()
|
2729 |
Map<Set<Integer>, List<Integer>> regionPartnerMap = partnerToRegions.entrySet().stream()
|
| 2673 |
.collect(Collectors.groupingBy(
|
2730 |
.collect(Collectors.groupingBy(
|
| 2674 |
Map.Entry::getValue,
|
2731 |
Map.Entry::getValue,
|
| 2675 |
Collectors.mapping(Map.Entry::getKey, Collectors.toList())
|
2732 |
Collectors.mapping(Map.Entry::getKey, Collectors.toList())
|
| 2676 |
));
|
2733 |
));
|
| 2677 |
LOGGER.info("regionPartnerMap - {}", regionPartnerMap.keySet());
|
2734 |
LOGGER.info("regionPartnerMap - {}", regionPartnerMap.keySet());
|
| - |
|
2735 |
|
| - |
|
2736 |
// ========== PHASE 3: Process partners using pre-fetched data ==========
|
| - |
|
2737 |
Map<Integer, List<FocusedModelShortageModel>> focusedModelShortageReportMap = new HashMap<>();
|
| - |
|
2738 |
|
| 2678 |
for (Map.Entry<Set<Integer>, List<Integer>> regionPartnerEntry : regionPartnerMap.entrySet()) {
|
2739 |
for (Map.Entry<Set<Integer>, List<Integer>> regionPartnerEntry : regionPartnerMap.entrySet()) {
|
| 2679 |
//LOGGER.info("regionPartnerEntry - {}", regionPartnerEntry.getKey());
|
- |
|
| 2680 |
Set<Integer> regionIds = regionPartnerEntry.getKey();
|
2740 |
Set<Integer> regionIds = regionPartnerEntry.getKey();
|
| 2681 |
List<Integer> partnerIds = regionPartnerEntry.getValue();
|
2741 |
List<Integer> partnerIds = new ArrayList<>(regionPartnerEntry.getValue());
|
| - |
|
2742 |
|
| 2682 |
if (regionIds.stream().anyMatch(x -> !regionFocusedModelsMap.containsKey(x))) continue;
|
2743 |
if (regionIds.stream().anyMatch(x -> !regionFocusedModelsMap.containsKey(x))) continue;
|
| 2683 |
|
2744 |
|
| 2684 |
LOGGER.info("regionIds" + regionIds);
|
2745 |
LOGGER.info("Processing regionIds: {}", regionIds);
|
| 2685 |
if (regionIds == null || regionIds.size() == 0) {
|
2746 |
if (regionIds == null || regionIds.isEmpty()) {
|
| 2686 |
LOGGER.info("No region found for partner {}", partnerIds);
|
2747 |
LOGGER.info("No region found for partner {}", partnerIds);
|
| 2687 |
continue;
|
2748 |
continue;
|
| 2688 |
}
|
2749 |
}
|
| 2689 |
if (regionIds.contains(5)) {
|
2750 |
if (regionIds.contains(5)) {
|
| 2690 |
partnerIds.addAll(fofoStoreMap.keySet());
|
2751 |
partnerIds.addAll(fofoStoreMap.keySet());
|
| 2691 |
}
|
2752 |
}
|
| - |
|
2753 |
|
| 2692 |
Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = regionIds.stream().map(regionFocusedModelsMap::get).flatMap(x -> x != null ? x.stream() : Stream.empty())
|
2754 |
Map<Integer, Optional<Integer>> focusedCatalogIdAndQtyMap = regionIds.stream()
|
| - |
|
2755 |
.map(regionFocusedModelsMap::get)
|
| - |
|
2756 |
.flatMap(x -> x != null ? x.stream() : Stream.empty())
|
| 2693 |
.collect(groupingBy(FocusedModel::getCatalogId, mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
|
2757 |
.collect(groupingBy(FocusedModel::getCatalogId,
|
| 2694 |
//LOGGER.info("focusedCatalogIdAndQtyMap {}",focusedCatalogIdAndQtyMap);
|
2758 |
mapping(FocusedModel::getObsMinimumQty, Collectors.maxBy(Integer::compareTo))));
|
| - |
|
2759 |
|
| 2695 |
if (focusedCatalogIdAndQtyMap.size() == 0) continue;
|
2760 |
if (focusedCatalogIdAndQtyMap.isEmpty()) continue;
|
| - |
|
2761 |
|
| 2696 |
for (int partnerId : partnerIds) {
|
2762 |
for (int partnerId : partnerIds) {
|
| 2697 |
if (partnerId == 0) continue;
|
2763 |
if (partnerId == 0) continue;
|
| 2698 |
FofoStore fofoStore = fofoStoreMap.get(partnerId);
|
2764 |
FofoStore fofoStore = fofoStoreMap.get(partnerId);
|
| 2699 |
List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
|
- |
|
| 2700 |
focusedModelShortageReportMap.put(fofoStore.getId(), focusedModelShortageList);
|
- |
|
| 2701 |
LOGGER.info("Before retailerService.getFofoRetailer(fofoId)");
|
- |
|
| 2702 |
CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoStore.getId());
|
- |
|
| 2703 |
LOGGER.info("After retailerService.getFofoRetailer(fofoId)");
|
- |
|
| 2704 |
Map<Integer, Integer> processingOrderMap = null;
|
- |
|
| 2705 |
Map<Integer, Integer> catalogIdAndQtyMap = null;
|
2765 |
if (fofoStore == null) continue;
|
| 2706 |
Map<Integer, Integer> grnPendingOrdersMap = null;
|
- |
|
| 2707 |
|
2766 |
|
| 2708 |
Map<Integer, Integer> currentInventorySnapshot = currentInventorySnapshotRepository.selectByFofoId(fofoStore.getId()).stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getAvailability()));
|
2767 |
CustomRetailer customRetailer = customRetailerMap.get(partnerId);
|
| - |
|
2768 |
if (customRetailer == null) continue;
|
| 2709 |
|
2769 |
|
| 2710 |
if (!currentInventorySnapshot.isEmpty()) {
|
2770 |
List<FocusedModelShortageModel> focusedModelShortageList = new ArrayList<>();
|
| 2711 |
catalogIdAndQtyMap = itemRepository.selectByIds(currentInventorySnapshot.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> currentInventorySnapshot.get(x.getId()))));
|
2771 |
focusedModelShortageReportMap.put(fofoStore.getId(), focusedModelShortageList);
|
| 2712 |
|
2772 |
|
| - |
|
2773 |
// Build catalogIdAndQtyMap from pre-fetched inventory snapshots
|
| - |
|
2774 |
Map<Integer, Integer> catalogIdAndQtyMap = new HashMap<>();
|
| - |
|
2775 |
List<CurrentInventorySnapshot> inventorySnapshots = allInventorySnapshotsMap.get(partnerId);
|
| - |
|
2776 |
if (inventorySnapshots != null) {
|
| - |
|
2777 |
Map<Integer, Integer> itemQtyMap = inventorySnapshots.stream()
|
| - |
|
2778 |
.collect(Collectors.toMap(CurrentInventorySnapshot::getItemId, CurrentInventorySnapshot::getAvailability));
|
| - |
|
2779 |
for (Map.Entry<Integer, Integer> e : itemQtyMap.entrySet()) {
|
| - |
|
2780 |
Integer catalogId = itemIdToCatalogIdMap.get(e.getKey());
|
| - |
|
2781 |
if (catalogId != null) {
|
| - |
|
2782 |
catalogIdAndQtyMap.merge(catalogId, e.getValue(), Integer::sum);
|
| - |
|
2783 |
}
|
| - |
|
2784 |
}
|
| 2713 |
}
|
2785 |
}
|
| 2714 |
|
2786 |
|
| - |
|
2787 |
// Build grnPendingOrdersMap from pre-fetched orders
|
| 2715 |
Map<Integer, Integer> grnPendingOrders = orderRepository.selectPendingGrnOrders(fofoStore.getId()).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
|
2788 |
Map<Integer, Integer> grnPendingOrdersMap = new HashMap<>();
|
| - |
|
2789 |
List<Order> grnOrders = allGrnPendingOrdersMap.get(partnerId);
|
| 2716 |
if (!grnPendingOrders.isEmpty()) {
|
2790 |
if (grnOrders != null) {
|
| - |
|
2791 |
for (Order order : grnOrders) {
|
| - |
|
2792 |
Integer catalogId = itemIdToCatalogIdMap.get(order.getLineItem().getItemId());
|
| - |
|
2793 |
if (catalogId != null) {
|
| 2717 |
grnPendingOrdersMap = itemRepository.selectByIds(grnPendingOrders.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> grnPendingOrders.get(x.getId()))));
|
2794 |
grnPendingOrdersMap.merge(catalogId, order.getLineItem().getQuantity(), Integer::sum);
|
| 2718 |
|
- |
|
| - |
|
2795 |
}
|
| - |
|
2796 |
}
|
| 2719 |
}
|
2797 |
}
|
| 2720 |
|
2798 |
|
| - |
|
2799 |
// Build processingOrderMap from pre-fetched orders
|
| - |
|
2800 |
Map<Integer, Integer> processingOrderMap = new HashMap<>();
|
| 2721 |
Map<Integer, Integer> processingOrder = orderRepository.selectOrders(fofoStore.getId(), orderStatusList).stream().collect(groupingBy(x -> x.getLineItem().getItemId(), Collectors.summingInt(x -> x.getLineItem().getQuantity())));
|
2801 |
List<Order> processingOrders = allProcessingOrdersMap.get(partnerId);
|
| 2722 |
if (!processingOrder.isEmpty()) {
|
2802 |
if (processingOrders != null) {
|
| - |
|
2803 |
for (Order order : processingOrders) {
|
| - |
|
2804 |
Integer catalogId = itemIdToCatalogIdMap.get(order.getLineItem().getItemId());
|
| - |
|
2805 |
if (catalogId != null) {
|
| 2723 |
processingOrderMap = itemRepository.selectByIds(processingOrder.keySet()).stream().collect(groupingBy(x -> x.getCatalogItemId(), Collectors.summingInt(x -> processingOrder.get(x.getId()))));
|
2806 |
processingOrderMap.merge(catalogId, order.getLineItem().getQuantity(), Integer::sum);
|
| 2724 |
|
- |
|
| - |
|
2807 |
}
|
| - |
|
2808 |
}
|
| 2725 |
}
|
2809 |
}
|
| 2726 |
|
2810 |
|
| 2727 |
|
- |
|
| - |
|
2811 |
Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
|
| 2728 |
//Map<String, RetailerBlockBrands> retailerBlockBrands = retailerBlockBrandsRepository.selectAllByRetailer(fofoId).stream().collect(Collectors.toMap(x -> x.getBlockBrands(), x -> x));
|
2812 |
Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
|
| 2729 |
|
- |
|
| 2730 |
|
2813 |
|
| 2731 |
for (Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
|
2814 |
for (Entry<Integer, Optional<Integer>> entry : focusedCatalogIdAndQtyMap.entrySet()) {
|
| 2732 |
int minQty = entry.getValue().get();
|
2815 |
int catalogId = entry.getKey();
|
| 2733 |
int inStockQty = 0;
|
- |
|
| 2734 |
int processingQty = 0;
|
- |
|
| 2735 |
int grnPendingQty = 0;
|
2816 |
int minQty = entry.getValue().orElse(0);
|
| 2736 |
int allColorNetAvailability = 0;
|
2817 |
int inStockQty = catalogIdAndQtyMap.getOrDefault(catalogId, 0);
|
| 2737 |
int allColorPoAvailability = 0;
|
- |
|
| 2738 |
if (processingOrderMap != null) {
|
- |
|
| 2739 |
processingQty = (processingOrderMap.get(entry.getKey()) == null) ? 0 : processingOrderMap.get(entry.getKey());
|
2818 |
int processingQty = processingOrderMap.getOrDefault(catalogId, 0);
|
| 2740 |
|
- |
|
| 2741 |
}
|
- |
|
| 2742 |
if (grnPendingOrdersMap != null) {
|
2819 |
int grnPendingQty = grnPendingOrdersMap.getOrDefault(catalogId, 0);
|
| 2743 |
grnPendingQty = (grnPendingOrdersMap.get(entry.getKey()) == null) ? 0 : grnPendingOrdersMap.get(entry.getKey());
|
- |
|
| 2744 |
|
- |
|
| 2745 |
}
|
- |
|
| 2746 |
if (catalogIdAndQtyMap != null) {
|
- |
|
| 2747 |
inStockQty = (catalogIdAndQtyMap.get(entry.getKey()) == null) ? 0 : catalogIdAndQtyMap.get(entry.getKey());
|
- |
|
| 2748 |
|
- |
|
| 2749 |
}
|
- |
|
| 2750 |
|
2820 |
|
| 2751 |
int grnStockQty = grnPendingQty + inStockQty;
|
2821 |
int grnStockQty = grnPendingQty + inStockQty;
|
| 2752 |
int totalQty = processingQty + grnPendingQty + inStockQty;
|
2822 |
int totalQty = processingQty + grnPendingQty + inStockQty;
|
| 2753 |
|
- |
|
| 2754 |
int shortageQty = minQty - totalQty;
|
2823 |
int shortageQty = minQty - totalQty;
|
| 2755 |
List<Item> items = itemRepository.selectAllByCatalogItemId(entry.getKey());
|
- |
|
| 2756 |
|
- |
|
| 2757 |
TagListing tagListing = tagListingRepository.selectByCatalogId(entry.getKey());
|
- |
|
| 2758 |
|
2824 |
|
| - |
|
2825 |
// Use pre-fetched items
|
| - |
|
2826 |
List<Item> items = itemsByCatalogIdMap.get(catalogId);
|
| - |
|
2827 |
if (items == null || items.isEmpty()) continue;
|
| - |
|
2828 |
|
| - |
|
2829 |
// Use pre-fetched tagListing
|
| 2759 |
Map<Integer, List<SaholicCIS>> itemAvailabilityMap = warehouseItemAvailabilityMap.get(fofoStore.getWarehouseId());
|
2830 |
TagListing tagListing = tagListingByCatalogIdMap.get(catalogId);
|
| - |
|
2831 |
if (tagListing == null) continue;
|
| 2760 |
|
2832 |
|
| 2761 |
Map<Integer, List<SaholicPOItem>> poItemAvailabilityMap = warehousePoItemAvailabilityMap.get(fofoStore.getWarehouseId());
|
2833 |
int allColorNetAvailability = 0;
|
| - |
|
2834 |
int allColorPoAvailability = 0;
|
| 2762 |
|
2835 |
|
| 2763 |
for (Item item : items) {
|
2836 |
for (Item item : items) {
|
| 2764 |
List<SaholicCIS> currentAvailability = null;
|
- |
|
| 2765 |
List<SaholicPOItem> poItemAvailability = null;
|
- |
|
| 2766 |
if (itemAvailabilityMap != null) {
|
2837 |
if (itemAvailabilityMap != null) {
|
| 2767 |
currentAvailability = itemAvailabilityMap.get(item.getId());
|
2838 |
List<SaholicCIS> currentAvailability = itemAvailabilityMap.get(item.getId());
|
| - |
|
2839 |
if (currentAvailability != null) {
|
| - |
|
2840 |
allColorNetAvailability += currentAvailability.stream()
|
| - |
|
2841 |
.mapToInt(SaholicCIS::getNetavailability).sum();
|
| - |
|
2842 |
}
|
| 2768 |
}
|
2843 |
}
|
| 2769 |
|
- |
|
| 2770 |
if (poItemAvailabilityMap != null) {
|
2844 |
if (poItemAvailabilityMap != null) {
|
| 2771 |
poItemAvailability = poItemAvailabilityMap.get(item.getId());
|
2845 |
List<SaholicPOItem> poItemAvailability = poItemAvailabilityMap.get(item.getId());
|
| 2772 |
}
|
2846 |
if (poItemAvailability != null) {
|
| 2773 |
if (currentAvailability != null) {
|
2847 |
allColorPoAvailability += poItemAvailability.stream()
|
| 2774 |
allColorNetAvailability += currentAvailability.stream().collect(Collectors.summingInt(SaholicCIS::getNetavailability));
|
2848 |
.mapToInt(SaholicPOItem::getUnfulfilledQty).sum();
|
| 2775 |
}
|
2849 |
}
|
| 2776 |
|
- |
|
| 2777 |
if (poItemAvailability != null) {
|
- |
|
| 2778 |
allColorPoAvailability += poItemAvailability.stream().collect(Collectors.summingInt(SaholicPOItem::getUnfulfilledQty));
|
- |
|
| 2779 |
}
|
2850 |
}
|
| 2780 |
|
- |
|
| 2781 |
}
|
2851 |
}
|
| 2782 |
|
2852 |
|
| 2783 |
FocusedModelShortageModel fm = new FocusedModelShortageModel();
|
2853 |
FocusedModelShortageModel fm = new FocusedModelShortageModel();
|
| 2784 |
fm.setFofoId(fofoStore.getId());
|
2854 |
fm.setFofoId(fofoStore.getId());
|
| 2785 |
fm.setStoreCode(fofoStore.getCode());
|
2855 |
fm.setStoreCode(fofoStore.getCode());
|
| Line 2791... |
Line 2861... |
| 2791 |
fm.setPendingIndentQty(processingQty);
|
2861 |
fm.setPendingIndentQty(processingQty);
|
| 2792 |
fm.setShortageQty(shortageQty);
|
2862 |
fm.setShortageQty(shortageQty);
|
| 2793 |
fm.setPoAvailability(allColorPoAvailability);
|
2863 |
fm.setPoAvailability(allColorPoAvailability);
|
| 2794 |
fm.setDp(tagListing.getSellingPrice());
|
2864 |
fm.setDp(tagListing.getSellingPrice());
|
| 2795 |
fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
|
2865 |
fm.setWarehouseName(warehouseMap.get(customRetailer.getWarehouseId()));
|
| - |
|
2866 |
|
| - |
|
2867 |
// FIX: Use fofoStore.getId() instead of fofoStore object as key
|
| 2796 |
if (partnerIdSalesHeadersMap.get(fofoStore) != null) {
|
2868 |
FofoReportingModel reportingModel = partnerIdSalesHeadersMap.get(fofoStore.getId());
|
| - |
|
2869 |
if (reportingModel != null) {
|
| 2797 |
fm.setStateManager(partnerIdSalesHeadersMap.get(fofoStore).getRegionalManager());
|
2870 |
fm.setStateManager(reportingModel.getRegionalManager());
|
| 2798 |
fm.setTerritoryManager(partnerIdSalesHeadersMap.get(fofoStore).getTerritoryManager());
|
2871 |
fm.setTerritoryManager(reportingModel.getTerritoryManager());
|
| 2799 |
} else {
|
2872 |
} else {
|
| 2800 |
fm.setStateManager("");
|
2873 |
fm.setStateManager("");
|
| 2801 |
fm.setTerritoryManager("");
|
2874 |
fm.setTerritoryManager("");
|
| 2802 |
}
|
2875 |
}
|
| 2803 |
|
2876 |
|
| 2804 |
fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
|
2877 |
fm.setItemName(items.get(0).getBrand() + items.get(0).getModelNumber() + items.get(0).getModelName());
|
| 2805 |
fm.setAvailability(allColorNetAvailability);
|
2878 |
fm.setAvailability(allColorNetAvailability);
|
| 2806 |
|
2879 |
|
| 2807 |
focusedModelShortageList.add(fm);
|
2880 |
focusedModelShortageList.add(fm);
|
| 2808 |
}
|
2881 |
}
|
| 2809 |
|
- |
|
| 2810 |
}
|
2882 |
}
|
| 2811 |
}
|
2883 |
}
|
| 2812 |
|
2884 |
|
| - |
|
2885 |
// ========== PHASE 4: Send emails ==========
|
| 2813 |
LOGGER.info("focusedModelShortageReportMap {}", focusedModelShortageReportMap);
|
2886 |
LOGGER.info("focusedModelShortageReportMap size: {}", focusedModelShortageReportMap.size());
|
| 2814 |
if (!focusedModelShortageReportMap.isEmpty()) {
|
2887 |
if (!focusedModelShortageReportMap.isEmpty()) {
|
| 2815 |
String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
|
2888 |
String fileName = "Stock Alert-" + FormattingUtils.formatDate(LocalDateTime.now()) + ".csv";
|
| 2816 |
Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
|
2889 |
Map<String, Set<Integer>> storeGuyMap = csService.getAuthUserPartnerIdMapping();
|
| 2817 |
Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
|
2890 |
Map<String, List<List<?>>> emailRowsMap = new HashMap<>();
|
| 2818 |
//String email = "tarun.verma@smartdukaan.com";
|
- |
|
| 2819 |
focusedModelShortageReportMap.entrySet().forEach(x -> {
|
- |
|
| 2820 |
storeGuyMap.entrySet().stream()
|
- |
|
| 2821 |
//.filter(entry->entry.getKey().equals(email))
|
- |
|
| 2822 |
.forEach(y -> {
|
- |
|
| 2823 |
|
- |
|
| 2824 |
if (y.getValue().contains(x.getKey())) {
|
- |
|
| 2825 |
if (!emailRowsMap.containsKey(y.getKey())) {
|
- |
|
| 2826 |
emailRowsMap.put(y.getKey(), new ArrayList<>());
|
- |
|
| 2827 |
}
|
- |
|
| 2828 |
List<List<? extends Serializable>> fms = x.getValue().stream().map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(), r.getModelName(), r.getModelNumber(), r.getDp(), r.getWarehouseName(), r.getStateManager(), r.getTerritoryManager(), r.getPendingIndentQty(), r.getGrnStockQty(), r.getShortageQty(), r.getAvailability())).collect(Collectors.toList());
|
- |
|
| 2829 |
emailRowsMap.get(y.getKey()).addAll(fms);
|
- |
|
| 2830 |
|
- |
|
| 2831 |
}
|
- |
|
| 2832 |
|
- |
|
| 2833 |
});
|
- |
|
| 2834 |
|
2891 |
|
| - |
|
2892 |
for (Map.Entry<Integer, List<FocusedModelShortageModel>> x : focusedModelShortageReportMap.entrySet()) {
|
| 2835 |
});
|
2893 |
for (Map.Entry<String, Set<Integer>> y : storeGuyMap.entrySet()) {
|
| 2836 |
//LOGGER.info("emailRowsMap {}", emailRowsMap);
|
2894 |
if (y.getValue().contains(x.getKey())) {
|
| 2837 |
|
- |
|
| 2838 |
List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number", "DP", "Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock", "Shortage Qty", "Availability");
|
2895 |
emailRowsMap.computeIfAbsent(y.getKey(), k -> new ArrayList<>());
|
| 2839 |
emailRowsMap.entrySet().forEach(entry -> {
|
2896 |
List<List<? extends Serializable>> fms = x.getValue().stream()
|
| 2840 |
|
- |
|
| 2841 |
ByteArrayOutputStream baos = null;
|
2897 |
.map(r -> Arrays.asList(r.getStoreCode(), r.getStoreName(), r.getBrandName(),
|
| - |
|
2898 |
r.getModelName(), r.getModelNumber(), r.getDp(), r.getWarehouseName(),
|
| 2842 |
try {
|
2899 |
r.getStateManager(), r.getTerritoryManager(), r.getPendingIndentQty(),
|
| 2843 |
baos = FileUtil.getCSVByteStream(headers, entry.getValue());
|
2900 |
r.getGrnStockQty(), r.getShortageQty(), r.getAvailability()))
|
| 2844 |
} catch (Exception e2) {
|
2901 |
.collect(Collectors.toList());
|
| - |
|
2902 |
emailRowsMap.get(y.getKey()).addAll(fms);
|
| 2845 |
e2.printStackTrace();
|
2903 |
}
|
| 2846 |
}
|
2904 |
}
|
| 2847 |
String[] sendToArray = new String[]{entry.getKey()};
|
2905 |
}
|
| 2848 |
|
2906 |
|
| - |
|
2907 |
List<String> headers = Arrays.asList("Store Code", "Store Name", "Brand", "Model Name", "Model Number",
|
| - |
|
2908 |
"DP", "Warehouse Name", "State Manager", "Territory Manager", "Pending Indent", "InStock",
|
| - |
|
2909 |
"Shortage Qty", "Availability");
|
| 2849 |
|
2910 |
|
| - |
|
2911 |
for (Map.Entry<String, List<List<?>>> entry : emailRowsMap.entrySet()) {
|
| 2850 |
try {
|
2912 |
try {
|
| - |
|
2913 |
ByteArrayOutputStream baos = FileUtil.getCSVByteStream(headers, entry.getValue());
|
| - |
|
2914 |
String[] sendToArray = new String[]{entry.getKey()};
|
| 2851 |
Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA", fileName, new ByteArrayResource(baos.toByteArray()));
|
2915 |
Utils.sendMailWithAttachment(googleMailSender, sendToArray, null, "Stock Alert", "PFA",
|
| 2852 |
} catch (Exception e1) { // TODO Auto-generated catch block
|
2916 |
fileName, new ByteArrayResource(baos.toByteArray()));
|
| 2853 |
e1.printStackTrace();
|
2917 |
} catch (Exception e) {
|
| - |
|
2918 |
LOGGER.error("Failed to send email to {}", entry.getKey(), e);
|
| 2854 |
}
|
2919 |
}
|
| 2855 |
|
- |
|
| 2856 |
});
|
2920 |
}
|
| 2857 |
}
|
2921 |
}
|
| 2858 |
}
|
2922 |
}
|
| 2859 |
|
2923 |
|
| 2860 |
private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
|
2924 |
private String getNotificationMessage(List<FocusedModelShortageModel> focusedModelShortageModel) {
|
| 2861 |
StringBuilder sb = new StringBuilder();
|
2925 |
StringBuilder sb = new StringBuilder();
|