diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 60ccf1cbde6..a6a97a7aa5d 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -3401,6 +3401,39 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fieldname": "allocate_advances_automatically", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Set Advances and Allocate (FIFO)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.allocate_advances_automatically", "fieldname": "get_advances", "fieldtype": "Button", "hidden": 0, @@ -4526,7 +4559,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-07-30 08:35:17.736855", + "modified": "2018-07-31 18:35:17.736855", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index ca6b47b84f9..194c3641d7c 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -402,7 +402,7 @@ $.extend(cur_frm.cscript, new erpnext.accounts.SalesInvoiceController({frm: cur_ // ------------ cur_frm.cscript.hide_fields = function(doc) { var parent_fields = ['project', 'due_date', 'is_opening', 'source', 'total_advance', 'get_advances', - 'advances', 'advances', 'from_date', 'to_date']; + 'advances', 'from_date', 'to_date']; if(cint(doc.is_pos) == 1) { hide_field(parent_fields); diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index bd0a4d7fb7e..94d46ecef51 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -681,65 +681,69 @@ "unique": 0 }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_21", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_21", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval: doc.is_return && doc.return_against", - "fieldname": "update_billed_amount_in_sales_order", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Update Billed Amount in Sales Order", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval: doc.is_return && doc.return_against", + "fieldname": "update_billed_amount_in_sales_order", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Update Billed Amount in Sales Order", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -2488,10 +2492,10 @@ "allow_in_quick_entry": 0, "allow_on_submit": 0, "bold": 0, - "collapsible": 1, + "collapsible": 1, "collapsible_depends_on": "", "columns": 0, - "depends_on": "", + "depends_on": "", "fieldname": "loyalty_points_redemption", "fieldtype": "Section Break", "hidden": 0, @@ -2524,7 +2528,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "redeem_loyalty_points", + "depends_on": "redeem_loyalty_points", "fieldname": "loyalty_points", "fieldtype": "Int", "hidden": 0, @@ -2536,7 +2540,7 @@ "in_standard_filter": 0, "label": "Loyalty Points", "length": 0, - "no_copy": 1, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 1, @@ -2557,7 +2561,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "redeem_loyalty_points", + "depends_on": "redeem_loyalty_points", "fieldname": "loyalty_amount", "fieldtype": "Currency", "hidden": 0, @@ -2569,7 +2573,7 @@ "in_standard_filter": 0, "label": "Loyalty Amount", "length": 0, - "no_copy": 1, + "no_copy": 1, "permlevel": 0, "precision": "", "print_hide": 1, @@ -2590,38 +2594,38 @@ "bold": 0, "collapsible": 0, "columns": 0, - "fieldname": "redeem_loyalty_points", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Redeem Loyalty Points", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "fieldname": "redeem_loyalty_points", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Redeem Loyalty Points", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, "unique": 0 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, "fieldname": "column_break_77", "fieldtype": "Column Break", "hidden": 0, @@ -2653,8 +2657,8 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "", - "fetch_from": "customer.loyalty_program", + "depends_on": "", + "fetch_from": "customer.loyalty_program", "fieldname": "loyalty_program", "fieldtype": "Link", "hidden": 0, @@ -2666,7 +2670,7 @@ "in_standard_filter": 0, "label": "Loyalty Program", "length": 0, - "no_copy": 1, + "no_copy": 1, "options": "Loyalty Program", "permlevel": 0, "precision": "", @@ -2688,7 +2692,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "redeem_loyalty_points", + "depends_on": "redeem_loyalty_points", "fieldname": "loyalty_redemption_account", "fieldtype": "Link", "hidden": 0, @@ -2700,7 +2704,7 @@ "in_standard_filter": 0, "label": "Redemption Account", "length": 0, - "no_copy": 1, + "no_copy": 1, "options": "Account", "permlevel": 0, "precision": "", @@ -2722,7 +2726,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "depends_on": "redeem_loyalty_points", + "depends_on": "redeem_loyalty_points", "fieldname": "loyalty_redemption_cost_center", "fieldtype": "Link", "hidden": 0, @@ -2734,7 +2738,7 @@ "in_standard_filter": 0, "label": "Redemption Cost Center", "length": 0, - "no_copy": 1, + "no_copy": 1, "options": "Cost Center", "permlevel": 0, "precision": "", @@ -2795,8 +2799,8 @@ "hidden": 0, "ignore_user_permissions": 0, "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, + "in_filter": 0, + "in_global_search": 0, "in_list_view": 0, "in_standard_filter": 0, "label": "Apply Additional Discount On", @@ -3386,6 +3390,39 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fieldname": "allocate_advances_automatically", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Allocate Advances Automatically (FIFO)", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:!doc.allocate_advances_automatically", "fieldname": "get_advances", "fieldtype": "Button", "hidden": 0, @@ -3398,10 +3435,10 @@ "label": "Get Advances Received", "length": 0, "no_copy": 0, - "oldfieldtype": "Button", - "options": "", + "options": "set_advances", "permlevel": 0, - "print_hide": 1, + "precision": "", + "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, "remember_last_selected_value": 0, @@ -5442,7 +5479,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2018-07-30 08:34:55.545490", + "modified": "2018-07-31 19:22:13.027242", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", @@ -5536,6 +5573,5 @@ "timeline_field": "customer", "title_field": "title", "track_changes": 1, - "track_seen": 1, - "track_views": 0 + "track_seen": 1 } \ No newline at end of file diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index b8fa0ecc177..5175395dfde 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -85,8 +85,12 @@ class AccountsController(TransactionBase): if self.doctype == 'Purchase Invoice': self.validate_paid_amount() - if self.doctype in ['Purchase Invoice', 'Sales Invoice'] and self.is_return: - self.validate_qty() + if self.doctype in ['Purchase Invoice', 'Sales Invoice']: + if cint(self.allocate_advances_automatically): + self.set_advances() + + if self.is_return: + self.validate_qty() def validate_invoice_documents_schedule(self): self.validate_payment_schedule_dates() @@ -363,23 +367,6 @@ class AccountsController(TransactionBase): frappe.db.sql("""delete from `tab%s` where parentfield=%s and parent = %s and allocated_amount = 0""" % (childtype, '%s', '%s'), (parentfield, self.name)) - def set_advances(self): - """Returns list of advances against Account, Party, Reference""" - - res = self.get_advance_entries() - - self.set("advances", []) - for d in res: - self.append("advances", { - "doctype": self.doctype + " Advance", - "reference_type": d.reference_type, - "reference_name": d.reference_name, - "reference_row": d.reference_row, - "remarks": d.remarks, - "advance_amount": flt(d.amount), - "allocated_amount": flt(d.amount) if d.against_order else 0 - }) - def apply_shipping_rule(self): if self.shipping_rule: shipping_rule = frappe.get_doc("Shipping Rule", self.shipping_rule) @@ -400,6 +387,30 @@ class AccountsController(TransactionBase): return {} + def set_advances(self): + """Returns list of advances against Account, Party, Reference""" + + res = self.get_advance_entries() + + self.set("advances", []) + advance_allocated = 0 + for d in res: + if d.against_order: + allocated_amount = flt(d.amount) + else: + allocated_amount = min(self.grand_total - advance_allocated, d.amount) + advance_allocated += flt(allocated_amount) + + self.append("advances", { + "doctype": self.doctype + " Advance", + "reference_type": d.reference_type, + "reference_name": d.reference_name, + "reference_row": d.reference_row, + "remarks": d.remarks, + "advance_amount": flt(d.amount), + "allocated_amount": allocated_amount + }) + def get_advance_entries(self, include_unallocated=True): if self.doctype == "Sales Invoice": party_account = self.debit_to diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js index 3f664ae4215..3dfc8911fc4 100644 --- a/erpnext/public/js/controllers/accounts.js +++ b/erpnext/public/js/controllers/accounts.js @@ -52,7 +52,19 @@ frappe.ui.form.on(cur_frm.doctype, { }, taxes_on_form_rendered: function(frm) { erpnext.taxes.set_conditional_mandatory_rate_or_amount(frm.open_grid_row()); - } + }, + + allocate_advances_automatically: function(frm) { + if(frm.doc.allocate_advances_automatically) { + frappe.call({ + doc: frm.doc, + method: "set_advances", + callback: function(r, rt) { + refresh_field("advances"); + } + }) + } + } }); frappe.ui.form.on('Sales Invoice Payment', { @@ -129,7 +141,6 @@ var get_payment_mode_account = function(frm, mode_of_payment, callback) { }); } - cur_frm.cscript.account_head = function(doc, cdt, cdn) { var d = locals[cdt][cdn]; if(!d.charge_type && d.account_head){