feat: add validation for on hold purchase order
This commit is contained in:
parent
439546c83c
commit
a1afd78723
@ -96,7 +96,7 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({
|
|||||||
},
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Closed"],
|
status: ["not in", ["Closed", "On Hold"]],
|
||||||
per_billed: ["<", 99.99],
|
per_billed: ["<", 99.99],
|
||||||
company: me.frm.doc.company
|
company: me.frm.doc.company
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ from erpnext.stock.doctype.purchase_receipt.purchase_receipt import update_bille
|
|||||||
from erpnext.stock import get_warehouse_account_map
|
from erpnext.stock import get_warehouse_account_map
|
||||||
from erpnext.accounts.general_ledger import make_gl_entries, merge_similar_entries, delete_gl_entries
|
from erpnext.accounts.general_ledger import make_gl_entries, merge_similar_entries, delete_gl_entries
|
||||||
from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
|
from erpnext.accounts.doctype.gl_entry.gl_entry import update_outstanding_amt
|
||||||
from erpnext.buying.utils import check_for_closed_status
|
from erpnext.buying.utils import check_on_hold_or_closed_status
|
||||||
from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center
|
from erpnext.accounts.general_ledger import get_round_off_account_and_cost_center
|
||||||
from erpnext.assets.doctype.asset.asset import get_asset_account
|
from erpnext.assets.doctype.asset.asset import get_asset_account
|
||||||
from frappe.model.mapper import get_mapped_doc
|
from frappe.model.mapper import get_mapped_doc
|
||||||
@ -93,7 +93,7 @@ class PurchaseInvoice(BuyingController):
|
|||||||
self.check_conversion_rate()
|
self.check_conversion_rate()
|
||||||
self.validate_credit_to_acc()
|
self.validate_credit_to_acc()
|
||||||
self.clear_unallocated_advances("Purchase Invoice Advance", "advances")
|
self.clear_unallocated_advances("Purchase Invoice Advance", "advances")
|
||||||
self.check_for_closed_status()
|
self.check_on_hold_or_closed_status()
|
||||||
self.validate_with_previous_doc()
|
self.validate_with_previous_doc()
|
||||||
self.validate_uom_is_integer("uom", "qty")
|
self.validate_uom_is_integer("uom", "qty")
|
||||||
self.validate_uom_is_integer("stock_uom", "stock_qty")
|
self.validate_uom_is_integer("stock_uom", "stock_qty")
|
||||||
@ -156,13 +156,13 @@ class PurchaseInvoice(BuyingController):
|
|||||||
|
|
||||||
self.party_account_currency = account.account_currency
|
self.party_account_currency = account.account_currency
|
||||||
|
|
||||||
def check_for_closed_status(self):
|
def check_on_hold_or_closed_status(self):
|
||||||
check_list = []
|
check_list = []
|
||||||
|
|
||||||
for d in self.get('items'):
|
for d in self.get('items'):
|
||||||
if d.purchase_order and not d.purchase_order in check_list and not d.purchase_receipt:
|
if d.purchase_order and not d.purchase_order in check_list and not d.purchase_receipt:
|
||||||
check_list.append(d.purchase_order)
|
check_list.append(d.purchase_order)
|
||||||
check_for_closed_status('Purchase Order', d.purchase_order)
|
check_on_hold_or_closed_status('Purchase Order', d.purchase_order)
|
||||||
|
|
||||||
def validate_with_previous_doc(self):
|
def validate_with_previous_doc(self):
|
||||||
super(PurchaseInvoice, self).validate_with_previous_doc({
|
super(PurchaseInvoice, self).validate_with_previous_doc({
|
||||||
@ -754,7 +754,7 @@ class PurchaseInvoice(BuyingController):
|
|||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
super(PurchaseInvoice, self).on_cancel()
|
super(PurchaseInvoice, self).on_cancel()
|
||||||
|
|
||||||
self.check_for_closed_status()
|
self.check_on_hold_or_closed_status()
|
||||||
|
|
||||||
self.update_status_updater_args()
|
self.update_status_updater_args()
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@ from erpnext.controllers.buying_controller import BuyingController
|
|||||||
from erpnext.stock.doctype.item.item import get_last_purchase_details
|
from erpnext.stock.doctype.item.item import get_last_purchase_details
|
||||||
from erpnext.stock.stock_balance import update_bin_qty, get_ordered_qty
|
from erpnext.stock.stock_balance import update_bin_qty, get_ordered_qty
|
||||||
from frappe.desk.notifications import clear_doctype_notifications
|
from frappe.desk.notifications import clear_doctype_notifications
|
||||||
from erpnext.buying.utils import validate_for_items, check_for_closed_status
|
from erpnext.buying.utils import validate_for_items, check_on_hold_or_closed_status
|
||||||
from erpnext.stock.utils import get_bin
|
from erpnext.stock.utils import get_bin
|
||||||
from erpnext.accounts.party import get_party_account_currency
|
from erpnext.accounts.party import get_party_account_currency
|
||||||
from six import string_types
|
from six import string_types
|
||||||
@ -45,7 +45,7 @@ class PurchaseOrder(BuyingController):
|
|||||||
self.validate_supplier()
|
self.validate_supplier()
|
||||||
self.validate_schedule_date()
|
self.validate_schedule_date()
|
||||||
validate_for_items(self)
|
validate_for_items(self)
|
||||||
self.check_for_closed_status()
|
self.check_on_hold_or_closed_status()
|
||||||
|
|
||||||
self.validate_uom_is_integer("uom", "qty")
|
self.validate_uom_is_integer("uom", "qty")
|
||||||
self.validate_uom_is_integer("stock_uom", "stock_qty")
|
self.validate_uom_is_integer("stock_uom", "stock_qty")
|
||||||
@ -144,12 +144,12 @@ class PurchaseOrder(BuyingController):
|
|||||||
= d.rate = d.last_purchase_rate = item_last_purchase_rate
|
= d.rate = d.last_purchase_rate = item_last_purchase_rate
|
||||||
|
|
||||||
# Check for Closed status
|
# Check for Closed status
|
||||||
def check_for_closed_status(self):
|
def check_on_hold_or_closed_status(self):
|
||||||
check_list =[]
|
check_list =[]
|
||||||
for d in self.get('items'):
|
for d in self.get('items'):
|
||||||
if d.meta.get_field('material_request') and d.material_request and d.material_request not in check_list:
|
if d.meta.get_field('material_request') and d.material_request and d.material_request not in check_list:
|
||||||
check_list.append(d.material_request)
|
check_list.append(d.material_request)
|
||||||
check_for_closed_status('Material Request', d.material_request)
|
check_on_hold_or_closed_status('Material Request', d.material_request)
|
||||||
|
|
||||||
def update_requested_qty(self):
|
def update_requested_qty(self):
|
||||||
material_request_map = {}
|
material_request_map = {}
|
||||||
|
|||||||
@ -73,10 +73,10 @@ def validate_for_items(doc):
|
|||||||
not cint(frappe.db.get_single_value("Buying Settings", "allow_multiple_items") or 0):
|
not cint(frappe.db.get_single_value("Buying Settings", "allow_multiple_items") or 0):
|
||||||
frappe.throw(_("Same item cannot be entered multiple times."))
|
frappe.throw(_("Same item cannot be entered multiple times."))
|
||||||
|
|
||||||
def check_for_closed_status(doctype, docname):
|
def check_on_hold_or_closed_status(doctype, docname):
|
||||||
status = frappe.db.get_value(doctype, docname, "status")
|
status = frappe.db.get_value(doctype, docname, "status")
|
||||||
|
|
||||||
if status == "Closed":
|
if status in ("Closed", "On Hold"):
|
||||||
frappe.throw(_("{0} {1} status is {2}").format(doctype, docname, status), frappe.InvalidStatusError)
|
frappe.throw(_("{0} {1} status is {2}").format(doctype, docname, status), frappe.InvalidStatusError)
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
|
|||||||
@ -88,7 +88,7 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend
|
|||||||
},
|
},
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
status: ["!=", "Closed"],
|
status: ["not in", ["Closed", "On Hold"]],
|
||||||
per_received: ["<", 99.99],
|
per_received: ["<", 99.99],
|
||||||
company: me.frm.doc.company
|
company: me.frm.doc.company
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@ from frappe.utils import getdate
|
|||||||
from erpnext.controllers.buying_controller import BuyingController
|
from erpnext.controllers.buying_controller import BuyingController
|
||||||
from erpnext.accounts.utils import get_account_currency
|
from erpnext.accounts.utils import get_account_currency
|
||||||
from frappe.desk.notifications import clear_doctype_notifications
|
from frappe.desk.notifications import clear_doctype_notifications
|
||||||
from erpnext.buying.utils import check_for_closed_status
|
from erpnext.buying.utils import check_on_hold_or_closed_status
|
||||||
from erpnext.assets.doctype.asset.asset import get_asset_account
|
from erpnext.assets.doctype.asset.asset import get_asset_account
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ class PurchaseReceipt(BuyingController):
|
|||||||
self.validate_uom_is_integer("uom", ["qty", "received_qty"])
|
self.validate_uom_is_integer("uom", ["qty", "received_qty"])
|
||||||
self.validate_uom_is_integer("stock_uom", "stock_qty")
|
self.validate_uom_is_integer("stock_uom", "stock_qty")
|
||||||
|
|
||||||
self.check_for_closed_status()
|
self.check_on_hold_or_closed_status()
|
||||||
|
|
||||||
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"))
|
||||||
@ -103,13 +103,13 @@ class PurchaseReceipt(BuyingController):
|
|||||||
return po_qty, po_warehouse
|
return po_qty, po_warehouse
|
||||||
|
|
||||||
# Check for Closed status
|
# Check for Closed status
|
||||||
def check_for_closed_status(self):
|
def check_on_hold_or_closed_status(self):
|
||||||
check_list =[]
|
check_list =[]
|
||||||
for d in self.get('items'):
|
for d in self.get('items'):
|
||||||
if (d.meta.get_field('purchase_order') and d.purchase_order
|
if (d.meta.get_field('purchase_order') and d.purchase_order
|
||||||
and d.purchase_order not in check_list):
|
and d.purchase_order not in check_list):
|
||||||
check_list.append(d.purchase_order)
|
check_list.append(d.purchase_order)
|
||||||
check_for_closed_status('Purchase Order', d.purchase_order)
|
check_on_hold_or_closed_status('Purchase Order', d.purchase_order)
|
||||||
|
|
||||||
# on submit
|
# on submit
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
@ -147,7 +147,7 @@ class PurchaseReceipt(BuyingController):
|
|||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
super(PurchaseReceipt, self).on_cancel()
|
super(PurchaseReceipt, self).on_cancel()
|
||||||
|
|
||||||
self.check_for_closed_status()
|
self.check_on_hold_or_closed_status()
|
||||||
# Check if Purchase Invoice has been submitted against current Purchase Order
|
# Check if Purchase Invoice has been submitted against current Purchase Order
|
||||||
submitted = frappe.db.sql("""select t1.name
|
submitted = frappe.db.sql("""select t1.name
|
||||||
from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2
|
from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user