Added delivery date in SO parent form. Fixes #10104 (#10155)
* Added delivery date in SO parent form. Fixes #10104
* UI tests for sales order delivery date
diff --git a/erpnext/controllers/tests/test_recurring_document.py b/erpnext/controllers/tests/test_recurring_document.py
index e218fa6..d47c5c7 100644
--- a/erpnext/controllers/tests/test_recurring_document.py
+++ b/erpnext/controllers/tests/test_recurring_document.py
@@ -27,8 +27,7 @@
base_doc.set(date_field, today)
if base_doc.doctype == "Sales Order":
- for d in base_doc.get("items"):
- d.set("delivery_date", add_days(today, 15))
+ base_doc.set("delivery_date", add_days(today, 15))
# monthly
doc1 = frappe.copy_doc(base_doc)
diff --git a/erpnext/demo/user/sales.py b/erpnext/demo/user/sales.py
index 666e201..ddd36ef 100644
--- a/erpnext/demo/user/sales.py
+++ b/erpnext/demo/user/sales.py
@@ -118,8 +118,7 @@
from erpnext.selling.doctype.quotation.quotation import make_sales_order
so = frappe.get_doc(make_sales_order(q))
so.transaction_date = frappe.flags.current_date
- for d in so.get("items"):
- d.delivery_date = frappe.utils.add_days(frappe.flags.current_date, 10)
+ so.delivery_date = frappe.utils.add_days(frappe.flags.current_date, 10)
so.insert()
frappe.db.commit()
so.submit()
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 6e2284f..2923d6d 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -422,7 +422,7 @@
erpnext.patches.v8_3.set_restrict_to_domain_for_module_def
erpnext.patches.v8_1.update_expense_claim_status
erpnext.patches.v8_3.update_company_total_sales
-erpnext.patches.v8_1.set_delivery_date_in_so_item
+erpnext.patches.v8_1.set_delivery_date_in_so_item #2017-07-28
erpnext.patches.v8_5.fix_tax_breakup_for_non_invoice_docs
erpnext.patches.v8_5.update_customer_group_in_POS_profile
erpnext.patches.v8_6.update_timesheet_company_from_PO
\ No newline at end of file
diff --git a/erpnext/patches/v8_1/set_delivery_date_in_so_item.py b/erpnext/patches/v8_1/set_delivery_date_in_so_item.py
index 6840424..963b82a 100644
--- a/erpnext/patches/v8_1/set_delivery_date_in_so_item.py
+++ b/erpnext/patches/v8_1/set_delivery_date_in_so_item.py
@@ -4,10 +4,18 @@
frappe.reload_doctype("Sales Order")
frappe.reload_doctype("Sales Order Item")
- frappe.db.sql("""update `tabSales Order` set final_delivery_date = delivery_date where docstatus=1""")
+ if "final_delivery_date" in frappe.db.get_table_columns("Sales Order"):
+ frappe.db.sql("""
+ update `tabSales Order`
+ set delivery_date = final_delivery_date
+ where (delivery_date is null or delivery_date = '' or delivery_date = '0000-00-00')
+ and order_type = 'Sales'""")
frappe.db.sql("""
update `tabSales Order` so, `tabSales Order Item` so_item
set so_item.delivery_date = so.delivery_date
where so.name = so_item.parent
+ and so.order_type = 'Sales'
+ and (so_item.delivery_date is null or so_item.delivery_date = ''
+ or so_item.delivery_date = '0000-00-00')
""")
\ No newline at end of file
diff --git a/erpnext/selling/doctype/quotation/test_quotation.py b/erpnext/selling/doctype/quotation/test_quotation.py
index 7fb4074..fa69df4 100644
--- a/erpnext/selling/doctype/quotation/test_quotation.py
+++ b/erpnext/selling/doctype/quotation/test_quotation.py
@@ -27,8 +27,7 @@
self.assertEquals(sales_order.get("items")[0].prevdoc_docname, quotation.name)
self.assertEquals(sales_order.customer, "_Test Customer")
- for d in sales_order.get("items"):
- d.delivery_date = "2014-01-01"
+ sales_order.delivery_date = "2014-01-01"
sales_order.naming_series = "_T-Quotation-"
sales_order.transaction_date = "2013-05-12"
sales_order.insert()
@@ -54,8 +53,7 @@
sales_order = make_sales_order(quotation.name)
sales_order.naming_series = "_T-Quotation-"
sales_order.transaction_date = "2016-01-01"
- for d in sales_order.get("items"):
- d.delivery_date = "2016-01-02"
+ sales_order.delivery_date = "2016-01-02"
sales_order.insert()
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 2e01a08..80dc4f2 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -34,11 +34,20 @@
erpnext.queries.setup_warehouse_query(frm);
},
+
+ delivery_date: function(frm) {
+ $.each(frm.doc.items || [], function(i, d) {
+ if(!d.delivery_date) d.delivery_date = frm.doc.delivery_date;
+ });
+ refresh_field("items");
+ }
});
frappe.ui.form.on("Sales Order Item", {
delivery_date: function(frm, cdt, cdn) {
- erpnext.utils.copy_value_in_all_row(frm.doc, cdt, cdn, "items", "delivery_date");
+ if(!frm.doc.delivery_date) {
+ erpnext.utils.copy_value_in_all_row(frm.doc, cdt, cdn, "items", "delivery_date");
+ }
}
});
@@ -416,8 +425,13 @@
items_add: function(doc, cdt, cdn) {
var row = frappe.get_doc(cdt, cdn);
- this.frm.script_manager.copy_from_first_row("items", row, ["delivery_date"]);
+ if(doc.delivery_date) {
+ row.delivery_date = doc.delivery_date;
+ refresh_field("delivery_date", cdn, "items");
+ } else {
+ this.frm.script_manager.copy_from_first_row("items", row, ["delivery_date"]);
+ }
}
});
-$.extend(cur_frm.cscript, new erpnext.selling.SalesOrderController({frm: cur_frm}));
+$.extend(cur_frm.cscript, new erpnext.selling.SalesOrderController({frm: cur_frm}));
\ No newline at end of file
diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json
index 596bf2f..bf2ccf7 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.json
+++ b/erpnext/selling/doctype/sales_order/sales_order.json
@@ -367,23 +367,23 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "final_delivery_date",
+ "fieldname": "delivery_date",
"fieldtype": "Date",
- "hidden": 1,
+ "hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1,
"in_standard_filter": 0,
- "label": "Final Delivery Date",
+ "label": "Delivery Date",
"length": 0,
"no_copy": 1,
"permlevel": 0,
"precision": "",
- "print_hide": 1,
+ "print_hide": 0,
"print_hide_if_no_value": 0,
- "read_only": 1,
+ "read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
@@ -3659,7 +3659,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-07-25 13:45:02.965353",
+ "modified": "2017-07-28 14:03:33.373347",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order",
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index fd80dc8..c6dbd70 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -101,20 +101,20 @@
super(SalesOrder, self).validate_order_type()
def validate_delivery_date(self):
- self.final_delivery_date = None
if self.order_type == 'Sales':
- for d in self.get("items"):
- if not d.delivery_date:
- frappe.throw(_("Row #{0}: Please enter Delivery Date against item {1}")
- .format(d.idx, d.item_code))
+ if not self.delivery_date:
+ self.delivery_date = max([d.delivery_date for d in self.get("items")])
- if getdate(self.transaction_date) > getdate(d.delivery_date):
- frappe.msgprint(_("Expected Delivery Date should be after Sales Order Date"),
- indicator='orange', title=_('Warning'))
-
- if not self.final_delivery_date or \
- (d.delivery_date and getdate(d.delivery_date) > getdate(self.final_delivery_date)):
- self.final_delivery_date = d.delivery_date
+ if self.delivery_date:
+ for d in self.get("items"):
+ if not d.delivery_date:
+ d.delivery_date = self.delivery_date
+
+ if getdate(self.transaction_date) > getdate(d.delivery_date):
+ frappe.msgprint(_("Expected Delivery Date should be after Sales Order Date"),
+ indicator='orange', title=_('Warning'))
+ else:
+ frappe.throw(_("Please enter Delivery Date"))
self.validate_sales_mntc_quotation()
@@ -347,6 +347,9 @@
def on_recurring(self, reference_doc):
mcount = month_map[reference_doc.recurring_type]
+ self.set("delivery_date", get_next_date(reference_doc.delivery_date, mcount,
+ cint(reference_doc.repeat_on_day_of_month)))
+
for d in self.get("items"):
reference_delivery_date = frappe.db.get_value("Sales Order Item",
{"parent": reference_doc.name, "item_code": d.item_code, "idx": d.idx}, "delivery_date")
diff --git a/erpnext/selling/doctype/sales_order/sales_order_list.js b/erpnext/selling/doctype/sales_order/sales_order_list.js
index 0ee9cf3..9751935 100644
--- a/erpnext/selling/doctype/sales_order/sales_order_list.js
+++ b/erpnext/selling/doctype/sales_order/sales_order_list.js
@@ -1,14 +1,14 @@
frappe.listview_settings['Sales Order'] = {
- add_fields: ["base_grand_total", "customer_name", "currency", "final_delivery_date",
+ add_fields: ["base_grand_total", "customer_name", "currency", "delivery_date",
"per_delivered", "per_billed", "status", "order_type", "name"],
get_indicator: function(doc) {
if(doc.status==="Closed"){
return [__("Closed"), "green", "status,=,Closed"];
} else if (doc.order_type !== "Maintenance"
- && flt(doc.per_delivered, 2) < 100 && frappe.datetime.get_diff(doc.final_delivery_date) < 0) {
+ && flt(doc.per_delivered, 2) < 100 && frappe.datetime.get_diff(doc.delivery_date) < 0) {
// to bill & overdue
- return [__("Overdue"), "red", "per_delivered,<,100|final_delivery_date,<,Today|status,!=,Closed"];
+ return [__("Overdue"), "red", "per_delivered,<,100|delivery_date,<,Today|status,!=,Closed"];
} else if (doc.order_type !== "Maintenance"
&& flt(doc.per_delivered, 2) < 100 && doc.status!=="Closed") {
diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.js b/erpnext/selling/doctype/sales_order/test_sales_order.js
new file mode 100644
index 0000000..87f0e96
--- /dev/null
+++ b/erpnext/selling/doctype/sales_order/test_sales_order.js
@@ -0,0 +1,59 @@
+/* eslint-disable */
+// rename this file from _test_[name] to test_[name] to activate
+// and remove above this line
+
+QUnit.test("test: Sales Order", function (assert) {
+ assert.expect(2);
+ let done = assert.async();
+ let delivery_date = frappe.datetime.add_days(frappe.defaults.get_default("year_end_date"), 1);
+
+ frappe.run_serially([
+ // insert a new Sales Order
+ () => {
+ return frappe.tests.make('Sales Order', [
+ {customer: "Test Customer 1"},
+ {delivery_date: delivery_date},
+ {order_type: 'Sales'},
+ {items: [
+ [
+ {"item_code": "Test Product 1"},
+ {"qty": 5},
+ {'rate': 100},
+ ]]
+ }
+ ])
+ },
+ () => {
+ assert.ok(cur_frm.doc.items[0].delivery_date == delivery_date);
+ },
+ () => frappe.timeout(1),
+ // make SO without delivery date in parent,
+ // parent delivery date should be set based on final delivery date entered in item
+ () => {
+ return frappe.tests.make('Sales Order', [
+ {customer: "Test Customer 1"},
+ {order_type: 'Sales'},
+ {items: [
+ [
+ {"item_code": "Test Product 1"},
+ {"qty": 5},
+ {'rate': 100},
+ {'delivery_date': delivery_date}
+ ],
+ [
+ {"item_code": "Test Product 2"},
+ {"qty": 5},
+ {'rate': 100},
+ {'delivery_date': frappe.datetime.add_days(delivery_date, 5)}
+ ]]
+ }
+ ])
+ },
+ () => cur_frm.save(),
+ () => frappe.timeout(1),
+ () => {
+ assert.ok(cur_frm.doc.delivery_date == frappe.datetime.add_days(delivery_date, 5));
+ },
+ () => done()
+ ]);
+});
\ No newline at end of file
diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py
index 8c07118..ce8c18a 100644
--- a/erpnext/selling/doctype/sales_order/test_sales_order.py
+++ b/erpnext/selling/doctype/sales_order/test_sales_order.py
@@ -532,8 +532,7 @@
"rate": args.rate or 100
})
- for d in so.get("items"):
- d.delivery_date = add_days(so.transaction_date, 10)
+ so.delivery_date = add_days(so.transaction_date, 10)
if not args.do_not_save:
so.insert()
diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json
index f14f50d..47bc1b6 100644
--- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json
+++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json
@@ -220,7 +220,7 @@
"no_copy": 1,
"permlevel": 0,
"precision": "",
- "print_hide": 0,
+ "print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
@@ -1963,7 +1963,7 @@
"istable": 1,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2017-07-18 18:26:36.870342",
+ "modified": "2017-07-28 14:04:04.289428",
"modified_by": "Administrator",
"module": "Selling",
"name": "Sales Order Item",
diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt
index 42233dc..40b1c59 100644
--- a/erpnext/tests/ui/tests.txt
+++ b/erpnext/tests/ui/tests.txt
@@ -2,4 +2,5 @@
erpnext/accounts/doctype/account/test_account.js
erpnext/crm/doctype/lead/test_lead.js
erpnext/crm/doctype/opportunity/test_opportunity.js
-erpnext/selling/doctype/quotation/test_quotation.js
\ No newline at end of file
+erpnext/selling/doctype/quotation/test_quotation.js
+erpnext/selling/doctype/sales_order/test_sales_order.js
\ No newline at end of file