diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py index b2307a5948f..a1984b387f5 100644 --- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py +++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py @@ -54,6 +54,11 @@ class DeliveryTrip(Document): self.update_status() self.update_delivery_notes(delete=True) + 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.")) @@ -80,7 +85,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 validate_delivery_note_not_draft(self): diff --git a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py index 83b7395f342..a0a0773406e 100644 --- a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py +++ b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py @@ -6,6 +6,7 @@ import frappe 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, @@ -108,6 +109,32 @@ class TestDeliveryTrip(ERPNextTestSuite): 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"}):