| Line 144... |
Line 144... |
| 144 |
|
144 |
|
| 145 |
@Autowired
|
145 |
@Autowired
|
| 146 |
private LeadLiveLocationRepository leadLiveLocationRepository;
|
146 |
private LeadLiveLocationRepository leadLiveLocationRepository;
|
| 147 |
|
147 |
|
| 148 |
@Autowired
|
148 |
@Autowired
|
| - |
|
149 |
private BeatRouteRepository beatRouteRepository;
|
| - |
|
150 |
|
| - |
|
151 |
@Autowired
|
| 149 |
private LeadVisitApprovalRepository leadVisitApprovalRepository;
|
152 |
private LeadRouteRepository leadRouteRepository;
|
| - |
|
153 |
|
| - |
|
154 |
@Autowired
|
| - |
|
155 |
private BeatRepository beatRepository;
|
| 150 |
|
156 |
|
| 151 |
@Autowired
|
157 |
@Autowired
|
| 152 |
private Mongo mongoClient;
|
158 |
private Mongo mongoClient;
|
| 153 |
|
159 |
|
| 154 |
@Autowired
|
160 |
@Autowired
|
| Line 921... |
Line 927... |
| 921 |
|
927 |
|
| 922 |
if (createLeadActivityRequest.getStatus() == LeadStatus.followUp) {
|
928 |
if (createLeadActivityRequest.getStatus() == LeadStatus.followUp) {
|
| 923 |
leadActivity.setSchelduleTimestamp(createLeadActivityRequest.getScheldule());
|
929 |
leadActivity.setSchelduleTimestamp(createLeadActivityRequest.getScheldule());
|
| 924 |
leadActivity.setCommunicationType(createLeadActivityRequest.getCommunicationType());
|
930 |
leadActivity.setCommunicationType(createLeadActivityRequest.getCommunicationType());
|
| 925 |
if (leadActivity.getCommunicationType().equals(CommunicationType.VISIT)) {
|
931 |
if (leadActivity.getCommunicationType().equals(CommunicationType.VISIT)) {
|
| 926 |
// Create pending visit approval instead of direct visit request
|
- |
|
| 927 |
LeadVisitApproval approval = new LeadVisitApproval();
|
- |
|
| 928 |
approval.setLeadId(createLeadActivityRequest.getId());
|
- |
|
| 929 |
approval.setAssignedTo(createLeadActivityRequest.getAssignTo());
|
- |
|
| 930 |
approval.setRequestedBy(authUser.getId());
|
- |
|
| 931 |
approval.setScheduleTimestamp(createLeadActivityRequest.getScheldule());
|
- |
|
| 932 |
approval.setStatus("PENDING");
|
- |
|
| 933 |
approval.setCreatedTimestamp(LocalDateTime.now());
|
- |
|
| 934 |
approval.setUpdatedTimestamp(LocalDateTime.now());
|
- |
|
| 935 |
|
- |
|
| 936 |
// Parse beat selection if provided (format: "date|beatName|planGroupId")
|
932 |
// Parse beat selection (format: "date|beatName|beatId")
|
| 937 |
String beatSelection = createLeadActivityRequest.getBeatSelection();
|
933 |
String beatSelection = createLeadActivityRequest.getBeatSelection();
|
| - |
|
934 |
int beatId = 0;
|
| - |
|
935 |
LocalDate beatDate = createLeadActivityRequest.getScheldule() != null
|
| - |
|
936 |
? createLeadActivityRequest.getScheldule().toLocalDate() : LocalDate.now();
|
| - |
|
937 |
String beatName = "Beat";
|
| - |
|
938 |
|
| 938 |
if (beatSelection != null && beatSelection.contains("|")) {
|
939 |
if (beatSelection != null && beatSelection.contains("|")) {
|
| 939 |
String[] parts = beatSelection.split("\\|", 3);
|
940 |
String[] parts = beatSelection.split("\\|", 3);
|
| 940 |
approval.setBeatDate(LocalDate.parse(parts[0]));
|
941 |
beatDate = LocalDate.parse(parts[0]);
|
| 941 |
approval.setBeatName(parts.length > 1 ? parts[1] : "");
|
942 |
beatName = parts.length > 1 ? parts[1] : "Beat";
|
| 942 |
if (parts.length > 2) {
|
943 |
if (parts.length > 2) {
|
| - |
|
944 |
try {
|
| 943 |
approval.setBeatPlanGroupId(parts[2]);
|
945 |
beatId = Integer.parseInt(parts[2]);
|
| - |
|
946 |
} catch (NumberFormatException ignored) {
|
| - |
|
947 |
}
|
| - |
|
948 |
}
|
| - |
|
949 |
}
|
| - |
|
950 |
|
| - |
|
951 |
// Find optimal insert position using lead geolocation
|
| - |
|
952 |
int insertAt = 0;
|
| - |
|
953 |
LeadLiveLocation leadGeo = leadLiveLocationRepository.selectApprovedByLeadId(createLeadActivityRequest.getId());
|
| - |
|
954 |
List<BeatRoute> existingStops = beatId > 0
|
| - |
|
955 |
? beatRouteRepository.selectByBeatId(beatId).stream()
|
| - |
|
956 |
.sorted(Comparator.comparingInt(BeatRoute::getSequenceOrder))
|
| - |
|
957 |
.collect(Collectors.toList())
|
| - |
|
958 |
: new ArrayList<>();
|
| - |
|
959 |
|
| - |
|
960 |
insertAt = existingStops.size(); // default: append at end
|
| - |
|
961 |
|
| - |
|
962 |
if (!existingStops.isEmpty() && leadGeo != null) {
|
| - |
|
963 |
// Use nearest neighbor to find optimal position
|
| - |
|
964 |
// (simplified — append at end for now, full geocoding done in LeadGeoLocationController)
|
| - |
|
965 |
insertAt = existingStops.size();
|
| - |
|
966 |
}
|
| - |
|
967 |
|
| - |
|
968 |
// Shift existing stops
|
| - |
|
969 |
for (BeatRoute stop : existingStops) {
|
| - |
|
970 |
if (stop.getSequenceOrder() >= insertAt) {
|
| - |
|
971 |
stop.setSequenceOrder(stop.getSequenceOrder() + 1);
|
| 944 |
}
|
972 |
}
|
| 945 |
} else if (createLeadActivityRequest.getScheldule() != null) {
|
- |
|
| 946 |
approval.setBeatDate(createLeadActivityRequest.getScheldule().toLocalDate());
|
- |
|
| 947 |
}
|
973 |
}
|
| 948 |
|
974 |
|
| - |
|
975 |
// Create lead_route entry (directly APPROVED)
|
| - |
|
976 |
LeadRoute leadRoute = new LeadRoute();
|
| - |
|
977 |
leadRoute.setBeatId(beatId);
|
| - |
|
978 |
leadRoute.setLeadId(createLeadActivityRequest.getId());
|
| - |
|
979 |
leadRoute.setScheduleDate(beatDate);
|
| - |
|
980 |
leadRoute.setSequenceOrder(insertAt);
|
| - |
|
981 |
leadRoute.setStatus("APPROVED");
|
| - |
|
982 |
leadRoute.setRequestedBy(authUser.getId());
|
| - |
|
983 |
leadRoute.setApprovedBy(authUser.getId());
|
| - |
|
984 |
leadRoute.setApprovedTimestamp(LocalDateTime.now());
|
| - |
|
985 |
leadRoute.setCreatedTimestamp(LocalDateTime.now());
|
| - |
|
986 |
leadRoute.setUpdatedTimestamp(LocalDateTime.now());
|
| - |
|
987 |
|
| - |
|
988 |
// Set nearest store
|
| - |
|
989 |
if (!existingStops.isEmpty()) {
|
| - |
|
990 |
leadRoute.setNearestStoreId(existingStops.get(Math.min(insertAt, existingStops.size() - 1)).getFofoId());
|
| - |
|
991 |
}
|
| 949 |
leadVisitApprovalRepository.persist(approval);
|
992 |
leadRouteRepository.persist(leadRoute);
|
| - |
|
993 |
|
| - |
|
994 |
// Create visit request
|
| - |
|
995 |
visitRequestRepository.createVisitRequest(
|
| - |
|
996 |
createLeadActivityRequest.getId(), "lead",
|
| - |
|
997 |
createLeadActivityRequest.getAssignTo(),
|
| - |
|
998 |
beatDate.atTime(10, 0));
|
| 950 |
|
999 |
|
| 951 |
// Log activity
|
1000 |
// Log activity
|
| 952 |
LeadActivity approvalActivity = new LeadActivity();
|
1001 |
LeadActivity visitActivity = new LeadActivity();
|
| 953 |
approvalActivity.setLeadId(createLeadActivityRequest.getId());
|
1002 |
visitActivity.setLeadId(createLeadActivityRequest.getId());
|
| 954 |
approvalActivity.setRemark("Visit requested on beat: " + approval.getBeatName()
|
1003 |
visitActivity.setRemark("Lead scheduled for visit on beat: " + beatName
|
| 955 |
+ " (" + approval.getBeatDate() + ") - Pending L4 approval");
|
1004 |
+ " (" + beatDate + ") at stop #" + (insertAt + 1));
|
| 956 |
approvalActivity.setAuthId(authUser.getId());
|
1005 |
visitActivity.setAuthId(authUser.getId());
|
| 957 |
approvalActivity.setCreatedTimestamp(LocalDateTime.now());
|
1006 |
visitActivity.setCreatedTimestamp(LocalDateTime.now());
|
| 958 |
leadActivityRepository.persist(approvalActivity);
|
1007 |
leadActivityRepository.persist(visitActivity);
|
| 959 |
}
|
1008 |
}
|
| 960 |
} else {
|
1009 |
} else {
|
| 961 |
leadActivity.setSchelduleTimestamp(null);
|
1010 |
leadActivity.setSchelduleTimestamp(null);
|
| 962 |
}
|
1011 |
}
|
| 963 |
leadActivity.setCreatedTimestamp(LocalDateTime.now());
|
1012 |
leadActivity.setCreatedTimestamp(LocalDateTime.now());
|