Merge pull request #58920 from frappe/mergify/bp/version-15-hotfix/pr-58896

fix(stock): remove empty delivery stops after mapping (backport #58896)
This commit is contained in:
Sudharsanan Ashok
2026-09-09 13:33:13 +05:30
committed by GitHub
2 changed files with 33 additions and 1 deletions

View File

@@ -50,6 +50,11 @@ class DeliveryTrip(Document):
"UOM Conversion Factor", {"from_uom": "Meter", "to_uom": self.default_distance_uom}, "value"
)
def after_mapping(self, source_doc):
for stop in self.delivery_stops[:]:
if not any(stop.get(df.fieldname) for df in stop.meta.fields):
self.remove(stop)
def validate(self):
if self._action == "submit" and not self.driver:
frappe.throw(_("A driver must be set to submit."))
@@ -69,7 +74,7 @@ class DeliveryTrip(Document):
def validate_stop_addresses(self):
for stop in self.delivery_stops:
if not stop.customer_address:
if stop.address and not stop.customer_address:
stop.customer_address = get_address_display(frappe.get_doc("Address", stop.address).as_dict())
def update_status(self):

View File

@@ -7,6 +7,7 @@ from frappe.tests.utils import FrappeTestCase
from frappe.utils import add_days, flt, now_datetime, nowdate
import erpnext
from erpnext.stock.doctype.delivery_note.delivery_note import make_delivery_trip
from erpnext.stock.doctype.delivery_trip.delivery_trip import (
get_contact_and_address,
notify_customers,
@@ -100,6 +101,32 @@ class TestDeliveryTrip(FrappeTestCase):
self.delivery_trip.save()
self.assertEqual(self.delivery_trip.status, "Completed")
def map_delivery_note_onto_trip(self, existing_stop):
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
delivery_note = create_delivery_note()
trip = frappe.new_doc("Delivery Trip")
trip.append("delivery_stops", existing_stop)
return delivery_note, make_delivery_trip(delivery_note.name, trip)
def test_mapping_drops_placeholder_stop(self):
delivery_note, trip = self.map_delivery_note_onto_trip({})
self.assertEqual(len(trip.delivery_stops), 1)
self.assertEqual(trip.delivery_stops[0].delivery_note, delivery_note.name)
def test_mapping_keeps_partially_filled_stop(self):
_, trip = self.map_delivery_note_onto_trip({"customer": "_Test Customer"})
self.assertEqual(len(trip.delivery_stops), 2)
self.assertIsNone(trip.delivery_stops[0].delivery_note)
def test_stop_without_address_throws_mandatory_error(self):
self.delivery_trip.append("delivery_stops", {"customer": "_Test Customer"})
self.assertRaises(frappe.MandatoryError, self.delivery_trip.save)
def create_address(driver):
if not frappe.db.exists("Address", {"address_title": "_Test Address for Driver"}):