From 43520f93a1452e389ef2d2dbd0e27e8a9ff5b3f6 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 21 Mar 2016 18:32:48 +0530 Subject: [PATCH] [fixes] test cases, code cleanup. --- .../purchase_invoice/purchase_invoice.js | 34 +++-------- .../purchase_invoice/purchase_invoice.json | 58 ++++++++++++++++++- .../purchase_invoice/purchase_invoice.py | 19 +----- .../purchase_invoice/test_purchase_invoice.py | 37 +++++++++--- .../doctype/sales_invoice/sales_invoice.js | 33 +++-------- .../doctype/sales_invoice/sales_invoice.py | 15 ----- erpnext/controllers/accounts_controller.py | 20 +++++++ 7 files changed, 120 insertions(+), 96 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js index 7b1b8b19a2f..ebda170404e 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js @@ -111,7 +111,6 @@ erpnext.accounts.PurchaseInvoice = erpnext.buying.BuyingController.extend({ cur_frm.cscript.hide_fields(this.frm.doc); if(cint(this.frm.doc.is_paid)) { if(!this.frm.doc.company) { - this.frm.set_value("x", 0); msgprint(__("Please specify Company to proceed")); } } @@ -165,22 +164,21 @@ cur_frm.script_manager.make(erpnext.accounts.PurchaseInvoice); // Hide Fields // ------------ cur_frm.cscript.hide_fields = function(doc) { - par_flds = ['due_date', 'is_opening', 'advances_section', 'from_date', 'to_date']; + parent_fields = ['due_date', 'is_opening', 'advances_section', 'from_date', 'to_date']; if(cint(doc.is_paid) == 1) { - hide_field(par_flds); + hide_field(parent_fields); } else { - for (i in par_flds) { - var docfield = frappe.meta.docfield_map[doc.doctype][par_flds[i]]; - if(!docfield.hidden) unhide_field(par_flds[i]); + for (i in parent_fields) { + var docfield = frappe.meta.docfield_map[doc.doctype][parent_fields[i]]; + if(!docfield.hidden) unhide_field(parent_fields[i]); } } - item_flds_stock = ['warehouse_section', 'received_qty', 'rejected_qty']; + item_fields_stock = ['warehouse_section', 'received_qty', 'rejected_qty']; - //item_flds_stock = ['serial_no', 'batch_no', 'actual_qty', 'expense_account', 'warehouse', 'expense_account', 'warehouse'] - cur_frm.fields_dict['items'].grid.set_column_disp(item_flds_stock, + cur_frm.fields_dict['items'].grid.set_column_disp(item_fields_stock, (cint(doc.update_stock)==1 ? true : false)); cur_frm.refresh_fields(); @@ -190,24 +188,6 @@ cur_frm.cscript.update_stock = function(doc, dt, dn) { cur_frm.cscript.hide_fields(doc, dt, dn); } -cur_frm.cscript.mode_of_payment = function(doc) { - if(doc.is_paid) { - return cur_frm.call({ - method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account", - args: { - "mode_of_payment": doc.mode_of_payment, - "company": doc.company - }, - callback: function(r, rt) { - if(r.message) { - cur_frm.set_value("cash_bank_account", r.message["account"]); - } - - } - }); - } -} - cur_frm.fields_dict.cash_bank_account.get_query = function(doc) { return { filters: [ diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 7f6a7f155c0..f76442b0be5 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -116,6 +116,31 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "is_paid", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Is Paid", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -277,14 +302,14 @@ "bold": 0, "collapsible": 0, "default": "0", - "fieldname": "is_paid", + "fieldname": "is_return", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "label": "Is Paid", + "label": "Is Return", "length": 0, "no_copy": 0, "permlevel": 0, @@ -2624,7 +2649,34 @@ "search_index": 0, "set_only_once": 0, "unique": 0 - }, + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.is_recurring && doc.recurring_id === doc.name", + "description": "", + "fieldname": "notify_by_email", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Notify by email", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 1, "bold": 0, diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index fcf2667235a..728088bd060 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -354,7 +354,7 @@ class PurchaseInvoice(BuyingController): # self.bk_flush_supp_wh(sl_entries) self.make_sl_entries(sl_entries, allow_negative_stock=allow_negative_stock, via_landed_cost_voucher=via_landed_cost_voucher) - + def on_submit(self): self.check_prev_docstatus() self.validate_asset() @@ -381,7 +381,6 @@ class PurchaseInvoice(BuyingController): self.update_billing_status_in_pr() self.update_project() -<<<<<<< 1b49ed56bdbd4a6cdf93ede3bfa252e5a954ed41 def validate_asset(self): for d in self.get("items"): @@ -409,23 +408,7 @@ class PurchaseInvoice(BuyingController): if self.docstatus==1 and not asset.supplier: frappe.db.set_value("Asset", asset.name, "supplier", self.supplier) - -======= - def on_cancel(self): - if not self.is_return: - from erpnext.accounts.utils import remove_against_link_from_jv - remove_against_link_from_jv(self.doctype, self.name) - - self.update_prevdoc_status() - self.update_billing_status_for_zero_amount_refdoc("Purchase Order") - self.update_billing_status_in_pr() - - self.update_stock_ledger() - self.make_gl_entries_on_cancel() - self.update_project() - ->>>>>>> [fixes] fix perpetual inventory def make_gl_entries(self): auto_accounting_for_stock = \ cint(frappe.defaults.get_global_default("auto_accounting_for_stock")) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 2ac4e12c842..54053735d30 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -315,12 +315,7 @@ class TestPurchaseInvoice(unittest.TestCase): self.assertFalse(gle) - def purchase_invoice_gl_entry_with_perpetual_inventory(self): - """ - 1. create purchase invoice with update stock as true - 2. get gl entry against purchase invoice - 3. check accounts - """ + def test_purchase_invoice_update_stock_gl_entry_with_perpetual_inventory(self): set_perpetual_inventory() pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(), posting_time=frappe.utils.nowtime()) @@ -334,7 +329,30 @@ class TestPurchaseInvoice(unittest.TestCase): expected_gl_entries = dict((d[0], d) for d in [ [pi.credit_to, 0.0, 250.0], - [pi.get("items")[0]["warehouse"], 250.0, 0.0] + [pi.items[0].warehouse, 250.0, 0.0] + ]) + + for i, gle in enumerate(gl_entries): + self.assertEquals(expected_gl_entries[gle.account][0], gle.account) + self.assertEquals(expected_gl_entries[gle.account][1], gle.debit) + self.assertEquals(expected_gl_entries[gle.account][2], gle.credit) + + def test_purchase_invoice_for_is_paid_and_update_stock_gl_entry_with_perpetual_inventory(self): + set_perpetual_inventory() + pi = make_purchase_invoice(update_stock=1, posting_date=frappe.utils.nowdate(), + posting_time=frappe.utils.nowtime(), cash_bank_account="Cash - _TC", is_paid=1) + + gl_entries = frappe.db.sql("""select account, account_currency, debit, credit, + debit_in_account_currency, credit_in_account_currency + from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s + order by account asc""", pi.name, as_dict=1) + + self.assertTrue(gl_entries) + + expected_gl_entries = dict((d[0], d) for d in [ + [pi.credit_to, 250, 250.0], + [pi.items[0].warehouse, 250.0, 0.0], + ["Cash - _TC", 0.0, 250.0] ]) for i, gle in enumerate(gl_entries): @@ -351,6 +369,11 @@ def make_purchase_invoice(**args): pi.posting_time = args.posting_time if args.update_stock: pi.update_stock = 1 + if args.is_paid: + pi.is_paid = 1 + if args.cash_bank_account: + pi.cash_bank_account=args.cash_bank_account + pi.company = args.company or "_Test Company" pi.supplier = args.supplier or "_Test Supplier" pi.currency = args.currency or "INR" diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index f6f746a97ff..18049cca37e 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -278,20 +278,20 @@ $.extend(cur_frm.cscript, new erpnext.accounts.SalesInvoiceController({frm: cur_ // Hide Fields // ------------ cur_frm.cscript.hide_fields = function(doc) { - par_flds = ['project', 'due_date', 'is_opening', 'source', 'total_advance', 'get_advances_received', + parent_fields = ['project', 'due_date', 'is_opening', 'source', 'total_advance', 'get_advances_received', 'advances', 'sales_partner', 'commission_rate', 'total_commission', 'advances', 'from_date', 'to_date']; if(cint(doc.is_pos) == 1) { - hide_field(par_flds); + hide_field(parent_fields); } else { - for (i in par_flds) { - var docfield = frappe.meta.docfield_map[doc.doctype][par_flds[i]]; - if(!docfield.hidden) unhide_field(par_flds[i]); + for (i in parent_fields) { + var docfield = frappe.meta.docfield_map[doc.doctype][parent_fields[i]]; + if(!docfield.hidden) unhide_field(parent_fields[i]); } } - item_flds_stock = ['serial_no', 'batch_no', 'actual_qty', 'expense_account', 'warehouse', 'expense_account', 'warehouse'] - cur_frm.fields_dict['items'].grid.set_column_disp(item_flds_stock, + item_fields_stock = ['serial_no', 'batch_no', 'actual_qty', 'expense_account', 'warehouse', 'expense_account', 'warehouse'] + cur_frm.fields_dict['items'].grid.set_column_disp(item_fields_stock, (cint(doc.update_stock)==1 ? true : false)); // India related fields @@ -303,25 +303,6 @@ cur_frm.cscript.hide_fields = function(doc) { cur_frm.refresh_fields(); } - -cur_frm.cscript.mode_of_payment = function(doc) { - if(doc.is_pos) { - return cur_frm.call({ - method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account", - args: { - "mode_of_payment": doc.mode_of_payment, - "company": doc.company - }, - callback: function(r, rt) { - if(r.message) { - cur_frm.set_value("cash_bank_account", r.message["account"]); - } - - } - }); - } -} - cur_frm.cscript.update_stock = function(doc, dt, dn) { cur_frm.cscript.hide_fields(doc, dt, dn); } diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index bc1d73d15c4..265c38b91a7 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -461,21 +461,6 @@ class SalesInvoice(SellingController): d.income_account = disposal_account - def on_update(self): - if cint(self.is_pos) == 1: - if flt(self.paid_amount) == 0: - if self.cash_bank_account: - frappe.db.set(self, 'paid_amount', - flt(flt(self.grand_total) - flt(self.write_off_amount), self.precision("paid_amount"))) - else: - # show message that the amount is not paid - frappe.db.set(self,'paid_amount',0) - frappe.msgprint(_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified")) - else: - frappe.db.set(self,'paid_amount',0) - - frappe.db.set(self, 'base_paid_amount', - flt(self.paid_amount*self.conversion_rate, self.precision("base_paid_amount"))) def check_prev_docstatus(self): for d in self.get('items'): diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 50d4d8a2abb..cc64a26aa87 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -54,6 +54,26 @@ class AccountsController(TransactionBase): if not self.get("__islocal"): validate_recurring_document(self) convert_to_recurring(self, self.get("posting_date") or self.get("transaction_date")) + + self.validate_paid_amount() + + def validate_paid_amount(self): + if hasattr(self, "is_pos") or hasattr(self, "is_paid"): + is_paid = self.get("is_pos") or self.get("is_paid") + if cint(is_paid) == 1: + if flt(self.paid_amount) == 0: + if self.cash_bank_account: + frappe.db.set(self, 'paid_amount', + flt(flt(self.grand_total) - flt(self.write_off_amount), self.precision("paid_amount"))) + else: + # show message that the amount is not paid + frappe.db.set(self,'paid_amount',0) + frappe.msgprint(_("Note: Payment Entry will not be created since 'Cash or Bank Account' was not specified")) + else: + frappe.db.set(self,'paid_amount',0) + + frappe.db.set(self, 'base_paid_amount', + flt(self.paid_amount*self.conversion_rate, self.precision("base_paid_amount"))) def on_update_after_submit(self): if self.meta.get_field("is_recurring"):