Chekc over billing validation considering tolerance
diff --git a/controllers/accounts_controller.py b/controllers/accounts_controller.py
index 11480c9..1a39921 100644
--- a/controllers/accounts_controller.py
+++ b/controllers/accounts_controller.py
@@ -381,24 +381,41 @@
})
def validate_multiple_billing(self, ref_dt, item_ref_dn, based_on, parentfield):
+ from controllers.status_updater import get_tolerance_for
+ item_tolerance = {}
+ global_tolerance = None
+
for item in self.doclist.get({"parentfield": "entries"}):
if item.fields.get(item_ref_dn):
already_billed = webnotes.conn.sql("""select sum(%s) from `tab%s`
where %s=%s and docstatus=1""" % (based_on, self.tname, item_ref_dn, '%s'),
item.fields[item_ref_dn])[0][0]
- max_allowed_amt = flt(webnotes.conn.get_value(ref_dt + " Item",
- item.fields[item_ref_dn], based_on), self.precision(based_on, item))
-
total_billed_amt = flt(flt(already_billed) + flt(item.fields[based_on]),
self.precision(based_on, item))
+
+ ref_amt = flt(webnotes.conn.get_value(ref_dt + " Item",
+ item.fields[item_ref_dn], based_on), self.precision(based_on, item))
+
+ tolerance, item_tolerance, global_tolerance = get_tolerance_for(item.item_code,
+ item_tolerance, global_tolerance)
- if max_allowed_amt and total_billed_amt - max_allowed_amt > 0.02:
- webnotes.msgprint(_("Row ")+ cstr(item.idx) + ": " + cstr(item.item_code) +
- _(" will be over-billed against mentioned ") + cstr(ref_dt) +
- _(". Max allowed " + cstr(based_on) + ": " + cstr(max_allowed_amt)),
- raise_exception=1)
-
+ max_allowed_amt = flt(ref_amt * (100 + tolerance) / 100)
+
+ if total_billed_amt - max_allowed_amt > 0.01:
+ reduce_by = total_billed_amt - max_allowed_amt
+
+ webnotes.throw(_("Row #") + cstr(item.idx) + ": " +
+ _(" Max amount allowed for Item ") + cstr(item.item_code) +
+ _(" against ") + ref_dt + " " +
+ cstr(item.fields[ref_dt.lower().replace(" ", "_")]) + _(" is ") +
+ cstr(max_allowed_amt) + ". \n" +
+ _("""If you want to increase your overflow tolerance, please increase \
+ tolerance % in Global Defaults or Item master.
+ Or, you must reduce the amount by """) + cstr(reduce_by) + "\n" +
+ _("""Also, please check if the order item has already been billed \
+ in the Sales Order"""))
+
def get_company_default(self, fieldname):
from accounts.utils import get_company_default
return get_company_default(self.doc.company, fieldname)
diff --git a/controllers/status_updater.py b/controllers/status_updater.py
index b274526..a285c47 100644
--- a/controllers/status_updater.py
+++ b/controllers/status_updater.py
@@ -151,7 +151,9 @@
"""
# check if overflow is within tolerance
- tolerance = self.get_tolerance_for(item['item_code'])
+ tolerance, self.tolerance, self.global_tolerance = get_tolerance_for(item['item_code'],
+ self.tolerance, self.global_tolerance)
+
overflow_percent = ((item[args['target_field']] - item[args['target_ref_field']]) /
item[args['target_ref_field']]) * 100
@@ -170,23 +172,6 @@
Also, please check if the order item has already been billed in the Sales Order""" %
item, raise_exception=1)
-
- def get_tolerance_for(self, item_code):
- """
- Returns the tolerance for the item, if not set, returns global tolerance
- """
- if self.tolerance.get(item_code): return self.tolerance[item_code]
-
- tolerance = flt(webnotes.conn.get_value('Item',item_code,'tolerance') or 0)
-
- if not tolerance:
- if self.global_tolerance == None:
- self.global_tolerance = flt(webnotes.conn.get_value('Global Defaults', None,
- 'tolerance'))
- tolerance = self.global_tolerance
-
- self.tolerance[item_code] = tolerance
- return tolerance
def update_qty(self, change_modified=True):
@@ -245,4 +230,22 @@
set %(status_field)s = if(ifnull(%(target_parent_field)s,0)<0.001,
'Not %(keyword)s', if(%(target_parent_field)s>=99.99,
'Fully %(keyword)s', 'Partly %(keyword)s'))
- where name='%(name)s'""" % args)
\ No newline at end of file
+ where name='%(name)s'""" % args)
+
+def get_tolerance_for(item_code, item_tolerance={}, global_tolerance=None):
+ """
+ Returns the tolerance for the item, if not set, returns global tolerance
+ """
+ if item_tolerance.get(item_code):
+ return item_tolerance[item_code], item_tolerance, global_tolerance
+
+ tolerance = flt(webnotes.conn.get_value('Item',item_code,'tolerance') or 0)
+
+ if not tolerance:
+ if global_tolerance == None:
+ global_tolerance = flt(webnotes.conn.get_value('Global Defaults', None,
+ 'tolerance'))
+ tolerance = global_tolerance
+
+ item_tolerance[item_code] = tolerance
+ return tolerance, item_tolerance, global_tolerance
\ No newline at end of file