Merge pull request #31347 from frappe/mergify/bp/version-13-hotfix/pr-31322

fix: Company address filter in quotation (backport #31322)
This commit is contained in:
Deepesh Garg
2022-06-14 12:44:59 +05:30
committed by GitHub
7 changed files with 50 additions and 9 deletions

View File

@@ -212,7 +212,7 @@ def set_address_details(
else: else:
party_details.update(get_company_address(company)) party_details.update(get_company_address(company))
if doctype and doctype in ["Delivery Note", "Sales Invoice", "Sales Order"]: if doctype and doctype in ["Delivery Note", "Sales Invoice", "Sales Order", "Quotation"]:
if party_details.company_address: if party_details.company_address:
party_details.update( party_details.update(
get_fetch_values(doctype, "company_address", party_details.company_address) get_fetch_values(doctype, "company_address", party_details.company_address)

View File

@@ -35,7 +35,8 @@ status_map = {
["Draft", None], ["Draft", None],
["Open", "eval:self.docstatus==1"], ["Open", "eval:self.docstatus==1"],
["Lost", "eval:self.status=='Lost'"], ["Lost", "eval:self.status=='Lost'"],
["Ordered", "has_sales_order"], ["Partially Ordered", "is_partially_ordered"],
["Ordered", "is_fully_ordered"],
["Cancelled", "eval:self.docstatus==2"], ["Cancelled", "eval:self.docstatus==2"],
], ],
"Sales Order": [ "Sales Order": [

View File

@@ -288,7 +288,7 @@ def get_regional_address_details(party_details, doctype, company):
return party_details return party_details
if ( if (
doctype in ("Sales Invoice", "Delivery Note", "Sales Order") doctype in ("Sales Invoice", "Delivery Note", "Sales Order", "Quotation")
and party_details.company_gstin and party_details.company_gstin
and party_details.company_gstin[:2] != party_details.place_of_supply[:2] and party_details.company_gstin[:2] != party_details.place_of_supply[:2]
) or ( ) or (

View File

@@ -20,6 +20,20 @@ frappe.ui.form.on('Quotation', {
frm.set_df_property('packed_items', 'cannot_add_rows', true); frm.set_df_property('packed_items', 'cannot_add_rows', true);
frm.set_df_property('packed_items', 'cannot_delete_rows', true); frm.set_df_property('packed_items', 'cannot_delete_rows', true);
frm.set_query('company_address', function(doc) {
if(!doc.company) {
frappe.throw(__('Please set Company'));
}
return {
query: 'frappe.contacts.doctype.address.address.address_query',
filters: {
link_doctype: 'Company',
link_name: doc.company
}
};
});
}, },
refresh: function(frm) { refresh: function(frm) {
@@ -69,7 +83,7 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
} }
} }
if(doc.docstatus == 1 && doc.status!=='Lost') { if(doc.docstatus == 1 && !(['Lost', 'Ordered']).includes(doc.status)) {
if(!doc.valid_till || frappe.datetime.get_diff(doc.valid_till, frappe.datetime.get_today()) >= 0) { if(!doc.valid_till || frappe.datetime.get_diff(doc.valid_till, frappe.datetime.get_today()) >= 0) {
cur_frm.add_custom_button(__('Sales Order'), cur_frm.add_custom_button(__('Sales Order'),
cur_frm.cscript['Make Sales Order'], __('Create')); cur_frm.cscript['Make Sales Order'], __('Create'));

View File

@@ -1084,7 +1084,7 @@
"no_copy": 1, "no_copy": 1,
"oldfieldname": "status", "oldfieldname": "status",
"oldfieldtype": "Select", "oldfieldtype": "Select",
"options": "Draft\nOpen\nReplied\nOrdered\nLost\nCancelled\nExpired", "options": "Draft\nOpen\nReplied\nPartially Ordered\nOrdered\nLost\nCancelled\nExpired",
"print_hide": 1, "print_hide": 1,
"read_only": 1, "read_only": 1,
"reqd": 1, "reqd": 1,
@@ -1174,7 +1174,7 @@
"idx": 82, "idx": 82,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2022-03-23 16:49:36.297403", "modified": "2022-06-11 20:35:32.635804",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Selling", "module": "Selling",
"name": "Quotation", "name": "Quotation",
@@ -1270,4 +1270,4 @@
"sort_order": "DESC", "sort_order": "DESC",
"timeline_field": "party_name", "timeline_field": "party_name",
"title_field": "title" "title_field": "title"
} }

View File

@@ -59,8 +59,32 @@ class Quotation(SellingController):
title=_("Unpublished Item"), title=_("Unpublished Item"),
) )
def has_sales_order(self): def get_ordered_status(self):
return frappe.db.get_value("Sales Order Item", {"prevdoc_docname": self.name, "docstatus": 1}) ordered_items = frappe._dict(
frappe.db.get_all(
"Sales Order Item",
{"prevdoc_docname": self.name, "docstatus": 1},
["item_code", "sum(qty)"],
group_by="item_code",
as_list=1,
)
)
status = "Open"
if ordered_items:
status = "Ordered"
for item in self.get("items"):
if item.qty > ordered_items.get(item.item_code, 0.0):
status = "Partially Ordered"
return status
def is_fully_ordered(self):
return self.get_ordered_status() == "Ordered"
def is_partially_ordered(self):
return self.get_ordered_status() == "Partially Ordered"
def update_lead(self): def update_lead(self):
if self.quotation_to == "Lead" and self.party_name: if self.quotation_to == "Lead" and self.party_name:

View File

@@ -17,6 +17,8 @@ frappe.listview_settings['Quotation'] = {
get_indicator: function(doc) { get_indicator: function(doc) {
if(doc.status==="Open") { if(doc.status==="Open") {
return [__("Open"), "orange", "status,=,Open"]; return [__("Open"), "orange", "status,=,Open"];
} else if (doc.status==="Partially Ordered") {
return [__("Partially Ordered"), "yellow", "status,=,Partially Ordered"];
} else if(doc.status==="Ordered") { } else if(doc.status==="Ordered") {
return [__("Ordered"), "green", "status,=,Ordered"]; return [__("Ordered"), "green", "status,=,Ordered"];
} else if(doc.status==="Lost") { } else if(doc.status==="Lost") {