Subversion Repositories SmartDukaan

Rev

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

Rev 35424 Rev 35442
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();