From 13dc9f3b1f79600997194af86193326d06ecfeb3 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 13 Feb 2013 23:42:48 +0530 Subject: [PATCH 1/2] shifted get_url to startup --- startup/__init__.py | 11 +++++++++++ utilities/page/messages/messages.py | 14 +++----------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/startup/__init__.py b/startup/__init__.py index 18ae9328de..c1f4660865 100644 --- a/startup/__init__.py +++ b/startup/__init__.py @@ -53,3 +53,14 @@ def get_monthly_bulk_mail_limit(): return 999999 else: return 500 + +def get_url(): + from webnotes.utils import get_request_site_address + url = get_request_site_address() + if not url or "localhost" in url: + subdomain = webnotes.conn.get_value("Website Settings", "Website Settings", + "subdomain") + if subdomain: + if "http" not in subdomain: + url = "http://" + subdomain + return url \ No newline at end of file diff --git a/utilities/page/messages/messages.py b/utilities/page/messages/messages.py index 7fbc10121f..019cd071ea 100644 --- a/utilities/page/messages/messages.py +++ b/utilities/page/messages/messages.py @@ -91,6 +91,8 @@ def delete(arg=None): def notify(arg=None): from webnotes.utils import cstr + from startup import get_url + fn = webnotes.conn.sql('select first_name, last_name from tabProfile where name=%s', webnotes.user.name)[0] if fn[0] or f[1]: fn = cstr(fn[0]) + (fn[0] and ' ' or '') + cstr(fn[1]) @@ -110,14 +112,4 @@ def notify(arg=None): from webnotes.utils.email_lib import sendmail sendmail([arg['contact']], sender, message, "You have a message from %s" % (fn,)) - -def get_url(): - from webnotes.utils import get_request_site_address - url = get_request_site_address() - if not url or "localhost" in url: - subdomain = webnotes.conn.get_value("Website Settings", "Website Settings", - "subdomain") - if subdomain: - if "http" not in subdomain: - url = "http://" + subdomain - return url + \ No newline at end of file From e74a1f2b85412287c8314e546e611632d34e3aa0 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 14 Feb 2013 13:38:12 +0530 Subject: [PATCH 2/2] fixes in outstanding amount calculation on cancellation of payment entry --- accounts/doctype/account/test_account.py | 4 +- .../journal_voucher/test_journal_voucher.py | 243 ++++++++++-------- .../sales_invoice/test_sales_invoice.py | 84 ++++++ accounts/general_ledger.py | 6 +- patches/february_2013/fix_outstanding.py | 2 +- patches/patch_list.py | 1 + selling/doctype/sales_common/sales_common.py | 9 +- .../print_heading/test_print_heading.py | 1 + .../test_terms_and_conditions.py | 1 + 9 files changed, 239 insertions(+), 112 deletions(-) create mode 100644 accounts/doctype/sales_invoice/test_sales_invoice.py create mode 100644 setup/doctype/print_heading/test_print_heading.py create mode 100644 setup/doctype/terms_and_conditions/test_terms_and_conditions.py diff --git a/accounts/doctype/account/test_account.py b/accounts/doctype/account/test_account.py index ec72dbcf23..db2ca19ec0 100644 --- a/accounts/doctype/account/test_account.py +++ b/accounts/doctype/account/test_account.py @@ -3,17 +3,19 @@ def make_test_records(verbose): accounts = [ # [account_name, parent_account, group_or_ledger] + ["_Test Account Bank Account", "Bank Accounts - _TC", "Ledger"], ["_Test Account Stock Expenses", "Direct Expenses - _TC", "Group"], ["_Test Account Shipping Charges", "_Test Account Stock Expenses - _TC", "Ledger"], ["_Test Account Customs Duty", "_Test Account Stock Expenses - _TC", "Ledger"], ["_Test Account Tax Assets", "Current Assets - _TC", "Group"], ["_Test Account VAT", "_Test Account Tax Assets - _TC", "Ledger"], + ["_Test Account Service Tax", "_Test Account Tax Assets - _TC", "Ledger"], ["_Test Account Cost for Goods Sold", "Expenses - _TC", "Ledger"], ["_Test Account Excise Duty", "_Test Account Tax Assets - _TC", "Ledger"], ["_Test Account Education Cess", "_Test Account Tax Assets - _TC", "Ledger"], ["_Test Account S&H Education Cess", "_Test Account Tax Assets - _TC", "Ledger"], ["_Test Account CST", "Direct Expenses - _TC", "Ledger"], - ["_Test Account Discount", "Direct Expenses - _TC", "Ledger"] + ["_Test Account Discount", "Direct Expenses - _TC", "Ledger"], ] return make_test_objects("Account", [[{ diff --git a/accounts/doctype/journal_voucher/test_journal_voucher.py b/accounts/doctype/journal_voucher/test_journal_voucher.py index 4c72092ed0..67fd1c0867 100644 --- a/accounts/doctype/journal_voucher/test_journal_voucher.py +++ b/accounts/doctype/journal_voucher/test_journal_voucher.py @@ -18,110 +18,147 @@ from __future__ import unicode_literals import unittest import webnotes -import webnotes.model -from webnotes.utils import nowdate, flt, add_days -from accounts.utils import get_fiscal_year, get_balance_on -company = webnotes.conn.get_default("company") -abbr = webnotes.conn.get_value("Company", company, "abbr") +test_records = [[ + { + "company": "_Test Company", + "doctype": "Journal Voucher", + "fiscal_year": "_Test Fiscal Year 2013", + "naming_series": "_T-Journal Voucher-", + "posting_date": "2013-02-14", + "tds_applicable": "No", + "user_remark": "test", + "voucher_type": "Bank Voucher", + "cheque_no": "33", + "cheque_date": "2013-02-14" + }, + { + "account": "_Test Customer - _TC", + "doctype": "Journal Voucher Detail", + "credit": 400.0, + "debit": 0.0, + "parentfield": "entries" + }, + { + "account": "_Test Account Bank Account - _TC", + "doctype": "Journal Voucher Detail", + "debit": 400.0, + "credit": 0.0, + "parentfield": "entries" + } +]] -data = { - "expense_account": { - "doctype": "Account", - "account_name": "Test Expense", - "parent_account": "Direct Expenses - %s" % abbr, - "company": company, - "debit_or_credit": "Debit", - "is_pl_account": "Yes", - "group_or_ledger": "Ledger" - }, - "supplier_account": { - "doctype": "Account", - "account_name": "Test Supplier", - "parent_account": "Accounts Payable - %s" % abbr, - "company": company, - "debit_or_credit": "Credit", - "is_pl_account": "No", - "group_or_ledger": "Ledger" - }, - "test_cost_center": { - "doctype": "Cost Center", - "cost_center_name": "Test Cost Center", - "parent_cost_center": "Root - %s" % abbr, - "company_name": company, - "group_or_ledger": "Ledger", - "company_abbr": abbr - }, - "journal_voucher": [ - { - "doctype": "Journal Voucher", - "voucher_type": "Journal Entry", - "naming_series": "JV", - "posting_date": nowdate(), - "remark": "Test Journal Voucher", - "fiscal_year": get_fiscal_year(nowdate())[0], - "company": company - }, - { - "doctype": "Journal Voucher Detail", - "parentfield": "entries", - "account": "Test Expense - %s" % abbr, - "debit": 5000, - "cost_center": "Test Cost Center - %s" % abbr, - }, - { - "doctype": "Journal Voucher Detail", - "parentfield": "entries", - "account": "Test Supplier - %s" % abbr, - "credit": 5000, - }, - ] -} -def get_name(s): - return s + " - " + abbr -class TestJournalVoucher(unittest.TestCase): - def setUp(self): - webnotes.conn.begin() - - # create a dummy account - webnotes.model.insert([data["expense_account"]]) - webnotes.model.insert([data["supplier_account"]]) - webnotes.model.insert([data["test_cost_center"]]) - - def tearDown(self): - webnotes.conn.rollback() - - def test_save_journal_voucher(self): - expense_ac_balance = get_balance_on(get_name("Test Expense"), nowdate()) - supplier_ac_balance = get_balance_on(get_name("Test Supplier"), nowdate()) - - dl = webnotes.model.insert(data["journal_voucher"]) - dl.submit() - dl.load_from_db() - - # test submitted jv - self.assertTrue(webnotes.conn.exists("Journal Voucher", dl.doclist[0].name)) - for d in dl.doclist[1:]: - self.assertEquals(webnotes.conn.get_value("Journal Voucher Detail", - d.name, "parent"), dl.doclist[0].name) - - # test gl entry - gle = webnotes.conn.sql("""select account, debit, credit - from `tabGL Entry` where voucher_no = %s order by account""", - dl.doclist[0].name) - - self.assertEquals((gle[0][0], flt(gle[0][1]), flt(gle[0][2])), - ('Test Expense - %s' % abbr, 5000.0, 0.0)) - self.assertEquals((gle[1][0], flt(gle[1][1]), flt(gle[1][2])), - ('Test Supplier - %s' % abbr, 0.0, 5000.0)) - - # check balance as on today - self.assertEqual(get_balance_on(get_name("Test Expense"), nowdate()), - expense_ac_balance + 5000) - self.assertEqual(get_balance_on(get_name("Test Supplier"), nowdate()), - supplier_ac_balance + 5000) - - # check previous balance - self.assertEqual(get_balance_on(get_name("Test Expense"), add_days(nowdate(), -1)), 0) \ No newline at end of file + + + +# +# +# import webnotes.model +# from webnotes.utils import nowdate, flt, add_days +# from accounts.utils import get_fiscal_year, get_balance_on +# +# company = webnotes.conn.get_default("company") +# abbr = webnotes.conn.get_value("Company", company, "abbr") +# +# data = { +# "expense_account": { +# "doctype": "Account", +# "account_name": "Test Expense", +# "parent_account": "Direct Expenses - %s" % abbr, +# "company": company, +# "debit_or_credit": "Debit", +# "is_pl_account": "Yes", +# "group_or_ledger": "Ledger" +# }, +# "supplier_account": { +# "doctype": "Account", +# "account_name": "Test Supplier", +# "parent_account": "Accounts Payable - %s" % abbr, +# "company": company, +# "debit_or_credit": "Credit", +# "is_pl_account": "No", +# "group_or_ledger": "Ledger" +# }, +# "test_cost_center": { +# "doctype": "Cost Center", +# "cost_center_name": "Test Cost Center", +# "parent_cost_center": "Root - %s" % abbr, +# "company_name": company, +# "group_or_ledger": "Ledger", +# "company_abbr": abbr +# }, +# "journal_voucher": [ +# { +# "doctype": "Journal Voucher", +# "voucher_type": "Journal Entry", +# "naming_series": "JV", +# "posting_date": nowdate(), +# "remark": "Test Journal Voucher", +# "fiscal_year": get_fiscal_year(nowdate())[0], +# "company": company +# }, +# { +# "doctype": "Journal Voucher Detail", +# "parentfield": "entries", +# "account": "Test Expense - %s" % abbr, +# "debit": 5000, +# "cost_center": "Test Cost Center - %s" % abbr, +# }, +# { +# "doctype": "Journal Voucher Detail", +# "parentfield": "entries", +# "account": "Test Supplier - %s" % abbr, +# "credit": 5000, +# }, +# ] +# } +# +# def get_name(s): +# return s + " - " + abbr +# +# class TestJournalVoucher(unittest.TestCase): +# def setUp(self): +# webnotes.conn.begin() +# +# # create a dummy account +# webnotes.model.insert([data["expense_account"]]) +# webnotes.model.insert([data["supplier_account"]]) +# webnotes.model.insert([data["test_cost_center"]]) +# +# def tearDown(self): +# webnotes.conn.rollback() +# +# def test_save_journal_voucher(self): +# expense_ac_balance = get_balance_on(get_name("Test Expense"), nowdate()) +# supplier_ac_balance = get_balance_on(get_name("Test Supplier"), nowdate()) +# +# dl = webnotes.model.insert(data["journal_voucher"]) +# dl.submit() +# dl.load_from_db() +# +# # test submitted jv +# self.assertTrue(webnotes.conn.exists("Journal Voucher", dl.doclist[0].name)) +# for d in dl.doclist[1:]: +# self.assertEquals(webnotes.conn.get_value("Journal Voucher Detail", +# d.name, "parent"), dl.doclist[0].name) +# +# # test gl entry +# gle = webnotes.conn.sql("""select account, debit, credit +# from `tabGL Entry` where voucher_no = %s order by account""", +# dl.doclist[0].name) +# +# self.assertEquals((gle[0][0], flt(gle[0][1]), flt(gle[0][2])), +# ('Test Expense - %s' % abbr, 5000.0, 0.0)) +# self.assertEquals((gle[1][0], flt(gle[1][1]), flt(gle[1][2])), +# ('Test Supplier - %s' % abbr, 0.0, 5000.0)) +# +# # check balance as on today +# self.assertEqual(get_balance_on(get_name("Test Expense"), nowdate()), +# expense_ac_balance + 5000) +# self.assertEqual(get_balance_on(get_name("Test Supplier"), nowdate()), +# supplier_ac_balance + 5000) +# +# # check previous balance +# self.assertEqual(get_balance_on(get_name("Test Expense"), add_days(nowdate(), -1)), 0) \ No newline at end of file diff --git a/accounts/doctype/sales_invoice/test_sales_invoice.py b/accounts/doctype/sales_invoice/test_sales_invoice.py new file mode 100644 index 0000000000..c222c1aa63 --- /dev/null +++ b/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -0,0 +1,84 @@ +import webnotes +import unittest + +class TestSalesInvoice(unittest.TestCase): + def make(self): + w = webnotes.model_wrapper(webnotes.copy_doclist(test_records[0])) + w.insert() + w.submit() + return w + + def test_outstanding(self): + w = self.make() + self.assertEquals(w.doc.outstanding_amount, w.doc.grand_total) + + def test_payment(self): + w = self.make() + from accounts.doctype.journal_voucher.test_journal_voucher \ + import test_records as jv_test_records + + jv = webnotes.model_wrapper(webnotes.copy_doclist(jv_test_records[0])) + jv.doclist[1].against_invoice = w.doc.name + jv.insert() + jv.submit() + + self.assertEquals(webnotes.conn.get_value("Sales Invoice", w.doc.name, "outstanding_amount"), + 161.8) + + jv.cancel() + self.assertEquals(webnotes.conn.get_value("Sales Invoice", w.doc.name, "outstanding_amount"), + 561.8) + +test_dependencies = ["Journal Voucher"] + +test_records = [[ + { + "naming_series": "_T-Sales Invoice-", + "company": "_Test Company", + "conversion_rate": 1.0, + "currency": "INR", + "debit_to": "_Test Customer - _TC", + "customer": "_Test Customer", + "customer_name": "_Test Customer", + "doctype": "Sales Invoice", + "due_date": "2013-01-23", + "fiscal_year": "_Test Fiscal Year 2013", + "grand_total": 561.8, + "grand_total_export": 561.8, + "net_total": 500.0, + "plc_conversion_rate": 1.0, + "posting_date": "2013-01-23", + "price_list_currency": "INR", + "price_list_name": "_Test Price List", + "territory": "_Test Territory" + }, + { + "amount": 500.0, + "basic_rate": 500.0, + "description": "138-CMS Shoe", + "doctype": "Sales Invoice Item", + "export_amount": 500.0, + "export_rate": 500.0, + "income_account": "Sales - _TC", + "cost_center": "_Test Cost Center - _TC", + "item_name": "138-CMS Shoe", + "parentfield": "entries", + "qty": 1.0 + }, + { + "account_head": "_Test Account VAT - _TC", + "charge_type": "On Net Total", + "description": "VAT", + "doctype": "Sales Taxes and Charges", + "parentfield": "other_charges", + "tax_amount": 30.0, + }, + { + "account_head": "_Test Account Service Tax - _TC", + "charge_type": "On Net Total", + "description": "Service Tax", + "doctype": "Sales Taxes and Charges", + "parentfield": "other_charges", + "tax_amount": 31.8, + } +]] \ No newline at end of file diff --git a/accounts/general_ledger.py b/accounts/general_ledger.py index 06c101b6b5..215c351421 100644 --- a/accounts/general_ledger.py +++ b/accounts/general_ledger.py @@ -24,11 +24,11 @@ def make_gl_entries(gl_map, cancel=False, adv_adj=False, merge_entries=True, if merge_entries: gl_map = merge_similar_entries(gl_map) - check_budget(gl_map, cancel) - save_entries(gl_map, cancel, adv_adj, update_outstanding) - if cancel: set_as_cancel(gl_map[0]["voucher_type"], gl_map[0]["voucher_no"]) + + check_budget(gl_map, cancel) + save_entries(gl_map, cancel, adv_adj, update_outstanding) def merge_similar_entries(gl_map): merged_gl_map = [] diff --git a/patches/february_2013/fix_outstanding.py b/patches/february_2013/fix_outstanding.py index 226b360a29..07ea51a695 100644 --- a/patches/february_2013/fix_outstanding.py +++ b/patches/february_2013/fix_outstanding.py @@ -12,4 +12,4 @@ def execute(): if flt(r[1]) != abs(flt(outstanding[0][0])): # print r, outstanding webnotes.conn.sql("update `tab%s` set outstanding_amount = %s where name = %s" % - (dt, '%s', '%s'), (abs(flt(outstanding[0][0])), si[0])) \ No newline at end of file + (dt, '%s', '%s'), (abs(flt(outstanding[0][0])), r[0])) \ No newline at end of file diff --git a/patches/patch_list.py b/patches/patch_list.py index c00744ea36..1a7483975c 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -169,4 +169,5 @@ patch_list = [ "patches.february_2013.update_company_in_leave_application", "execute:webnotes.conn.sql_ddl('alter table tabSeries change `name` `name` varchar(100)')", "execute:webnotes.conn.sql('update tabUserRole set parentfield=\"user_roles\" where parentfield=\"userroles\"')", + "patches.february_2013.fix_outstanding" ] \ No newline at end of file diff --git a/selling/doctype/sales_common/sales_common.py b/selling/doctype/sales_common/sales_common.py index 21287b0845..49dc9991e3 100644 --- a/selling/doctype/sales_common/sales_common.py +++ b/selling/doctype/sales_common/sales_common.py @@ -734,13 +734,14 @@ class StatusUpdater: """ # get unique transactions to update for d in self.obj.doclist: - if d.doctype == args['source_dt']: + if d.doctype == args['source_dt'] and d.fields.get(args["join_field"]): args['name'] = d.fields[args['join_field']] # get all qty where qty > compare_field - item = webnotes.conn.sql(""" - select item_code, `%(compare_ref_field)s`, `%(compare_field)s`, parenttype, parent from `tab%(target_dt)s` - where `%(compare_ref_field)s` < `%(compare_field)s` and name="%(name)s" and docstatus=1 + item = webnotes.conn.sql("""select item_code, `%(compare_ref_field)s`, + `%(compare_field)s`, parenttype, parent from `tab%(target_dt)s` + where `%(compare_ref_field)s` < `%(compare_field)s` + and name="%(name)s" and docstatus=1 """ % args, as_dict=1) if item: item = item[0] diff --git a/setup/doctype/print_heading/test_print_heading.py b/setup/doctype/print_heading/test_print_heading.py new file mode 100644 index 0000000000..d2ef7c3f7b --- /dev/null +++ b/setup/doctype/print_heading/test_print_heading.py @@ -0,0 +1 @@ +test_records = [[{"print_heading": "_Test Print Heading"}]] \ No newline at end of file diff --git a/setup/doctype/terms_and_conditions/test_terms_and_conditions.py b/setup/doctype/terms_and_conditions/test_terms_and_conditions.py new file mode 100644 index 0000000000..b0d1feeca1 --- /dev/null +++ b/setup/doctype/terms_and_conditions/test_terms_and_conditions.py @@ -0,0 +1 @@ +test_records = [[{"title": "_Test Terms and Conditions", "terms": "_Test Terms"}]] \ No newline at end of file