| Line 794... |
Line 794... |
| 794 |
})
|
794 |
})
|
| 795 |
.map(Map.Entry::getKey)
|
795 |
.map(Map.Entry::getKey)
|
| 796 |
.collect(Collectors.toList());
|
796 |
.collect(Collectors.toList());
|
| 797 |
}
|
797 |
}
|
| 798 |
|
798 |
|
| 799 |
// Filter to only external, ACTIVE stores (collection plan not required)
|
799 |
// Filter to only external, ACTIVE or REVIVAL stores (collection plan not required)
|
| 800 |
Map<Integer, Integer> finalAllCollectionRankMap = allCollectionRankMap;
|
800 |
Map<Integer, Integer> finalAllCollectionRankMap = allCollectionRankMap;
|
| 801 |
Map<Integer, FofoStore> finalFofoStoresMap = fofoStoresMap;
|
801 |
Map<Integer, FofoStore> finalFofoStoresMap = fofoStoresMap;
|
| 802 |
List<Integer> validFofoIds = fofoIds.stream()
|
802 |
List<Integer> validFofoIds = fofoIds.stream()
|
| 803 |
.filter(fofoId -> {
|
803 |
.filter(fofoId -> {
|
| 804 |
FofoStore store = finalFofoStoresMap.get(fofoId);
|
804 |
FofoStore store = finalFofoStoresMap.get(fofoId);
|
| 805 |
if (store == null || store.isInternal()) {
|
805 |
if (store == null || store.isInternal()) {
|
| 806 |
return false;
|
806 |
return false;
|
| 807 |
}
|
807 |
}
|
| 808 |
// Only include ACTIVE partners (not Low Sale, not Disputed, not Billing Pending)
|
808 |
// Only include ACTIVE or REVIVAL partners (not Low Sale, not Disputed, not Billing Pending)
|
| 809 |
return ActivationType.ACTIVE.equals(store.getActivationType());
|
809 |
return ActivationType.ACTIVE.equals(store.getActivationType())
|
| - |
|
810 |
|| ActivationType.REVIVAL.equals(store.getActivationType());
|
| 810 |
})
|
811 |
})
|
| 811 |
.collect(Collectors.toList());
|
812 |
.collect(Collectors.toList());
|
| 812 |
|
813 |
|
| 813 |
if (validFofoIds.isEmpty()) {
|
814 |
if (validFofoIds.isEmpty()) {
|
| 814 |
continue;
|
815 |
continue;
|
| Line 821... |
Line 822... |
| 821 |
Set<Integer> mtdFofoIds = mtdFofoIdsByAuthId.getOrDefault(rbmAuthId, Collections.emptySet());
|
822 |
Set<Integer> mtdFofoIds = mtdFofoIdsByAuthId.getOrDefault(rbmAuthId, Collections.emptySet());
|
| 822 |
targetModel.setPartnerCount(mtdFofoIds.size());
|
823 |
targetModel.setPartnerCount(mtdFofoIds.size());
|
| 823 |
|
824 |
|
| 824 |
// Categorize each partner - each partner belongs to ONE category only
|
825 |
// Categorize each partner - each partner belongs to ONE category only
|
| 825 |
// Priority: PlanToday > CarryForward > ZeroBilling > Untouched > FuturePlan > Normal
|
826 |
// Priority: PlanToday > CarryForward > ZeroBilling > Untouched > FuturePlan > Normal
|
| - |
|
827 |
// Revival is counted separately (just for display, doesn't affect categorization)
|
| 826 |
Set<Integer> planTodayPartners = new HashSet<>();
|
828 |
Set<Integer> planTodayPartners = new HashSet<>();
|
| 827 |
Set<Integer> carryForwardPartners = new HashSet<>();
|
829 |
Set<Integer> carryForwardPartners = new HashSet<>();
|
| 828 |
Set<Integer> untouchedPartners = new HashSet<>();
|
830 |
Set<Integer> untouchedPartners = new HashSet<>();
|
| 829 |
Set<Integer> zeroBillingPartners = new HashSet<>();
|
831 |
Set<Integer> zeroBillingPartners = new HashSet<>();
|
| 830 |
Set<Integer> futurePlanPartners = new HashSet<>();
|
832 |
Set<Integer> futurePlanPartners = new HashSet<>();
|
| 831 |
Set<Integer> normalPartners = new HashSet<>();
|
833 |
Set<Integer> normalPartners = new HashSet<>();
|
| - |
|
834 |
Set<Integer> revivalPartners = new HashSet<>();
|
| 832 |
|
835 |
|
| 833 |
for (Integer fofoId : validFofoIds) {
|
836 |
for (Integer fofoId : validFofoIds) {
|
| 834 |
// Get collection plan rank (from optimized rank map)
|
837 |
// Get collection plan rank (from optimized rank map)
|
| 835 |
int rank = allCollectionRankMap.getOrDefault(fofoId, 5); // default to Normal if no plan
|
838 |
int rank = allCollectionRankMap.getOrDefault(fofoId, 5); // default to Normal if no plan
|
| 836 |
|
839 |
|
| 837 |
// Check if partner has zero billing in MTD
|
840 |
// Check if partner has zero billing in MTD
|
| 838 |
boolean hasZeroBilling = !allMtdBilledFofoIds.contains(fofoId);
|
841 |
boolean hasZeroBilling = !allMtdBilledFofoIds.contains(fofoId);
|
| 839 |
|
842 |
|
| - |
|
843 |
// Count REVIVAL partners separately (just for display, doesn't affect categorization)
|
| - |
|
844 |
FofoStore store = finalFofoStoresMap.get(fofoId);
|
| - |
|
845 |
if (store != null && ActivationType.REVIVAL.equals(store.getActivationType())) {
|
| - |
|
846 |
revivalPartners.add(fofoId);
|
| - |
|
847 |
}
|
| - |
|
848 |
|
| 840 |
// Assign to category based on priority
|
849 |
// Assign to category based on priority
|
| 841 |
if (rank == 1) {
|
850 |
if (rank == 1) {
|
| 842 |
planTodayPartners.add(fofoId);
|
851 |
planTodayPartners.add(fofoId);
|
| 843 |
} else if (rank == 2) {
|
852 |
} else if (rank == 2) {
|
| 844 |
carryForwardPartners.add(fofoId);
|
853 |
carryForwardPartners.add(fofoId);
|
| Line 859... |
Line 868... |
| 859 |
targetModel.setCarryForward(carryForwardPartners.size());
|
868 |
targetModel.setCarryForward(carryForwardPartners.size());
|
| 860 |
targetModel.setUntouched(untouchedPartners.size());
|
869 |
targetModel.setUntouched(untouchedPartners.size());
|
| 861 |
targetModel.setZeroBilling(zeroBillingPartners.size());
|
870 |
targetModel.setZeroBilling(zeroBillingPartners.size());
|
| 862 |
targetModel.setFuturePlan(futurePlanPartners.size());
|
871 |
targetModel.setFuturePlan(futurePlanPartners.size());
|
| 863 |
targetModel.setNormal(normalPartners.size());
|
872 |
targetModel.setNormal(normalPartners.size());
|
| - |
|
873 |
targetModel.setRevival(revivalPartners.size());
|
| 864 |
|
874 |
|
| 865 |
// Today Target = PlanToday + CarryForward + ZeroBilling + Untouched
|
875 |
// Today Target = PlanToday + CarryForward + ZeroBilling + Untouched
|
| 866 |
// These are mutually exclusive now, so we can sum them
|
876 |
// These are mutually exclusive now, so we can sum them
|
| 867 |
long todayTarget = planTodayPartners.size() +
|
877 |
long todayTarget = planTodayPartners.size() +
|
| 868 |
carryForwardPartners.size() + zeroBillingPartners.size() + untouchedPartners.size();
|
878 |
carryForwardPartners.size() + zeroBillingPartners.size() + untouchedPartners.size();
|