Cleanup of schedule date functionality in Material Request
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json
index 07a80b8..af3f9a6 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.json
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.json
@@ -291,9 +291,9 @@
"search_index": 1,
"set_only_once": 0,
"unique": 0
- },
+ },
{
- "allow_bulk_edit": 0,
+ "allow_bulk_edit": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
diff --git a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
index 1ddce62..d56c3bd 100755
--- a/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
+++ b/erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
@@ -148,7 +148,7 @@
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
- "in_list_view": 0,
+ "in_list_view": 0,
"in_standard_filter": 0,
"label": "Reqd By Date",
"length": 0,
diff --git a/erpnext/demo/user/purchase.py b/erpnext/demo/user/purchase.py
index 960a316..82983f0 100644
--- a/erpnext/demo/user/purchase.py
+++ b/erpnext/demo/user/purchase.py
@@ -103,6 +103,7 @@
mr.material_request_type = "Purchase"
mr.transaction_date = frappe.flags.current_date
+ mr.schedule_date = frappe.utils.add_days(mr.transaction_date, 7)
mr.append("items", {
"doctype": "Material Request Item",
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 1d57a2f..3ef7be1 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -515,7 +515,8 @@
"transaction_date": nowdate(),
"status": "Draft",
"company": self.company,
- "requested_by": frappe.session.user
+ "requested_by": frappe.session.user,
+ "schedule_date": add_days(nowdate(), cint(item_wrapper.lead_time_days)),
})
material_request.update({"material_request_type": item_wrapper.default_material_request_type})
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 113c402..70122ba 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -449,3 +449,4 @@
erpnext.patches.v8_9.set_default_fields_in_variant_settings
erpnext.patches.v8_9.update_billing_gstin_for_indian_account
erpnext.patches.v9_0.fix_subscription_next_date
+erpnext.patches.v9_0.set_schedule_date_for_material_request
diff --git a/erpnext/patches/v9_0/set_schedule_date_for_material_request.py b/erpnext/patches/v9_0/set_schedule_date_for_material_request.py
new file mode 100644
index 0000000..39d4d41
--- /dev/null
+++ b/erpnext/patches/v9_0/set_schedule_date_for_material_request.py
@@ -0,0 +1,21 @@
+# Copyright (c) 2017, Frappe and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+ frappe.reload_doctype("Material Request")
+ frappe.reload_doctype("Material Request Item")
+
+ if not frappe.db.has_column("Material Request", "schedule_date"):
+ return
+
+ #Update only submitted MR
+ for mr in frappe.get_all("Material Request", filters= [["docstatus", "=", 1]], fields=["name"]):
+ material_request = frappe.get_doc("Material Request", mr)
+ if material_request.items:
+ if not material_request.schedule_date:
+ max_schedule_date = max([d.schedule_date for d in material_request.items])
+ frappe.db.set_value("Material Request", mr,
+ "schedule_date", max_schedule_date, update_modified=False)
\ No newline at end of file
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 00d2121..6f70ebe 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -92,7 +92,7 @@
// delivery note
if(flt(doc.per_delivered, 2) < 100 && ["Sales", "Shopping Cart"].indexOf(doc.order_type)!==-1 && allow_delivery) {
this.frm.add_custom_button(__('Delivery'),
- function() { me.make_delivery_note_based_on_delivery_note(); }, __("Make"));
+ function() { me.make_delivery_note_based_on_delivery_date(); }, __("Make"));
this.frm.add_custom_button(__('Production Order'),
function() { me.make_production_order() }, __("Make"));
@@ -270,7 +270,7 @@
})
},
- make_delivery_note_based_on_delivery_note: function() {
+ make_delivery_note_based_on_delivery_date: function() {
var me = this;
var delivery_dates = [];
diff --git a/erpnext/setup/setup_wizard/sample_data.py b/erpnext/setup/setup_wizard/sample_data.py
index bc26e09..43911f0 100644
--- a/erpnext/setup/setup_wizard/sample_data.py
+++ b/erpnext/setup/setup_wizard/sample_data.py
@@ -73,6 +73,7 @@
mr = frappe.get_doc({
"doctype": "Material Request",
"material_request_type": "Purchase",
+ "schedule_date": frappe.utils.add_days(frappe.utils.nowdate(), 7),
"items": [{
"schedule_date": frappe.utils.add_days(frappe.utils.nowdate(), 7),
"item_code": i.name,
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 7043fb7..4e4b0f7 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -17,6 +17,9 @@
// add item, if previous view was item
erpnext.utils.add_item(frm);
+ //set schedule_date
+ set_schedule_date(frm);
+
// formatter for material request item
frm.set_indicator_formatter('item_code',
function(doc) { return (doc.qty<=doc.ordered_qty) ? "green" : "orange" }),
@@ -38,13 +41,19 @@
},
item_code: function(frm, doctype, name) {
- frm.script_manager.copy_from_first_row('items', frm.selected_doc,
- 'schedule_date');
+ set_schedule_date(frm);
},
schedule_date: function(frm, cdt, cdn) {
- erpnext.utils.copy_value_in_all_row(frm.doc, cdt, cdn, "items", "schedule_date");
- }
+ var row = locals[cdt][cdn];
+ if (row.schedule_date) {
+ if(!frm.doc.schedule_date) {
+ erpnext.utils.copy_value_in_all_row(frm.doc, cdt, cdn, "items", "schedule_date");
+ } else {
+ set_schedule_date(frm);
+ }
+ }
+ }
});
erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.extend({
@@ -227,6 +236,28 @@
}
}
});
+ },
+
+ validate: function() {
+ set_schedule_date(this.frm);
+ },
+
+ items_add: function(doc, cdt, cdn) {
+ var row = frappe.get_doc(cdt, cdn);
+ if(doc.schedule_date) {
+ row.schedule_date = doc.schedule_date;
+ refresh_field("schedule_date", cdn, "items");
+ } else {
+ this.frm.script_manager.copy_from_first_row("items", row, ["schedule_date"]);
+ }
+ },
+
+ items_on_form_rendered: function() {
+ set_schedule_date(this.frm);
+ },
+
+ schedule_date: function() {
+ set_schedule_date(this.frm);
}
});
@@ -246,3 +277,9 @@
cur_frm.refresh();
});
};
+
+function set_schedule_date(frm) {
+ if(frm.doc.schedule_date){
+ erpnext.utils.copy_value_in_all_row(frm.doc, frm.doc.doctype, frm.doc.name, "items", "schedule_date");
+ }
+}
\ No newline at end of file
diff --git a/erpnext/stock/doctype/material_request/material_request.json b/erpnext/stock/doctype/material_request/material_request.json
index 87cde0d..ba37345 100644
--- a/erpnext/stock/doctype/material_request/material_request.json
+++ b/erpnext/stock/doctype/material_request/material_request.json
@@ -44,6 +44,38 @@
},
{
"allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "naming_series",
+ "fieldtype": "Select",
+ "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": "Series",
+ "length": 0,
+ "no_copy": 1,
+ "oldfieldname": "naming_series",
+ "oldfieldtype": "Select",
+ "options": "MREQ-",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "read_only": 0,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 1,
+ "unique": 0
+ },
+ {
+ "allow_bulk_edit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
@@ -133,69 +165,33 @@
},
{
"allow_bulk_edit": 0,
- "allow_on_submit": 0,
+ "allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "naming_series",
- "fieldtype": "Select",
+ "fieldname": "schedule_date",
+ "fieldtype": "Date",
"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": "Series",
- "length": 0,
- "no_copy": 1,
- "oldfieldname": "naming_series",
- "oldfieldtype": "Select",
- "options": "MREQ-",
- "permlevel": 0,
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "amended_from",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 1,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
- "label": "Amended From",
+ "label": "Required Date",
"length": 0,
- "no_copy": 1,
- "oldfieldname": "amended_from",
- "oldfieldtype": "Data",
- "options": "Material Request",
+ "no_copy": 0,
"permlevel": 0,
- "print_hide": 1,
+ "precision": "",
+ "print_hide": 0,
"print_hide_if_no_value": 0,
- "print_width": "150px",
- "read_only": 1,
+ "read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
- "unique": 0,
- "width": "150px"
+ "unique": 0
},
{
"allow_bulk_edit": 0,
@@ -238,6 +234,40 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
+ "fieldname": "amended_from",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 1,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_global_search": 0,
+ "in_list_view": 0,
+ "in_standard_filter": 0,
+ "label": "Amended From",
+ "length": 0,
+ "no_copy": 1,
+ "oldfieldname": "amended_from",
+ "oldfieldtype": "Data",
+ "options": "Material Request",
+ "permlevel": 0,
+ "print_hide": 1,
+ "print_hide_if_no_value": 0,
+ "print_width": "150px",
+ "read_only": 1,
+ "remember_last_selected_value": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0,
+ "unique": 0,
+ "width": "150px"
+ },
+ {
+ "allow_bulk_edit": 0,
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
"fieldname": "items_section",
"fieldtype": "Section Break",
"hidden": 0,
@@ -686,7 +716,7 @@
"istable": 0,
"max_attachments": 0,
"menu_index": 0,
- "modified": "2017-07-26 19:43:31.823549",
+ "modified": "2017-10-05 18:24:17.148782",
"modified_by": "Administrator",
"module": "Stock",
"name": "Material Request",
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 65263a0..4e9d290 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -54,9 +54,18 @@
frappe.throw(_("Material Request of maximum {0} can be made for Item {1} against Sales Order {2}").format(actual_so_qty - already_indented, item, so_no))
def validate_schedule_date(self):
- for d in self.get('items'):
- if d.schedule_date and getdate(d.schedule_date) < getdate(self.transaction_date):
- frappe.throw(_("Expected Date cannot be before Material Request Date"))
+ if not self.schedule_date:
+ self.schedule_date = max([d.schedule_date for d in self.get("items")])
+
+ if self.schedule_date:
+ for d in self.get('items'):
+ if not d.schedule_date:
+ d.schedule_date = self.schedule_date
+
+ if d.schedule_date and getdate(d.schedule_date) < getdate(self.transaction_date):
+ frappe.throw(_("Expected Date cannot be before Material Request Date"))
+ else:
+ frappe.throw(_("Please enter Schedule Date"))
# Validate
# ---------------------
@@ -70,9 +79,9 @@
self.status = "Draft"
from erpnext.controllers.status_updater import validate_status
- validate_status(self.status, ["Draft", "Submitted", "Stopped", "Cancelled", "Pending",
- "Partially Ordered", "Ordered", "Issued", "Transferred"]
- )
+ validate_status(self.status,
+ ["Draft", "Submitted", "Stopped", "Cancelled", "Pending",
+ "Partially Ordered", "Ordered", "Issued", "Transferred"])
validate_for_items(self)
diff --git a/erpnext/stock/doctype/material_request/test_records.json b/erpnext/stock/doctype/material_request/test_records.json
index 09d1912..1c71496 100644
--- a/erpnext/stock/doctype/material_request/test_records.json
+++ b/erpnext/stock/doctype/material_request/test_records.json
@@ -29,7 +29,8 @@
],
"material_request_type": "Purchase",
"naming_series": "_T-Material Request-",
- "transaction_date": "2013-02-18"
+ "transaction_date": "2013-02-18",
+ "schedule_date": "2013-02-19"
},
{
"company": "_Test Company",
@@ -43,13 +44,14 @@
"item_name": "_Test FG Item",
"parentfield": "items",
"qty": 5,
- "schedule_date": "2013-02-18",
+ "schedule_date": "2013-02-19",
"uom": "_Test UOM 1",
"warehouse": "_Test Warehouse - _TC"
}
],
"material_request_type": "Manufacture",
"naming_series": "_T-Material Request-",
- "transaction_date": "2013-02-18"
+ "transaction_date": "2013-02-18",
+ "schedule_date": "2013-02-19"
}
]
\ No newline at end of file
diff --git a/erpnext/stock/doctype/material_request/tests/test_material_request.js b/erpnext/stock/doctype/material_request/tests/test_material_request.js
index 22d1088..1ae41f5 100644
--- a/erpnext/stock/doctype/material_request/tests/test_material_request.js
+++ b/erpnext/stock/doctype/material_request/tests/test_material_request.js
@@ -11,14 +11,25 @@
{'schedule_date': frappe.datetime.add_days(frappe.datetime.nowdate(), 5)},
{'qty': 5},
{'item_code': 'Test Product 1'},
+ ],
+ [
+ {'schedule_date': frappe.datetime.add_days(frappe.datetime.nowdate(), 6)},
+ {'qty': 2},
+ {'item_code': 'Test Product 2'},
]
]},
]);
},
() => cur_frm.save(),
() => {
+ assert.ok(cur_frm.doc.schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 5), "Schedule Date correct");
+
// get_item_details
assert.ok(cur_frm.doc.items[0].item_name=='Test Product 1', "Item name correct");
+ assert.ok(cur_frm.doc.items[0].schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 5), "Schedule Date correct");
+
+ assert.ok(cur_frm.doc.items[1].item_name=='Test Product 2', "Item name correct");
+ assert.ok(cur_frm.doc.items[1].schedule_date == frappe.datetime.add_days(frappe.datetime.now_date(), 6), "Schedule Date correct");
},
() => frappe.tests.click_button('Submit'),
() => frappe.tests.click_button('Yes'),
diff --git a/erpnext/stock/reorder_item.py b/erpnext/stock/reorder_item.py
index 01a6a6d..8da9f11 100644
--- a/erpnext/stock/reorder_item.py
+++ b/erpnext/stock/reorder_item.py
@@ -121,7 +121,8 @@
mr.update({
"company": company,
"transaction_date": nowdate(),
- "material_request_type": "Material Transfer" if request_type=="Transfer" else request_type
+ "material_request_type": "Material Transfer" if request_type=="Transfer" else request_type,
+ "schedule_date": add_days(nowdate(), cint(items[0].lead_time_days))
})
for d in items: