From 8c9c9cfc5fd0938a97b117a8aebfb031cebd6b95 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 27 Dec 2016 12:31:35 +0530 Subject: [PATCH 01/14] When a new company is made, cash account should be automatically set for Mode of Payment --- erpnext/accounts/page/pos/pos.js | 2 +- erpnext/setup/doctype/company/company.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index a4078bdca6..c0f82bc526 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -593,7 +593,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ this.remove_item = [] $.each(this.frm.doc["items"] || [], function(i, d) { - if(d.serial_no){ + if(d.serial_no && field == 'qty'){ me.validate_serial_no_qty(d, item_code, field, value) } diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 7f506d5440..94a01010fb 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -78,6 +78,8 @@ class Company(Document): if not frappe.local.flags.ignore_chart_of_accounts: self.set_default_accounts() + if self.default_cash_account: + self.mode_of_payment() if self.default_currency: frappe.db.set_value("Currency", self.default_currency, "enabled", 1) @@ -162,6 +164,16 @@ class Company(Document): if account: self.db_set(fieldname, account) + def mode_of_payment(self): + cash = frappe.db.get_value('Mode of Payment', {'type': 'Cash'}, 'name') + if cash: + mode_of_payment = frappe.get_doc('Mode of Payment', cash) + mode_of_payment.append('accounts', { + 'company': self.name, + 'default_account': self.default_cash_account + }) + mode_of_payment.save(ignore_permissions=True) + def create_default_cost_center(self): cc_list = [ { From fe7a5b305f7cd1f15a3da5de25f2a7cbbe4f79ed Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 27 Dec 2016 14:15:52 +0530 Subject: [PATCH 02/14] create customer from POS --- erpnext/accounts/doctype/sales_invoice/pos.py | 1 + erpnext/accounts/page/pos/pos.js | 64 +++++++++++++++---- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py index 3619e989d8..f5721e884d 100644 --- a/erpnext/accounts/doctype/sales_invoice/pos.py +++ b/erpnext/accounts/doctype/sales_invoice/pos.py @@ -41,6 +41,7 @@ def get_pos_data(): 'pos_profile': pos_profile, 'meta': { 'invoice': frappe.get_meta('Sales Invoice'), + 'customer': frappe.get_meta('Customer'), 'items': frappe.get_meta('Sales Invoice Item'), 'taxes': frappe.get_meta('Sales Taxes and Charges') } diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index c0f82bc526..cae2d996a1 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -325,6 +325,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ $.each(this.meta, function(i, data){ frappe.meta.sync(data) + locals["DocType"][data.name] = data; }) this.print_template_data = frappe.render_template("print_template", @@ -412,21 +413,26 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ autoFocus: true, source: function (request, response) { me.customer_data = me.get_customers(request.term) + me.add_customer(); + response($.map(me.customer_data, function(data){ - return {label: data.name, value: data.name, - customer_group: data.customer_group, territory: data.territory} + return {label: data.name, customer_name: data.name, customer_group: data.customer_group, + territory: data.territory, onclick: data.onclick} })) }, - change: function(event, ui){ - if(ui.item){ - me.frm.doc.customer = ui.item.label; - me.frm.doc.customer_name = ui.item.customer_name; - me.frm.doc.customer_group = ui.item.customer_group; - me.frm.doc.territory = ui.item.territory; - }else{ - me.frm.doc.customer = me.party_field.$input.val(); + select: function(event, ui){ + if(ui.item.onclick) { + ui.item.value = "" + ui.item.onclick(me); + }else if(ui.item) { + me.update_customer_data(ui.item) } me.refresh(); + }, + change: function(event, ui) { + if(!ui.item) { + me.frm.doc.customer = $(this).val(); + } } }).on("focus", function(){ setTimeout(function() { @@ -434,7 +440,43 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ me.party_field.$input.autocomplete( "search", " " ); } }, 500); - }); + }).autocomplete(this.party_field).data('ui-autocomplete')._renderItem = function(ul, d){ + var html = "" + __(d.label) + ""; + return $('
  • ') + .data('item.autocomplete', d) + .html('

    ' + html + '

    ') + .appendTo(ul); + } + }, + + add_customer: function() { + var me = this; + if(this.connection_status) { + this.customer_data.push({ + name: "" + + " " + + __("Create a new Customer") + + "", + onclick: me.new_customer + }); + } + }, + + new_customer: function(obj) { + var me = obj; + frappe.ui.form.quick_entry('Customer', function(doc){ + me.customers.push(doc) + me.party_field.$input.val(doc.name); + me.update_customer_data(doc) + }) + }, + + update_customer_data: function(doc) { + var me = this; + this.frm.doc.customer = doc.label || doc.name; + this.frm.doc.customer_name = doc.customer_name; + this.frm.doc.customer_group = doc.customer_group; + this.frm.doc.territory = doc.territory; }, get_customers: function(key){ From aa9b8603b9ffb60d46b7b193e58fb63a7bd47909 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 27 Dec 2016 17:30:45 +0530 Subject: [PATCH 03/14] added paid amount in print format --- .../print_format/point_of_sale/point_of_sale.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/print_format/point_of_sale/point_of_sale.json b/erpnext/accounts/print_format/point_of_sale/point_of_sale.json index 773f7fc8e3..367ce07e28 100644 --- a/erpnext/accounts/print_format/point_of_sale/point_of_sale.json +++ b/erpnext/accounts/print_format/point_of_sale/point_of_sale.json @@ -1,4 +1,5 @@ { + "align_labels_left": 0, "creation": "2016-05-05 17:16:18.564460", "custom_format": 1, "disabled": 0, @@ -6,13 +7,16 @@ "docstatus": 0, "doctype": "Print Format", "font": "Default", - "html": "\n\n

    \n\t{{ company }}
    \n\t{{ __(\"POS No : \") }}{{offline_pos_name}}
    \n

    \n

    \n\t{{ __(\"Date\") }}: {{ dateutil.global_date_format(posting_date) }}
    \n

    \n\n
    \n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\t{% for item in items %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endfor %}\n\t\n
    {{ __(\"Item\") }}{{ __(\"Qty\") }}{{ __(\"Amount\") }}
    \n\t\t\t\t{{ item.item_name }}\n\t\t\t{{ format_number(item.qty, precision(\"difference\")) }}
    @ {{ format_currency(item.rate, currency) }}
    {{ format_currency(item.amount, currency) }}
    \n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% for row in taxes %}\n\t\t{% if not row.included_in_print_rate %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endif %}\n\t\t{% endfor %}\n\t\t{% if discount_amount %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endif %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n
    \n\t\t\t\t{{ __(\"Net Total\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(total, currency) }}\n\t\t\t
    \n\t\t\t\t{{ row.description }}\n\t\t\t\n\t\t\t\t{{ format_currency(row.tax_amount, currency) }}\n\t\t\t
    \n\t\t\t\t{{ __(\"Discount\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(discount_amount, currency) }}\n\t\t\t
    \n\t\t\t\t{{ __(\"Grand Total\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(grand_total, currency) }}\n\t\t\t
    \n\n\n
    \n

    {{ __(\"Thank you, please visit again.\") }}

    ", + "html": "\n\n

    \n\t{{ company }}
    \n\t{{ __(\"POS No : \") }}{{offline_pos_name}}
    \n

    \n

    \n\t{{ __(\"Date\") }}: {{ dateutil.global_date_format(posting_date) }}
    \n

    \n\n
    \n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\t{% for item in items %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endfor %}\n\t\n
    {{ __(\"Item\") }}{{ __(\"Qty\") }}{{ __(\"Amount\") }}
    \n\t\t\t\t{{ item.item_name }}\n\t\t\t{{ format_number(item.qty, precision(\"difference\")) }}
    @ {{ format_currency(item.rate, currency) }}
    {{ format_currency(item.amount, currency) }}
    \n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% for row in taxes %}\n\t\t{% if not row.included_in_print_rate %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endif %}\n\t\t{% endfor %}\n\t\t{% if discount_amount %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t{% endif %}\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n
    \n\t\t\t\t{{ __(\"Net Total\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(total, currency) }}\n\t\t\t
    \n\t\t\t\t{{ row.description }}\n\t\t\t\n\t\t\t\t{{ format_currency(row.tax_amount, currency) }}\n\t\t\t
    \n\t\t\t\t{{ __(\"Discount\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(discount_amount, currency) }}\n\t\t\t
    \n\t\t\t\t{{ __(\"Grand Total\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(grand_total, currency) }}\n\t\t\t
    \n\t\t\t\t{{ __(\"Paid Amount\") }}\n\t\t\t\n\t\t\t\t{{ format_currency(paid_amount, currency) }}\n\t\t\t
    \n\n\n
    \n

    {{ __(\"Thank you, please visit again.\") }}

    ", "idx": 0, - "modified": "2016-09-05 08:28:42.308782", + "line_breaks": 0, + "modified": "2016-12-27 17:22:17.391673", "modified_by": "Administrator", + "module": "Accounts", "name": "Point of Sale", "owner": "Administrator", "print_format_builder": 0, "print_format_type": "Js", + "show_section_headings": 0, "standard": "Yes" } \ No newline at end of file From 249bc6167f2f395df6522914b699b81483517376 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 27 Dec 2016 18:15:36 +0530 Subject: [PATCH 04/14] fix company issue --- erpnext/setup/doctype/company/company.py | 2 +- erpnext/setup/doctype/company/test_company.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 94a01010fb..32ad8ebe1b 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -166,7 +166,7 @@ class Company(Document): def mode_of_payment(self): cash = frappe.db.get_value('Mode of Payment', {'type': 'Cash'}, 'name') - if cash: + if cash and not frappe.db.get_value('Mode of Payment Account', {'company': self.name}): mode_of_payment = frappe.get_doc('Mode of Payment', cash) mode_of_payment.append('accounts', { 'company': self.name, diff --git a/erpnext/setup/doctype/company/test_company.py b/erpnext/setup/doctype/company/test_company.py index 43cb4d3c42..d2e7d23d92 100644 --- a/erpnext/setup/doctype/company/test_company.py +++ b/erpnext/setup/doctype/company/test_company.py @@ -40,9 +40,10 @@ class TestCompany(unittest.TestCase): acc = frappe.get_doc("Account", account) for prop, val in acc_property.items(): self.assertEqual(acc.get(prop), val) - + + self.delete_mode_of_payment("COA from Existing Company") frappe.delete_doc("Company", "COA from Existing Company") - + def test_coa_based_on_country_template(self): countries = ["India", "Brazil", "United Arab Emirates", "Canada", "Germany", "France", "Guatemala", "Indonesia", "Mexico", "Nicaragua", "Netherlands", "Singapore"] @@ -78,4 +79,9 @@ class TestCompany(unittest.TestCase): self.assertTrue(frappe.get_all("Account", filters)) finally: - frappe.delete_doc("Company", template) \ No newline at end of file + self.delete_mode_of_payment(template) + frappe.delete_doc("Company", template) + + def delete_mode_of_payment(self, company): + frappe.db.sql(""" delete from `tabMode of Payment Account` + where company =%s """, (company)) From bef185c404324328871d513b883b17b26d5a1558 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 28 Dec 2016 15:16:49 +0530 Subject: [PATCH 05/14] restrict user to edit the rate in the POS --- .../doctype/pos_profile/pos_profile.json | 121 ++++++++---------- erpnext/accounts/page/pos/pos.js | 1 + erpnext/public/js/pos/pos_bill_item.html | 8 +- 3 files changed, 64 insertions(+), 66 deletions(-) diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.json b/erpnext/accounts/doctype/pos_profile/pos_profile.json index cef56af747..a25dd5198d 100644 --- a/erpnext/accounts/doctype/pos_profile/pos_profile.json +++ b/erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -22,7 +22,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, - "in_standard_filter": 1, "label": "Applicable for User", "length": 0, "no_copy": 0, @@ -52,7 +51,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Series", "length": 0, "no_copy": 1, @@ -84,7 +82,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Update Stock", "length": 0, "no_copy": 0, @@ -112,7 +109,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Warehouse", "length": 0, "no_copy": 0, @@ -142,7 +138,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Campaign", "length": 0, "no_copy": 0, @@ -159,34 +154,6 @@ "set_only_once": 0, "unique": 0 }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "ignore_pricing_rule", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Ignore Pricing Rule", - "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, - "unique": 0 - }, { "allow_on_submit": 0, "bold": 0, @@ -199,7 +166,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -226,7 +192,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Customer", "length": 0, "no_copy": 0, @@ -256,7 +221,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, - "in_standard_filter": 1, "label": "Company", "length": 0, "no_copy": 0, @@ -286,7 +250,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Currency", "length": 0, "no_copy": 0, @@ -304,6 +267,33 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Ignore Pricing Rule", + "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, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -316,7 +306,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Allow Delete", "length": 0, "no_copy": 0, @@ -332,6 +321,33 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "allow_user_to_edit_rate", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Allow user to edit Rate", + "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, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -344,7 +360,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -371,7 +386,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Sales Invoice Payment", "length": 0, "no_copy": 0, @@ -400,7 +414,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -427,7 +440,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Item Groups", "length": 0, "no_copy": 0, @@ -456,7 +468,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -483,7 +494,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Customer Groups", "length": 0, "no_copy": 0, @@ -512,7 +522,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -540,7 +549,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Print Format", "length": 0, "no_copy": 0, @@ -569,7 +577,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Letter Head", "length": 0, "no_copy": 0, @@ -599,7 +606,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Print Heading", "length": 0, "no_copy": 0, @@ -629,7 +635,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Terms and Conditions", "length": 0, "no_copy": 0, @@ -659,7 +664,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "length": 0, "no_copy": 0, "oldfieldtype": "Column Break", @@ -687,7 +691,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Territory", "length": 0, "no_copy": 0, @@ -717,7 +720,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Price List", "length": 0, "no_copy": 0, @@ -747,7 +749,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Apply Discount", "length": 0, "no_copy": 0, @@ -777,7 +778,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Apply Discount On", "length": 0, "no_copy": 0, @@ -806,7 +806,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -834,7 +833,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Write Off Account", "length": 0, "no_copy": 0, @@ -863,7 +861,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Write Off Cost Center", "length": 0, "no_copy": 0, @@ -892,7 +889,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Account for Change Amount", "length": 0, "no_copy": 0, @@ -921,7 +917,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Taxes and Charges", "length": 0, "no_copy": 0, @@ -951,7 +946,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -978,7 +972,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Income Account", "length": 0, "no_copy": 0, @@ -1009,7 +1002,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Expense Account", "length": 0, "no_copy": 0, @@ -1037,7 +1029,6 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, "label": "Cost Center", "length": 0, "no_copy": 0, @@ -1067,8 +1058,8 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-12-12 17:02:22.323006", - "modified_by": "Administrator", + "modified": "2016-12-28 15:14:59.411457", + "modified_by": "rohit@erpnext.com", "module": "Accounts", "name": "POS Profile", "owner": "Administrator", diff --git a/erpnext/accounts/page/pos/pos.js b/erpnext/accounts/page/pos/pos.js index cae2d996a1..55f66534b1 100644 --- a/erpnext/accounts/page/pos/pos.js +++ b/erpnext/accounts/page/pos/pos.js @@ -806,6 +806,7 @@ erpnext.pos.PointOfSale = erpnext.taxes_and_totals.extend({ actual_qty: me.actual_qty_dict[d.item_code] || 0, projected_qty: d.projected_qty, rate: format_number(d.rate, me.frm.doc.currency), + enabled: me.pos_profile_data["allow_user_to_edit_rate"] ? true: false, amount: format_currency(d.amount, me.frm.doc.currency) })).appendTo($items); }); diff --git a/erpnext/public/js/pos/pos_bill_item.html b/erpnext/public/js/pos/pos_bill_item.html index a6ef2d636a..d8833bb835 100644 --- a/erpnext/public/js/pos/pos_bill_item.html +++ b/erpnext/public/js/pos/pos_bill_item.html @@ -17,7 +17,13 @@
    -
    +
    + {% if(enabled) { %} + + {% } else { %} +
    {%= format_currency(rate) %}
    + {% } %} +

    {%= amount %}

    From 5a383e5cddfadb0ad6c08feccee80b7933db97ab Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 2 Jan 2017 16:20:43 +0530 Subject: [PATCH 06/14] [Enhancement] Consolidated billed report, changed type from query to script --- .../delivered_items_to_be_billed.js | 8 ++++ .../delivered_items_to_be_billed.json | 4 +- .../delivered_items_to_be_billed.py | 26 +++++++++++++ erpnext/accounts/report/non_billed_report.py | 38 +++++++++++++++++++ .../ordered_items_to_be_billed.js | 8 ++++ .../ordered_items_to_be_billed.json | 4 +- .../ordered_items_to_be_billed.py | 26 +++++++++++++ .../purchase_order_items_to_be_billed.js | 8 ++++ .../purchase_order_items_to_be_billed.json | 4 +- .../purchase_order_items_to_be_billed.py | 26 +++++++++++++ .../received_items_to_be_billed.js | 8 ++++ .../received_items_to_be_billed.json | 4 +- .../received_items_to_be_billed.py | 26 +++++++++++++ 13 files changed, 182 insertions(+), 8 deletions(-) create mode 100644 erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.js create mode 100644 erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py create mode 100644 erpnext/accounts/report/non_billed_report.py create mode 100644 erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.js create mode 100644 erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.py create mode 100644 erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.js create mode 100644 erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.py create mode 100644 erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.js create mode 100644 erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py diff --git a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.js b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.js new file mode 100644 index 0000000000..1454b2c73c --- /dev/null +++ b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.query_reports["Delivered Items To Be Billed"] = { + "filters": [ + + ] +} diff --git a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json index 3432273230..f9d830bc94 100644 --- a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json +++ b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-08-18 14:29:50.680329", + "modified": "2017-01-02 16:13:27.369266", "modified_by": "Administrator", "module": "Accounts", "name": "Delivered Items To Be Billed", @@ -15,5 +15,5 @@ "query": "select\n `tabDelivery Note`.`name` as \"Delivery Note:Link/Delivery Note:120\",\n\t`tabDelivery Note`.`customer` as \"Customer:Link/Customer:120\",\n\t`tabDelivery Note`.`customer_name` as \"Customer Name::150\",\n\t`tabDelivery Note`.`posting_date` as \"Date:Date\",\n\t`tabDelivery Note`.`project` as \"Project\",\n\t`tabDelivery Note Item`.`item_code` as \"Item:Link/Item:120\",\n\t(`tabDelivery Note Item`.`base_amount` - `tabDelivery Note Item`.`billed_amt`*ifnull(`tabDelivery Note`.conversion_rate, 1)) as \"Pending Amount:Currency:110\",\n\t`tabDelivery Note Item`.`item_name` as \"Item Name::150\",\n\t`tabDelivery Note Item`.`description` as \"Description::200\",\n\t`tabDelivery Note`.`company` as \"Company:Link/Company:\"\nfrom `tabDelivery Note`, `tabDelivery Note Item`\nwhere \n `tabDelivery Note`.name = `tabDelivery Note Item`.parent \n and `tabDelivery Note`.docstatus = 1 \n and `tabDelivery Note`.`status` not in (\"Stopped\", \"Closed\") \n and `tabDelivery Note Item`.amount > 0\n and `tabDelivery Note Item`.billed_amt < `tabDelivery Note Item`.amount\norder by `tabDelivery Note`.`name` desc", "ref_doctype": "Sales Invoice", "report_name": "Delivered Items To Be Billed", - "report_type": "Query Report" + "report_type": "Script Report" } \ No newline at end of file diff --git a/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py new file mode 100644 index 0000000000..9bf851df41 --- /dev/null +++ b/erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py @@ -0,0 +1,26 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from erpnext.accounts.report.non_billed_report import get_ordered_to_be_billed_data + +def execute(filters=None): + columns = get_column() + args = get_args() + data = get_ordered_to_be_billed_data(args) + return columns, data + +def get_column(): + return [ + _("Delivery Note") + ":Link/Delivery Note:120", _("Date") + ":Date:100", + _("Suplier") + ":Link/Customer:120", _("Customer Name") + "::120", + _("Project") + ":Link/Project:120", _("Item Code") + ":Link/Item:120", + _("Amount") + ":Currency:100", _("Billed Amount") + ":Currency:100", _("Pending Amount") + ":Currency:100", + _("Item Name") + "::120", _("Description") + "::120", _("Company") + ":Link/Company:120", + ] + +def get_args(): + return {'doctype': 'Delivery Note', 'party': 'customer', + 'date': 'posting_date', 'order': 'name', 'order_by': 'desc'} \ No newline at end of file diff --git a/erpnext/accounts/report/non_billed_report.py b/erpnext/accounts/report/non_billed_report.py new file mode 100644 index 0000000000..41ec9b7466 --- /dev/null +++ b/erpnext/accounts/report/non_billed_report.py @@ -0,0 +1,38 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from erpnext import get_default_currency +from frappe.model.meta import get_field_precision + +def get_ordered_to_be_billed_data(args): + doctype, party = args.get('doctype'), args.get('party') + child_tab = doctype + " Item" + precision = get_field_precision(frappe.get_meta(child_tab).get_field("billed_amt"), + currency=get_default_currency()) or 2 + + project_field = get_project_field(doctype, party) + + return frappe.db.sql(""" + Select + `{parent_tab}`.name, `{parent_tab}`.{date_field}, `{parent_tab}`.{party}, `{parent_tab}`.{party}_name, + {project_field}, `{child_tab}`.item_code, `{child_tab}`.base_amount, + (`{child_tab}`.billed_amt * ifnull(`{parent_tab}`.conversion_rate, 1)), + (`{child_tab}`.base_amount - (`{child_tab}`.billed_amt * ifnull(`{parent_tab}`.conversion_rate, 1))), + `{child_tab}`.item_name, `{child_tab}`.description, `{parent_tab}`.company + from + `{parent_tab}`, `{child_tab}` + where + `{parent_tab}`.name = `{child_tab}`.parent and `{parent_tab}`.docstatus = 1 and `{parent_tab}`.status != 'Closed' + and `{child_tab}`.amount > 0 and round(`{child_tab}`.billed_amt * + ifnull(`{parent_tab}`.conversion_rate, 1), {precision}) < `{child_tab}`.base_amount + order by + `{parent_tab}`.{order} {order_by} + """.format(parent_tab = 'tab' + doctype, child_tab = 'tab' + child_tab, precision= precision, party = party, + date_field = args.get('date'), project_field = project_field, order= args.get('order'), order_by = args.get('order_by'))) + +def get_project_field(doctype, party): + if party == "supplier": doctype = doctype + ' Item' + return "`tab%s`.project"%(doctype) \ No newline at end of file diff --git a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.js b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.js new file mode 100644 index 0000000000..6e13d67766 --- /dev/null +++ b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.query_reports["Ordered Items To Be Billed"] = { + "filters": [ + + ] +} diff --git a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json index 9091aa196f..96cf1a34f7 100644 --- a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json +++ b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-08-18 14:29:50.680329", + "modified": "2017-01-02 14:53:06.277319", "modified_by": "Administrator", "module": "Accounts", "name": "Ordered Items To Be Billed", @@ -15,5 +15,5 @@ "query": "select \n `tabSales Order`.`name` as \"Sales Order:Link/Sales Order:120\",\n `tabSales Order`.`customer` as \"Customer:Link/Customer:120\",\n `tabSales Order`.`customer_name` as \"Customer Name:150\",\n`tabSales Order`.`status` as \"Status\",\n `tabSales Order`.`transaction_date` as \"Date:Date\",\n `tabSales Order`.`project` as \"Project\",\n `tabSales Order Item`.item_code as \"Item:Link/Item:120\",\n `tabSales Order Item`.base_amount as \"Amount:Currency:110\",\n (`tabSales Order Item`.billed_amt * ifnull(`tabSales Order`.conversion_rate, 1)) as \"Billed Amount:Currency:110\",\n (`tabSales Order Item`.base_amount - (`tabSales Order Item`.billed_amt * ifnull(`tabSales Order`.conversion_rate, 1))) as \"Pending Amount:Currency:120\",\n `tabSales Order Item`.item_name as \"Item Name::150\",\n `tabSales Order Item`.description as \"Description::200\",\n `tabSales Order`.`company` as \"Company:Link/Company:\"\nfrom\n `tabSales Order`, `tabSales Order Item`\nwhere\n `tabSales Order Item`.`parent` = `tabSales Order`.`name`\n and `tabSales Order`.docstatus = 1\n and `tabSales Order`.status != \"Closed\"\n and `tabSales Order Item`.amount > 0\n and `tabSales Order Item`.billed_amt < `tabSales Order Item`.amount\norder by `tabSales Order`.transaction_date asc", "ref_doctype": "Sales Invoice", "report_name": "Ordered Items To Be Billed", - "report_type": "Query Report" + "report_type": "Script Report" } \ No newline at end of file diff --git a/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.py b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.py new file mode 100644 index 0000000000..5765266f1c --- /dev/null +++ b/erpnext/accounts/report/ordered_items_to_be_billed/ordered_items_to_be_billed.py @@ -0,0 +1,26 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from erpnext.accounts.report.non_billed_report import get_ordered_to_be_billed_data + +def execute(filters=None): + columns = get_column() + args = get_args() + data = get_ordered_to_be_billed_data(args) + return columns, data + +def get_column(): + return [ + _("Sales Order") + ":Link/Sales Order:120", _("Date") + ":Date:100", + _("Suplier") + ":Link/Customer:120", _("Customer Name") + "::120", + _("Project") + ":Link/Project:120", _("Item Code") + ":Link/Item:120", + _("Amount") + ":Currency:100", _("Billed Amount") + ":Currency:100", _("Pending Amount") + ":Currency:100", + _("Item Name") + "::120", _("Description") + "::120", _("Company") + ":Link/Company:120", + ] + +def get_args(): + return {'doctype': 'Sales Order', 'party': 'customer', + 'date': 'transaction_date', 'order': 'transaction_date', 'order_by': 'asc'} \ No newline at end of file diff --git a/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.js b/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.js new file mode 100644 index 0000000000..24c9592c24 --- /dev/null +++ b/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.query_reports["Purchase Order Items To Be Billed"] = { + "filters": [ + + ] +} diff --git a/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.json b/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.json index 004c5a9223..16ed1bebbd 100644 --- a/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.json +++ b/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-08-18 15:46:45.789536", + "modified": "2017-01-02 12:08:36.400900", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Order Items To Be Billed", @@ -15,5 +15,5 @@ "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`.`supplier_name` as \"Supplier Name::150\",\n\t`tabPurchase Order Item`.`project` as \"Project\",\n\t`tabPurchase Order Item`.item_code as \"Item Code:Link/Item:120\",\n\t`tabPurchase Order Item`.base_amount as \"Amount:Currency:100\",\n\t(`tabPurchase Order Item`.billed_amt * ifnull(`tabPurchase Order`.conversion_rate, 1)) as \"Billed Amount:Currency:100\", \n\t(`tabPurchase Order Item`.base_amount - (`tabPurchase Order Item`.billed_amt * ifnull(`tabPurchase Order`.conversion_rate, 1))) as \"Amount to Bill:Currency:100\",\n\t`tabPurchase Order Item`.item_name as \"Item Name::150\",\n\t`tabPurchase Order Item`.description as \"Description::200\",\n\t`tabPurchase Order`.company as \"Company:Link/Company:\"\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 != \"Closed\"\n and `tabPurchase Order Item`.amount > 0\n\tand (`tabPurchase Order Item`.billed_amt * ifnull(`tabPurchase Order`.conversion_rate, 1)) < `tabPurchase Order Item`.base_amount\norder by `tabPurchase Order`.transaction_date asc", "ref_doctype": "Purchase Invoice", "report_name": "Purchase Order Items To Be Billed", - "report_type": "Query Report" + "report_type": "Script Report" } \ No newline at end of file diff --git a/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.py b/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.py new file mode 100644 index 0000000000..5aed93d348 --- /dev/null +++ b/erpnext/accounts/report/purchase_order_items_to_be_billed/purchase_order_items_to_be_billed.py @@ -0,0 +1,26 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from erpnext.accounts.report.non_billed_report import get_ordered_to_be_billed_data + +def execute(filters=None): + columns = get_column() + args = get_args() + data = get_ordered_to_be_billed_data(args) + return columns, data + +def get_column(): + return [ + _("Purchase Order") + ":Link/Purchase Order:120", _("Date") + ":Date:100", + _("Suplier") + ":Link/Supplier:120", _("Suplier Name") + "::120", + _("Project") + ":Link/Project:120", _("Item Code") + ":Link/Item:120", + _("Amount") + ":Currency:100", _("Billed Amount") + ":Currency:100", _("Amount to Bill") + ":Currency:100", + _("Item Name") + "::120", _("Description") + "::120", _("Company") + ":Link/Company:120", + ] + +def get_args(): + return {'doctype': 'Purchase Order', 'party': 'supplier', + 'date': 'transaction_date', 'order': 'transaction_date', 'order_by': 'asc'} diff --git a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.js b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.js new file mode 100644 index 0000000000..0ee3f57717 --- /dev/null +++ b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.query_reports["Received Items To Be Billed"] = { + "filters": [ + + ] +} diff --git a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json index 00964c01b6..0379a5cdfd 100644 --- a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json +++ b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.json @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2016-08-18 14:32:20.965816", + "modified": "2017-01-02 16:05:01.929390", "modified_by": "Administrator", "module": "Accounts", "name": "Received Items To Be Billed", @@ -15,5 +15,5 @@ "query": "select\n `tabPurchase Receipt`.`name` as \"Purchase Receipt:Link/Purchase Receipt:120\",\n `tabPurchase Receipt`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`tabPurchase Receipt`.`supplier_name` as \"Supplier Name::150\",\n\t`tabPurchase Receipt`.`posting_date` as \"Date:Date\",\n\t`tabPurchase Receipt Item`.`project` as \"Project\",\n\t`tabPurchase Receipt Item`.`item_code` as \"Item:Link/Item:120\",\n\t(`tabPurchase Receipt Item`.`base_amount` - `tabPurchase Receipt Item`.`billed_amt`*ifnull(`tabPurchase Receipt`.conversion_rate, 1)) as \"Pending Amount:Currency:110\",\n\t`tabPurchase Receipt Item`.`item_name` as \"Item Name::150\",\n\t`tabPurchase Receipt Item`.`description` as \"Description::200\",\n\t`tabPurchase Receipt`.`company` as \"Company:Link/Company:\"\nfrom `tabPurchase Receipt`, `tabPurchase Receipt Item`\nwhere\n `tabPurchase Receipt`.name = `tabPurchase Receipt Item`.parent \n and `tabPurchase Receipt`.docstatus = 1 \n and `tabPurchase Receipt`.status != \"Closed\" \n and `tabPurchase Receipt Item`.amount > 0\n and `tabPurchase Receipt Item`.billed_amt < `tabPurchase Receipt Item`.amount\norder by `tabPurchase Receipt`.`name` desc", "ref_doctype": "Purchase Invoice", "report_name": "Received Items To Be Billed", - "report_type": "Query Report" + "report_type": "Script Report" } \ No newline at end of file diff --git a/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py new file mode 100644 index 0000000000..2ab3053cf8 --- /dev/null +++ b/erpnext/accounts/report/received_items_to_be_billed/received_items_to_be_billed.py @@ -0,0 +1,26 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from erpnext.accounts.report.non_billed_report import get_ordered_to_be_billed_data + +def execute(filters=None): + columns = get_column() + args = get_args() + data = get_ordered_to_be_billed_data(args) + return columns, data + +def get_column(): + return [ + _("Purchase Receipt") + ":Link/Purchase Receipt:120", _("Date") + ":Date:100", + _("Suplier") + ":Link/Supplier:120", _("Suplier Name") + "::120", + _("Project") + ":Link/Project:120", _("Item Code") + ":Link/Item:120", + _("Amount") + ":Currency:100", _("Billed Amount") + ":Currency:100", _("Amount to Bill") + ":Currency:100", + _("Item Name") + "::120", _("Description") + "::120", _("Company") + ":Link/Company:120", + ] + +def get_args(): + return {'doctype': 'Purchase Receipt', 'party': 'supplier', + 'date': 'posting_date', 'order': 'name', 'order_by': 'desc'} \ No newline at end of file From 0e8361d1de78e17bff3be172fb8fa4b892916b97 Mon Sep 17 00:00:00 2001 From: Kanchan Chauhan Date: Tue, 3 Jan 2017 14:28:50 +0530 Subject: [PATCH 07/14] [Fix] Naming series issue --- erpnext/setup/doctype/naming_series/naming_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/naming_series/naming_series.py b/erpnext/setup/doctype/naming_series/naming_series.py index 67646f6d5f..dfe3ec009f 100644 --- a/erpnext/setup/doctype/naming_series/naming_series.py +++ b/erpnext/setup/doctype/naming_series/naming_series.py @@ -134,7 +134,7 @@ class NamingSeries(Document): """get series current""" if self.prefix: self.current_value = frappe.db.get_value("Series", - self.prefix.split('.')[0], "current") + self.prefix.split('.')[0], "current", order_by = "name") def insert_series(self, series): """insert series if missing""" From a3e7c38734117e3e46085def3756baebbe296a62 Mon Sep 17 00:00:00 2001 From: bcornwellmott Date: Thu, 5 Jan 2017 09:44:18 -0800 Subject: [PATCH 08/14] Fix number of digits on report Currently the cells can show many digits. --- .../report/quoted_item_comparison/quoted_item_comparison.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/report/quoted_item_comparison/quoted_item_comparison.py b/erpnext/buying/report/quoted_item_comparison/quoted_item_comparison.py index f627b4a6cd..48ca2d2a34 100644 --- a/erpnext/buying/report/quoted_item_comparison/quoted_item_comparison.py +++ b/erpnext/buying/report/quoted_item_comparison/quoted_item_comparison.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from erpnext.setup.utils import get_exchange_rate +from frappe.utils import flt, cint import frappe def execute(filters=None): @@ -20,6 +21,7 @@ def get_quote_list(item, qty_list): price_data = [] suppliers = [] company_currency = frappe.db.get_default("currency") + float_precision = cint(frappe.db.get_default("float_precision")) or 2 # Get the list of suppliers for root in frappe.db.sql("""select parent, qty, rate from `tabSupplier Quotation Item` where item_code=%s and docstatus < 2""", item, as_dict=1): for splr in frappe.db.sql("""SELECT supplier from `tabSupplier Quotation` where name =%s and docstatus < 2""", root.parent, as_dict=1): @@ -46,7 +48,7 @@ def get_quote_list(item, qty_list): # Get the quantity for this row for item_price in price_data: if str(item_price.qty) == col.key and item_price.supplier == root: - row[col.key] = item_price.rate * exchange_rate + row[col.key] = flt(item_price.rate * exchange_rate, float_precision) row[col.key + "QUOTE"] = item_price.parent break else: From 91621639e82120b6e67c006ee5996b6a242a4bf0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 6 Jan 2017 12:54:16 +0530 Subject: [PATCH 09/14] Reload in_standard_filter property --- .../doctype/purchase_order/purchase_order.json | 6 +++--- erpnext/patches/v5_0/portal_fixes.py | 2 +- erpnext/selling/doctype/sales_order/sales_order.json | 12 ++++++------ .../stock/doctype/delivery_note/delivery_note.json | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index c092695f0f..d7dce92b11 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -2212,7 +2212,7 @@ "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 0, - "in_standard_filter": 0, + "in_standard_filter": 1, "label": "Status", "length": 0, "no_copy": 1, @@ -2360,7 +2360,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, - "in_standard_filter": 1, + "in_standard_filter": 0, "label": "% Billed", "length": 0, "no_copy": 1, @@ -3062,7 +3062,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-07 06:01:00.233621", + "modified": "2017-01-06 12:51:56.556331", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/patches/v5_0/portal_fixes.py b/erpnext/patches/v5_0/portal_fixes.py index d7e3b44bf3..260222e6cb 100644 --- a/erpnext/patches/v5_0/portal_fixes.py +++ b/erpnext/patches/v5_0/portal_fixes.py @@ -2,5 +2,5 @@ import frappe import erpnext.setup.install def execute(): - frappe.reload_doc("website", "doctype", "web_form_field", force=True) + frappe.reload_doc("website", "doctype", "web_form_field", force=True, reset_permissions=True) #erpnext.setup.install.add_web_forms() diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index f171007a50..51e68fbebf 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -2580,7 +2580,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, + "in_standard_filter": 1, "label": "Delivery Status", "length": 0, "no_copy": 1, @@ -2610,7 +2610,7 @@ "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 1, - "in_standard_filter": 1, + "in_standard_filter": 0, "label": "% Delivered", "length": 0, "no_copy": 1, @@ -2668,7 +2668,7 @@ "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 1, - "in_standard_filter": 1, + "in_standard_filter": 0, "label": "% Amount Billed", "length": 0, "no_copy": 1, @@ -2698,7 +2698,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, - "in_standard_filter": 0, + "in_standard_filter": 1, "label": "Billing Status", "length": 0, "no_copy": 1, @@ -3369,7 +3369,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-16 04:06:28.675876", + "modified": "2017-01-06 12:51:17.847227", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", @@ -3383,7 +3383,7 @@ "delete": 1, "email": 1, "export": 0, - "if_owner": 1, + "if_owner": 0, "import": 0, "is_custom": 0, "permlevel": 0, diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 8272977771..6be4ad8756 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -2705,7 +2705,7 @@ "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 0, - "in_standard_filter": 0, + "in_standard_filter": 1, "label": "Status", "length": 0, "no_copy": 1, @@ -3120,7 +3120,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2016-12-16 03:56:08.745185", + "modified": "2017-01-06 12:52:48.960308", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", From 6734c4ad5cee52b3287e772408105e83fa2712aa Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 6 Jan 2017 14:39:40 +0530 Subject: [PATCH 10/14] Get item default warehouse --- erpnext/stock/get_item_details.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 0ed6952c74..9b944facf5 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -143,7 +143,7 @@ def get_basic_details(args, item): user_default_warehouse = user_default_warehouse_list[0] \ if len(user_default_warehouse_list)==1 else "" - warehouse = user_default_warehouse or args.warehouse or item.default_warehouse + warehouse = user_default_warehouse or item.default_warehouse or args.warehouse out = frappe._dict({ "item_code": item.name, From 34e34ed1e8f4c6b9a672d7ab8d410cfb05304398 Mon Sep 17 00:00:00 2001 From: bcornwellmott Date: Fri, 6 Jan 2017 17:21:16 -0800 Subject: [PATCH 11/14] Trigger Restart of build checks --- .../report/quoted_item_comparison/quoted_item_comparison.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/buying/report/quoted_item_comparison/quoted_item_comparison.py b/erpnext/buying/report/quoted_item_comparison/quoted_item_comparison.py index 48ca2d2a34..44e247e881 100644 --- a/erpnext/buying/report/quoted_item_comparison/quoted_item_comparison.py +++ b/erpnext/buying/report/quoted_item_comparison/quoted_item_comparison.py @@ -21,7 +21,7 @@ def get_quote_list(item, qty_list): price_data = [] suppliers = [] company_currency = frappe.db.get_default("currency") - float_precision = cint(frappe.db.get_default("float_precision")) or 2 + float_precision = cint(frappe.db.get_default("float_precision")) or 2 # Get the list of suppliers for root in frappe.db.sql("""select parent, qty, rate from `tabSupplier Quotation Item` where item_code=%s and docstatus < 2""", item, as_dict=1): for splr in frappe.db.sql("""SELECT supplier from `tabSupplier Quotation` where name =%s and docstatus < 2""", root.parent, as_dict=1): From f65e8de5a5caf43434fd48056a6fad1fd771ab6b Mon Sep 17 00:00:00 2001 From: Saurabh Date: Sat, 7 Jan 2017 08:18:10 +0530 Subject: [PATCH 12/14] [fix] if terms exists then only call render_template --- .../doctype/terms_and_conditions/terms_and_conditions.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py index 37f114bc17..85cf4dd8d8 100644 --- a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py +++ b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py @@ -18,4 +18,6 @@ def get_terms_and_conditions(template_name, doc): doc = json.loads(doc) terms_and_conditions = frappe.get_doc("Terms and Conditions", template_name) - return frappe.render_template(terms_and_conditions.terms, doc) \ No newline at end of file + + if terms_and_conditions.terms: + return frappe.render_template(terms_and_conditions.terms, doc) \ No newline at end of file From 802b4359b5cec17923a4e930fe6f86e356d54f44 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 9 Jan 2017 15:32:20 +0530 Subject: [PATCH 13/14] Fetch same items multiple times from source doc if all qty not processed --- erpnext/projects/doctype/task/task.py | 3 +- erpnext/public/js/utils.js | 31 ++++++++++++++----- .../doctype/academic_term/academic_term.py | 14 +++++---- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index 0ae2f8b945..2bdcaf9ac1 100644 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -55,7 +55,8 @@ class Task(Document): def update_depends_on(self): depends_on_tasks = "" for d in self.depends_on: - depends_on_tasks += d.task + "," + if d.task: + depends_on_tasks += d.task + "," self.depends_on_tasks = depends_on_tasks def on_update(self): diff --git a/erpnext/public/js/utils.js b/erpnext/public/js/utils.js index 04f5f9536a..74e9fb655c 100644 --- a/erpnext/public/js/utils.js +++ b/erpnext/public/js/utils.js @@ -153,22 +153,37 @@ erpnext.utils.map_current_doc = function(opts) { frappe.get_meta(items_doctype).fields.forEach(function(d) { if(d.options===opts.source_doctype) link_fieldname = d.fieldname; }); - // search in existing items if the source_name is already set + // search in existing items if the source_name is already set and full qty fetched var already_set = false; - + var item_qty_map = {}; + $.each(cur_frm.doc.items, function(i, d) { if(d[link_fieldname]==opts.source_name) { already_set = true; - return false; + if (item_qty_map[d.item_code]) + item_qty_map[d.item_code] += flt(d.qty); + else + item_qty_map[d.item_code] = flt(d.qty); } }); - + if(already_set) { - frappe.msgprint(__("You have already selected items from {0} {1}", - [opts.source_doctype, opts.source_name])); - return; - } + frappe.model.with_doc(opts.source_doctype, opts.source_name, function(r) { + var source_doc = frappe.model.get_doc(opts.source_doctype, opts.source_name); + $.each(source_doc.items || [], function(i, row) { + if(row.qty > flt(item_qty_map[row.item_code])) { + already_set = false; + return false; + } + }) + }) + if(already_set) { + frappe.msgprint(__("You have already selected items from {0} {1}", + [opts.source_doctype, opts.source_name])); + return; + } + } } diff --git a/erpnext/schools/doctype/academic_term/academic_term.py b/erpnext/schools/doctype/academic_term/academic_term.py index 4a1a941cd6..3aa0be157b 100644 --- a/erpnext/schools/doctype/academic_term/academic_term.py +++ b/erpnext/schools/doctype/academic_term/academic_term.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe from frappe import _ -from frappe.utils import get_datetime +from frappe.utils import getdate from frappe.model.document import Document class AcademicTerm(Document): @@ -18,16 +18,18 @@ class AcademicTerm(Document): self.title = self.academic_year + " ({})".format(self.term_name) if self.term_name else "" #Check that start of academic year is earlier than end of academic year - if self.term_start_date and self.term_end_date and self.term_start_date > self.term_end_date: + if self.term_start_date and self.term_end_date \ + and getdate(self.term_start_date) > getdate(self.term_end_date): frappe.throw(_("The Term End Date cannot be earlier than the Term Start Date. Please correct the dates and try again.")) - """Check that the start of the term is not before the start of the academic year and end of term is not after - the end of the academic year""" + # Check that the start of the term is not before the start of the academic year + # and end of term is not after the end of the academic year""" + year = frappe.get_doc("Academic Year",self.academic_year) - if self.term_start_date and get_datetime(year.year_start_date) and (self.term_start_date < get_datetime(year.year_start_date)): + if self.term_start_date and getdate(year.year_start_date) and (getdate(self.term_start_date) < getdate(year.year_start_date)): frappe.throw(_("The Term Start Date cannot be earlier than the Year Start Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again.").format(self.academic_year)) - if self.term_end_date and get_datetime(year.year_end_date) and (self.term_end_date > get_datetime(year.year_end_date)): + if self.term_end_date and getdate(year.year_end_date) and (getdate(self.term_end_date) > getdate(year.year_end_date)): frappe.throw(_("The Term End Date cannot be later than the Year End Date of the Academic Year to which the term is linked (Academic Year {}). Please correct the dates and try again.").format(self.academic_year)) From 2bb9093b9a4ff74f7b73d426915f5094c1489e66 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 9 Jan 2017 17:27:10 +0600 Subject: [PATCH 14/14] bumped to version 7.2.7 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index c6a8ea1e68..3338d3f426 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe -__version__ = '7.2.6' +__version__ = '7.2.7' def get_default_company(user=None): '''Get default company for user'''