diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py index b110651ced9..b9eefdff786 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 4c9f5bae0e8..5338bf74557 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.mapper import make_delivery_trip from erpnext.stock.doctype.delivery_trip.delivery_trip import ( get_contact_and_address, get_default_contact, @@ -174,6 +175,32 @@ class TestDeliveryTrip(ERPNextTestSuite): self.assertEqual(result.parent, orphan_parent) self.assertIsNone(result.is_primary_contact) + 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"}):