more message fixes
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 59637a5..502a484 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe
-from frappe.utils import flt, fmt_money, cstr, cint
+from frappe.utils import flt, cstr, cint
from frappe import msgprint, throw, _
from frappe.model.document import Document
@@ -16,8 +16,8 @@
def get_address(self):
return {'address': frappe.db.get_value(self.master_type, self.master_name, "address")}
-
- def validate(self):
+
+ def validate(self):
self.validate_master_name()
self.validate_parent()
self.validate_duplicate_account()
@@ -25,18 +25,18 @@
self.validate_mandatory()
self.validate_warehouse_account()
self.validate_frozen_accounts_modifier()
-
+
def validate_master_name(self):
if self.master_type in ('Customer', 'Supplier') or self.account_type == "Warehouse":
if not self.master_name:
msgprint(_("Please enter Master Name once the account is created."))
elif not frappe.db.exists(self.master_type or self.account_type, self.master_name):
throw(_("Invalid Master Name"))
-
+
def validate_parent(self):
"""Fetch Parent Details and validation for account not to be created under ledger"""
if self.parent_account:
- par = frappe.db.get_value("Account", self.parent_account,
+ par = frappe.db.get_value("Account", self.parent_account,
["name", "group_or_ledger", "report_type"], as_dict=1)
if not par:
throw(_("Parent account does not exists"))
@@ -44,46 +44,36 @@
throw(_("You can not assign itself as parent account"))
elif par["group_or_ledger"] != 'Group':
throw(_("Parent account can not be a ledger"))
-
+
if par["report_type"]:
self.report_type = par["report_type"]
-
+
def validate_duplicate_account(self):
if self.get('__islocal') or not self.name:
company_abbr = frappe.db.get_value("Company", self.company, "abbr")
if frappe.db.exists("Account", (self.account_name + " - " + company_abbr)):
- throw("{name}: {acc_name} {exist}, {rename}".format(**{
- "name": _("Account Name"),
- "acc_name": self.account_name,
- "exist": _("already exists"),
- "rename": _("please rename")
- }))
-
+ throw(_("Account {0} already exists").format(self.account_name))
+
def validate_root_details(self):
#does not exists parent
if frappe.db.exists("Account", self.name):
if not frappe.db.get_value("Account", self.name, "parent_account"):
throw(_("Root cannot be edited."))
-
+
def validate_frozen_accounts_modifier(self):
old_value = frappe.db.get_value("Account", self.name, "freeze_account")
if old_value and old_value != self.freeze_account:
- frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,
+ frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,
'frozen_accounts_modifier')
if not frozen_accounts_modifier or \
frozen_accounts_modifier not in frappe.user.get_roles():
throw(_("You are not authorized to set Frozen value"))
-
+
def convert_group_to_ledger(self):
if self.check_if_child_exists():
- throw("{acc}: {account_name} {child}. {msg}".format(**{
- "acc": _("Account"),
- "account_name": self.name,
- "child": _("has existing child"),
- "msg": _("You can not convert this account to ledger")
- }))
+ throw(_("Account with child nodes cannot be converted to ledger"))
elif self.check_gle_exists():
- throw(_("Account with existing transaction can not be converted to ledger."))
+ throw(_("Account with existing transaction cannot be converted to ledger"))
else:
self.group_or_ledger = 'Ledger'
self.save()
@@ -104,17 +94,17 @@
return frappe.db.get_value("GL Entry", {"account": self.name})
def check_if_child_exists(self):
- return frappe.db.sql("""select name from `tabAccount` where parent_account = %s
+ return frappe.db.sql("""select name from `tabAccount` where parent_account = %s
and docstatus != 2""", self.name)
-
+
def validate_mandatory(self):
if not self.report_type:
throw(_("Report Type is mandatory"))
-
+
def validate_warehouse_account(self):
if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
return
-
+
if self.account_type == "Warehouse":
old_warehouse = cstr(frappe.db.get_value("Account", self.name, "master_name"))
if old_warehouse != cstr(self.master_name):
@@ -124,10 +114,10 @@
self.validate_warehouse(self.master_name)
else:
throw(_("Master Name is mandatory if account type is Warehouse"))
-
+
def validate_warehouse(self, warehouse):
if frappe.db.get_value("Stock Ledger Entry", {"warehouse": warehouse}):
- throw(_("Stock transactions exist against warehouse ") + warehouse +
+ throw(_("Stock transactions exist against warehouse ") + warehouse +
_(" .You can not assign / modify / remove Master Name"))
def update_nsm_model(self):
@@ -135,73 +125,67 @@
import frappe
import frappe.utils.nestedset
frappe.utils.nestedset.update_nsm(self)
-
+
def on_update(self):
- self.update_nsm_model()
+ self.update_nsm_model()
def get_authorized_user(self):
# Check logged-in user is authorized
if frappe.db.get_value('Accounts Settings', None, 'credit_controller') \
in frappe.user.get_roles():
return 1
-
+
def check_credit_limit(self, total_outstanding):
# Get credit limit
credit_limit_from = 'Customer'
- cr_limit = frappe.db.sql("""select t1.credit_limit from tabCustomer t1, `tabAccount` t2
+ cr_limit = frappe.db.sql("""select t1.credit_limit from tabCustomer t1, `tabAccount` t2
where t2.name=%s and t1.name = t2.master_name""", self.name)
credit_limit = cr_limit and flt(cr_limit[0][0]) or 0
if not credit_limit:
credit_limit = frappe.db.get_value('Company', self.company, 'credit_limit')
credit_limit_from = 'Company'
-
+
# If outstanding greater than credit limit and not authorized person raise exception
if credit_limit > 0 and flt(total_outstanding) > credit_limit \
and not self.get_authorized_user():
- throw("""Total Outstanding amount (%s) for <b>%s</b> can not be \
- greater than credit limit (%s). To change your credit limit settings, \
- please update in the <b>%s</b> master""" % (fmt_money(total_outstanding),
- self.name, fmt_money(credit_limit), credit_limit_from))
-
+ throw(_("{0} Credit limit {0} crossed").format(_(credit_limit_from), credit_limit))
+
def validate_trash(self):
"""checks gl entries and if child exists"""
if not self.parent_account:
throw(_("Root account can not be deleted"))
-
+
if self.check_gle_exists():
- throw("""Account with existing transaction (Sales Invoice / Purchase Invoice / \
- Journal Voucher) can not be deleted""")
+ throw(_("Account with existing transaction can not be deleted"))
if self.check_if_child_exists():
throw(_("Child account exists for this account. You can not delete this account."))
- def on_trash(self):
+ def on_trash(self):
self.validate_trash()
self.update_nsm_model()
-
+
def before_rename(self, old, new, merge=False):
# Add company abbr if not provided
from erpnext.setup.doctype.company.company import get_name_with_abbr
new_account = get_name_with_abbr(new, self.company)
-
+
# Validate properties before merging
if merge:
if not frappe.db.exists("Account", new):
throw(_("Account ") + new +_(" does not exists"))
-
- val = list(frappe.db.get_value("Account", new_account,
+
+ val = list(frappe.db.get_value("Account", new_account,
["group_or_ledger", "report_type", "company"]))
-
+
if val != [self.group_or_ledger, self.report_type, self.company]:
- throw(_("""Merging is only possible if following \
- properties are same in both records.
- Group or Ledger, Report Type, Company"""))
-
+ throw(_("""Merging is only possible if following properties are same in both records. Group or Ledger, Report Type, Company"""))
+
return new_account
def after_rename(self, old, new, merge=False):
if not merge:
- frappe.db.set_value("Account", new, "account_name",
+ frappe.db.set_value("Account", new, "account_name",
" - ".join(new.split(" - ")[:-1]))
else:
from frappe.utils.nestedset import rebuild_tree
@@ -209,15 +193,15 @@
def get_master_name(doctype, txt, searchfield, start, page_len, filters):
conditions = (" and company='%s'"% filters["company"].replace("'", "\'")) if doctype == "Warehouse" else ""
-
+
return frappe.db.sql("""select name from `tab%s` where %s like %s %s
order by name limit %s, %s""" %
- (filters["master_type"], searchfield, "%s", conditions, "%s", "%s"),
+ (filters["master_type"], searchfield, "%s", conditions, "%s", "%s"),
("%%%s%%" % txt, start, page_len), as_list=1)
-
+
def get_parent_account(doctype, txt, searchfield, start, page_len, filters):
- return frappe.db.sql("""select name from tabAccount
+ return frappe.db.sql("""select name from tabAccount
where group_or_ledger = 'Group' and docstatus != 2 and company = %s
- and %s like %s order by name limit %s, %s""" %
- ("%s", searchfield, "%s", "%s", "%s"),
- (filters["company"], "%%%s%%" % txt, start, page_len), as_list=1)
\ No newline at end of file
+ and %s like %s order by name limit %s, %s""" %
+ ("%s", searchfield, "%s", "%s", "%s"),
+ (filters["company"], "%%%s%%" % txt, start, page_len), as_list=1)
diff --git a/erpnext/accounts/doctype/c_form/c_form.py b/erpnext/accounts/doctype/c_form/c_form.py
index 95e2e40..11d0547 100644
--- a/erpnext/accounts/doctype/c_form/c_form.py
+++ b/erpnext/accounts/doctype/c_form/c_form.py
@@ -9,46 +9,42 @@
class CForm(Document):
def validate(self):
- """Validate invoice that c-form is applicable
+ """Validate invoice that c-form is applicable
and no other c-form is received for that"""
for d in self.get('invoice_details'):
if d.invoice_no:
inv = frappe.db.sql("""select c_form_applicable, c_form_no from
`tabSales Invoice` where name = %s and docstatus = 1""", d.invoice_no)
-
- if not inv:
- frappe.throw("""Invoice: %s is not exists in the system or
- is not submitted, please check.""" % d.invoice_no)
-
- elif inv[0][0] != 'Yes':
+
+ if inv[0][0] != 'Yes':
frappe.throw("C-form is not applicable for Invoice: %s" % d.invoice_no)
-
+
elif inv[0][1] and inv[0][1] != self.name:
frappe.throw("""Invoice %s is tagged in another C-form: %s.
If you want to change C-form no for this invoice,
- please remove invoice no from the previous c-form and then try again""" %
+ please remove invoice no from the previous c-form and then try again""" %
(d.invoice_no, inv[0][1]))
def on_update(self):
""" Update C-Form No on invoices"""
self.set_total_invoiced_amount()
-
+
def on_submit(self):
self.set_cform_in_sales_invoices()
-
+
def before_cancel(self):
# remove cform reference
frappe.db.sql("""update `tabSales Invoice` set c_form_no=null where c_form_no=%s""", self.name)
-
+
def set_cform_in_sales_invoices(self):
inv = [d.invoice_no for d in self.get('invoice_details')]
if inv:
- frappe.db.sql("""update `tabSales Invoice` set c_form_no=%s, modified=%s where name in (%s)""" %
+ frappe.db.sql("""update `tabSales Invoice` set c_form_no=%s, modified=%s where name in (%s)""" %
('%s', '%s', ', '.join(['%s'] * len(inv))), tuple([self.name, self.modified] + inv))
-
- frappe.db.sql("""update `tabSales Invoice` set c_form_no = null, modified = %s
- where name not in (%s) and ifnull(c_form_no, '') = %s""" %
+
+ frappe.db.sql("""update `tabSales Invoice` set c_form_no = null, modified = %s
+ where name not in (%s) and ifnull(c_form_no, '') = %s""" %
('%s', ', '.join(['%s']*len(inv)), '%s'), tuple([self.modified] + inv + [self.name]))
else:
frappe.throw(_("Please enter atleast 1 invoice in the table"))
@@ -60,7 +56,7 @@
def get_invoice_details(self, invoice_no):
""" Pull details from invoices for referrence """
- inv = frappe.db.get_value("Sales Invoice", invoice_no,
+ inv = frappe.db.get_value("Sales Invoice", invoice_no,
["posting_date", "territory", "net_total", "grand_total"], as_dict=True)
return {
'invoice_date' : inv.posting_date,
@@ -72,9 +68,9 @@
def get_invoice_nos(doctype, txt, searchfield, start, page_len, filters):
from erpnext.utilities import build_filter_conditions
conditions, filter_values = build_filter_conditions(filters)
-
- return frappe.db.sql("""select name from `tabSales Invoice` where docstatus = 1
- and c_form_applicable = 'Yes' and ifnull(c_form_no, '') = '' %s
- and %s like %s order by name limit %s, %s""" %
- (conditions, searchfield, "%s", "%s", "%s"),
- tuple(filter_values + ["%%%s%%" % txt, start, page_len]))
\ No newline at end of file
+
+ return frappe.db.sql("""select name from `tabSales Invoice` where docstatus = 1
+ and c_form_applicable = 'Yes' and ifnull(c_form_no, '') = '' %s
+ and %s like %s order by name limit %s, %s""" %
+ (conditions, searchfield, "%s", "%s", "%s"),
+ tuple(filter_values + ["%%%s%%" % txt, start, page_len]))
diff --git a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
index 33e0495..b70c1dd 100644
--- a/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
+++ b/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py
@@ -8,13 +8,13 @@
def execute(filters=None):
if not filters: filters = {}
-
+
columns = get_columns()
entries = get_entries(filters)
invoice_posting_date_map = get_invoice_posting_date_map(filters)
against_date = ""
outstanding_amount = 0.0
-
+
data = []
for d in entries:
if d.against_voucher:
@@ -23,67 +23,66 @@
else:
against_date = d.against_invoice and invoice_posting_date_map[d.against_invoice] or ""
outstanding_amount = d.credit or -1*d.debit
-
- row = [d.name, d.account, d.posting_date, d.against_voucher or d.against_invoice,
+
+ row = [d.name, d.account, d.posting_date, d.against_voucher or d.against_invoice,
against_date, d.debit, d.credit, d.cheque_no, d.cheque_date, d.remark]
-
+
if d.against_voucher or d.against_invoice:
row += get_ageing_data(d.posting_date, against_date, outstanding_amount)
else:
row += ["", "", "", "", ""]
-
+
data.append(row)
-
+
return columns, data
-
+
def get_columns():
- return ["Journal Voucher:Link/Journal Voucher:140", "Account:Link/Account:140",
- "Posting Date:Date:100", "Against Invoice:Link/Purchase Invoice:130",
- "Against Invoice Posting Date:Date:130", "Debit:Currency:120", "Credit:Currency:120",
- "Reference No::100", "Reference Date:Date:100", "Remarks::150", "Age:Int:40",
+ return ["Journal Voucher:Link/Journal Voucher:140", "Account:Link/Account:140",
+ "Posting Date:Date:100", "Against Invoice:Link/Purchase Invoice:130",
+ "Against Invoice Posting Date:Date:130", "Debit:Currency:120", "Credit:Currency:120",
+ "Reference No::100", "Reference Date:Date:100", "Remarks::150", "Age:Int:40",
"0-30:Currency:100", "30-60:Currency:100", "60-90:Currency:100", "90-Above:Currency:100"
]
def get_conditions(filters):
conditions = ""
party_accounts = []
-
+
if filters.get("account"):
party_accounts = [filters["account"]]
else:
- cond = filters.get("company") and (" and company = '%s'" %
+ cond = filters.get("company") and (" and company = '%s'" %
filters["company"].replace("'", "\'")) or ""
-
+
if filters.get("payment_type") == "Incoming":
cond += " and master_type = 'Customer'"
else:
cond += " and master_type = 'Supplier'"
- party_accounts = frappe.db.sql_list("""select name from `tabAccount`
+ party_accounts = frappe.db.sql_list("""select name from `tabAccount`
where ifnull(master_name, '')!='' and docstatus < 2 %s""" % cond)
-
+
if party_accounts:
conditions += " and jvd.account in (%s)" % (", ".join(['%s']*len(party_accounts)))
else:
- msgprint(_("No Customer or Supplier Accounts found. Accounts are identified based on \
- 'Master Type' value in account record."), raise_exception=1)
-
+ msgprint(_("No Customer or Supplier Accounts found"), raise_exception=1)
+
if filters.get("from_date"): conditions += " and jv.posting_date >= '%s'" % filters["from_date"]
if filters.get("to_date"): conditions += " and jv.posting_date <= '%s'" % filters["to_date"]
return conditions, party_accounts
-
+
def get_entries(filters):
conditions, party_accounts = get_conditions(filters)
- entries = frappe.db.sql("""select jv.name, jvd.account, jv.posting_date,
- jvd.against_voucher, jvd.against_invoice, jvd.debit, jvd.credit,
- jv.cheque_no, jv.cheque_date, jv.remark
- from `tabJournal Voucher Detail` jvd, `tabJournal Voucher` jv
- where jvd.parent = jv.name and jv.docstatus=1 %s order by jv.name DESC""" %
+ entries = frappe.db.sql("""select jv.name, jvd.account, jv.posting_date,
+ jvd.against_voucher, jvd.against_invoice, jvd.debit, jvd.credit,
+ jv.cheque_no, jv.cheque_date, jv.remark
+ from `tabJournal Voucher Detail` jvd, `tabJournal Voucher` jv
+ where jvd.parent = jv.name and jv.docstatus=1 %s order by jv.name DESC""" %
(conditions), tuple(party_accounts), as_dict=1)
-
+
return entries
-
+
def get_invoice_posting_date_map(filters):
invoice_posting_date_map = {}
if filters.get("payment_type") == "Incoming":
@@ -93,4 +92,4 @@
for t in frappe.db.sql("""select name, posting_date from `tabPurchase Invoice`"""):
invoice_posting_date_map[t[0]] = t[1]
- return invoice_posting_date_map
\ No newline at end of file
+ return invoice_posting_date_map
diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.py b/erpnext/buying/doctype/purchase_common/purchase_common.py
index 1addb42..94e8ea3 100644
--- a/erpnext/buying/doctype/purchase_common/purchase_common.py
+++ b/erpnext/buying/doctype/purchase_common/purchase_common.py
@@ -147,7 +147,7 @@
stopped = frappe.db.sql("""select name from `tab%s` where name = %s and
status = 'Stopped'""" % (doctype, '%s'), docname)
if stopped:
- frappe.throw("{0} {1} status is 'Stopped'".format(doctype, docname), frappe.InvalidStatusError)
+ frappe.throw(_("{0} {1} status is 'Stopped'").format(doctype, docname), frappe.InvalidStatusError)
def check_docstatus(self, check, doctype, docname, detail_doctype = ''):
if check == 'Next':
diff --git a/erpnext/hr/doctype/employee/employee.js b/erpnext/hr/doctype/employee/employee.js
index e91435e..49914d2 100644
--- a/erpnext/hr/doctype/employee/employee.js
+++ b/erpnext/hr/doctype/employee/employee.js
@@ -9,23 +9,23 @@
this.frm.fields_dict.reports_to.get_query = function(doc, cdt, cdn) {
return { query: "erpnext.controllers.queries.employee_query"} }
},
-
+
onload: function() {
this.setup_leave_approver_select();
this.frm.toggle_display(["esic_card_no", "gratuity_lic_id", "pan_number", "pf_number"],
frappe.boot.sysdefaults.country==="India");
if(this.frm.doc.__islocal) this.frm.set_value("employee_name", "");
},
-
+
refresh: function() {
var me = this;
erpnext.hide_naming_series();
- if(!this.frm.doc.__islocal) {
+ if(!this.frm.doc.__islocal) {
cur_frm.add_custom_button(__('Make Salary Structure'), function() {
me.make_salary_structure(this); });
}
},
-
+
setup_leave_approver_select: function() {
var me = this;
return this.frm.call({
@@ -33,21 +33,21 @@
callback: function(r) {
var df = frappe.meta.get_docfield("Employee Leave Approver", "leave_approver",
me.frm.doc.name);
- df.options = $.map(r.message, function(user) {
- return {value: user, label: frappe.user_info(user).fullname};
+ df.options = $.map(r.message, function(user) {
+ return {value: user, label: frappe.user_info(user).fullname};
});
me.frm.fields_dict.employee_leave_approvers.refresh();
}
});
},
-
+
date_of_birth: function() {
return cur_frm.call({
method: "get_retirement_date",
args: {date_of_birth: this.frm.doc.date_of_birth}
});
},
-
+
salutation: function() {
if(this.frm.doc.salutation) {
this.frm.set_value("gender", {
@@ -56,16 +56,12 @@
}[this.frm.doc.salutation]);
}
},
-
+
make_salary_structure: function(btn) {
var me = this;
this.validate_salary_structure(btn, function(r) {
if(r.message) {
- msgprint(__("Employee {0}:\
- An active Salary Structure already exists. \
- If you want to create new one, please ensure that no active \
- Salary Structure exists for this Employee. \
- Go to the active Salary Structure and set \"Is Active\" = \"No\"", [me.frm.doc.name]));
+ msgprint(__("Active Salary Sructure already exists for Employee {0}", [me.frm.doc.name]));
} else if(!r.exc) {
frappe.model.map({
source: me.frm.doc,
@@ -74,7 +70,7 @@
}
});
},
-
+
validate_salary_structure: function(btn, callback) {
var me = this;
return this.frm.call({
diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.py b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
index 912f8f0..32cfd86 100755
--- a/erpnext/hr/doctype/leave_allocation/leave_allocation.py
+++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.py
@@ -63,7 +63,7 @@
cf = cf and cint(cf[0][0]) or 0
if not cf:
frappe.db.set(self,'carry_forward',0)
- frappe.throw("Cannot carry forward {0}".format(self.leave_type))
+ frappe.throw(_("Cannot carry forward {0}").format(self.leave_type))
def get_carry_forwarded_leaves(self):
if self.carry_forward:
diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py
index 1262911..f7084ef 100755
--- a/erpnext/hr/doctype/leave_application/leave_application.py
+++ b/erpnext/hr/doctype/leave_application/leave_application.py
@@ -144,8 +144,7 @@
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" %
- (self.leave_type, max_days))
+ frappe.throw(_("Leave of type {0} cannot be longer than {1}").format(self.leave_type, max_days))
def validate_leave_approver(self):
employee = frappe.get_doc("Employee", self.employee)
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index 12733e3..9912252 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -130,7 +130,7 @@
(self.month, self.fiscal_year, self.employee, self.name))
if ret_exist:
self.employee = ''
- frappe.throw("Salary Slip of employee {0} already created for this month".format(self.employee))
+ 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
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index 78270e5..edcb25d 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -5,7 +5,7 @@
import frappe
from frappe.utils import cstr, flt, nowdate
-from frappe import msgprint, _
+from frappe import _
class OverProductionError(frappe.ValidationError): pass
@@ -34,9 +34,7 @@
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
- or for some other item.""" % cstr(self.bom_no))
+ frappe.throw(_("BOM {0} is not active or not submitted").format(self.bom_no))
def validate_sales_order(self):
if self.sales_order:
@@ -44,7 +42,7 @@
where name=%s and docstatus = 1""", self.sales_order, as_dict=1)[0]
if not so.name:
- frappe.throw("Sales Order: %s is not valid" % self.sales_order)
+ frappe.throw(_("Sales Order {0} is not valid") % self.sales_order)
if not self.expected_delivery_date:
self.expected_delivery_date = so.delivery_date
@@ -115,8 +113,7 @@
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.
- Hence can not be cancelled.""" % stock_entry[0][0])
+ frappe.throw(_("Cannot cancel because submitted Stock Entry {0} exists").format(stock_entry[0][0]))
frappe.db.set(self,'status', 'Cancelled')
self.update_planned_qty(-self.qty)
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 5556fbe..1e75319 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -152,21 +152,17 @@
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" %
- (d.item_code, d.idx))
+ frappe.throw(_("Please enter Planned Qty for Item {0} at row {1}").format(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" %
- (d.item_code, d.idx))
+ frappe.throw(_("Please enter BOM for Item {0} at row {1}").format(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""",
(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""" %
- (d.bom_no, d.item_doce, d.idx))
+ frappe.throw(_("Incorrect or Inactive BOM {0} for Item {1} at row {2}").format(d.bom_no, d.item_code, d.idx))
def raise_production_order(self):
"""It will raise production order (Draft) for all distinct FG items"""
diff --git a/erpnext/public/js/transaction.js b/erpnext/public/js/transaction.js
index f76bbe0..5d43ad4 100644
--- a/erpnext/public/js/transaction.js
+++ b/erpnext/public/js/transaction.js
@@ -10,7 +10,7 @@
if(this.frm.doc.__islocal) {
var today = get_today(),
currency = frappe.defaults.get_user_default("currency");
-
+
$.each({
posting_date: today,
due_date: today,
@@ -24,18 +24,18 @@
}, function(fieldname, value) {
if(me.frm.fields_dict[fieldname] && !me.frm.doc[fieldname])
me.frm.set_value(fieldname, value);
- });
+ });
}
if(this.other_fname) {
this[this.other_fname + "_remove"] = this.calculate_taxes_and_totals;
}
-
+
if(this.fname) {
this[this.fname + "_remove"] = this.calculate_taxes_and_totals;
}
},
-
+
onload_post_render: function() {
var me = this;
if(this.frm.doc.__islocal && this.frm.doc.company && !this.frm.doc.is_pos) {
@@ -55,7 +55,7 @@
}
}
},
-
+
refresh: function() {
this.frm.clear_custom_buttons();
erpnext.hide_naming_series();
@@ -77,7 +77,7 @@
icon = "icon-file-text";
}
var me = this;
-
+
this.$pos_btn = this.frm.appframe.add_button(btn_label, function() {
me.toggle_pos();
}, icon);
@@ -87,7 +87,7 @@
// Check whether it is Selling or Buying cycle
var price_list = frappe.meta.has_field(cur_frm.doc.doctype, "selling_price_list") ?
this.frm.doc.selling_price_list : this.frm.doc.buying_price_list;
-
+
if (!price_list)
msgprint(__("Please select Price List"))
else {
@@ -109,8 +109,8 @@
this.frm.refresh();
}
},
-
-
+
+
item_code: function(doc, cdt, cdn) {
var me = this;
var item = frappe.get_doc(cdt, cdn);
@@ -152,7 +152,7 @@
});
}
}
- },
+ },
serial_no: function(doc, cdt, cdn) {
var me = this;
@@ -169,7 +169,7 @@
var serial_nos = item.serial_no.trim().replace(/,/g, '\n');
serial_nos = serial_nos.trim().split('\n');
-
+
// Trim each string and push unique string to new list
for (var x=0; x<=serial_nos.length - 1; x++) {
if (serial_nos[x].trim() != "" && sr_no.indexOf(serial_nos[x].trim()) == -1) {
@@ -187,18 +187,18 @@
}
}
},
-
+
validate: function() {
this.calculate_taxes_and_totals();
},
-
+
company: function() {
if(this.frm.doc.company && this.frm.fields_dict.currency) {
var company_currency = this.get_company_currency();
if (!this.frm.doc.currency) {
this.frm.set_value("currency", company_currency);
}
-
+
if (this.frm.doc.currency == company_currency) {
this.frm.set_value("conversion_rate", 1.0);
}
@@ -209,27 +209,27 @@
this.frm.script_manager.trigger("currency");
}
},
-
+
get_company_currency: function() {
return erpnext.get_currency(this.frm.doc.company);
},
-
+
currency: function() {
var me = this;
this.set_dynamic_labels();
var company_currency = this.get_company_currency();
if(this.frm.doc.currency !== company_currency) {
- this.get_exchange_rate(this.frm.doc.currency, company_currency,
+ this.get_exchange_rate(this.frm.doc.currency, company_currency,
function(exchange_rate) {
me.frm.set_value("conversion_rate", exchange_rate);
me.conversion_rate();
});
} else {
- this.conversion_rate();
+ this.conversion_rate();
}
},
-
+
conversion_rate: function() {
if(this.frm.doc.currency === this.get_company_currency()) {
this.frm.set_value("conversion_rate", 1.0);
@@ -240,14 +240,14 @@
}
if(flt(this.frm.doc.conversion_rate)>0.0) this.calculate_taxes_and_totals();
},
-
+
get_price_list_currency: function(buying_or_selling) {
var me = this;
var fieldname = buying_or_selling.toLowerCase() + "_price_list";
if(this.frm.doc[fieldname]) {
return this.frm.call({
method: "erpnext.setup.utils.get_price_list_currency",
- args: {
+ args: {
price_list: this.frm.doc[fieldname],
},
callback: function(r) {
@@ -258,7 +258,7 @@
});
}
},
-
+
get_exchange_rate: function(from_currency, to_currency, callback) {
var exchange_name = from_currency + "-" + to_currency;
frappe.model.with_doc("Currency Exchange", exchange_name, function(name) {
@@ -266,14 +266,14 @@
callback(exchange_doc ? flt(exchange_doc.exchange_rate) : 0);
});
},
-
+
price_list_currency: function() {
var me=this;
this.set_dynamic_labels();
-
+
var company_currency = this.get_company_currency();
if(this.frm.doc.price_list_currency !== company_currency) {
- this.get_exchange_rate(this.frm.doc.price_list_currency, company_currency,
+ this.get_exchange_rate(this.frm.doc.price_list_currency, company_currency,
function(exchange_rate) {
if(exchange_rate) {
me.frm.set_value("plc_conversion_rate", exchange_rate);
@@ -284,7 +284,7 @@
this.plc_conversion_rate();
}
},
-
+
plc_conversion_rate: function() {
if(this.frm.doc.price_list_currency === this.get_company_currency()) {
this.frm.set_value("plc_conversion_rate", 1.0);
@@ -294,11 +294,11 @@
this.calculate_taxes_and_totals();
}
},
-
+
qty: function(doc, cdt, cdn) {
this.calculate_taxes_and_totals();
},
-
+
tax_rate: function(doc, cdt, cdn) {
this.calculate_taxes_and_totals();
},
@@ -314,30 +314,30 @@
throw e;
}
},
-
+
set_dynamic_labels: function() {
// What TODO? should we make price list system non-mandatory?
this.frm.toggle_reqd("plc_conversion_rate",
!!(this.frm.doc.price_list_name && this.frm.doc.price_list_currency));
-
+
var company_currency = this.get_company_currency();
this.change_form_labels(company_currency);
this.change_grid_labels(company_currency);
this.frm.refresh_fields();
},
-
+
recalculate: function() {
this.calculate_taxes_and_totals();
},
-
+
recalculate_values: function() {
this.calculate_taxes_and_totals();
},
-
+
calculate_charges: function() {
this.calculate_taxes_and_totals();
},
-
+
included_in_print_rate: function(doc, cdt, cdn) {
var tax = frappe.get_doc(cdt, cdn);
try {
@@ -350,52 +350,32 @@
throw e;
}
},
-
+
validate_on_previous_row: function(tax) {
// validate if a valid row id is mentioned in case of
// On Previous Row Amount and On Previous Row Total
- if(([__("On Previous Row Amount"), __("On Previous Row Total")].indexOf(tax.charge_type) != -1) &&
+ if((["On Previous Row Amount", "On Previous Row Total"].indexOf(tax.charge_type) != -1) &&
(!tax.row_id || cint(tax.row_id) >= tax.idx)) {
- var msg = repl(__("Row") + " # %(idx)s [%(doctype)s]: " +
- __("Please specify a valid") + " %(row_id_label)s", {
- idx: tax.idx,
- doctype: tax.doctype,
- row_id_label: frappe.meta.get_label(tax.doctype, "row_id", tax.name)
- });
+ var msg = __("Please specify a valid Row ID for row {0} in table {1}", [tax.idx, __(tax.doctype)])
frappe.throw(msg);
}
},
-
+
validate_inclusive_tax: function(tax) {
if(!this.frm.tax_doclist) this.frm.tax_doclist = this.get_tax_doclist();
-
+
var actual_type_error = function() {
- var msg = repl(__("For row") + " # %(idx)s [%(doctype)s]: " +
- "%(charge_type_label)s = \"%(charge_type)s\" " +
- __("cannot be included in Item's rate"), {
- idx: tax.idx,
- doctype: tax.doctype,
- charge_type_label: frappe.meta.get_label(tax.doctype, "charge_type", tax.name),
- charge_type: tax.charge_type
- });
+ var msg = __("Actual type tax cannot be included in Item rate in row {0}", [tax.idx])
frappe.throw(msg);
};
-
+
var on_previous_row_error = function(row_range) {
- var msg = repl(__("For row") + " # %(idx)s [%(doctype)s]: " +
- __("to be included in Item's rate, it is required that: ") +
- " [" + __("Row") + " # %(row_range)s] " + __("also be included in Item's rate"), {
- idx: tax.idx,
- doctype: tax.doctype,
- charge_type_label: frappe.meta.get_label(tax.doctype, "charge_type", tax.name),
- charge_type: tax.charge_type,
- inclusive_label: frappe.meta.get_label(tax.doctype, "included_in_print_rate", tax.name),
- row_range: row_range,
- });
-
+ var msg = __("For row {0} in {1}. To include {2} in Item rate, rows {3} must also be included",
+ [tax.idx, __(tax.doctype), tax.charge_type, row_range])
+
frappe.throw(msg);
};
-
+
if(cint(tax.included_in_print_rate)) {
if(tax.charge_type == "Actual") {
// inclusive tax cannot be of type Actual
@@ -405,7 +385,7 @@
// referred row should also be an inclusive tax
on_previous_row_error(tax.row_id);
} else if(tax.charge_type == "On Previous Row Total") {
- var taxes_not_included = $.map(this.frm.tax_doclist.slice(0, tax.row_id),
+ var taxes_not_included = $.map(this.frm.tax_doclist.slice(0, tax.row_id),
function(t) { return cint(t.included_in_print_rate) ? null : t; });
if(taxes_not_included.length > 0) {
// all rows above this tax should be inclusive
@@ -414,26 +394,26 @@
}
}
},
-
+
_load_item_tax_rate: function(item_tax_rate) {
return item_tax_rate ? JSON.parse(item_tax_rate) : {};
},
-
+
_get_tax_rate: function(tax, item_tax_map) {
return (keys(item_tax_map).indexOf(tax.account_head) != -1) ?
flt(item_tax_map[tax.account_head], precision("rate", tax)) :
tax.rate;
},
-
+
get_item_wise_taxes_html: function() {
var item_tax = {};
var tax_accounts = [];
var company_currency = this.get_company_currency();
-
+
$.each(this.get_tax_doclist(), function(i, tax) {
var tax_amount_precision = precision("tax_amount", tax);
var tax_rate_precision = precision("rate", tax);
- $.each(JSON.parse(tax.item_wise_tax_detail || '{}'),
+ $.each(JSON.parse(tax.item_wise_tax_detail || '{}'),
function(item_code, tax_data) {
if(!item_tax[item_code]) item_tax[item_code] = {};
if($.isArray(tax_data)) {
@@ -445,7 +425,7 @@
}
var tax_amount = format_currency(flt(tax_data[1], tax_amount_precision), company_currency,
tax_amount_precision);
-
+
item_tax[item_code][tax.name] = [tax_rate, tax_amount];
} else {
item_tax[item_code][tax.name] = [flt(tax_data, tax_rate_precision) + "%", ""];
@@ -453,10 +433,10 @@
});
tax_accounts.push([tax.name, tax.account_head]);
});
-
- var headings = $.map([__("Item Name")].concat($.map(tax_accounts, function(head) { return head[1]; })),
+
+ var headings = $.map([__("Item Name")].concat($.map(tax_accounts, function(head) { return head[1]; })),
function(head) { return '<th style="min-width: 100px;">' + (head || "") + "</th>" }).join("\n");
-
+
var distinct_item_names = [];
var distinct_items = [];
$.each(this.get_item_doclist(), function(i, item) {
@@ -465,7 +445,7 @@
distinct_items.push(item);
}
});
-
+
var rows = $.map(distinct_items, function(item) {
var item_tax_record = item_tax[item.item_code || item.item_name];
if(!item_tax_record) { return null; }
@@ -478,7 +458,7 @@
}).join("\n")
});
}).join("\n");
-
+
if(!rows) return "";
return '<p><a href="#" onclick="$(\'.tax-break-up\').toggleClass(\'hide\'); return false;">Show / Hide tax break-up</a><br><br></p>\
<div class="tax-break-up hide" style="overflow-x: auto;"><table class="table table-bordered table-hover">\
@@ -486,16 +466,16 @@
<tbody>' + rows + '</tbody> \
</table></div>';
},
-
+
validate_company_and_party: function() {
var me = this;
var valid = true;
-
+
$.each(["company", "customer"], function(i, fieldname) {
if(frappe.meta.has_field(me.frm.doc.doctype, fieldname)) {
if (!me.frm.doc[fieldname]) {
- msgprint(__("Please specify") + ": " +
- frappe.meta.get_label(me.frm.doc.doctype, fieldname, me.frm.doc.name) +
+ msgprint(__("Please specify") + ": " +
+ frappe.meta.get_label(me.frm.doc.doctype, fieldname, me.frm.doc.name) +
". " + __("It is needed to fetch Item Details."));
valid = false;
}
@@ -503,25 +483,25 @@
});
return valid;
},
-
+
get_item_doclist: function() {
return this.frm.doc[this.fname] || [];
},
-
+
get_tax_doclist: function() {
return this.frm.doc[this.other_fname] || [];
},
-
+
validate_conversion_rate: function() {
this.frm.doc.conversion_rate = flt(this.frm.doc.conversion_rate, precision("conversion_rate"));
- var conversion_rate_label = frappe.meta.get_label(this.frm.doc.doctype, "conversion_rate",
+ var conversion_rate_label = frappe.meta.get_label(this.frm.doc.doctype, "conversion_rate",
this.frm.doc.name);
var company_currency = this.get_company_currency();
-
+
if(!this.frm.doc.conversion_rate) {
- frappe.throw(repl('%(conversion_rate_label)s' +
- __(' is mandatory. Maybe Currency Exchange record is not created for ') +
- '%(from_currency)s' + __(" to ") + '%(to_currency)s',
+ frappe.throw(repl('%(conversion_rate_label)s' +
+ __(' is mandatory. Maybe Currency Exchange record is not created for ') +
+ '%(from_currency)s' + __(" to ") + '%(to_currency)s',
{
"conversion_rate_label": conversion_rate_label,
"from_currency": this.frm.doc.currency,
@@ -529,7 +509,7 @@
}));
}
},
-
+
calculate_taxes_and_totals: function() {
this.discount_amount_applied = false;
this._calculate_taxes_and_totals();
@@ -552,13 +532,13 @@
this.show_item_wise_taxes();
},
-
+
initialize_taxes: function() {
var me = this;
$.each(this.frm.tax_doclist, function(i, tax) {
tax.item_wise_tax_detail = {};
- tax_fields = ["total", "tax_amount_after_discount_amount",
+ tax_fields = ["total", "tax_amount_after_discount_amount",
"tax_amount_for_current_item", "grand_total_for_current_item",
"tax_fraction_for_current_item", "grand_total_fraction_for_current_item"]
@@ -566,17 +546,17 @@
tax_fields.push("tax_amount");
$.each(tax_fields, function(i, fieldname) { tax[fieldname] = 0.0 });
-
+
me.validate_on_previous_row(tax);
me.validate_inclusive_tax(tax);
frappe.model.round_floats_in(tax);
});
},
-
+
calculate_taxes: function() {
var me = this;
var actual_tax_dict = {};
-
+
// maintain actual tax rate based on idx
$.each(this.frm.tax_doclist, function(i, tax) {
if (tax.charge_type == "Actual") {
@@ -602,34 +582,34 @@
// store tax_amount for current item as it will be used for
// charge type = 'On Previous Row Amount'
tax.tax_amount_for_current_item = current_tax_amount;
-
+
// accumulate tax amount into tax.tax_amount
if (!me.discount_amount_applied)
tax.tax_amount += current_tax_amount;
tax.tax_amount_after_discount_amount += current_tax_amount;
-
+
// for buying
if(tax.category) {
// if just for valuation, do not add the tax amount in total
// hence, setting it as 0 for further steps
current_tax_amount = (tax.category == "Valuation") ? 0.0 : current_tax_amount;
-
+
current_tax_amount *= (tax.add_deduct_tax == "Deduct") ? -1.0 : 1.0;
}
-
+
// Calculate tax.total viz. grand total till that step
- // note: grand_total_for_current_item contains the contribution of
+ // note: grand_total_for_current_item contains the contribution of
// item's amount, previously applied tax and the current tax on that item
if(i==0) {
tax.grand_total_for_current_item = flt(item.base_amount + current_tax_amount,
precision("total", tax));
} else {
- tax.grand_total_for_current_item =
+ tax.grand_total_for_current_item =
flt(me.frm.tax_doclist[i-1].grand_total_for_current_item + current_tax_amount,
precision("total", tax));
}
-
+
// in tax.total, accumulate grand total for each item
tax.total += tax.grand_total_for_current_item;
@@ -648,54 +628,54 @@
round_off_totals: function(tax) {
tax.total = flt(tax.total, precision("total", tax));
tax.tax_amount = flt(tax.tax_amount, precision("tax_amount", tax));
- tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount,
+ tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount,
precision("tax_amount", tax));
},
adjust_discount_amount_loss: function(tax) {
var discount_amount_loss = this.frm.doc.grand_total - flt(this.frm.doc.discount_amount) - tax.total;
- tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount +
+ tax.tax_amount_after_discount_amount = flt(tax.tax_amount_after_discount_amount +
discount_amount_loss, precision("tax_amount", tax));
tax.total = flt(tax.total + discount_amount_loss, precision("total", tax));
},
-
+
get_current_tax_amount: function(item, tax, item_tax_map) {
var tax_rate = this._get_tax_rate(tax, item_tax_map);
var current_tax_amount = 0.0;
-
+
if(tax.charge_type == "Actual") {
// distribute the tax amount proportionally to each item row
var actual = flt(tax.rate, precision("tax_amount", tax));
current_tax_amount = this.frm.doc.net_total ?
((item.base_amount / this.frm.doc.net_total) * actual) :
0.0;
-
+
} else if(tax.charge_type == "On Net Total") {
current_tax_amount = (tax_rate / 100.0) * item.base_amount;
-
+
} else if(tax.charge_type == "On Previous Row Amount") {
current_tax_amount = (tax_rate / 100.0) *
this.frm.tax_doclist[cint(tax.row_id) - 1].tax_amount_for_current_item;
-
+
} else if(tax.charge_type == "On Previous Row Total") {
current_tax_amount = (tax_rate / 100.0) *
this.frm.tax_doclist[cint(tax.row_id) - 1].grand_total_for_current_item;
}
current_tax_amount = flt(current_tax_amount, precision("tax_amount", tax));
-
+
// store tax breakup for each item
tax.item_wise_tax_detail[item.item_code || item.item_name] = [tax_rate, current_tax_amount];
-
+
return current_tax_amount;
},
-
+
_cleanup: function() {
$.each(this.frm.tax_doclist, function(i, tax) {
$.each(["tax_amount_for_current_item", "grand_total_for_current_item",
- "tax_fraction_for_current_item", "grand_total_fraction_for_current_item"],
+ "tax_fraction_for_current_item", "grand_total_fraction_for_current_item"],
function(i, fieldname) { delete tax[fieldname]; });
-
+
tax.item_wise_tax_detail = JSON.stringify(tax.item_wise_tax_detail);
});
},
@@ -706,17 +686,17 @@
this.frm.doc.total_advance = flt(frappe.utils.sum(
$.map(advance_doclist, function(adv) { return adv.allocated_amount })
), precision("total_advance"));
-
+
this.calculate_outstanding_amount();
}
},
-
+
_set_in_company_currency: function(item, print_field, base_field) {
// set values in base currency
item[base_field] = flt(item[print_field] * this.frm.doc.conversion_rate,
precision(base_field, item));
},
-
+
get_terms: function() {
var me = this;
if(this.frm.doc.tc_name) {
@@ -752,4 +732,4 @@
.appendTo($(this.frm.fields_dict.other_charges_calculation.wrapper).empty());
}
},
-});
\ No newline at end of file
+});
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index b0cb540..9af6b86 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -27,7 +27,7 @@
def validate_values(self):
if frappe.defaults.get_global_default('cust_master_name') == 'Naming Series' and not self.naming_series:
- frappe.throw("Series is Mandatory.", frappe.MandatoryError)
+ frappe.throw(_("Series is mandatory"), frappe.MandatoryError)
def validate(self):
self.validate_values()
@@ -66,7 +66,7 @@
c.is_primary_contact = 1
try:
c.save()
- except NameError, e:
+ except NameError:
pass
def on_update(self):
@@ -86,7 +86,7 @@
def validate_name_with_customer_group(self):
if frappe.db.exists("Customer Group", self.name):
- frappe.throw("A Customer Group exists with same name please change the Customer name or rename the Customer Group")
+ frappe.throw(_("A Customer Group exists with same name please change the Customer name or rename the Customer Group"))
def delete_customer_address(self):
addresses = frappe.db.sql("""select name, lead from `tabAddress`
diff --git a/erpnext/selling/doctype/lead/lead.py b/erpnext/selling/doctype/lead/lead.py
index c400e55..5689d6d 100644
--- a/erpnext/selling/doctype/lead/lead.py
+++ b/erpnext/selling/doctype/lead/lead.py
@@ -27,11 +27,11 @@
self.set_status()
if self.source == 'Campaign' and not self.campaign_name and session['user'] != 'Guest':
- frappe.throw("Please specify campaign name")
+ frappe.throw(_("Campaign Name is required"))
if self.email_id:
if not validate_email_add(self.email_id):
- frappe.throw('Please enter valid email id.')
+ frappe.throw(_('{0} is not a valid email id').format(self.email_id))
def on_update(self):
self.check_email_id_is_unique()
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index d4054dd..0551aaa 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -145,7 +145,7 @@
if quotation:
doc = frappe.get_doc("Quotation", quotation)
if doc.docstatus==2:
- frappe.throw(quotation + ": " + frappe._("Quotation is cancelled."))
+ frappe.throw(_("Quotation {0} is cancelled").format(quotation))
doc.set_status(update=True)
diff --git a/erpnext/setup/doctype/customer_group/customer_group.py b/erpnext/setup/doctype/customer_group/customer_group.py
index 0eefebe..57f9197 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.py
+++ b/erpnext/setup/doctype/customer_group/customer_group.py
@@ -17,6 +17,4 @@
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") %
- self.name, raise_exception=1)
+ frappe.msgprint(_("An Customer exists with same name"), raise_exception=1)
diff --git a/erpnext/setup/doctype/features_setup/features_setup.json b/erpnext/setup/doctype/features_setup/features_setup.json
index 8122da0..fee7c17 100644
--- a/erpnext/setup/doctype/features_setup/features_setup.json
+++ b/erpnext/setup/doctype/features_setup/features_setup.json
@@ -1,241 +1,241 @@
{
- "creation": "2012-12-20 12:50:49.000000",
- "docstatus": 0,
- "doctype": "DocType",
+ "creation": "2012-12-20 12:50:49.000000",
+ "docstatus": 0,
+ "doctype": "DocType",
"fields": [
{
- "fieldname": "materials",
- "fieldtype": "Section Break",
- "label": "Materials",
+ "fieldname": "materials",
+ "fieldtype": "Section Break",
+ "label": "Materials",
"permlevel": 0
- },
+ },
{
- "description": "To track item in sales and purchase documents based on their serial nos. This is can also used to track warranty details of the product.",
- "fieldname": "fs_item_serial_nos",
- "fieldtype": "Check",
- "label": "Item Serial Nos",
+ "description": "To track item in sales and purchase documents based on their serial nos. This is can also used to track warranty details of the product.",
+ "fieldname": "fs_item_serial_nos",
+ "fieldtype": "Check",
+ "label": "Item Serial Nos",
"permlevel": 0
- },
+ },
{
- "description": "To track items in sales and purchase documents with batch nos<br><b>Preferred Industry: Chemicals etc</b>",
- "fieldname": "fs_item_batch_nos",
- "fieldtype": "Check",
- "label": "Item Batch Nos",
+ "description": "To track items in sales and purchase documents with batch nos<br><b>Preferred Industry: Chemicals etc</b>",
+ "fieldname": "fs_item_batch_nos",
+ "fieldtype": "Check",
+ "label": "Item Batch Nos",
"permlevel": 0
- },
+ },
{
- "description": "To track brand name in the following documents<br>\nDelivery Note, Enuiry, Material Request, Item, Purchase Order, Purchase Voucher, Purchaser Receipt, Quotation, Sales Invoice, Sales BOM, Sales Order, Serial No",
- "fieldname": "fs_brands",
- "fieldtype": "Check",
- "label": "Brands",
+ "description": "To track brand name in the following documents Delivery Note, Opportunity, Material Request, Item, Purchase Order, Purchase Voucher, Purchaser Receipt, Quotation, Sales Invoice, Sales BOM, Sales Order, Serial No",
+ "fieldname": "fs_brands",
+ "fieldtype": "Check",
+ "label": "Brands",
"permlevel": 0
- },
+ },
{
- "description": "To track items using barcode. You will be able to enter items in Delivery Note and Sales Invoice by scanning barcode of item.",
- "fieldname": "fs_item_barcode",
- "fieldtype": "Check",
- "label": "Item Barcode",
+ "description": "To track items using barcode. You will be able to enter items in Delivery Note and Sales Invoice by scanning barcode of item.",
+ "fieldname": "fs_item_barcode",
+ "fieldtype": "Check",
+ "label": "Item Barcode",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break0",
- "fieldtype": "Column Break",
+ "fieldname": "column_break0",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "description": "1. To maintain the customer wise item code and to make them searchable based on their code use this option",
- "fieldname": "fs_item_advanced",
- "fieldtype": "Check",
- "label": "Item Advanced",
+ "description": "1. To maintain the customer wise item code and to make them searchable based on their code use this option",
+ "fieldname": "fs_item_advanced",
+ "fieldtype": "Check",
+ "label": "Item Advanced",
"permlevel": 0
- },
+ },
{
- "description": "If Sale BOM is defined, the actual BOM of the Pack is displayed as table.\nAvailable in Delivery Note and Sales Order",
- "fieldname": "fs_packing_details",
- "fieldtype": "Check",
- "label": "Packing Details",
+ "description": "If Sale BOM is defined, the actual BOM of the Pack is displayed as table. Available in Delivery Note and Sales Order",
+ "fieldname": "fs_packing_details",
+ "fieldtype": "Check",
+ "label": "Packing Details",
"permlevel": 0
- },
+ },
{
- "description": "To get Item Group in details table",
- "fieldname": "fs_item_group_in_details",
- "fieldtype": "Check",
- "label": "Item Groups in Details",
+ "description": "To get Item Group in details table",
+ "fieldname": "fs_item_group_in_details",
+ "fieldtype": "Check",
+ "label": "Item Groups in Details",
"permlevel": 0
- },
+ },
{
- "fieldname": "sales_and_purchase",
- "fieldtype": "Section Break",
- "label": "Sales and Purchase",
+ "fieldname": "sales_and_purchase",
+ "fieldtype": "Section Break",
+ "label": "Sales and Purchase",
"permlevel": 0
- },
+ },
{
- "description": "All export related fields like currency, conversion rate, export total, export grand total etc are available in <br>\nDelivery Note, POS, Quotation, Sales Invoice, Sales Order etc.",
- "fieldname": "fs_exports",
- "fieldtype": "Check",
- "label": "Exports",
+ "description": "All export related fields like currency, conversion rate, export total, export grand total etc are available in Delivery Note, POS, Quotation, Sales Invoice, Sales Order etc.",
+ "fieldname": "fs_exports",
+ "fieldtype": "Check",
+ "label": "Exports",
"permlevel": 0
- },
+ },
{
- "description": "All import related fields like currency, conversion rate, import total, import grand total etc are available in <br>\nPurchase Receipt, Supplier Quotation, Purchase Invoice, Purchase Order etc.",
- "fieldname": "fs_imports",
- "fieldtype": "Check",
- "label": "Imports",
+ "description": "All import related fields like currency, conversion rate, import total, import grand total etc are available in Purchase Receipt, Supplier Quotation, Purchase Invoice, Purchase Order etc.",
+ "fieldname": "fs_imports",
+ "fieldtype": "Check",
+ "label": "Imports",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break1",
- "fieldtype": "Column Break",
+ "fieldname": "column_break1",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "description": "Field available in Delivery Note, Quotation, Sales Invoice, Sales Order",
- "fieldname": "fs_discounts",
- "fieldtype": "Check",
- "label": "Sales Discounts",
+ "description": "Field available in Delivery Note, Quotation, Sales Invoice, Sales Order",
+ "fieldname": "fs_discounts",
+ "fieldtype": "Check",
+ "label": "Sales Discounts",
"permlevel": 0
- },
+ },
{
- "description": "Discount Fields will be available in Purchase Order, Purchase Receipt, Purchase Invoice",
- "fieldname": "fs_purchase_discounts",
- "fieldtype": "Check",
- "label": "Purchase Discounts",
+ "description": "Discount Fields will be available in Purchase Order, Purchase Receipt, Purchase Invoice",
+ "fieldname": "fs_purchase_discounts",
+ "fieldtype": "Check",
+ "label": "Purchase Discounts",
"permlevel": 0
- },
+ },
{
- "description": "To track any installation or commissioning related work after sales",
- "fieldname": "fs_after_sales_installations",
- "fieldtype": "Check",
- "label": "After Sale Installations",
+ "description": "To track any installation or commissioning related work after sales",
+ "fieldname": "fs_after_sales_installations",
+ "fieldtype": "Check",
+ "label": "After Sale Installations",
"permlevel": 0
- },
+ },
{
- "description": "Available in \nBOM, Delivery Note, Purchase Invoice, Production Order, Purchase Order, Purchase Receipt, Sales Invoice, Sales Order, Stock Entry, Timesheet",
- "fieldname": "fs_projects",
- "fieldtype": "Check",
- "label": "Projects",
+ "description": "Available in BOM, Delivery Note, Purchase Invoice, Production Order, Purchase Order, Purchase Receipt, Sales Invoice, Sales Order, Stock Entry, Timesheet",
+ "fieldname": "fs_projects",
+ "fieldtype": "Check",
+ "label": "Projects",
"permlevel": 0
- },
+ },
{
- "description": "If you have Sales Team and Sale Partners (Channel Partners) they can be tagged and maintain their contribution in the sales activity",
- "fieldname": "fs_sales_extras",
- "fieldtype": "Check",
- "label": "Sales Extras",
+ "description": "If you have Sales Team and Sale Partners (Channel Partners) they can be tagged and maintain their contribution in the sales activity",
+ "fieldname": "fs_sales_extras",
+ "fieldtype": "Check",
+ "label": "Sales Extras",
"permlevel": 0
- },
+ },
{
- "fieldname": "accounts",
- "fieldtype": "Section Break",
- "label": "Accounts",
+ "fieldname": "accounts",
+ "fieldtype": "Section Break",
+ "label": "Accounts",
"permlevel": 0
- },
+ },
{
- "description": "Check if you need automatic recurring invoices. After submitting any sales invoice, Recurring section will be visible.",
- "fieldname": "fs_recurring_invoice",
- "fieldtype": "Check",
- "label": "Recurring Invoice",
+ "description": "Check if you need automatic recurring invoices. After submitting any sales invoice, Recurring section will be visible.",
+ "fieldname": "fs_recurring_invoice",
+ "fieldtype": "Check",
+ "label": "Recurring Invoice",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break2",
- "fieldtype": "Column Break",
+ "fieldname": "column_break2",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "description": "To enable <b>Point of Sale</b> features",
- "fieldname": "fs_pos",
- "fieldtype": "Check",
- "label": "Point of Sale",
+ "description": "To enable <b>Point of Sale</b> features",
+ "fieldname": "fs_pos",
+ "fieldtype": "Check",
+ "label": "Point of Sale",
"permlevel": 0
- },
+ },
{
- "description": "To enable <b>Point of Sale</b> view",
- "fieldname": "fs_pos_view",
- "fieldtype": "Check",
- "label": "POS View",
+ "description": "To enable <b>Point of Sale</b> view",
+ "fieldname": "fs_pos_view",
+ "fieldtype": "Check",
+ "label": "POS View",
"permlevel": 0
- },
+ },
{
- "fieldname": "production",
- "fieldtype": "Section Break",
- "label": "Manufacturing",
+ "fieldname": "production",
+ "fieldtype": "Section Break",
+ "label": "Manufacturing",
"permlevel": 0
- },
+ },
{
- "description": "If you involve in manufacturing activity<br>\nEnables item <b>Is Manufactured</b>",
- "fieldname": "fs_manufacturing",
- "fieldtype": "Check",
- "label": "Manufacturing",
+ "description": "If you involve in manufacturing activity. Enables Item 'Is Manufactured'",
+ "fieldname": "fs_manufacturing",
+ "fieldtype": "Check",
+ "label": "Manufacturing",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break3",
- "fieldtype": "Column Break",
+ "fieldname": "column_break3",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "description": "If you follow Quality Inspection<br>\nEnables item QA Required and QA No in Purchase Receipt",
- "fieldname": "fs_quality",
- "fieldtype": "Check",
- "label": "Quality",
+ "description": "If you follow Quality Inspection. Enables Item QA Required and QA No in Purchase Receipt",
+ "fieldname": "fs_quality",
+ "fieldtype": "Check",
+ "label": "Quality",
"permlevel": 0
- },
+ },
{
- "fieldname": "miscelleneous",
- "fieldtype": "Section Break",
- "label": "Miscelleneous",
+ "fieldname": "miscelleneous",
+ "fieldtype": "Section Break",
+ "label": "Miscelleneous",
"permlevel": 0
- },
+ },
{
- "description": "If you have long print formats, this feature can be used to split the page to be printed on multiple pages with all headers and footers on each page",
- "fieldname": "fs_page_break",
- "fieldtype": "Check",
- "label": "Page Break",
+ "description": "If you have long print formats, this feature can be used to split the page to be printed on multiple pages with all headers and footers on each page",
+ "fieldname": "fs_page_break",
+ "fieldtype": "Check",
+ "label": "Page Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "column_break4",
- "fieldtype": "Column Break",
+ "fieldname": "column_break4",
+ "fieldtype": "Column Break",
"permlevel": 0
- },
+ },
{
- "fieldname": "fs_more_info",
- "fieldtype": "Check",
- "label": "More Info",
+ "fieldname": "fs_more_info",
+ "fieldtype": "Check",
+ "label": "More Info",
"permlevel": 0
}
- ],
- "icon": "icon-glass",
- "idx": 1,
- "issingle": 1,
- "modified": "2013-12-24 11:40:19.000000",
- "modified_by": "Administrator",
- "module": "Setup",
- "name": "Features Setup",
- "name_case": "Title Case",
- "owner": "Administrator",
+ ],
+ "icon": "icon-glass",
+ "idx": 1,
+ "issingle": 1,
+ "modified": "2013-12-24 11:40:19.000000",
+ "modified_by": "Administrator",
+ "module": "Setup",
+ "name": "Features Setup",
+ "name_case": "Title Case",
+ "owner": "Administrator",
"permissions": [
{
- "create": 1,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 0,
- "role": "System Manager",
- "submit": 0,
+ "create": 1,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 0,
+ "role": "System Manager",
+ "submit": 0,
"write": 1
- },
+ },
{
- "create": 1,
- "email": 1,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 0,
- "role": "Administrator",
- "submit": 0,
+ "create": 1,
+ "email": 1,
+ "permlevel": 0,
+ "print": 1,
+ "read": 1,
+ "report": 0,
+ "role": "Administrator",
+ "submit": 0,
"write": 1
}
]
-}
\ No newline at end of file
+}
diff --git a/erpnext/setup/doctype/naming_series/naming_series.py b/erpnext/setup/doctype/naming_series/naming_series.py
index e93af3c..d44cd4b 100644
--- a/erpnext/setup/doctype/naming_series/naming_series.py
+++ b/erpnext/setup/doctype/naming_series/naming_series.py
@@ -15,11 +15,11 @@
return {
"transactions": "\n".join([''] + sorted(list(set(
frappe.db.sql_list("""select parent
- from `tabDocField` where fieldname='naming_series'""")
- + frappe.db.sql_list("""select dt from `tabCustom Field`
+ from `tabDocField` where fieldname='naming_series'""")
+ + frappe.db.sql_list("""select dt from `tabCustom Field`
where fieldname='naming_series'""")
)))),
- "prefixes": "\n".join([''] + [i[0] for i in
+ "prefixes": "\n".join([''] + [i[0] for i in
frappe.db.sql("""select name from tabSeries order by name""")])
}
@@ -86,16 +86,16 @@
dt = DocType()
parent = list(set(
- frappe.db.sql_list("""select dt.name
- from `tabDocField` df, `tabDocType` dt
+ frappe.db.sql_list("""select dt.name
+ from `tabDocField` df, `tabDocType` dt
where dt.name = df.parent and df.fieldname='naming_series' and dt.name != %s""",
self.select_doc_for_series)
- + frappe.db.sql_list("""select dt.name
- from `tabCustom Field` df, `tabDocType` dt
+ + frappe.db.sql_list("""select dt.name
+ from `tabCustom Field` df, `tabDocType` dt
where dt.name = df.dt and df.fieldname='naming_series' and dt.name != %s""",
self.select_doc_for_series)
))
- sr = [[frappe.get_meta(p).get_field("naming_series").options, p]
+ sr = [[frappe.get_meta(p).get_field("naming_series").options, p]
for p in parent]
options = self.scrub_options_list(self.set_options.split("\n"))
for series in options:
@@ -104,19 +104,12 @@
if i[0]:
existing_series = [d.split('.')[0] for d in i[0].split("\n")]
if series.split(".")[0] in existing_series:
- throw("{oops}! {sr} {series} {msg} {existing_series}. {select}".format(**{
- "oops": _("Oops"),
- "sr": _("Series Name"),
- "series": series,
- "msg": _("is already in use in"),
- "existing_series": i[1],
- "select": _("Please select a new one")
- }))
+ frappe.throw(_("Series {0} already used in {1}").format(series,i[1]))
def validate_series_name(self, n):
import re
if not re.match("^[a-zA-Z0-9-/.#]*$", n):
- throw('Special Characters except "-" and "/" not allowed in naming series')
+ throw(_('Special Characters except "-" and "/" not allowed in naming series'))
def get_options(self, arg=''):
return frappe.get_meta(self.select_doc_for_series).get_field("naming_series").options
@@ -124,7 +117,7 @@
def get_current(self, arg=None):
"""get series current"""
if self.prefix:
- self.current_value = frappe.db.get_value("Series",
+ self.current_value = frappe.db.get_value("Series",
self.prefix.split('.')[0], "current")
def insert_series(self, series):
@@ -136,7 +129,7 @@
if self.prefix:
prefix = self.prefix.split('.')[0]
self.insert_series(prefix)
- frappe.db.sql("update `tabSeries` set current = %s where name = %s",
+ frappe.db.sql("update `tabSeries` set current = %s where name = %s",
(self.current_value, prefix))
msgprint(_("Series Updated Successfully"))
else:
@@ -149,8 +142,8 @@
make_property_setter(doctype, "naming_series", "reqd", 1, "Check")
# set values for mandatory
- frappe.db.sql("""update `tab{doctype}` set naming_series={s} where
- ifnull(naming_series, '')=''""".format(doctype=doctype, s="%s"),
+ frappe.db.sql("""update `tab{doctype}` set naming_series={s} where
+ ifnull(naming_series, '')=''""".format(doctype=doctype, s="%s"),
get_default_naming_series(doctype))
if hide_name_field:
@@ -165,10 +158,10 @@
make_property_setter(doctype, fieldname, "reqd", 1, "Check")
# set values for mandatory
- frappe.db.sql("""update `tab{doctype}` set `{fieldname}`=`name` where
+ frappe.db.sql("""update `tab{doctype}` set `{fieldname}`=`name` where
ifnull({fieldname}, '')=''""".format(doctype=doctype, fieldname=fieldname))
def get_default_naming_series(doctype):
naming_series = frappe.get_meta(doctype).get_field("naming_series").options or ""
naming_series = naming_series.split("\n")
- return naming_series[0] or naming_series[1]
\ No newline at end of file
+ return naming_series[0] or naming_series[1]
diff --git a/erpnext/setup/doctype/sales_person/sales_person.py b/erpnext/setup/doctype/sales_person/sales_person.py
index 6389722..bbd5690 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.py
+++ b/erpnext/setup/doctype/sales_person/sales_person.py
@@ -10,19 +10,19 @@
class SalesPerson(NestedSet):
nsm_parent_field = 'parent_sales_person';
- 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):
frappe.throw(_("Either target qty or target amount is mandatory."))
-
+
def on_update(self):
super(SalesPerson, self).on_update()
self.validate_one_root()
-
+
def get_email_id(self):
if self.employee:
user = frappe.db.get_value("Employee", self.employee, "user_id")
if not user:
- frappe.throw("User ID not set for Employee %s" % self.employee)
+ frappe.throw(_("User ID not set for Employee {0}").format(self.employee))
else:
- return frappe.db.get_value("User", user, "email") or user
\ No newline at end of file
+ return frappe.db.get_value("User", user, "email") or user
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index 63d18d2..efbc12f 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -11,8 +11,7 @@
if not currency:
currency = frappe.db.get_default("currency")
if not currency:
- throw(_('Please specify Default Currency in Company Master \
- and Global Defaults'))
+ throw(_('Please specify Default Currency in Company Master and Global Defaults'))
return currency
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 45c571c..bdbc0dc 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -109,8 +109,7 @@
self.is_pro_applicable = "No"
if self.is_pro_applicable == 'Yes' and self.is_stock_item == 'No':
- frappe.throw(_("As Production Order can be made for this item, \
- it must be a stock item."))
+ frappe.throw(_("As Production Order can be made for this item, 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)
@@ -123,15 +122,13 @@
and t2.docstatus = 1 and t1.docstatus =1 """, self.name)
if bom_mat and bom_mat[0][0]:
- frappe.throw(_("Item must be a purchase item, \
- as it is present in one or many Active BOMs"))
+ frappe.throw(_("Item must be a purchase item, as it is present in one or many Active BOMs"))
if self.is_manufactured_item != "Yes":
bom = frappe.db.sql("""select name from `tabBOM` where item = %s
and is_active = 1""", (self.name,))
if bom and bom[0][0]:
- frappe.throw(_("""Allow Bill of Materials should be 'Yes'. Because one or many \
- active BOMs present for this item"""))
+ frappe.throw(_("""Allow Bill of Materials should be 'Yes'. Because one or many active BOMs present for this item"""))
def fill_customer_code(self):
""" Append all the customer codes and insert into "customer_code" field of item table """
diff --git a/erpnext/stock/doctype/item_price/item_price.py b/erpnext/stock/doctype/item_price/item_price.py
index 8916628..56b3632 100644
--- a/erpnext/stock/doctype/item_price/item_price.py
+++ b/erpnext/stock/doctype/item_price/item_price.py
@@ -17,41 +17,27 @@
self.check_duplicate_item()
self.update_price_list_details()
self.update_item_details()
-
+
def validate_item(self):
if not frappe.db.exists("Item", self.item_code):
- throw("{doctype}: {item} {not_found}".format(**{
- "doctype": _("Item"),
- "item": self.item_code,
- "not_found": _(" not found")
- }))
+ throw(_("Item {0} not found").format(self.item_code))
def validate_price_list(self):
enabled = frappe.db.get_value("Price List", self.price_list, "enabled")
if not enabled:
- throw("{message}: {price_list} {disabled}".format(**{
- "message": _("Price List"),
- "price_list": self.price_list,
- "disabled": _("is disabled.")
- }))
+ throw(_("Price List {0} is disabled").format(self.price_list))
def check_duplicate_item(self):
- if frappe.db.sql("""select name from `tabItem Price`
- where item_code=%s and price_list=%s and name!=%s""",
+ if frappe.db.sql("""select name from `tabItem Price`
+ where item_code=%s and price_list=%s and name!=%s""",
(self.item_code, self.price_list, self.name)):
- throw("{duplicate_item}: {item_code}, {already}: {price_list}".format(**{
- "duplicate_item": _("Duplicate Item"),
- "item_code": self.item_code,
- "already": _("already available in Price List"),
- "price_list": self.price_list
- }), ItemPriceDuplicateItem)
+ frappe.throw(_("Item {0} appears multiple times in Price List {1}").format(self.item_code, self.price_list))
def update_price_list_details(self):
self.buying, self.selling, self.currency = \
- frappe.db.get_value("Price List", {"name": self.price_list, "enabled": 1},
+ frappe.db.get_value("Price List", {"name": self.price_list, "enabled": 1},
["buying", "selling", "currency"])
def update_item_details(self):
- self.item_name, self.item_description = frappe.db.get_value("Item",
+ self.item_name, self.item_description = frappe.db.get_value("Item",
self.item_code, ["item_name", "description"])
-
\ No newline at end of file
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index db97611..8811988 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -8,7 +8,7 @@
import frappe
from frappe.utils import cstr, flt
-from frappe import msgprint, _
+from frappe import _
from erpnext.controllers.buying_controller import BuyingController
class MaterialRequest(BuyingController):
@@ -43,9 +43,7 @@
actual_so_qty = actual_so_qty and flt(actual_so_qty[0][0]) or 0
if actual_so_qty and (flt(so_items[so_no][item]) + already_indented > actual_so_qty):
- frappe.throw("You can raise indent of maximum qty: %s for item: %s against sales order: %s\
- \n Anyway, you can add more qty in new row for the same item."
- % (actual_so_qty - already_indented, item, so_no))
+ frappe.throw(_("Material Request of maximum {0} can be made for Item {1} against Sales Order {2}").format(actual_so_qty - already_indented, item, so_no))
def validate_schedule_date(self):
for d in self.get('indent_details'):
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 37838ec..9533e57 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -27,8 +27,7 @@
def validate(self):
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)
+ 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()
@@ -166,8 +165,7 @@
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)
+ 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:
diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
index 1cc9c17..07778a4 100644
--- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
+++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py
@@ -14,45 +14,45 @@
def setup(self):
self.head_row = ["Item Code", "Warehouse", "Quantity", "Valuation Rate"]
self.entries = []
-
+
def validate(self):
self.validate_data()
self.validate_expense_account()
-
+
def on_submit(self):
self.insert_stock_ledger_entries()
self.make_gl_entries()
-
+
def on_cancel(self):
self.delete_and_repost_sle()
self.make_cancel_gl_entries()
-
+
def validate_data(self):
if not self.reconciliation_json:
return
-
+
data = json.loads(self.reconciliation_json)
-
+
# strip out extra columns (if any)
data = [row[:4] for row in data]
-
+
if self.head_row not in data:
msgprint(_("""Wrong Template: Unable to find head row."""),
raise_exception=1)
-
+
# remove the help part and save the json
head_row_no = 0
if data.index(self.head_row) != 0:
head_row_no = data.index(self.head_row)
data = data[head_row_no:]
self.reconciliation_json = json.dumps(data)
-
+
def _get_msg(row_num, msg):
return _("Row # ") + ("%d: " % (row_num+head_row_no+2)) + _(msg)
-
+
self.validation_messages = []
item_warehouse_combinations = []
-
+
# validate no of rows
rows = data[1:]
if len(rows) > 100:
@@ -64,69 +64,66 @@
self.validation_messages.append(_get_msg(row_num, "Duplicate entry"))
else:
item_warehouse_combinations.append([row[0], row[1]])
-
+
self.validate_item(row[0], row_num+head_row_no+2)
# note: warehouse will be validated through link validation
-
+
# if both not specified
if row[2] == "" and row[3] == "":
self.validation_messages.append(_get_msg(row_num,
"Please specify either Quantity or Valuation Rate or both"))
-
+
# do not allow negative quantity
if flt(row[2]) < 0:
- self.validation_messages.append(_get_msg(row_num,
+ self.validation_messages.append(_get_msg(row_num,
"Negative Quantity is not allowed"))
-
+
# do not allow negative valuation
if flt(row[3]) < 0:
- self.validation_messages.append(_get_msg(row_num,
+ self.validation_messages.append(_get_msg(row_num,
"Negative Valuation Rate is not allowed"))
-
+
# throw all validation messages
if self.validation_messages:
for msg in self.validation_messages:
msgprint(msg)
-
+
raise frappe.ValidationError
-
+
def validate_item(self, item_code, row_num):
from erpnext.stock.doctype.item.item import validate_end_of_life, \
validate_is_stock_item, validate_cancelled_item
-
+
# using try except to catch all validation msgs and display together
-
+
try:
item = frappe.get_doc("Item", item_code)
-
+
# end of life and stock item
validate_end_of_life(item_code, item.end_of_life, verbose=0)
validate_is_stock_item(item_code, item.is_stock_item, verbose=0)
-
+
# item should not be serialized
if item.has_serial_no == "Yes":
- raise frappe.ValidationError, (_("Serialized Item: '") + item_code +
- _("""' can not be managed using Stock Reconciliation.\
- You can add/delete Serial No directly, \
- to modify stock of this item."""))
-
+ raise frappe.ValidationError, _("Serialized Item {0} cannot be updated using Stock Reconciliation").format(item_code)
+
# docstatus should be < 2
validate_cancelled_item(item_code, item.docstatus, verbose=0)
-
+
except Exception, e:
self.validation_messages.append(_("Row # ") + ("%d: " % (row_num)) + cstr(e))
-
+
def insert_stock_ledger_entries(self):
""" find difference between current and expected entries
and create stock ledger entries based on the difference"""
from erpnext.stock.utils import get_valuation_method
from erpnext.stock.stock_ledger import get_previous_sle
-
+
row_template = ["item_code", "warehouse", "qty", "valuation_rate"]
-
+
if not self.reconciliation_json:
msgprint(_("""Stock Reconciliation file not uploaded"""), raise_exception=1)
-
+
data = json.loads(self.reconciliation_json)
for row_num, row in enumerate(data[data.index(self.head_row)+1:]):
row = frappe._dict(zip(row_template, row))
@@ -141,22 +138,22 @@
# check valuation rate mandatory
if row.qty != "" and not row.valuation_rate and \
flt(previous_sle.get("qty_after_transaction")) <= 0:
- frappe.throw(_("As existing qty for item: ") + row.item_code +
+ frappe.throw(_("As existing qty for item: ") + row.item_code +
_(" at warehouse: ") + row.warehouse +
_(" is less than equals to zero in the system, valuation rate is mandatory for this item"))
-
+
change_in_qty = row.qty != "" and \
(flt(row.qty) - flt(previous_sle.get("qty_after_transaction")))
-
+
change_in_rate = row.valuation_rate != "" and \
(flt(row.valuation_rate) - flt(previous_sle.get("valuation_rate")))
-
+
if get_valuation_method(row.item_code) == "Moving Average":
self.sle_for_moving_avg(row, previous_sle, change_in_qty, change_in_rate)
-
+
else:
self.sle_for_fifo(row, previous_sle, change_in_qty, change_in_rate)
-
+
def sle_for_moving_avg(self, row, previous_sle, change_in_qty, change_in_rate):
"""Insert Stock Ledger Entries for Moving Average valuation"""
def _get_incoming_rate(qty, valuation_rate, previous_qty, previous_valuation_rate):
@@ -167,73 +164,73 @@
valuation_rate = previous_valuation_rate
return (qty * valuation_rate - previous_qty * previous_valuation_rate) \
/ flt(qty - previous_qty)
-
+
if change_in_qty:
# if change in qty, irrespective of change in rate
incoming_rate = _get_incoming_rate(flt(row.qty), flt(row.valuation_rate),
flt(previous_sle.get("qty_after_transaction")),
flt(previous_sle.get("valuation_rate")))
-
+
row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Actual Entry"
self.insert_entries({"actual_qty": change_in_qty, "incoming_rate": incoming_rate}, row)
-
+
elif change_in_rate and flt(previous_sle.get("qty_after_transaction")) > 0:
- # if no change in qty, but change in rate
+ # if no change in qty, but change in rate
# and positive actual stock before this reconciliation
incoming_rate = _get_incoming_rate(
flt(previous_sle.get("qty_after_transaction"))+1, flt(row.valuation_rate),
- flt(previous_sle.get("qty_after_transaction")),
+ flt(previous_sle.get("qty_after_transaction")),
flt(previous_sle.get("valuation_rate")))
-
+
# +1 entry
row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Valuation Adjustment +1"
self.insert_entries({"actual_qty": 1, "incoming_rate": incoming_rate}, row)
-
+
# -1 entry
row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Valuation Adjustment -1"
self.insert_entries({"actual_qty": -1}, row)
-
+
def sle_for_fifo(self, row, previous_sle, change_in_qty, change_in_rate):
"""Insert Stock Ledger Entries for FIFO valuation"""
previous_stock_queue = json.loads(previous_sle.get("stock_queue") or "[]")
previous_stock_qty = sum((batch[0] for batch in previous_stock_queue))
previous_stock_value = sum((batch[0] * batch[1] for batch in \
previous_stock_queue))
-
+
def _insert_entries():
if previous_stock_queue != [[row.qty, row.valuation_rate]]:
# make entry as per attachment
if row.qty:
row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Actual Entry"
- self.insert_entries({"actual_qty": row.qty,
+ self.insert_entries({"actual_qty": row.qty,
"incoming_rate": flt(row.valuation_rate)}, row)
-
+
# Make reverse entry
if previous_stock_qty:
row["voucher_detail_no"] = "Row: " + cstr(row.row_num) + "/Reverse Entry"
- self.insert_entries({"actual_qty": -1 * previous_stock_qty,
- "incoming_rate": previous_stock_qty < 0 and
+ self.insert_entries({"actual_qty": -1 * previous_stock_qty,
+ "incoming_rate": previous_stock_qty < 0 and
flt(row.valuation_rate) or 0}, row)
-
-
+
+
if change_in_qty:
if row.valuation_rate == "":
# dont want change in valuation
if previous_stock_qty > 0:
# set valuation_rate as previous valuation_rate
row.valuation_rate = previous_stock_value / flt(previous_stock_qty)
-
+
_insert_entries()
-
+
elif change_in_rate and previous_stock_qty > 0:
- # if no change in qty, but change in rate
+ # if no change in qty, but change in rate
# and positive actual stock before this reconciliation
-
+
row.qty = previous_stock_qty
_insert_entries()
-
+
def insert_entries(self, opts, row):
- """Insert Stock Ledger Entries"""
+ """Insert Stock Ledger Entries"""
args = frappe._dict({
"doctype": "Stock Ledger Entry",
"item_code": row.item_code,
@@ -253,19 +250,19 @@
# append to entries
self.entries.append(args)
-
+
def delete_and_repost_sle(self):
""" Delete Stock Ledger Entries related to this voucher
and repost future Stock Ledger Entries"""
-
- existing_entries = frappe.db.sql("""select distinct item_code, warehouse
- from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
+
+ existing_entries = frappe.db.sql("""select distinct item_code, warehouse
+ from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
(self.doctype, self.name), as_dict=1)
-
+
# delete entries
- frappe.db.sql("""delete from `tabStock Ledger Entry`
+ frappe.db.sql("""delete from `tabStock Ledger Entry`
where voucher_type=%s and voucher_no=%s""", (self.doctype, self.name))
-
+
# repost future entries for selected item_code, warehouse
for entries in existing_entries:
update_entries_after({
@@ -274,29 +271,26 @@
"posting_date": self.posting_date,
"posting_time": self.posting_time
})
-
+
def get_gl_entries(self, warehouse_account=None):
if not self.cost_center:
msgprint(_("Please enter Cost Center"), raise_exception=1)
-
- return super(StockReconciliation, self).get_gl_entries(warehouse_account,
+
+ return super(StockReconciliation, self).get_gl_entries(warehouse_account,
self.expense_account, self.cost_center)
-
+
def validate_expense_account(self):
if not cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
return
-
+
if not self.expense_account:
msgprint(_("Please enter Expense Account"), raise_exception=1)
elif not frappe.db.sql("""select * from `tabStock Ledger Entry`"""):
- if frappe.db.get_value("Account", self.expense_account,
+ if frappe.db.get_value("Account", self.expense_account,
"report_type") == "Profit and Loss":
- msgprint(_("""Expense Account can not be a PL Account, as this stock \
- reconciliation is an opening entry. \
- Please select 'Temporary Account (Liabilities)' or relevant account"""),
- raise_exception=1)
-
+ frappe.throw(_("'Profit and Loss' type Account {0} used be set for Opening Entry").format(self.expense_account))
+
@frappe.whitelist()
def upload():
from frappe.utils.datautils import read_csv_content_from_uploaded_file
- return read_csv_content_from_uploaded_file()
\ No newline at end of file
+ return read_csv_content_from_uploaded_file()
diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py
index 9bb7109..dcb00f3 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.py
+++ b/erpnext/stock/doctype/warehouse/warehouse.py
@@ -65,8 +65,7 @@
if parent_account:
self.create_account_under = parent_account
else:
- frappe.throw(_("Please enter account group under which account \
- for warehouse ") + self.name +_(" will be created"))
+ frappe.throw(_("Please enter parent account group for warehouse account"))
def on_trash(self):
# delete bin
@@ -75,8 +74,7 @@
for d in bins:
if d['actual_qty'] or d['reserved_qty'] or d['ordered_qty'] or \
d['indented_qty'] or d['projected_qty'] or d['planned_qty']:
- throw("""Warehouse: %s can not be deleted as qty exists for item: %s"""
- % (self.name, d['item_code']))
+ throw(_("Warehouse {0} can not be deleted as quantity exists for Item {1}").format(self.name, d['item_code']))
else:
frappe.db.sql("delete from `tabBin` where name = %s", d['name'])
@@ -87,8 +85,7 @@
if frappe.db.sql("""select name from `tabStock Ledger Entry`
where warehouse = %s""", self.name):
- throw(_("""Warehouse can not be deleted as stock ledger entry
- exists for this warehouse."""))
+ throw(_("Warehouse can not be deleted as stock ledger entry exists for this warehouse."))
def before_rename(self, olddn, newdn, merge=False):
# Add company abbr if not provided
diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
index afc08e8..fb051e3 100644
--- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.py
@@ -11,19 +11,19 @@
from erpnext.stock.utils import get_valid_serial_nos
class MaintenanceSchedule(TransactionBase):
-
+
def get_item_details(self, item_code):
- item = frappe.db.sql("""select item_name, description from `tabItem`
+ item = frappe.db.sql("""select item_name, description from `tabItem`
where name=%s""", (item_code), as_dict=1)
ret = {
'item_name': item and item[0]['item_name'] or '',
'description' : item and item[0]['description'] or ''
}
return ret
-
+
def generate_schedule(self):
self.set('maintenance_schedule_detail', [])
- frappe.db.sql("""delete from `tabMaintenance Schedule Detail`
+ frappe.db.sql("""delete from `tabMaintenance Schedule Detail`
where parent=%s""", (self.name))
count = 1
for d in self.get('item_maintenance_detail'):
@@ -41,7 +41,7 @@
count = count + 1
child.sales_person = d.sales_person
child.save(1)
-
+
self.on_update()
def on_submit(self):
@@ -61,8 +61,8 @@
sp = frappe.get_doc("Sales Person", d.sales_person)
email_map[d.sales_person] = sp.get_email_id()
- scheduled_date = frappe.db.sql("""select scheduled_date from
- `tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and
+ scheduled_date = frappe.db.sql("""select scheduled_date from
+ `tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and
parent=%s""", (d.sales_person, d.item_code, self.name), as_dict=1)
for key in scheduled_date:
@@ -80,10 +80,10 @@
"ref_name": self.name
}).insert(ignore_permissions=1)
- frappe.db.set(self, 'status', 'Submitted')
+ frappe.db.set(self, 'status', 'Submitted')
def create_schedule_list(self, start_date, end_date, no_of_visit, sales_person):
- schedule_list = []
+ schedule_list = []
start_date_copy = start_date
date_diff = (getdate(end_date) - getdate(start_date)).days
add_by = date_diff / no_of_visit
@@ -92,7 +92,7 @@
if (getdate(start_date_copy) < getdate(end_date)):
start_date_copy = add_days(start_date_copy, add_by)
if len(schedule_list) < no_of_visit:
- schedule_date = self.validate_schedule_date_for_holiday_list(getdate(start_date_copy),
+ schedule_date = self.validate_schedule_date_for_holiday_list(getdate(start_date_copy),
sales_person)
if schedule_date > getdate(end_date):
schedule_date = getdate(end_date)
@@ -112,17 +112,17 @@
if fy_details and fy_details[0]:
# check holiday list in employee master
- holiday_list = frappe.db.sql_list("""select h.holiday_date from `tabEmployee` emp,
- `tabSales Person` sp, `tabHoliday` h, `tabHoliday List` hl
- where sp.name=%s and emp.name=sp.employee
- and hl.name=emp.holiday_list and
- h.parent=hl.name and
+ holiday_list = frappe.db.sql_list("""select h.holiday_date from `tabEmployee` emp,
+ `tabSales Person` sp, `tabHoliday` h, `tabHoliday List` hl
+ where sp.name=%s and emp.name=sp.employee
+ and hl.name=emp.holiday_list and
+ h.parent=hl.name and
hl.fiscal_year=%s""", (sales_person, fy_details[0]))
if not holiday_list:
# check global holiday list
- holiday_list = frappe.db.sql("""select h.holiday_date from
- `tabHoliday` h, `tabHoliday List` hl
- where h.parent=hl.name and ifnull(hl.is_default, 0) = 1
+ holiday_list = frappe.db.sql("""select h.holiday_date from
+ `tabHoliday` h, `tabHoliday List` hl
+ where h.parent=hl.name and ifnull(hl.is_default, 0) = 1
and hl.fiscal_year=%s""", fy_details[0])
if not validated and holiday_list:
@@ -140,14 +140,14 @@
period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
- if (args['periodicity'] == 'Yearly' or args['periodicity'] == 'Half Yearly' or
+ if (args['periodicity'] == 'Yearly' or args['periodicity'] == 'Half Yearly' or
args['periodicity'] == 'Quarterly') and period < 365:
throw(cstr(args['periodicity']) + " periodicity can be set for period of atleast 1 year or more only")
elif args['periodicity'] == 'Monthly' and period < 30:
throw("Monthly periodicity can be set for period of atleast 1 month or more")
elif args['periodicity'] == 'Weekly' and period < 7:
throw("Weekly periodicity can be set for period of atleast 1 week or more")
-
+
def get_no_of_visits(self, arg):
args = eval(arg)
self.validate_period(arg)
@@ -159,19 +159,19 @@
elif args['periodicity'] == 'Monthly':
count = period/30
elif args['periodicity'] == 'Quarterly':
- count = period/91
+ count = period/91
elif args['periodicity'] == 'Half Yearly':
count = period/182
elif args['periodicity'] == 'Yearly':
count = period/365
-
+
ret = {'no_of_visits' : count}
return ret
def validate_maintenance_detail(self):
if not self.get('item_maintenance_detail'):
throw(_("Please enter Maintaince Details first"))
-
+
for d in self.get('item_maintenance_detail'):
if not d.item_code:
throw(_("Please select item code"))
@@ -181,23 +181,23 @@
throw(_("Please mention no of visits required"))
elif not d.sales_person:
throw(_("Please select Incharge Person's name"))
-
+
if getdate(d.start_date) >= getdate(d.end_date):
throw(_("Start date should be less than end date for item") + " " + d.item_code)
-
+
def validate_sales_order(self):
for d in self.get('item_maintenance_detail'):
if d.prevdoc_docname:
- chk = frappe.db.sql("""select ms.name from `tabMaintenance Schedule` ms,
- `tabMaintenance Schedule Item` msi where msi.parent=ms.name and
+ chk = frappe.db.sql("""select ms.name from `tabMaintenance Schedule` ms,
+ `tabMaintenance Schedule Item` msi where msi.parent=ms.name and
msi.prevdoc_docname=%s and ms.docstatus=1""", d.prevdoc_docname)
if chk:
throw("Maintenance Schedule against " + d.prevdoc_docname + " already exist")
-
+
def validate(self):
self.validate_maintenance_detail()
self.validate_sales_order()
-
+
def on_update(self):
frappe.db.set(self, 'status', 'Draft')
@@ -209,21 +209,20 @@
def validate_serial_no(self, serial_nos, amc_start_date):
for serial_no in serial_nos:
- sr_details = frappe.db.get_value("Serial No", serial_no,
+ sr_details = frappe.db.get_value("Serial No", serial_no,
["warranty_expiry_date", "amc_expiry_date", "status", "delivery_date"], as_dict=1)
-
+
if sr_details.warranty_expiry_date and sr_details.warranty_expiry_date>=amc_start_date:
- throw("""Serial No: %s is already under warranty upto %s.
+ throw("""Serial No: %s is already under warranty upto %s.
Please check AMC Start Date.""" % (serial_no, sr_details.warranty_expiry_date))
-
+
if sr_details.amc_expiry_date and sr_details.amc_expiry_date >= amc_start_date:
throw("""Serial No: %s is already under AMC upto %s.
Please check AMC Start Date.""" % (serial_no, sr_details.amc_expiry_date))
-
+
if sr_details.status=="Delivered" and sr_details.delivery_date and \
sr_details.delivery_date >= amc_start_date:
- throw(_("Maintenance start date can not be before \
- delivery date for serial no: ") + serial_no)
+ throw(_("Maintenance start date can not be before delivery date for Serial No {0}").format(serial_no))
def validate_schedule(self):
item_lst1 =[]
@@ -231,26 +230,25 @@
for d in self.get('item_maintenance_detail'):
if d.item_code not in item_lst1:
item_lst1.append(d.item_code)
-
+
for m in self.get('maintenance_schedule_detail'):
if m.item_code not in item_lst2:
item_lst2.append(m.item_code)
-
+
if len(item_lst1) != len(item_lst2):
- throw(_("Maintenance Schedule is not generated for all the items. \
- Please click on 'Generate Schedule'"))
+ throw(_("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'"))
else:
for x in item_lst1:
if x not in item_lst2:
- throw(_("Maintenance Schedule is not generated for item ") + x +
+ throw(_("Maintenance Schedule is not generated for item ") + x +
_(". Please click on 'Generate Schedule'"))
-
+
def check_serial_no_added(self):
serial_present =[]
for d in self.get('item_maintenance_detail'):
if d.serial_no:
serial_present.append(d.item_code)
-
+
for m in self.get('maintenance_schedule_detail'):
if serial_present:
if m.item_code in serial_present and not m.serial_no:
@@ -270,13 +268,13 @@
@frappe.whitelist()
def make_maintenance_visit(source_name, target_doc=None):
from frappe.model.mapper import get_mapped_doc
-
+
def update_status(source, target, parent):
target.maintenance_type = "Scheduled"
-
+
doclist = get_mapped_doc("Maintenance Schedule", source_name, {
"Maintenance Schedule": {
- "doctype": "Maintenance Visit",
+ "doctype": "Maintenance Visit",
"field_map": {
"name": "maintenance_schedule"
},
@@ -284,15 +282,15 @@
"docstatus": ["=", 1]
},
"postprocess": update_status
- },
+ },
"Maintenance Schedule Item": {
- "doctype": "Maintenance Visit Purpose",
+ "doctype": "Maintenance Visit Purpose",
"field_map": {
- "parent": "prevdoc_docname",
+ "parent": "prevdoc_docname",
"parenttype": "prevdoc_doctype",
"sales_person": "service_person"
}
}
}, target_doc)
- return doclist
\ No newline at end of file
+ return doclist