fix: misleading "Set Default X" fields after saving (#28798)
* fix: misleading "Set Default X" fields after saving * refactor: remove unncessary code and minor formatting * fix: extend to more doctypes and correct fieldnames Co-authored-by: Ankush Menat <ankush@frappe.io>
This commit is contained in:
parent
c64d5028b4
commit
6485ac4e59
@ -114,6 +114,9 @@ class PurchaseInvoice(BuyingController):
|
|||||||
self.set_status()
|
self.set_status()
|
||||||
self.validate_purchase_receipt_if_update_stock()
|
self.validate_purchase_receipt_if_update_stock()
|
||||||
validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_invoice_reference)
|
validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_invoice_reference)
|
||||||
|
self.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
self.reset_default_field_value("rejected_warehouse", "items", "rejected_warehouse")
|
||||||
|
self.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
|
||||||
|
|
||||||
def validate_release_date(self):
|
def validate_release_date(self):
|
||||||
if self.release_date and getdate(nowdate()) >= getdate(self.release_date):
|
if self.release_date and getdate(nowdate()) >= getdate(self.release_date):
|
||||||
|
@ -155,6 +155,8 @@ class SalesInvoice(SellingController):
|
|||||||
if self.redeem_loyalty_points and self.loyalty_program and self.loyalty_points and not self.is_consolidated:
|
if self.redeem_loyalty_points and self.loyalty_program and self.loyalty_points and not self.is_consolidated:
|
||||||
validate_loyalty_points(self, self.loyalty_points)
|
validate_loyalty_points(self, self.loyalty_points)
|
||||||
|
|
||||||
|
self.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
|
||||||
def validate_fixed_asset(self):
|
def validate_fixed_asset(self):
|
||||||
for d in self.get("items"):
|
for d in self.get("items"):
|
||||||
if d.is_fixed_asset and d.meta.get_field("asset") and d.asset:
|
if d.is_fixed_asset and d.meta.get_field("asset") and d.asset:
|
||||||
|
@ -72,6 +72,7 @@ class PurchaseOrder(BuyingController):
|
|||||||
self.create_raw_materials_supplied("supplied_items")
|
self.create_raw_materials_supplied("supplied_items")
|
||||||
self.set_received_qty_for_drop_ship_items()
|
self.set_received_qty_for_drop_ship_items()
|
||||||
validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_order_reference)
|
validate_inter_company_party(self.doctype, self.supplier, self.company, self.inter_company_order_reference)
|
||||||
|
self.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
|
||||||
def validate_with_previous_doc(self):
|
def validate_with_previous_doc(self):
|
||||||
super(PurchaseOrder, self).validate_with_previous_doc({
|
super(PurchaseOrder, self).validate_with_previous_doc({
|
||||||
|
22
erpnext/controllers/tests/test_transaction_base.py
Normal file
22
erpnext/controllers/tests/test_transaction_base.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import unittest
|
||||||
|
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
|
||||||
|
class TestUtils(unittest.TestCase):
|
||||||
|
def test_reset_default_field_value(self):
|
||||||
|
doc = frappe.get_doc({
|
||||||
|
"doctype": "Purchase Receipt",
|
||||||
|
"set_warehouse": "Warehouse 1",
|
||||||
|
})
|
||||||
|
|
||||||
|
# Same values
|
||||||
|
doc.items = [{"warehouse": "Warehouse 1"}, {"warehouse": "Warehouse 1"}, {"warehouse": "Warehouse 1"}]
|
||||||
|
doc.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
self.assertEqual(doc.set_warehouse, "Warehouse 1")
|
||||||
|
|
||||||
|
# Mixed values
|
||||||
|
doc.items = [{"warehouse": "Warehouse 1"}, {"warehouse": "Warehouse 2"}, {"warehouse": "Warehouse 1"}]
|
||||||
|
doc.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
self.assertEqual(doc.set_warehouse, None)
|
||||||
|
|
@ -63,6 +63,8 @@ class SalesOrder(SellingController):
|
|||||||
if not self.billing_status: self.billing_status = 'Not Billed'
|
if not self.billing_status: self.billing_status = 'Not Billed'
|
||||||
if not self.delivery_status: self.delivery_status = 'Not Delivered'
|
if not self.delivery_status: self.delivery_status = 'Not Delivered'
|
||||||
|
|
||||||
|
self.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
|
||||||
def validate_po(self):
|
def validate_po(self):
|
||||||
# validate p.o date v/s delivery date
|
# validate p.o date v/s delivery date
|
||||||
if self.po_date and not self.skip_delivery_note:
|
if self.po_date and not self.skip_delivery_note:
|
||||||
|
@ -138,6 +138,7 @@ class DeliveryNote(SellingController):
|
|||||||
self.update_current_stock()
|
self.update_current_stock()
|
||||||
|
|
||||||
if not self.installation_status: self.installation_status = 'Not Installed'
|
if not self.installation_status: self.installation_status = 'Not Installed'
|
||||||
|
self.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
|
||||||
def validate_with_previous_doc(self):
|
def validate_with_previous_doc(self):
|
||||||
super(DeliveryNote, self).validate_with_previous_doc({
|
super(DeliveryNote, self).validate_with_previous_doc({
|
||||||
|
@ -80,6 +80,9 @@ class MaterialRequest(BuyingController):
|
|||||||
# NOTE: Since Item BOM and FG quantities are combined, using current data, it cannot be validated
|
# NOTE: Since Item BOM and FG quantities are combined, using current data, it cannot be validated
|
||||||
# Though the creation of Material Request from a Production Plan can be rethought to fix this
|
# Though the creation of Material Request from a Production Plan can be rethought to fix this
|
||||||
|
|
||||||
|
self.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
self.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
|
||||||
|
|
||||||
def set_title(self):
|
def set_title(self):
|
||||||
'''Set title as comma separated list of items'''
|
'''Set title as comma separated list of items'''
|
||||||
if not self.title:
|
if not self.title:
|
||||||
|
@ -118,6 +118,10 @@ class PurchaseReceipt(BuyingController):
|
|||||||
if getdate(self.posting_date) > getdate(nowdate()):
|
if getdate(self.posting_date) > getdate(nowdate()):
|
||||||
throw(_("Posting Date cannot be future date"))
|
throw(_("Posting Date cannot be future date"))
|
||||||
|
|
||||||
|
self.reset_default_field_value("set_warehouse", "items", "warehouse")
|
||||||
|
self.reset_default_field_value("rejected_warehouse", "items", "rejected_warehouse")
|
||||||
|
self.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
|
||||||
|
|
||||||
|
|
||||||
def validate_cwip_accounts(self):
|
def validate_cwip_accounts(self):
|
||||||
for item in self.get('items'):
|
for item in self.get('items'):
|
||||||
|
@ -103,6 +103,8 @@ class StockEntry(StockController):
|
|||||||
self.set_actual_qty()
|
self.set_actual_qty()
|
||||||
self.calculate_rate_and_amount()
|
self.calculate_rate_and_amount()
|
||||||
self.validate_putaway_capacity()
|
self.validate_putaway_capacity()
|
||||||
|
self.reset_default_field_value("from_warehouse", "items", "s_warehouse")
|
||||||
|
self.reset_default_field_value("to_warehouse", "items", "t_warehouse")
|
||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
self.update_stock_ledger()
|
self.update_stock_ledger()
|
||||||
|
@ -162,6 +162,28 @@ class TransactionBase(StatusUpdater):
|
|||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def reset_default_field_value(self, default_field: str, child_table: str, child_table_field: str):
|
||||||
|
""" Reset "Set default X" fields on forms to avoid confusion.
|
||||||
|
|
||||||
|
example:
|
||||||
|
doc = {
|
||||||
|
"set_from_warehouse": "Warehouse A",
|
||||||
|
"items": [{"from_warehouse": "warehouse B"}, {"from_warehouse": "warehouse A"}],
|
||||||
|
}
|
||||||
|
Since this has dissimilar values in child table, the default field will be erased.
|
||||||
|
|
||||||
|
doc.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
|
||||||
|
"""
|
||||||
|
child_table_values = set()
|
||||||
|
|
||||||
|
for row in self.get(child_table):
|
||||||
|
child_table_values.add(row.get(child_table_field))
|
||||||
|
|
||||||
|
if len(child_table_values) > 1:
|
||||||
|
self.set(default_field, None)
|
||||||
|
else:
|
||||||
|
self.set(default_field, list(child_table_values)[0])
|
||||||
|
|
||||||
def delete_events(ref_type, ref_name):
|
def delete_events(ref_type, ref_name):
|
||||||
events = frappe.db.sql_list(""" SELECT
|
events = frappe.db.sql_list(""" SELECT
|
||||||
distinct `tabEvent`.name
|
distinct `tabEvent`.name
|
||||||
|
Loading…
x
Reference in New Issue
Block a user