Merge branch 'develop' into feat/add-delivery-cutoff-date-on-so
diff --git a/erpnext/public/js/bulk_transaction_processing.js b/erpnext/public/js/bulk_transaction_processing.js
index 0e42b47..3ae5a5d 100644
--- a/erpnext/public/js/bulk_transaction_processing.js
+++ b/erpnext/public/js/bulk_transaction_processing.js
@@ -1,7 +1,7 @@
frappe.provide("erpnext.bulk_transaction_processing");
$.extend(erpnext.bulk_transaction_processing, {
- create: function(listview, from_doctype, to_doctype) {
+ create: function(listview, from_doctype, to_doctype, args) {
let checked_items = listview.get_checked_items();
const doc_name = [];
checked_items.forEach((Item)=> {
@@ -15,7 +15,7 @@
if (doc_name.length == 0) {
frappe.call({
method: "erpnext.utilities.bulk_transaction.transaction_processing",
- args: {data: checked_items, from_doctype: from_doctype, to_doctype: to_doctype}
+ args: {data: checked_items, from_doctype: from_doctype, to_doctype: to_doctype, args: args}
}).then(()=> {
});
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 2bb093d..1713a7b 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -855,6 +855,8 @@
var delivery_dates = this.frm.doc.items.map(i => i.delivery_date);
delivery_dates = [ ...new Set(delivery_dates) ];
+ var today = new Date();
+
var item_grid = this.frm.fields_dict["items"].grid;
if(!item_grid.get_selected().length && delivery_dates.length > 1) {
var dialog = new frappe.ui.Dialog({
@@ -873,7 +875,11 @@
<div class="list-item">
<div class="list-item__content list-item__content--flex-2">
<label>
- <input type="checkbox" data-date="${date}" checked="checked"/>
+ <input
+ type="checkbox"
+ data-date="${date}"
+ ${frappe.datetime.get_day_diff(new Date(date), today) > 0 ? "" : 'checked="checked"'}
+ />
${frappe.datetime.str_to_user(date)}
</label>
</div>
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 79f24d1..66b803c 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -932,6 +932,9 @@
if frappe.flags.args and frappe.flags.args.delivery_dates:
if cstr(doc.delivery_date) not in frappe.flags.args.delivery_dates:
return False
+ if frappe.flags.args and frappe.flags.args.until_delivery_date:
+ if cstr(doc.delivery_date) > frappe.flags.args.until_delivery_date:
+ return False
return abs(doc.delivered_qty) < abs(doc.qty) and doc.delivered_by_supplier != 1
diff --git a/erpnext/selling/doctype/sales_order/sales_order_list.js b/erpnext/selling/doctype/sales_order/sales_order_list.js
index 37686a8..822c6cb 100644
--- a/erpnext/selling/doctype/sales_order/sales_order_list.js
+++ b/erpnext/selling/doctype/sales_order/sales_order_list.js
@@ -55,7 +55,18 @@
});
listview.page.add_action_item(__("Delivery Note"), ()=>{
- erpnext.bulk_transaction_processing.create(listview, "Sales Order", "Delivery Note");
+ var dialog = new frappe.ui.Dialog({
+ title: __("Select Items up to Delivery Date"),
+ fields: [{fieldtype: "Date", fieldname: "delivery_date", default: frappe.datetime.add_days(frappe.datetime.nowdate(), 1)}]
+ });
+ dialog.set_primary_action(__("Select"), function(values) {
+ var until_delivery_date = values.delivery_date;
+ erpnext.bulk_transaction_processing.create(listview, "Sales Order", "Delivery Note", {
+ until_delivery_date
+ });
+ dialog.hide();
+ });
+ dialog.show();
});
listview.page.add_action_item(__("Advance Payment"), ()=>{
diff --git a/erpnext/utilities/bulk_transaction.py b/erpnext/utilities/bulk_transaction.py
index 9678488..f8b9aaa 100644
--- a/erpnext/utilities/bulk_transaction.py
+++ b/erpnext/utilities/bulk_transaction.py
@@ -7,12 +7,15 @@
@frappe.whitelist()
-def transaction_processing(data, from_doctype, to_doctype):
+def transaction_processing(data, from_doctype, to_doctype, args=None):
if isinstance(data, str):
deserialized_data = json.loads(data)
else:
deserialized_data = data
+ if isinstance(args, str):
+ args = frappe._dict(json.loads(args))
+
length_of_data = len(deserialized_data)
frappe.msgprint(
@@ -23,6 +26,7 @@
deserialized_data=deserialized_data,
from_doctype=from_doctype,
to_doctype=to_doctype,
+ args=args,
)
@@ -71,8 +75,13 @@
frappe.db.set_value("Bulk Transaction Log Detail", log_name, "error_description", err)
-def job(deserialized_data, from_doctype, to_doctype):
+def job(deserialized_data, from_doctype, to_doctype, args):
fail_count = 0
+
+ if args:
+ # currently: flag-based transport to `task`
+ frappe.flags.args = args
+
for d in deserialized_data:
try:
doc_name = d.get("name")