feat: Setting to allow Sales Order creation against expired quotation (#33952)
* feat: Setting to allow Sales Order creation against expired quotation * chore: linting issues
This commit is contained in:
parent
48bb2c942b
commit
148703bfc2
@ -85,11 +85,15 @@ erpnext.selling.QuotationController = class QuotationController extends erpnext.
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (doc.docstatus == 1 && !["Lost", "Ordered"].includes(doc.status)) {
|
if (doc.docstatus == 1 && !["Lost", "Ordered"].includes(doc.status)) {
|
||||||
this.frm.add_custom_button(
|
if (frappe.boot.sysdefaults.allow_sales_order_creation_for_expired_quotation
|
||||||
__("Sales Order"),
|
|| (!doc.valid_till)
|
||||||
this.frm.cscript["Make Sales Order"],
|
|| frappe.datetime.get_diff(doc.valid_till, frappe.datetime.get_today()) >= 0) {
|
||||||
__("Create")
|
this.frm.add_custom_button(
|
||||||
);
|
__("Sales Order"),
|
||||||
|
this.frm.cscript["Make Sales Order"],
|
||||||
|
__("Create")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if(doc.status!=="Ordered") {
|
if(doc.status!=="Ordered") {
|
||||||
this.frm.add_custom_button(__('Set as Lost'), () => {
|
this.frm.add_custom_button(__('Set as Lost'), () => {
|
||||||
|
@ -195,6 +195,17 @@ def get_list_context(context=None):
|
|||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_sales_order(source_name: str, target_doc=None):
|
def make_sales_order(source_name: str, target_doc=None):
|
||||||
|
if not frappe.db.get_singles_value(
|
||||||
|
"Selling Settings", "allow_sales_order_creation_for_expired_quotation"
|
||||||
|
):
|
||||||
|
quotation = frappe.db.get_value(
|
||||||
|
"Quotation", source_name, ["transaction_date", "valid_till"], as_dict=1
|
||||||
|
)
|
||||||
|
if quotation.valid_till and (
|
||||||
|
quotation.valid_till < quotation.transaction_date or quotation.valid_till < getdate(nowdate())
|
||||||
|
):
|
||||||
|
frappe.throw(_("Validity period of this quotation has ended."))
|
||||||
|
|
||||||
return _make_sales_order(source_name, target_doc)
|
return _make_sales_order(source_name, target_doc)
|
||||||
|
|
||||||
|
|
||||||
|
@ -144,11 +144,21 @@ class TestQuotation(FrappeTestCase):
|
|||||||
def test_so_from_expired_quotation(self):
|
def test_so_from_expired_quotation(self):
|
||||||
from erpnext.selling.doctype.quotation.quotation import make_sales_order
|
from erpnext.selling.doctype.quotation.quotation import make_sales_order
|
||||||
|
|
||||||
|
frappe.db.set_single_value(
|
||||||
|
"Selling Settings", "allow_sales_order_creation_for_expired_quotation", 0
|
||||||
|
)
|
||||||
|
|
||||||
quotation = frappe.copy_doc(test_records[0])
|
quotation = frappe.copy_doc(test_records[0])
|
||||||
quotation.valid_till = add_days(nowdate(), -1)
|
quotation.valid_till = add_days(nowdate(), -1)
|
||||||
quotation.insert()
|
quotation.insert()
|
||||||
quotation.submit()
|
quotation.submit()
|
||||||
|
|
||||||
|
self.assertRaises(frappe.ValidationError, make_sales_order, quotation.name)
|
||||||
|
|
||||||
|
frappe.db.set_single_value(
|
||||||
|
"Selling Settings", "allow_sales_order_creation_for_expired_quotation", 1
|
||||||
|
)
|
||||||
|
|
||||||
make_sales_order(quotation.name)
|
make_sales_order(quotation.name)
|
||||||
|
|
||||||
def test_shopping_cart_without_website_item(self):
|
def test_shopping_cart_without_website_item(self):
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
"column_break_5",
|
"column_break_5",
|
||||||
"allow_multiple_items",
|
"allow_multiple_items",
|
||||||
"allow_against_multiple_purchase_orders",
|
"allow_against_multiple_purchase_orders",
|
||||||
|
"allow_sales_order_creation_for_expired_quotation",
|
||||||
"hide_tax_id",
|
"hide_tax_id",
|
||||||
"enable_discount_accounting"
|
"enable_discount_accounting"
|
||||||
],
|
],
|
||||||
@ -172,6 +173,12 @@
|
|||||||
"fieldname": "enable_discount_accounting",
|
"fieldname": "enable_discount_accounting",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Enable Discount Accounting for Selling"
|
"label": "Enable Discount Accounting for Selling"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "allow_sales_order_creation_for_expired_quotation",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Allow Sales Order Creation For Expired Quotation"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "fa fa-cog",
|
"icon": "fa fa-cog",
|
||||||
@ -179,7 +186,7 @@
|
|||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2022-05-31 19:39:48.398738",
|
"modified": "2023-02-04 12:37:53.380857",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Selling Settings",
|
"name": "Selling Settings",
|
||||||
|
@ -25,6 +25,12 @@ def boot_session(bootinfo):
|
|||||||
frappe.db.get_single_value("CRM Settings", "default_valid_till")
|
frappe.db.get_single_value("CRM Settings", "default_valid_till")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
bootinfo.sysdefaults.allow_sales_order_creation_for_expired_quotation = cint(
|
||||||
|
frappe.db.get_single_value(
|
||||||
|
"Selling Settings", "allow_sales_order_creation_for_expired_quotation"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
# if no company, show a dialog box to create a new company
|
# if no company, show a dialog box to create a new company
|
||||||
bootinfo.customer_count = frappe.db.sql("""SELECT count(*) FROM `tabCustomer`""")[0][0]
|
bootinfo.customer_count = frappe.db.sql("""SELECT count(*) FROM `tabCustomer`""")[0][0]
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user