Merge branch 'master' of github.com:webnotes/erpnext into responsive
Conflicts:
accounts/doctype/sales_invoice/sales_invoice.py
selling/doctype/sales_common/sales_common.py
diff --git a/accounts/page/accounts_home/accounts_home.js b/accounts/page/accounts_home/accounts_home.js
index c3d4cf1..25ee92c 100644
--- a/accounts/page/accounts_home/accounts_home.js
+++ b/accounts/page/accounts_home/accounts_home.js
@@ -198,11 +198,21 @@
doctype: "Sales Invoice"
},
{
+ "label":wn._("Received Items To Be Billed"),
+ route: "query-report/Received Items To Be Billed",
+ doctype: "Purchase Invoice"
+ },
+ {
"label":wn._("Ordered Items To Be Billed"),
route: "query-report/Ordered Items To Be Billed",
doctype: "Sales Invoice"
},
{
+ "label":wn._("Purchase Order Items To Be Billed"),
+ route: "query-report/Purchase Order Items To Be Billed",
+ doctype: "Purchase Invoice"
+ },
+ {
"label":wn._("Bank Clearance Summary"),
route: "query-report/Bank Clearance Summary",
doctype: "Journal Voucher"
diff --git a/accounts/page/voucher_import_tool/voucher_import_tool.py b/accounts/page/voucher_import_tool/voucher_import_tool.py
index 6648ee6..7634e5b 100644
--- a/accounts/page/voucher_import_tool/voucher_import_tool.py
+++ b/accounts/page/voucher_import_tool/voucher_import_tool.py
@@ -1,7 +1,7 @@
from __future__ import unicode_literals
import webnotes
from webnotes import _
-from webnotes.utils import flt, comma_and
+from webnotes.utils import flt, comma_and, cstr
import webnotes.defaults
@webnotes.whitelist()
@@ -31,13 +31,12 @@
"3. Naming Series Options: %(naming_options)s"
"4. Voucher Type Options: %(voucher_type)s"%(extra_note)s
"-------Common Values-----------"
-"Company:","%(default_company)s"
+"Company:",
"--------Data----------"
%(columns)s
''' % {
"template_type": template_type,
"user_fmt": webnotes.defaults.get_global_default('date_format'),
- "default_company": webnotes.conn.get_default("company"),
"naming_options": naming_options.replace("\n", ", "),
"voucher_type": voucher_type.replace("\n", ", "),
"extra_note": extra_note,
@@ -49,14 +48,29 @@
@webnotes.whitelist()
def upload():
- from webnotes.utils.datautils import read_csv_content_from_uploaded_file
- rows = read_csv_content_from_uploaded_file()
-
- common_values = get_common_values(rows)
- company_abbr = webnotes.conn.get_value("Company", common_values.company, "abbr")
- data, start_idx = get_data(rows, company_abbr)
+ messages = []
+ try:
+ from webnotes.utils.datautils import read_csv_content_from_uploaded_file
+ rows = read_csv_content_from_uploaded_file()
+ common_values = get_common_values(rows)
+ company_abbr = webnotes.conn.get_value("Company", common_values.company, "abbr")
+
+ if not company_abbr:
+ webnotes.msgprint(_("Company is missing or entered incorrect value"), raise_exception=1)
+
+ data, start_idx = get_data(rows, company_abbr)
+ except Exception, e:
+ err_msg = webnotes.message_log and "<br>".join(webnotes.message_log) or cstr(e)
+ messages.append("""<p style='color: red'>%s</p>""" % (err_msg or "No message"))
+ webnotes.errprint(webnotes.getTraceback())
+ webnotes.message_log = []
+ return messages
+
return import_vouchers(common_values, data, start_idx, rows[0][0])
+
+
+
def map_fields(field_list, source, target):
for f in field_list:
@@ -70,9 +84,8 @@
from webnotes.model.bean import Bean
from accounts.utils import get_fiscal_year
from webnotes.utils.dateutils import parse_date
-
messages = []
-
+
def get_account_details(account):
acc_details = webnotes.conn.sql("""select is_pl_account,
master_name from tabAccount where name=%s""", account, as_dict=1)
@@ -113,8 +126,9 @@
if d.ref_number:
if not d.ref_date:
- raise webnotes.ValidationError, \
- """Ref Date is Mandatory if Ref Number is specified"""
+ webnotes.msgprint(_("Ref Date is Mandatory if Ref Number is specified"),
+ raise_exception=1)
+
d.ref_date = parse_date(d.ref_date)
d.company = common_values.company
@@ -176,7 +190,7 @@
webnotes.conn.commit()
except Exception, e:
webnotes.conn.rollback()
- err_msg = webnotes.message_log and "<br>".join(webnotes.message_log) or unicode(e)
+ err_msg = webnotes.message_log and "<br>".join(webnotes.message_log) or cstr(e)
messages.append("""<p style='color: red'>[row #%s] %s failed: %s</p>"""
% ((start_idx + 1) + i, jv.name or "", err_msg or "No message"))
messages.append("<p style='color: red'>All transactions rolled back</p>")
@@ -240,16 +254,20 @@
raise Exception, """Column No(s). %s %s empty. \
Please remove them and try again.""" % (comma_and(empty_columns),
len(empty_columns)==1 and "is" or "are")
-
+
columns = [c.replace(" ", "_").lower() for c in rows[i+1]
if not c.endswith(" - " + company_abbr)]
accounts = [c for c in rows[i+1] if c.endswith(" - " + company_abbr)]
-
+
+ if not accounts:
+ webnotes.msgprint(_("""No Account found in csv file,
+ May be company abbreviation is not correct"""), raise_exception=1)
+
if accounts and (len(columns) != rows[i+1].index(accounts[0])):
- raise Exception, _("""All account columns should be after \
+ webnotes.msgprint(_("""All account columns should be after \
standard columns and on the right.
If you entered it properly, next probable reason \
could be wrong account name.
- Please rectify it in the file and try again.""")
+ Please rectify it in the file and try again."""), raise_exception=1)
return data, start_row_idx
\ No newline at end of file
diff --git a/accounts/report/accounts_receivable/accounts_receivable.txt b/accounts/report/accounts_receivable/accounts_receivable.txt
index 7eb344f..d01bef2 100644
--- a/accounts/report/accounts_receivable/accounts_receivable.txt
+++ b/accounts/report/accounts_receivable/accounts_receivable.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-04-16 11:31:13",
"docstatus": 0,
- "modified": "2013-04-30 17:54:47",
+ "modified": "2013-05-24 12:02:52",
"modified_by": "Administrator",
"owner": "Administrator"
},
diff --git a/accounts/report/purchase_order_items_to_be_billed/__init__.py b/accounts/report/purchase_order_items_to_be_billed/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/accounts/report/purchase_order_items_to_be_billed/__init__.py
diff --git a/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.txt b/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.txt
new file mode 100644
index 0000000..7a9ec36
--- /dev/null
+++ b/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.txt
@@ -0,0 +1,23 @@
+[
+ {
+ "creation": "2013-05-28 15:54:16",
+ "docstatus": 0,
+ "modified": "2013-05-28 16:02:57",
+ "modified_by": "Administrator",
+ "owner": "Administrator"
+ },
+ {
+ "add_total_row": 1,
+ "doctype": "Report",
+ "is_standard": "Yes",
+ "name": "__common__",
+ "query": "select \n `tabPurchase Order`.`name` as \"Purchase Order:Link/Purchase Order:120\",\n `tabPurchase Order`.`transaction_date` as \"Date:Date:100\",\n\t`tabPurchase Order`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Order Item`.`project_name` as \"Project\",\n\t`tabPurchase Order Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Order Item`.qty as \"Qty:Float:100\",\n\t`tabPurchase Order Item`.billed_qty as \"Billed Qty:Float:100\", \n\t(`tabPurchase Order Item`.qty - ifnull(`tabPurchase Order Item`.billed_qty, 0)) as \"Qty to Bill:Float:100\",\n\t`tabPurchase Order Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Order Item`.description as \"Description::200\"\nfrom\n\t`tabPurchase Order`, `tabPurchase Order Item`\nwhere\n\t`tabPurchase Order Item`.`parent` = `tabPurchase Order`.`name`\n\tand `tabPurchase Order`.docstatus = 1\n\tand `tabPurchase Order`.status != \"Stopped\"\n\tand ifnull(`tabPurchase Order Item`.billed_qty, 0) < ifnull(`tabPurchase Order Item`.qty, 0)\norder by `tabPurchase Order`.transaction_date asc",
+ "ref_doctype": "Purchase Invoice",
+ "report_name": "Purchase Order Items To Be Billed",
+ "report_type": "Query Report"
+ },
+ {
+ "doctype": "Report",
+ "name": "Purchase Order Items To Be Billed"
+ }
+]
\ No newline at end of file
diff --git a/accounts/report/received_items_to_be_billed/__init__.py b/accounts/report/received_items_to_be_billed/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/accounts/report/received_items_to_be_billed/__init__.py
diff --git a/accounts/report/received_items_to_be_billed/received_items_to_be_billed.txt b/accounts/report/received_items_to_be_billed/received_items_to_be_billed.txt
new file mode 100644
index 0000000..554e0f0
--- /dev/null
+++ b/accounts/report/received_items_to_be_billed/received_items_to_be_billed.txt
@@ -0,0 +1,23 @@
+[
+ {
+ "creation": "2013-05-28 15:57:59",
+ "docstatus": 0,
+ "modified": "2013-05-28 17:34:05",
+ "modified_by": "Administrator",
+ "owner": "Administrator"
+ },
+ {
+ "add_total_row": 1,
+ "doctype": "Report",
+ "is_standard": "Yes",
+ "name": "__common__",
+ "query": "select \n `tabPurchase Receipt`.`name` as \"Purchase Receipt:Link/Purchase Receipt:120\",\n `tabPurchase Receipt`.`posting_date` as \"Date:Date:100\",\n `tabPurchase Receipt`.`supplier` as \"Supplier:Link/Supplier:120\",\n `tabPurchase Receipt Item`.`project_name` as \"Project\",\n\t`tabPurchase Receipt Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Receipt Item`.qty as \"Qty:Float:100\",\n\t`tabPurchase Receipt Item`.billed_qty as \"Billed Qty:Float:100\", \n\t(`tabPurchase Receipt Item`.qty - ifnull(`tabPurchase Receipt Item`.billed_qty, 0)) as \"Qty to Bill:Float:100\",\n\t`tabPurchase Receipt Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Receipt Item`.description as \"Description::200\"\nfrom\n\t`tabPurchase Receipt`, `tabPurchase Receipt Item`\nwhere\n\t`tabPurchase Receipt Item`.`parent` = `tabPurchase Receipt`.`name`\n\tand `tabPurchase Receipt`.docstatus = 1\n\tand `tabPurchase Receipt`.status != \"Stopped\"\n\tand ifnull(`tabPurchase Receipt Item`.billed_qty, 0) < ifnull(`tabPurchase Receipt Item`.qty, 0)\norder by `tabPurchase Receipt`.posting_date asc",
+ "ref_doctype": "Purchase Invoice",
+ "report_name": "Received Items To Be Billed",
+ "report_type": "Query Report"
+ },
+ {
+ "doctype": "Report",
+ "name": "Received Items To Be Billed"
+ }
+]
\ No newline at end of file
diff --git a/accounts/utils.py b/accounts/utils.py
index 755546c..31e6221 100644
--- a/accounts/utils.py
+++ b/accounts/utils.py
@@ -273,36 +273,45 @@
jv = webnotes.bean([
{
"doctype": "Journal Voucher",
- "naming_series": "_PATCH-",
+ "naming_series": "JV-AUTO-",
"company": company,
"posting_date": today,
"fiscal_year": fiscal_year,
"voucher_type": "Journal Entry",
- "user_remark": "Accounting Entry for Stock: \
- Initial booking of stock received but not billed account"
+ "user_remark": (_("Auto Inventory Accounting") + ": " +
+ (_("Disabled") if reverse else _("Enabled")) + ". " +
+ _("Journal Entry for inventory that is received but not yet invoiced"))
},
{
"doctype": "Journal Voucher Detail",
"parentfield": "entries",
"account": get_company_default(company, "stock_received_but_not_billed"),
- (stock_rbnb_value > 0 and "credit" or "debit"): abs(stock_rbnb_value)
+ (stock_rbnb_value > 0 and "credit" or "debit"): abs(stock_rbnb_value)
},
{
"doctype": "Journal Voucher Detail",
"parentfield": "entries",
"account": get_company_default(company, "stock_adjustment_account"),
- (stock_rbnb_value > 0 and "debit" or "credit"): abs(stock_rbnb_value),
+ (stock_rbnb_value > 0 and "debit" or "credit"): abs(stock_rbnb_value),
"cost_center": get_company_default(company, "stock_adjustment_cost_center")
},
])
jv.insert()
- jv.submit()
jv_list.append(jv.doc.name)
if jv_list:
- webnotes.msgprint("""Folowing Journal Vouchers has been created automatically:
- %s""" % '\n'.join(jv_list))
+ msgprint(_("Following Journal Vouchers have been created automatically") + \
+ ":\n%s" % ("\n".join([("<a href=\"#Form/Journal Voucher/%s\">%s</a>" % (jv, jv)) for jv in jv_list]),))
+
+ msgprint(_("""These adjustment vouchers book the difference between \
+ the total value of received items and the total value of invoiced items, \
+ as a required step to use Auto Inventory Accounting.
+ This is an approximation to get you started.
+ You will need to submit these vouchers after checking if the values are correct.
+ For more details, read: \
+ <a href="http://erpnext.com/auto-inventory-accounting" target="_blank">\
+ Auto Inventory Accounting</a>"""))
webnotes.msgprint("""Please refresh the system to get effect of Auto Inventory Accounting""")
@@ -322,3 +331,20 @@
and exists(select name from `tabPurchase Invoice`
where name = pi_item.parent and company = %s)""", company)
return flt(total_received_amount[0][0]) - flt(total_billed_amount[0][0])
+
+
+def fix_total_debit_credit():
+ vouchers = webnotes.conn.sql("""select voucher_type, voucher_no,
+ sum(debit) - sum(credit) as diff
+ from `tabGL Entry`
+ group by voucher_type, voucher_no
+ having sum(ifnull(debit, 0)) != sum(ifnull(credit, 0))""", as_dict=1)
+
+ for d in vouchers:
+ if abs(d.diff) > 0:
+ dr_or_cr = d.voucher_type == "Sales Invoice" and "credit" or "debit"
+
+ webnotes.conn.sql("""update `tabGL Entry` set %s = %s + %s
+ where voucher_type = %s and voucher_no = %s and %s > 0 limit 1""" %
+ (dr_or_cr, dr_or_cr, '%s', '%s', '%s', dr_or_cr),
+ (d.diff, d.voucher_type, d.voucher_no), debug=1)
\ No newline at end of file
diff --git a/selling/doctype/customer/customer.py b/selling/doctype/customer/customer.py
index 6f54ef9..72e12b7 100644
--- a/selling/doctype/customer/customer.py
+++ b/selling/doctype/customer/customer.py
@@ -219,27 +219,8 @@
def on_rename(self, new, old, merge=False):
#update customer_name if not naming series
if webnotes.defaults.get_global_default('cust_master_name') == 'Customer Name':
- update_fields = [
- ('Customer', 'name'),
- ('Address', 'customer'),
- ('Contact', 'customer'),
- ('Customer Issue', 'customer'),
- ('Delivery Note', 'customer'),
- ('Opportunity', 'customer'),
- ('Installation Note', 'customer'),
- ('Maintenance Schedule', 'customer'),
- ('Maintenance Visit', 'customer'),
- ('Project', 'customer'),
- ('Quotation', 'customer'),
- ('Sales Invoice', 'customer'),
- ('Sales Order', 'customer'),
- ('Serial No', 'customer'),
- ('Shipping Address', 'customer'),
- ('Stock Entry', 'customer'),
- ('Support Ticket', 'customer')]
- for rec in update_fields:
- sql("""update `tab%s` set customer_name = %s
- where `%s` = %s""" % (rec[0], "%s" ,rec[1], "%s"), (new, old))
+ webnotes.conn.sql("""update `tabCustomer` set customer_name = %s where name = %s""",
+ (new, old))
for account in webnotes.conn.sql("""select name, account_name from
tabAccount where master_name=%s and master_type='Customer'""", old, as_dict=1):
diff --git a/selling/report/item_wise_sales_history/item_wise_sales_history.txt b/selling/report/item_wise_sales_history/item_wise_sales_history.txt
index 6fee050..adbfe69 100644
--- a/selling/report/item_wise_sales_history/item_wise_sales_history.txt
+++ b/selling/report/item_wise_sales_history/item_wise_sales_history.txt
@@ -1,13 +1,14 @@
[
{
- "creation": "2013-05-03 14:38:34",
+ "creation": "2013-05-23 17:42:24",
"docstatus": 0,
- "modified": "2013-05-07 11:19:40",
+ "modified": "2013-05-24 12:20:17",
"modified_by": "Administrator",
"owner": "Administrator"
},
{
"add_total_row": 1,
+ "disabled": 0,
"doctype": "Report",
"is_standard": "Yes",
"name": "__common__",
diff --git a/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.js b/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.js
index 4a8e678..2e1996e 100644
--- a/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.js
+++ b/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.js
@@ -50,5 +50,11 @@
fieldtype: "Link",
options: "Customer",
},
+ {
+ fieldname:"territory",
+ label: "Territory",
+ fieldtype: "Link",
+ options: "Territory",
+ },
]
}
\ No newline at end of file
diff --git a/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py b/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
index 23e8819..8ec3a18 100644
--- a/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
+++ b/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py
@@ -54,6 +54,7 @@
conditions = ""
if filters.get("company"): conditions += " and dt.company = '%s'" % filters["company"]
if filters.get("customer"): conditions += " and dt.customer = '%s'" % filters["customer"]
+ if filters.get("territory"): conditions += " and dt.territory = '%s'" % filters["territory"]
if filters.get("from_date"): conditions += " and dt.%s >= '%s'" % \
(date_field, filters["from_date"])
diff --git a/setup/doctype/naming_series/naming_series.py b/setup/doctype/naming_series/naming_series.py
index 3a6b36d..eb293f2 100644
--- a/setup/doctype/naming_series/naming_series.py
+++ b/setup/doctype/naming_series/naming_series.py
@@ -123,16 +123,9 @@
def validate_series_name(self, n):
import re
- if "." in n:
- parts = n.split(".")
- if len(parts) > 2:
- msgprint("Only one dot (.) allowed in " + n, raise_exception=1)
- if not re.match("#+$", parts[-1]):
- msgprint("Numbering series must be in hashes (e.g. ####)", raise_exception=1)
- n = n[0]
- if not re.match("^[a-zA-Z0-9-/]*$", n):
- msgprint('Special Characters except "-" and "/" not allowed in naming series')
- raise Exception
+ if not re.match("^[a-zA-Z0-9-/.#]*$", n):
+ msgprint('Special Characters except "-" and "/" not allowed in naming series',
+ raise_exception=True)
def get_options(self, arg=''):
sr = webnotes.model.doctype.get_property(self.doc.select_doc_for_series,
diff --git a/setup/page/setup/setup.js b/setup/page/setup/setup.js
index 1ebd730..788021a 100644
--- a/setup/page/setup/setup.js
+++ b/setup/page/setup/setup.js
@@ -73,7 +73,7 @@
{
"route":"Form/Naming Series/Naming Series",
doctype: "Naming Series",
- label: wn._("Manage numbering series"),
+ label: wn._("Manage Numbering Series"),
"description":wn._("Set multiple numbering series for transactions")
},
{
diff --git a/stock/report/purchase_order_items_to_be_received/purchase_order_items_to_be_received.txt b/stock/report/purchase_order_items_to_be_received/purchase_order_items_to_be_received.txt
index 7a2f636..c588dde 100644
--- a/stock/report/purchase_order_items_to_be_received/purchase_order_items_to_be_received.txt
+++ b/stock/report/purchase_order_items_to_be_received/purchase_order_items_to_be_received.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-02-22 18:01:55",
"docstatus": 0,
- "modified": "2013-05-13 16:11:27",
+ "modified": "2013-05-28 16:03:15",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -11,7 +11,7 @@
"doctype": "Report",
"is_standard": "Yes",
"name": "__common__",
- "query": "select \n `tabPurchase Order`.`name` as \"Purchase Order:Link/Purchase Order:120\",\n\t`tabPurchase Order`.`transaction_date` as \"Date:Date:100\",\n\t`tabPurchase Order`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Order`.`project_name` as \"Project\",\n\t`tabPurchase Order Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Order Item`.qty as \"Qty:Float:100\",\n\t`tabPurchase Order Item`.received_qty as \"Received Qty:Float:100\", \n\t(`tabPurchase Order Item`.qty - ifnull(`tabPurchase Order Item`.received_qty, 0)) as \"Qty to Receive:Float:100\",\n\t`tabPurchase Order Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Order Item`.description as \"Description::200\"\nfrom\n\t`tabPurchase Order`, `tabPurchase Order Item`\nwhere\n\t`tabPurchase Order Item`.`parent` = `tabPurchase Order`.`name`\n\tand `tabPurchase Order`.docstatus = 1\n\tand `tabPurchase Order`.status != \"Stopped\"\n\tand ifnull(`tabPurchase Order Item`.received_qty, 0) < ifnull(`tabPurchase Order Item`.qty, 0)\norder by `tabPurchase Order`.transaction_date asc",
+ "query": "select \n `tabPurchase Order`.`name` as \"Purchase Order:Link/Purchase Order:120\",\n\t`tabPurchase Order`.`transaction_date` as \"Date:Date:100\",\n\t`tabPurchase Order`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Order Item`.`project_name` as \"Project\",\n\t`tabPurchase Order Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Order Item`.qty as \"Qty:Float:100\",\n\t`tabPurchase Order Item`.received_qty as \"Received Qty:Float:100\", \n\t(`tabPurchase Order Item`.qty - ifnull(`tabPurchase Order Item`.received_qty, 0)) as \"Qty to Receive:Float:100\",\n\t`tabPurchase Order Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Order Item`.description as \"Description::200\"\nfrom\n\t`tabPurchase Order`, `tabPurchase Order Item`\nwhere\n\t`tabPurchase Order Item`.`parent` = `tabPurchase Order`.`name`\n\tand `tabPurchase Order`.docstatus = 1\n\tand `tabPurchase Order`.status != \"Stopped\"\n\tand ifnull(`tabPurchase Order Item`.received_qty, 0) < ifnull(`tabPurchase Order Item`.qty, 0)\norder by `tabPurchase Order`.transaction_date asc",
"ref_doctype": "Purchase Receipt",
"report_name": "Purchase Order Items To Be Received",
"report_type": "Query Report"