Merge pull request #23824 from marination/delete-quoted-item-old-report-pre-release
chore: Delete Quoted Item Comparison Report
diff --git a/erpnext/accounts/doctype/budget/test_budget.py b/erpnext/accounts/doctype/budget/test_budget.py
index 61c48c7..0f115f9 100644
--- a/erpnext/accounts/doctype/budget/test_budget.py
+++ b/erpnext/accounts/doctype/budget/test_budget.py
@@ -158,8 +158,11 @@
set_total_expense_zero(nowdate(), "cost_center")
budget = make_budget(budget_against="Cost Center")
+ month = now_datetime().month
+ if month > 10:
+ month = 10
- for i in range(now_datetime().month):
+ for i in range(month):
jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
"_Test Bank - _TC", 20000, "_Test Cost Center - _TC", posting_date=nowdate(), submit=True)
@@ -177,8 +180,11 @@
set_total_expense_zero(nowdate(), "project")
budget = make_budget(budget_against="Project")
+ month = now_datetime().month
+ if month > 10:
+ month = 10
- for i in range(now_datetime().month):
+ for i in range(month):
jv = make_journal_entry("_Test Account Cost for Goods Sold - _TC",
"_Test Bank - _TC", 20000, "_Test Cost Center - _TC", posting_date=nowdate(), submit=True, project="_Test Project")
diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js
index 7425132..6dc4643 100644
--- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js
+++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js
@@ -92,7 +92,7 @@
frm.refresh_field('customers');
}
else{
- frappe.msgprint('No Customers found with selected options.');
+ frappe.throw('No Customers found with selected options.');
}
}
}
diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
index d50e4a8..43fbb06 100644
--- a/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
+++ b/erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.py
@@ -126,9 +126,11 @@
sales_person_records = frappe._dict()
for d in records:
sales_person_records.setdefault(d.parenttype, set()).add(d.parent)
- customers = frappe.get_list('Customer', fields=['name', 'email_id'], \
+ if sales_person_records.get('Customer'):
+ return frappe.get_list('Customer', fields=['name', 'email_id'], \
filters=[['name', 'in', list(sales_person_records['Customer'])]])
- return customers
+ else:
+ return []
def get_recipients_and_cc(customer, doc):
recipients = []
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
index f56c9b4..cf30e30 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
@@ -304,7 +304,7 @@
{
"fieldtype": "Select", "label": __("Get Suppliers By"),
"fieldname": "search_type",
- "options": ["Tag","Supplier Group"],
+ "options": ["Supplier Group", "Tag"],
"reqd": 1,
onchange() {
if(dialog.get_value('search_type') == 'Tag'){
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
index 4e09a7e..3af6cf8 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
@@ -21,9 +21,9 @@
"link_to_mrs",
"supplier_response_section",
"salutation",
- "email_template",
- "col_break_email_1",
"subject",
+ "col_break_email_1",
+ "email_template",
"preview",
"sec_break_email_2",
"message_for_supplier",
@@ -260,7 +260,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2020-10-16 17:49:09.561929",
+ "modified": "2020-11-04 22:04:29.017134",
"modified_by": "Administrator",
"module": "Buying",
"name": "Request for Quotation",
diff --git a/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json b/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
index 96d7e2d..534cd90 100644
--- a/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
+++ b/erpnext/buying/doctype/request_for_quotation_supplier/request_for_quotation_supplier.json
@@ -5,14 +5,14 @@
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
- "send_email",
- "email_sent",
"supplier",
"contact",
"quote_status",
"column_break_3",
"supplier_name",
- "email_id"
+ "email_id",
+ "send_email",
+ "email_sent"
],
"fields": [
{
@@ -87,7 +87,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2020-10-16 12:23:41.769820",
+ "modified": "2020-11-04 22:01:43.832942",
"modified_by": "Administrator",
"module": "Buying",
"name": "Request for Quotation Supplier",
diff --git a/erpnext/healthcare/doctype/exercise/exercise.json b/erpnext/healthcare/doctype/exercise/exercise.json
index 2486a5d..683cc6d 100644
--- a/erpnext/healthcare/doctype/exercise/exercise.json
+++ b/erpnext/healthcare/doctype/exercise/exercise.json
@@ -37,7 +37,8 @@
"depends_on": "eval:doc.parenttype==\"Therapy\";",
"fieldname": "counts_completed",
"fieldtype": "Int",
- "label": "Counts Completed"
+ "label": "Counts Completed",
+ "no_copy": 1
},
{
"fieldname": "assistance_level",
@@ -48,7 +49,7 @@
],
"istable": 1,
"links": [],
- "modified": "2020-04-10 13:41:06.662351",
+ "modified": "2020-11-04 18:20:25.583491",
"modified_by": "Administrator",
"module": "Healthcare",
"name": "Exercise",
diff --git a/erpnext/healthcare/doctype/therapy_plan/therapy_plan.js b/erpnext/healthcare/doctype/therapy_plan/therapy_plan.js
index 490d458..d1f72d6 100644
--- a/erpnext/healthcare/doctype/therapy_plan/therapy_plan.js
+++ b/erpnext/healthcare/doctype/therapy_plan/therapy_plan.js
@@ -13,43 +13,42 @@
refresh: function(frm) {
if (!frm.doc.__islocal) {
frm.trigger('show_progress_for_therapies');
- }
-
- if (!frm.doc.__islocal && frm.doc.status != 'Completed') {
- let therapy_types = (frm.doc.therapy_plan_details || []).map(function(d){ return d.therapy_type });
- const fields = [{
- fieldtype: 'Link',
- label: __('Therapy Type'),
- fieldname: 'therapy_type',
- options: 'Therapy Type',
- reqd: 1,
- get_query: function() {
- return {
- filters: { 'therapy_type': ['in', therapy_types]}
+ if (frm.doc.status != 'Completed') {
+ let therapy_types = (frm.doc.therapy_plan_details || []).map(function(d){ return d.therapy_type; });
+ const fields = [{
+ fieldtype: 'Link',
+ label: __('Therapy Type'),
+ fieldname: 'therapy_type',
+ options: 'Therapy Type',
+ reqd: 1,
+ get_query: function() {
+ return {
+ filters: { 'therapy_type': ['in', therapy_types]}
+ };
}
- }
- }];
+ }];
- frm.add_custom_button(__('Therapy Session'), function() {
- frappe.prompt(fields, data => {
- frappe.call({
- method: 'erpnext.healthcare.doctype.therapy_plan.therapy_plan.make_therapy_session',
- args: {
- therapy_plan: frm.doc.name,
- patient: frm.doc.patient,
- therapy_type: data.therapy_type,
- company: frm.doc.company
- },
- freeze: true,
- callback: function(r) {
- if (r.message) {
- frappe.model.sync(r.message);
- frappe.set_route('Form', r.message.doctype, r.message.name);
+ frm.add_custom_button(__('Therapy Session'), function() {
+ frappe.prompt(fields, data => {
+ frappe.call({
+ method: 'erpnext.healthcare.doctype.therapy_plan.therapy_plan.make_therapy_session',
+ args: {
+ therapy_plan: frm.doc.name,
+ patient: frm.doc.patient,
+ therapy_type: data.therapy_type,
+ company: frm.doc.company
+ },
+ freeze: true,
+ callback: function(r) {
+ if (r.message) {
+ frappe.model.sync(r.message);
+ frappe.set_route('Form', r.message.doctype, r.message.name);
+ }
}
- }
- });
- }, __('Select Therapy Type'), __('Create'));
- }, __('Create'));
+ });
+ }, __('Select Therapy Type'), __('Create'));
+ }, __('Create'));
+ }
if (frm.doc.therapy_plan_template && !frm.doc.invoiced) {
frm.add_custom_button(__('Sales Invoice'), function() {
diff --git a/erpnext/healthcare/doctype/therapy_plan/therapy_plan.json b/erpnext/healthcare/doctype/therapy_plan/therapy_plan.json
index ccb316e..c03e9de 100644
--- a/erpnext/healthcare/doctype/therapy_plan/therapy_plan.json
+++ b/erpnext/healthcare/doctype/therapy_plan/therapy_plan.json
@@ -115,7 +115,8 @@
"fieldname": "therapy_plan_template",
"fieldtype": "Link",
"label": "Therapy Plan Template",
- "options": "Therapy Plan Template"
+ "options": "Therapy Plan Template",
+ "set_only_once": 1
},
{
"default": "0",
@@ -128,7 +129,7 @@
}
],
"links": [],
- "modified": "2020-10-23 01:27:42.128855",
+ "modified": "2020-11-04 18:13:13.564999",
"modified_by": "Administrator",
"module": "Healthcare",
"name": "Therapy Plan",
diff --git a/erpnext/healthcare/doctype/therapy_plan_detail/therapy_plan_detail.json b/erpnext/healthcare/doctype/therapy_plan_detail/therapy_plan_detail.json
index 555587e..77f08af 100644
--- a/erpnext/healthcare/doctype/therapy_plan_detail/therapy_plan_detail.json
+++ b/erpnext/healthcare/doctype/therapy_plan_detail/therapy_plan_detail.json
@@ -30,12 +30,13 @@
"fieldname": "sessions_completed",
"fieldtype": "Int",
"label": "Sessions Completed",
+ "no_copy": 1,
"read_only": 1
}
],
"istable": 1,
"links": [],
- "modified": "2020-10-08 01:17:34.778028",
+ "modified": "2020-11-04 18:15:52.173450",
"modified_by": "Administrator",
"module": "Healthcare",
"name": "Therapy Plan Detail",
diff --git a/erpnext/healthcare/doctype/therapy_session/therapy_session.js b/erpnext/healthcare/doctype/therapy_session/therapy_session.js
index 65d4cc4..a2b01c9 100644
--- a/erpnext/healthcare/doctype/therapy_session/therapy_session.js
+++ b/erpnext/healthcare/doctype/therapy_session/therapy_session.js
@@ -22,6 +22,10 @@
},
refresh: function(frm) {
+ if (frm.doc.therapy_plan) {
+ frm.trigger('filter_therapy_types');
+ }
+
if (!frm.doc.__islocal) {
frm.dashboard.add_indicator(__('Counts Targeted: {0}', [frm.doc.total_counts_targeted]), 'blue');
frm.dashboard.add_indicator(__('Counts Completed: {0}', [frm.doc.total_counts_completed]),
@@ -36,15 +40,43 @@
})
}, 'Create');
- frm.add_custom_button(__('Sales Invoice'), function() {
- frappe.model.open_mapped_doc({
- method: 'erpnext.healthcare.doctype.therapy_session.therapy_session.invoice_therapy_session',
- frm: frm,
- })
- }, 'Create');
+ frappe.db.get_value('Therapy Plan', {'name': frm.doc.therapy_plan}, 'therapy_plan_template', (r) => {
+ if (r && !r.therapy_plan_template) {
+ frm.add_custom_button(__('Sales Invoice'), function() {
+ frappe.model.open_mapped_doc({
+ method: 'erpnext.healthcare.doctype.therapy_session.therapy_session.invoice_therapy_session',
+ frm: frm,
+ });
+ }, 'Create');
+ }
+ });
}
},
+ therapy_plan: function(frm) {
+ if (frm.doc.therapy_plan) {
+ frm.trigger('filter_therapy_types');
+ }
+ },
+
+ filter_therapy_types: function(frm) {
+ frappe.call({
+ 'method': 'frappe.client.get',
+ args: {
+ doctype: 'Therapy Plan',
+ name: frm.doc.therapy_plan
+ },
+ callback: function(data) {
+ let therapy_types = (data.message.therapy_plan_details || []).map(function(d){ return d.therapy_type; });
+ frm.set_query('therapy_type', function() {
+ return {
+ filters: { 'therapy_type': ['in', therapy_types]}
+ };
+ });
+ }
+ });
+ },
+
patient: function(frm) {
if (frm.doc.patient) {
frappe.call({
@@ -98,19 +130,6 @@
frm.set_value(values);
}
});
- } else {
- let values = {
- 'patient': '',
- 'therapy_type': '',
- 'therapy_plan': '',
- 'practitioner': '',
- 'department': '',
- 'start_date': '',
- 'start_time': '',
- 'service_unit': '',
- 'duration': ''
- };
- frm.set_value(values);
}
},
diff --git a/erpnext/healthcare/doctype/therapy_session/therapy_session.json b/erpnext/healthcare/doctype/therapy_session/therapy_session.json
index 1f877cc..0bb2b0e 100644
--- a/erpnext/healthcare/doctype/therapy_session/therapy_session.json
+++ b/erpnext/healthcare/doctype/therapy_session/therapy_session.json
@@ -194,6 +194,7 @@
"fieldname": "total_counts_completed",
"fieldtype": "Int",
"label": "Total Counts Completed",
+ "no_copy": 1,
"read_only": 1
},
{
@@ -222,7 +223,7 @@
],
"is_submittable": 1,
"links": [],
- "modified": "2020-10-22 23:10:21.178644",
+ "modified": "2020-11-04 18:14:25.999939",
"modified_by": "Administrator",
"module": "Healthcare",
"name": "Therapy Session",
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index 989bd33..f162291 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -573,12 +573,6 @@
"default": 0
},
{
- "fieldtype": "Section Break",
- "label": "",
- "fieldname": "sec_break_dialog",
- "hide_border": 1
- },
- {
fieldname: 'items_for_po', fieldtype: 'Table', label: 'Select Items',
fields: [
{
@@ -616,16 +610,13 @@
read_only:1,
in_list_view:1
},
- ],
- data: me.frm.doc.items.map((item) =>{
- item.pending_qty = (flt(item.stock_qty) - flt(item.ordered_qty)) / flt(item.conversion_factor);
- return item;
- }).filter((item) => {return item.pending_qty > 0;})
+ ]
}
],
primary_action_label: 'Create Purchase Order',
primary_action (args) {
if (!args) return;
+
let selected_items = dialog.fields_dict.items_for_po.grid.get_selected_children();
if(selected_items.length == 0) {
frappe.throw({message: 'Please select Items from the Table', title: __('Items Required'), indicator:'blue'})
@@ -635,8 +626,9 @@
var method = args.against_default_supplier ? "make_purchase_order_for_default_supplier" : "make_purchase_order"
return frappe.call({
- type: "GET",
method: "erpnext.selling.doctype.sales_order.sales_order." + method,
+ freeze: true,
+ freeze_message: __("Creating Purchase Order ..."),
args: {
"source_name": me.frm.doc.name,
"selected_items": selected_items
@@ -660,8 +652,9 @@
}
});
- dialog.fields_dict["against_default_supplier"].df.onchange = () => {
- console.log("yo");
+ dialog.fields_dict["against_default_supplier"].df.onchange = () => set_po_items_data(dialog);
+
+ function set_po_items_data (dialog) {
var against_default_supplier = dialog.get_value("against_default_supplier");
var items_for_po = dialog.get_value("items_for_po");
@@ -671,16 +664,28 @@
dialog.fields_dict["items_for_po"].df.data = items_with_supplier;
dialog.get_field("items_for_po").refresh();
} else {
- let pending_items = me.frm.doc.items.map((item) =>{
- item.pending_qty = (flt(item.stock_qty) - flt(item.ordered_qty)) / flt(item.conversion_factor);
- return item;
- }).filter((item) => {return item.pending_qty > 0;});
+ let po_items = [];
+ me.frm.doc.items.forEach(d => {
+ let pending_qty = (flt(d.stock_qty) - flt(d.ordered_qty)) / flt(d.conversion_factor);
+ if (pending_qty > 0) {
+ po_items.push({
+ "doctype": "Sales Order Item",
+ "name": d.name,
+ "item_name": d.item_name,
+ "item_code": d.item_code,
+ "pending_qty": pending_qty,
+ "uom": d.uom,
+ "supplier": d.supplier
+ });
+ }
+ });
- dialog.fields_dict["items_for_po"].df.data = pending_items;
+ dialog.fields_dict["items_for_po"].df.data = po_items;
dialog.get_field("items_for_po").refresh();
}
}
+ set_po_items_data(dialog);
dialog.get_field("items_for_po").grid.only_sortable();
dialog.get_field("items_for_po").refresh();
dialog.wrapper.find('.grid-heading-row .grid-row-check').click();
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index ae227e0..ec1c823 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -779,7 +779,9 @@
return data
@frappe.whitelist()
-def make_purchase_order_for_default_supplier(source_name, selected_items=[], target_doc=None):
+def make_purchase_order_for_default_supplier(source_name, selected_items=None, target_doc=None):
+ if not selected_items: return
+
if isinstance(selected_items, string_types):
selected_items = json.loads(selected_items)
@@ -878,7 +880,9 @@
frappe.msgprint(_("Purchase Order already created for all Sales Order items"))
@frappe.whitelist()
-def make_purchase_order(source_name, selected_items=[], target_doc=None):
+def make_purchase_order(source_name, selected_items=None, target_doc=None):
+ if not selected_items: return
+
if isinstance(selected_items, string_types):
selected_items = json.loads(selected_items)