diff --git a/accounts/page/accounts_home/accounts_home.js b/accounts/page/accounts_home/accounts_home.js
index c3d4cf18ce..25ee92c397 100644
--- a/accounts/page/accounts_home/accounts_home.js
+++ b/accounts/page/accounts_home/accounts_home.js
@@ -197,11 +197,21 @@ wn.module_page["Accounts"] = [
route: "query-report/Delivered Items To Be Billed",
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",
diff --git a/accounts/page/voucher_import_tool/voucher_import_tool.py b/accounts/page/voucher_import_tool/voucher_import_tool.py
index 6648ee6f8e..7634e5bf84 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 @@ def get_template():
"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 @@ def get_template():
@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 "
".join(webnotes.message_log) or cstr(e)
+ messages.append("""
%s
""" % (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 @@ def import_vouchers(common_values, data, start_idx, import_type): 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 @@ def import_vouchers(common_values, data, start_idx, import_type): 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 @@ def import_vouchers(common_values, data, start_idx, import_type): webnotes.conn.commit() except Exception, e: webnotes.conn.rollback() - err_msg = webnotes.message_log and "[row #%s] %s failed: %s
""" % ((start_idx + 1) + i, jv.name or "", err_msg or "No message")) messages.append("All transactions rolled back
") @@ -240,16 +254,20 @@ def get_data(rows, company_abbr): 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 7eb344fc08..d01bef23d3 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 0000000000..e69de29bb2 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 0000000000..7a9ec367b1 --- /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 0000000000..e69de29bb2 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 0000000000..554e0f0c79 --- /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 755546c0e1..31e622166e 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -273,36 +273,45 @@ def create_stock_in_hand_jv(reverse=False): 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([("%s" % (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: \ + \ + Auto Inventory Accounting""")) webnotes.msgprint("""Please refresh the system to get effect of Auto Inventory Accounting""") @@ -322,3 +331,20 @@ def get_stock_rbnb_value(company): 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/patches/may_2013/p06_make_notes.py b/patches/may_2013/p06_make_notes.py index caa5a307ca..597468a9d4 100644 --- a/patches/may_2013/p06_make_notes.py +++ b/patches/may_2013/p06_make_notes.py @@ -5,19 +5,20 @@ def execute(): webnotes.reload_doc("utilities", "doctype", "note_user") for question in webnotes.conn.sql("""select * from tabQuestion""", as_dict=True): - name = question.question[:180] - if webnotes.conn.exists("Note", name): - webnotes.delete_doc("Note", name) - note = webnotes.bean({ - "doctype":"Note", - "title": name, - "content": "