update translation strings #1403
diff --git a/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py b/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py
index dc7d57b..7d6ce34 100644
--- a/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py
+++ b/erpnext/accounts/doctype/bank_reconciliation/bank_reconciliation.py
@@ -12,17 +12,17 @@
if not (self.bank_account and self.from_date and self.to_date):
msgprint("Bank Account, From Date and To Date are Mandatory")
return
-
- dl = frappe.db.sql("""select t1.name, t1.cheque_no, t1.cheque_date, t2.debit,
- t2.credit, t1.posting_date, t2.against_account
- from
- `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
- where
- t2.parent = t1.name and t2.account = %s
- and (clearance_date is null or clearance_date = '0000-00-00' or clearance_date = '')
- and t1.posting_date >= %s and t1.posting_date <= %s and t1.docstatus=1""",
+
+ dl = frappe.db.sql("""select t1.name, t1.cheque_no, t1.cheque_date, t2.debit,
+ t2.credit, t1.posting_date, t2.against_account
+ from
+ `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
+ where
+ t2.parent = t1.name and t2.account = %s
+ and (clearance_date is null or clearance_date = '0000-00-00' or clearance_date = '')
+ and t1.posting_date >= %s and t1.posting_date <= %s and t1.docstatus=1""",
(self.bank_account, self.from_date, self.to_date))
-
+
self.set('entries', [])
self.total_amount = 0.0
@@ -43,13 +43,13 @@
if d.clearance_date:
if d.cheque_date and getdate(d.clearance_date) < getdate(d.cheque_date):
frappe.throw("Clearance Date can not be before Cheque Date (Row #%s)" % d.idx)
-
+
frappe.db.set_value("Journal Voucher", d.voucher_id, "clearance_date", d.clearance_date)
- frappe.db.sql("""update `tabJournal Voucher` set clearance_date = %s, modified = %s
+ frappe.db.sql("""update `tabJournal Voucher` set clearance_date = %s, modified = %s
where name=%s""", (d.clearance_date, nowdate(), d.voucher_id))
vouchers.append(d.voucher_id)
if vouchers:
- msgprint("Clearance Date updated in %s" % ", ".join(vouchers))
+ msgprint("Clearance Date updated in: {0}".format(", ".join(vouchers)))
else:
- msgprint(_("Clearance Date not mentioned"))
\ No newline at end of file
+ msgprint(_("Clearance Date not mentioned"))
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py
index d79bbcc..71ebe6c 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.py
+++ b/erpnext/accounts/doctype/cost_center/cost_center.py
@@ -10,33 +10,33 @@
class CostCenter(NestedSet):
nsm_parent_field = 'parent_cost_center'
-
+
def autoname(self):
self.name = self.cost_center_name.strip() + ' - ' + \
frappe.db.get_value("Company", self.company, "abbr")
-
+
def validate_mandatory(self):
if not self.group_or_ledger:
- msgprint("Please select Group or Ledger value", raise_exception=1)
-
+ msgprint(_("Please select Group or Ledger value"), raise_exception=1)
+
if self.cost_center_name != self.company and not self.parent_cost_center:
- msgprint("Please enter parent cost center", raise_exception=1)
+ msgprint(_("Please enter parent cost center"), raise_exception=1)
elif self.cost_center_name == self.company and self.parent_cost_center:
msgprint(_("Root cannot have a parent cost center"), raise_exception=1)
-
+
def convert_group_to_ledger(self):
if self.check_if_child_exists():
- msgprint("Cost Center: %s has existing child. You can not convert this cost center to ledger" % (self.name), raise_exception=1)
+ msgprint(_("Cannot convert Cost Center to ledger as it has child nodes"), raise_exception=1)
elif self.check_gle_exists():
- msgprint("Cost Center with existing transaction can not be converted to ledger.", raise_exception=1)
+ msgprint(_("Cost Center with existing transactions can not be converted to ledger"), raise_exception=1)
else:
self.group_or_ledger = 'Ledger'
self.save()
return 1
-
+
def convert_ledger_to_group(self):
if self.check_gle_exists():
- msgprint("Cost Center with existing transaction can not be converted to group.", raise_exception=1)
+ msgprint(_("Cost Center with existing transactions can not be converted to group"), raise_exception=1)
else:
self.group_or_ledger = 'Group'
self.save()
@@ -44,7 +44,7 @@
def check_gle_exists(self):
return frappe.db.get_value("GL Entry", {"cost_center": self.name})
-
+
def check_if_child_exists(self):
return frappe.db.sql("select name from `tabCost Center` where \
parent_cost_center = %s and docstatus != 2", self.name)
@@ -53,11 +53,11 @@
check_acc_list = []
for d in self.get('budget_details'):
if self.group_or_ledger=="Group":
- msgprint("Budget cannot be set for Group Cost Centers", raise_exception=1)
-
+ msgprint(_("Budget cannot be set for Group Cost Centers"), raise_exception=1)
+
if [d.account, d.fiscal_year] in check_acc_list:
- msgprint("Account " + d.account + "has been entered more than once for fiscal year " + d.fiscal_year, raise_exception=1)
- else:
+ msgprint(_("Account {0} has been entered more than once for fiscal year {1}").format(d.account, d.fiscal_year), raise_exception=1)
+ else:
check_acc_list.append([d.account, d.fiscal_year])
def validate(self):
@@ -65,25 +65,25 @@
Cost Center name must be unique
"""
if (self.get("__islocal") or not self.name) and frappe.db.sql("select name from `tabCost Center` where cost_center_name = %s and company=%s", (self.cost_center_name, self.company)):
- msgprint("Cost Center Name already exists, please rename", raise_exception=1)
-
+ msgprint(_("Cost Center Name already exists"), raise_exception=1)
+
self.validate_mandatory()
self.validate_budget_details()
-
+
def before_rename(self, olddn, newdn, merge=False):
# Add company abbr if not provided
from erpnext.setup.doctype.company.company import get_name_with_abbr
new_cost_center = get_name_with_abbr(newdn, self.company)
-
+
# Validate properties before merging
super(CostCenter, self).before_rename(olddn, new_cost_center, merge, "group_or_ledger")
-
+
return new_cost_center
-
+
def after_rename(self, olddn, newdn, merge=False):
if not merge:
- frappe.db.set_value("Cost Center", newdn, "cost_center_name",
+ frappe.db.set_value("Cost Center", newdn, "cost_center_name",
" - ".join(newdn.split(" - ")[:-1]))
else:
super(CostCenter, self).after_rename(olddn, newdn, merge)
-
+
diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
index 6e72c9a..14461ff 100644
--- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
+++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
@@ -9,19 +9,18 @@
from frappe.model.document import Document
class FiscalYear(Document):
-
+
def set_as_default(self):
frappe.db.set_value("Global Defaults", None, "current_fiscal_year", self.name)
frappe.get_doc("Global Defaults").on_update()
-
+
# clear cache
frappe.clear_cache()
-
- msgprint(self.name + _(""" is now the default Fiscal Year. \
- Please refresh your browser for the change to take effect."""))
+
+ msgprint(_("{0} is now the default Fiscal Year. Please refresh your browser for the change to take effect.").format(self.name))
def validate(self):
- year_start_end_dates = frappe.db.sql("""select year_start_date, year_end_date
+ year_start_end_dates = frappe.db.sql("""select year_start_date, year_end_date
from `tabFiscal Year` where name=%s""", (self.name))
if year_start_end_dates:
@@ -36,10 +35,10 @@
if (getdate(self.year_end_date) - getdate(self.year_start_date)).days > 366:
frappe.throw(_("Year Start Date and Year End Date are not within Fiscal Year."))
- year_start_end_dates = frappe.db.sql("""select name, year_start_date, year_end_date
+ year_start_end_dates = frappe.db.sql("""select name, year_start_date, year_end_date
from `tabFiscal Year` where name!=%s""", (self.name))
for fiscal_year, ysd, yed in year_start_end_dates:
if (getdate(self.year_start_date) == ysd and getdate(self.year_end_date) == yed) \
and (not frappe.flags.in_test):
- frappe.throw(_("Year Start Date and Year End Date are already set in Fiscal Year: ") + fiscal_year)
\ No newline at end of file
+ frappe.throw(_("Year Start Date and Year End Date are already set in Fiscal Year: ") + fiscal_year)
diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
index f11589b..b586a2c 100644
--- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py
@@ -57,17 +57,16 @@
def validate_debit_credit(self):
for d in self.get('entries'):
if d.debit and d.credit:
- msgprint("You cannot credit and debit same account at the same time.",
- raise_exception=1)
+ msgprint(_("You cannot credit and debit same account at the same time."), raise_exception=1)
def validate_cheque_info(self):
if self.voucher_type in ['Bank Voucher']:
if not self.cheque_no or not self.cheque_date:
- msgprint("Reference No & Reference Date is required for %s" %
- self.voucher_type, raise_exception=1)
+ msgprint(_("Reference No & Reference Date is required for {0}").format(self.voucher_type),
+ raise_exception=1)
if self.cheque_date and not self.cheque_no:
- msgprint("Reference No is mandatory if you entered Reference Date", raise_exception=1)
+ msgprint(_("Reference No is mandatory if you entered Reference Date"), raise_exception=1)
def validate_entries_for_advance(self):
for d in self.get('entries'):
@@ -76,19 +75,17 @@
master_type = frappe.db.get_value("Account", d.account, "master_type")
if (master_type == 'Customer' and flt(d.credit) > 0) or \
(master_type == 'Supplier' and flt(d.debit) > 0):
- msgprint("Message: Please check Is Advance as 'Yes' against \
- Account %s if this is an advance entry." % d.account)
+ msgprint(_("Please check 'Is Advance' against Account {0} if this is an advance entry.").format(d.account))
def validate_against_jv(self):
for d in self.get('entries'):
if d.against_jv:
if d.against_jv == self.name:
- msgprint("You can not enter current voucher in 'Against JV' column",
- raise_exception=1)
+ msgprint(_("You can not enter current voucher in 'Against Journal Voucher' column"), raise_exception=1)
elif not frappe.db.sql("""select name from `tabJournal Voucher Detail`
where account = %s and docstatus = 1 and parent = %s""",
(d.account, d.against_jv)):
- msgprint("Against JV: %s is not valid." % d.against_jv, raise_exception=1)
+ msgprint(_("Journal Voucher {0} does not have account {1}.").format(d.against_jv, d.account), raise_exception=1)
def set_against_account(self):
# Debit = Credit
@@ -104,8 +101,8 @@
self.total_credit = credit
if abs(self.total_debit-self.total_credit) > 0.001:
- msgprint("Debit must be equal to Credit. The difference is %s" %
- (self.total_debit-self.total_credit), raise_exception=1)
+ msgprint(_("Debit must equal Credit. The difference is {0}").format(self.total_debit-self.total_credit),
+ raise_exception=1)
# update against account
for d in self.get('entries'):
@@ -116,10 +113,9 @@
r = []
if self.cheque_no:
if self.cheque_date:
- r.append('Via Reference #%s dated %s' %
- (self.cheque_no, formatdate(self.cheque_date)))
+ r.append(_('Reference #{0} dated {1}').fomrat(self.cheque_no, formatdate(self.cheque_date)))
else :
- msgprint("Please enter Reference date", raise_exception=1)
+ msgprint(_("Please enter Reference date"), raise_exception=1)
for d in self.get('entries'):
if d.against_invoice and d.credit:
@@ -137,12 +133,12 @@
bill_no[0][1] and formatdate(bill_no[0][1].strftime('%Y-%m-%d')) or ''))
if self.user_remark:
- r.append("User Remark : %s"%self.user_remark)
+ r.append(_("Note: {0}").format(self.user_remark))
if r:
self.remark = ("\n").join(r)
else:
- frappe.msgprint("User Remarks is mandatory", raise_exception=1)
+ frappe.msgprint(_("User Remarks is mandatory"), raise_exception=1)
def set_aging_date(self):
if self.is_opening != 'Yes':
@@ -158,7 +154,7 @@
# If customer/supplier account, aging date is mandatory
if exists and not self.aging_date:
- msgprint("Aging Date is mandatory for opening entry", raise_exception=1)
+ msgprint(_("Aging Date is mandatory for opening entry"), raise_exception=1)
else:
self.aging_date = self.posting_date
@@ -195,8 +191,8 @@
credit_days = self.get_credit_days_for(d.account)
# Check credit days
if credit_days > 0 and not self.get_authorized_user() and cint(date_diff) > credit_days:
- msgprint("Credit Not Allowed: Cannot allow a check that is dated \
- more than %s days after the posting date" % credit_days, raise_exception=1)
+ msgprint(_("Maximum allowed credit is {0} days after posting date").format(credit_days),
+ raise_exception=1)
def get_credit_days_for(self, ac):
if not self.credit_days_for.has_key(ac):
@@ -272,7 +268,7 @@
def get_balance(self):
if not self.get('entries'):
- msgprint("Please enter atleast 1 entry in 'GL Entries' table")
+ msgprint(_("'Entries' cannot be empty"), raise_exception=True)
else:
flag, self.total_debit, self.total_credit = 0, 0, 0
diff = flt(self.difference, 2)
@@ -390,7 +386,7 @@
jv.company = doc.company
jv.fiscal_year = doc.fiscal_year
- d1 = jv.append("entries")
+ jv.append("entries")
d2 = jv.append("entries")
if bank_account:
diff --git a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
index cff24e1..f845138 100644
--- a/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
+++ b/erpnext/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
@@ -12,23 +12,23 @@
class PaymenttoInvoiceMatchingTool(Document):
def get_voucher_details(self):
- total_amount = frappe.db.sql("""select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
- from `tabGL Entry`
- where voucher_type = %s and voucher_no = %s
+ total_amount = frappe.db.sql("""select sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))
+ from `tabGL Entry`
+ where voucher_type = %s and voucher_no = %s
and account = %s""", (self.voucher_type, self.voucher_no, self.account))
-
+
total_amount = total_amount and flt(total_amount[0][0]) or 0
reconciled_payment = frappe.db.sql("""
- select abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))) from `tabGL Entry` where
+ select abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))) from `tabGL Entry` where
against_voucher = %s and voucher_no != %s
and account = %s""", (self.voucher_no, self.voucher_no, self.account))
-
+
reconciled_payment = reconciled_payment and flt(reconciled_payment[0][0]) or 0
ret = {
- 'total_amount': total_amount,
+ 'total_amount': total_amount,
'pending_amt_to_reconcile': total_amount - reconciled_payment
}
-
+
return ret
def get_payment_entries(self):
@@ -37,16 +37,16 @@
Payment entry will be decided based on account type (Dr/Cr)
"""
- self.set('ir_payment_details', [])
+ self.set('ir_payment_details', [])
gle = self.get_gl_entries()
self.create_payment_table(gle)
def get_gl_entries(self):
self.validate_mandatory()
-
+
cond = self.from_date and " and t1.posting_date >= '" + self.from_date + "'" or ""
cond += self.to_date and " and t1.posting_date <= '" + self.to_date + "'"or ""
-
+
if self.amt_greater_than:
cond += ' and abs(ifnull(t2.debit, 0) - ifnull(t2.credit, 0)) >= ' + \
self.amt_greater_than
@@ -55,13 +55,13 @@
self.amt_less_than
gle = frappe.db.sql("""
- select t1.name as voucher_no, t1.posting_date, t1.total_debit as total_amt,
+ select t1.name as voucher_no, t1.posting_date, t1.total_debit as total_amt,
abs(sum(ifnull(t2.credit, 0)) - sum(ifnull(t2.debit, 0))) as amt_due, t1.remark,
t2.against_account, t2.name as voucher_detail_no
from `tabJournal Voucher` t1, `tabJournal Voucher Detail` t2
where t1.name = t2.parent and t1.docstatus = 1 and t2.account = %s
- and ifnull(t2.against_voucher, '')='' and ifnull(t2.against_invoice, '')=''
- and ifnull(t2.against_jv, '')='' and t1.name != %s %s group by t1.name, t2.name """ %
+ and ifnull(t2.against_voucher, '')='' and ifnull(t2.against_invoice, '')=''
+ and ifnull(t2.against_jv, '')='' and t1.name != %s %s group by t1.name, t2.name """ %
('%s', '%s', cond), (self.account, self.voucher_no), as_dict=1)
return gle
@@ -76,11 +76,11 @@
ch.against_account = d.get('against_account')
ch.remarks = d.get('remark')
ch.voucher_detail_no = d.get('voucher_detail_no')
-
+
def validate_mandatory(self):
if not self.account:
- msgprint("Please select Account first", raise_exception=1)
-
+ msgprint(_("Please select Account first"), raise_exception=1)
+
def reconcile(self):
"""
Links booking and payment voucher
@@ -88,59 +88,59 @@
2. split into multiple rows if partially adjusted, assign against voucher
3. submit payment voucher
"""
- if not self.voucher_no or not frappe.db.sql("""select name from `tab%s`
+ if not self.voucher_no or not frappe.db.sql("""select name from `tab%s`
where name = %s""" % (self.voucher_type, '%s'), self.voucher_no):
frappe.throw(_("Please select valid Voucher No to proceed"))
-
+
lst = []
for d in self.get('ir_payment_details'):
if flt(d.amt_to_be_reconciled) > 0:
args = {
'voucher_no' : d.voucher_no,
- 'voucher_detail_no' : d.voucher_detail_no,
- 'against_voucher_type' : self.voucher_type,
+ 'voucher_detail_no' : d.voucher_detail_no,
+ 'against_voucher_type' : self.voucher_type,
'against_voucher' : self.voucher_no,
- 'account' : self.account,
- 'is_advance' : 'No',
- # 'dr_or_cr' : self.account_type=='debit' and 'credit' or 'debit',
+ 'account' : self.account,
+ 'is_advance' : 'No',
+ # 'dr_or_cr' : self.account_type=='debit' and 'credit' or 'debit',
'unadjusted_amt' : flt(d.amt_due),
'allocated_amt' : flt(d.amt_to_be_reconciled)
}
-
+
lst.append(args)
-
+
if lst:
from erpnext.accounts.utils import reconcile_against_document
reconcile_against_document(lst)
- msgprint("Successfully allocated.")
+ msgprint(_("Successfully allocated"))
else:
- msgprint("No amount allocated.", raise_exception=1)
+ msgprint(_("No amount allocated"), raise_exception=1)
def gl_entry_details(doctype, txt, searchfield, start, page_len, filters):
from erpnext.controllers.queries import get_match_cond
- return frappe.db.sql("""select gle.voucher_no, gle.posting_date,
+ return frappe.db.sql("""select gle.voucher_no, gle.posting_date,
gle.debit, gle.credit from `tabGL Entry` gle
- where gle.account = '%(acc)s'
+ where gle.account = '%(acc)s'
and gle.voucher_type = '%(dt)s'
- and gle.voucher_no like '%(txt)s'
- and (ifnull(gle.against_voucher, '') = ''
- or ifnull(gle.against_voucher, '') = gle.voucher_no )
- and (select ifnull(abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))), 0)
- from `tabGL Entry`
+ and gle.voucher_no like '%(txt)s'
+ and (ifnull(gle.against_voucher, '') = ''
+ or ifnull(gle.against_voucher, '') = gle.voucher_no )
+ and (select ifnull(abs(sum(ifnull(debit, 0)) - sum(ifnull(credit, 0))), 0)
+ from `tabGL Entry`
where account = '%(acc)s'
- and against_voucher_type = '%(dt)s'
- and against_voucher = gle.voucher_no
- and voucher_no != gle.voucher_no)
- != abs(ifnull(gle.debit, 0) - ifnull(gle.credit, 0))
- and if(gle.voucher_type='Sales Invoice', ifnull((select is_pos from `tabSales Invoice`
+ and against_voucher_type = '%(dt)s'
+ and against_voucher = gle.voucher_no
+ and voucher_no != gle.voucher_no)
+ != abs(ifnull(gle.debit, 0) - ifnull(gle.credit, 0))
+ and if(gle.voucher_type='Sales Invoice', ifnull((select is_pos from `tabSales Invoice`
where name=gle.voucher_no), 0), 0)=0
%(mcond)s
- ORDER BY gle.posting_date desc, gle.voucher_no desc
+ ORDER BY gle.posting_date desc, gle.voucher_no desc
limit %(start)s, %(page_len)s""" % {
- "dt":filters["dt"],
- "acc":filters["acc"],
- 'mcond':get_match_cond(doctype),
- 'txt': "%%%s%%" % txt,
- "start": start,
+ "dt":filters["dt"],
+ "acc":filters["acc"],
+ 'mcond':get_match_cond(doctype),
+ 'txt': "%%%s%%" % txt,
+ "start": start,
"page_len": page_len
})
diff --git a/erpnext/accounts/doctype/pos_setting/pos_setting.py b/erpnext/accounts/doctype/pos_setting/pos_setting.py
index f7fdd31..383400f 100755
--- a/erpnext/accounts/doctype/pos_setting/pos_setting.py
+++ b/erpnext/accounts/doctype/pos_setting/pos_setting.py
@@ -16,18 +16,18 @@
self.check_for_duplicate()
self.validate_expense_account()
self.validate_all_link_fields()
-
+
def check_for_duplicate(self):
- res = frappe.db.sql("""select name, user from `tabPOS Setting`
- where ifnull(user, '') = %s and name != %s and company = %s""",
+ res = frappe.db.sql("""select name, user from `tabPOS Setting`
+ where ifnull(user, '') = %s and name != %s and company = %s""",
(self.user, self.name, self.company))
if res:
if res[0][1]:
- msgprint("POS Setting '%s' already created for user: '%s' and company: '%s'" %
- (res[0][0], res[0][1], self.company), raise_exception=1)
+ msgprint(_("POS Setting {0} already created for user: {1} and company {2}").format(res[0][0],
+ res[0][1], self.company), raise_exception=1)
else:
- msgprint("Global POS Setting already created - %s for this company: '%s'" %
- (res[0][0], self.company), raise_exception=1)
+ msgprint(_("Global POS Setting {0} already created for company {1}").format(res[0][0],
+ self.company), raise_exception=1)
def validate_expense_account(self):
if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) \
@@ -35,13 +35,13 @@
msgprint(_("Expense Account is mandatory"), raise_exception=1)
def validate_all_link_fields(self):
- accounts = {"Account": [self.cash_bank_account, self.income_account,
- self.expense_account], "Cost Center": [self.cost_center],
+ accounts = {"Account": [self.cash_bank_account, self.income_account,
+ self.expense_account], "Cost Center": [self.cost_center],
"Warehouse": [self.warehouse]}
-
+
for link_dt, dn_list in accounts.items():
for link_dn in dn_list:
- if link_dn and not frappe.db.exists({"doctype": link_dt,
+ if link_dn and not frappe.db.exists({"doctype": link_dt,
"company": self.company, "name": link_dn}):
frappe.throw(link_dn +_(" does not belong to ") + self.company)
@@ -53,17 +53,17 @@
def set_defaults(self, include_current_pos=True):
frappe.defaults.clear_default("is_pos")
-
+
if not include_current_pos:
condition = " where name != '%s'" % self.name.replace("'", "\'")
else:
condition = ""
- pos_view_users = frappe.db.sql_list("""select user
+ pos_view_users = frappe.db.sql_list("""select user
from `tabPOS Setting` {0}""".format(condition))
-
+
for user in pos_view_users:
if user:
frappe.defaults.set_user_default("is_pos", 1, user)
else:
- frappe.defaults.set_global_default("is_pos", 1)
\ No newline at end of file
+ frappe.defaults.set_global_default("is_pos", 1)
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
index 8860a78..ea74fd6 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -6,7 +6,7 @@
from frappe.utils import cint, cstr, flt, formatdate
-from frappe import msgprint, _
+from frappe import msgprint, _, throw
from erpnext.setup.utils import get_company_currency
import frappe.defaults
@@ -73,22 +73,15 @@
def check_active_purchase_items(self):
for d in self.get('entries'):
if d.item_code: # extra condn coz item_code is not mandatory in PV
- valid_item = frappe.db.sql("select docstatus,is_purchase_item from tabItem where name = %s",d.item_code)
- if valid_item[0][0] == 2:
- msgprint("Item : '%s' is Inactive, you can restore it from Trash" %(d.item_code))
- raise Exception
- if not valid_item[0][1] == 'Yes':
- msgprint("Item : '%s' is not Purchase Item"%(d.item_code))
- raise Exception
+ if frappe.db.get_value("Item", d.item_code, "is_purchase_item") != 'Yes':
+ msgprint(_("Item {0} is not Purchase Item").format(d.item_code), raise_exception=True)
def check_conversion_rate(self):
default_currency = get_company_currency(self.company)
if not default_currency:
- msgprint('Message: Please enter default currency in Company Master')
- raise Exception
+ throw(_('Please enter default currency in Company Master'))
if (self.currency == default_currency and flt(self.conversion_rate) != 1.00) or not self.conversion_rate or (self.currency != default_currency and flt(self.conversion_rate) == 1.00):
- msgprint("Message: Please Enter Appropriate Conversion Rate.")
- raise Exception
+ throw(_("Conversion rate cannot be 0 or 1"))
def validate_bill_no(self):
if self.bill_no and self.bill_no.lower().strip() \
@@ -97,13 +90,12 @@
where bill_no = %s and credit_to = %s and docstatus = 1 and name != %s""",
(self.bill_no, self.credit_to, self.name))
if b_no and cstr(b_no[0][2]) == cstr(self.is_opening):
- msgprint("Please check you have already booked expense against Bill No. %s \
- in Purchase Invoice %s" % (cstr(b_no[0][0]), cstr(b_no[0][1])),
- raise_exception=1)
+ throw(_("Bill No {0} already booked in Purchase Invoice {1}").format(cstr(b_no[0][0]),
+ cstr(b_no[0][1])))
if not self.remarks and self.bill_date:
- self.remarks = (self.remarks or '') + "\n" + ("Against Bill %s dated %s"
- % (self.bill_no, formatdate(self.bill_date)))
+ self.remarks = (self.remarks or '') + "\n" \
+ + _("Against Bill %s dated %s").format(self.bill_no, formatdate(self.bill_date))
if not self.remarks:
self.remarks = "No Remarks"
@@ -130,7 +122,7 @@
check_list.append(d.purchase_order)
stopped = frappe.db.sql("select name from `tabPurchase Order` where status = 'Stopped' and name = %s", d.purchase_order)
if stopped:
- msgprint("One cannot do any transaction against 'Purchase Order' : %s, it's status is 'Stopped'" % (d.purhcase_order))
+ throw(_("Purchase Order {0} is 'Stopped'").format(d.purchase_order))
raise Exception
def validate_with_previous_doc(self):
@@ -176,7 +168,7 @@
if self.is_opening != 'Yes':
self.aging_date = self.posting_date
elif not self.aging_date:
- msgprint("Aging Date is mandatory for opening entry")
+ msgprint(_("Ageing date is mandatory for opening entry"))
raise Exception
def set_against_expense_account(self):
@@ -199,8 +191,7 @@
against_accounts.append(stock_not_billed_account)
elif not item.expense_account:
- msgprint(_("Expense account is mandatory for item") + ": " +
- (item.item_code or item.item_name), raise_exception=1)
+ throw(_("Expense account is mandatory for item {0}").format(item.item_code or item.item_name))
elif item.expense_account not in against_accounts:
# if no auto_accounting_for_stock or not a stock item
@@ -212,19 +203,18 @@
if frappe.db.get_value("Buying Settings", None, "po_required") == 'Yes':
for d in self.get('entries'):
if not d.purchase_order:
- msgprint("Purchse Order No. required against item %s"%d.item_code)
- raise Exception
+ throw(_("Purchse Order number required for Item {0}").format(d.item_code))
def pr_required(self):
if frappe.db.get_value("Buying Settings", None, "pr_required") == 'Yes':
for d in self.get('entries'):
if not d.purchase_receipt:
- msgprint("Purchase Receipt No. required against item %s"%d.item_code)
+ throw(_("Purchase Receipt number required for Item {0}").format(d.item_code))
raise Exception
def validate_write_off_account(self):
if self.write_off_amount and not self.write_off_account:
- msgprint("Please enter Write Off Account", raise_exception=1)
+ throw(_("Please enter Write Off Account"))
def check_prev_docstatus(self):
for d in self.get('entries'):
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 3b09090..5d42459 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -6,9 +6,9 @@
import frappe.defaults
from frappe.utils import add_days, cint, cstr, date_diff, flt, getdate, nowdate, \
- get_first_day, get_last_day, comma_and
+ get_first_day, get_last_day
from frappe.model.naming import make_autoname
-from frappe import _, msgprint
+from frappe import _, msgprint, throw
from erpnext.accounts.party import get_party_account, get_due_date
from erpnext.controllers.stock_controller import update_gl_entries_after
@@ -165,8 +165,7 @@
if d.time_log_batch:
status = frappe.db.get_value("Time Log Batch", d.time_log_batch, "status")
if status!="Submitted":
- frappe.msgprint(_("Time Log Batch status must be 'Submitted'") + ":" + d.time_log_batch,
- raise_exception=True)
+ frappe.throw(_("Time Log Batch {0} must be 'Submitted'").format(d.time_log_batch))
def set_pos_fields(self, for_validate=False):
"""Set retail related fields from pos settings"""
@@ -263,10 +262,8 @@
where name = %s and (ifnull(end_of_life,'')='' or end_of_life > now())""", d.item_code)
acc = frappe.db.sql("""select account_type from `tabAccount`
where name = %s and docstatus != 2""", d.income_account)
- if not acc:
- msgprint("Account: "+d.income_account+" does not exist in the system", raise_exception=True)
- elif item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset':
- msgprint("Please select income head with account type 'Fixed Asset' as Item %s is an asset item" % d.item_code, raise_exception=True)
+ if item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset':
+ msgprint(_("Account {0} must be of type 'Fixed Asset' as Item {1} is an Asset Item").format(d.item_code), raise_exception=True)
def validate_with_previous_doc(self):
super(SalesInvoice, self).validate_with_previous_doc(self.tname, {
@@ -302,7 +299,7 @@
if self.is_opening != 'Yes':
self.aging_date = self.posting_date
elif not self.aging_date:
- msgprint("Aging Date is mandatory for opening entry")
+ msgprint(_("Ageing Date is mandatory for opening entry"))
raise Exception
@@ -327,7 +324,7 @@
for d in self.get('entries'):
if frappe.db.get_value('Item', d.item_code, 'is_stock_item') == 'Yes' \
and not d.get(i.lower().replace(' ','_')):
- msgprint("%s is mandatory for stock item which is not mentioed against item: %s"%(i,d.item_code), raise_exception=1)
+ msgprint(_("{0} is mandatory for Item {1}").format(i,d.item_code), raise_exception=1)
def validate_proj_cust(self):
@@ -337,34 +334,32 @@
where name = %s and (customer = %s or
ifnull(customer,'')='')""", (self.project_name, self.customer))
if not res:
- msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in that project."%(self.customer,self.project_name))
+ msgprint(_("Customer {0} does not belong to project {1}").format(self.customer,self.project_name))
raise Exception
def validate_pos(self):
if not self.cash_bank_account and flt(self.paid_amount):
- msgprint("Cash/Bank Account is mandatory for POS, for making payment entry")
+ msgprint(_("Cash or Bank Account is mandatory for making payment entry"))
raise Exception
if flt(self.paid_amount) + flt(self.write_off_amount) \
- flt(self.grand_total) > 1/(10**(self.precision("grand_total") + 1)):
- frappe.throw(_("""(Paid amount + Write Off Amount) can not be \
- greater than Grand Total"""))
+ frappe.throw(_("""Paid amount + Write Off Amount can not be greater than Grand Total"""))
def validate_item_code(self):
for d in self.get('entries'):
if not d.item_code:
- msgprint("Please enter Item Code at line no : %s to update stock or remove check from Update Stock in Basic Info Tab." % (d.idx),
- raise_exception=True)
+ msgprint(_("Item Code required at Row No {0}").format(d.idx), raise_exception=True)
def validate_delivery_note(self):
for d in self.get("entries"):
if d.delivery_note:
- msgprint("""Stock update can not be made against Delivery Note""", raise_exception=1)
+ msgprint(_("Stock cannot be updated against Delivery Note {0}").format(d.delivery_note), raise_exception=1)
def validate_write_off_account(self):
if flt(self.write_off_amount) and not self.write_off_account:
- msgprint("Please enter Write Off Account", raise_exception=1)
+ msgprint(_("Please enter Write Off Account"), raise_exception=1)
def validate_c_form(self):
@@ -396,9 +391,9 @@
ps = frappe.db.sql("""select name, warehouse from `tabPOS Setting`
where ifnull(user,'') = '' and company = %s""", self.company)
if not ps:
- msgprint("To make POS entry, please create POS Setting from Accounts --> POS Setting page and refresh the system.", raise_exception=True)
+ msgprint(_("POS Setting required to make POS Entry"), raise_exception=True)
elif not ps[0][1]:
- msgprint("Please enter warehouse in POS Setting")
+ msgprint(_("Warehouse required in POS Setting"))
else:
w = ps[0][1]
return w
@@ -426,7 +421,7 @@
else:
# show message that the amount is not paid
frappe.db.set(self,'paid_amount',0)
- frappe.msgprint("Note: Payment Entry will not be created since 'Cash/Bank Account' was not specified.")
+ frappe.msgprint(_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified"))
else:
frappe.db.set(self,'paid_amount',0)
@@ -436,15 +431,15 @@
submitted = frappe.db.sql("""select name from `tabSales Order`
where docstatus = 1 and name = %s""", d.sales_order)
if not submitted:
- msgprint("Sales Order : "+ cstr(d.sales_order) +" is not submitted")
- raise Exception , "Validation Error."
+ msgprint(_("Sales Order {0} is not submitted").format(d.sales_order))
+ raise Exception
if d.delivery_note:
submitted = frappe.db.sql("""select name from `tabDelivery Note`
where docstatus = 1 and name = %s""", d.delivery_note)
if not submitted:
- msgprint("Delivery Note : "+ cstr(d.delivery_note) +" is not submitted")
- raise Exception , "Validation Error."
+ msgprint(_("Delivery Note {0} is not submitted").format(d.delivery_note))
+ raise Exception
def update_stock_ledger(self):
sl_entries = []
@@ -594,15 +589,12 @@
self.validate_notification_email_id()
if not self.recurring_type:
- msgprint(_("Please select: ") + self.meta.get_label("recurring_type"),
+ msgprint(_("Please select {0}").format(self.meta.get_label("recurring_type")),
raise_exception=1)
elif not (self.invoice_period_from_date and \
self.invoice_period_to_date):
- msgprint(comma_and([self.meta.get_label("invoice_period_from_date"),
- self.meta.get_label("invoice_period_to_date")])
- + _(": Mandatory for a Recurring Invoice."),
- raise_exception=True)
+ throw(_("Invoice Period From and Invoice Period To dates mandatory for recurring invoice"))
def convert_to_recurring(self):
if self.convert_into_recurring_invoice:
@@ -625,20 +617,15 @@
from frappe.utils import validate_email_add
for email in email_list:
if not validate_email_add(email):
- msgprint(self.meta.get_label("notification_email_address") \
- + " - " + _("Invalid Email Address") + ": \"%s\"" % email,
- raise_exception=1)
+ throw(_("{0} is an invalid email address in 'Notification Email Address'").format(email))
else:
- msgprint("Notification Email Addresses not specified for recurring invoice",
- raise_exception=1)
+ throw(_("'Notification Email Addresses' not specified for recurring invoice"))
def set_next_date(self):
""" Set next date on which auto invoice will be created"""
if not self.repeat_on_day_of_month:
- msgprint("""Please enter 'Repeat on Day of Month' field value.
- The day of the month on which auto invoice
- will be generated e.g. 05, 28 etc.""", raise_exception=1)
+ msgprint(_("Please enter 'Repeat on Day of Month' field value"), raise_exception=1)
next_date = get_next_date(self.posting_date,
month_map[self.recurring_type], cint(self.repeat_on_day_of_month))
@@ -765,7 +752,7 @@
def get_bank_cash_account(mode_of_payment):
val = frappe.db.get_value("Mode of Payment", mode_of_payment, "default_account")
if not val:
- frappe.msgprint("Default Bank / Cash Account not set in Mode of Payment: %s. Please add a Default Account in Mode of Payment master." % mode_of_payment)
+ frappe.msgprint(_("Please set default Cash or Bank account in Mode of Payment {0}").format(mode_of_payment))
return {
"cash_bank_account": val
}
diff --git a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
index 3cef992..55b7ed6 100644
--- a/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
+++ b/erpnext/accounts/doctype/shipping_rule/shipping_rule.py
@@ -5,7 +5,7 @@
from __future__ import unicode_literals
import frappe
-from frappe import _, msgprint
+from frappe import _, msgprint, throw
from frappe.utils import flt, fmt_money
from frappe.model.controller import DocListController
from erpnext.setup.utils import get_company_currency
@@ -15,36 +15,34 @@
class ManyBlankToValuesError(frappe.ValidationError): pass
class ShippingRule(DocListController):
-
+
def validate(self):
self.validate_value("calculate_based_on", "in", ["Net Total", "Net Weight"])
self.shipping_rule_conditions = self.get("shipping_rule_conditions")
self.validate_from_to_values()
self.sort_shipping_rule_conditions()
self.validate_overlapping_shipping_rule_conditions()
-
+
def validate_from_to_values(self):
zero_to_values = []
-
+
for d in self.get("shipping_rule_conditions"):
self.round_floats_in(d)
-
+
# values cannot be negative
self.validate_value("from_value", ">=", 0.0, d)
self.validate_value("to_value", ">=", 0.0, d)
-
+
if not d.to_value:
zero_to_values.append(d)
elif d.from_value >= d.to_value:
- msgprint(_("Error") + ": " + _("Row") + " # %d: " % d.idx +
- _("From Value should be less than To Value"),
- raise_exception=FromGreaterThanToError)
-
+ throw(_("From value must be less than to value in row {0}").format(d.idx), FromGreaterThanToError)
+
# check if more than two or more rows has To Value = 0
if len(zero_to_values) >= 2:
- msgprint(_('''There can only be one Shipping Rule Condition with 0 or blank value for "To Value"'''),
- raise_exception=ManyBlankToValuesError)
-
+ throw(_('There can only be one Shipping Rule Condition with 0 or blank value for "To Value"'),
+ ManyBlankToValuesError)
+
def sort_shipping_rule_conditions(self):
"""Sort Shipping Rule Conditions based on increasing From Value"""
self.shipping_rules_conditions = sorted(self.shipping_rule_conditions, key=lambda d: flt(d.from_value))
@@ -61,7 +59,7 @@
"""
separate = (x1 <= x2 <= y1 <= y2) or (y1 <= y2 <= x1 <= x2)
return (not separate)
-
+
overlaps = []
for i in xrange(0, len(self.shipping_rule_conditions)):
for j in xrange(i+1, len(self.shipping_rule_conditions)):
@@ -72,13 +70,13 @@
range_b = (d2.from_value, d2.to_value or d2.from_value)
if overlap_exists_between(range_a, range_b):
overlaps.append([d1, d2])
-
+
if overlaps:
company_currency = get_company_currency(self.company)
- msgprint(_("Error") + ": " + _("Overlapping Conditions found between") + ":")
+ msgprint(_("Overlapping conditions found between:"))
messages = []
for d1, d2 in overlaps:
- messages.append("%s-%s = %s " % (d1.from_value, d1.to_value, fmt_money(d1.shipping_amount, currency=company_currency)) +
+ messages.append("%s-%s = %s " % (d1.from_value, d1.to_value, fmt_money(d1.shipping_amount, currency=company_currency)) +
_("and") + " %s-%s = %s" % (d2.from_value, d2.to_value, fmt_money(d2.shipping_amount, currency=company_currency)))
-
- msgprint("\n".join(messages), raise_exception=OverlappingConditionError)
\ No newline at end of file
+
+ msgprint("\n".join(messages), raise_exception=OverlappingConditionError)
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 6cabf1d..ae21099 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -180,4 +180,4 @@
"report_type": "Balance Sheet"
}).insert(ignore_permissions=True)
- frappe.msgprint(_("Account Created") + ": " + account.name)
+ frappe.msgprint(_("Account Created: {0}").format(account.name))
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index e317e11..a2224d8 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -5,7 +5,7 @@
import frappe
from frappe.utils import nowdate, cstr, flt, now, getdate, add_months
-from frappe import msgprint, throw, _
+from frappe import throw, _
from frappe.utils import formatdate
from erpnext.utilities import build_filter_conditions
@@ -29,9 +29,7 @@
from `tabFiscal Year` where %s order by year_start_date desc""" % cond)
if not fy:
- error_msg = """%s %s not in any Fiscal Year""" % (label, formatdate(date))
- error_msg = """{msg}: {date}""".format(msg=_("Fiscal Year does not exist for date"),
- date=formatdate(date))
+ error_msg = _("""{0} {1} not in any Fiscal Year""").format(label, formatdate(date))
if verbose: frappe.msgprint(error_msg)
raise FiscalYearError, error_msg
@@ -40,12 +38,7 @@
def validate_fiscal_year(date, fiscal_year, label="Date"):
years = [f[0] for f in get_fiscal_years(date, label=label)]
if fiscal_year not in years:
- throw(("%(label)s '%(posting_date)s': " + _("not within Fiscal Year") + \
- ": '%(fiscal_year)s'") % {
- "label": label,
- "posting_date": formatdate(date),
- "fiscal_year": fiscal_year
- })
+ throw(_("{0} '{1}' not in Fiscal Year {2}").format(label, formatdate(date), fiscal_year))
@frappe.whitelist()
def get_balance_on(account=None, date=None):
@@ -62,7 +55,7 @@
try:
year_start_date = get_fiscal_year(date, verbose=0)[1]
- except FiscalYearError, e:
+ except FiscalYearError:
if getdate(date) > getdate(nowdate()):
# if fiscal year not found and the date is greater than today
# get fiscal year for today's date and its corresponding year start date
@@ -232,9 +225,7 @@
and voucher_no != ifnull(against_voucher, '')""",
(now(), frappe.session.user, ref_type, ref_no))
- frappe.msgprint("{msg} {linked_jv}".format(msg = _("""Following linked Journal Vouchers \
- made against this transaction has been unlinked. You can link them again with other \
- transactions via Payment Reconciliation Tool."""), linked_jv="\n".join(linked_jv)))
+ frappe.msgprint(_("Following Journal Vouchers Unlinked: {0}".format("\n".join(linked_jv))))
@frappe.whitelist()
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index d39f6b6..02170ff 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
from frappe.utils import cstr, flt
-from frappe import msgprint
+from frappe import msgprint, _
from erpnext.controllers.buying_controller import BuyingController
class PurchaseOrder(BuyingController):
@@ -128,8 +128,8 @@
date_diff = frappe.db.sql("select TIMEDIFF('%s', '%s')" % ( mod_db[0][0],cstr(self.modified)))
if date_diff and date_diff[0][0]:
- msgprint(cstr(self.doctype) +" => "+ cstr(self.name) +" has been modified. Please Refresh. ")
- raise Exception
+ msgprint(_("{0} {1} has been modified. Please refresh").format(self.doctype, self.name),
+ raise_exception=True)
def update_status(self, status):
self.check_modified_date()
@@ -140,7 +140,7 @@
self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1)
# step 3:=> Acknowledge user
- msgprint(self.doctype + ": " + self.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
+ msgprint(_("Status of {0} {1} is now {2}").format(self.doctype, self.name, status))
def on_submit(self):
purchase_controller = frappe.get_doc("Purchase Common")
@@ -163,12 +163,12 @@
pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Receipt', docname = self.name, detail_doctype = 'Purchase Receipt Item')
# Check if Purchase Invoice has been submitted against current Purchase Order
- submitted = frappe.db.sql("""select t1.name
+ submitted = frappe.db.sql_list("""select t1.name
from `tabPurchase Invoice` t1,`tabPurchase Invoice Item` t2
where t1.name = t2.parent and t2.purchase_order = %s and t1.docstatus = 1""",
self.name)
if submitted:
- msgprint("Purchase Invoice : " + cstr(submitted[0][0]) + " has already been submitted !")
+ msgprint(_("Purchase Invoice {0} is already submitted").format(", ".join(submitted)))
raise Exception
frappe.db.set(self,'status','Cancelled')
diff --git a/erpnext/buying/doctype/supplier/supplier.py b/erpnext/buying/doctype/supplier/supplier.py
index 7c9236f..6828845 100644
--- a/erpnext/buying/doctype/supplier/supplier.py
+++ b/erpnext/buying/doctype/supplier/supplier.py
@@ -55,7 +55,7 @@
#validation for Naming Series mandatory field...
if frappe.defaults.get_global_default('supp_master_name') == 'Naming Series':
if not self.naming_series:
- msgprint("Series is Mandatory.", raise_exception=1)
+ msgprint(_("Series is mandatory"), raise_exception=1)
def get_contacts(self,nm):
if nm:
@@ -106,7 +106,7 @@
@frappe.whitelist()
def get_dashboard_info(supplier):
if not frappe.has_permission("Supplier", "read", supplier):
- frappe.msgprint("No Permission", raise_exception=True)
+ frappe.throw(_("No permission"))
out = {}
for doctype in ["Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"]:
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 3caed03..137bf50 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -417,8 +417,7 @@
ref_amt = flt(frappe.db.get_value(ref_dt + " Item",
item.get(item_ref_dn), based_on), self.precision(based_on, item))
if not ref_amt:
- frappe.msgprint(_("As amount for item") + ": " + item.item_code + _(" in ") +
- ref_dt + _(" is zero, system will not check for over-billed"))
+ frappe.msgprint(_("Warning: System will not check overbilling since amount for Item {0} in {1} is zero").format(item.item_code, ref_dt))
else:
already_billed = frappe.db.sql("""select sum(%s) from `tab%s`
where %s=%s and docstatus=1 and parent != %s""" %
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index 3bde28b..6a6da74 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -14,22 +14,22 @@
def onload_post_render(self):
# contact, address, item details
self.set_missing_values()
-
+
def validate(self):
super(BuyingController, self).validate()
if getattr(self, "supplier", None) and not self.supplier_name:
- self.supplier_name = frappe.db.get_value("Supplier",
+ self.supplier_name = frappe.db.get_value("Supplier",
self.supplier, "supplier_name")
self.is_item_table_empty()
self.validate_stock_or_nonstock_items()
self.validate_warehouse()
-
+
def set_missing_values(self, for_validate=False):
super(BuyingController, self).set_missing_values(for_validate)
self.set_supplier_from_item_default()
self.set_price_list_currency("Buying")
-
+
# set contact and address details for supplier, if they are not mentioned
if getattr(self, "supplier", None):
self.update_if_missing(get_party_details(self.supplier, party_type="Supplier"))
@@ -45,24 +45,24 @@
if supplier:
self.supplier = supplier
break
-
+
def validate_warehouse(self):
from erpnext.stock.utils import validate_warehouse_company
-
- warehouses = list(set([d.warehouse for d in
+
+ warehouses = list(set([d.warehouse for d in
self.get(self.fname) if getattr(d, "warehouse", None)]))
-
+
for w in warehouses:
validate_warehouse_company(w, self.company)
def validate_stock_or_nonstock_items(self):
if not self.get_stock_items():
- tax_for_valuation = [d.account_head for d in
- self.get("other_charges")
+ tax_for_valuation = [d.account_head for d in
+ self.get("other_charges")
if d.category in ["Valuation", "Valuation and Total"]]
if tax_for_valuation:
- frappe.msgprint(_("""Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"""), raise_exception=1)
-
+ frappe.throw(_("Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"))
+
def set_total_in_words(self):
from frappe.utils import money_in_words
company_currency = get_company_currency(self.company)
@@ -71,12 +71,12 @@
if self.meta.get_field("in_words_import"):
self.in_words_import = money_in_words(self.grand_total_import,
self.currency)
-
+
def calculate_taxes_and_totals(self):
self.other_fname = "other_charges"
super(BuyingController, self).calculate_taxes_and_totals()
self.calculate_total_advance("Purchase Invoice", "advance_allocation_details")
-
+
def calculate_item_values(self):
for item in self.item_doclist:
self.round_floats_in(item)
@@ -86,7 +86,7 @@
elif not item.rate:
item.rate = flt(item.price_list_rate * (1.0 - (item.discount_percentage / 100.0)),
self.precision("rate", item))
-
+
item.amount = flt(item.rate * item.qty,
self.precision("amount", item))
item.item_tax_amount = 0.0;
@@ -94,19 +94,19 @@
self._set_in_company_currency(item, "amount", "base_amount")
self._set_in_company_currency(item, "price_list_rate", "base_price_list_rate")
self._set_in_company_currency(item, "rate", "base_rate")
-
-
+
+
def calculate_net_total(self):
self.net_total = self.net_total_import = 0.0
for item in self.item_doclist:
self.net_total += item.base_amount
self.net_total_import += item.amount
-
+
self.round_floats_in(self, ["net_total", "net_total_import"])
-
+
def calculate_totals(self):
- self.grand_total = flt(self.tax_doclist[-1].total if self.tax_doclist
+ self.grand_total = flt(self.tax_doclist[-1].total if self.tax_doclist
else self.net_total, self.precision("grand_total"))
self.grand_total_import = flt(self.grand_total / self.conversion_rate,
self.precision("grand_total_import"))
@@ -116,28 +116,28 @@
if self.meta.get_field("rounded_total"):
self.rounded_total = _round(self.grand_total)
-
+
if self.meta.get_field("rounded_total_import"):
self.rounded_total_import = _round(self.grand_total_import)
-
+
if self.meta.get_field("other_charges_added"):
- self.other_charges_added = flt(sum([flt(d.tax_amount) for d in self.tax_doclist
- if d.add_deduct_tax=="Add" and d.category in ["Valuation and Total", "Total"]]),
+ self.other_charges_added = flt(sum([flt(d.tax_amount) for d in self.tax_doclist
+ if d.add_deduct_tax=="Add" and d.category in ["Valuation and Total", "Total"]]),
self.precision("other_charges_added"))
-
+
if self.meta.get_field("other_charges_deducted"):
- self.other_charges_deducted = flt(sum([flt(d.tax_amount) for d in self.tax_doclist
- if d.add_deduct_tax=="Deduct" and d.category in ["Valuation and Total", "Total"]]),
+ self.other_charges_deducted = flt(sum([flt(d.tax_amount) for d in self.tax_doclist
+ if d.add_deduct_tax=="Deduct" and d.category in ["Valuation and Total", "Total"]]),
self.precision("other_charges_deducted"))
-
+
if self.meta.get_field("other_charges_added_import"):
- self.other_charges_added_import = flt(self.other_charges_added /
+ self.other_charges_added_import = flt(self.other_charges_added /
self.conversion_rate, self.precision("other_charges_added_import"))
-
+
if self.meta.get_field("other_charges_deducted_import"):
- self.other_charges_deducted_import = flt(self.other_charges_deducted /
+ self.other_charges_deducted_import = flt(self.other_charges_deducted /
self.conversion_rate, self.precision("other_charges_deducted_import"))
-
+
def calculate_outstanding_amount(self):
if self.doctype == "Purchase Invoice" and self.docstatus == 0:
self.total_advance = flt(self.total_advance,
@@ -146,17 +146,17 @@
self.precision("write_off_amount")), self.precision("total_amount_to_pay"))
self.outstanding_amount = flt(self.total_amount_to_pay - self.total_advance,
self.precision("outstanding_amount"))
-
+
# update valuation rate
def update_valuation_rate(self, parentfield):
"""
item_tax_amount is the total tax amount applied on that item
- stored for valuation
-
+ stored for valuation
+
TODO: rename item_tax_amount to valuation_tax_amount
"""
stock_items = self.get_stock_items()
-
+
stock_items_qty, stock_items_amount = 0, 0
last_stock_item_idx = 1
for d in self.get(parentfield):
@@ -164,47 +164,45 @@
stock_items_qty += flt(d.qty)
stock_items_amount += flt(d.base_amount)
last_stock_item_idx = d.idx
-
- total_valuation_amount = sum([flt(d.tax_amount) for d in
- self.get("other_charges")
+
+ total_valuation_amount = sum([flt(d.tax_amount) for d in
+ self.get("other_charges")
if d.category in ["Valuation", "Valuation and Total"]])
-
-
+
+
valuation_amount_adjustment = total_valuation_amount
for i, item in enumerate(self.get(parentfield)):
if item.item_code and item.qty and item.item_code in stock_items:
item_proportion = flt(item.base_amount) / stock_items_amount if stock_items_amount \
else flt(item.qty) / stock_items_qty
-
+
if i == (last_stock_item_idx - 1):
- item.item_tax_amount = flt(valuation_amount_adjustment,
+ item.item_tax_amount = flt(valuation_amount_adjustment,
self.precision("item_tax_amount", item))
else:
- item.item_tax_amount = flt(item_proportion * total_valuation_amount,
+ item.item_tax_amount = flt(item_proportion * total_valuation_amount,
self.precision("item_tax_amount", item))
valuation_amount_adjustment -= item.item_tax_amount
self.round_floats_in(item)
-
+
item.conversion_factor = item.conversion_factor or flt(frappe.db.get_value(
- "UOM Conversion Detail", {"parent": item.item_code, "uom": item.uom},
+ "UOM Conversion Detail", {"parent": item.item_code, "uom": item.uom},
"conversion_factor")) or 1
qty_in_stock_uom = flt(item.qty * item.conversion_factor)
item.valuation_rate = ((item.base_amount + item.item_tax_amount + item.rm_supp_cost)
/ qty_in_stock_uom)
else:
item.valuation_rate = 0.0
-
+
def validate_for_subcontracting(self):
if not self.is_subcontracted and self.sub_contracted_items:
- frappe.msgprint(_("""Please enter whether %s is made for subcontracting or purchasing,
- in 'Is Subcontracted' field""" % self.doctype), raise_exception=1)
-
+ frappe.throw(_("Please enter 'Is Subcontracted' as Yes or No"))
+
if self.doctype == "Purchase Receipt" and self.is_subcontracted=="Yes" \
and not self.supplier_warehouse:
- frappe.msgprint(_("Supplier Warehouse mandatory subcontracted purchase receipt"),
- raise_exception=1)
-
+ frappe.throw(_("Supplier Warehouse mandatory for sub-contracted Purchase Receipt"))
+
def update_raw_materials_supplied(self, raw_material_table):
self.set(raw_material_table, [])
if self.is_subcontracted=="Yes":
@@ -234,30 +232,30 @@
"consumed_qty": required_qty,
"description": item.description,
})
-
+
self.append(raw_material_table, rm_doclist)
-
+
raw_materials_cost += required_qty * flt(item.rate)
-
+
if self.doctype == "Purchase Receipt":
d.rm_supp_cost = raw_materials_cost
def get_items_from_default_bom(self, item_code):
- bom_items = frappe.db.sql("""select t2.item_code, t2.qty_consumed_per_unit,
- t2.rate, t2.stock_uom, t2.name, t2.description
- from `tabBOM` t1, `tabBOM Item` t2
- where t2.parent = t1.name and t1.item = %s and t1.is_default = 1
+ bom_items = frappe.db.sql("""select t2.item_code, t2.qty_consumed_per_unit,
+ t2.rate, t2.stock_uom, t2.name, t2.description
+ from `tabBOM` t1, `tabBOM Item` t2
+ where t2.parent = t1.name and t1.item = %s and t1.is_default = 1
and t1.docstatus = 1 and t1.is_active = 1""", item_code, as_dict=1)
if not bom_items:
- msgprint(_("No default BOM exists for item: ") + item_code, raise_exception=1)
-
+ msgprint(_("No default BOM exists for Item {0}").format(item_code), raise_exception=1)
+
return bom_items
@property
def sub_contracted_items(self):
if not hasattr(self, "_sub_contracted_items"):
self._sub_contracted_items = []
- item_codes = list(set(item.item_code for item in
+ item_codes = list(set(item.item_code for item in
self.get(self.fname)))
if item_codes:
self._sub_contracted_items = [r[0] for r in frappe.db.sql("""select name
@@ -265,12 +263,12 @@
(", ".join((["%s"]*len(item_codes))),), item_codes)]
return self._sub_contracted_items
-
+
@property
def purchase_items(self):
if not hasattr(self, "_purchase_items"):
self._purchase_items = []
- item_codes = list(set(item.item_code for item in
+ item_codes = list(set(item.item_code for item in
self.get(self.fname)))
if item_codes:
self._purchase_items = [r[0] for r in frappe.db.sql("""select name
@@ -282,4 +280,4 @@
def is_item_table_empty(self):
if not len(self.get(self.fname)):
- frappe.throw(_("Item table can not be blank"))
\ No newline at end of file
+ frappe.throw(_("Item table can not be blank"))
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index 3f78fe6..b13fea2 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -3,9 +3,9 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cint, flt, comma_or, _round, cstr
+from frappe.utils import cint, flt, _round, cstr
from erpnext.setup.utils import get_company_currency
-from frappe import msgprint, _
+from frappe import _, throw
from erpnext.controllers.stock_controller import StockController
@@ -233,8 +233,7 @@
if self.meta.get_field("commission_rate"):
self.round_floats_in(self, ["net_total", "commission_rate"])
if self.commission_rate > 100.0:
- msgprint(_(self.meta.get_label("commission_rate")) + " " +
- _("cannot be greater than 100"), raise_exception=True)
+ throw(_("Commission rate cannot be greater than 100"))
self.total_commission = flt(self.net_total * self.commission_rate / 100.0,
self.precision("total_commission"))
@@ -252,17 +251,14 @@
total += sales_person.allocated_percentage
if sales_team and total != 100.0:
- msgprint(_("Total") + " " +
- _(self.meta.get_label("allocated_percentage", parentfield="sales_team")) +
- " " + _("should be 100%"), raise_exception=True)
+ throw(_("Total allocated percentage for sales team should be 100"))
def validate_order_type(self):
valid_types = ["Sales", "Maintenance", "Shopping Cart"]
if not self.order_type:
self.order_type = "Sales"
elif self.order_type not in valid_types:
- msgprint(_(self.meta.get_label("order_type")) + " " +
- _("must be one of") + ": " + comma_or(valid_types), raise_exception=True)
+ throw(_("Order Type must be one of {1}").comma_or(valid_types))
def check_credit(self, grand_total):
customer_account = frappe.db.get_value("Account", {"company": self.company,
diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py
index 0fceebf..4ccdbda 100644
--- a/erpnext/controllers/status_updater.py
+++ b/erpnext/controllers/status_updater.py
@@ -3,8 +3,8 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import flt, cstr
-from frappe import msgprint
+from frappe.utils import flt
+from frappe import msgprint, _, throw
from frappe.model.controller import DocListController
@@ -129,19 +129,13 @@
item['target_ref_field'] = args['target_ref_field'].replace('_', ' ')
if not item[args['target_ref_field']]:
- msgprint("""As %(target_ref_field)s for item: %(item_code)s in \
- %(parenttype)s: %(parent)s is zero, system will not check \
- over-delivery or over-billed""" % item)
+ msgprint(_("Note: System will not check over-delivery and over-booking for Item {0} as quantity or amount is 0").format(item.item_code))
elif args.get('no_tolerance'):
item['reduce_by'] = item[args['target_field']] - \
item[args['target_ref_field']]
if item['reduce_by'] > .01:
- msgprint("""
- Row #%(idx)s: Max %(target_ref_field)s allowed for <b>Item \
- %(item_code)s</b> against <b>%(parenttype)s %(parent)s</b> \
- is <b>""" % item + cstr(item[args['target_ref_field']]) +
- """</b>.<br>You must reduce the %(target_ref_field)s by \
- %(reduce_by)s""" % item, raise_exception=1)
+ msgprint(_("Allowance for over-delivery / over-billing crossed for Item {0}").format(item.item_code))
+ throw(_("{0} must be less than or equal to {1}").format(_(item.target_ref_field), item[args["target_ref_field"]]))
else:
self.check_overflow_with_tolerance(item, args)
@@ -161,18 +155,8 @@
item['max_allowed'] = flt(item[args['target_ref_field']] * (100+tolerance)/100)
item['reduce_by'] = item[args['target_field']] - item['max_allowed']
- msgprint("""
- Row #%(idx)s: Max %(target_ref_field)s allowed for <b>Item %(item_code)s</b> \
- against <b>%(parenttype)s %(parent)s</b> is <b>%(max_allowed)s</b>.
-
- If you want to increase your overflow tolerance, please increase tolerance %% in \
- Global Defaults or Item master.
-
- Or, you must reduce the %(target_ref_field)s by %(reduce_by)s
-
- Also, please check if the order item has already been billed in the Sales Order""" %
- item, raise_exception=1)
-
+ msgprint(_("Allowance for over-delivery / over-billing crossed for Item {0}").format(item["item_code"]))
+ throw(_("{0} must be less than or equal to {1}").format(_(item["target_ref_field"]), item[args["max_allowed"]]))
def update_qty(self, change_modified=True):
"""
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index 6aeb940..b783924 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -65,7 +65,7 @@
warehouse_with_no_account.append(sle.warehouse)
if warehouse_with_no_account:
- msgprint(_("No accounting entries for following warehouses") + ": \n" +
+ msgprint(_("No accounting entries for the following warehouses") + ": \n" +
"\n".join(warehouse_with_no_account))
return process_gl_map(gl_list)
@@ -231,12 +231,10 @@
def check_expense_account(self, item):
if item.meta.get_field("expense_account") and not item.expense_account:
- msgprint(_("""Expense/Difference account is mandatory for item: """) + item.item_code,
- raise_exception=1)
+ frappe.throw(_("Expense or Difference account is mandatory for Item {0}").format(item.item_code))
if item.meta.get_field("expense_account") and not item.cost_center:
- msgprint(_("""Cost Center is mandatory for item: """) + item.item_code,
- raise_exception=1)
+ frappe.throw(_("""Cost Center is mandatory for item {0}""").format(item.item_code))
def get_sl_entries(self, d, args):
sl_dict = {
diff --git a/erpnext/controllers/trends.py b/erpnext/controllers/trends.py
index fa2e2ae..2c3483c 100644
--- a/erpnext/controllers/trends.py
+++ b/erpnext/controllers/trends.py
@@ -3,12 +3,12 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import add_days, add_months, cstr, getdate
+from frappe.utils import getdate
from frappe import _
def get_columns(filters, trans):
validate_filters(filters)
-
+
# get conditions for based_on filter cond
based_on_details = based_wise_colums_query(filters.get("based_on"), trans)
# get conditions for periodic filter cond
@@ -17,11 +17,11 @@
group_by_cols = group_wise_column(filters.get("group_by"))
columns = based_on_details["based_on_cols"] + period_cols + ["Total(Qty):Float:120", "Total(Amt):Currency:120"]
- if group_by_cols:
+ if group_by_cols:
columns = based_on_details["based_on_cols"] + group_by_cols + period_cols + \
- ["Total(Qty):Float:120", "Total(Amt):Currency:120"]
+ ["Total(Qty):Float:120", "Total(Amt):Currency:120"]
- conditions = {"based_on_select": based_on_details["based_on_select"], "period_wise_select": period_select,
+ conditions = {"based_on_select": based_on_details["based_on_select"], "period_wise_select": period_select,
"columns": columns, "group_by": based_on_details["based_on_group_by"], "grbc": group_by_cols, "trans": trans,
"addl_tables": based_on_details["addl_tables"]}
@@ -30,16 +30,16 @@
def validate_filters(filters):
for f in ["Fiscal Year", "Based On", "Period", "Company"]:
if not filters.get(f.lower().replace(" ", "_")):
- frappe.msgprint(f + _(" is mandatory"), raise_exception=1)
-
+ frappe.throw(_("{0} is mandatory").format(f))
+
if filters.get("based_on") == filters.get("group_by"):
- frappe.msgprint("'Based On' and 'Group By' can not be same", raise_exception=1)
+ frappe.throw(_("'Based On' and 'Group By' can not be same"))
def get_data(filters, conditions):
data = []
inc, cond= '',''
query_details = conditions["based_on_select"] + conditions["period_wise_select"]
-
+
if conditions["based_on_select"] in ["t1.project_name,", "t2.project_name,"]:
cond = 'and '+ conditions["based_on_select"][:-1] +' IS Not NULL'
@@ -59,55 +59,55 @@
else :
inc = 1
data1 = frappe.db.sql(""" select %s from `tab%s` t1, `tab%s Item` t2 %s
- where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s and
- t1.docstatus = 1 %s
- group by %s
- """ % (query_details, conditions["trans"], conditions["trans"], conditions["addl_tables"], "%s",
- "%s", cond, conditions["group_by"]), (filters.get("company"),
+ where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s and
+ t1.docstatus = 1 %s
+ group by %s
+ """ % (query_details, conditions["trans"], conditions["trans"], conditions["addl_tables"], "%s",
+ "%s", cond, conditions["group_by"]), (filters.get("company"),
filters["fiscal_year"]),as_list=1)
for d in range(len(data1)):
#to add blanck column
dt = data1[d]
- dt.insert(ind,'')
+ dt.insert(ind,'')
data.append(dt)
#to get distinct value of col specified by group_by in filter
row = frappe.db.sql("""select DISTINCT(%s) from `tab%s` t1, `tab%s Item` t2 %s
- where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s
- and t1.docstatus = 1 and %s = %s
- """ %
- (sel_col, conditions["trans"], conditions["trans"], conditions["addl_tables"],
+ where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s
+ and t1.docstatus = 1 and %s = %s
+ """ %
+ (sel_col, conditions["trans"], conditions["trans"], conditions["addl_tables"],
"%s", "%s", conditions["group_by"], "%s"),
(filters.get("company"), filters.get("fiscal_year"), data1[d][0]), as_list=1)
for i in range(len(row)):
des = ['' for q in range(len(conditions["columns"]))]
-
- #get data for group_by filter
+
+ #get data for group_by filter
row1 = frappe.db.sql(""" select %s , %s from `tab%s` t1, `tab%s Item` t2 %s
- where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s
- and t1.docstatus = 1 and %s = %s and %s = %s
- """ %
- (sel_col, conditions["period_wise_select"], conditions["trans"],
- conditions["trans"], conditions["addl_tables"], "%s", "%s", sel_col,
- "%s", conditions["group_by"], "%s"),
- (filters.get("company"), filters.get("fiscal_year"), row[i][0],
+ where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s
+ and t1.docstatus = 1 and %s = %s and %s = %s
+ """ %
+ (sel_col, conditions["period_wise_select"], conditions["trans"],
+ conditions["trans"], conditions["addl_tables"], "%s", "%s", sel_col,
+ "%s", conditions["group_by"], "%s"),
+ (filters.get("company"), filters.get("fiscal_year"), row[i][0],
data1[d][0]), as_list=1)
des[ind] = row[i]
- for j in range(1,len(conditions["columns"])-inc):
+ for j in range(1,len(conditions["columns"])-inc):
des[j+inc] = row1[0][j]
-
+
data.append(des)
else:
data = frappe.db.sql(""" select %s from `tab%s` t1, `tab%s Item` t2 %s
- where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s and
- t1.docstatus = 1 %s
- group by %s
- """ %
- (query_details, conditions["trans"], conditions["trans"], conditions["addl_tables"],
- "%s", "%s", cond,conditions["group_by"]),
+ where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s and
+ t1.docstatus = 1 %s
+ group by %s
+ """ %
+ (query_details, conditions["trans"], conditions["trans"], conditions["addl_tables"],
+ "%s", "%s", cond,conditions["group_by"]),
(filters.get("company"), filters.get("fiscal_year")), as_list=1)
return data
@@ -124,13 +124,13 @@
trans_date = 'posting_date'
else:
trans_date = 'transaction_date'
-
+
if filters.get("period") != 'Yearly':
for dt in bet_dates:
get_period_wise_columns(dt, filters.get("period"), pwc)
query_details = get_period_wise_query(dt, trans_date, query_details)
else:
- pwc = [filters.get("fiscal_year") + " (Qty):Float:120",
+ pwc = [filters.get("fiscal_year") + " (Qty):Float:120",
filters.get("fiscal_year") + " (Amt):Currency:120"]
query_details = " SUM(t2.qty), SUM(t1.grand_total),"
@@ -139,14 +139,14 @@
def get_period_wise_columns(bet_dates, period, pwc):
if period == 'Monthly':
- pwc += [get_mon(bet_dates[0]) + " (Qty):Float:120",
+ pwc += [get_mon(bet_dates[0]) + " (Qty):Float:120",
get_mon(bet_dates[0]) + " (Amt):Currency:120"]
else:
- pwc += [get_mon(bet_dates[0]) + "-" + get_mon(bet_dates[1]) + " (Qty):Float:120",
+ pwc += [get_mon(bet_dates[0]) + "-" + get_mon(bet_dates[1]) + " (Qty):Float:120",
get_mon(bet_dates[0]) + "-" + get_mon(bet_dates[1]) + " (Amt):Currency:120"]
def get_period_wise_query(bet_dates, trans_date, query_details):
- query_details += """SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.qty, NULL)),
+ query_details += """SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t2.qty, NULL)),
SUM(IF(t1.%(trans_date)s BETWEEN '%(sd)s' AND '%(ed)s', t1.grand_total, NULL)),
""" % {"trans_date": trans_date, "sd": bet_dates[0],"ed": bet_dates[1]}
return query_details
@@ -156,7 +156,7 @@
from dateutil.relativedelta import relativedelta
if not year_start_date:
- year_start_date, year_end_date = frappe.db.get_value("Fiscal Year",
+ year_start_date, year_end_date = frappe.db.get_value("Fiscal Year",
fiscal_year, ["year_start_date", "year_end_date"])
increment = {
@@ -197,13 +197,13 @@
# based_on_cols, based_on_select, based_on_group_by, addl_tables
if based_on == "Item":
based_on_details["based_on_cols"] = ["Item:Link/Item:120", "Item Name:Data:120"]
- based_on_details["based_on_select"] = "t2.item_code, t2.item_name,"
+ based_on_details["based_on_select"] = "t2.item_code, t2.item_name,"
based_on_details["based_on_group_by"] = 't2.item_code'
based_on_details["addl_tables"] = ''
elif based_on == "Item Group":
based_on_details["based_on_cols"] = ["Item Group:Link/Item Group:120"]
- based_on_details["based_on_select"] = "t2.item_group,"
+ based_on_details["based_on_select"] = "t2.item_group,"
based_on_details["based_on_group_by"] = 't2.item_group'
based_on_details["addl_tables"] = ''
@@ -224,7 +224,7 @@
based_on_details["based_on_select"] = "t1.supplier, t3.supplier_type,"
based_on_details["based_on_group_by"] = 't1.supplier'
based_on_details["addl_tables"] = ',`tabSupplier` t3'
-
+
elif based_on == 'Supplier Type':
based_on_details["based_on_cols"] = ["Supplier Type:Link/Supplier Type:140"]
based_on_details["based_on_select"] = "t3.supplier_type,"
@@ -249,7 +249,7 @@
based_on_details["based_on_group_by"] = 't2.project_name'
based_on_details["addl_tables"] = ''
else:
- frappe.msgprint("Project-wise data is not available for Quotation", raise_exception=1)
+ frappe.throw(_("Project-wise data is not available for Quotation"))
return based_on_details
@@ -257,4 +257,4 @@
if group_by:
return [group_by+":Link/"+group_by+":120"]
else:
- return []
\ No newline at end of file
+ return []
diff --git a/erpnext/hr/doctype/appraisal/appraisal.py b/erpnext/hr/doctype/appraisal/appraisal.py
index 1f7f255..090ba20 100644
--- a/erpnext/hr/doctype/appraisal/appraisal.py
+++ b/erpnext/hr/doctype/appraisal/appraisal.py
@@ -22,22 +22,22 @@
def get_employee_name(self):
self.employee_name = frappe.db.get_value("Employee", self.employee, "employee_name")
return self.employee_name
-
+
def validate_dates(self):
if getdate(self.start_date) > getdate(self.end_date):
frappe.throw(_("End Date can not be less than Start Date"))
-
+
def validate_existing_appraisal(self):
- chk = frappe.db.sql("""select name from `tabAppraisal` where employee=%s
- and (status='Submitted' or status='Completed')
- and ((start_date>=%s and start_date<=%s)
+ chk = frappe.db.sql("""select name from `tabAppraisal` where employee=%s
+ and (status='Submitted' or status='Completed')
+ and ((start_date>=%s and start_date<=%s)
or (end_date>=%s and end_date<=%s))""",
(self.employee,self.start_date,self.end_date,self.start_date,self.end_date))
if chk:
frappe.throw("You have already created Appraisal "\
+cstr(chk[0][0])+" in the current date range for employee "\
+cstr(self.employee_name))
-
+
def calculate_total(self):
total, total_w = 0, 0
for d in self.get('appraisal_details'):
@@ -47,30 +47,29 @@
total_w += flt(d.per_weightage)
if int(total_w) != 100:
- msgprint("Total weightage assigned should be 100%. It is :" + str(total_w) + "%",
- raise_exception=1)
+ frappe.throw(_("Total weightage assigned should be 100%. It is {0}").format(str(total_w) + "%"))
if frappe.db.get_value("Employee", self.employee, "user_id") != \
frappe.session.user and total == 0:
- msgprint("Total can't be zero. You must atleast give some points!", raise_exception=1)
+ frappe.throw(_("Total cannot be zero"))
self.total_score = total
-
+
def on_submit(self):
frappe.db.set(self, 'status', 'Submitted')
-
- def on_cancel(self):
+
+ def on_cancel(self):
frappe.db.set(self, 'status', 'Cancelled')
@frappe.whitelist()
def fetch_appraisal_template(source_name, target_doc=None):
target_doc = get_mapped_doc("Appraisal Template", source_name, {
"Appraisal Template": {
- "doctype": "Appraisal",
- },
+ "doctype": "Appraisal",
+ },
"Appraisal Template Goal": {
- "doctype": "Appraisal Goal",
+ "doctype": "Appraisal Goal",
}
}, target_doc)
- return target_doc
\ No newline at end of file
+ return target_doc
diff --git a/erpnext/hr/doctype/appraisal_template/appraisal_template.py b/erpnext/hr/doctype/appraisal_template/appraisal_template.py
index 930d509..1f753d0 100644
--- a/erpnext/hr/doctype/appraisal_template/appraisal_template.py
+++ b/erpnext/hr/doctype/appraisal_template/appraisal_template.py
@@ -12,8 +12,6 @@
self.total_points = 0
for d in self.get("kra_sheet"):
self.total_points += int(d.per_weightage or 0)
-
+
if int(self.total_points) != 100:
- frappe.msgprint(_("Total (sum of) points distribution for all goals should be 100.") \
- + " " + _("Not") + " " + str(self.total_points),
- raise_exception=True)
\ No newline at end of file
+ frappe.throw(_("Total points for all goals should be 100. It is {0}").format(self.total_points))
diff --git a/erpnext/hr/doctype/attendance/attendance.py b/erpnext/hr/doctype/attendance/attendance.py
index 8c1c3f0..ea9f271 100644
--- a/erpnext/hr/doctype/attendance/attendance.py
+++ b/erpnext/hr/doctype/attendance/attendance.py
@@ -5,44 +5,41 @@
import frappe
from frappe.utils import getdate, nowdate
-from frappe import msgprint, _
+from frappe import _
from frappe.model.document import Document
class Attendance(Document):
- def validate_duplicate_record(self):
- res = frappe.db.sql("""select name from `tabAttendance` where employee = %s and att_date = %s
- and name != %s and docstatus = 1""",
+ def validate_duplicate_record(self):
+ res = frappe.db.sql("""select name from `tabAttendance` where employee = %s and att_date = %s
+ and name != %s and docstatus = 1""",
(self.employee, self.att_date, self.name))
if res:
- msgprint(_("Attendance for the employee: ") + self.employee +
- _(" already marked"), raise_exception=1)
-
+ frappe.throw(_("Attendance for employee {0} is already marked").format(self.employee))
+
def check_leave_record(self):
if self.status == 'Present':
- leave = frappe.db.sql("""select name from `tabLeave Application`
- where employee = %s and %s between from_date and to_date and status = 'Approved'
+ leave = frappe.db.sql("""select name from `tabLeave Application`
+ where employee = %s and %s between from_date and to_date and status = 'Approved'
and docstatus = 1""", (self.employee, self.att_date))
-
+
if leave:
- frappe.msgprint(_("Employee: ") + self.employee + _(" was on leave on ")
- + self.att_date + _(". You can not mark his attendance as 'Present'"),
- raise_exception=1)
-
+ frappe.throw(_("Employee {0} was on leave on {1}. Cannot mark attendance.").format(self.employee,
+ self.att_date))
+
def validate_fiscal_year(self):
from erpnext.accounts.utils import validate_fiscal_year
validate_fiscal_year(self.att_date, self.fiscal_year)
-
+
def validate_att_date(self):
if getdate(self.att_date) > getdate(nowdate()):
- msgprint(_("Attendance can not be marked for future dates"), raise_exception=1)
+ frappe.throw(_("Attendance can not be marked for future dates"))
def validate_employee(self):
emp = frappe.db.sql("select name from `tabEmployee` where name = %s and status = 'Active'",
self.employee)
if not emp:
- msgprint(_("Employee: ") + self.employee +
- _(" not active or does not exists in the system"), raise_exception=1)
-
+ frappe.throw(_("Employee {0} is not active or does not exist").format(self.employee))
+
def validate(self):
from erpnext.utilities import validate_status
validate_status(self.status, ["Present", "Absent", "Half Day"])
@@ -50,9 +47,9 @@
self.validate_att_date()
self.validate_duplicate_record()
self.check_leave_record()
-
+
def on_update(self):
- # this is done because sometimes user entered wrong employee name
+ # this is done because sometimes user entered wrong employee name
# while uploading employee attendance
employee_name = frappe.db.get_value("Employee", self.employee, "employee_name")
- frappe.db.set(self, 'employee_name', employee_name)
\ No newline at end of file
+ frappe.db.set(self, 'employee_name', employee_name)
diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.py b/erpnext/hr/doctype/expense_claim/expense_claim.py
index d95be6b..8250e51 100644
--- a/erpnext/hr/doctype/expense_claim/expense_claim.py
+++ b/erpnext/hr/doctype/expense_claim/expense_claim.py
@@ -3,25 +3,22 @@
from __future__ import unicode_literals
import frappe
-from frappe import msgprint
+from frappe import _
from frappe.model.document import Document
class ExpenseClaim(Document):
-
def validate(self):
self.validate_fiscal_year()
self.validate_exp_details()
-
+
def on_submit(self):
if self.approval_status=="Draft":
- frappe.msgprint("""Please set Approval Status to 'Approved' or \
- 'Rejected' before submitting""", raise_exception=1)
-
+ frappe.throw(_("""Approval Status must be 'Approved' or 'Rejected'"""))
+
def validate_fiscal_year(self):
from erpnext.accounts.utils import validate_fiscal_year
validate_fiscal_year(self.posting_date, self.fiscal_year, "Posting Date")
-
+
def validate_exp_details(self):
if not self.get('expense_voucher_details'):
- msgprint("Please add expense voucher details")
- raise Exception
+ frappe.throw(_("Please add expense voucher details"))
diff --git a/erpnext/hr/doctype/holiday_list/holiday_list.py b/erpnext/hr/doctype/holiday_list/holiday_list.py
index ec15604..496c930 100644
--- a/erpnext/hr/doctype/holiday_list/holiday_list.py
+++ b/erpnext/hr/doctype/holiday_list/holiday_list.py
@@ -4,20 +4,19 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import add_days, add_years, cint, getdate
+from frappe.utils import cint
from frappe.model.naming import make_autoname
-from frappe import msgprint, throw, _
-import datetime
+from frappe import throw, _
from frappe.model.document import Document
class HolidayList(Document):
def autoname(self):
self.name = make_autoname(self.fiscal_year + "/" + self.holiday_list_name + "/.###")
-
+
def validate(self):
self.update_default_holiday_list()
-
+
def get_weekly_off_dates(self):
self.validate_values()
yr_start_date, yr_end_date = self.get_fy_start_end_dates()
@@ -42,24 +41,24 @@
def get_weekly_off_date_list(self, year_start_date, year_end_date):
from frappe.utils import getdate
year_start_date, year_end_date = getdate(year_start_date), getdate(year_end_date)
-
+
from dateutil import relativedelta
from datetime import timedelta
import calendar
-
+
date_list = []
weekday = getattr(calendar, (self.weekly_off).upper())
reference_date = year_start_date + relativedelta.relativedelta(weekday=weekday)
-
+
while reference_date <= year_end_date:
date_list.append(reference_date)
reference_date += timedelta(days=7)
-
+
return date_list
-
+
def clear_table(self):
self.set('holiday_list_details', [])
def update_default_holiday_list(self):
- frappe.db.sql("""update `tabHoliday List` set is_default = 0
+ frappe.db.sql("""update `tabHoliday List` set is_default = 0
where ifnull(is_default, 0) = 1 and fiscal_year = %s""", (self.fiscal_year,))
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index f16f615..cbb6426 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -4,67 +4,46 @@
from __future__ import unicode_literals
import frappe
from frappe.utils import cint, flt
-from frappe import msgprint
-
+from frappe import _
+
from frappe.model.document import Document
class LeaveAllocation(Document):
def validate(self):
self.validate_new_leaves_allocated_value()
self.check_existing_leave_allocation()
- self.validate_new_leaves_allocated()
-
+
def on_update_after_submit(self):
self.validate_new_leaves_allocated_value()
- self.validate_new_leaves_allocated()
def on_update(self):
self.get_total_allocated_leaves()
-
+
def on_cancel(self):
self.check_for_leave_application()
-
+
def validate_new_leaves_allocated_value(self):
"""validate that leave allocation is in multiples of 0.5"""
if flt(self.new_leaves_allocated) % 0.5:
- guess = round(flt(self.new_leaves_allocated) * 2.0) / 2.0
-
- msgprint("""New Leaves Allocated should be a multiple of 0.5.
- Perhaps you should enter %s or %s""" % (guess, guess + 0.5),
- raise_exception=1)
-
+ frappe.throw(_("Leaves must be allocated in multiples of 0.5"))
+
def check_existing_leave_allocation(self):
"""check whether leave for same type is already allocated or not"""
leave_allocation = frappe.db.sql("""select name from `tabLeave Allocation`
where employee=%s and leave_type=%s and fiscal_year=%s and docstatus=1""",
(self.employee, self.leave_type, self.fiscal_year))
if leave_allocation:
- msgprint("""%s is already allocated to Employee: %s for Fiscal Year: %s.
- Please refere Leave Allocation: \
- <a href="#Form/Leave Allocation/%s">%s</a>""" % \
- (self.leave_type, self.employee, self.fiscal_year,
- leave_allocation[0][0], leave_allocation[0][0]), raise_exception=1)
-
- def validate_new_leaves_allocated(self):
- """check if Total Leaves Allocated >= Leave Applications"""
- self.total_leaves_allocated = flt(self.carry_forwarded_leaves) + \
- flt(self.new_leaves_allocated)
- leaves_applied = self.get_leaves_applied(self.fiscal_year)
- if leaves_applied > self.total_leaves_allocated:
- expected_new_leaves = flt(self.new_leaves_allocated) + \
- (leaves_applied - self.total_leaves_allocated)
- msgprint("""Employee: %s has already applied for %s leaves.
- Hence, New Leaves Allocated should be atleast %s""" % \
- (self.employee, leaves_applied, expected_new_leaves),
- raise_exception=1)
-
+ frappe.msgprint(_("Leaves for type {0} already allocated for Employee {1} for Fiscal Year {0}").format(self.leave_type,
+ self.employee, self.fiscal_year))
+ frappe.throw('<a href="#Form/Leave Allocation/{0}">{0}</a>'.format(leave_allocation[0][0]))
+
def get_leave_bal(self, prev_fyear):
return self.get_leaves_allocated(prev_fyear) - self.get_leaves_applied(prev_fyear)
-
+
def get_leaves_applied(self, fiscal_year):
leaves_applied = frappe.db.sql("""select SUM(ifnull(total_leave_days, 0))
from `tabLeave Application` where employee=%s and leave_type=%s
- and fiscal_year=%s and docstatus=1""",
+ and fiscal_year=%s and docstatus=1""",
(self.employee, self.leave_type, fiscal_year))
return leaves_applied and flt(leaves_applied[0][0]) or 0
@@ -74,7 +53,7 @@
and fiscal_year=%s and docstatus=1 and name!=%s""",
(self.employee, self.leave_type, fiscal_year, self.name))
return leaves_allocated and flt(leaves_allocated[0][0]) or 0
-
+
def allow_carry_forward(self):
"""check whether carry forward is allowed or not for this leave type"""
cf = frappe.db.sql("""select is_carry_forward from `tabLeave Type` where name = %s""",
@@ -82,15 +61,14 @@
cf = cf and cint(cf[0][0]) or 0
if not cf:
frappe.db.set(self,'carry_forward',0)
- msgprint("Sorry! You cannot carry forward %s" % (self.leave_type),
- raise_exception=1)
+ frappe.throw("Cannot carry forward {0}".format(self.leave_type))
def get_carry_forwarded_leaves(self):
if self.carry_forward:
self.allow_carry_forward()
- prev_fiscal_year = frappe.db.sql("""select name from `tabFiscal Year`
- where year_start_date = (select date_add(year_start_date, interval -1 year)
- from `tabFiscal Year` where name=%s)
+ prev_fiscal_year = frappe.db.sql("""select name from `tabFiscal Year`
+ where year_start_date = (select date_add(year_start_date, interval -1 year)
+ from `tabFiscal Year` where name=%s)
order by name desc limit 1""", self.fiscal_year)
prev_fiscal_year = prev_fiscal_year and prev_fiscal_year[0][0] or ''
prev_bal = 0
@@ -112,10 +90,7 @@
where employee=%s and leave_type=%s and fiscal_year=%s and docstatus=1""",
(self.employee, self.leave_type, self.fiscal_year))
if exists:
- msgprint("""Cannot cancel this Leave Allocation as \
- Employee : %s has already applied for %s.
- Please check Leave Application: \
- <a href="#Form/Leave Application/%s">%s</a>""" % \
- (self.employee, self.leave_type, exists[0][0], exists[0][0]))
- raise Exception
+ frappe.msgprint(_("Cannot cancel because Employee {0} is already approved for {1}").format(self.employee,
+ self.leave_type))
+ frappe.throw('<a href="#Form/Leave Application/{0}">{0}</a>'.format(exists[0][0]))
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 5de3495..1262911 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -13,7 +13,7 @@
class OverlapError(frappe.ValidationError): pass
class InvalidLeaveApproverError(frappe.ValidationError): pass
class LeaveApproverIdentityError(frappe.ValidationError): pass
-
+
from frappe.model.controller import DocListController
class LeaveApplication(DocListController):
def setup(self):
@@ -21,7 +21,7 @@
self.previous_doc = frappe.db.get_value(self.doctype, self.name, "*", as_dict=True)
else:
self.previous_doc = None
-
+
def validate(self):
self.validate_to_date()
self.validate_balance_leaves()
@@ -30,7 +30,7 @@
self.show_block_day_warning()
self.validate_block_days()
self.validate_leave_approver()
-
+
def on_update(self):
if (not self.previous_doc and self.leave_approver) or (self.previous_doc and \
self.status == "Open" and self.previous_doc.leave_approver != self.leave_approver):
@@ -40,25 +40,24 @@
self.previous_doc.status == "Open" and self.status == "Rejected":
# notify employee about rejection
self.notify_employee(self.status)
-
+
def on_submit(self):
if self.status != "Approved":
- frappe.msgprint("""Only Leave Applications with status 'Approved' can be Submitted.""",
- raise_exception=True)
+ frappe.throw(_("Only Leave Applications with status 'Approved' can be submitted"))
# notify leave applier about approval
self.notify_employee(self.status)
-
+
def on_cancel(self):
# notify leave applier about cancellation
self.notify_employee("cancelled")
def show_block_day_warning(self):
- from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
+ from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
- block_dates = get_applicable_block_dates(self.from_date, self.to_date,
+ block_dates = get_applicable_block_dates(self.from_date, self.to_date,
self.employee, self.company, all_lists=True)
-
+
if block_dates:
frappe.msgprint(_("Warning: Leave application contains following block dates") + ":")
for d in block_dates:
@@ -67,20 +66,20 @@
def validate_block_days(self):
from erpnext.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
- block_dates = get_applicable_block_dates(self.from_date, self.to_date,
+ block_dates = get_applicable_block_dates(self.from_date, self.to_date,
self.employee, self.company)
-
+
if block_dates:
if self.status == "Approved":
- frappe.msgprint(_("Cannot approve leave as you are not authorized to approve leaves on Block Dates."))
+ frappe.msgprint(_("Cannot approve leave as you are not authorized to approve leaves on Block Dates"))
raise LeaveDayBlockedError
-
+
def get_holidays(self):
- tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2, `tabEmployee` e1
- where e1.name = %s and h1.parent = h2.name and e1.holiday_list = h2.name
+ tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2, `tabEmployee` e1
+ where e1.name = %s and h1.parent = h2.name and e1.holiday_list = h2.name
and h1.holiday_date between %s and %s""", (self.employee, self.from_date, self.to_date))
if not tot_hol:
- tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2
+ tot_hol = frappe.db.sql("""select count(*) from `tabHoliday` h1, `tabHoliday List` h2
where h1.parent = h2.name and h1.holiday_date between %s and %s
and ifnull(h2.is_default,0) = 1 and h2.fiscal_year = %s""",
(self.from_date, self.to_date, self.fiscal_year))
@@ -100,17 +99,15 @@
def validate_to_date(self):
if self.from_date and self.to_date and \
(getdate(self.to_date) < getdate(self.from_date)):
- msgprint("To date cannot be before from date")
- raise Exception
-
+ frappe.throw(_("To date cannot be before from date"))
+
def validate_balance_leaves(self):
if self.from_date and self.to_date:
self.total_leave_days = self.get_total_leave_days()["total_leave_days"]
-
+
if self.total_leave_days == 0:
- msgprint(_("The day(s) on which you are applying for leave coincide with holiday(s). You need not apply for leave."),
- raise_exception=1)
-
+ frappe.throw(_("The day(s) on which you are applying for leave are holiday. You need not apply for leave."))
+
if not is_lwp(self.leave_type):
self.leave_balance = get_leave_balance(self.employee,
self.leave_type, self.fiscal_year)["leave_balance"]
@@ -118,94 +115,96 @@
if self.status != "Rejected" \
and self.leave_balance - self.total_leave_days < 0:
#check if this leave type allow the remaining balance to be in negative. If yes then warn the user and continue to save else warn the user and don't save.
- msgprint("There is not enough leave balance for Leave Type: %s" % \
- (self.leave_type,),
- raise_exception=not(frappe.db.get_value("Leave Type", self.leave_type,"allow_negative") or None))
-
+ if frappe.db.get_value("Leave Type", self.leave_type, "allow_negative"):
+ frappe.msgprint(_("Note: There is not enough leave balance for Leave Type {0}").format(self.leave_type))
+ else:
+ frappe.throw(_("There is not enough leave balance for Leave Type {0}").format(self.leave_type))
+
+
def validate_leave_overlap(self):
if not self.name:
self.name = "New Leave Application"
-
- for d in frappe.db.sql("""select name, leave_type, posting_date,
- from_date, to_date
- from `tabLeave Application`
- where
+
+ for d in frappe.db.sql("""select name, leave_type, posting_date,
+ from_date, to_date
+ from `tabLeave Application`
+ where
employee = %(employee)s
and docstatus < 2
and status in ("Open", "Approved")
- and (from_date between %(from_date)s and %(to_date)s
+ and (from_date between %(from_date)s and %(to_date)s
or to_date between %(from_date)s and %(to_date)s
or %(from_date)s between from_date and to_date)
and name != %(name)s""", self.as_dict(), as_dict = 1):
-
- msgprint("Employee : %s has already applied for %s between %s and %s on %s. Please refer Leave Application : <a href=\"#Form/Leave Application/%s\">%s</a>" % (self.employee, cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date']), formatdate(d['posting_date']), d['name'], d['name']), raise_exception = OverlapError)
+
+ frappe.msgprint(_("Employee {0} has already applied for {1} between {2} and {3}").format(self.employee,
+ cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date'])))
+ frappe.throw('<a href="#Form/Leave Application/{0}">{0}</a>'.format(d["name"]), OverlapError)
def validate_max_days(self):
max_days = frappe.db.get_value("Leave Type", self.leave_type, "max_days_allowed")
if max_days and self.total_leave_days > max_days:
- frappe.throw("Sorry ! You cannot apply for %s for more than %s days" %
+ frappe.throw("Sorry ! You cannot apply for %s for more than %s days" %
(self.leave_type, max_days))
-
+
def validate_leave_approver(self):
employee = frappe.get_doc("Employee", self.employee)
- leave_approvers = [l.leave_approver for l in
+ leave_approvers = [l.leave_approver for l in
employee.get("employee_leave_approvers")]
-
+
if len(leave_approvers) and self.leave_approver not in leave_approvers:
- msgprint(("[" + _("For Employee") + ' "' + self.employee + '"] '
- + _("Leave Approver can be one of") + ": "
- + comma_or(leave_approvers)), raise_exception=InvalidLeaveApproverError)
-
- elif self.leave_approver and not frappe.db.sql("""select name from `tabUserRole`
+ frappe.throw(_("Leave approver must be one of {0}").format(comma_or(leave_approvers)), InvalidLeaveApproverError)
+
+ elif self.leave_approver and not frappe.db.sql("""select name from `tabUserRole`
where parent=%s and role='Leave Approver'""", self.leave_approver):
- msgprint(get_fullname(self.leave_approver) + ": " \
- + _("does not have role 'Leave Approver'"), raise_exception=InvalidLeaveApproverError)
-
+ frappe.throw(_("{0} must have role 'Leave Approver'").format(get_fullname(self.leave_approver)),
+ InvalidLeaveApproverError)
+
elif self.docstatus==1 and len(leave_approvers) and self.leave_approver != frappe.session.user:
msgprint(_("Only the selected Leave Approver can submit this Leave Application"),
raise_exception=LeaveApproverIdentityError)
-
+
def notify_employee(self, status):
employee = frappe.get_doc("Employee", self.employee)
if not employee.user_id:
return
-
+
def _get_message(url=False):
if url:
name = get_url_to_form(self.doctype, self.name)
else:
name = self.name
-
+
return (_("Leave Application") + ": %s - %s") % (name, _(status))
-
+
self.notify({
# for post in messages
"message": _get_message(url=True),
"message_to": employee.user_id,
"subject": _get_message(),
})
-
+
def notify_leave_approver(self):
employee = frappe.get_doc("Employee", self.employee)
-
+
def _get_message(url=False):
name = self.name
employee_name = cstr(employee.employee_name)
if url:
name = get_url_to_form(self.doctype, self.name)
employee_name = get_url_to_form("Employee", self.employee, label=employee_name)
-
+
return (_("New Leave Application") + ": %s - " + _("Employee") + ": %s") % (name, employee_name)
-
+
self.notify({
# for post in messages
"message": _get_message(url=True),
"message_to": self.leave_approver,
-
+
# for email
"subject": _get_message()
})
-
+
def notify(self, args):
args = frappe._dict(args)
from frappe.core.page.messages.messages import post
@@ -213,62 +212,62 @@
"notify": cint(self.follow_via_email)})
@frappe.whitelist()
-def get_leave_balance(employee, leave_type, fiscal_year):
- leave_all = frappe.db.sql("""select total_leaves_allocated
+def get_leave_balance(employee, leave_type, fiscal_year):
+ leave_all = frappe.db.sql("""select total_leaves_allocated
from `tabLeave Allocation` where employee = %s and leave_type = %s
- and fiscal_year = %s and docstatus = 1""", (employee,
+ and fiscal_year = %s and docstatus = 1""", (employee,
leave_type, fiscal_year))
-
+
leave_all = leave_all and flt(leave_all[0][0]) or 0
-
- leave_app = frappe.db.sql("""select SUM(total_leave_days)
- from `tabLeave Application`
+
+ leave_app = frappe.db.sql("""select SUM(total_leave_days)
+ from `tabLeave Application`
where employee = %s and leave_type = %s and fiscal_year = %s
and status="Approved" and docstatus = 1""", (employee, leave_type, fiscal_year))
leave_app = leave_app and flt(leave_app[0][0]) or 0
-
+
ret = {'leave_balance': leave_all - leave_app}
return ret
def is_lwp(leave_type):
lwp = frappe.db.sql("select is_lwp from `tabLeave Type` where name = %s", leave_type)
return lwp and cint(lwp[0][0]) or 0
-
+
@frappe.whitelist()
def get_events(start, end):
events = []
employee = frappe.db.get_default("employee", frappe.session.user)
company = frappe.db.get_default("company", frappe.session.user)
-
+
from frappe.widgets.reportview import build_match_conditions
match_conditions = build_match_conditions("Leave Application")
-
+
# show department leaves for employee
if "Employee" in frappe.get_roles():
add_department_leaves(events, start, end, employee, company)
add_leaves(events, start, end, employee, company, match_conditions)
-
+
add_block_dates(events, start, end, employee, company)
add_holidays(events, start, end, employee, company)
-
+
return events
-
+
def add_department_leaves(events, start, end, employee, company):
department = frappe.db.get_value("Employee", employee, "department")
-
+
if not department:
return
-
+
# department leaves
department_employees = frappe.db.sql_list("""select name from tabEmployee where department=%s
and company=%s""", (department, company))
-
+
match_conditions = "employee in (\"%s\")" % '", "'.join(department_employees)
add_leaves(events, start, end, employee, company, match_conditions=match_conditions)
-
+
def add_leaves(events, start, end, employee, company, match_conditions=None):
- query = """select name, from_date, to_date, employee_name, half_day,
+ query = """select name, from_date, to_date, employee_name, half_day,
status, employee, docstatus
from `tabLeave Application` where
(from_date between %s and %s or to_date between %s and %s)
@@ -276,7 +275,7 @@
and status!="Rejected" """
if match_conditions:
query += " and " + match_conditions
-
+
for d in frappe.db.sql(query, (start, end, start, end), as_dict=True):
e = {
"name": d.name,
@@ -311,9 +310,9 @@
applicable_holiday_list = frappe.db.get_value("Employee", employee, "holiday_list")
if not applicable_holiday_list:
return
-
+
for holiday in frappe.db.sql("""select name, holiday_date, description
- from `tabHoliday` where parent=%s and holiday_date between %s and %s""",
+ from `tabHoliday` where parent=%s and holiday_date between %s and %s""",
(applicable_holiday_list, start, end), as_dict=True):
events.append({
"doctype": "Holiday",
@@ -325,24 +324,24 @@
@frappe.whitelist()
def query_for_permitted_employees(doctype, txt, searchfield, start, page_len, filters):
txt = "%" + cstr(txt) + "%"
-
+
if "Leave Approver" in frappe.user.get_roles():
user = frappe.session.user.replace('"', '\"')
condition = """and (exists(select ela.name from `tabEmployee Leave Approver` ela
- where ela.parent=`tabEmployee`.name and ela.leave_approver= "%s") or
- not exists(select ela.name from `tabEmployee Leave Approver` ela
+ where ela.parent=`tabEmployee`.name and ela.leave_approver= "%s") or
+ not exists(select ela.name from `tabEmployee Leave Approver` ela
where ela.parent=`tabEmployee`.name)
or user_id = "%s")""" % (user, user)
else:
from frappe.widgets.reportview import build_match_conditions
condition = build_match_conditions("Employee")
condition = ("and " + condition) if condition else ""
-
+
return frappe.db.sql("""select name, employee_name from `tabEmployee`
where status = 'Active' and docstatus < 2 and
(`%s` like %s or employee_name like %s) %s
order by
case when name like %s then 0 else 1 end,
case when employee_name like %s then 0 else 1 end,
- name limit %s, %s""" % tuple([searchfield] + ["%s"]*2 + [condition] + ["%s"]*4),
+ name limit %s, %s""" % tuple([searchfield] + ["%s"]*2 + [condition] + ["%s"]*4),
(txt, txt, txt, txt, start, page_len))
diff --git a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
index 4a8795a..d3a21fa 100644
--- a/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
+++ b/erpnext/hr/doctype/leave_control_panel/leave_control_panel.py
@@ -4,16 +4,16 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cint, cstr, flt, nowdate
+from frappe.utils import cint, cstr, flt, nowdate, comma_and
from frappe import msgprint, _
-
+
from frappe.model.document import Document
class LeaveControlPanel(Document):
- def get_employees(self):
+ def get_employees(self):
lst1 = [[self.employee_type,"employment_type"],[self.branch,"branch"],[self.designation,"designation"],[self.department, "department"],[self.grade,"grade"]]
condition = "where "
flag = 0
@@ -26,7 +26,7 @@
flag = 1
emp_query = "select name from `tabEmployee` "
if flag == 1:
- emp_query += condition
+ emp_query += condition
e = frappe.db.sql(emp_query)
return e
@@ -41,7 +41,7 @@
employees = self.get_employees()
if not employees:
frappe.throw(_("No employee found"))
-
+
for d in self.get_employees():
try:
la = frappe.get_doc('Leave Allocation')
@@ -59,4 +59,4 @@
except:
pass
if leave_allocated_for:
- msgprint("Leaves Allocated Successfully for " + ", ".join(leave_allocated_for))
+ msgprint(_("Leaves Allocated Successfully for {0}").format(comma_and(leave_allocated_for)))
diff --git a/erpnext/hr/doctype/salary_manager/salary_manager.py b/erpnext/hr/doctype/salary_manager/salary_manager.py
index 05d73c7..e73bd69 100644
--- a/erpnext/hr/doctype/salary_manager/salary_manager.py
+++ b/erpnext/hr/doctype/salary_manager/salary_manager.py
@@ -4,57 +4,56 @@
from __future__ import unicode_literals
import frappe
from frappe.utils import cint, flt
-from frappe import msgprint
+from frappe import _
from frappe.model.document import Document
class SalaryManager(Document):
-
+
def get_emp_list(self):
"""
- Returns list of active employees based on selected criteria
- and for which salary structure exists
+ Returns list of active employees based on selected criteria
+ and for which salary structure exists
"""
-
+
cond = self.get_filter_condition()
cond += self.get_joining_releiving_condition()
-
+
emp_list = frappe.db.sql("""
select t1.name
- from `tabEmployee` t1, `tabSalary Structure` t2
- where t1.docstatus!=2 and t2.docstatus != 2
+ from `tabEmployee` t1, `tabSalary Structure` t2
+ where t1.docstatus!=2 and t2.docstatus != 2
and t1.name = t2.employee
%s """% cond)
return emp_list
-
-
+
+
def get_filter_condition(self):
self.check_mandatory()
-
+
cond = ''
for f in ['company', 'branch', 'department', 'designation', 'grade']:
if self.get(f):
- cond += " and t1." + f + " = '" + self.get(f).replace("'", "\'") + "'"
-
+ cond += " and t1." + f + " = '" + self.get(f).replace("'", "\'") + "'"
+
return cond
-
+
def get_joining_releiving_condition(self):
m = self.get_month_details(self.fiscal_year, self.month)
cond = """
- and ifnull(t1.date_of_joining, '0000-00-00') <= '%(month_end_date)s'
- and ifnull(t1.relieving_date, '2199-12-31') >= '%(month_start_date)s'
+ and ifnull(t1.date_of_joining, '0000-00-00') <= '%(month_end_date)s'
+ and ifnull(t1.relieving_date, '2199-12-31') >= '%(month_start_date)s'
""" % m
return cond
-
-
+
+
def check_mandatory(self):
for f in ['company', 'month', 'fiscal_year']:
if not self.get(f):
- msgprint("Please select %s to proceed" % f, raise_exception=1)
-
-
+ frappe.throw(_("Please set {0}").format(f))
+
def get_month_details(self, year, month):
ysd = frappe.db.get_value("Fiscal Year", year, "year_start_date")
if ysd:
@@ -67,22 +66,22 @@
month_days = cint(calendar.monthrange(cint(msd.year) ,cint(month))[1]) # days in month
med = datetime.date(msd.year, cint(month), month_days) # month end date
return {
- 'year': msd.year,
- 'month_start_date': msd,
- 'month_end_date': med,
+ 'year': msd.year,
+ 'month_start_date': msd,
+ 'month_end_date': med,
'month_days': month_days
}
def create_sal_slip(self):
"""
Creates salary slip for selected employees if already not created
-
+
"""
-
+
emp_list = self.get_emp_list()
ss_list = []
for emp in emp_list:
- if not frappe.db.sql("""select name from `tabSalary Slip`
+ if not frappe.db.sql("""select name from `tabSalary Slip`
where docstatus!= 2 and employee = %s and month = %s and fiscal_year = %s and company = %s
""", (emp[0], self.month, self.fiscal_year, self.company)):
ss = frappe.get_doc({
@@ -95,18 +94,18 @@
})
ss.insert()
ss_list.append(ss.name)
-
+
return self.create_log(ss_list)
-
-
+
+
def create_log(self, ss_list):
log = "<b>No employee for the above selected criteria OR salary slip already created</b>"
if ss_list:
log = "<b>Created Salary Slip has been created: </b>\
<br><br>%s" % '<br>'.join(ss_list)
return log
-
-
+
+
def get_sal_slip_list(self):
"""
Returns list of salary slips based on selected criteria
@@ -114,17 +113,17 @@
"""
cond = self.get_filter_condition()
ss_list = frappe.db.sql("""
- select t1.name from `tabSalary Slip` t1
+ select t1.name from `tabSalary Slip` t1
where t1.docstatus = 0 and month = %s and fiscal_year = %s %s
""" % ('%s', '%s', cond), (self.month, self.fiscal_year))
return ss_list
-
-
+
+
def submit_salary_slip(self):
"""
Submit all salary slips based on selected criteria
"""
- ss_list = self.get_sal_slip_list()
+ ss_list = self.get_sal_slip_list()
not_submitted_ss = []
for ss in ss_list:
ss_obj = frappe.get_doc("Salary Slip",ss[0])
@@ -132,31 +131,31 @@
frappe.db.set(ss_obj, 'email_check', cint(self.send_mail))
if cint(self.send_email) == 1:
ss_obj.send_mail_funct()
-
+
frappe.db.set(ss_obj, 'docstatus', 1)
except Exception,e:
not_submitted_ss.append(ss[0])
- msgprint(e)
+ frappe.msgprint(e)
continue
-
+
return self.create_submit_log(ss_list, not_submitted_ss)
-
-
+
+
def create_submit_log(self, all_ss, not_submitted_ss):
log = ''
if not all_ss:
log = "No salary slip found to submit for the above selected criteria"
else:
all_ss = [d[0] for d in all_ss]
-
- submitted_ss = list(set(all_ss) - set(not_submitted_ss))
+
+ submitted_ss = list(set(all_ss) - set(not_submitted_ss))
if submitted_ss:
mail_sent_msg = self.send_email and " (Mail has been sent to the employee)" or ""
log = """
<b>Submitted Salary Slips%s:</b>\
<br><br> %s <br><br>
""" % (mail_sent_msg, '<br>'.join(submitted_ss))
-
+
if not_submitted_ss:
log += """
<b>Not Submitted Salary Slips: </b>\
@@ -167,33 +166,33 @@
send mail, uncheck 'Send Email' checkbox. <br>\
Then try to submit Salary Slip again.
"""% ('<br>'.join(not_submitted_ss))
- return log
-
-
+ return log
+
+
def get_total_salary(self):
"""
Get total salary amount from submitted salary slip based on selected criteria
"""
cond = self.get_filter_condition()
tot = frappe.db.sql("""
- select sum(rounded_total) from `tabSalary Slip` t1
+ select sum(rounded_total) from `tabSalary Slip` t1
where t1.docstatus = 1 and month = %s and fiscal_year = %s %s
""" % ('%s', '%s', cond), (self.month, self.fiscal_year))
-
+
return flt(tot[0][0])
-
-
+
+
def get_acc_details(self):
"""
get default bank account,default salary acount from company
"""
amt = self.get_total_salary()
- default_bank_account = frappe.db.get_value("Company", self.company,
+ default_bank_account = frappe.db.get_value("Company", self.company,
"default_bank_account")
if not default_bank_account:
- msgprint("You can set Default Bank Account in Company master.")
+ frappe.msgprint(_("You can set Default Bank Account in Company master"))
return {
'default_bank_account' : default_bank_account,
'amount' : amt
- }
\ No newline at end of file
+ }
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index 8c34037..12733e3 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -10,12 +10,12 @@
from frappe import msgprint, _
from erpnext.setup.utils import get_company_currency
-
+
from erpnext.utilities.transaction_base import TransactionBase
class SalarySlip(TransactionBase):
def autoname(self):
- self.name = make_autoname('Sal Slip/' +self.employee + '/.#####')
+ self.name = make_autoname('Sal Slip/' +self.employee + '/.#####')
def get_emp_and_leave_details(self):
if self.employee:
@@ -25,19 +25,19 @@
self.pull_sal_struct(struct)
def check_sal_struct(self):
- struct = frappe.db.sql("""select name from `tabSalary Structure`
+ struct = frappe.db.sql("""select name from `tabSalary Structure`
where employee=%s and is_active = 'Yes'""", self.employee)
if not struct:
- msgprint("Please create Salary Structure for employee '%s'" % self.employee)
+ msgprint(_("Please create Salary Structure for employee {0}").format(self.employee))
self.employee = None
return struct and struct[0][0] or ''
def pull_sal_struct(self, struct):
from erpnext.hr.doctype.salary_structure.salary_structure import get_mapped_doc
self.update(get_mapped_doc(struct, self))
-
+
def pull_emp_details(self):
- emp = frappe.db.get_value("Employee", self.employee,
+ emp = frappe.db.get_value("Employee", self.employee,
["bank_name", "bank_ac_no", "esic_card_no", "pf_number"], as_dict=1)
if emp:
self.bank_name = emp.bank_name
@@ -50,39 +50,36 @@
self.fiscal_year = frappe.get_default("fiscal_year")
if not self.month:
self.month = "%02d" % getdate(nowdate()).month
-
+
m = frappe.get_doc('Salary Manager').get_month_details(self.fiscal_year, self.month)
holidays = self.get_holidays_for_employee(m)
-
+
if not cint(frappe.db.get_value("HR Settings", "HR Settings",
"include_holidays_in_total_working_days")):
m["month_days"] -= len(holidays)
if m["month_days"] < 0:
- msgprint(_("Bummer! There are more holidays than working days this month."),
- raise_exception=True)
-
+ frappe.throw(_("There are more holidays than working days this month."))
+
if not lwp:
lwp = self.calculate_lwp(holidays, m)
self.total_days_in_month = m['month_days']
self.leave_without_pay = lwp
payment_days = flt(self.get_payment_days(m)) - flt(lwp)
self.payment_days = payment_days > 0 and payment_days or 0
-
+
def get_payment_days(self, m):
payment_days = m['month_days']
emp = frappe.db.sql("select date_of_joining, relieving_date from `tabEmployee` \
where name = %s", self.employee, as_dict=1)[0]
-
+
if emp['relieving_date']:
if getdate(emp['relieving_date']) > m['month_start_date'] and \
getdate(emp['relieving_date']) < m['month_end_date']:
payment_days = getdate(emp['relieving_date']).day
elif getdate(emp['relieving_date']) < m['month_start_date']:
- frappe.msgprint(_("Relieving Date of employee is ") + cstr(emp['relieving_date']
- + _(". Please set status of the employee as 'Left'")), raise_exception=1)
-
-
+ frappe.throw(_("Employee relieved on {0} must be set as 'Left'").format(emp["relieving_date"]))
+
if emp['date_of_joining']:
if getdate(emp['date_of_joining']) > m['month_start_date'] and \
getdate(emp['date_of_joining']) < m['month_end_date']:
@@ -91,19 +88,19 @@
payment_days = 0
return payment_days
-
+
def get_holidays_for_employee(self, m):
- holidays = frappe.db.sql("""select t1.holiday_date
- from `tabHoliday` t1, tabEmployee t2
- where t1.parent = t2.holiday_list and t2.name = %s
- and t1.holiday_date between %s and %s""",
+ holidays = frappe.db.sql("""select t1.holiday_date
+ from `tabHoliday` t1, tabEmployee t2
+ where t1.parent = t2.holiday_list and t2.name = %s
+ and t1.holiday_date between %s and %s""",
(self.employee, m['month_start_date'], m['month_end_date']))
if not holidays:
- holidays = frappe.db.sql("""select t1.holiday_date
- from `tabHoliday` t1, `tabHoliday List` t2
- where t1.parent = t2.name and ifnull(t2.is_default, 0) = 1
+ holidays = frappe.db.sql("""select t1.holiday_date
+ from `tabHoliday` t1, `tabHoliday List` t2
+ where t1.parent = t2.name and ifnull(t2.is_default, 0) = 1
and t2.fiscal_year = %s
- and t1.holiday_date between %s and %s""", (self.fiscal_year,
+ and t1.holiday_date between %s and %s""", (self.fiscal_year,
m['month_start_date'], m['month_end_date']))
holidays = [cstr(i[0]) for i in holidays]
return holidays
@@ -115,10 +112,10 @@
if dt not in holidays:
leave = frappe.db.sql("""
select t1.name, t1.half_day
- from `tabLeave Application` t1, `tabLeave Type` t2
- where t2.name = t1.leave_type
- and ifnull(t2.is_lwp, 0) = 1
- and t1.docstatus = 1
+ from `tabLeave Application` t1, `tabLeave Type` t2
+ where t2.name = t1.leave_type
+ and ifnull(t2.is_lwp, 0) = 1
+ and t1.docstatus = 1
and t1.employee = %s
and %s between from_date and to_date
""", (self.employee, dt))
@@ -127,21 +124,19 @@
return lwp
def check_existing(self):
- ret_exist = frappe.db.sql("""select name from `tabSalary Slip`
- where month = %s and fiscal_year = %s and docstatus != 2
- and employee = %s and name != %s""",
+ ret_exist = frappe.db.sql("""select name from `tabSalary Slip`
+ where month = %s and fiscal_year = %s and docstatus != 2
+ and employee = %s and name != %s""",
(self.month, self.fiscal_year, self.employee, self.name))
if ret_exist:
self.employee = ''
- msgprint("Salary Slip of employee '%s' already created for this month"
- % self.employee, raise_exception=1)
-
+ frappe.throw("Salary Slip of employee {0} already created for this month".format(self.employee))
def validate(self):
from frappe.utils import money_in_words
self.check_existing()
-
- if not (len(self.get("earning_details")) or
+
+ if not (len(self.get("earning_details")) or
len(self.get("deduction_details"))):
self.get_emp_and_leave_details()
else:
@@ -149,7 +144,7 @@
if not self.net_pay:
self.calculate_net_pay()
-
+
company_currency = get_company_currency(self.company)
self.total_in_words = money_in_words(self.rounded_total, company_currency)
@@ -164,46 +159,46 @@
else:
d.e_modified_amount = d.e_amount
self.gross_pay += flt(d.e_modified_amount)
-
+
def calculate_ded_total(self):
self.total_deduction = 0
for d in self.get('deduction_details'):
if cint(d.d_depends_on_lwp) == 1:
- d.d_modified_amount = _round(flt(d.d_amount) * flt(self.payment_days)
+ d.d_modified_amount = _round(flt(d.d_amount) * flt(self.payment_days)
/ cint(self.total_days_in_month), 2)
elif not self.payment_days:
d.d_modified_amount = 0
else:
d.d_modified_amount = d.d_amount
-
+
self.total_deduction += flt(d.d_modified_amount)
-
+
def calculate_net_pay(self):
self.calculate_earning_total()
self.calculate_ded_total()
self.net_pay = flt(self.gross_pay) - flt(self.total_deduction)
- self.rounded_total = _round(self.net_pay)
+ self.rounded_total = _round(self.net_pay)
def on_submit(self):
- if(self.email_check == 1):
+ if(self.email_check == 1):
self.send_mail_funct()
-
- def send_mail_funct(self):
+
+ def send_mail_funct(self):
from frappe.utils.email_lib import sendmail
receiver = frappe.db.get_value("Employee", self.employee, "company_email")
if receiver:
subj = 'Salary Slip - ' + cstr(self.month) +'/'+cstr(self.fiscal_year)
- earn_ret=frappe.db.sql("""select e_type, e_modified_amount from `tabSalary Slip Earning`
+ earn_ret=frappe.db.sql("""select e_type, e_modified_amount from `tabSalary Slip Earning`
where parent = %s""", self.name)
- ded_ret=frappe.db.sql("""select d_type, d_modified_amount from `tabSalary Slip Deduction`
+ ded_ret=frappe.db.sql("""select d_type, d_modified_amount from `tabSalary Slip Deduction`
where parent = %s""", self.name)
-
+
earn_table = ''
ded_table = ''
- if earn_ret:
+ if earn_ret:
earn_table += "<table cellspacing=5px cellpadding=5px width='100%%'>"
-
+
for e in earn_ret:
if not e[1]:
earn_table += '<tr><td>%s</td><td align="right">0.00</td></tr>' % cstr(e[0])
@@ -211,11 +206,11 @@
earn_table += '<tr><td>%s</td><td align="right">%s</td></tr>' \
% (cstr(e[0]), cstr(e[1]))
earn_table += '</table>'
-
+
if ded_ret:
-
+
ded_table += "<table cellspacing=5px cellpadding=5px width='100%%'>"
-
+
for d in ded_ret:
if not d[1]:
ded_table +='<tr><td">%s</td><td align="right">0.00</td></tr>' % cstr(d[0])
@@ -223,10 +218,10 @@
ded_table +='<tr><td>%s</td><td align="right">%s</td></tr>' \
% (cstr(d[0]), cstr(d[1]))
ded_table += '</table>'
-
- letter_head = frappe.db.get_value("Letter Head", {"is_default": 1, "disabled": 0},
+
+ letter_head = frappe.db.get_value("Letter Head", {"is_default": 1, "disabled": 0},
"content")
-
+
msg = '''<div> %s <br>
<table cellspacing= "5" cellpadding="5" width = "100%%">
<tr>
@@ -248,15 +243,15 @@
<td width = "50%%">Designation : %s</td>
<td width = "50%%">Grade : %s</td>
</tr>
- <tr>
+ <tr>
<td width = "50%%">Bank Account No. : %s</td>
<td width = "50%%">Bank Name : %s</td>
-
+
</tr>
<tr>
<td width = "50%%">Arrear Amount : <b>%s</b></td>
<td width = "50%%">Payment days : %s</td>
-
+
</tr>
</table>
<table border="1px solid #CCC" width="100%%" cellpadding="0px" cellspacing="0px">
@@ -287,14 +282,14 @@
<td width='25%%'><b>Net Pay(in words) : </td>
<td colspan = '3' width = '50%%'>%s</b></td>
</tr>
- </table></div>''' % (cstr(letter_head), cstr(self.employee),
- cstr(self.employee_name), cstr(self.month), cstr(self.fiscal_year),
- cstr(self.department), cstr(self.branch), cstr(self.designation),
- cstr(self.grade), cstr(self.bank_account_no), cstr(self.bank_name),
- cstr(self.arrear_amount), cstr(self.payment_days), earn_table, ded_table,
- cstr(flt(self.gross_pay)), cstr(flt(self.total_deduction)),
+ </table></div>''' % (cstr(letter_head), cstr(self.employee),
+ cstr(self.employee_name), cstr(self.month), cstr(self.fiscal_year),
+ cstr(self.department), cstr(self.branch), cstr(self.designation),
+ cstr(self.grade), cstr(self.bank_account_no), cstr(self.bank_name),
+ cstr(self.arrear_amount), cstr(self.payment_days), earn_table, ded_table,
+ cstr(flt(self.gross_pay)), cstr(flt(self.total_deduction)),
cstr(flt(self.net_pay)), cstr(self.total_in_words))
sendmail([receiver], subject=subj, msg = msg)
else:
- msgprint("Company Email ID not found, hence mail not sent")
+ msgprint(_("Company Email ID not found, hence mail not sent"))
diff --git a/erpnext/hr/doctype/salary_structure/salary_structure.py b/erpnext/hr/doctype/salary_structure/salary_structure.py
index 2bbc99b..6843644 100644
--- a/erpnext/hr/doctype/salary_structure/salary_structure.py
+++ b/erpnext/hr/doctype/salary_structure/salary_structure.py
@@ -6,7 +6,7 @@
from frappe.utils import cstr, flt
from frappe.model.naming import make_autoname
-from frappe import msgprint, _
+from frappe import _
from frappe.model.document import Document
@@ -17,7 +17,7 @@
def get_employee_details(self):
ret = {}
- det = frappe.db.sql("""select employee_name, branch, designation, department, grade
+ det = frappe.db.sql("""select employee_name, branch, designation, department, grade
from `tabEmployee` where name = %s""", self.employee)
if det:
ret = {
@@ -31,7 +31,7 @@
return ret
def get_ss_values(self,employee):
- basic_info = frappe.db.sql("""select bank_name, bank_ac_no, esic_card_no, pf_number
+ basic_info = frappe.db.sql("""select bank_name, bank_ac_no, esic_card_no, pf_number
from `tabEmployee` where name =%s""", employee)
ret = {'bank_name': basic_info and basic_info[0][0] or '',
'bank_ac_no': basic_info and basic_info[0][1] or '',
@@ -49,33 +49,32 @@
elif(tab_fname == 'deduction_details'):
child.d_type = cstr(li[0])
child.d_modified_amt = 0
-
- def make_earn_ded_table(self):
+
+ def make_earn_ded_table(self):
self.make_table('Earning Type','earning_details','Salary Structure Earning')
self.make_table('Deduction Type','deduction_details', 'Salary Structure Deduction')
def check_existing(self):
- ret = frappe.db.sql("""select name from `tabSalary Structure` where is_active = 'Yes'
+ ret = frappe.db.sql("""select name from `tabSalary Structure` where is_active = 'Yes'
and employee = %s and name!=%s""", (self.employee,self.name))
if ret and self.is_active=='Yes':
- msgprint(_("""Another Salary Structure '%s' is active for employee '%s'. Please make its status 'Inactive' to proceed.""") %
- (cstr(ret), self.employee), raise_exception=1)
+ frappe.throw(_("Another Salary Structure {0} is active for employee {0}. Please make its status 'Inactive' to proceed.").format(cstr(ret), self.employee))
def validate_amount(self):
if flt(self.net_pay) < 0:
- msgprint(_("Net pay can not be negative"), raise_exception=1)
+ frappe.throw(_("Net pay cannot be negative"))
- def validate(self):
+ def validate(self):
self.check_existing()
self.validate_amount()
-
+
@frappe.whitelist()
def make_salary_slip(source_name, target_doc=None):
return get_mapped_doc(source_name, target_doc).as_dict()
-
+
def get_mapped_doc(source_name, target_doc=None):
from frappe.model.mapper import get_mapped_doc
-
+
def postprocess(source, target):
sal_slip = frappe.get_doc(target)
sal_slip.run_method("pull_emp_details")
@@ -84,24 +83,24 @@
doc = get_mapped_doc("Salary Structure", source_name, {
"Salary Structure": {
- "doctype": "Salary Slip",
+ "doctype": "Salary Slip",
"field_map": {
"total_earning": "gross_pay"
}
- },
+ },
"Salary Structure Deduction": {
- "doctype": "Salary Slip Deduction",
+ "doctype": "Salary Slip Deduction",
"field_map": [
["depend_on_lwp", "d_depends_on_lwp"],
["d_modified_amt", "d_amount"],
["d_modified_amt", "d_modified_amount"]
],
"add_if_empty": True
- },
+ },
"Salary Structure Earning": {
- "doctype": "Salary Slip Earning",
+ "doctype": "Salary Slip Earning",
"field_map": [
- ["depend_on_lwp", "e_depends_on_lwp"],
+ ["depend_on_lwp", "e_depends_on_lwp"],
["modified_value", "e_modified_amount"],
["modified_value", "e_amount"]
],
diff --git a/erpnext/hr/doctype/upload_attendance/upload_attendance.py b/erpnext/hr/doctype/upload_attendance/upload_attendance.py
index 1ba31e9..af86eb9 100644
--- a/erpnext/hr/doctype/upload_attendance/upload_attendance.py
+++ b/erpnext/hr/doctype/upload_attendance/upload_attendance.py
@@ -6,7 +6,7 @@
from __future__ import unicode_literals
import frappe
from frappe.utils import cstr, add_days, date_diff
-from frappe import msgprint, _
+from frappe import _
from frappe.utils.datautils import UnicodeWriter
from frappe.model.document import Document
@@ -17,32 +17,32 @@
def get_template():
if not frappe.has_permission("Attendance", "create"):
raise frappe.PermissionError
-
+
args = frappe.local.form_dict
w = UnicodeWriter()
w = add_header(w)
-
+
w = add_data(w, args)
# write out response as a type csv
frappe.response['result'] = cstr(w.getvalue())
frappe.response['type'] = 'csv'
frappe.response['doctype'] = "Attendance"
-
+
def add_header(w):
status = ", ".join((frappe.get_meta("Attendance").get_field("status").options or "").strip().split("\n"))
w.writerow(["Notes:"])
w.writerow(["Please do not change the template headings"])
w.writerow(["Status should be one of these values: " + status])
w.writerow(["If you are overwriting existing attendance records, 'ID' column mandatory"])
- w.writerow(["ID", "Employee", "Employee Name", "Date", "Status",
+ w.writerow(["ID", "Employee", "Employee Name", "Date", "Status",
"Fiscal Year", "Company", "Naming Series"])
return w
-
+
def add_data(w, args):
from erpnext.accounts.utils import get_fiscal_year
-
+
dates = get_dates(args)
employees = get_active_employees()
existing_attendance_records = get_existing_attendance_records(args)
@@ -54,9 +54,9 @@
existing_attendance = existing_attendance_records[tuple([date, employee.name])]
row = [
existing_attendance and existing_attendance.name or "",
- employee.name, employee.employee_name, date,
+ employee.name, employee.employee_name, date,
existing_attendance and existing_attendance.status or "",
- get_fiscal_year(date)[0], employee.company,
+ get_fiscal_year(date)[0], employee.company,
existing_attendance and existing_attendance.naming_series or get_naming_series(),
]
w.writerow(row)
@@ -67,28 +67,27 @@
no_of_days = date_diff(add_days(args["to_date"], 1), args["from_date"])
dates = [add_days(args["from_date"], i) for i in range(0, no_of_days)]
return dates
-
+
def get_active_employees():
- employees = frappe.db.sql("""select name, employee_name, company
+ employees = frappe.db.sql("""select name, employee_name, company
from tabEmployee where docstatus < 2 and status = 'Active'""", as_dict=1)
return employees
-
+
def get_existing_attendance_records(args):
- attendance = frappe.db.sql("""select name, att_date, employee, status, naming_series
- from `tabAttendance` where att_date between %s and %s and docstatus < 2""",
+ attendance = frappe.db.sql("""select name, att_date, employee, status, naming_series
+ from `tabAttendance` where att_date between %s and %s and docstatus < 2""",
(args["from_date"], args["to_date"]), as_dict=1)
-
+
existing_attendance = {}
for att in attendance:
existing_attendance[tuple([att.att_date, att.employee])] = att
-
+
return existing_attendance
-
+
def get_naming_series():
series = frappe.get_meta("Attendance").get_field("naming_series").options.strip().split("\n")
if not series:
- msgprint("""Please create naming series for Attendance \
- through Setup -> Numbering Series.""", raise_exception=1)
+ frappe.throw(_("Please setup numbering series for Attendance via Setup > Numbering Series"))
return series[0]
@@ -96,10 +95,10 @@
def upload():
if not frappe.has_permission("Attendance", "create"):
raise frappe.PermissionError
-
+
from frappe.utils.datautils import read_csv_content_from_uploaded_file
from frappe.modules import scrub
-
+
rows = read_csv_content_from_uploaded_file()
if not rows:
msg = [_("Please select a csv file")]
@@ -109,10 +108,9 @@
columns[3] = "att_date"
ret = []
error = False
-
+
from frappe.utils.datautils import check_record, import_doc
- doctype_dl = frappe.get_meta("Attendance")
-
+
for i, row in enumerate(rows[5:]):
if not row: continue
row_idx = i + 5
@@ -120,18 +118,18 @@
d["doctype"] = "Attendance"
if d.name:
d["docstatus"] = frappe.db.get_value("Attendance", d.name, "docstatus")
-
+
try:
check_record(d)
ret.append(import_doc(d, "Attendance", 1, row_idx, submit=True))
except Exception, e:
error = True
- ret.append('Error for row (#%d) %s : %s' % (row_idx,
+ ret.append('Error for row (#%d) %s : %s' % (row_idx,
len(row)>1 and row[1] or "", cstr(e)))
frappe.errprint(frappe.get_traceback())
if error:
- frappe.db.rollback()
+ frappe.db.rollback()
else:
frappe.db.commit()
return {"messages": ret, "error": error}
diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py
index fc9e7a2..87a9e0b 100644
--- a/erpnext/hr/utils.py
+++ b/erpnext/hr/utils.py
@@ -10,8 +10,8 @@
roles = [r[0] for r in frappe.db.sql("""select distinct parent from `tabUserRole`
where role='Leave Approver'""")]
if not roles:
- frappe.msgprint(_("No Leave Approvers. Please assign 'Leave Approver' Role to atleast one user."))
-
+ frappe.msgprint(_("No Leave Approvers. Please assign 'Leave Approver' Role to atleast one user"))
+
return roles
@@ -20,6 +20,5 @@
roles = [r[0] for r in frappe.db.sql("""select distinct parent from `tabUserRole`
where role='Expense Approver'""")]
if not roles:
- frappe.msgprint("No Expense Approvers. Please assign 'Expense Approver' \
- Role to atleast one user.")
+ frappe.msgprint(_("No Expense Approvers. Please assign 'Expense Approver' Role to atleast one user"))
return roles
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 206c963..40218ce 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -5,10 +5,7 @@
import frappe
from frappe.utils import cint, cstr, flt, now, nowdate
-from frappe import msgprint, _
-
-
-
+from frappe import _
from frappe.model.document import Document
class BOM(Document):
@@ -64,11 +61,7 @@
def validate_rm_item(self, item):
if item[0]['name'] == self.item:
- msgprint("Item_code: %s in materials tab cannot be same as FG Item",
- item[0]['name'], raise_exception=1)
-
- if not item or item[0]['docstatus'] == 2:
- msgprint("Item %s does not exist in system" % item[0]['item_code'], raise_exception = 1)
+ frappe.throw(_("Raw material cannot be same as main Item"))
def set_bom_material_details(self):
for item in self.get("bom_materials"):
@@ -188,12 +181,10 @@
""" Validate main FG item"""
item = self.get_item_det(self.item)
if not item:
- msgprint("Item %s does not exists in the system or expired." %
- self.item, raise_exception = 1)
+ frappe.throw(_("Item {0} does not exists in the system or has expired").format(self.item))
elif item[0]['is_manufactured_item'] != 'Yes' \
and item[0]['is_sub_contracted_item'] != 'Yes':
- msgprint("""As Item: %s is not a manufactured / sub-contracted item, \
- you can not make BOM for it""" % self.item, raise_exception = 1)
+ frappe.throw(_("Item {0} must be manufactured or sub-contracted").format(self.item))
else:
ret = frappe.db.get_value("Item", self.item, ["description", "stock_uom"])
self.description = ret[0]
@@ -204,8 +195,7 @@
self.op = []
for d in self.get('bom_operations'):
if cstr(d.operation_no) in self.op:
- msgprint("Operation no: %s is repeated in Operations Table" %
- d.operation_no, raise_exception=1)
+ frappe.throw(_("Operation {0} is repeated in Operations Table").format(d.operation_no))
else:
# add operation in op list
self.op.append(cstr(d.operation_no))
@@ -216,26 +206,20 @@
for m in self.get('bom_materials'):
# check if operation no not in op table
if self.with_operations and cstr(m.operation_no) not in self.op:
- msgprint("""Operation no: %s against item: %s at row no: %s \
- is not present at Operations table""" %
- (m.operation_no, m.item_code, m.idx), raise_exception = 1)
+ frappe.throw(_("Operation {0} not present in Operations Table").format(m.operation_no))
item = self.get_item_det(m.item_code)
if item[0]['is_manufactured_item'] == 'Yes':
if not m.bom_no:
- msgprint("Please enter BOM No aginst item: %s at row no: %s" %
- (m.item_code, m.idx), raise_exception=1)
+ frappe.throw(_("BOM number is required for manufactured Item {0} in row {1}").format(m.item, m.idx))
else:
self.validate_bom_no(m.item_code, m.bom_no, m.idx)
elif m.bom_no:
- msgprint("""As Item %s is not a manufactured / sub-contracted item, \
- you can not enter BOM against it (Row No: %s).""" %
- (m.item_code, m.idx), raise_exception = 1)
+ frappe.throw(_("BOM number not allowed for non-manufactured Item {0} in row {1}").format(m.item_code, m.idx))
if flt(m.qty) <= 0:
- msgprint("Please enter qty against raw material: %s at row no: %s" %
- (m.item_code, m.idx), raise_exception = 1)
+ frappe.throw(_("Quantity required for Item {0} in row {1}").format(m.item_code, m.idx))
self.check_if_item_repeated(m.item_code, m.operation_no, check_list)
@@ -245,14 +229,11 @@
and is_active=1 and docstatus=1""",
(bom_no, item), as_dict =1)
if not bom:
- msgprint("""Incorrect BOM No: %s against item: %s at row no: %s.
- It may be inactive or not submitted or does not belong to this item.""" %
- (bom_no, item, idx), raise_exception = 1)
+ frappe.throw(_("BOM {0} for Item {1} in row {2} is inactive or not submitted").format(bom_no, item, idx))
def check_if_item_repeated(self, item, op, check_list):
if [cstr(item), cstr(op)] in check_list:
- msgprint(_("Item") + " %s " % (item,) + _("has been entered atleast twice")
- + (cstr(op) and _(" against same operation") or ""), raise_exception=1)
+ frappe.throw(_("Item {0} has been entered multiple times against same operation").format(item))
else:
check_list.append([cstr(item), cstr(op)])
@@ -268,8 +249,7 @@
count = count + 1
for b in boms:
if b[0] == self.name:
- msgprint("""Recursion Occured => '%s' cannot be '%s' of '%s'.
- """ % (cstr(b[0]), cstr(d[2]), self.name), raise_exception = 1)
+ frappe.throw(_("BOM recursion: {0} cannot be parent or child of {2}").format(b[0], self.name))
if b[0]:
bom_list.append(b[0])
@@ -389,12 +369,9 @@
and docstatus = 1 and is_active = 1)""", self.name)
if act_pbom and act_pbom[0][0]:
- action = self.docstatus < 2 and _("deactivate") or _("cancel")
- msgprint(_("Cannot ") + action + _(": It is linked to other active BOM(s)"),
- raise_exception=1)
+ frappe.throw(_("Cannot deactive or cancle BOM as it is linked with other BOMs"))
def get_bom_items_as_dict(bom, qty=1, fetch_exploded=1):
- import json
item_dict = {}
query = """select
diff --git a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
index b772fcb..63030b5 100644
--- a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
+++ b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
@@ -4,8 +4,8 @@
from __future__ import unicode_literals
import frappe
from frappe.utils import cstr, flt
-from frappe import msgprint, _
-
+from frappe import _
+
from frappe.model.document import Document
class BOMReplaceTool(Document):
@@ -17,22 +17,22 @@
for bom in bom_list:
bom_obj = frappe.get_doc("BOM", bom)
updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
-
+
frappe.msgprint(_("BOM replaced"))
def validate_bom(self):
if cstr(self.current_bom) == cstr(self.new_bom):
- msgprint("Current BOM and New BOM can not be same", raise_exception=1)
-
+ frappe.throw(_("Current BOM and New BOM can not be same"))
+
def update_new_bom(self):
- current_bom_unitcost = frappe.db.sql("""select total_cost/quantity
+ current_bom_unitcost = frappe.db.sql("""select total_cost/quantity
from `tabBOM` where name = %s""", self.current_bom)
current_bom_unitcost = current_bom_unitcost and flt(current_bom_unitcost[0][0]) or 0
- frappe.db.sql("""update `tabBOM Item` set bom_no=%s,
- rate=%s, amount=qty*%s where bom_no = %s and docstatus < 2""",
+ frappe.db.sql("""update `tabBOM Item` set bom_no=%s,
+ rate=%s, amount=qty*%s where bom_no = %s and docstatus < 2""",
(self.new_bom, current_bom_unitcost, current_bom_unitcost, self.current_bom))
-
+
def get_parent_boms(self):
- return [d[0] for d in frappe.db.sql("""select distinct parent
+ return [d[0] for d in frappe.db.sql("""select distinct parent
from `tabBOM Item` where ifnull(bom_no, '') = %s and docstatus < 2""",
- self.new_bom)]
\ No newline at end of file
+ self.new_bom)]
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index af92413..78270e5 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -16,31 +16,31 @@
def validate(self):
if self.docstatus == 0:
self.status = "Draft"
-
+
from erpnext.utilities import validate_status
- validate_status(self.status, ["Draft", "Submitted", "Stopped",
+ validate_status(self.status, ["Draft", "Submitted", "Stopped",
"In Process", "Completed", "Cancelled"])
self.validate_bom_no()
self.validate_sales_order()
self.validate_warehouse()
-
+
from erpnext.utilities.transaction_base import validate_uom_is_integer
validate_uom_is_integer(self, "stock_uom", ["qty", "produced_qty"])
-
+
def validate_bom_no(self):
if self.bom_no:
- bom = frappe.db.sql("""select name from `tabBOM` where name=%s and docstatus=1
+ bom = frappe.db.sql("""select name from `tabBOM` where name=%s and docstatus=1
and is_active=1 and item=%s"""
, (self.bom_no, self.production_item), as_dict =1)
if not bom:
- frappe.throw("""Incorrect BOM: %s entered.
- May be BOM not exists or inactive or not submitted
+ frappe.throw("""Incorrect BOM: %s entered.
+ May be BOM not exists or inactive or not submitted
or for some other item.""" % cstr(self.bom_no))
-
+
def validate_sales_order(self):
if self.sales_order:
- so = frappe.db.sql("""select name, delivery_date from `tabSales Order`
+ so = frappe.db.sql("""select name, delivery_date from `tabSales Order`
where name=%s and docstatus = 1""", self.sales_order, as_dict=1)[0]
if not so.name:
@@ -48,39 +48,39 @@
if not self.expected_delivery_date:
self.expected_delivery_date = so.delivery_date
-
+
self.validate_production_order_against_so()
-
+
def validate_warehouse(self):
from erpnext.stock.utils import validate_warehouse_company
-
+
for w in [self.fg_warehouse, self.wip_warehouse]:
validate_warehouse_company(w, self.company)
-
+
def validate_production_order_against_so(self):
# already ordered qty
ordered_qty_against_so = frappe.db.sql("""select sum(qty) from `tabProduction Order`
- where production_item = %s and sales_order = %s and docstatus < 2 and name != %s""",
+ where production_item = %s and sales_order = %s and docstatus < 2 and name != %s""",
(self.production_item, self.sales_order, self.name))[0][0]
total_qty = flt(ordered_qty_against_so) + flt(self.qty)
-
+
# get qty from Sales Order Item table
- so_item_qty = frappe.db.sql("""select sum(qty) from `tabSales Order Item`
- where parent = %s and item_code = %s""",
+ so_item_qty = frappe.db.sql("""select sum(qty) from `tabSales Order Item`
+ where parent = %s and item_code = %s""",
(self.sales_order, self.production_item))[0][0]
# get qty from Packing Item table
- dnpi_qty = frappe.db.sql("""select sum(qty) from `tabPacked Item`
- where parent = %s and parenttype = 'Sales Order' and item_code = %s""",
+ dnpi_qty = frappe.db.sql("""select sum(qty) from `tabPacked Item`
+ where parent = %s and parenttype = 'Sales Order' and item_code = %s""",
(self.sales_order, self.production_item))[0][0]
# total qty in SO
so_qty = flt(so_item_qty) + flt(dnpi_qty)
-
+
if total_qty > so_qty:
- frappe.throw(_("Total production order qty for item") + ": " +
- cstr(self.production_item) + _(" against sales order") + ": " +
- cstr(self.sales_order) + _(" will be ") + cstr(total_qty) + ", " +
- _("which is greater than sales order qty ") + "(" + cstr(so_qty) + ")" +
+ frappe.throw(_("Total production order qty for item") + ": " +
+ cstr(self.production_item) + _(" against sales order") + ": " +
+ cstr(self.sales_order) + _(" will be ") + cstr(total_qty) + ", " +
+ _("which is greater than sales order qty ") + "(" + cstr(so_qty) + ")" +
_("Please reduce qty."), exc=OverProductionError)
def stop_unstop(self, status):
@@ -88,7 +88,7 @@
self.update_status(status)
qty = (flt(self.qty)-flt(self.produced_qty)) * ((status == 'Stopped') and -1 or 1)
self.update_planned_qty(qty)
- msgprint("Production Order has been %s" % status)
+ frappe.msgprint(_("Production Order status is {0}").format(status))
def update_status(self, status):
@@ -108,14 +108,14 @@
frappe.throw(_("WIP Warehouse required before Submit"))
frappe.db.set(self,'status', 'Submitted')
self.update_planned_qty(self.qty)
-
+
def on_cancel(self):
# Check whether any stock entry exists against this Production Order
- stock_entry = frappe.db.sql("""select name from `tabStock Entry`
+ stock_entry = frappe.db.sql("""select name from `tabStock Entry`
where production_order = %s and docstatus = 1""", self.name)
if stock_entry:
- frappe.throw("""Submitted Stock Entry %s exists against this production order.
+ frappe.throw("""Submitted Stock Entry %s exists against this production order.
Hence can not be cancelled.""" % stock_entry[0][0])
frappe.db.set(self,'status', 'Cancelled')
@@ -132,27 +132,27 @@
from erpnext.stock.utils import update_bin
update_bin(args)
-@frappe.whitelist()
+@frappe.whitelist()
def get_item_details(item):
res = frappe.db.sql("""select stock_uom, description
from `tabItem` where (ifnull(end_of_life, "")="" or end_of_life > now())
and name=%s""", item, as_dict=1)
-
+
if not res:
return {}
-
+
res = res[0]
- bom = frappe.db.sql("""select name from `tabBOM` where item=%s
+ bom = frappe.db.sql("""select name from `tabBOM` where item=%s
and ifnull(is_default, 0)=1""", item)
if bom:
res.bom_no = bom[0][0]
-
+
return res
@frappe.whitelist()
def make_stock_entry(production_order_id, purpose):
production_order = frappe.get_doc("Production Order", production_order_id)
-
+
stock_entry = frappe.new_doc("Stock Entry")
stock_entry.purpose = purpose
stock_entry.production_order = production_order_id
@@ -160,12 +160,12 @@
stock_entry.bom_no = production_order.bom_no
stock_entry.use_multi_level_bom = production_order.use_multi_level_bom
stock_entry.fg_completed_qty = flt(production_order.qty) - flt(production_order.produced_qty)
-
+
if purpose=="Material Transfer":
stock_entry.to_warehouse = production_order.wip_warehouse
else:
stock_entry.from_warehouse = production_order.wip_warehouse
stock_entry.to_warehouse = production_order.fg_warehouse
-
+
stock_entry.run_method("get_items")
return stock_entry.as_dict()
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index e3fe7c3..5556fbe 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cstr, flt, cint, nowdate, add_days
+from frappe.utils import cstr, flt, cint, nowdate, add_days, comma_and
from frappe import msgprint, _
@@ -16,19 +16,19 @@
def get_so_details(self, so):
"""Pull other details from so"""
- so = frappe.db.sql("""select transaction_date, customer, grand_total
+ so = frappe.db.sql("""select transaction_date, customer, grand_total
from `tabSales Order` where name = %s""", so, as_dict = 1)
ret = {
'sales_order_date': so and so[0]['transaction_date'] or '',
'customer' : so[0]['customer'] or '',
'grand_total': so[0]['grand_total']
}
- return ret
-
+ return ret
+
def get_item_details(self, item_code):
""" Pull other item details from item master"""
- item = frappe.db.sql("""select description, stock_uom, default_bom
+ item = frappe.db.sql("""select description, stock_uom, default_bom
from `tabItem` where name = %s""", item_code, as_dict =1)
ret = {
'description' : item and item[0]['description'],
@@ -42,7 +42,7 @@
def clear_item_table(self):
self.set('pp_details', [])
-
+
def validate_company(self):
if not self.company:
frappe.throw(_("Please enter Company"))
@@ -56,10 +56,10 @@
so_filter += ' and so.transaction_date <= "' + self.to_date + '"'
if self.customer:
so_filter += ' and so.customer = "' + self.customer + '"'
-
+
if self.fg_item:
item_filter += ' and item.name = "' + self.fg_item + '"'
-
+
open_so = frappe.db.sql("""
select distinct so.name, so.transaction_date, so.customer, so.grand_total
from `tabSales Order` so, `tabSales Order Item` so_item
@@ -68,15 +68,15 @@
and so.company = %s
and ifnull(so_item.qty, 0) > ifnull(so_item.delivered_qty, 0) %s
and (exists (select name from `tabItem` item where item.name=so_item.item_code
- and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
+ and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
or ifnull(item.is_sub_contracted_item, 'No') = 'Yes') %s)
or exists (select name from `tabPacked Item` pi
where pi.parent = so.name and pi.parent_item = so_item.item_code
and exists (select name from `tabItem` item where item.name=pi.item_code
- and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
+ and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
or ifnull(item.is_sub_contracted_item, 'No') = 'Yes') %s)))
""" % ('%s', so_filter, item_filter, item_filter), self.company, as_dict=1)
-
+
self.add_so_in_table(open_so)
def add_so_in_table(self, open_so):
@@ -94,7 +94,7 @@
def get_items_from_so(self):
""" Pull items from Sales Order, only proction item
- and subcontracted item will be pulled from Packing item
+ and subcontracted item will be pulled from Packing item
and add items in the table
"""
items = self.get_items()
@@ -105,36 +105,36 @@
if not so_list:
msgprint(_("Please enter sales order in the above table"))
return []
-
+
items = frappe.db.sql("""select distinct parent, item_code, warehouse,
(qty - ifnull(delivered_qty, 0)) as pending_qty
from `tabSales Order Item` so_item
where parent in (%s) and docstatus = 1 and ifnull(qty, 0) > ifnull(delivered_qty, 0)
and exists (select * from `tabItem` item where item.name=so_item.item_code
- and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
+ and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
or ifnull(item.is_sub_contracted_item, 'No') = 'Yes'))""" % \
(", ".join(["%s"] * len(so_list))), tuple(so_list), as_dict=1)
-
+
packed_items = frappe.db.sql("""select distinct pi.parent, pi.item_code, pi.warehouse as reserved_warhouse,
- (((so_item.qty - ifnull(so_item.delivered_qty, 0)) * pi.qty) / so_item.qty)
+ (((so_item.qty - ifnull(so_item.delivered_qty, 0)) * pi.qty) / so_item.qty)
as pending_qty
from `tabSales Order Item` so_item, `tabPacked Item` pi
- where so_item.parent = pi.parent and so_item.docstatus = 1
+ where so_item.parent = pi.parent and so_item.docstatus = 1
and pi.parent_item = so_item.item_code
and so_item.parent in (%s) and ifnull(so_item.qty, 0) > ifnull(so_item.delivered_qty, 0)
and exists (select * from `tabItem` item where item.name=pi.item_code
- and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
+ and (ifnull(item.is_pro_applicable, 'No') = 'Yes'
or ifnull(item.is_sub_contracted_item, 'No') = 'Yes'))""" % \
(", ".join(["%s"] * len(so_list))), tuple(so_list), as_dict=1)
return items + packed_items
-
+
def add_items(self, items):
self.clear_item_table()
for p in items:
- item_details = frappe.db.sql("""select description, stock_uom, default_bom
+ item_details = frappe.db.sql("""select description, stock_uom, default_bom
from tabItem where name=%s""", p['item_code'])
pi = self.append('pp_details', {})
pi.sales_order = p['parent']
@@ -145,27 +145,27 @@
pi.bom_no = item_details and item_details[0][2] or ''
pi.so_pending_qty = flt(p['pending_qty'])
pi.planned_qty = flt(p['pending_qty'])
-
+
def validate_data(self):
self.validate_company()
for d in self.get('pp_details'):
self.validate_bom_no(d)
if not flt(d.planned_qty):
- frappe.throw("Please Enter Planned Qty for item: %s at row no: %s" %
+ frappe.throw("Please Enter Planned Qty for item: %s at row no: %s" %
(d.item_code, d.idx))
-
+
def validate_bom_no(self, d):
if not d.bom_no:
- frappe.throw("Please enter bom no for item: %s at row no: %s" %
+ frappe.throw("Please enter bom no for item: %s at row no: %s" %
(d.item_code, d.idx))
else:
- bom = frappe.db.sql("""select name from `tabBOM` where name = %s and item = %s
- and docstatus = 1 and is_active = 1""",
+ bom = frappe.db.sql("""select name from `tabBOM` where name = %s and item = %s
+ and docstatus = 1 and is_active = 1""",
(d.bom_no, d.item_code), as_dict = 1)
if not bom:
frappe.throw("""Incorrect BOM No: %s entered for item: %s at row no: %s
- May be BOM is inactive or for other item or does not exists in the system""" %
+ May be BOM is inactive or for other item or does not exists in the system""" %
(d.bom_no, d.item_doce, d.idx))
def raise_production_order(self):
@@ -180,9 +180,9 @@
if pro:
pro = ["""<a href="#Form/Production Order/%s" target="_blank">%s</a>""" % \
(p, p) for p in pro]
- msgprint(_("Production Order(s) created:\n\n") + '\n'.join(pro))
+ msgprint(_("{0} created").format(comma_and(pro)))
else :
- msgprint(_("No Production Order created."))
+ msgprint(_("No Production Orders created"))
def get_distinct_items_and_boms(self):
""" Club similar BOM and item for processing
@@ -191,7 +191,7 @@
}
"""
item_dict, bom_dict = {}, {}
- for d in self.get("pp_details"):
+ for d in self.get("pp_details"):
bom_dict.setdefault(d.bom_no, []).append([d.sales_order, flt(d.planned_qty)])
item_dict[(d.item_code, d.sales_order, d.warehouse)] = {
"production_item" : d.item_code,
@@ -207,7 +207,7 @@
"status" : "Draft",
}
return bom_dict, item_dict
-
+
def create_production_order(self, items):
"""Create production order. Called from Production Planning Tool"""
from erpnext.manufacturing.doctype.production_order.production_order import OverProductionError
@@ -216,16 +216,16 @@
for key in items:
pro = frappe.new_doc("Production Order")
pro.update(items[key])
-
+
frappe.flags.mute_messages = True
try:
pro.insert()
pro_list.append(pro.name)
- except OverProductionError, e:
+ except OverProductionError:
pass
-
+
frappe.flags.mute_messages = False
-
+
return pro_list
def download_raw_materials(self):
@@ -236,41 +236,41 @@
return self.get_csv()
def get_raw_materials(self, bom_dict):
- """ Get raw materials considering sub-assembly items
+ """ Get raw materials considering sub-assembly items
{
"item_code": [qty_required, description, stock_uom, min_order_qty]
}
"""
item_list = []
-
+
for bom, so_wise_qty in bom_dict.items():
bom_wise_item_details = {}
if self.use_multi_level_bom:
- # get all raw materials with sub assembly childs
- for d in frappe.db.sql("""select fb.item_code,
- ifnull(sum(fb.qty_consumed_per_unit), 0) as qty,
- fb.description, fb.stock_uom, it.min_order_qty
- from `tabBOM Explosion Item` fb,`tabItem` it
- where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
- and ifnull(it.is_sub_contracted_item, 'No') = 'No'
- and fb.docstatus<2 and fb.parent=%s
+ # get all raw materials with sub assembly childs
+ for d in frappe.db.sql("""select fb.item_code,
+ ifnull(sum(fb.qty_consumed_per_unit), 0) as qty,
+ fb.description, fb.stock_uom, it.min_order_qty
+ from `tabBOM Explosion Item` fb,`tabItem` it
+ where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No'
+ and ifnull(it.is_sub_contracted_item, 'No') = 'No'
+ and fb.docstatus<2 and fb.parent=%s
group by item_code, stock_uom""", bom, as_dict=1):
bom_wise_item_details.setdefault(d.item_code, d)
else:
- # Get all raw materials considering SA items as raw materials,
+ # Get all raw materials considering SA items as raw materials,
# so no childs of SA items
- for d in frappe.db.sql("""select bom_item.item_code,
- ifnull(sum(bom_item.qty_consumed_per_unit), 0) as qty,
- bom_item.description, bom_item.stock_uom, item.min_order_qty
- from `tabBOM Item` bom_item, tabItem item
- where bom_item.parent = %s and bom_item.docstatus < 2
- and bom_item.item_code = item.name
+ for d in frappe.db.sql("""select bom_item.item_code,
+ ifnull(sum(bom_item.qty_consumed_per_unit), 0) as qty,
+ bom_item.description, bom_item.stock_uom, item.min_order_qty
+ from `tabBOM Item` bom_item, tabItem item
+ where bom_item.parent = %s and bom_item.docstatus < 2
+ and bom_item.item_code = item.name
group by item_code""", bom, as_dict=1):
bom_wise_item_details.setdefault(d.item_code, d)
for item, item_details in bom_wise_item_details.items():
for so_qty in so_wise_qty:
- item_list.append([item, flt(item_details.qty) * so_qty[1], item_details.description,
+ item_list.append([item, flt(item_details.qty) * so_qty[1], item_details.description,
item_details.stock_uom, item_details.min_order_qty, so_qty[0]])
self.make_items_dict(item_list)
@@ -286,18 +286,18 @@
total_qty = sum([flt(d[0]) for d in self.item_dict[item]])
for item_details in self.item_dict[item]:
item_list.append([item, item_details[1], item_details[2], item_details[0]])
- item_qty = frappe.db.sql("""select warehouse, indented_qty, ordered_qty, actual_qty
+ item_qty = frappe.db.sql("""select warehouse, indented_qty, ordered_qty, actual_qty
from `tabBin` where item_code = %s""", item, as_dict=1)
i_qty, o_qty, a_qty = 0, 0, 0
for w in item_qty:
i_qty, o_qty, a_qty = i_qty + flt(w.indented_qty), o_qty + flt(w.ordered_qty), a_qty + flt(w.actual_qty)
- item_list.append(['', '', '', '', w.warehouse, flt(w.indented_qty),
+ item_list.append(['', '', '', '', w.warehouse, flt(w.indented_qty),
flt(w.ordered_qty), flt(w.actual_qty)])
if item_qty:
item_list.append(['', '', '', '', 'Total', i_qty, o_qty, a_qty])
return item_list
-
+
def raise_purchase_request(self):
"""
Raise Material Request if projected qty is less than qty required
@@ -306,10 +306,10 @@
self.validate_data()
if not self.purchase_request_for_warehouse:
frappe.throw(_("Please enter Warehouse for which Material Request will be raised"))
-
- bom_dict = self.get_distinct_items_and_boms()[0]
+
+ bom_dict = self.get_distinct_items_and_boms()[0]
self.get_raw_materials(bom_dict)
-
+
if self.item_dict:
self.insert_purchase_request()
@@ -348,15 +348,15 @@
items_to_be_requested[item]["No Sales Order"] += requested_qty
return items_to_be_requested
-
+
def get_projected_qty(self):
items = self.item_dict.keys()
- item_projected_qty = frappe.db.sql("""select item_code, sum(projected_qty)
- from `tabBin` where item_code in (%s) group by item_code""" %
+ item_projected_qty = frappe.db.sql("""select item_code, sum(projected_qty)
+ from `tabBin` where item_code in (%s) group by item_code""" %
(", ".join(["%s"]*len(items)),), tuple(items))
return dict(item_projected_qty)
-
+
def insert_purchase_request(self):
items_to_be_requested = self.get_requested_items()
@@ -397,11 +397,10 @@
pr_doc.ignore_permissions = 1
pr_doc.submit()
purchase_request_list.append(pr_doc.name)
-
+
if purchase_request_list:
pur_req = ["""<a href="#Form/Material Request/%s" target="_blank">%s</a>""" % \
(p, p) for p in purchase_request_list]
- msgprint("Material Request(s) created: \n%s" %
- "\n".join(pur_req))
+ msgprint(_("Material Requests {0} created").format(comma_and(pur_req)))
else:
msgprint(_("Nothing to request"))
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 2225acd..bce9c52 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -5,13 +5,13 @@
import frappe
from frappe.utils import flt, getdate
-from frappe import msgprint
+from frappe import _
from erpnext.utilities.transaction_base import delete_events
from frappe.model.document import Document
class Project(Document):
-
+
def get_gross_profit(self):
pft, per_pft =0, 0
pft = flt(self.project_value) - flt(self.est_material_cost)
@@ -19,19 +19,18 @@
per_pft = (flt(pft) / flt(self.project_value)) * 100
ret = {'gross_margin_value': pft, 'per_gross_margin': per_pft}
return ret
-
+
def validate(self):
"""validate start date before end date"""
if self.project_start_date and self.completion_date:
if getdate(self.completion_date) < getdate(self.project_start_date):
- msgprint("Expected Completion Date can not be less than Project Start Date")
- raise Exception
-
+ frappe.throw(_("Expected Completion Date can not be less than Project Start Date"))
+
def on_update(self):
self.add_calendar_event()
-
+
def update_percent_complete(self):
- total = frappe.db.sql("""select count(*) from tabTask where project=%s""",
+ total = frappe.db.sql("""select count(*) from tabTask where project=%s""",
self.name)[0][0]
if total:
completed = frappe.db.sql("""select count(*) from tabTask where
@@ -42,7 +41,7 @@
def add_calendar_event(self):
# delete any earlier event for this project
delete_events(self.doctype, self.name)
-
+
# add events
for milestone in self.get("project_milestones"):
if milestone.milestone_date:
@@ -57,6 +56,6 @@
"ref_type": self.doctype,
"ref_name": self.name
}).insert()
-
+
def on_trash(self):
delete_events(self.doctype, self.name)
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index a4dfb47..7fbaa45 100644
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -5,7 +5,7 @@
import frappe, json
from frappe.utils import getdate, today
-from frappe import msgprint
+from frappe import _
from frappe.model.document import Document
@@ -15,32 +15,30 @@
return {
"project": self.project
}
-
+
def get_customer_details(self):
cust = frappe.db.sql("select customer_name from `tabCustomer` where name=%s", self.customer)
if cust:
ret = {'customer_name': cust and cust[0][0] or ''}
return ret
-
+
def validate(self):
if self.exp_start_date and self.exp_end_date and getdate(self.exp_start_date) > getdate(self.exp_end_date):
- msgprint("'Expected Start Date' can not be greater than 'Expected End Date'")
- raise Exception
-
+ frappe.throw(_("'Expected Start Date' can not be greater than 'Expected End Date'"))
+
if self.act_start_date and self.act_end_date and getdate(self.act_start_date) > getdate(self.act_end_date):
- msgprint("'Actual Start Date' can not be greater than 'Actual End Date'")
- raise Exception
-
+ frappe.throw(_("'Actual Start Date' can not be greater than 'Actual End Date'"))
+
self.update_status()
def update_status(self):
status = frappe.db.get_value("Task", self.name, "status")
if self.status=="Working" and status !="Working" and not self.act_start_date:
self.act_start_date = today()
-
+
if self.status=="Closed" and status != "Closed" and not self.act_end_date:
self.act_end_date = today()
-
+
def on_update(self):
"""update percent complete in project"""
if self.project:
@@ -55,14 +53,14 @@
conditions = build_match_conditions("Task")
conditions and (" and " + conditions) or ""
-
+
if filters:
filters = json.loads(filters)
for key in filters:
if filters[key]:
conditions += " and " + key + ' = "' + filters[key].replace('"', '\"') + '"'
-
- data = frappe.db.sql("""select name, exp_start_date, exp_end_date,
+
+ data = frappe.db.sql("""select name, exp_start_date, exp_end_date,
subject, status, project from `tabTask`
where ((exp_start_date between '%(start)s' and '%(end)s') \
or (exp_end_date between '%(start)s' and '%(end)s'))
@@ -79,7 +77,7 @@
return frappe.db.sql(""" select name from `tabProject`
where %(key)s like "%(txt)s"
%(mcond)s
- order by name
- limit %(start)s, %(page_len)s """ % {'key': searchfield,
+ order by name
+ limit %(start)s, %(page_len)s """ % {'key': searchfield,
'txt': "%%%s%%" % txt, 'mcond':get_match_cond(doctype),
- 'start': start, 'page_len': page_len})
\ No newline at end of file
+ 'start': start, 'page_len': page_len})
diff --git a/erpnext/projects/doctype/time_log/time_log.py b/erpnext/projects/doctype/time_log/time_log.py
index f184db3..eb8afc7 100644
--- a/erpnext/projects/doctype/time_log/time_log.py
+++ b/erpnext/projects/doctype/time_log/time_log.py
@@ -6,7 +6,7 @@
from __future__ import unicode_literals
import frappe
from frappe import _
-from frappe.utils import cstr
+from frappe.utils import cstr, comma_and
class OverlapError(frappe.ValidationError): pass
@@ -14,12 +14,12 @@
from frappe.model.document import Document
class TimeLog(Document):
-
+
def validate(self):
self.set_status()
self.validate_overlap()
self.calculate_total_hours()
-
+
def calculate_total_hours(self):
from frappe.utils import time_diff_in_hours
self.hours = time_diff_in_hours(self.to_time, self.from_time)
@@ -30,36 +30,35 @@
1: "Submitted",
2: "Cancelled"
}[self.docstatus or 0]
-
+
if self.time_log_batch:
self.status="Batched for Billing"
-
+
if self.sales_invoice:
self.status="Billed"
-
- def validate_overlap(self):
+
+ def validate_overlap(self):
existing = frappe.db.sql_list("""select name from `tabTime Log` where owner=%s and
(
- (from_time between %s and %s) or
- (to_time between %s and %s) or
- (%s between from_time and to_time))
+ (from_time between %s and %s) or
+ (to_time between %s and %s) or
+ (%s between from_time and to_time))
and name!=%s
and ifnull(task, "")=%s
- and docstatus < 2""",
- (self.owner, self.from_time, self.to_time, self.from_time,
+ and docstatus < 2""",
+ (self.owner, self.from_time, self.to_time, self.from_time,
self.to_time, self.from_time, self.name or "No Name",
cstr(self.task)))
if existing:
- frappe.msgprint(_("This Time Log conflicts with") + ":" + ', '.join(existing),
- raise_exception=OverlapError)
-
+ frappe.throw(_("This Time Log conflicts with {0}").format(comma_and(existing)), OverlapError)
+
def before_cancel(self):
self.set_status()
-
+
def before_update_after_submit(self):
self.set_status()
-
+
@frappe.whitelist()
def get_events(start, end):
from frappe.widgets.reportview import build_match_conditions
@@ -67,7 +66,7 @@
frappe.msgprint(_("No Permission"), raise_exception=1)
match = build_match_conditions("Time Log")
- data = frappe.db.sql("""select name, from_time, to_time,
+ data = frappe.db.sql("""select name, from_time, to_time,
activity_type, task, project from `tabTime Log`
where from_time between '%(start)s' and '%(end)s' or to_time between '%(start)s' and '%(end)s'
%(match)s""" % {
@@ -75,12 +74,12 @@
"end": end,
"match": match and (" and " + match) or ""
}, as_dict=True, update={"allDay": 0})
-
+
for d in data:
d.title = d.name + ": " + (d.activity_type or "[Activity Type not set]")
if d.task:
d.title += " for Task: " + d.task
if d.project:
d.title += " for Project: " + d.project
-
+
return data
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch.py b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
index b8204e4..882ed99 100644
--- a/erpnext/projects/doctype/time_log_batch/time_log_batch.py
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch.py
@@ -29,8 +29,7 @@
def validate_time_log_is_submitted(self, tl):
if tl.status != "Submitted" and self.docstatus == 0:
- frappe.msgprint(_("Time Log must have status 'Submitted'") + \
- " :" + tl.name + " (" + _(tl.status) + ")", raise_exception=True)
+ frappe.throw(_("Time Log {0} must be 'Submitted'").format(tl.name))
def set_status(self):
self.status = {
diff --git a/erpnext/selling/doctype/installation_note/installation_note.py b/erpnext/selling/doctype/installation_note/installation_note.py
index 1fa91cc..7d2d3d0 100644
--- a/erpnext/selling/doctype/installation_note/installation_note.py
+++ b/erpnext/selling/doctype/installation_note/installation_note.py
@@ -6,7 +6,7 @@
from frappe.utils import cstr, getdate
-from frappe import msgprint
+from frappe import _
from erpnext.stock.utils import get_valid_serial_nos
from erpnext.utilities.transaction_base import TransactionBase
@@ -46,15 +46,14 @@
def is_serial_no_added(self, item_code, serial_no):
ar_required = frappe.db.get_value("Item", item_code, "has_serial_no")
if ar_required == 'Yes' and not serial_no:
- msgprint("Serial No is mandatory for item: " + item_code, raise_exception=1)
+ frappe.throw(_("Serial No is mandatory for Item {0}").format(item_code))
elif ar_required != 'Yes' and cstr(serial_no).strip():
- msgprint("If serial no required, please select 'Yes' in 'Has Serial No' in Item :" +
- item_code, raise_exception=1)
+ frappe.throw(_("Item {0} is not a serialized Item").format(item_code))
def is_serial_no_exist(self, item_code, serial_no):
for x in serial_no:
if not frappe.db.exists("Serial No", x):
- msgprint("Serial No " + x + " does not exist in the system", raise_exception=1)
+ frappe.throw(_("Serial No {0} does not exist").format(x))
def is_serial_no_installed(self,cur_s_no,item_code):
for x in cur_s_no:
@@ -62,8 +61,7 @@
status = status and status[0][0] or ''
if status == 'Installed':
- msgprint("Item "+item_code+" with serial no. " + x + " already installed",
- raise_exception=1)
+ frappe.throw(_("Item {0} with Serial No {1} is already installed").format(item_code, x))
def get_prevdoc_serial_no(self, prevdoc_detail_docname):
serial_nos = frappe.db.get_value("Delivery Note Item",
@@ -73,8 +71,7 @@
def is_serial_no_match(self, cur_s_no, prevdoc_s_no, prevdoc_docname):
for sr in cur_s_no:
if sr not in prevdoc_s_no:
- msgprint("Serial No. " + sr + " is not matching with the Delivery Note " +
- prevdoc_docname, raise_exception = 1)
+ frappe.throw(_("Serial No {0} does not belong to Delivery Note {1}").format(sr, prevdoc_docname))
def validate_serial_no(self):
cur_s_no, prevdoc_s_no, sr_list = [], [], []
@@ -95,12 +92,11 @@
if d.prevdoc_docname:
d_date = frappe.db.get_value("Delivery Note", d.prevdoc_docname, "posting_date")
if d_date > getdate(self.inst_date):
- msgprint("Installation Date can not be before Delivery Date " + cstr(d_date) +
- " for item "+d.item_code, raise_exception=1)
+ frappe.throw(_("Installation date cannot be before delivery date for Item {0}").format(d.item_code))
def check_item_table(self):
if not(self.get('installed_item_details')):
- msgprint("Please fetch items from Delivery Note selected", raise_exception=1)
+ frappe.throw(_("Please pull items from Delivery Note"))
def on_update(self):
frappe.db.set(self, 'status', 'Draft')
diff --git a/erpnext/selling/doctype/lead/lead.py b/erpnext/selling/doctype/lead/lead.py
index 8163be3..c400e55 100644
--- a/erpnext/selling/doctype/lead/lead.py
+++ b/erpnext/selling/doctype/lead/lead.py
@@ -4,10 +4,10 @@
from __future__ import unicode_literals
import frappe
from frappe import _
-from frappe.utils import cstr, validate_email_add, cint
+from frappe.utils import cstr, validate_email_add, cint, comma_and
from frappe import session
-
+
from erpnext.controllers.selling_controller import SellingController
class Lead(SellingController):
@@ -15,7 +15,7 @@
customer = frappe.db.get_value("Customer", {"lead_name": self.name})
if customer:
self.set("__is_customer", customer)
-
+
def validate(self):
self._prev = frappe._dict({
"contact_date": frappe.db.get_value("Lead", self.name, "contact_date") if \
@@ -23,20 +23,20 @@
"contact_by": frappe.db.get_value("Lead", self.name, "contact_by") if \
(not cint(self.get("__islocal"))) else None,
})
-
+
self.set_status()
-
+
if self.source == 'Campaign' and not self.campaign_name and session['user'] != 'Guest':
frappe.throw("Please specify campaign name")
-
+
if self.email_id:
if not validate_email_add(self.email_id):
frappe.throw('Please enter valid email id.')
-
+
def on_update(self):
self.check_email_id_is_unique()
self.add_calendar_event()
-
+
def add_calendar_event(self, opts=None, force=False):
super(Lead, self).add_calendar_event({
"owner": self.lead_owner,
@@ -48,22 +48,21 @@
def check_email_id_is_unique(self):
if self.email_id:
# validate email is unique
- email_list = frappe.db.sql("""select name from tabLead where email_id=%s""",
+ email_list = frappe.db.sql("""select name from tabLead where email_id=%s""",
self.email_id)
if len(email_list) > 1:
items = [e[0] for e in email_list if e[0]!=self.name]
- frappe.msgprint(_("""Email Id must be unique, already exists for: """) + \
- ", ".join(items), raise_exception=True)
+ frappe.throw(_("Email id must be unique, already exists for {0}").format(comma_and(items)))
def on_trash(self):
frappe.db.sql("""update `tabSupport Ticket` set lead='' where lead=%s""",
self.name)
-
+
self.delete_events()
-
+
def has_customer(self):
return frappe.db.get_value("Customer", {"lead_name": self.name})
-
+
def has_opportunity(self):
return frappe.db.get_value("Opportunity", {"lead": self.name, "docstatus": 1,
"status": ["!=", "Lost"]})
@@ -74,7 +73,7 @@
def _make_customer(source_name, target_doc=None, ignore_permissions=False):
from frappe.model.mapper import get_mapped_doc
-
+
def set_missing_values(source, target):
if source.company_name:
target.customer_type = "Company"
@@ -82,10 +81,10 @@
else:
target.customer_type = "Individual"
target.customer_name = source.lead_name
-
+
target.customer_group = frappe.db.get_default("customer_group")
-
- doclist = get_mapped_doc("Lead", source_name,
+
+ doclist = get_mapped_doc("Lead", source_name,
{"Lead": {
"doctype": "Customer",
"field_map": {
@@ -95,14 +94,14 @@
"fax": "fax_1"
}
}}, target_doc, set_missing_values, ignore_permissions=ignore_permissions)
-
+
return doclist
-
+
@frappe.whitelist()
def make_opportunity(source_name, target_doc=None):
from frappe.model.mapper import get_mapped_doc
-
- doclist = get_mapped_doc("Lead", source_name,
+
+ doclist = get_mapped_doc("Lead", source_name,
{"Lead": {
"doctype": "Opportunity",
"field_map": {
@@ -115,19 +114,19 @@
"mobile_no": "contact_mobile"
}
}}, target_doc)
-
+
return doclist
-
+
@frappe.whitelist()
def get_lead_details(lead):
if not lead: return {}
-
+
from erpnext.accounts.party import set_address_details
out = frappe._dict()
-
+
lead_doc = frappe.get_doc("Lead", lead)
lead = lead_doc
-
+
out.update({
"territory": lead.territory,
"customer_name": lead.company_name or lead.lead_name,
@@ -136,7 +135,7 @@
"contact_mobile": lead.mobile_no,
"contact_phone": lead.phone,
})
-
+
set_address_details(out, lead, "Lead")
- return out
\ No newline at end of file
+ return out
diff --git a/erpnext/selling/doctype/opportunity/opportunity.py b/erpnext/selling/doctype/opportunity/opportunity.py
index c87c983..9ba6e56 100644
--- a/erpnext/selling/doctype/opportunity/opportunity.py
+++ b/erpnext/selling/doctype/opportunity/opportunity.py
@@ -8,13 +8,13 @@
from frappe import msgprint, _
-
+
from erpnext.utilities.transaction_base import TransactionBase
class Opportunity(TransactionBase):
fname = 'enq_details'
tname = 'Opportunity Item'
-
+
def get_item_details(self, item_code):
item = frappe.db.sql("""select item_name, stock_uom, description_html, description, item_group, brand
from `tabItem` where name = %s""", item_code, as_dict=1)
@@ -28,7 +28,7 @@
return ret
def get_cust_address(self,name):
- details = frappe.db.sql("""select customer_name, address, territory, customer_group
+ details = frappe.db.sql("""select customer_name, address, territory, customer_group
from `tabCustomer` where name = %s and docstatus != 2""", (name), as_dict = 1)
if details:
ret = {
@@ -39,28 +39,28 @@
}
# ********** get primary contact details (this is done separately coz. , in case there is no primary contact thn it would not be able to fetch customer details in case of join query)
- contact_det = frappe.db.sql("""select contact_name, contact_no, email_id
- from `tabContact` where customer = %s and is_customer = 1
+ contact_det = frappe.db.sql("""select contact_name, contact_no, email_id
+ from `tabContact` where customer = %s and is_customer = 1
and is_primary_contact = 'Yes' and docstatus != 2""", name, as_dict = 1)
ret['contact_person'] = contact_det and contact_det[0]['contact_name'] or ''
ret['contact_no'] = contact_det and contact_det[0]['contact_no'] or ''
ret['email_id'] = contact_det and contact_det[0]['email_id'] or ''
-
+
return ret
else:
msgprint("Customer : %s does not exist in system." % (name))
raise Exception
-
+
def on_update(self):
self.add_calendar_event()
def add_calendar_event(self, opts=None, force=False):
if not opts:
opts = frappe._dict()
-
+
opts.description = ""
-
+
if self.customer:
if self.contact_person:
opts.description = 'Contact '+cstr(self.contact_person)
@@ -71,23 +71,22 @@
opts.description = 'Contact '+cstr(self.contact_display)
else:
opts.description = 'Contact lead '+cstr(self.lead)
-
+
opts.subject = opts.description
opts.description += '. By : ' + cstr(self.contact_by)
-
+
if self.to_discuss:
opts.description += ' To Discuss : ' + cstr(self.to_discuss)
-
+
super(Opportunity, self).add_calendar_event(opts, force)
def validate_item_details(self):
if not self.get('enquiry_details'):
- msgprint("Please select items for which enquiry needs to be made")
- raise Exception
+ frappe.throw(_("Items required"))
def validate_lead_cust(self):
if self.enquiry_from == 'Lead' and not self.lead:
- msgprint("Lead Id is mandatory if 'Opportunity From' is selected as Lead", raise_exception=1)
+ frappe.throw(_("Lead must be set if Opportunity is made from Lead"))
elif self.enquiry_from == 'Customer' and not self.customer:
msgprint("Customer is mandatory if 'Opportunity From' is selected as Customer", raise_exception=1)
@@ -98,24 +97,24 @@
"contact_by": frappe.db.get_value("Opportunity", self.name, "contact_by") if \
(not cint(self.get("__islocal"))) else None,
})
-
+
self.set_status()
self.validate_item_details()
self.validate_uom_is_integer("uom", "qty")
self.validate_lead_cust()
-
+
from erpnext.accounts.utils import validate_fiscal_year
validate_fiscal_year(self.transaction_date, self.fiscal_year, "Opportunity Date")
def on_submit(self):
if self.lead:
frappe.get_doc("Lead", self.lead).set_status(update=True)
-
+
def on_cancel(self):
if self.has_quotation():
frappe.throw(_("Cannot Cancel Opportunity as Quotation Exists"))
self.set_status(update=True)
-
+
def declare_enquiry_lost(self,arg):
if not self.has_quotation():
frappe.db.set(self, 'status', 'Lost')
@@ -125,40 +124,40 @@
def on_trash(self):
self.delete_events()
-
+
def has_quotation(self):
return frappe.db.get_value("Quotation Item", {"prevdoc_docname": self.name, "docstatus": 1})
-
+
@frappe.whitelist()
def make_quotation(source_name, target_doc=None):
from frappe.model.mapper import get_mapped_doc
-
+
def set_missing_values(source, target):
quotation = frappe.get_doc(target)
quotation.run_method("onload_post_render")
quotation.run_method("calculate_taxes_and_totals")
-
+
doclist = get_mapped_doc("Opportunity", source_name, {
"Opportunity": {
- "doctype": "Quotation",
+ "doctype": "Quotation",
"field_map": {
- "enquiry_from": "quotation_to",
- "enquiry_type": "order_type",
- "name": "enq_no",
+ "enquiry_from": "quotation_to",
+ "enquiry_type": "order_type",
+ "name": "enq_no",
},
"validation": {
"docstatus": ["=", 1]
}
- },
+ },
"Opportunity Item": {
- "doctype": "Quotation Item",
+ "doctype": "Quotation Item",
"field_map": {
- "parent": "prevdoc_docname",
- "parenttype": "prevdoc_doctype",
+ "parent": "prevdoc_docname",
+ "parenttype": "prevdoc_doctype",
"uom": "stock_uom"
},
"add_if_empty": True
}
}, target_doc, set_missing_values)
-
- return doclist
\ No newline at end of file
+
+ return doclist
diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py
index d6ade9e..d7f58a7 100644
--- a/erpnext/selling/doctype/quotation/quotation.py
+++ b/erpnext/selling/doctype/quotation/quotation.py
@@ -5,7 +5,7 @@
import frappe
from frappe.utils import cstr
-from frappe import _, msgprint
+from frappe import _
from erpnext.controllers.selling_controller import SellingController
@@ -20,31 +20,28 @@
chk_dupl_itm = []
for d in self.get('quotation_details'):
if [cstr(d.item_code),cstr(d.description)] in chk_dupl_itm:
- msgprint("Item %s has been entered twice. Please change description atleast to continue" % d.item_code)
- raise Exception
+ frappe.throw(_("Item {0} with same description entered twice").format(d.item_code))
else:
chk_dupl_itm.append([cstr(d.item_code),cstr(d.description)])
def validate_order_type(self):
super(Quotation, self).validate_order_type()
-
+
if self.order_type in ['Maintenance', 'Service']:
for d in self.get('quotation_details'):
is_service_item = frappe.db.sql("select is_service_item from `tabItem` where name=%s", d.item_code)
is_service_item = is_service_item and is_service_item[0][0] or 'No'
-
+
if is_service_item == 'No':
- msgprint("You can not select non service item "+d.item_code+" in Maintenance Quotation")
- raise Exception
+ frappe.throw(_("Item {0} must be Service Item").format(d.item_code))
else:
for d in self.get('quotation_details'):
is_sales_item = frappe.db.sql("select is_sales_item from `tabItem` where name=%s", d.item_code)
is_sales_item = is_sales_item and is_sales_item[0][0] or 'No'
-
+
if is_sales_item == 'No':
- msgprint("You can not select non sales item "+d.item_code+" in Sales Quotation")
- raise Exception
-
+ frappe.throw(_("Item {0} must be Sales Item").format(d.item_code))
+
def validate(self):
super(Quotation, self).validate()
self.set_status()
@@ -56,7 +53,7 @@
for opportunity in list(set([d.prevdoc_docname for d in self.get("quotation_details")])):
if opportunity:
frappe.get_doc("Opportunity", opportunity).set_status(update=True)
-
+
def declare_order_lost(self, arg):
if not self.has_sales_order():
frappe.db.set(self, 'status', 'Lost')
@@ -64,26 +61,25 @@
self.update_opportunity()
else:
frappe.throw(_("Cannot set as Lost as Sales Order is made."))
-
+
def check_item_table(self):
if not self.get('quotation_details'):
- msgprint("Please enter item details")
- raise Exception
-
+ frappe.throw(_("Please enter item details"))
+
def on_submit(self):
self.check_item_table()
-
+
# Check for Approving Authority
frappe.get_doc('Authorization Control').validate_approving_authority(self.doctype, self.company, self.grand_total, self)
-
+
#update enquiry status
self.update_opportunity()
-
+
def on_cancel(self):
#update enquiry status
self.set_status()
self.update_opportunity()
-
+
def print_other_charges(self,docname):
print_lst = []
for d in self.get('other_charges'):
@@ -92,51 +88,51 @@
lst1.append(d.total)
print_lst.append(lst1)
return print_lst
-
-
+
+
@frappe.whitelist()
def make_sales_order(source_name, target_doc=None):
return _make_sales_order(source_name, target_doc)
-
+
def _make_sales_order(source_name, target_doc=None, ignore_permissions=False):
from frappe.model.mapper import get_mapped_doc
-
+
customer = _make_customer(source_name, ignore_permissions)
-
+
def set_missing_values(source, target):
if customer:
target.customer = customer.name
target.customer_name = customer.customer_name
-
+
si = frappe.get_doc(target)
si.ignore_permissions = ignore_permissions
si.run_method("onload_post_render")
-
+
doclist = get_mapped_doc("Quotation", source_name, {
"Quotation": {
- "doctype": "Sales Order",
+ "doctype": "Sales Order",
"validation": {
"docstatus": ["=", 1]
}
- },
+ },
"Quotation Item": {
- "doctype": "Sales Order Item",
+ "doctype": "Sales Order Item",
"field_map": {
"parent": "prevdoc_docname"
}
- },
+ },
"Sales Taxes and Charges": {
"doctype": "Sales Taxes and Charges",
"add_if_empty": True
- },
+ },
"Sales Team": {
"doctype": "Sales Team",
"add_if_empty": True
}
}, target_doc, set_missing_values, ignore_permissions=ignore_permissions)
-
+
# postprocess: fetch shipping address, set missing values
-
+
return doclist
def _make_customer(source_name, ignore_permissions=False):
@@ -152,7 +148,7 @@
if quotation[1] == "Shopping Cart":
customer.customer_group = frappe.db.get_value("Shopping Cart Settings", None,
"default_customer_group")
-
+
try:
customer.insert()
return customer
diff --git a/erpnext/selling/doctype/sales_bom/sales_bom.py b/erpnext/selling/doctype/sales_bom/sales_bom.py
index 5601d7f..724e009 100644
--- a/erpnext/selling/doctype/sales_bom/sales_bom.py
+++ b/erpnext/selling/doctype/sales_bom/sales_bom.py
@@ -4,6 +4,8 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
+
from frappe.model.document import Document
class SalesBOM(Document):
@@ -11,7 +13,7 @@
def autoname(self):
self.name = self.new_item_code
-
+
def validate(self):
self.validate_main_item()
@@ -22,23 +24,22 @@
"""main item must have Is Stock Item as No and Is Sales Item as Yes"""
if not frappe.db.sql("""select name from tabItem where name=%s and
ifnull(is_stock_item,'')='No' and ifnull(is_sales_item,'')='Yes'""", self.new_item_code):
- frappe.msgprint("""Parent Item %s is either a Stock Item or a not a Sales Item""",
- raise_exception=1)
+ frappe.throw(_("Parent Item {0} must be not Stock Item and must be a Sales Item").format(self.new_item_code))
def get_item_details(self, name):
- det = frappe.db.sql("""select description, stock_uom from `tabItem`
+ det = frappe.db.sql("""select description, stock_uom from `tabItem`
where name = %s""", name)
return {
- 'description' : det and det[0][0] or '',
+ 'description' : det and det[0][0] or '',
'uom': det and det[0][1] or ''
}
def get_new_item_code(doctype, txt, searchfield, start, page_len, filters):
from erpnext.controllers.queries import get_match_cond
-
- return frappe.db.sql("""select name, item_name, description from tabItem
+
+ return frappe.db.sql("""select name, item_name, description from tabItem
where is_stock_item="No" and is_sales_item="Yes"
and name not in (select name from `tabSales BOM`) and %s like %s
- %s limit %s, %s""" % (searchfield, "%s",
- get_match_cond(doctype),"%s", "%s"),
- ("%%%s%%" % txt, start, page_len))
\ No newline at end of file
+ %s limit %s, %s""" % (searchfield, "%s",
+ get_match_cond(doctype),"%s", "%s"),
+ ("%%%s%%" % txt, start, page_len))
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index 103144f..d4054dd 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -5,9 +5,9 @@
import frappe
import frappe.utils
-from frappe.utils import cstr, flt, getdate
+from frappe.utils import cstr, flt, getdate, comma_and
-from frappe import msgprint
+from frappe import _
from frappe.model.mapper import get_mapped_doc
from erpnext.controllers.selling_controller import SellingController
@@ -23,22 +23,19 @@
# validate transaction date v/s delivery date
if self.delivery_date:
if getdate(self.transaction_date) > getdate(self.delivery_date):
- msgprint("Expected Delivery Date cannot be before Sales Order Date")
- raise Exception
+ frappe.throw(_("Expected Delivery Date cannot be before Sales Order Date"))
def validate_po(self):
# validate p.o date v/s delivery date
if self.po_date and self.delivery_date and getdate(self.po_date) > getdate(self.delivery_date):
- msgprint("Expected Delivery Date cannot be before Purchase Order Date")
- raise Exception
+ frappe.throw(_("Expected Delivery Date cannot be before Purchase Order Date"))
if self.po_no and self.customer:
so = frappe.db.sql("select name from `tabSales Order` \
where ifnull(po_no, '') = %s and name != %s and docstatus < 2\
and customer = %s", (self.po_no, self.name, self.customer))
if so and so[0][0]:
- msgprint("""Another Sales Order (%s) exists against same PO No and Customer.
- Please be sure, you are not making duplicate entry.""" % so[0][0])
+ frappe.msgprint(_("Warning: Sales Order {0} already exists against same Purchase Order number").format(so[0][0]))
def validate_for_items(self):
check_list, flag = [], 0
@@ -49,16 +46,15 @@
if frappe.db.get_value("Item", d.item_code, "is_stock_item") == 'Yes':
if not d.warehouse:
- msgprint("""Please enter Reserved Warehouse for item %s
- as it is stock Item""" % d.item_code, raise_exception=1)
+ frappe.throw(_("Reserved warehouse required for stock item {0}").format(d.item_code))
if e in check_list:
- msgprint("Item %s has been entered twice." % d.item_code)
+ frappe.throw(_("Item {0} has been entered twice").format(d.item_code))
else:
check_list.append(e)
else:
if f in chk_dupl_itm:
- msgprint("Item %s has been entered twice." % d.item_code)
+ frappe.throw(_("Item {0} has been entered twice").format(d.item_code))
else:
chk_dupl_itm.append(f)
@@ -74,16 +70,14 @@
if d.prevdoc_docname:
res = frappe.db.sql("select name from `tabQuotation` where name=%s and order_type = %s", (d.prevdoc_docname, self.order_type))
if not res:
- msgprint("""Order Type (%s) should be same in Quotation: %s \
- and current Sales Order""" % (self.order_type, d.prevdoc_docname))
+ frappe.msgprint(_("Quotation {0} not of type {1}").format(d.prevdoc_docname, self.order_type))
def validate_order_type(self):
super(SalesOrder, self).validate_order_type()
def validate_delivery_date(self):
if self.order_type == 'Sales' and not self.delivery_date:
- msgprint("Please enter 'Expected Delivery Date'")
- raise Exception
+ frappe.throw(_("Please enter 'Expected Delivery Date'"))
self.validate_sales_mntc_quotation()
@@ -93,8 +87,7 @@
and (customer = %s or ifnull(customer,'')='')""",
(self.project_name, self.customer))
if not res:
- msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.customer,self.project_name,self.project_name))
- raise Exception
+ frappe.throw(_("Customer {0} does not belong to project {1}").format(self.customer, self.project_name))
def validate(self):
super(SalesOrder, self).validate()
@@ -169,8 +162,8 @@
def on_cancel(self):
# Cannot cancel stopped SO
if self.status == 'Stopped':
- msgprint("Sales Order : '%s' cannot be cancelled as it is Stopped. Unstop it for any further transactions" %(self.name))
- raise Exception
+ frappe.throw(_("Stopped order cannot be cancelled. Unstop to cancel."))
+
self.check_nextdoc_docstatus()
self.update_stock_ledger(update_stock = -1)
@@ -180,55 +173,56 @@
def check_nextdoc_docstatus(self):
# Checks Delivery Note
- submit_dn = frappe.db.sql("select t1.name from `tabDelivery Note` t1,`tabDelivery Note Item` t2 where t1.name = t2.parent and t2.against_sales_order = %s and t1.docstatus = 1", self.name)
+ submit_dn = frappe.db.sql_list("""select t1.name from `tabDelivery Note` t1,`tabDelivery Note Item` t2
+ where t1.name = t2.parent and t2.against_sales_order = %s and t1.docstatus = 1""", self.name)
if submit_dn:
- msgprint("Delivery Note : " + cstr(submit_dn[0][0]) + " has been submitted against " + cstr(self.doctype) + ". Please cancel Delivery Note : " + cstr(submit_dn[0][0]) + " first and then cancel "+ cstr(self.doctype), raise_exception = 1)
+ frappe.throw(_("Delivery Notes {0} must be cancelled before cancelling this Sales Order").format(comma_and(submit_dn)))
# Checks Sales Invoice
- submit_rv = frappe.db.sql("""select t1.name
+ submit_rv = frappe.db.sql_list("""select t1.name
from `tabSales Invoice` t1,`tabSales Invoice Item` t2
where t1.name = t2.parent and t2.sales_order = %s and t1.docstatus = 1""",
self.name)
if submit_rv:
- msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted against " +cstr(self.doctype)+ ". Please cancel Sales Invoice : "+ cstr(submit_rv[0][0]) + " first and then cancel "+ cstr(self.doctype), raise_exception = 1)
+ frappe.throw(_("Sales Invoice {0} must be cancelled before cancelling this Sales Order").format(comma_and(submit_rv)))
#check maintenance schedule
- submit_ms = frappe.db.sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1",self.name)
+ submit_ms = frappe.db.sql_list("""select t1.name from `tabMaintenance Schedule` t1,
+ `tabMaintenance Schedule Item` t2
+ where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1""", self.name)
if submit_ms:
- msgprint("Maintenance Schedule : " + cstr(submit_ms[0][0]) + " has already been submitted against " +cstr(self.doctype)+ ". Please cancel Maintenance Schedule : "+ cstr(submit_ms[0][0]) + " first and then cancel "+ cstr(self.doctype), raise_exception = 1)
+ frappe.throw(_("Maintenance Schedule {0} must be cancelled before cancelling this Sales Order").format(comma_and(submit_ms)))
# check maintenance visit
- submit_mv = frappe.db.sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1",self.name)
+ submit_mv = frappe.db.sql_list("""select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2
+ where t2.parent=t1.name and t2.prevdoc_docname = %s and t1.docstatus = 1""",self.name)
if submit_mv:
- msgprint("Maintenance Visit : " + cstr(submit_mv[0][0]) + " has already been submitted against " +cstr(self.doctype)+ ". Please cancel Maintenance Visit : " + cstr(submit_mv[0][0]) + " first and then cancel "+ cstr(self.doctype), raise_exception = 1)
+ frappe.throw(_("Maintenance Visit {0} must be cancelled before cancelling this Sales Order").format(comma_and(submit_mv)))
# check production order
- pro_order = frappe.db.sql("""select name from `tabProduction Order` where sales_order = %s and docstatus = 1""", self.name)
+ pro_order = frappe.db.sql_list("""select name from `tabProduction Order`
+ where sales_order = %s and docstatus = 1""", self.name)
if pro_order:
- msgprint("""Production Order: %s exists against this sales order.
- Please cancel production order first and then cancel this sales order""" %
- pro_order[0][0], raise_exception=1)
+ frappe.throw(_("Production Order {0} must be cancelled before cancelling this Sales Order").format(comma_and(pro_order)))
def check_modified_date(self):
mod_db = frappe.db.get_value("Sales Order", self.name, "modified")
date_diff = frappe.db.sql("select TIMEDIFF('%s', '%s')" %
( mod_db, cstr(self.modified)))
if date_diff and date_diff[0][0]:
- msgprint("%s: %s has been modified after you have opened. Please Refresh"
- % (self.doctype, self.name), raise_exception=1)
+ frappe.throw(_("{0} {1} has been modified. Please Refresh").format(self.doctype, self.name))
def stop_sales_order(self):
self.check_modified_date()
self.update_stock_ledger(-1)
frappe.db.set(self, 'status', 'Stopped')
- msgprint("""%s: %s has been Stopped. To make transactions against this Sales Order
- you need to Unstop it.""" % (self.doctype, self.name))
+ frappe.msgprint(_("{0} {1} status is Stopped").format(self.doctype, self.name))
def unstop_sales_order(self):
self.check_modified_date()
self.update_stock_ledger(1)
frappe.db.set(self, 'status', 'Submitted')
- msgprint("%s: %s has been Unstopped" % (self.doctype, self.name))
+ frappe.msgprint(_("{0} {1} status is Unstopped").format(self.doctype, self.name))
def update_stock_ledger(self, update_stock):
diff --git a/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py b/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
index a5899f4..35cdf59 100644
--- a/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
+++ b/erpnext/selling/report/customers_not_buying_since_long_time/customers_not_buying_since_long_time.py
@@ -4,15 +4,16 @@
from __future__ import unicode_literals
import frappe
from frappe.utils import cint
+from frappe import _
def execute(filters=None):
if not filters: filters ={}
days_since_last_order = filters.get("days_since_last_order")
if cint(days_since_last_order) <= 0:
- frappe.msgprint("Please mention positive value in 'Days Since Last Order' field",raise_exception=1)
+ frappe.throw(_("'Days Since Last Order' must be greater than or equal to zero"))
- columns = get_columns()
+ columns = get_columns()
customers = get_so_details()
data = []
@@ -20,43 +21,43 @@
if cint(cust[8]) >= cint(days_since_last_order):
cust.insert(7,get_last_so_amt(cust[0]))
data.append(cust)
- return columns, data
+ return columns, data
def get_so_details():
- return frappe.db.sql("""select
- cust.name,
- cust.customer_name,
- cust.territory,
- cust.customer_group,
- count(distinct(so.name)) as 'num_of_order',
+ return frappe.db.sql("""select
+ cust.name,
+ cust.customer_name,
+ cust.territory,
+ cust.customer_group,
+ count(distinct(so.name)) as 'num_of_order',
sum(net_total) as 'total_order_value',
- sum(if(so.status = "Stopped",
- so.net_total * so.per_delivered/100,
+ sum(if(so.status = "Stopped",
+ so.net_total * so.per_delivered/100,
so.net_total)) as 'total_order_considered',
- max(so.transaction_date) as 'last_sales_order_date',
- DATEDIFF(CURDATE(), max(so.transaction_date)) as 'days_since_last_order'
- from `tabCustomer` cust, `tabSales Order` so
+ max(so.transaction_date) as 'last_sales_order_date',
+ DATEDIFF(CURDATE(), max(so.transaction_date)) as 'days_since_last_order'
+ from `tabCustomer` cust, `tabSales Order` so
where cust.name = so.customer and so.docstatus = 1
group by cust.name
order by 'days_since_last_order' desc """,as_list=1)
def get_last_so_amt(customer):
res = frappe.db.sql("""select net_total from `tabSales Order`
- where customer ='%(customer)s' and docstatus = 1 order by transaction_date desc
+ where customer ='%(customer)s' and docstatus = 1 order by transaction_date desc
limit 1""" % {'customer':customer})
return res and res[0][0] or 0
def get_columns():
return [
- "Customer:Link/Customer:120",
- "Customer Name:Data:120",
- "Territory::120",
+ "Customer:Link/Customer:120",
+ "Customer Name:Data:120",
+ "Territory::120",
"Customer Group::120",
- "Number of Order::120",
- "Total Order Value:Currency:120",
- "Total Order Considered:Currency:160",
+ "Number of Order::120",
+ "Total Order Value:Currency:120",
+ "Total Order Considered:Currency:160",
"Last Order Amount:Currency:160",
- "Last Sales Order Date:Date:160",
+ "Last Sales Order Date:Date:160",
"Days Since Last Order::160"
- ]
\ No newline at end of file
+ ]
diff --git a/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py b/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
index 2d7b3e3..b272a83 100644
--- a/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
+++ b/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py
@@ -5,14 +5,12 @@
import frappe
from frappe import _, msgprint
from frappe.utils import flt
-import time
from erpnext.accounts.utils import get_fiscal_year
from erpnext.controllers.trends import get_period_date_ranges, get_period_month_ranges
-from frappe.model.meta import get_field_precision
def execute(filters=None):
if not filters: filters = {}
-
+
columns = get_columns(filters)
period_month_ranges = get_period_month_ranges(filters["period"], filters["fiscal_year"])
sim_map = get_salesperson_item_month_map(filters)
@@ -37,7 +35,7 @@
data.append(row)
return columns, sorted(data, key=lambda x: (x[0], x[1]))
-
+
def get_columns(filters):
for fieldname in ["fiscal_year", "period", "target_on"]:
if not filters.get(fieldname):
@@ -55,26 +53,26 @@
label = label % (from_date.strftime("%b") + " - " + to_date.strftime("%b"))
else:
label = label % from_date.strftime("%b")
-
+
columns.append(label+":Float:120")
- return columns + ["Total Target:Float:120", "Total Achieved:Float:120",
+ return columns + ["Total Target:Float:120", "Total Achieved:Float:120",
"Total Variance:Float:120"]
#Get sales person & item group details
def get_salesperson_details(filters):
- return frappe.db.sql("""select sp.name, td.item_group, td.target_qty,
- td.target_amount, sp.distribution_id
- from `tabSales Person` sp, `tabTarget Detail` td
- where td.parent=sp.name and td.fiscal_year=%s order by sp.name""",
+ return frappe.db.sql("""select sp.name, td.item_group, td.target_qty,
+ td.target_amount, sp.distribution_id
+ from `tabSales Person` sp, `tabTarget Detail` td
+ where td.parent=sp.name and td.fiscal_year=%s order by sp.name""",
(filters["fiscal_year"]), as_dict=1)
#Get target distribution details of item group
def get_target_distribution_details(filters):
target_details = {}
-
- for d in frappe.db.sql("""select bd.name, bdd.month, bdd.percentage_allocation
- from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd
+
+ for d in frappe.db.sql("""select bd.name, bdd.month, bdd.percentage_allocation
+ from `tabBudget Distribution Detail` bdd, `tabBudget Distribution` bd
where bdd.parent=bd.name and bd.fiscal_year=%s""", (filters["fiscal_year"]), as_dict=1):
target_details.setdefault(d.name, {}).setdefault(d.month, flt(d.percentage_allocation))
@@ -83,13 +81,13 @@
#Get achieved details from sales order
def get_achieved_details(filters):
start_date, end_date = get_fiscal_year(fiscal_year = filters["fiscal_year"])[1:]
-
- item_details = frappe.db.sql("""select soi.item_code, soi.qty, soi.base_amount, so.transaction_date,
- st.sales_person, MONTHNAME(so.transaction_date) as month_name
- from `tabSales Order Item` soi, `tabSales Order` so, `tabSales Team` st
- where soi.parent=so.name and so.docstatus=1 and
- st.parent=so.name and so.transaction_date>=%s and
- so.transaction_date<=%s""" % ('%s', '%s'),
+
+ item_details = frappe.db.sql("""select soi.item_code, soi.qty, soi.base_amount, so.transaction_date,
+ st.sales_person, MONTHNAME(so.transaction_date) as month_name
+ from `tabSales Order Item` soi, `tabSales Order` so, `tabSales Team` st
+ where soi.parent=so.name and so.docstatus=1 and
+ st.parent=so.name and so.transaction_date>=%s and
+ so.transaction_date<=%s""" % ('%s', '%s'),
(start_date, end_date), as_dict=1)
item_actual_details = {}
@@ -117,7 +115,7 @@
tav_dict = sim_map[sd.name][sd.item_group][month]
month_percentage = tdd.get(sd.distribution_id, {}).get(month, 0) \
if sd.distribution_id else 100.0/12
-
+
for ad in achieved_details.get(sd.name, {}).get(sd.item_group, []):
if (filters["target_on"] == "Quantity"):
tav_dict.target = flt(sd.target_qty) * month_percentage / 100
@@ -132,4 +130,4 @@
return sim_map
def get_item_group(item_name):
- return frappe.db.get_value("Item", item_name, "item_group")
\ No newline at end of file
+ return frappe.db.get_value("Item", item_name, "item_group")
diff --git a/erpnext/setup/doctype/authorization_control/authorization_control.py b/erpnext/setup/doctype/authorization_control/authorization_control.py
index 8a401f0..25d2de0 100644
--- a/erpnext/setup/doctype/authorization_control/authorization_control.py
+++ b/erpnext/setup/doctype/authorization_control/authorization_control.py
@@ -4,12 +4,11 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cstr, flt, has_common, make_esc
+from frappe.utils import cstr, flt, has_common, make_esc, comma_or
-from frappe import session, msgprint
-from erpnext.setup.utils import get_company_currency
+from frappe import session, _
-
+
from erpnext.utilities.transaction_base import TransactionBase
class AuthorizationControl(TransactionBase):
@@ -24,27 +23,18 @@
for x in det:
amt_list.append(flt(x[0]))
max_amount = max(amt_list)
-
+
app_dtl = frappe.db.sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and company = %s %s" % ('%s', '%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on, company))
-
+
if not app_dtl:
- app_dtl = frappe.db.sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and ifnull(company,'') = '' %s" % ('%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on))
+ app_dtl = frappe.db.sql("select approving_user, approving_role from `tabAuthorization Rule` where transaction = %s and (value = %s or value > %s) and docstatus != 2 and based_on = %s and ifnull(company,'') = '' %s" % ('%s', '%s', '%s', '%s', condition), (doctype_name, flt(max_amount), total, based_on))
for d in app_dtl:
if(d[0]): appr_users.append(d[0])
if(d[1]): appr_roles.append(d[1])
-
+
if not has_common(appr_roles, frappe.user.get_roles()) and not has_common(appr_users, [session['user']]):
- msg, add_msg = '',''
- if max_amount:
- dcc = get_company_currency(self.company)
- if based_on == 'Grand Total': msg = "since Grand Total exceeds %s. %s" % (dcc, flt(max_amount))
- elif based_on == 'Itemwise Discount': msg = "since Discount exceeds %s for Item Code : %s" % (cstr(max_amount)+'%', item)
- elif based_on == 'Average Discount' or based_on == 'Customerwise Discount': msg = "since Discount exceeds %s" % (cstr(max_amount)+'%')
-
- if appr_users: add_msg = "Users : "+cstr(appr_users)
- if appr_roles: add_msg = "Roles : "+cstr(appr_roles)
- if appr_users and appr_roles: add_msg = "Users : "+cstr(appr_users)+" or "+"Roles : "+cstr(appr_roles)
- msgprint("You are not authorize to submit this %s %s. Please send for approval to %s" % (doctype_name, msg, add_msg))
+ frappe.msgprint(_("Not authroized since {0} exceeds limits").format(_(based_on)))
+ frappe.throw(_("Can be approved by {0}").format(comma_or(appr_roles + appr_users)))
raise Exception
@@ -64,12 +54,12 @@
if chk == 1:
if based_on == 'Itemwise Discount': add_cond2 += " and ifnull(master_name,'') = ''"
appr = frappe.db.sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and company = %s and docstatus != 2 %s %s" % ('%s', '%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on, company))
-
+
if not appr:
appr = frappe.db.sql("select value from `tabAuthorization Rule` where transaction = %s and value <= %s and based_on = %s and ifnull(company,'') = '' and docstatus != 2 %s %s"% ('%s', '%s', '%s', cond, add_cond2), (doctype_name, total, based_on))
self.get_appr_user_role(appr, doctype_name, total, based_on, cond+add_cond2, item, company)
-
-
+
+
# Bifurcate Authorization based on type
# --------------------------------------
def bifurcate_based_on_type(self, doctype_name, total, av_dis, based_on, doc_obj, val, company):
@@ -108,39 +98,39 @@
# Individual User
# ================
# Check for authorization set for individual user
-
+
based_on = [x[0] for x in frappe.db.sql("select distinct based_on from `tabAuthorization Rule` where transaction = %s and system_user = %s and (company = %s or ifnull(company,'')='') and docstatus != 2", (doctype_name, session['user'], company))]
for d in based_on:
self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 1, company)
-
+
# Remove user specific rules from global authorization rules
for r in based_on:
if r in final_based_on and r != 'Itemwise Discount': final_based_on.remove(r)
-
+
# Specific Role
# ===============
# Check for authorization set on particular roles
- based_on = [x[0] for x in frappe.db.sql("""select based_on
- from `tabAuthorization Rule`
- where transaction = %s and system_role IN (%s) and based_on IN (%s)
- and (company = %s or ifnull(company,'')='')
+ based_on = [x[0] for x in frappe.db.sql("""select based_on
+ from `tabAuthorization Rule`
+ where transaction = %s and system_role IN (%s) and based_on IN (%s)
+ and (company = %s or ifnull(company,'')='')
and docstatus != 2
""" % ('%s', "'"+"','".join(frappe.user.get_roles())+"'", "'"+"','".join(final_based_on)+"'", '%s'), (doctype_name, company))]
-
+
for d in based_on:
self.bifurcate_based_on_type(doctype_name, total, av_dis, d, doc_obj, 2, company)
-
+
# Remove role specific rules from global authorization rules
for r in based_on:
if r in final_based_on and r != 'Itemwise Discount': final_based_on.remove(r)
-
+
# Global Rule
# =============
# Check for global authorization
for g in final_based_on:
self.bifurcate_based_on_type(doctype_name, total, av_dis, g, doc_obj, 0, company)
-
+
#========================================================================================================================
# payroll related check
def get_value_based_rule(self,doctype_name,employee,total_claimed_amount,company):
@@ -153,29 +143,29 @@
val_lst = [y[0] for y in val]
else:
val_lst.append(0)
-
+
max_val = max(val_lst)
rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and company = %s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(value,0)= %s and docstatus!=2",(doctype_name,company,employee,employee,flt(max_val)), as_dict=1)
if not rule:
rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and ifnull(company,'') = '' and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(value,0)= %s and docstatus!=2",(doctype_name,employee,employee,flt(max_val)), as_dict=1)
return rule
-
+
#---------------------------------------------------------------------------------------------------------------------
# related to payroll module only
def get_approver_name(self, doctype_name, total, doc_obj=''):
app_user=[]
app_specific_user =[]
rule ={}
-
+
if doc_obj:
if doctype_name == 'Expense Claim':
rule = self.get_value_based_rule(doctype_name,doc_obj.employee,doc_obj.total_claimed_amount, doc_obj.company)
elif doctype_name == 'Appraisal':
- rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and company = %s and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee, doc_obj.company),as_dict=1)
+ rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and company = %s and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee, doc_obj.company),as_dict=1)
if not rule:
- rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(company,'') = '' and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee),as_dict=1)
-
+ rule = frappe.db.sql("select name, to_emp, to_designation, approving_role, approving_user from `tabAuthorization Rule` where transaction=%s and (to_emp=%s or to_designation IN (select designation from `tabEmployee` where name=%s)) and ifnull(company,'') = '' and docstatus!=2",(doctype_name,doc_obj.employee, doc_obj.employee),as_dict=1)
+
if rule:
for m in rule:
if m['to_emp'] or m['to_designation']:
@@ -186,7 +176,7 @@
for x in user_lst:
if not x in app_user:
app_user.append(x)
-
+
if len(app_specific_user) >0:
return app_specific_user
else:
diff --git a/erpnext/setup/doctype/authorization_rule/authorization_rule.py b/erpnext/setup/doctype/authorization_rule/authorization_rule.py
index 1c6daf2..58fb231 100644
--- a/erpnext/setup/doctype/authorization_rule/authorization_rule.py
+++ b/erpnext/setup/doctype/authorization_rule/authorization_rule.py
@@ -4,8 +4,8 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cint, cstr, flt, has_common
-from frappe import msgprint
+from frappe.utils import cstr, flt
+from frappe import _, msgprint
from frappe.model.document import Document
@@ -13,75 +13,41 @@
def check_duplicate_entry(self):
- exists = frappe.db.sql("""select name, docstatus from `tabAuthorization Rule`
- where transaction = %s and based_on = %s and system_user = %s
- and system_role = %s and approving_user = %s and approving_role = %s
- and to_emp =%s and to_designation=%s and name != %s""",
- (self.transaction, self.based_on, cstr(self.system_user),
- cstr(self.system_role), cstr(self.approving_user),
- cstr(self.approving_role), cstr(self.to_emp),
+ exists = frappe.db.sql("""select name, docstatus from `tabAuthorization Rule`
+ where transaction = %s and based_on = %s and system_user = %s
+ and system_role = %s and approving_user = %s and approving_role = %s
+ and to_emp =%s and to_designation=%s and name != %s""",
+ (self.transaction, self.based_on, cstr(self.system_user),
+ cstr(self.system_role), cstr(self.approving_user),
+ cstr(self.approving_role), cstr(self.to_emp),
cstr(self.to_designation), self.name))
auth_exists = exists and exists[0][0] or ''
if auth_exists:
- if cint(exists[0][1]) == 2:
- msgprint("""Duplicate Entry. Please untrash Authorization Rule : %s \
- from Recycle Bin""" % (auth_exists), raise_exception=1)
- else:
- msgprint("Duplicate Entry. Please check Authorization Rule : %s" %
- (auth_exists), raise_exception=1)
-
-
- def validate_master_name(self):
- if self.based_on == 'Customerwise Discount' and \
- not frappe.db.sql("""select name from tabCustomer
- where name = %s and docstatus != 2""", (self.master_name)):
- msgprint("Please select valid Customer Name for Customerwise Discount",
- raise_exception=1)
- elif self.based_on == 'Itemwise Discount' and \
- not frappe.db.sql("select name from tabItem where name = %s and docstatus != 2",
- (self.master_name)):
- msgprint("Please select valid Item Name for Itemwise Discount", raise_exception=1)
- elif (self.based_on == 'Grand Total' or \
- self.based_on == 'Average Discount') and self.master_name:
- msgprint("Please remove Customer/Item Name for %s." %
- self.based_on, raise_exception=1)
+ frappe.throw(_("Duplicate Entry. Please check Authorization Rule {0}").format(auth_exists))
def validate_rule(self):
if self.transaction != 'Appraisal':
if not self.approving_role and not self.approving_user:
- msgprint("Please enter Approving Role or Approving User", raise_exception=1)
+ frappe.throw(_("Please enter Approving Role or Approving User"))
elif self.system_user and self.system_user == self.approving_user:
- msgprint("Approving User cannot be same as user the rule is Applicable To (User)",
- raise_exception=1)
+ frappe.throw(_("Approving User cannot be same as user the rule is Applicable To"))
elif self.system_role and self.system_role == self.approving_role:
- msgprint("Approving Role cannot be same as user the rule is \
- Applicable To (Role).", raise_exception=1)
- elif self.system_user and self.approving_role and \
- has_common([self.approving_role], [x[0] for x in \
- frappe.db.sql("select role from `tabUserRole` where parent = %s", \
- (self.system_user))]):
- msgprint("System User : %s is assigned role : %s. So rule does not make sense" %
- (self.system_user,self.approving_role), raise_exception=1)
+ frappe.throw(_("Approving Role cannot be same as role the rule is Applicable To"))
elif self.transaction in ['Purchase Order', 'Purchase Receipt', \
'Purchase Invoice', 'Stock Entry'] and self.based_on \
in ['Average Discount', 'Customerwise Discount', 'Itemwise Discount']:
- msgprint("You cannot set authorization on basis of Discount for %s" %
- self.transaction, raise_exception=1)
+ frappe.throw(_("Cannot set authorization on basis of Discount for {0}").format(self.transaction))
elif self.based_on == 'Average Discount' and flt(self.value) > 100.00:
- msgprint("Discount cannot given for more than 100%", raise_exception=1)
+ frappe.throw(_("Discount must be less than 100"))
elif self.based_on == 'Customerwise Discount' and not self.master_name:
- msgprint("Please enter Customer Name for 'Customerwise Discount'",
- raise_exception=1)
+ frappe.throw(_("Customer required for 'Customerwise Discount'"))
else:
- if self.transaction == 'Appraisal' and self.based_on != 'Not Applicable':
- msgprint("Based on should be 'Not Applicable' while setting authorization rule\
- for 'Appraisal'", raise_exception=1)
-
-
+ if self.transaction == 'Appraisal':
+ self.based_on = "Not Applicable"
def validate(self):
self.check_duplicate_entry()
self.validate_rule()
self.validate_master_name()
- if not self.value: self.value = 0.0
\ No newline at end of file
+ if not self.value: self.value = 0.0
diff --git a/erpnext/setup/doctype/backup_manager/backup_googledrive.py b/erpnext/setup/doctype/backup_manager/backup_googledrive.py
index 0ea64ba..70bda35 100644
--- a/erpnext/setup/doctype/backup_manager/backup_googledrive.py
+++ b/erpnext/setup/doctype/backup_manager/backup_googledrive.py
@@ -20,7 +20,7 @@
import frappe
import oauth2client.client
from frappe.utils import cstr
-from frappe import _, msgprint
+from frappe import _
from apiclient.discovery import build
from apiclient.http import MediaFileUpload
@@ -71,17 +71,17 @@
backup = new_backup()
path = os.path.join(frappe.local.site_path, "public", "backups")
filename = os.path.join(path, os.path.basename(backup.backup_path_db))
-
+
# upload files to database folder
- upload_files(filename, 'application/x-gzip', drive_service,
+ upload_files(filename, 'application/x-gzip', drive_service,
frappe.db.get_value("Backup Manager", None, "database_folder_id"))
-
+
# upload files to files folder
did_not_upload = []
error_log = []
-
+
files_folder_id = frappe.db.get_value("Backup Manager", None, "files_folder_id")
-
+
frappe.db.close()
path = os.path.join(frappe.local.site_path, "public", "files")
for filename in os.listdir(path):
@@ -94,7 +94,7 @@
mimetype = 'application/x-gzip'
else:
mimetype = mimetypes.types_map.get("." + ext) or "application/octet-stream"
-
+
#Compare Local File with Server File
children = drive_service.children().list(folderId=files_folder_id).execute()
for child in children.get('items', []):
@@ -108,29 +108,28 @@
except Exception, e:
did_not_upload.append(filename)
error_log.append(cstr(e))
-
+
frappe.connect()
return did_not_upload, list(set(error_log))
def get_gdrive_flow():
from oauth2client.client import OAuth2WebServerFlow
from frappe import conf
-
- if not "gdrive_client_id" in conf:
- frappe.msgprint(_("Please set Google Drive access keys in") + " conf.py",
- raise_exception=True)
- flow = OAuth2WebServerFlow(conf.gdrive_client_id, conf.gdrive_client_secret,
+ if not "gdrive_client_id" in conf:
+ frappe.throw(_("Please set Google Drive access keys in {0}"),format("site_config.json"))
+
+ flow = OAuth2WebServerFlow(conf.gdrive_client_id, conf.gdrive_client_secret,
"https://www.googleapis.com/auth/drive", 'urn:ietf:wg:oauth:2.0:oob')
return flow
-
+
@frappe.whitelist()
def gdrive_callback(verification_code = None):
flow = get_gdrive_flow()
if verification_code:
credentials = flow.step2_exchange(verification_code)
allowed = 1
-
+
# make folders to save id
http = httplib2.Http()
http = credentials.authorize(http)
@@ -145,7 +144,7 @@
final_credentials = credentials.to_json()
frappe.db.set_value("Backup Manager", "Backup Manager", "gdrive_credentials", final_credentials)
- frappe.msgprint("Updated")
+ frappe.msgprint(_("Updated"))
def create_erpnext_folder(service):
if not frappe.db:
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index 7355bd2..6526832 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -3,9 +3,9 @@
from __future__ import unicode_literals
import frappe
-from frappe import _, msgprint
+from frappe import _
-from frappe.utils import cstr, cint
+from frappe.utils import cint
import frappe.defaults
@@ -13,10 +13,10 @@
class Company(Document):
-
+
def onload(self):
self.set("__transactions_exist", self.check_if_transactions_exist())
-
+
def check_if_transactions_exist(self):
exists = False
for doctype in ["Sales Invoice", "Delivery Note", "Sales Order", "Quotation",
@@ -25,31 +25,30 @@
limit 1""" % (doctype, "%s"), self.name):
exists = True
break
-
+
return exists
-
+
def validate(self):
if self.get('__islocal') and len(self.abbr) > 5:
- frappe.msgprint("Abbreviation cannot have more than 5 characters",
- raise_exception=1)
-
+ frappe.throw(_("Abbreviation cannot have more than 5 characters"))
+
self.previous_default_currency = frappe.db.get_value("Company", self.name, "default_currency")
if self.default_currency and self.previous_default_currency and \
self.default_currency != self.previous_default_currency and \
self.check_if_transactions_exist():
- msgprint(_("Sorry! You cannot change company's default currency, because there are existing transactions against it. You will need to cancel those transactions if you want to change the default currency."), raise_exception=True)
+ frappe.throw(_("Cannot change company's default currency, because there are existing transactions. Transactions must be cancelled to change the default currency."))
def on_update(self):
- if not frappe.db.sql("""select name from tabAccount
+ if not frappe.db.sql("""select name from tabAccount
where company=%s and docstatus<2 limit 1""", self.name):
self.create_default_accounts()
self.create_default_warehouses()
self.create_default_web_page()
-
- if not frappe.db.get_value("Cost Center", {"group_or_ledger": "Ledger",
+
+ if not frappe.db.get_value("Cost Center", {"group_or_ledger": "Ledger",
"company": self.name}):
self.create_default_cost_center()
-
+
self.set_default_accounts()
if self.default_currency:
@@ -58,7 +57,7 @@
def create_default_warehouses(self):
for whname in ("Stores", "Work In Progress", "Finished Goods"):
if not frappe.db.exists("Warehouse", whname + " - " + self.abbr):
- stock_group = frappe.db.get_value("Account", {"account_type": "Stock",
+ stock_group = frappe.db.get_value("Account", {"account_type": "Stock",
"group_or_ledger": "Group"})
if stock_group:
frappe.get_doc({
@@ -67,7 +66,7 @@
"company": self.name,
"create_account_under": stock_group
}).insert()
-
+
def create_default_web_page(self):
if not frappe.db.get_value("Website Settings", None, "home_page") and \
not frappe.db.sql("select name from tabCompany where name!=%s", self.name):
@@ -80,7 +79,7 @@
"description": "Standard Home Page for " + self.name,
"main_section": webfile.read() % self.as_dict()
}).insert()
-
+
# update in home page in settings
website_settings = frappe.get_doc("Website Settings", "Website Settings")
website_settings.home_page = webpage.name
@@ -109,7 +108,7 @@
self.create_standard_accounts()
frappe.db.set(self, "receivables_group", "Accounts Receivable - " + self.abbr)
frappe.db.set(self, "payables_group", "Accounts Payable - " + self.abbr)
-
+
def import_chart_of_account(self):
chart = frappe.get_doc("Chart of Accounts", self.chart_of_accounts)
chart.create_accounts(self.name)
@@ -120,7 +119,7 @@
"freeze_account": "No",
"master_type": "",
})
-
+
for d in self.fld_dict.keys():
account.set(d, (d == 'parent_account' and lst[self.fld_dict[d]]) and lst[self.fld_dict[d]] +' - '+ self.abbr or lst[self.fld_dict[d]])
account.insert()
@@ -128,17 +127,17 @@
def set_default_accounts(self):
def _set_default_accounts(accounts):
for field, account_type in accounts.items():
- account = frappe.db.get_value("Account", {"account_type": account_type,
+ account = frappe.db.get_value("Account", {"account_type": account_type,
"group_or_ledger": "Ledger", "company": self.name})
if account and not self.get(field):
frappe.db.set(self, field, account)
-
+
_set_default_accounts({
"default_cash_account": "Cash",
"default_bank_account": "Bank"
})
-
+
if cint(frappe.db.get_value("Accounts Settings", None, "auto_accounting_for_stock")):
_set_default_accounts({
"stock_received_but_not_billed": "Stock Received But Not Billed",
@@ -153,9 +152,9 @@
'company':self.name,
'group_or_ledger':'Group',
'parent_cost_center':''
- },
+ },
{
- 'cost_center_name':'Main',
+ 'cost_center_name':'Main',
'company':self.name,
'group_or_ledger':'Ledger',
'parent_cost_center':self.name + ' - ' + self.abbr
@@ -165,11 +164,11 @@
cc.update({"doctype": "Cost Center"})
cc_doc = frappe.get_doc(cc)
cc_doc.ignore_permissions = True
-
+
if cc.get("cost_center_name") == self.name:
cc_doc.ignore_mandatory = True
cc_doc.insert()
-
+
frappe.db.set(self, "cost_center", "Main - " + self.abbr)
def on_trash(self):
@@ -180,33 +179,33 @@
if not rec:
#delete tabAccount
frappe.db.sql("delete from `tabAccount` where company = %s order by lft desc, rgt desc", self.name)
-
+
#delete cost center child table - budget detail
frappe.db.sql("delete bd.* from `tabBudget Detail` bd, `tabCost Center` cc where bd.parent = cc.name and cc.company = %s", self.name)
#delete cost center
frappe.db.sql("delete from `tabCost Center` WHERE company = %s order by lft desc, rgt desc", self.name)
-
+
if not frappe.db.get_value("Stock Ledger Entry", {"company": self.name}):
frappe.db.sql("""delete from `tabWarehouse` where company=%s""", self.name)
-
+
frappe.defaults.clear_default("company", value=self.name)
-
+
frappe.db.sql("""update `tabSingles` set value=""
- where doctype='Global Defaults' and field='default_company'
+ where doctype='Global Defaults' and field='default_company'
and value=%s""", self.name)
-
+
def before_rename(self, olddn, newdn, merge=False):
if merge:
frappe.throw(_("Sorry, companies cannot be merged"))
-
+
def after_rename(self, olddn, newdn, merge=False):
frappe.db.set(self, "company_name", newdn)
- frappe.db.sql("""update `tabDefaultValue` set defvalue=%s
+ frappe.db.sql("""update `tabDefaultValue` set defvalue=%s
where defkey='Company' and defvalue=%s""", (newdn, olddn))
frappe.defaults.clear_cache()
-
+
def create_standard_accounts(self):
self.fld_dict = {
'account_name': 0,
@@ -217,7 +216,7 @@
'company': 5,
'tax_rate': 6
}
-
+
acc_list_common = [
['Application of Funds (Assets)','','Group','','Balance Sheet',self.name,''],
['Current Assets','Application of Funds (Assets)','Group','','Balance Sheet',self.name,''],
@@ -282,7 +281,7 @@
['Current Liabilities','Source of Funds (Liabilities)','Group','','Balance Sheet',self.name,''],
['Accounts Payable','Current Liabilities','Group','','Balance Sheet',self.name,''],
['Stock Liabilities','Current Liabilities','Group','','Balance Sheet',self.name,''],
- ['Stock Received But Not Billed', 'Stock Liabilities', 'Ledger', 'Stock Received But Not Billed', 'Balance Sheet', self.name, ''],
+ ['Stock Received But Not Billed', 'Stock Liabilities', 'Ledger', 'Stock Received But Not Billed', 'Balance Sheet', self.name, ''],
['Duties and Taxes','Current Liabilities','Group','','Balance Sheet',self.name,''],
['Loans (Liabilities)','Current Liabilities','Group','','Balance Sheet',self.name,''],
['Secured Loans','Loans (Liabilities)','Group','','Balance Sheet',self.name,''],
@@ -291,7 +290,7 @@
['Temporary Accounts (Liabilities)','Source of Funds (Liabilities)','Group','','Balance Sheet',self.name,''],
['Temporary Account (Liabilities)','Temporary Accounts (Liabilities)','Ledger','','Balance Sheet',self.name,'']
]
-
+
acc_list_india = [
['CENVAT Capital Goods','Tax Assets','Ledger','Chargeable','Balance Sheet',self.name,''],
['CENVAT','Tax Assets','Ledger','Chargeable','Balance Sheet',self.name,''],
@@ -342,23 +341,23 @@
@frappe.whitelist()
def replace_abbr(company, old, new):
frappe.db.set_value("Company", company, "abbr", new)
-
+
def _rename_record(dt):
for d in frappe.db.sql("select name from `tab%s` where company=%s" % (dt, '%s'), company):
parts = d[0].split(" - ")
if parts[-1].lower() == old.lower():
name_without_abbr = " - ".join(parts[:-1])
frappe.rename_doc(dt, d[0], name_without_abbr + " - " + new)
-
+
for dt in ["Account", "Cost Center", "Warehouse"]:
_rename_record(dt)
frappe.db.commit()
def get_name_with_abbr(name, company):
- company_abbr = frappe.db.get_value("Company", company, "abbr")
+ company_abbr = frappe.db.get_value("Company", company, "abbr")
parts = name.split(" - ")
if parts[-1].lower() != company_abbr.lower():
parts.append(company_abbr)
-
+
return " - ".join(parts)
diff --git a/erpnext/setup/doctype/currency_exchange/currency_exchange.py b/erpnext/setup/doctype/currency_exchange/currency_exchange.py
index e22f035..c15c215 100644
--- a/erpnext/setup/doctype/currency_exchange/currency_exchange.py
+++ b/erpnext/setup/doctype/currency_exchange/currency_exchange.py
@@ -5,16 +5,16 @@
from __future__ import unicode_literals
import frappe
-from frappe import _, msgprint
+from frappe import _
from frappe.model.controller import DocListController
class CurrencyExchange(DocListController):
-
+
def autoname(self):
self.name = self.from_currency + "-" + self.to_currency
-
+
def validate(self):
self.validate_value("exchange_rate", ">", 0)
-
+
if self.from_currency == self.to_currency:
- msgprint(_("From Currency and To Currency cannot be same"), raise_exception=True)
\ No newline at end of file
+ frappe.throw(_("From Currency and To Currency cannot be same"))
diff --git a/erpnext/setup/doctype/customer_group/customer_group.py b/erpnext/setup/doctype/customer_group/customer_group.py
index 11a15fa..0eefebe 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.py
+++ b/erpnext/setup/doctype/customer_group/customer_group.py
@@ -3,45 +3,20 @@
from __future__ import unicode_literals
import frappe
-from frappe import msgprint
+from frappe import _
-
+
from frappe.utils.nestedset import NestedSet
class CustomerGroup(NestedSet):
nsm_parent_field = 'parent_customer_group';
- def validate(self):
- if frappe.db.sql("select name from `tabCustomer Group` where name = %s and docstatus = 2",
- (self.customer_group_name)):
- msgprint("""Another %s record is trashed.
- To untrash please go to Setup -> Recycle Bin.""" %
- (self.customer_group_name), raise_exception = 1)
-
def on_update(self):
self.validate_name_with_customer()
super(CustomerGroup, self).on_update()
self.validate_one_root()
-
+
def validate_name_with_customer(self):
if frappe.db.exists("Customer", self.name):
- frappe.msgprint("An Customer exists with same name (%s), \
- please change the Customer Group name or rename the Customer" %
+ frappe.msgprint(_("An Customer exists with same name (%s), \
+ please change the Customer Group name or rename the Customer") %
self.name, raise_exception=1)
-
- def on_trash(self):
- cust = frappe.db.sql("select name from `tabCustomer` where ifnull(customer_group, '') = %s",
- self.name)
- cust = [d[0] for d in cust]
- if cust:
- msgprint("""Customer Group: %s can not be trashed/deleted \
- because it is used in customer: %s.
- To trash/delete this, remove/change customer group in customer master""" %
- (self.name, cust or ''), raise_exception=1)
-
- if frappe.db.sql("select name from `tabCustomer Group` where parent_customer_group = %s \
- and docstatus != 2", self.name):
- msgprint("Child customer group exists for this customer group. \
- You can not trash/cancel/delete this customer group.", raise_exception=1)
-
- # rebuild tree
- super(CustomerGroup, self).on_trash()
diff --git a/erpnext/setup/doctype/global_defaults/global_defaults.py b/erpnext/setup/doctype/global_defaults/global_defaults.py
index 93d75a1..90861de 100644
--- a/erpnext/setup/doctype/global_defaults/global_defaults.py
+++ b/erpnext/setup/doctype/global_defaults/global_defaults.py
@@ -4,6 +4,7 @@
from __future__ import unicode_literals
"""Global Defaults"""
import frappe
+from frappe import _
import frappe.defaults
from frappe.utils import cint
@@ -25,17 +26,17 @@
from frappe.model.document import Document
class GlobalDefaults(Document):
-
+
def on_update(self):
"""update defaults"""
self.validate_session_expiry()
self.set_country_and_timezone()
-
+
for key in keydict:
frappe.db.set_default(key, self.get(keydict[key], ''))
-
+
# update year start date and year end date from fiscal_year
- year_start_end_date = frappe.db.sql("""select year_start_date, year_end_date
+ year_start_end_date = frappe.db.sql("""select year_start_date, year_end_date
from `tabFiscal Year` where name=%s""", self.current_fiscal_year)
ysd = year_start_end_date[0][0] or ''
@@ -44,20 +45,19 @@
if ysd and yed:
frappe.db.set_default('year_start_date', ysd.strftime('%Y-%m-%d'))
frappe.db.set_default('year_end_date', yed.strftime('%Y-%m-%d'))
-
+
# enable default currency
if self.default_currency:
frappe.db.set_value("Currency", self.default_currency, "enabled", 1)
-
+
# clear cache
frappe.clear_cache()
-
+
def validate_session_expiry(self):
if self.session_expiry:
parts = self.session_expiry.split(":")
if len(parts)!=2 or not (cint(parts[0]) or cint(parts[1])):
- frappe.msgprint("""Session Expiry must be in format hh:mm""",
- raise_exception=1)
+ frappe.throw(_("Session Expiry must be in format {0}").format("hh:mm"))
def set_country_and_timezone(self):
frappe.db.set_default("country", self.country)
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index 4b0dc11..700e39a 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -34,5 +34,4 @@
def validate_name_with_item(self):
if frappe.db.exists("Item", self.name):
- frappe.msgprint("An item exists with same name (%s), please change the \
- item group name or rename the item" % self.name, raise_exception=1)
+ frappe.throw(frappe._("An item exists with same name ({0}), please change the item group name or rename the item").format(self.name))
diff --git a/erpnext/setup/doctype/jobs_email_settings/jobs_email_settings.py b/erpnext/setup/doctype/jobs_email_settings/jobs_email_settings.py
index 94874f2..5d8bab8 100644
--- a/erpnext/setup/doctype/jobs_email_settings/jobs_email_settings.py
+++ b/erpnext/setup/doctype/jobs_email_settings/jobs_email_settings.py
@@ -11,10 +11,9 @@
from frappe.model.document import Document
class JobsEmailSettings(Document):
-
+
def validate(self):
if cint(self.extract_emails) and not (self.email_id and self.host and \
self.username and self.password):
-
- frappe.msgprint(_("""Host, Email and Password required if emails are to be pulled"""),
- raise_exception=True)
\ No newline at end of file
+
+ frappe.throw(_("""Host, Email and Password required if emails are to be pulled"""))
diff --git a/erpnext/setup/doctype/notification_control/notification_control.py b/erpnext/setup/doctype/notification_control/notification_control.py
index 87674ec..1e57ad5 100644
--- a/erpnext/setup/doctype/notification_control/notification_control.py
+++ b/erpnext/setup/doctype/notification_control/notification_control.py
@@ -4,8 +4,7 @@
from __future__ import unicode_literals
import frappe
-from frappe import msgprint
-
+from frappe import _
from frappe.model.document import Document
@@ -18,5 +17,5 @@
def set_message(self, arg = ''):
fn = self.select_transaction.lower().replace(' ', '_') + '_message'
frappe.db.set(self, fn, self.custom_message)
- msgprint("Custom Message for %s updated!" % self.select_transaction)
+ frappe.msgprint(_("Message updated"))
diff --git a/erpnext/setup/doctype/territory/territory.py b/erpnext/setup/doctype/territory/territory.py
index 83eae91..890e778 100644
--- a/erpnext/setup/doctype/territory/territory.py
+++ b/erpnext/setup/doctype/territory/territory.py
@@ -6,17 +6,17 @@
from frappe.utils import flt
+from frappe import _
from frappe.utils.nestedset import NestedSet
-
+
class Territory(NestedSet):
nsm_parent_field = 'parent_territory'
- def validate(self):
+ def validate(self):
for d in self.get('target_details'):
if not flt(d.target_qty) and not flt(d.target_amount):
- msgprint("Either target qty or target amount is mandatory.")
- raise Exception
+ frappe.throw(_("Either target qty or target amount is mandatory"))
def on_update(self):
super(Territory, self).on_update()
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index 0bd614f..63d18d2 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -13,33 +13,29 @@
if not currency:
throw(_('Please specify Default Currency in Company Master \
and Global Defaults'))
-
+
return currency
def get_root_of(doctype):
"""Get root element of a DocType with a tree structure"""
- result = frappe.db.sql_list("""select name from `tab%s`
- where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" %
+ result = frappe.db.sql_list("""select name from `tab%s`
+ where lft=1 and rgt=(select max(rgt) from `tab%s` where docstatus < 2)""" %
(doctype, doctype))
return result[0] if result else None
-
+
def get_ancestors_of(doctype, name):
"""Get ancestor elements of a DocType with a tree structure"""
lft, rgt = frappe.db.get_value(doctype, name, ["lft", "rgt"])
- result = frappe.db.sql_list("""select name from `tab%s`
+ result = frappe.db.sql_list("""select name from `tab%s`
where lft<%s and rgt>%s order by lft desc""" % (doctype, "%s", "%s"), (lft, rgt))
return result or []
@frappe.whitelist()
def get_price_list_currency(price_list):
- price_list_currency = frappe.db.get_value("Price List", {"name": price_list,
+ price_list_currency = frappe.db.get_value("Price List", {"name": price_list,
"enabled": 1}, "currency")
if not price_list_currency:
- throw("{message}: {price_list} {disabled}".format(**{
- "message": _("Price List"),
- "price_list": price_list,
- "disabled": _("is disabled.")
- }))
+ throw(_("Price List {0} is disabled").format(price_list))
else:
- return {"price_list_currency": price_list_currency}
\ No newline at end of file
+ return {"price_list_currency": price_list_currency}
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index e91c36d..95882c6 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import cstr, flt, cint
+from frappe.utils import flt, cint
from frappe import msgprint, _
import frappe.defaults
@@ -54,9 +54,7 @@
if frappe.db.get_value("Selling Settings", None, 'so_required') == 'Yes':
for d in self.get('delivery_note_details'):
if not d.against_sales_order:
- msgprint("Sales Order No. required against item %s"%d.item_code)
- raise Exception
-
+ frappe.throw(_("Sales Order required for Item {0}").format(d.item_code))
def validate(self):
super(DeliveryNote, self).validate()
@@ -108,8 +106,7 @@
where name = %s and (customer = %s or
ifnull(customer,'')='')""", (self.project_name, self.customer))
if not res:
- msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.customer,self.project_name,self.project_name))
- raise Exception
+ frappe.throw(_("Customer {0} does not belong to project {1}").format(self.customer, self.project_name))
def validate_for_items(self):
check_list, chk_dupl_itm = [], []
@@ -119,14 +116,12 @@
if frappe.db.get_value("Item", d.item_code, "is_stock_item") == 'Yes':
if e in check_list:
- msgprint("Please check whether item %s has been entered twice wrongly."
- % d.item_code)
+ msgprint(_("Note: Item {0} entered multiple times").format(d.item_code))
else:
check_list.append(e)
else:
if f in chk_dupl_itm:
- msgprint("Please check whether item %s has been entered twice wrongly."
- % d.item_code)
+ msgprint(_("Note: Item {0} entered multiple times").format(d.item_code))
else:
chk_dupl_itm.append(f)
@@ -134,8 +129,7 @@
for d in self.get_item_list():
if frappe.db.get_value("Item", d['item_code'], "is_stock_item") == "Yes":
if not d['warehouse']:
- msgprint("Please enter Warehouse for item %s as it is stock item"
- % d['item_code'], raise_exception=1)
+ frappe.throw(_("Warehouse required for stock Item {0}").format(d["item_code"]))
def update_current_stock(self):
@@ -187,18 +181,13 @@
"""
if not any([flt(d.get('packed_qty')) for d in self.get(self.fname)]):
return
- packing_error_list = []
+ has_error = False
for d in self.get(self.fname):
if flt(d.get('qty')) != flt(d.get('packed_qty')):
- packing_error_list.append([
- d.get('item_code', ''),
- d.get('qty', 0),
- d.get('packed_qty', 0)
- ])
- if packing_error_list:
- err_msg = "\n".join([("Item: " + d[0] + ", Qty: " + cstr(d[1]) \
- + ", Packed: " + cstr(d[2])) for d in packing_error_list])
- frappe.msgprint("Packing Error:\n" + err_msg, raise_exception=1)
+ frappe.msgprint(_("Packed quantity must equal quantity for Item {0} in row {1}").format(d.item_code, d.idx))
+ has_error = True
+ if has_error:
+ raise frappe.ValidationError
def check_next_docstatus(self):
submit_rv = frappe.db.sql("""select t1.name
@@ -206,16 +195,14 @@
where t1.name = t2.parent and t2.delivery_note = %s and t1.docstatus = 1""",
(self.name))
if submit_rv:
- msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted !")
- raise Exception , "Validation Error."
+ frappe.throw(_("Sales Invoice {0} has already been submitted").format(submit_rv[0][0]))
submit_in = frappe.db.sql("""select t1.name
from `tabInstallation Note` t1, `tabInstallation Note Item` t2
where t1.name = t2.parent and t2.prevdoc_docname = %s and t1.docstatus = 1""",
(self.name))
if submit_in:
- msgprint("Installation Note : "+cstr(submit_in[0][0]) +" has already been submitted !")
- raise Exception , "Validation Error."
+ frappe.throw(_("Installation Note {0} has already been submitted").format(submit_in[0][0]))
def cancel_packing_slips(self):
"""
@@ -228,7 +215,7 @@
for r in res:
ps = frappe.get_doc('Packing Slip', r[0])
ps.cancel()
- frappe.msgprint(_("Packing Slip(s) Cancelled"))
+ frappe.msgprint(_("Packing Slip(s) cancelled"))
def update_stock_ledger(self):
@@ -293,8 +280,7 @@
si.run_method("onload_post_render")
if len(si.get("entries")) == 0:
- frappe.msgprint(_("All these items have already been invoiced."),
- raise_exception=True)
+ frappe.throw(_("All these items have already been invoiced"))
def update_item(source_doc, target_doc, source_parent):
target_doc.qty = source_doc.qty - invoiced_qty_map.get(source_doc.name, 0)
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 1bdab9e..45c571c 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -18,13 +18,13 @@
from frappe.model.naming import make_autoname
self.item_code = make_autoname(self.naming_series+'.#####')
elif not self.item_code:
- msgprint(_("Item Code (item_code) is mandatory because Item naming is not sequential."), raise_exception=1)
+ msgprint(_("Item Code is mandatory because Item is not automatically numbered"), raise_exception=1)
self.name = self.item_code
def validate(self):
if not self.stock_uom:
- msgprint(_("Please enter Default Unit of Measure"), raise_exception=1)
+ msgprint(_("Please enter default Unit of Measure"), raise_exception=1)
self.check_warehouse_is_set_for_stock_item()
self.check_stock_uom_with_bin()
@@ -51,7 +51,7 @@
def check_warehouse_is_set_for_stock_item(self):
if self.is_stock_item=="Yes" and not self.default_warehouse:
- frappe.msgprint(_("Default Warehouse is mandatory for Stock Item."),
+ frappe.msgprint(_("Default Warehouse is mandatory for stock Item."),
raise_exception=WarehouseNotSet)
def add_default_uom_in_conversion_factor_table(self):
@@ -97,17 +97,12 @@
check_list = []
for d in self.get('uom_conversion_details'):
if cstr(d.uom) in check_list:
- msgprint(_("UOM %s has been entered more than once in Conversion Factor Table." %
- cstr(d.uom)), raise_exception=1)
+ frappe.throw(_("Unit of Measure {0} has been entered more than once in Conversion Factor Table").format(d.uom))
else:
check_list.append(cstr(d.uom))
if d.uom and cstr(d.uom) == cstr(self.stock_uom) and flt(d.conversion_factor) != 1:
- msgprint(_("""Conversion Factor of UOM: %s should be equal to 1. As UOM: %s is Stock UOM of Item: %s.""" %
- (d.uom, d.uom, self.name)), raise_exception=1)
- elif d.uom and cstr(d.uom)!= self.stock_uom and flt(d.conversion_factor) == 1:
- msgprint(_("""Conversion Factor of UOM: %s should not be equal to 1. As UOM: %s is not Stock UOM of Item: %s""" %
- (d.uom, d.uom, self.name)), raise_exception=1)
+ frappe.throw(_("Conversion factor for default Unit of Measure must be 1 in row {0}").format(d.idx))
def validate_item_type(self):
if cstr(self.is_manufactured_item) == "No":
@@ -118,7 +113,7 @@
it must be a stock item."))
if self.has_serial_no == 'Yes' and self.is_stock_item == 'No':
- msgprint("'Has Serial No' can not be 'Yes' for non-stock item", raise_exception=1)
+ msgprint(_("'Has Serial No' can not be 'Yes' for non-stock item"), raise_exception=1)
def check_for_active_boms(self):
if self.is_purchase_item != "Yes":
@@ -153,10 +148,10 @@
account_type = frappe.db.get_value("Account", d.tax_type, "account_type")
if account_type not in ['Tax', 'Chargeable', 'Income Account', 'Expense Account']:
- msgprint("'%s' is not Tax / Chargeable / Income / Expense Account" % d.tax_type, raise_exception=1)
+ frappe.throw(_("Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable").format(d.idx))
else:
if d.tax_type in check_list:
- msgprint("Rate is entered twice for: '%s'" % d.tax_type, raise_exception=1)
+ frappe.throw(_("{0} entered twice in Item Tax").format(d.tax_type))
else:
check_list.append(d.tax_type)
@@ -165,8 +160,7 @@
duplicate = frappe.db.sql("""select name from tabItem where barcode = %s
and name != %s""", (self.barcode, self.name))
if duplicate:
- msgprint("Barcode: %s already used in item: %s" %
- (self.barcode, cstr(duplicate[0][0])), raise_exception = 1)
+ frappe.throw(_("Barcode {0} already used in Item {1}").format(self.barcode, duplicate[0][0]))
def cant_change(self):
if not self.get("__islocal"):
@@ -182,8 +176,7 @@
def validate_item_type_for_reorder(self):
if self.re_order_level or len(self.get("item_reorder", {"material_request_type": "Purchase"})):
if not self.is_purchase_item:
- frappe.msgprint(_("""To set reorder level, item must be Purchase Item"""),
- raise_exception=1)
+ frappe.throw(_("""To set reorder level, item must be Purchase Item"""))
def check_if_sle_exists(self):
sle = frappe.db.sql("""select name from `tabStock Ledger Entry`
@@ -193,9 +186,7 @@
def validate_name_with_item_group(self):
# causes problem with tree build
if frappe.db.exists("Item Group", self.name):
- frappe.msgprint("An item group exists with same name (%s), \
- please change the item name or rename the item group" %
- self.name, raise_exception=1)
+ frappe.throw(_("An Item Group exists with same name, please change the item name or rename the item group"))
def update_item_price(self):
frappe.db.sql("""update `tabItem Price` set item_name=%s,
@@ -269,14 +260,7 @@
end_of_life = frappe.db.get_value("Item", item_code, "end_of_life")
if end_of_life and getdate(end_of_life) <= now_datetime().date():
- msg = (_("Item") + " %(item_code)s: " + _("reached its end of life on") + \
- " %(date)s. " + _("Please check") + ": %(end_of_life_label)s " + \
- "in Item master") % {
- "item_code": item_code,
- "date": formatdate(end_of_life),
- "end_of_life_label": frappe.get_meta("Item").get_label("end_of_life")
- }
-
+ msg = _("Item {0} has reached its end of life on {1}").format(item_code, formatdate(end_of_life))
_msgprint(msg, verbose)
def validate_is_stock_item(item_code, is_stock_item=None, verbose=1):
@@ -284,9 +268,7 @@
is_stock_item = frappe.db.get_value("Item", item_code, "is_stock_item")
if is_stock_item != "Yes":
- msg = (_("Item") + " %(item_code)s: " + _("is not a Stock Item")) % {
- "item_code": item_code,
- }
+ msg = _("Item {0} is not a stock Item").format(item_code)
_msgprint(msg, verbose)
@@ -295,10 +277,7 @@
docstatus = frappe.db.get_value("Item", item_code, "docstatus")
if docstatus == 2:
- msg = (_("Item") + " %(item_code)s: " + _("is a cancelled Item")) % {
- "item_code": item_code,
- }
-
+ msg = _("Item {0} is cancelled").format(item_code)
_msgprint(msg, verbose)
def _msgprint(msg, verbose):
diff --git a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
index e7cb410..b1a67e2 100644
--- a/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
+++ b/erpnext/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
@@ -9,20 +9,20 @@
from frappe.model.document import Document
class LandedCostWizard(Document):
-
+
def update_landed_cost(self):
"""
- Add extra cost and recalculate all values in pr,
+ Add extra cost and recalculate all values in pr,
Recalculate valuation rate in all sle after pr posting date
"""
- purchase_receipts = [row.purchase_receipt for row in
+ purchase_receipts = [row.purchase_receipt for row in
self.get("lc_pr_details")]
-
+
self.validate_purchase_receipts(purchase_receipts)
self.cancel_pr(purchase_receipts)
self.add_charges_in_pr(purchase_receipts)
self.submit_pr(purchase_receipts)
- msgprint("Landed Cost updated successfully")
+ msgprint(_("Landed Cost updated successfully"))
def validate_purchase_receipts(self, purchase_receipts):
for pr in purchase_receipts:
@@ -32,21 +32,21 @@
def add_charges_in_pr(self, purchase_receipts):
""" Add additional charges in selected pr proportionately"""
total_amt = self.get_total_pr_amt(purchase_receipts)
-
+
for pr in purchase_receipts:
pr_doc = frappe.get_doc('Purchase Receipt', pr)
pr_items = pr_doc.get("purchase_tax_details")
-
+
for lc in self.get("landed_cost_details"):
amt = flt(lc.amount) * flt(pr_doc.net_total)/ flt(total_amt)
-
+
matched_row = pr_doc.get("other_charges", {
"category": "Valuation",
"add_deduct_tax": "Add",
"charge_type": "Actual",
"account_head": lc.account_head
})
-
+
if not matched_row: # add if not exists
ch = pr_doc.append("other_charges")
ch.category = 'Valuation'
@@ -63,30 +63,30 @@
matched_row[0].rate = amt
matched_row[0].tax_amount = amt
matched_row[0].cost_center = lc.cost_center
-
+
pr_doc.run_method("validate")
for d in pr_doc.get_all_children():
d.db_update()
-
+
def get_total_pr_amt(self, purchase_receipts):
- return frappe.db.sql("""SELECT SUM(net_total) FROM `tabPurchase Receipt`
- WHERE name in (%s)""" % ', '.join(['%s']*len(purchase_receipts)),
+ return frappe.db.sql("""SELECT SUM(net_total) FROM `tabPurchase Receipt`
+ WHERE name in (%s)""" % ', '.join(['%s']*len(purchase_receipts)),
tuple(purchase_receipts))[0][0]
-
+
def cancel_pr(self, purchase_receipts):
for pr in purchase_receipts:
pr_doc = frappe.get_doc("Purchase Receipt", pr)
-
+
pr_doc.run_method("update_ordered_qty")
-
- frappe.db.sql("""delete from `tabStock Ledger Entry`
+
+ frappe.db.sql("""delete from `tabStock Ledger Entry`
where voucher_type='Purchase Receipt' and voucher_no=%s""", pr)
- frappe.db.sql("""delete from `tabGL Entry` where voucher_type='Purchase Receipt'
+ frappe.db.sql("""delete from `tabGL Entry` where voucher_type='Purchase Receipt'
and voucher_no=%s""", pr)
-
+
def submit_pr(self, purchase_receipts):
for pr in purchase_receipts:
pr_doc = frappe.get_doc("Purchase Receipt", pr)
pr_doc.run_method("update_ordered_qty")
pr_doc.run_method("update_stock")
- pr_doc.run_method("make_gl_entries")
\ No newline at end of file
+ pr_doc.run_method("make_gl_entries")
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 156751e..db97611 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -114,7 +114,7 @@
self.check_modified_date()
self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1)
frappe.db.set(self, 'status', cstr(status))
- msgprint(self.doctype + ": " + self.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status)))
+ frappe.msgprint(_("Status updated to {0}").format(_(status)))
def on_cancel(self):
# Step 1:=> Get Purchase Common Obj
diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.py b/erpnext/stock/doctype/packing_slip/packing_slip.py
index b4b64cd..e1a8f44 100644
--- a/erpnext/stock/doctype/packing_slip/packing_slip.py
+++ b/erpnext/stock/doctype/packing_slip/packing_slip.py
@@ -4,7 +4,7 @@
from __future__ import unicode_literals
import frappe
from frappe.utils import flt, cint
-from frappe import msgprint, _
+from frappe import _
from frappe.model.document import Document
@@ -32,12 +32,12 @@
Validates if delivery note has status as draft
"""
if cint(frappe.db.get_value("Delivery Note", self.delivery_note, "docstatus")) != 0:
- msgprint(_("""Invalid Delivery Note. Delivery Note should exist and should be in draft state. Please rectify and try again."""), raise_exception=1)
-
+ frappe.throw(_("Delivery Note {0} must not be submitted").format(self.delivery_note))
+
def validate_items_mandatory(self):
rows = [d.item_code for d in self.get("item_details")]
if not rows:
- frappe.msgprint(_("No Items to Pack"), raise_exception=1)
+ frappe.msgprint(_("No Items to pack"), raise_exception=1)
def validate_case_nos(self):
"""
@@ -50,8 +50,8 @@
elif self.from_case_no > self.to_case_no:
frappe.msgprint(_("'To Case No.' cannot be less than 'From Case No.'"),
raise_exception=1)
-
-
+
+
res = frappe.db.sql("""SELECT name FROM `tabPacking Slip`
WHERE delivery_note = %(delivery_note)s AND docstatus = 1 AND
(from_case_no BETWEEN %(from_case_no)s AND %(to_case_no)s
@@ -60,9 +60,7 @@
""", self.as_dict())
if res:
- frappe.msgprint(_("""Case No(s) already in use. Please rectify and try again.
- Recommended <b>From Case No. = %s</b>""") % self.get_recommended_case_no(),
- raise_exception=1)
+ frappe.throw(_("""Case No(s) already in use. Try from Case No {0}""").format(self.get_recommended_case_no()))
def validate_qty(self):
"""
@@ -85,13 +83,13 @@
* Item Quantity dict of current packing slip doc
* No. of Cases of this packing slip
"""
-
+
rows = [d.item_code for d in self.get("item_details")]
-
+
condition = ""
if rows:
condition = " and item_code in (%s)" % (", ".join(["%s"]*len(rows)))
-
+
# gets item code, qty per item code, latest packed qty per item code and stock uom
res = frappe.db.sql("""select item_code, ifnull(sum(qty), 0) as qty,
(select sum(ifnull(psi.qty, 0) * (abs(ps.to_case_no - ps.from_case_no) + 1))
@@ -100,7 +98,7 @@
and ps.delivery_note = dni.parent and psi.item_code=dni.item_code) as packed_qty,
stock_uom, item_name
from `tabDelivery Note Item` dni
- where parent=%s %s
+ where parent=%s %s
group by item_code""" % ("%s", condition),
tuple([self.delivery_note] + rows), as_dict=1)
@@ -117,12 +115,8 @@
item['recommended_qty'] = (flt(item['qty']) - flt(item['packed_qty'])) / no_of_cases
item['specified_qty'] = flt(ps_item_qty[item['item_code']])
if not item['packed_qty']: item['packed_qty'] = 0
-
- frappe.msgprint("""
- Invalid Quantity specified (%(specified_qty)s %(stock_uom)s).
- %(packed_qty)s out of %(qty)s %(stock_uom)s already packed for %(item_code)s.
- <b>Recommended quantity for %(item_code)s = %(recommended_qty)s
- %(stock_uom)s</b>""" % item, raise_exception=1)
+
+ frappe.throw(_("Quantity for Item {0} must be less than {1}").format(item.get("item_code"), item.get("recommended_qty")))
def update_item_details(self):
"""
@@ -132,9 +126,9 @@
self.from_case_no = self.get_recommended_case_no()
for d in self.get("item_details"):
- res = frappe.db.get_value("Item", d.item_code,
+ res = frappe.db.get_value("Item", d.item_code,
["net_weight", "weight_uom"], as_dict=True)
-
+
if res and len(res)>0:
d.net_weight = res["net_weight"]
d.weight_uom = res["weight_uom"]
@@ -146,12 +140,12 @@
"""
recommended_case_no = frappe.db.sql("""SELECT MAX(to_case_no) FROM `tabPacking Slip`
WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.as_dict())
-
+
return cint(recommended_case_no[0][0]) + 1
-
+
def get_items(self):
self.set("item_details", [])
-
+
dn_details = self.get_details_for_packing()[0]
for item in dn_details:
if flt(item.qty) > flt(item.packed_qty):
@@ -164,11 +158,11 @@
def item_details(doctype, txt, searchfield, start, page_len, filters):
from erpnext.controllers.queries import get_match_cond
- return frappe.db.sql("""select name, item_name, description from `tabItem`
- where name in ( select item_code FROM `tabDelivery Note Item`
- where parent= %s
- and ifnull(qty, 0) > ifnull(packed_qty, 0))
- and %s like "%s" %s
- limit %s, %s """ % ("%s", searchfield, "%s",
- get_match_cond(doctype), "%s", "%s"),
- (filters["delivery_note"], "%%%s%%" % txt, start, page_len))
\ No newline at end of file
+ return frappe.db.sql("""select name, item_name, description from `tabItem`
+ where name in ( select item_code FROM `tabDelivery Note Item`
+ where parent= %s
+ and ifnull(qty, 0) > ifnull(packed_qty, 0))
+ and %s like "%s" %s
+ limit %s, %s """ % ("%s", searchfield, "%s",
+ get_match_cond(doctype), "%s", "%s"),
+ (filters["delivery_note"], "%%%s%%" % txt, start, page_len))
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 7626112..fa3571f 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -6,7 +6,7 @@
from frappe.utils import cstr, flt, cint
-from frappe import msgprint, _
+from frappe import _
import frappe.defaults
from erpnext.stock.utils import update_bin
@@ -86,21 +86,18 @@
# Check Received Qty = Accepted Qty + Rejected Qty
if ((flt(d.qty) + flt(d.rejected_qty)) != flt(d.received_qty)):
-
- msgprint("Sum of Accepted Qty and Rejected Qty must be equal to Received quantity. Error for Item: " + cstr(d.item_code))
- raise Exception
+ frappe.throw(_("Accepted + Rejected Qty must be equal to Received quantity for Item {0}").format(d.item_code))
def validate_challan_no(self):
"Validate if same challan no exists for same supplier in a submitted purchase receipt"
if self.challan_no:
- exists = frappe.db.sql("""
+ exists = frappe.db.sql_list("""
SELECT name FROM `tabPurchase Receipt`
WHERE name!=%s AND supplier=%s AND challan_no=%s
AND docstatus=1""", (self.name, self.supplier, self.challan_no))
if exists:
- frappe.msgprint("Another Purchase Receipt using the same Challan No. already exists.\
- Please enter a valid Challan No.", raise_exception=1)
+ frappe.throw(_("Supplier delivery number duplicate in {0}").format(exists))
def validate_with_previous_doc(self):
super(PurchaseReceipt, self).validate_with_previous_doc(self.tname, {
@@ -129,8 +126,7 @@
if frappe.db.get_value("Buying Settings", None, "po_required") == 'Yes':
for d in self.get('purchase_receipt_details'):
if not d.prevdoc_docname:
- msgprint("Purchse Order No. required against item %s"%d.item_code)
- raise Exception
+ frappe.throw(_("Purchase Order number required for Item {0}").format(d.item_code))
def update_stock(self):
sl_entries = []
@@ -212,7 +208,7 @@
(d.item_code,), as_dict = 1)
ins_reqd = ins_reqd and ins_reqd[0]['inspection_required'] or 'No'
if ins_reqd == 'Yes' and not d.qa_no:
- msgprint("Item: " + d.item_code + " requires QA Inspection. Please enter QA No or report to authorized person to create Quality Inspection")
+ frappe.throw(_("Quality Inspection required for Item {0}").format(d.item_code))
# Check for Stopped status
def check_for_stopped_status(self, pc_obj):
@@ -251,9 +247,7 @@
where t1.name = t2.parent and t2.purchase_receipt = %s and t1.docstatus = 1""",
(self.name))
if submit_rv:
- msgprint("Purchase Invoice : " + cstr(self.submit_rv[0][0]) + " has already been submitted !")
- raise Exception , "Validation Error."
-
+ frappe.throw(_("Purchase Invoice {0} is already submitted").format(self.submit_rv[0][0]))
def on_cancel(self):
pc_obj = frappe.get_doc('Purchase Common')
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 9078655..37838ec 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -29,7 +29,7 @@
if self.get("__islocal") and self.warehouse:
frappe.throw(_("New Serial No cannot have Warehouse. Warehouse must be \
set by Stock Entry or Purchase Receipt"), SerialNoCannotCreateDirectError)
-
+
self.set_maintenance_status()
self.validate_warehouse()
self.validate_item()
@@ -38,28 +38,28 @@
def set_maintenance_status(self):
if not self.warranty_expiry_date and not self.amc_expiry_date:
self.maintenance_status = None
-
+
if self.warranty_expiry_date and self.warranty_expiry_date < nowdate():
self.maintenance_status = "Out of Warranty"
-
+
if self.amc_expiry_date and self.amc_expiry_date < nowdate():
self.maintenance_status = "Out of AMC"
-
+
if self.amc_expiry_date and self.amc_expiry_date >= nowdate():
self.maintenance_status = "Under AMC"
-
+
if self.warranty_expiry_date and self.warranty_expiry_date >= nowdate():
self.maintenance_status = "Under Warranty"
def validate_warehouse(self):
if not self.get("__islocal"):
- item_code, warehouse = frappe.db.get_value("Serial No",
+ item_code, warehouse = frappe.db.get_value("Serial No",
self.name, ["item_code", "warehouse"])
if item_code != self.item_code:
- frappe.throw(_("Item Code cannot be changed for Serial No."),
+ frappe.throw(_("Item Code cannot be changed for Serial No."),
SerialNoCannotCannotChangeError)
if not self.via_stock_ledger and warehouse != self.warehouse:
- frappe.throw(_("Warehouse cannot be changed for Serial No."),
+ frappe.throw(_("Warehouse cannot be changed for Serial No."),
SerialNoCannotCannotChangeError)
def validate_item(self):
@@ -69,17 +69,17 @@
item = frappe.get_doc("Item", self.item_code)
if item.has_serial_no!="Yes":
frappe.throw(_("Item must have 'Has Serial No' as 'Yes'") + ": " + self.item_code)
-
+
self.item_group = item.item_group
self.description = item.description
self.item_name = item.item_name
self.brand = item.brand
self.warranty_period = item.warranty_period
-
+
def set_status(self, last_sle):
if last_sle:
if last_sle.voucher_type == "Stock Entry":
- document_type = frappe.db.get_value("Stock Entry", last_sle.voucher_no,
+ document_type = frappe.db.get_value("Stock Entry", last_sle.voucher_no,
"purpose")
else:
document_type = last_sle.voucher_type
@@ -98,7 +98,7 @@
self.status = "Not Available"
else:
self.status = "Not Available"
-
+
def set_purchase_details(self, purchase_sle):
if purchase_sle:
self.purchase_document_type = purchase_sle.voucher_type
@@ -108,13 +108,13 @@
self.purchase_rate = purchase_sle.incoming_rate
if purchase_sle.voucher_type == "Purchase Receipt":
self.supplier, self.supplier_name = \
- frappe.db.get_value("Purchase Receipt", purchase_sle.voucher_no,
+ frappe.db.get_value("Purchase Receipt", purchase_sle.voucher_no,
["supplier", "supplier_name"])
else:
- for fieldname in ("purchase_document_type", "purchase_document_no",
+ for fieldname in ("purchase_document_type", "purchase_document_no",
"purchase_date", "purchase_time", "purchase_rate", "supplier", "supplier_name"):
self.set(fieldname, None)
-
+
def set_sales_details(self, delivery_sle):
if delivery_sle:
self.delivery_document_type = delivery_sle.voucher_type
@@ -122,70 +122,70 @@
self.delivery_date = delivery_sle.posting_date
self.delivery_time = delivery_sle.posting_time
self.customer, self.customer_name = \
- frappe.db.get_value(delivery_sle.voucher_type, delivery_sle.voucher_no,
+ frappe.db.get_value(delivery_sle.voucher_type, delivery_sle.voucher_no,
["customer", "customer_name"])
if self.warranty_period:
- self.warranty_expiry_date = add_days(cstr(delivery_sle.posting_date),
+ self.warranty_expiry_date = add_days(cstr(delivery_sle.posting_date),
cint(self.warranty_period))
else:
- for fieldname in ("delivery_document_type", "delivery_document_no",
- "delivery_date", "delivery_time", "customer", "customer_name",
+ for fieldname in ("delivery_document_type", "delivery_document_no",
+ "delivery_date", "delivery_time", "customer", "customer_name",
"warranty_expiry_date"):
self.set(fieldname, None)
-
+
def get_last_sle(self):
entries = {}
sle_dict = self.get_stock_ledger_entries()
if sle_dict:
if sle_dict.get("incoming", []):
entries["purchase_sle"] = sle_dict["incoming"][0]
-
+
if len(sle_dict.get("incoming", [])) - len(sle_dict.get("outgoing", [])) > 0:
entries["last_sle"] = sle_dict["incoming"][0]
else:
entries["last_sle"] = sle_dict["outgoing"][0]
entries["delivery_sle"] = sle_dict["outgoing"][0]
-
+
return entries
-
+
def get_stock_ledger_entries(self):
sle_dict = {}
- for sle in frappe.db.sql("""select * from `tabStock Ledger Entry`
- where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No'
- order by posting_date desc, posting_time desc, name desc""",
+ for sle in frappe.db.sql("""select * from `tabStock Ledger Entry`
+ where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No'
+ order by posting_date desc, posting_time desc, name desc""",
("%%%s%%" % self.name, self.item_code), as_dict=1):
if self.name.upper() in get_serial_nos(sle.serial_no):
if sle.actual_qty > 0:
sle_dict.setdefault("incoming", []).append(sle)
else:
sle_dict.setdefault("outgoing", []).append(sle)
-
+
return sle_dict
-
+
def on_trash(self):
if self.status == 'Delivered':
frappe.throw(_("Delivered Serial No ") + self.name + _(" can not be deleted"))
if self.warehouse:
frappe.throw(_("Cannot delete Serial No in warehouse. \
First remove from warehouse, then delete.") + ": " + self.name)
-
+
def before_rename(self, old, new, merge=False):
if merge:
frappe.throw(_("Sorry, Serial Nos cannot be merged"))
-
+
def after_rename(self, old, new, merge=False):
"""rename serial_no text fields"""
- for dt in frappe.db.sql("""select parent from tabDocField
+ for dt in frappe.db.sql("""select parent from tabDocField
where fieldname='serial_no' and fieldtype='Text'"""):
-
- for item in frappe.db.sql("""select name, serial_no from `tab%s`
+
+ for item in frappe.db.sql("""select name, serial_no from `tab%s`
where serial_no like '%%%s%%'""" % (dt[0], old)):
-
+
serial_nos = map(lambda i: i==old and new or i, item[1].split('\n'))
- frappe.db.sql("""update `tab%s` set serial_no = %s
+ frappe.db.sql("""update `tab%s` set serial_no = %s
where name=%s""" % (dt[0], '%s', '%s'),
('\n'.join(serial_nos), item[0]))
-
+
def on_stock_ledger_entry(self):
if self.via_stock_ledger and not self.get("__islocal"):
last_sle = self.get_last_sle()
@@ -193,7 +193,7 @@
self.set_purchase_details(last_sle.get("purchase_sle"))
self.set_sales_details(last_sle.get("delivery_sle"))
self.set_maintenance_status()
-
+
def on_communication(self):
return
@@ -201,11 +201,11 @@
item_det = get_item_details(sle.item_code)
validate_serial_no(sle, item_det)
update_serial_nos(sle, item_det)
-
+
def validate_serial_no(sle, item_det):
if item_det.has_serial_no=="No":
if sle.serial_no:
- frappe.throw(_("Serial Number should be blank for Non Serialized Item" + ": "
+ frappe.throw(_("Serial Number should be blank for Non Serialized Item" + ": "
+ sle.item_code), SerialNoNotRequiredError)
else:
if sle.serial_no:
@@ -216,41 +216,41 @@
if len(serial_nos) and len(serial_nos) != abs(cint(sle.actual_qty)):
frappe.throw(_("Serial Nos do not match with qty") + \
(": %s (%s)" % (sle.item_code, sle.actual_qty)), SerialNoQtyError)
-
+
if len(serial_nos) != len(set(serial_nos)):
- frappe.throw(_("Duplicate Serial No entered against item") +
+ frappe.throw(_("Duplicate Serial No entered against item") +
(": %s" % sle.item_code), SerialNoDuplicateError)
-
+
for serial_no in serial_nos:
if frappe.db.exists("Serial No", serial_no):
sr = frappe.get_doc("Serial No", serial_no)
-
+
if sr.item_code!=sle.item_code:
- frappe.throw(_("Serial No does not belong to Item") +
+ frappe.throw(_("Serial No does not belong to Item") +
(": %s (%s)" % (sle.item_code, serial_no)), SerialNoItemError)
-
+
if sr.warehouse and sle.actual_qty > 0:
- frappe.throw(_("Same Serial No") + ": " + sr.name +
+ frappe.throw(_("Same Serial No") + ": " + sr.name +
_(" can not be received twice"), SerialNoDuplicateError)
-
+
if sle.actual_qty < 0:
if sr.warehouse!=sle.warehouse:
- frappe.throw(_("Serial No") + ": " + serial_no +
- _(" does not belong to Warehouse") + ": " + sle.warehouse,
+ frappe.throw(_("Serial No") + ": " + serial_no +
+ _(" does not belong to Warehouse") + ": " + sle.warehouse,
SerialNoWarehouseError)
-
+
if sle.voucher_type in ("Delivery Note", "Sales Invoice") \
and sr.status != "Available":
- frappe.throw(_("Serial No status must be 'Available' to Deliver")
+ frappe.throw(_("Serial No status must be 'Available' to Deliver")
+ ": " + serial_no, SerialNoStatusError)
elif sle.actual_qty < 0:
# transfer out
frappe.throw(_("Serial No must exist to transfer out.") + \
": " + serial_no, SerialNoNotExistsError)
elif sle.actual_qty < 0 or not item_det.serial_no_series:
- frappe.throw(_("Serial Number Required for Serialized Item" + ": "
+ frappe.throw(_("Serial Number Required for Serialized Item" + ": "
+ sle.item_code), SerialNoRequiredError)
-
+
def update_serial_nos(sle, item_det):
if sle.is_cancelled == "No" and not sle.serial_no and sle.actual_qty > 0 and item_det.serial_no_series:
from frappe.model.naming import make_autoname
@@ -258,7 +258,7 @@
for i in xrange(cint(sle.actual_qty)):
serial_nos.append(make_autoname(item_det.serial_no_series))
frappe.db.set(sle, "serial_no", "\n".join(serial_nos))
-
+
if sle.serial_no:
serial_nos = get_serial_nos(sle.serial_no)
for serial_no in serial_nos:
@@ -271,12 +271,12 @@
make_serial_no(serial_no, sle)
def get_item_details(item_code):
- return frappe.db.sql("""select name, has_batch_no, docstatus,
- is_stock_item, has_serial_no, serial_no_series
+ return frappe.db.sql("""select name, has_batch_no, docstatus,
+ is_stock_item, has_serial_no, serial_no_series
from tabItem where name=%s""", item_code, as_dict=True)[0]
-
+
def get_serial_nos(serial_no):
- return [s.strip() for s in cstr(serial_no).strip().upper().replace(',', '\n').split('\n')
+ return [s.strip() for s in cstr(serial_no).strip().upper().replace(',', '\n').split('\n')
if s.strip()]
def make_serial_no(serial_no, sle):
@@ -290,14 +290,14 @@
sr.warehouse = sle.warehouse
sr.status = "Available"
sr.save()
- frappe.msgprint(_("Serial No created") + ": " + sr.name)
+ frappe.msgprint(_("Serial No {0} created").format(sr.name))
return sr.name
-
+
def update_serial_nos_after_submit(controller, parentfield):
stock_ledger_entries = frappe.db.sql("""select voucher_detail_no, serial_no
- from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
+ from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
(controller.doctype, controller.name), as_dict=True)
-
+
if not stock_ledger_entries: return
for d in controller.get(parentfield):
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index cb130b2..dfa2c62 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -7,7 +7,7 @@
from frappe.utils import cstr, cint, flt, comma_or, nowdate
-from frappe import msgprint, _
+from frappe import _
from erpnext.stock.utils import get_incoming_rate
from erpnext.stock.stock_ledger import get_previous_sle
from erpnext.controllers.queries import get_match_cond
@@ -67,15 +67,13 @@
valid_purposes = ["Material Issue", "Material Receipt", "Material Transfer",
"Manufacture/Repack", "Subcontract", "Sales Return", "Purchase Return"]
if self.purpose not in valid_purposes:
- msgprint(_("Purpose must be one of ") + comma_or(valid_purposes),
- raise_exception=True)
+ frappe.throw(_("Purpose must be one of {0}").format(comma_or(valid_purposes)))
def validate_item(self):
stock_items = self.get_stock_items()
for item in self.get("mtn_details"):
if item.item_code not in stock_items:
- msgprint(_("""Only Stock Items are allowed for Stock Entry"""),
- raise_exception=True)
+ frappe.throw(_("""Only Stock Items are allowed for Stock Entry"""))
def validate_warehouse(self, pro_obj):
"""perform various (sometimes conditional) validations on warehouse"""
@@ -100,15 +98,13 @@
d.t_warehouse = self.to_warehouse
if not (d.s_warehouse or d.t_warehouse):
- msgprint(_("Atleast one warehouse is mandatory"), raise_exception=1)
+ frappe.throw(_("Atleast one warehouse is mandatory"))
if self.purpose in source_mandatory and not d.s_warehouse:
- msgprint(_("Row # ") + "%s: " % cint(d.idx)
- + _("Source Warehouse") + _(" is mandatory"), raise_exception=1)
+ frappe.throw(_("Source warehouse is mandatory for row {0}").format(d.idx))
if self.purpose in target_mandatory and not d.t_warehouse:
- msgprint(_("Row # ") + "%s: " % cint(d.idx)
- + _("Target Warehouse") + _(" is mandatory"), raise_exception=1)
+ frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx))
if self.purpose == "Manufacture/Repack":
if validate_for_manufacture_repack:
@@ -116,23 +112,18 @@
d.s_warehouse = None
if not d.t_warehouse:
- msgprint(_("Row # ") + "%s: " % cint(d.idx)
- + _("Target Warehouse") + _(" is mandatory"), raise_exception=1)
+ frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx))
elif pro_obj and cstr(d.t_warehouse) != pro_obj.fg_warehouse:
- msgprint(_("Row # ") + "%s: " % cint(d.idx)
- + _("Target Warehouse") + _(" should be same as that in ")
- + _("Production Order"), raise_exception=1)
+ frappe.throw(_("Target warehouse in row {0} must be same as Production Order").format(d.idx))
else:
d.t_warehouse = None
if not d.s_warehouse:
- msgprint(_("Row # ") + "%s: " % cint(d.idx)
- + _("Source Warehouse") + _(" is mandatory"), raise_exception=1)
+ frappe.throw(_("Source warehouse is mandatory for row {0}").format(d.idx))
if cstr(d.s_warehouse) == cstr(d.t_warehouse):
- msgprint(_("Source and Target Warehouse cannot be same"),
- raise_exception=1)
+ frappe.throw(_("Source and target warehouse cannot be same for row {0}").format(d.idx))
def validate_production_order(self, pro_obj=None):
if not pro_obj:
@@ -228,17 +219,13 @@
if d.bom_no and not frappe.db.sql("""select name from `tabBOM`
where item = %s and name = %s and docstatus = 1 and is_active = 1""",
(d.item_code, d.bom_no)):
- msgprint(_("Item") + " %s: " % cstr(d.item_code)
- + _("does not belong to BOM: ") + cstr(d.bom_no)
- + _(" or the BOM is cancelled or inactive"), raise_exception=1)
+ frappe.throw(_("BOM {0} is not submitted or inactive BOM for Item {1}").format(d.bom_no, d.item_code))
def validate_finished_goods(self):
"""validation: finished good quantity should be same as manufacturing quantity"""
- import json
for d in self.get('mtn_details'):
if d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty):
- msgprint(_("Row #") + " %s: " % d.idx
- + _("Quantity should be equal to Manufacturing Quantity. To fetch items again, click on 'Get Items' button or update the Quantity manually."), raise_exception=1)
+ frappe.throw(_("Quantity in row {0} must be same as manufactured quantity").format(d.idx))
def validate_return_reference_doc(self):
"""validate item with reference doc"""
@@ -247,14 +234,12 @@
if ref.doc:
# validate docstatus
if ref.doc.docstatus != 1:
- frappe.msgprint(_(ref.doc.doctype) + ' "' + ref.doc.name + '": '
- + _("Status should be Submitted"), raise_exception=frappe.InvalidStatusError)
+ frappe.throw(_("{0} {1} must be submitted").format(ref.doc.doctype, ref.doc.name),
+ frappe.InvalidStatusError)
# update stock check
if ref.doc.doctype == "Sales Invoice" and cint(ref.doc.update_stock) != 1:
- frappe.msgprint(_(ref.doc.doctype) + ' "' + ref.doc.name + '": '
- + _("Update Stock should be checked."),
- raise_exception=NotUpdateStockError)
+ frappe.throw(_("'Update Stock' for Sales Invoice {0} must be set").format(ref.doc.name), NotUpdateStockError)
# posting date check
ref_posting_datetime = "%s %s" % (cstr(ref.doc.posting_date),
@@ -263,9 +248,7 @@
cstr(self.posting_time))
if this_posting_datetime < ref_posting_datetime:
from frappe.utils.dateutils import datetime_in_user_format
- frappe.msgprint(_("Posting Date Time cannot be before")
- + ": " + datetime_in_user_format(ref_posting_datetime),
- raise_exception=True)
+ frappe.throw(_("Posting timestamp must be after {0}").format(datetime_in_user_format(ref_posting_datetime)))
stock_items = get_stock_items_for_return(ref.doc, ref.parentfields)
already_returned_item_qty = self.get_already_returned_item_qty(ref.fieldname)
@@ -273,9 +256,8 @@
for item in self.get("mtn_details"):
# validate if item exists in the ref doc and that it is a stock item
if item.item_code not in stock_items:
- msgprint(_("Item") + ': "' + item.item_code + _("\" does not exist in ") +
- ref.doc.doctype + ": " + ref.doc.name,
- raise_exception=frappe.DoesNotExistError)
+ frappe.throw(_("Item {0} does not exist in {1} {2}").format(item.item_code, ref.doc.doctype, ref.doc.name),
+ frappe.DoesNotExistError)
# validate quantity <= ref item's qty - qty already returned
ref_item = ref.doc.getone({"item_code": item.item_code})
@@ -328,12 +310,10 @@
def update_production_order(self):
def _validate_production_order(pro_doc):
if flt(pro_doc.docstatus) != 1:
- frappe.throw(_("Production Order must be submitted") + ": " +
- self.production_order)
+ frappe.throw(_("Production Order {0} must be submitted").format(self.production_order))
if pro_doc.status == 'Stopped':
- msgprint(_("Transaction not allowed against stopped Production Order") + ": " +
- self.production_order)
+ frappe.throw(_("Transaction not allowed against stopped Production Order {0}").format(self.production_order))
if self.production_order:
pro_doc = frappe.get_doc("Production Order", self.production_order)
@@ -372,7 +352,7 @@
where name = %s and (ifnull(end_of_life,'')='' or end_of_life > now())""",
(arg.get('item_code')), as_dict = 1)
if not item:
- msgprint("Item is not active", raise_exception=1)
+ frappe.throw(_("Item {0} is not active or end of life has been reached").format(arg.get("item_code")))
ret = {
'uom' : item and item[0]['stock_uom'] or '',
@@ -398,8 +378,7 @@
uom = frappe.db.sql("""select conversion_factor from `tabUOM Conversion Detail`
where parent = %s and uom = %s""", (arg['item_code'], arg['uom']), as_dict = 1)
if not uom or not flt(uom[0].conversion_factor):
- msgprint("There is no Conversion Factor for UOM '%s' in Item '%s'" % (arg['uom'],
- arg['item_code']))
+ frappe.msgprint(_("UOM coversion factor required for UOM {0} in Item {1}").format(arg["uom"], arg["item_code"]))
ret = {'uom' : ''}
else:
ret = {
@@ -531,12 +510,10 @@
# show some message
if not len(item_dict):
- frappe.msgprint(_("""All items have already been transferred \
- for this Production Order."""))
+ frappe.msgprint(_("""All items have already been transferred for this Production Order."""))
elif only_pending_fetched:
- frappe.msgprint(_("""Only quantities pending to be transferred \
- were fetched for the following items:\n""" + "\n".join(only_pending_fetched)))
+ frappe.msgprint(_("Pending Items {0} updated").format(only_pending_fetched))
return item_dict
@@ -589,10 +566,8 @@
{"name": item.material_request_item, "parent": item.material_request},
["item_code", "warehouse", "idx"], as_dict=True)
if mreq_item.item_code != item.item_code or mreq_item.warehouse != item.t_warehouse:
- msgprint(_("Row #") + (" %d: " % item.idx) + _("does not match")
- + " " + _("Row #") + (" %d %s " % (mreq_item.idx, _("of")))
- + _("Material Request") + (" - %s" % item.material_request),
- raise_exception=frappe.MappingMismatchError)
+ frappe.throw(_("Item or Warehouse for row {0} does not match Material Request").format(item.idx),
+ frappe.MappingMismatchError)
@frappe.whitelist()
def get_party_details(ref_dt, ref_dn):
diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py
index 34558fb..3717bf1 100644
--- a/erpnext/stock/stock_ledger.py
+++ b/erpnext/stock/stock_ledger.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe
-from frappe import msgprint
+from frappe import _
from frappe.utils import cint, flt, cstr, now
from erpnext.stock.utils import get_valuation_method
import json
@@ -309,17 +309,11 @@
def _raise_exceptions(args, verbose=1):
deficiency = min(e["diff"] for e in _exceptions)
- msg = """Negative stock error:
- Cannot complete this transaction because stock will start
- becoming negative (%s) for Item <b>%s</b> in Warehouse
- <b>%s</b> on <b>%s %s</b> in Transaction %s %s.
- Total Quantity Deficiency: <b>%s</b>""" % \
- (_exceptions[0]["diff"], args.get("item_code"), args.get("warehouse"),
- _exceptions[0]["posting_date"], _exceptions[0]["posting_time"],
- _exceptions[0]["voucher_type"], _exceptions[0]["voucher_no"],
- abs(deficiency))
+ msg = _("Negative Stock Error ({6}) for Item {0} in Warehouse {1} on {2} {3} in {4} {5}").format(args["item_code"],
+ args.get("warehouse"), _exceptions[0]["posting_date"], _exceptions[0]["posting_time"],
+ _(_exceptions[0]["voucher_type"]), _exceptions[0]["voucher_no"], deficiency)
if verbose:
- msgprint(msg, raise_exception=NegativeStockError)
+ frappe.throw(msg, NegativeStockError)
else:
raise NegativeStockError, msg
diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py
index bce94f3..1c5458e 100644
--- a/erpnext/stock/utils.py
+++ b/erpnext/stock/utils.py
@@ -2,7 +2,7 @@
# License: GNU General Public License v3. See license.txt
import frappe
-from frappe import msgprint, _
+from frappe import _
import json
from frappe.utils import flt, cstr, nowdate, add_days, cint
from frappe.defaults import get_global_default
@@ -58,8 +58,7 @@
bin.update_stock(args)
return bin
else:
- msgprint("[Stock Update] Ignored %s since it is not a stock item"
- % args.get("item_code"))
+ frappe.msgprint(_("Item {0} ignored since it is not a stock item").format(args.get("item_code")))
def get_incoming_rate(args):
"""Get Incoming Rate based on valuation method"""
@@ -134,22 +133,20 @@
if val:
val = val.strip()
if val in valid_serial_nos:
- msgprint("You have entered duplicate serial no: '%s'" % val, raise_exception=1)
+ frappe.throw(_("Serial number {0} entered more than once").format(val))
else:
valid_serial_nos.append(val)
if qty and len(valid_serial_nos) != abs(qty):
- msgprint("Please enter serial nos for "
- + cstr(abs(qty)) + " quantity against item code: " + item_code,
- raise_exception=1)
+ frappe.throw(_("{0} valid serial nos for Item {1}").format(abs(qty), item_code))
return valid_serial_nos
def validate_warehouse_company(warehouse, company):
warehouse_company = frappe.db.get_value("Warehouse", warehouse, "company")
if warehouse_company and warehouse_company != company:
- frappe.msgprint(_("Warehouse does not belong to company.") + " (" + \
- warehouse + ", " + company +")", raise_exception=InvalidWarehouseCompany)
+ frappe.throw(_("Warehouse {0} does not belong to company {1}").format(warehouse, company),
+ InvalidWarehouseCompany)
def get_sales_bom_buying_amount(item_code, warehouse, voucher_type, voucher_no, voucher_detail_no,
stock_ledger_entries, item_sales_bom):