diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py index fbaafbe73fd..1e8c624f472 100644 --- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py +++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py @@ -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): diff --git a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py index 09f5b2c2c89..c9075f30fdd 100644 --- a/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py +++ b/erpnext/stock/doctype/delivery_trip/test_delivery_trip.py @@ -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"}):