fix: hyperlocal detection falls back to pickup/delivery distance when pincode missing
This commit is contained in:
@@ -963,6 +963,34 @@ func isHyperlocal(pickupPincode, deliveryPincode string) bool {
|
|||||||
return pickupPincode[:3] == deliveryPincode[:3]
|
return pickupPincode[:3] == deliveryPincode[:3]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// maxHyperlocalKM bounds the straight-line pickup→delivery distance under which
|
||||||
|
// a booking with a missing/short pincode is still treated as hyperlocal. It is
|
||||||
|
// used ONLY as a fallback when the pincode-prefix rule can't decide: console-
|
||||||
|
// created kitchen→customer bookings (e.g. DailyGrubs) frequently carry accurate
|
||||||
|
// coordinates but no delivery pincode, and must not be wrongly routed through a
|
||||||
|
// hub. When both pincodes are present the prefix rule still wins.
|
||||||
|
const maxHyperlocalKM = 30.0
|
||||||
|
|
||||||
|
// isHyperlocalBooking decides whether a booking can skip the hub and be carried
|
||||||
|
// straight to the final mile. It prefers the pincode-prefix rule (isHyperlocal)
|
||||||
|
// when both pincodes are present, and falls back to the straight-line distance
|
||||||
|
// between the pickup and delivery coordinates when a pincode is missing — so a
|
||||||
|
// same-area booking whose address carried no pincode isn't sent to a hub.
|
||||||
|
func isHyperlocalBooking(pickupPincode, deliveryPincode string, pLat, pLng, dLat, dLng float64) bool {
|
||||||
|
// Both pincodes present: the prefix rule decides definitively (a matching
|
||||||
|
// pincode is hyperlocal, a differing one is genuinely inter-area — don't let
|
||||||
|
// distance override that).
|
||||||
|
if len(pickupPincode) >= 3 && len(deliveryPincode) >= 3 {
|
||||||
|
return isHyperlocal(pickupPincode, deliveryPincode)
|
||||||
|
}
|
||||||
|
// A pincode is missing: fall back to straight-line distance when we have both
|
||||||
|
// coordinates.
|
||||||
|
if pLat != 0 && pLng != 0 && dLat != 0 && dLng != 0 {
|
||||||
|
return haversineKM(pLat, pLng, dLat, dLng) <= maxHyperlocalKM
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// collectedStateEnabled gates the two-step hyperlocal delivery flow
|
// collectedStateEnabled gates the two-step hyperlocal delivery flow
|
||||||
// (Collected_By_Miler → start-delivery → Out_for_Delivery) and its knock-on
|
// (Collected_By_Miler → start-delivery → Out_for_Delivery) and its knock-on
|
||||||
// changes: OTP issued at start-delivery instead of pickup, and Arrived_At_Pickup
|
// changes: OTP issued at start-delivery instead of pickup, and Arrived_At_Pickup
|
||||||
@@ -1061,7 +1089,9 @@ func BookingPickupComplete(c *fiber.Ctx) error {
|
|||||||
// delivering". With it OFF (default, and what the current app expects) it goes
|
// delivering". With it OFF (default, and what the current app expects) it goes
|
||||||
// straight to Out_for_Delivery exactly as before.
|
// straight to Out_for_Delivery exactly as before.
|
||||||
consignmentStatus := constants.ConsignmentInwardedAtHub
|
consignmentStatus := constants.ConsignmentInwardedAtHub
|
||||||
if isHyperlocal(booking.Pickuppincode, booking.Deliverypincode) {
|
if isHyperlocalBooking(booking.Pickuppincode, booking.Deliverypincode,
|
||||||
|
booking.Pickuplatitude, booking.Pickuplongitude,
|
||||||
|
booking.Deliverylatitude, booking.Deliverylongitude) {
|
||||||
if collectedStateEnabled() {
|
if collectedStateEnabled() {
|
||||||
consignmentStatus = constants.ConsignmentCollectedByMiler
|
consignmentStatus = constants.ConsignmentCollectedByMiler
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user