diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index e0ee3708f43..e6029aa4eaf 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -103,6 +103,11 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( me.make_sales_return() }, __("Make")); } + if (doc.docstatus==1) { + this.frm.add_custom_button(__('Delivery Trip'), function() { + me.make_delivery_trip() }, __("Make")); + } + if(doc.docstatus==0 && !doc.__islocal) { this.frm.add_custom_button(__('Packing Slip'), function() { frappe.model.open_mapped_doc({ @@ -195,6 +200,13 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( }) }, + make_delivery_trip: function() { + frappe.model.open_mapped_doc({ + method: "erpnext.stock.doctype.delivery_note.delivery_note.make_delivery_trip", + frm: this.frm + }) + }, + tc_name: function() { this.get_terms(); }, diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index 65f384f6d90..e7618c237f9 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -439,6 +439,33 @@ def make_sales_invoice(source_name, target_doc=None): return doc +@frappe.whitelist() +def make_delivery_trip(source_name, target_doc=None): + def update_stop_details(source_doc, target_doc, source_parent): + target_doc.customer = source_parent.customer + target_doc.address = source_parent.shipping_address_name + target_doc.customer_address = source_parent.shipping_address + target_doc.contact = source_parent.contact_person + target_doc.customer_contact = source_parent.contact_display + + doclist = get_mapped_doc("Delivery Note", source_name, { + "Delivery Note": { + "doctype": "Delivery Trip", + "validation": { + "docstatus": ["=", 1] + } + }, + "Delivery Note Item": { + "doctype": "Delivery Stop", + "field_map": { + "parent": "delivery_note" + }, + "postprocess": update_stop_details, + } + }, target_doc) + + return doclist + @frappe.whitelist() def make_installation_note(source_name, target_doc=None): def update_item(obj, target, source_parent): diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index c3dbb8d4e73..7433b71be22 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -12,7 +12,7 @@ from erpnext.stock.stock_ledger import get_previous_sle from erpnext.accounts.utils import get_balance_on from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt \ import get_gl_entries, set_perpetual_inventory -from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice +from erpnext.stock.doctype.delivery_note.delivery_note import make_sales_invoice, make_delivery_trip from erpnext.stock.doctype.stock_entry.test_stock_entry \ import make_stock_entry, make_serialized_item, get_qty_after_transaction from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos, SerialNoWarehouseError @@ -564,6 +564,11 @@ class TestDeliveryNote(unittest.TestCase): self.assertEqual(dn.per_billed, 100) self.assertEqual(dn.status, "Completed") + def test_delivery_trip(self): + dn = create_delivery_note() + dt = make_delivery_trip(dn.name) + self.assertEqual(dn.name, dt.delivery_stops[0].delivery_note) + def create_delivery_note(**args): dn = frappe.new_doc("Delivery Note") args = frappe._dict(args) diff --git a/erpnext/stock/doctype/delivery_stop/delivery_stop.json b/erpnext/stock/doctype/delivery_stop/delivery_stop.json index 311f70e3b7a..cd71f2128ce 100644 --- a/erpnext/stock/doctype/delivery_stop/delivery_stop.json +++ b/erpnext/stock/doctype/delivery_stop/delivery_stop.json @@ -41,6 +41,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -72,6 +73,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -101,6 +103,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -131,6 +134,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -160,6 +164,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -191,6 +196,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -220,6 +226,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -250,6 +257,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -279,6 +287,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -309,6 +318,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -339,6 +349,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -368,6 +379,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -376,8 +388,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "select_delivery_notes", - "fieldtype": "Button", + "fieldname": "delivery_note", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, @@ -385,71 +397,13 @@ "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, - "label": "Select/Unselect Delivery Notes", + "label": "Delivery Note", "length": 0, - "no_copy": 0, + "no_copy": 1, + "options": "Delivery Note", "permlevel": 0, "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_14", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "delivery_notes", - "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Delivery Notes", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, + "print_hide": 1, "print_hide_if_no_value": 0, "read_only": 1, "remember_last_selected_value": 0, @@ -457,6 +411,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -486,6 +441,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -516,6 +472,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -545,6 +502,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -575,6 +533,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -588,7 +547,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2017-11-13 04:09:56.257540", + "modified": "2018-02-22 16:43:55.257470", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Stop", diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.js b/erpnext/stock/doctype/delivery_trip/delivery_trip.js index 4091463a69e..f7ec7e3770a 100644 --- a/erpnext/stock/doctype/delivery_trip/delivery_trip.js +++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.js @@ -36,6 +36,24 @@ frappe.ui.form.on('Delivery Trip', { frm.trigger('notify_customers'); }); } + + if (frm.doc.docstatus===0) { + frm.add_custom_button(__('Delivery Note'), () => { + erpnext.utils.map_current_doc({ + method: "erpnext.stock.doctype.delivery_note.delivery_note.make_delivery_trip", + source_doctype: "Delivery Note", + target: frm, + date_field: "posting_date", + setters: { + company: frm.doc.company, + }, + get_query_filters: { + docstatus: 1, + company: frm.doc.company, + } + }) + }, __("Get customers from")); + } }, calculate_arrival_time: function (frm) { @@ -154,58 +172,5 @@ frappe.ui.form.on('Delivery Stop', { } else { frappe.model.set_value(cdt, cdn, "customer_contact", ""); } - }, - - select_delivery_notes: function (frm, cdt, cdn) { - var row = locals[cdt][cdn]; - frappe.call({ - method: "erpnext.stock.doctype.delivery_trip.delivery_trip.get_delivery_notes", - args: {"customer": row.customer}, - callback: function (r) { - var delivery_notes = []; - $.each(r.message, function (field, value) { - delivery_notes.push(value.name); - }); - if (r.message) { - var d = new frappe.ui.Dialog({ - title: __("Select Delivery Notes"), - fields: [{fieldtype: "HTML", fieldname: "delivery_notes_html"}] - }); - var html = $(` -
-
-
- ${__('Delivery Notes')} -
-
- ${delivery_notes.map(delivery_note => ` -
-
- -
-
- `).join("")} -
- `); - - var delivery_notes_el = d.fields_dict.delivery_notes_html.$wrapper.html(html); - - d.set_primary_action(__("Select"), function () { - var delivery_notes = delivery_notes_el.find('input[type=checkbox]:checked') - .map((i, el) => $(el).attr('data-delivery-note')).toArray(); - if (!delivery_notes) return; - frappe.model.set_value(cdt, cdn, "delivery_notes", delivery_notes.join(",")); - d.hide(); - }); - d.show(); - } - else { - frappe.msgprint(__("No submitted Delivery Notes found")); - } - } - }); } }); \ No newline at end of file diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.json b/erpnext/stock/doctype/delivery_trip/delivery_trip.json index 98aaa1c5f0e..d6872daca9f 100644 --- a/erpnext/stock/doctype/delivery_trip/delivery_trip.json +++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.json @@ -42,6 +42,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -73,6 +74,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -102,6 +104,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -132,6 +135,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -161,6 +165,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -191,6 +196,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -221,6 +227,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -250,6 +257,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -281,6 +289,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -312,6 +321,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -343,6 +353,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -373,6 +384,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -404,6 +416,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -435,6 +448,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -464,6 +478,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -472,7 +487,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "Delivery Notification", + "default": "", "fieldname": "delivery_notification", "fieldtype": "Link", "hidden": 0, @@ -496,6 +511,7 @@ "reqd": 1, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 }, { @@ -526,6 +542,7 @@ "reqd": 0, "search_index": 0, "set_only_once": 0, + "translatable": 0, "unique": 0 } ], @@ -539,8 +556,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-12-19 12:00:49.226226", - "modified_by": "nabinhait@gmail.com", + "modified": "2018-02-22 17:36:05.521302", + "modified_by": "Administrator", "module": "Stock", "name": "Delivery Trip", "name_case": "", diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py index 45de5e75500..471e1a3f58d 100644 --- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py +++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py @@ -82,14 +82,6 @@ def get_contact_display(contact): } return contact_info.html - -@frappe.whitelist() -def get_delivery_notes(customer): - return frappe.db.get_all("Delivery Note", filters={ - 'customer': customer, - 'docstatus': 1 - }) - @frappe.whitelist() def calculate_time_matrix(name): """Calucation and round in closest 15 minutes, delivery stops""" @@ -156,21 +148,17 @@ def notify_customers(docname, date, driver, vehicle, sender_email, delivery_noti delivery_stop_info = frappe.db.get_value( "Delivery Stop", delivery_stop.name, - ["notified_by_email", "estimated_arrival", "details", "contact", "delivery_notes"], + ["notified_by_email", "estimated_arrival", "details", "contact", "delivery_note"], as_dict=1) contact_info = frappe.db.get_value("Contact", delivery_stop_info.contact, ["first_name", "last_name", "email_id", "gender"], as_dict=1) - if delivery_stop_info.delivery_notes: - delivery_notes = (delivery_stop_info.delivery_notes).split(",") + if delivery_stop_info.delivery_note: default_print_format = frappe.get_meta('Delivery Note').default_print_format - attachments = [] - for delivery_note in delivery_notes: - attachments.append( - frappe.attach_print('Delivery Note', - delivery_note, - file_name="Delivery Note", - print_format=default_print_format or "Standard")) + attachments = frappe.attach_print('Delivery Note', + delivery_stop_info.delivery_note, + file_name="Delivery Note", + print_format=default_print_format or "Standard") if not delivery_stop_info.notified_by_email and contact_info.email_id: driver_info = frappe.db.get_value("Driver", driver, ["full_name", "cell_number"], as_dict=1)