From 277f4a1bfe584ac3c366d4cac7c7563de290579d Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 12 Jun 2014 12:59:23 +0530 Subject: [PATCH 01/57] Removed clear_custom_buttons, pos view switch fix --- erpnext/accounts/doctype/sales_invoice/sales_invoice.js | 2 +- erpnext/public/js/transaction.js | 1 - erpnext/selling/doctype/lead/lead.js | 1 - erpnext/selling/doctype/opportunity/opportunity.js | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js index 034880a211..bfb500c665 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js @@ -24,7 +24,7 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte } // toggle to pos view if is_pos is 1 in user_defaults - if ((cint(frappe.defaults.get_user_defaults("is_pos"))===1 || this.frm.doc.is_pos)) { + if ((is_null(this.frm.doc.is_pos) && cint(frappe.defaults.get_user_default("is_pos"))===1) || this.frm.doc.is_pos) { if(this.frm.doc.__islocal && !this.frm.doc.amended_from && !this.frm.doc.customer) { this.frm.set_value("is_pos", 1); this.is_pos(function() { diff --git a/erpnext/public/js/transaction.js b/erpnext/public/js/transaction.js index 27ee1521c8..2c372042ea 100644 --- a/erpnext/public/js/transaction.js +++ b/erpnext/public/js/transaction.js @@ -47,7 +47,6 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ }, refresh: function() { - this.frm.clear_custom_buttons(); erpnext.toggle_naming_series(); erpnext.hide_company(); this.show_item_wise_taxes(); diff --git a/erpnext/selling/doctype/lead/lead.js b/erpnext/selling/doctype/lead/lead.js index 286ce3593c..ba9741b4f6 100644 --- a/erpnext/selling/doctype/lead/lead.js +++ b/erpnext/selling/doctype/lead/lead.js @@ -30,7 +30,6 @@ erpnext.LeadController = frappe.ui.form.Controller.extend({ refresh: function() { var doc = this.frm.doc; erpnext.toggle_naming_series(); - this.frm.clear_custom_buttons(); if(!this.frm.doc.__islocal && this.frm.doc.__onload && !this.frm.doc.__onload.is_customer) { this.frm.add_custom_button(__("Create Customer"), this.create_customer); diff --git a/erpnext/selling/doctype/opportunity/opportunity.js b/erpnext/selling/doctype/opportunity/opportunity.js index 4cc95ad59b..ce7c6ea273 100644 --- a/erpnext/selling/doctype/opportunity/opportunity.js +++ b/erpnext/selling/doctype/opportunity/opportunity.js @@ -80,7 +80,6 @@ $.extend(cur_frm.cscript, new erpnext.selling.Opportunity({frm: cur_frm})); cur_frm.cscript.refresh = function(doc, cdt, cdn) { erpnext.toggle_naming_series(); - cur_frm.clear_custom_buttons(); if(doc.docstatus === 1 && doc.status!=="Lost") { cur_frm.add_custom_button(__('Create Quotation'), cur_frm.cscript.create_quotation); From 03ae32d937d1c2862d2274341c867faa1d219a60 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 12 Jun 2014 18:52:47 +0530 Subject: [PATCH 02/57] added print format for general ledger --- .../report/general_ledger/general_ledger.html | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 erpnext/accounts/report/general_ledger/general_ledger.html diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html new file mode 100644 index 0000000000..41ab6c4304 --- /dev/null +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -0,0 +1,38 @@ +

Statement of Account

+

{%= filters.account || "General Ledger" %}

+
+ + + + + + + + + + + + {% for(var i=0, l=data.length; i + {% if(data[i].posting_date) { %} + + + + + + {% } else { %} + + + + + + {% } %} + + {% } %} + +
{%= __("Date") %}{%= __("Ref") %}{%= __("Party") %}{%= __("Debit") %}{%= __("Credit") %}
{%= dateutil.str_to_user(data[i].posting_date) %}{%= data[i].voucher_no %}{%= data[i].account %} +
{%= __("Against") %}: {%= data[i].account %} +
{%= __("Remarks") %}: {%= data[i].remarks %}
{%= fmt_money(data[i].debit) %}{%= fmt_money(data[i].credit) %}{%= data[i].account || " " %} + {%= data[i].account && fmt_money(data[i].debit) %} + {%= data[i].account && fmt_money(data[i].credit) %}
+

Printed On {%= dateutil.get_datetime_as_string() %}

From 3b7bcf0f4f68d6da30e458f33f413da6a8f54fb4 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 13 Jun 2014 12:00:40 +0530 Subject: [PATCH 03/57] make font size smaller for erpnext powered --- erpnext/accounts/report/general_ledger/general_ledger.html | 2 +- erpnext/templates/includes/footer_powered.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index 41ab6c4304..dda1e61449 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -1,4 +1,4 @@ -

Statement of Account

+

{%= __("Statement of Account") %}

{%= filters.account || "General Ledger" %}


diff --git a/erpnext/templates/includes/footer_powered.html b/erpnext/templates/includes/footer_powered.html index 0abf2e4e77..96611813a7 100644 --- a/erpnext/templates/includes/footer_powered.html +++ b/erpnext/templates/includes/footer_powered.html @@ -1 +1 @@ -ERPNext Powered \ No newline at end of file +ERPNext Powered From 5df521bad5a335d79e30339ca836242ff49d41e6 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 17 Jun 2014 14:21:26 +0530 Subject: [PATCH 04/57] updated generators for wip-4.2 --- erpnext/accounts/doctype/account/account.json | 539 +++++++++--------- erpnext/hooks.py | 2 + .../setup/doctype/item_group/item_group.py | 50 ++ .../doctype/sales_partner/sales_partner.py | 20 +- erpnext/stock/doctype/item/item.py | 13 +- erpnext/templates/generators/item.py | 20 - erpnext/templates/generators/item_group.py | 59 -- erpnext/templates/generators/partner.py | 28 - 8 files changed, 353 insertions(+), 378 deletions(-) delete mode 100644 erpnext/templates/generators/item.py delete mode 100644 erpnext/templates/generators/item_group.py delete mode 100644 erpnext/templates/generators/partner.py diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index ab8830543d..4649c3829a 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -1,331 +1,332 @@ { - "allow_copy": 1, - "allow_import": 1, - "allow_rename": 1, - "creation": "2013-01-30 12:49:46", - "description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Master", + "allow_copy": 1, + "allow_import": 1, + "allow_rename": 1, + "creation": "2013-01-30 12:49:46", + "description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Master", "fields": [ { - "fieldname": "properties", - "fieldtype": "Section Break", - "in_list_view": 0, - "label": "Account Details", - "oldfieldtype": "Section Break", + "fieldname": "properties", + "fieldtype": "Section Break", + "in_list_view": 0, + "label": "Account Details", + "oldfieldtype": "Section Break", "permlevel": 0 - }, + }, { - "fieldname": "column_break0", - "fieldtype": "Column Break", - "in_list_view": 0, - "permlevel": 0, + "fieldname": "column_break0", + "fieldtype": "Column Break", + "in_list_view": 0, + "permlevel": 0, "width": "50%" - }, + }, { - "fieldname": "account_name", - "fieldtype": "Data", - "in_filter": 1, - "in_list_view": 1, - "label": "Account Name", - "no_copy": 1, - "oldfieldname": "account_name", - "oldfieldtype": "Data", - "permlevel": 0, - "read_only": 1, - "reqd": 1, + "fieldname": "account_name", + "fieldtype": "Data", + "in_filter": 1, + "in_list_view": 1, + "label": "Account Name", + "no_copy": 1, + "oldfieldname": "account_name", + "oldfieldtype": "Data", + "permlevel": 0, + "read_only": 1, + "reqd": 1, "search_index": 1 - }, + }, { - "default": "Ledger", - "fieldname": "group_or_ledger", - "fieldtype": "Select", - "in_filter": 1, - "in_list_view": 1, - "label": "Group or Ledger", - "oldfieldname": "group_or_ledger", - "oldfieldtype": "Select", - "options": "\nLedger\nGroup", - "permlevel": 0, - "read_only": 1, - "reqd": 1, + "default": "Ledger", + "fieldname": "group_or_ledger", + "fieldtype": "Select", + "in_filter": 1, + "in_list_view": 1, + "label": "Group or Ledger", + "oldfieldname": "group_or_ledger", + "oldfieldtype": "Select", + "options": "\nLedger\nGroup", + "permlevel": 0, + "read_only": 1, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "company", - "fieldtype": "Link", - "in_filter": 1, - "label": "Company", - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "read_only": 1, - "reqd": 1, + "fieldname": "company", + "fieldtype": "Link", + "in_filter": 1, + "label": "Company", + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "read_only": 1, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "column_break1", - "fieldtype": "Column Break", - "permlevel": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "permlevel": 0, "width": "50%" - }, + }, { - "fieldname": "parent_account", - "fieldtype": "Link", - "ignore_user_permissions": 1, - "label": "Parent Account", - "oldfieldname": "parent_account", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "reqd": 1, + "fieldname": "parent_account", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "label": "Parent Account", + "oldfieldname": "parent_account", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "reqd": 1, "search_index": 1 - }, + }, { - "description": "Setting Account Type helps in selecting this Account in transactions.", - "fieldname": "account_type", - "fieldtype": "Select", - "in_filter": 1, - "label": "Account Type", - "oldfieldname": "account_type", - "oldfieldtype": "Select", - "options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment", - "permlevel": 0, + "description": "Setting Account Type helps in selecting this Account in transactions.", + "fieldname": "account_type", + "fieldtype": "Select", + "in_filter": 1, + "label": "Account Type", + "oldfieldname": "account_type", + "oldfieldtype": "Select", + "options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment", + "permlevel": 0, "search_index": 0 - }, + }, { - "description": "Rate at which this tax is applied", - "fieldname": "tax_rate", - "fieldtype": "Float", - "hidden": 0, - "label": "Rate", - "oldfieldname": "tax_rate", - "oldfieldtype": "Currency", - "permlevel": 0, + "description": "Rate at which this tax is applied", + "fieldname": "tax_rate", + "fieldtype": "Float", + "hidden": 0, + "label": "Rate", + "oldfieldname": "tax_rate", + "oldfieldtype": "Currency", + "permlevel": 0, "reqd": 0 - }, + }, { - "description": "If the account is frozen, entries are allowed to restricted users.", - "fieldname": "freeze_account", - "fieldtype": "Select", - "label": "Frozen", - "oldfieldname": "freeze_account", - "oldfieldtype": "Select", - "options": "No\nYes", + "description": "If the account is frozen, entries are allowed to restricted users.", + "fieldname": "freeze_account", + "fieldtype": "Select", + "label": "Frozen", + "oldfieldname": "freeze_account", + "oldfieldtype": "Select", + "options": "No\nYes", "permlevel": 0 - }, + }, { - "fieldname": "credit_days", - "fieldtype": "Int", - "hidden": 1, - "label": "Credit Days", - "oldfieldname": "credit_days", - "oldfieldtype": "Int", - "permlevel": 0, + "fieldname": "credit_days", + "fieldtype": "Int", + "hidden": 1, + "label": "Credit Days", + "oldfieldname": "credit_days", + "oldfieldtype": "Int", + "permlevel": 0, "print_hide": 1 - }, + }, { - "fieldname": "credit_limit", - "fieldtype": "Currency", - "hidden": 1, - "label": "Credit Limit", - "oldfieldname": "credit_limit", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, + "fieldname": "credit_limit", + "fieldtype": "Currency", + "hidden": 1, + "label": "Credit Limit", + "oldfieldname": "credit_limit", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, "print_hide": 1 - }, + }, { - "description": "If this Account represents a Customer, Supplier or Employee, set it here.", - "fieldname": "master_type", - "fieldtype": "Select", - "label": "Master Type", - "oldfieldname": "master_type", - "oldfieldtype": "Select", - "options": "\nSupplier\nCustomer\nEmployee", + "description": "If this Account represents a Customer, Supplier or Employee, set it here.", + "fieldname": "master_type", + "fieldtype": "Select", + "label": "Master Type", + "oldfieldname": "master_type", + "oldfieldtype": "Select", + "options": "\nSupplier\nCustomer\nEmployee", "permlevel": 0 - }, + }, { - "fieldname": "master_name", - "fieldtype": "Link", - "label": "Master Name", - "oldfieldname": "master_name", - "oldfieldtype": "Link", - "options": "[Select]", + "fieldname": "master_name", + "fieldtype": "Link", + "label": "Master Name", + "oldfieldname": "master_name", + "oldfieldtype": "Link", + "options": "[Select]", "permlevel": 0 - }, + }, { - "fieldname": "balance_must_be", - "fieldtype": "Select", - "label": "Balance must be", - "options": "\nDebit\nCredit", + "fieldname": "balance_must_be", + "fieldtype": "Select", + "label": "Balance must be", + "options": "\nDebit\nCredit", "permlevel": 0 - }, + }, { - "fieldname": "root_type", - "fieldtype": "Select", - "label": "Root Type", - "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", - "permlevel": 0, + "fieldname": "root_type", + "fieldtype": "Select", + "label": "Root Type", + "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "report_type", - "fieldtype": "Select", - "label": "Report Type", - "options": "\nBalance Sheet\nProfit and Loss", - "permlevel": 0, + "fieldname": "report_type", + "fieldtype": "Select", + "label": "Report Type", + "options": "\nBalance Sheet\nProfit and Loss", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "lft", - "fieldtype": "Int", - "hidden": 1, - "label": "Lft", - "permlevel": 0, - "print_hide": 1, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "label": "Lft", + "permlevel": 0, + "print_hide": 1, "read_only": 1 - }, + }, { - "fieldname": "rgt", - "fieldtype": "Int", - "hidden": 1, - "label": "Rgt", - "permlevel": 0, - "print_hide": 1, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "label": "Rgt", + "permlevel": 0, + "print_hide": 1, "read_only": 1 - }, + }, { - "fieldname": "old_parent", - "fieldtype": "Data", - "hidden": 1, - "label": "Old Parent", - "permlevel": 0, - "print_hide": 1, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "label": "Old Parent", + "permlevel": 0, + "print_hide": 1, "read_only": 1 } - ], - "icon": "icon-money", - "idx": 1, - "in_create": 1, - "modified": "2014-06-03 18:27:58.109303", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Account", - "owner": "Administrator", + ], + "icon": "icon-money", + "idx": 1, + "in_create": 1, + "modified": "2014-06-17 04:30:56.689314", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Account", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 1, - "create": 0, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Auditor", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 0, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Auditor", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 1, - "create": 0, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Sales User", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 0, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales User", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 1, - "create": 0, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 0, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 2, - "read": 1, - "report": 1, - "role": "Auditor", - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 2, + "read": 1, + "report": 1, + "role": "Auditor", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 1, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 1, + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 2, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 2, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 2, - "read": 1, - "report": 1, - "role": "Accounts User", - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 2, + "read": 1, + "report": 1, + "role": "Accounts User", + "submit": 0, "write": 0 } - ], + ], "search_fields": "group_or_ledger" -} +} \ No newline at end of file diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 8b147b0749..bddda2d601 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -24,6 +24,8 @@ mail_footer = "erpnext.startup.mail_footer" on_session_creation = "erpnext.startup.event_handlers.on_session_creation" before_tests = "erpnext.setup.utils.before_tests" +website_generators = ["Item Group", "Item", "Sales Partner"] + standard_queries = "Customer:erpnext.selling.doctype.customer.customer.get_customer_list" permission_query_conditions = { diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index 63bf3b481c..b9d5abb425 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -7,6 +7,9 @@ import frappe from frappe.utils.nestedset import NestedSet from frappe.website.website_generator import WebsiteGenerator from frappe.website.render import clear_cache +from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow + +condition_field = "show_in_website" class ItemGroup(NestedSet, WebsiteGenerator): nsm_parent_field = 'parent_item_group' @@ -39,6 +42,53 @@ class ItemGroup(NestedSet, WebsiteGenerator): if frappe.db.exists("Item", self.name): frappe.throw(frappe._("An item exists with same name ({0}), please change the item group name or rename the item").format(self.name)) + def get_context(self, context): + context.update({ + "items": get_product_list_for_group(product_group = self.name, limit=100), + "parent_groups": get_parent_item_groups(self.name), + "title": self.name + }) + + if self.slideshow: + context.update(get_slideshow(self)) + + return context + +def get_product_list_for_group(product_group=None, start=0, limit=10): + child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(product_group)]) + + # base query + query = """select t1.name, t1.item_name, t1.page_name, t1.website_image, t1.item_group, + t1.web_long_description as website_description, t2.name as route + from `tabItem` t1, `tabWebsite Route` t2 + where t1.show_in_website = 1 and (item_group in (%s) + or t1.name in (select parent from `tabWebsite Item Group` where item_group in (%s))) + and t1.name = t2.docname and t2.ref_doctype='Item' """ % (child_groups, child_groups) + + query += """order by t1.weightage desc, t1.modified desc limit %s, %s""" % (start, limit) + + data = frappe.db.sql(query, {"product_group": product_group}, as_dict=1) + + return [get_item_for_list_in_html(r) for r in data] + +def get_child_groups(item_group_name): + item_group = frappe.get_doc("Item Group", item_group_name) + return frappe.db.sql("""select name + from `tabItem Group` where lft>=%(lft)s and rgt<=%(rgt)s + and show_in_website = 1""", {"lft": item_group.lft, "rgt": item_group.rgt}) + +def get_item_for_list_in_html(context): + return frappe.get_template("templates/includes/product_in_grid.html").render(context) + +def get_group_item_count(item_group): + child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(item_group)]) + return frappe.db.sql("""select count(*) from `tabItem` + where docstatus = 0 and show_in_website = 1 + and (item_group in (%s) + or name in (select parent from `tabWebsite Item Group` + where item_group in (%s))) """ % (child_groups, child_groups))[0][0] + + def get_parent_item_groups(item_group_name): item_group = frappe.get_doc("Item Group", item_group_name) return frappe.db.sql("""select name, page_name from `tabItem Group` diff --git a/erpnext/setup/doctype/sales_partner/sales_partner.py b/erpnext/setup/doctype/sales_partner/sales_partner.py index b90b65e868..2d5ad34269 100644 --- a/erpnext/setup/doctype/sales_partner/sales_partner.py +++ b/erpnext/setup/doctype/sales_partner/sales_partner.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import cint, cstr, filter_strip_join +from frappe.utils import cstr, filter_strip_join from frappe.website.website_generator import WebsiteGenerator class SalesPartner(WebsiteGenerator): @@ -25,3 +25,21 @@ class SalesPartner(WebsiteGenerator): def get_page_title(self): return self.partner_name + + def get_context(self, context): + address = frappe.db.get_value("Address", + {"sales_partner": self.name, "is_primary_address": 1}, + "*", as_dict=True) + if address: + city_state = ", ".join(filter(None, [address.city, address.state])) + address_rows = [address.address_line1, address.address_line2, + city_state, address.pincode, address.country] + + context.update({ + "email": address.email_id, + "partner_address": filter_strip_join(address_rows, "\n
"), + "phone": filter_strip_join(cstr(address.phone).split(","), "\n
") + }) + + return context + diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index f43b531392..129e2f78bd 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -6,11 +6,14 @@ import frappe from frappe import msgprint, _ from frappe.utils import cstr, flt, getdate, now_datetime, formatdate from frappe.website.website_generator import WebsiteGenerator -from erpnext.setup.doctype.item_group.item_group import invalidate_cache_for +from erpnext.setup.doctype.item_group.item_group import invalidate_cache_for, get_parent_item_groups from frappe.website.render import clear_cache +from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow class WarehouseNotSet(frappe.ValidationError): pass +condition_field = "show_in_website" + class Item(WebsiteGenerator): def onload(self): super(Item, self).onload() @@ -55,6 +58,14 @@ class Item(WebsiteGenerator): self.validate_name_with_item_group() self.update_item_price() + def get_context(self, context): + context["parent_groups"] = get_parent_item_groups(self.item_group) + \ + [{"name": self.name}] + if self.slideshow: + context.update(get_slideshow(self)) + + return context + def check_warehouse_is_set_for_stock_item(self): if self.is_stock_item=="Yes" and not self.default_warehouse: frappe.msgprint(_("Default Warehouse is mandatory for stock Item."), diff --git a/erpnext/templates/generators/item.py b/erpnext/templates/generators/item.py deleted file mode 100644 index 1ad070ef87..0000000000 --- a/erpnext/templates/generators/item.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals - -import frappe -from erpnext.setup.doctype.item_group.item_group import get_parent_item_groups -from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow - -doctype = "Item" -condition_field = "show_in_website" - -def get_context(context): - item_context = context.doc.as_dict() - item_context["parent_groups"] = get_parent_item_groups(context.doc.item_group) + \ - [{"name":context.doc.name}] - if context.doc.slideshow: - item_context.update(get_slideshow(context.doc)) - - return item_context diff --git a/erpnext/templates/generators/item_group.py b/erpnext/templates/generators/item_group.py deleted file mode 100644 index 8e09dbc35e..0000000000 --- a/erpnext/templates/generators/item_group.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals - -import frappe -from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow -from erpnext.setup.doctype.item_group.item_group import get_parent_item_groups - -doctype = "Item Group" -condition_field = "show_in_website" - -def get_context(context): - item_group_context = context.doc.as_dict() - item_group_context.update({ - "items": get_product_list_for_group(product_group = context.docname, limit=100), - "parent_groups": get_parent_item_groups(context.docname), - "title": context.docname - }) - - if context.doc.slideshow: - item_group_context.update(get_slideshow(context.doc)) - - return item_group_context - -def get_product_list_for_group(product_group=None, start=0, limit=10): - child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(product_group)]) - - # base query - query = """select t1.name, t1.item_name, t1.page_name, t1.website_image, t1.item_group, - t1.web_long_description as website_description, t2.name as route - from `tabItem` t1, `tabWebsite Route` t2 - where t1.show_in_website = 1 and (item_group in (%s) - or t1.name in (select parent from `tabWebsite Item Group` where item_group in (%s))) - and t1.name = t2.docname and t2.ref_doctype='Item' """ % (child_groups, child_groups) - - query += """order by t1.weightage desc, t1.modified desc limit %s, %s""" % (start, limit) - - data = frappe.db.sql(query, {"product_group": product_group}, as_dict=1) - - return [get_item_for_list_in_html(r) for r in data] - -def get_child_groups(item_group_name): - item_group = frappe.get_doc("Item Group", item_group_name) - return frappe.db.sql("""select name - from `tabItem Group` where lft>=%(lft)s and rgt<=%(rgt)s - and show_in_website = 1""", {"lft": item_group.lft, "rgt": item_group.rgt}) - -def get_item_for_list_in_html(context): - return frappe.get_template("templates/includes/product_in_grid.html").render(context) - -def get_group_item_count(item_group): - child_groups = ", ".join(['"' + i[0] + '"' for i in get_child_groups(item_group)]) - return frappe.db.sql("""select count(*) from `tabItem` - where docstatus = 0 and show_in_website = 1 - and (item_group in (%s) - or name in (select parent from `tabWebsite Item Group` - where item_group in (%s))) """ % (child_groups, child_groups))[0][0] - diff --git a/erpnext/templates/generators/partner.py b/erpnext/templates/generators/partner.py deleted file mode 100644 index 2079309747..0000000000 --- a/erpnext/templates/generators/partner.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -from __future__ import unicode_literals -import frappe -from frappe.utils import filter_strip_join - -doctype = "Sales Partner" -condition_field = "show_in_website" - -def get_context(context): - partner_context = context.doc.as_dict() - - address = frappe.db.get_value("Address", - {"sales_partner": context.doc.name, "is_primary_address": 1}, - "*", as_dict=True) - if address: - city_state = ", ".join(filter(None, [address.city, address.state])) - address_rows = [address.address_line1, address.address_line2, - city_state, address.pincode, address.country] - - partner_context.update({ - "email": address.email_id, - "partner_address": filter_strip_join(address_rows, "\n
"), - "phone": filter_strip_join(cstr(address.phone).split(","), "\n
") - }) - - return partner_context From 9f887b436c3f9adeb87a771445f1bae3eae447f7 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 17 Jun 2014 16:53:44 +0530 Subject: [PATCH 05/57] fixes new routing, for frappe/frappe#600 --- erpnext/setup/doctype/item_group/item_group.py | 1 + erpnext/setup/doctype/sales_partner/sales_partner.py | 3 +++ erpnext/stock/doctype/item/item.py | 1 + 3 files changed, 5 insertions(+) diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index b9d5abb425..94cd3ec59a 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -10,6 +10,7 @@ from frappe.website.render import clear_cache from frappe.website.doctype.website_slideshow.website_slideshow import get_slideshow condition_field = "show_in_website" +template = "templates/generators/item_group.html" class ItemGroup(NestedSet, WebsiteGenerator): nsm_parent_field = 'parent_item_group' diff --git a/erpnext/setup/doctype/sales_partner/sales_partner.py b/erpnext/setup/doctype/sales_partner/sales_partner.py index 2d5ad34269..69695190d4 100644 --- a/erpnext/setup/doctype/sales_partner/sales_partner.py +++ b/erpnext/setup/doctype/sales_partner/sales_partner.py @@ -6,6 +6,9 @@ import frappe from frappe.utils import cstr, filter_strip_join from frappe.website.website_generator import WebsiteGenerator +condition_field = "show_in_website" +template = "templates/generators/sales_partner.html" + class SalesPartner(WebsiteGenerator): def autoname(self): self.name = self.partner_name diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index 129e2f78bd..f68f0e9071 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -13,6 +13,7 @@ from frappe.website.doctype.website_slideshow.website_slideshow import get_slide class WarehouseNotSet(frappe.ValidationError): pass condition_field = "show_in_website" +template = "templates/generators/item.html" class Item(WebsiteGenerator): def onload(self): From 69ce97b80a21ec024a27397e5f4e6b91009fad95 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 12 Jun 2014 18:52:47 +0530 Subject: [PATCH 06/57] added print format for general ledger --- .../report/general_ledger/general_ledger.html | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 erpnext/accounts/report/general_ledger/general_ledger.html diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html new file mode 100644 index 0000000000..41ab6c4304 --- /dev/null +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -0,0 +1,38 @@ +

Statement of Account

+

{%= filters.account || "General Ledger" %}

+
+
+ + + + + + + + + + + {% for(var i=0, l=data.length; i + {% if(data[i].posting_date) { %} + + + + + + {% } else { %} + + + + + + {% } %} + + {% } %} + +
{%= __("Date") %}{%= __("Ref") %}{%= __("Party") %}{%= __("Debit") %}{%= __("Credit") %}
{%= dateutil.str_to_user(data[i].posting_date) %}{%= data[i].voucher_no %}{%= data[i].account %} +
{%= __("Against") %}: {%= data[i].account %} +
{%= __("Remarks") %}: {%= data[i].remarks %}
{%= fmt_money(data[i].debit) %}{%= fmt_money(data[i].credit) %}{%= data[i].account || " " %} + {%= data[i].account && fmt_money(data[i].debit) %} + {%= data[i].account && fmt_money(data[i].credit) %}
+

Printed On {%= dateutil.get_datetime_as_string() %}

From 1a18b427a838b7cfa0f2756847f39e2c0228c891 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 13 Jun 2014 12:00:40 +0530 Subject: [PATCH 07/57] make font size smaller for erpnext powered --- erpnext/accounts/report/general_ledger/general_ledger.html | 2 +- erpnext/templates/includes/footer_powered.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.html b/erpnext/accounts/report/general_ledger/general_ledger.html index 41ab6c4304..dda1e61449 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.html +++ b/erpnext/accounts/report/general_ledger/general_ledger.html @@ -1,4 +1,4 @@ -

Statement of Account

+

{%= __("Statement of Account") %}

{%= filters.account || "General Ledger" %}


diff --git a/erpnext/templates/includes/footer_powered.html b/erpnext/templates/includes/footer_powered.html index 0abf2e4e77..96611813a7 100644 --- a/erpnext/templates/includes/footer_powered.html +++ b/erpnext/templates/includes/footer_powered.html @@ -1 +1 @@ -ERPNext Powered \ No newline at end of file +ERPNext Powered From 151125e5377a762711a1f1f370e31ddf79c2c3ae Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 18 Jun 2014 17:33:01 +0530 Subject: [PATCH 08/57] fixed for travis --- .../doctype/chart_of_accounts/import_charts.py | 11 ++++++----- erpnext/templates/pages/product_search.py | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/doctype/chart_of_accounts/import_charts.py b/erpnext/accounts/doctype/chart_of_accounts/import_charts.py index 9e60551665..7a47f6ee36 100644 --- a/erpnext/accounts/doctype/chart_of_accounts/import_charts.py +++ b/erpnext/accounts/doctype/chart_of_accounts/import_charts.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe, os, json def import_charts(): + print "Importing Chart of Accounts" frappe.db.sql("""delete from `tabChart of Accounts`""") charts_dir = os.path.join(os.path.dirname(__file__), "charts") for fname in os.listdir(charts_dir): @@ -19,8 +20,8 @@ def import_charts(): "source_file": fname, "country": country }).insert() - print doc.name.encode("utf-8") - else: - print "No chart for: " + chart.get("name").encode("utf-8") - - frappe.db.commit() \ No newline at end of file + #print doc.name.encode("utf-8") + #else: + #print "No chart for: " + chart.get("name").encode("utf-8") + + frappe.db.commit() diff --git a/erpnext/templates/pages/product_search.py b/erpnext/templates/pages/product_search.py index 8b454ceeca..8464b2561e 100644 --- a/erpnext/templates/pages/product_search.py +++ b/erpnext/templates/pages/product_search.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe from frappe.utils import cstr -from erpnext.templates.generators.item_group import get_item_for_list_in_html +from erpnext.setup.doctype.item_group.item_group import get_item_for_list_in_html no_cache = 1 no_sitemap = 1 From 476d1fb33465214a5813ab5099685fee68e8ec0a Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 18 Jun 2014 09:04:09 +0530 Subject: [PATCH 09/57] Update sms_center.json changed total words to total characters --- erpnext/selling/doctype/sms_center/sms_center.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/selling/doctype/sms_center/sms_center.json b/erpnext/selling/doctype/sms_center/sms_center.json index e7af1a8edf..8910a2d9b2 100644 --- a/erpnext/selling/doctype/sms_center/sms_center.json +++ b/erpnext/selling/doctype/sms_center/sms_center.json @@ -84,7 +84,7 @@ { "fieldname": "total_words", "fieldtype": "Int", - "label": "Total Words", + "label": "Total Characters", "permlevel": 0, "read_only": 1 }, @@ -109,7 +109,7 @@ "idx": 1, "in_create": 0, "issingle": 1, - "modified": "2014-05-09 02:16:41.375945", + "modified": "2014-05-09 02:17:41.375945", "modified_by": "Administrator", "module": "Selling", "name": "SMS Center", @@ -132,4 +132,4 @@ "read_only": 1, "sort_field": "modified", "sort_order": "DESC" -} \ No newline at end of file +} From 7c6c2e0ccf5f5d6d88e77649bb5e2be5f79eb802 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 17 Jun 2014 16:13:15 +0530 Subject: [PATCH 10/57] Do not make packing list after submission --- .../doctype/sales_order/sales_order.py | 1 - .../stock/doctype/packed_item/packed_item.py | 24 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 2b60dcd214..1b66c65dac 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -102,7 +102,6 @@ class SalesOrder(SellingController): self.validate_warehouse() from erpnext.stock.doctype.packed_item.packed_item import make_packing_list - make_packing_list(self,'sales_order_details') self.validate_with_previous_doc() diff --git a/erpnext/stock/doctype/packed_item/packed_item.py b/erpnext/stock/doctype/packed_item/packed_item.py index cf208ee87d..44c1a00cc9 100644 --- a/erpnext/stock/doctype/packed_item/packed_item.py +++ b/erpnext/stock/doctype/packed_item/packed_item.py @@ -12,18 +12,18 @@ from frappe.model.document import Document class PackedItem(Document): pass - + def get_sales_bom_items(item_code): - return frappe.db.sql("""select t1.item_code, t1.qty, t1.uom - from `tabSales BOM Item` t1, `tabSales BOM` t2 + return frappe.db.sql("""select t1.item_code, t1.qty, t1.uom + from `tabSales BOM Item` t1, `tabSales BOM` t2 where t2.new_item_code=%s and t1.parent = t2.name""", item_code, as_dict=1) def get_packing_item_details(item): - return frappe.db.sql("""select item_name, description, stock_uom from `tabItem` + return frappe.db.sql("""select item_name, description, stock_uom from `tabItem` where name = %s""", item, as_dict = 1)[0] def get_bin_qty(item, warehouse): - det = frappe.db.sql("""select actual_qty, projected_qty from `tabBin` + det = frappe.db.sql("""select actual_qty, projected_qty from `tabBin` where item_code = %s and warehouse = %s""", (item, warehouse), as_dict = 1) return det and det[0] or '' @@ -55,12 +55,15 @@ def update_packing_list_item(obj, packing_item_code, qty, warehouse, line, packi if not pi.batch_no: pi.batch_no = cstr(line.get("batch_no")) pi.idx = packing_list_idx - + packing_list_idx += 1 def make_packing_list(obj, item_table_fieldname): """make packing list for sales bom item""" + + if obj._action == "update_after_submit": return + packing_list_idx = 0 parent_items = [] for d in obj.get(item_table_fieldname): @@ -68,14 +71,14 @@ def make_packing_list(obj, item_table_fieldname): and d.warehouse or d.warehouse if frappe.db.get_value("Sales BOM", {"new_item_code": d.item_code}): for i in get_sales_bom_items(d.item_code): - update_packing_list_item(obj, i['item_code'], flt(i['qty'])*flt(d.qty), + update_packing_list_item(obj, i['item_code'], flt(i['qty'])*flt(d.qty), warehouse, d, packing_list_idx) if [d.item_code, d.name] not in parent_items: parent_items.append([d.item_code, d.name]) - + cleanup_packing_list(obj, parent_items) - + def cleanup_packing_list(obj, parent_items): """Remove all those child items which are no longer present in main item table""" delete_list = [] @@ -86,10 +89,9 @@ def cleanup_packing_list(obj, parent_items): if not delete_list: return obj - + packing_details = obj.get("packing_details") obj.set("packing_details", []) for d in packing_details: if d not in delete_list: obj.append("packing_details", d) - \ No newline at end of file From d5a4c871f2068db98bc3c74384138a333e2543c7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Jun 2014 09:02:21 +0530 Subject: [PATCH 11/57] Field renamed in sms center --- .../selling/doctype/sms_center/sms_center.js | 12 +- .../doctype/sms_center/sms_center.json | 200 +++++++++--------- 2 files changed, 106 insertions(+), 106 deletions(-) diff --git a/erpnext/selling/doctype/sms_center/sms_center.js b/erpnext/selling/doctype/sms_center/sms_center.js index 1c5b92b7ec..ec4d57d8be 100644 --- a/erpnext/selling/doctype/sms_center/sms_center.js +++ b/erpnext/selling/doctype/sms_center/sms_center.js @@ -3,15 +3,15 @@ $.extend(cur_frm.cscript, { message: function () { - var total_words = this.frm.doc.message.length; + var total_characters = this.frm.doc.message.length; var total_msg = 1; - if (total_words > 160) { - total_msg = cint(total_words / 160); - total_msg = (total_words % 160 == 0 ? total_msg : total_msg + 1); + if (total_characters > 160) { + total_msg = cint(total_characters / 160); + total_msg = (total_characters % 160 == 0 ? total_msg : total_msg + 1); } - this.frm.set_value("total_words", total_words); + this.frm.set_value("total_characters", total_characters); this.frm.set_value("total_messages", this.frm.doc.message ? total_msg : 0); } -}); \ No newline at end of file +}); diff --git a/erpnext/selling/doctype/sms_center/sms_center.json b/erpnext/selling/doctype/sms_center/sms_center.json index 8910a2d9b2..b6eb11c23a 100644 --- a/erpnext/selling/doctype/sms_center/sms_center.json +++ b/erpnext/selling/doctype/sms_center/sms_center.json @@ -1,135 +1,135 @@ { - "allow_attach": 0, - "allow_copy": 1, - "creation": "2013-01-10 16:34:22", - "docstatus": 0, - "doctype": "DocType", + "allow_attach": 0, + "allow_copy": 1, + "creation": "2013-01-10 16:34:22", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "column_break1", - "fieldtype": "Column Break", - "permlevel": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "permlevel": 0, "width": "50%" - }, + }, { - "fieldname": "send_to", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Send To", - "options": "\nAll Contact\nAll Customer Contact\nAll Supplier Contact\nAll Sales Partner Contact\nAll Lead (Open)\nAll Employee (Active)\nAll Sales Person", + "fieldname": "send_to", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Send To", + "options": "\nAll Contact\nAll Customer Contact\nAll Supplier Contact\nAll Sales Partner Contact\nAll Lead (Open)\nAll Employee (Active)\nAll Sales Person", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.send_to=='All Customer Contact'", - "fieldname": "customer", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Customer", - "options": "Customer", + "depends_on": "eval:doc.send_to=='All Customer Contact'", + "fieldname": "customer", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Customer", + "options": "Customer", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.send_to=='All Supplier Contact'", - "fieldname": "supplier", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Supplier", - "options": "Supplier", + "depends_on": "eval:doc.send_to=='All Supplier Contact'", + "fieldname": "supplier", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Supplier", + "options": "Supplier", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.send_to=='All Employee (Active)'", - "fieldname": "department", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Department", - "options": "Department", + "depends_on": "eval:doc.send_to=='All Employee (Active)'", + "fieldname": "department", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Department", + "options": "Department", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.send_to=='All Employee (Active)'", - "fieldname": "branch", - "fieldtype": "Link", - "label": "Branch", - "options": "Branch", + "depends_on": "eval:doc.send_to=='All Employee (Active)'", + "fieldname": "branch", + "fieldtype": "Link", + "label": "Branch", + "options": "Branch", "permlevel": 0 - }, + }, { - "fieldname": "create_receiver_list", - "fieldtype": "Button", - "label": "Create Receiver List", - "options": "create_receiver_list", + "fieldname": "create_receiver_list", + "fieldtype": "Button", + "label": "Create Receiver List", + "options": "create_receiver_list", "permlevel": 0 - }, + }, { - "fieldname": "receiver_list", - "fieldtype": "Code", - "label": "Receiver List", + "fieldname": "receiver_list", + "fieldtype": "Code", + "label": "Receiver List", "permlevel": 0 - }, + }, { - "fieldname": "column_break9", - "fieldtype": "Column Break", - "permlevel": 0, + "fieldname": "column_break9", + "fieldtype": "Column Break", + "permlevel": 0, "width": "50%" - }, + }, { - "description": "Messages greater than 160 characters will be split into multiple messages", - "fieldname": "message", - "fieldtype": "Text", - "label": "Message", - "permlevel": 0, + "description": "Messages greater than 160 characters will be split into multiple messages", + "fieldname": "message", + "fieldtype": "Text", + "label": "Message", + "permlevel": 0, "reqd": 1 - }, + }, { - "fieldname": "total_words", - "fieldtype": "Int", - "label": "Total Characters", - "permlevel": 0, + "fieldname": "total_characters", + "fieldtype": "Int", + "label": "Total Characters", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "total_messages", - "fieldtype": "Int", - "label": "Total Message(s)", - "permlevel": 0, + "fieldname": "total_messages", + "fieldtype": "Int", + "label": "Total Message(s)", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "send_sms", - "fieldtype": "Button", - "label": "Send SMS", - "options": "send_sms", + "fieldname": "send_sms", + "fieldtype": "Button", + "label": "Send SMS", + "options": "send_sms", "permlevel": 0 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-mobile-phone", - "idx": 1, - "in_create": 0, - "issingle": 1, - "modified": "2014-05-09 02:17:41.375945", - "modified_by": "Administrator", - "module": "Selling", - "name": "SMS Center", - "owner": "Administrator", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-mobile-phone", + "idx": 1, + "in_create": 0, + "issingle": 1, + "modified": "2014-06-18 08:59:51.755566", + "modified_by": "Administrator", + "module": "Selling", + "name": "SMS Center", + "owner": "Administrator", "permissions": [ { - "cancel": 0, - "create": 1, - "delete": 0, - "export": 0, - "import": 0, - "permlevel": 0, - "read": 1, - "report": 0, - "role": "System Manager", - "submit": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "export": 0, + "import": 0, + "permlevel": 0, + "read": 1, + "report": 0, + "role": "System Manager", + "submit": 0, "write": 1 } - ], - "read_only": 1, - "sort_field": "modified", + ], + "read_only": 1, + "sort_field": "modified", "sort_order": "DESC" } From cea571fc31a80f0bb94abe348fe40cd1d0413973 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Jun 2014 09:42:27 +0530 Subject: [PATCH 12/57] Fixes in fetching valuation rate in stock entry --- erpnext/stock/doctype/stock_entry/stock_entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index d8164f7e21..3df78c8def 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -221,7 +221,7 @@ class StockEntry(StockController): if not d.bom_no: if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return": incoming_rate = self.get_incoming_rate(args) - if incoming_rate: + if flt(incoming_rate) > 0: d.incoming_rate = incoming_rate d.amount = flt(d.transfer_qty) * flt(d.incoming_rate) From 0c6177dd9a82191c204bb54d09acbf0c0034ebe7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Jun 2014 10:29:53 +0530 Subject: [PATCH 13/57] Patch: update users report view settings for rename fields --- erpnext/patches.txt | 1 + .../v4_0/update_users_report_view_settings.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 erpnext/patches/v4_0/update_users_report_view_settings.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 761b63c9fd..dd57c60b18 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -61,3 +61,4 @@ erpnext.patches.v4_0.update_custom_print_formats_for_renamed_fields erpnext.patches.v4_0.update_other_charges_in_custom_purchase_print_formats erpnext.patches.v4_0.create_price_list_if_missing execute:frappe.db.sql("update `tabItem` set end_of_life=null where end_of_life='0000-00-00'") #2014-06-16 +erpnext.patches.v4_0.update_users_report_view_settings diff --git a/erpnext/patches/v4_0/update_users_report_view_settings.py b/erpnext/patches/v4_0/update_users_report_view_settings.py new file mode 100644 index 0000000000..8883dc26f5 --- /dev/null +++ b/erpnext/patches/v4_0/update_users_report_view_settings.py @@ -0,0 +1,12 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals + +from frappe.model import update_users_report_view_settings +from erpnext.patches.v4_0.fields_to_be_renamed import rename_map + +def execute(): + for dt, field_list in rename_map.items(): + for field in field_list: + update_users_report_view_settings(dt, field[0], field[1]) From 14920b447c77e595cd8714de76ad91bda64e8410 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 12:14:17 +0530 Subject: [PATCH 14/57] Fixed Currency Exchange error --- erpnext/setup/doctype/currency/currency.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/erpnext/setup/doctype/currency/currency.py b/erpnext/setup/doctype/currency/currency.py index 5be618b80e..abfbe1930c 100644 --- a/erpnext/setup/doctype/currency/currency.py +++ b/erpnext/setup/doctype/currency/currency.py @@ -17,8 +17,5 @@ def validate_conversion_rate(currency, conversion_rate, conversion_rate_label, c company_currency = frappe.db.get_value("Company", company, "default_currency") if not conversion_rate: - throw(_('%(conversion_rate_label)s is mandatory. Maybe Currency Exchange record is not created for %(from_currency)s to %(to_currency)s') % { - "conversion_rate_label": conversion_rate_label, - "from_currency": currency, - "to_currency": company_currency - }) + throw(_("{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}.").format( + conversion_rate_label, currency, company_currency)) From e3ac8dd5a8ac5afeb35a3e7da7a71d82997b835d Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 12:48:46 +0530 Subject: [PATCH 15/57] Don't set default for warehouse when creating serial no --- erpnext/stock/doctype/serial_no/serial_no.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index ff4d519cf9..fe4af21d78 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -278,13 +278,16 @@ def get_serial_nos(serial_no): def make_serial_no(serial_no, sle): sr = frappe.new_doc("Serial No") + sr.warehouse = None + sr.dont_update_if_missing.append("warehouse") sr.ignore_permissions = True + sr.serial_no = serial_no sr.item_code = sle.item_code - sr.warehouse = None sr.company = sle.company sr.via_stock_ledger = True sr.insert() + sr.warehouse = sle.warehouse sr.status = "Available" sr.save() From 457515fc08866f0de238ff3511cac0192624819c Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 13:10:10 +0530 Subject: [PATCH 16/57] Stock Entry: get fg item incoming rate if bom is mentioned --- .../stock/doctype/stock_entry/stock_entry.py | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 3df78c8def..1dc624f21e 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -217,8 +217,8 @@ class StockEntry(StockController): Available Qty: {4}, Transfer Qty: {5}""").format(d.idx, d.s_warehouse, self.posting_date, self.posting_time, d.actual_qty, d.transfer_qty)) - # get incoming rate if not d.bom_no: + # set incoming rate if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return": incoming_rate = self.get_incoming_rate(args) if flt(incoming_rate) > 0: @@ -227,15 +227,16 @@ class StockEntry(StockController): d.amount = flt(d.transfer_qty) * flt(d.incoming_rate) raw_material_cost += flt(d.amount) - # set incoming rate for fg item - if self.production_order and self.purpose == "Manufacture/Repack": - for d in self.get("mtn_details"): - if d.bom_no: - if not flt(d.incoming_rate): - bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1) - operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity) - d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty)) - d.amount = flt(d.transfer_qty) * flt(d.incoming_rate) + # bom no exists and purpose is Manufacture/Repack + elif self.purpose == "Manufacture/Repack": + + # set incoming rate for fg item + if not flt(d.incoming_rate): + bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1) + operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity) + d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty)) + + d.amount = flt(d.transfer_qty) * flt(d.incoming_rate) def get_incoming_rate(self, args): incoming_rate = 0 From be1d11f98d650a7ded89f6f204778b13d0847fd3 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 13:35:37 +0530 Subject: [PATCH 17/57] Travis: Install frappe of targetted branch For example: If pull request is for wip-4.1 branch of erpnext, install frappe with branch as wip-4.1 --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 59acb5c0e4..dba0dab6ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,9 +14,13 @@ install: - sudo apt-get update - sudo apt-get purge -y mysql-common - sudo apt-get install mariadb-server mariadb-common libmariadbclient-dev - - CFLAGS=-O0 pip install git+https://github.com/frappe/frappe.git@develop && + - CFLAGS=-O0 pip install git+https://github.com/frappe/frappe.git@$TRAVIS_BRANCH && - pip install --editable . +before_script: + - mysql -e 'create database test_frappe' + - echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root + script: - cd ./test_sites/ - frappe --use test_site @@ -25,7 +29,3 @@ script: - frappe -b - frappe --serve_test & - frappe --verbose --run_tests --app erpnext - -before_script: - - mysql -e 'create database test_frappe' - - echo "USE mysql;\nCREATE USER 'test_frappe'@'localhost' IDENTIFIED BY 'test_frappe';\nFLUSH PRIVILEGES;\n" | mysql -u root From a469954ef3807bb1f95c1e68adc01e94040d11f8 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 14:05:08 +0530 Subject: [PATCH 18/57] Revert "Stock Entry: get fg item incoming rate if bom is mentioned" This reverts commit 297939325a49f51140971f99c5f240162b656f36. --- .../stock/doctype/stock_entry/stock_entry.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 1dc624f21e..3df78c8def 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -217,8 +217,8 @@ class StockEntry(StockController): Available Qty: {4}, Transfer Qty: {5}""").format(d.idx, d.s_warehouse, self.posting_date, self.posting_time, d.actual_qty, d.transfer_qty)) + # get incoming rate if not d.bom_no: - # set incoming rate if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return": incoming_rate = self.get_incoming_rate(args) if flt(incoming_rate) > 0: @@ -227,16 +227,15 @@ class StockEntry(StockController): d.amount = flt(d.transfer_qty) * flt(d.incoming_rate) raw_material_cost += flt(d.amount) - # bom no exists and purpose is Manufacture/Repack - elif self.purpose == "Manufacture/Repack": - - # set incoming rate for fg item - if not flt(d.incoming_rate): - bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1) - operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity) - d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty)) - - d.amount = flt(d.transfer_qty) * flt(d.incoming_rate) + # set incoming rate for fg item + if self.production_order and self.purpose == "Manufacture/Repack": + for d in self.get("mtn_details"): + if d.bom_no: + if not flt(d.incoming_rate): + bom = frappe.db.get_value("BOM", d.bom_no, ["operating_cost", "quantity"], as_dict=1) + operation_cost_per_unit = flt(bom.operating_cost) / flt(bom.quantity) + d.incoming_rate = operation_cost_per_unit + (raw_material_cost / flt(d.transfer_qty)) + d.amount = flt(d.transfer_qty) * flt(d.incoming_rate) def get_incoming_rate(self, args): incoming_rate = 0 From 222b7b660e70b793cd74ff42fe70e3a862ac07c5 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 14:05:29 +0530 Subject: [PATCH 19/57] Stock Entry: get fg item incoming rate if bom is mentioned --- erpnext/stock/doctype/stock_entry/stock_entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 3df78c8def..38c7521e36 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -228,7 +228,7 @@ class StockEntry(StockController): raw_material_cost += flt(d.amount) # set incoming rate for fg item - if self.production_order and self.purpose == "Manufacture/Repack": + if self.purpose == "Manufacture/Repack": for d in self.get("mtn_details"): if d.bom_no: if not flt(d.incoming_rate): From ca3d60c160e27405124b12f30185c6b87a435098 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 15:23:25 +0530 Subject: [PATCH 20/57] Fixed Sales Order -> Delivery Note mapping of address fields --- erpnext/selling/doctype/sales_order/sales_order.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 1b66c65dac..24da5773a3 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -279,13 +279,9 @@ def make_delivery_note(source_name, target_doc=None): target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate) target.qty = flt(source.qty) - flt(source.delivered_qty) - doclist = get_mapped_doc("Sales Order", source_name, { + target_doc = get_mapped_doc("Sales Order", source_name, { "Sales Order": { "doctype": "Delivery Note", - "field_map": { - "shipping_address": "address_display", - "shipping_address_name": "customer_address", - }, "validation": { "docstatus": ["=", 1] } @@ -310,7 +306,7 @@ def make_delivery_note(source_name, target_doc=None): } }, target_doc, set_missing_values) - return doclist + return target_doc @frappe.whitelist() def make_sales_invoice(source_name, target_doc=None): From 5a9e00ce71833d51238d51930495f6a8510b9b65 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 16:26:45 +0530 Subject: [PATCH 21/57] Fixed Employee Leave Balance Report --- .../report/employee_leave_balance/employee_leave_balance.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py index c1d8bcfba4..99b235e91a 100644 --- a/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py +++ b/erpnext/hr/report/employee_leave_balance/employee_leave_balance.py @@ -24,17 +24,19 @@ def execute(filters=None): else: fiscal_years = frappe.db.sql_list("select name from `tabFiscal Year` order by name desc") + employee_names = [d.name for d in employees] + allocations = frappe.db.sql("""select employee, fiscal_year, leave_type, total_leaves_allocated from `tabLeave Allocation` where docstatus=1 and employee in (%s)""" % - ','.join(['%s']*len(employees)), employees, as_dict=True) + ','.join(['%s']*len(employee_names)), employee_names, as_dict=True) applications = frappe.db.sql("""select employee, fiscal_year, leave_type, SUM(total_leave_days) as leaves from `tabLeave Application` where status="Approved" and docstatus = 1 and employee in (%s) group by employee, fiscal_year, leave_type""" % - ','.join(['%s']*len(employees)), employees, as_dict=True) + ','.join(['%s']*len(employee_names)), employee_names, as_dict=True) columns = [ "Fiscal Year", "Employee:Link/Employee:150", "Employee Name::200", "Department::150" From afdc0a5f59253ffc648b454b190555a5702025d6 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Jun 2014 14:42:22 +0530 Subject: [PATCH 22/57] Valuation rate and amount for fg item --- .../stock/doctype/stock_entry/stock_entry.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index a42a865cbb..510b395ae4 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -359,16 +359,17 @@ cur_frm.cscript.item_code = function(doc, cdt, cdn) { cur_frm.cscript.s_warehouse = function(doc, cdt, cdn) { var d = locals[cdt][cdn]; - args = { - 'item_code' : d.item_code, - 'warehouse' : cstr(d.s_warehouse) || cstr(d.t_warehouse), - 'transfer_qty' : d.transfer_qty, - 'serial_no' : d.serial_no, - 'bom_no' : d.bom_no, - 'qty' : d.s_warehouse ? -1* d.qty : d.qty + if(!d.bom_no) { + args = { + 'item_code' : d.item_code, + 'warehouse' : cstr(d.s_warehouse) || cstr(d.t_warehouse), + 'transfer_qty' : d.transfer_qty, + 'serial_no' : d.serial_no, + 'qty' : d.s_warehouse ? -1* d.qty : d.qty + } + return get_server_fields('get_warehouse_details', JSON.stringify(args), + 'mtn_details', doc, cdt, cdn, 1); } - return get_server_fields('get_warehouse_details', JSON.stringify(args), - 'mtn_details', doc, cdt, cdn, 1); } cur_frm.cscript.t_warehouse = cur_frm.cscript.s_warehouse; From 216e5bb2089a4a8cdce07b47c01b6a271832b0f0 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Jun 2014 15:12:03 +0530 Subject: [PATCH 23/57] Incoming rate for sales return --- .../stock/doctype/stock_entry/stock_entry.py | 31 ++++++++----------- 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 38c7521e36..0321dcfeb7 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -239,29 +239,24 @@ class StockEntry(StockController): def get_incoming_rate(self, args): incoming_rate = 0 - if self.purpose == "Sales Return" and \ - (self.delivery_note_no or self.sales_invoice_no): - sle = frappe.db.sql("""select name, posting_date, posting_time, - actual_qty, stock_value, warehouse from `tabStock Ledger Entry` - where voucher_type = %s and voucher_no = %s and - item_code = %s limit 1""", - ((self.delivery_note_no and "Delivery Note" or "Sales Invoice"), - self.delivery_note_no or self.sales_invoice_no, args.item_code), as_dict=1) - if sle: - args.update({ - "posting_date": sle[0].posting_date, - "posting_time": sle[0].posting_time, - "sle": sle[0].name, - "warehouse": sle[0].warehouse, - }) - previous_sle = get_previous_sle(args) - incoming_rate = (flt(sle[0].stock_value) - flt(previous_sle.get("stock_value"))) / \ - flt(sle[0].actual_qty) + if self.purpose == "Sales Return": + incoming_rate = self.get_incoming_rate_for_sales_return(args) else: incoming_rate = get_incoming_rate(args) return incoming_rate + def get_incoming_rate_for_sales_return(self, args): + incoming_rate = 0.0 + if self.delivery_note_no or self.sales_invoice_no: + incoming_rate = frappe.db.sql("""select abs(ifnull(stock_value_difference, 0) / actual_qty) + from `tabStock Ledger Entry` + where voucher_type = %s and voucher_no = %s and item_code = %s limit 1""", + ((self.delivery_note_no and "Delivery Note" or "Sales Invoice"), + self.delivery_note_no or self.sales_invoice_no, args.item_code))[0][0] + + return incoming_rate + def validate_incoming_rate(self): for d in self.get('mtn_details'): if d.t_warehouse: From c226292d8e966a4442e8381220c9fdc957887b74 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Jun 2014 16:40:08 +0530 Subject: [PATCH 24/57] Stocvk entry incoming rate for sales return --- erpnext/stock/doctype/stock_entry/stock_entry.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 0321dcfeb7..297542b50f 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -248,12 +248,13 @@ class StockEntry(StockController): def get_incoming_rate_for_sales_return(self, args): incoming_rate = 0.0 - if self.delivery_note_no or self.sales_invoice_no: + if (self.delivery_note_no or self.sales_invoice_no) and args.get("item_code"): incoming_rate = frappe.db.sql("""select abs(ifnull(stock_value_difference, 0) / actual_qty) from `tabStock Ledger Entry` where voucher_type = %s and voucher_no = %s and item_code = %s limit 1""", ((self.delivery_note_no and "Delivery Note" or "Sales Invoice"), - self.delivery_note_no or self.sales_invoice_no, args.item_code))[0][0] + self.delivery_note_no or self.sales_invoice_no, args.item_code)) + incoming_rate = incoming_rate[0][0] if incoming_rate else 0.0 return incoming_rate From 3b7dd0396f6d39d6e76ad78bfd7a805519dddf8e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Jun 2014 16:40:27 +0530 Subject: [PATCH 25/57] Get party details fixes --- erpnext/accounts/party.py | 13 +++++++------ erpnext/public/js/utils/party.js | 1 + erpnext/stock/doctype/stock_entry/stock_entry.js | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 9792da1b26..cd172f1902 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -12,13 +12,14 @@ from erpnext.utilities.doctype.contact.contact import get_contact_details @frappe.whitelist() def get_party_details(party=None, account=None, party_type="Customer", company=None, - posting_date=None, price_list=None, currency=None): + posting_date=None, price_list=None, currency=None, doctype=None): - return _get_party_details(party, account, party_type, company, posting_date, price_list, currency) + return _get_party_details(party, account, party_type, + company, posting_date, price_list, currency, doctype) def _get_party_details(party=None, account=None, party_type="Customer", company=None, - posting_date=None, price_list=None, currency=None, ignore_permissions=False): - out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date)) + posting_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False): + out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date, doctype)) party = out[party_type.lower()] @@ -106,8 +107,8 @@ def set_price_list(out, party, party_type, given_price_list): out["selling_price_list" if party.doctype=="Customer" else "buying_price_list"] = price_list -def set_account_and_due_date(party, account, party_type, company, posting_date): - if not posting_date: +def set_account_and_due_date(party, account, party_type, company, posting_date, doctype): + if doctype not in ["Sales Invoice", "Purchase Invoice"]: # not an invoice return { party_type.lower(): party diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js index 40db97feb8..c9b1206cc1 100644 --- a/erpnext/public/js/utils/party.js +++ b/erpnext/public/js/utils/party.js @@ -25,6 +25,7 @@ erpnext.utils.get_party_details = function(frm, method, args, callback) { args.currency = frm.doc.currency; args.company = frm.doc.company; + args.doctype = frm.doc.doctype; frappe.call({ method: method, args: args, diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js index 510b395ae4..959739225e 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.js +++ b/erpnext/stock/doctype/stock_entry/stock_entry.js @@ -241,14 +241,14 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ customer: function() { return this.frm.call({ method: "erpnext.accounts.party.get_party_details", - args: { party: this.frm.doc.customer, party_type:"Customer" } + args: { party: this.frm.doc.customer, party_type:"Customer", doctype: this.frm.doc.doctype } }); }, supplier: function() { return this.frm.call({ method: "erpnext.accounts.party.get_party_details", - args: { party: this.frm.doc.supplier, party_type:"Supplier" } + args: { party: this.frm.doc.supplier, party_type:"Supplier", doctype: this.frm.doc.doctype } }); }, From c5e813f9f421fcb544a84721bed5ffe6204d02bc Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 18 Jun 2014 19:51:38 +0530 Subject: [PATCH 26/57] Overwrite from POS Settings if value exists --- 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 cdf5aa1f3d..c5c1280fdb 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -229,7 +229,7 @@ def get_pos_settings_item_details(company, args, pos_settings=None): if pos_settings: for fieldname in ("income_account", "cost_center", "warehouse", "expense_account"): - if not args.get(fieldname): + if not args.get(fieldname) and pos_settings.get(fieldname): res[fieldname] = pos_settings.get(fieldname) if res.get("warehouse"): From c20de7b2642060e39d703c3da6c5e2b0f2395833 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 20:55:18 +0530 Subject: [PATCH 27/57] Minor fix in Journal Voucher --- .../accounts/doctype/journal_voucher/journal_voucher.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py index d75101d0e1..fc1916b5bc 100644 --- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py +++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py @@ -186,9 +186,14 @@ class JournalVoucher(AccountsController): def set_print_format_fields(self): for d in self.get('entries'): - account_type, master_type = frappe.db.get_value("Account", d.account, + result = frappe.db.get_value("Account", d.account, ["account_type", "master_type"]) + if not result: + continue + + account_type, master_type = result + if master_type in ['Supplier', 'Customer']: if not self.pay_to_recd_from: self.pay_to_recd_from = frappe.db.get_value(master_type, From daa56ca50f1b482d2bffec595a05d90f256e2a50 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 20:55:39 +0530 Subject: [PATCH 28/57] Fixed number format in currency --- erpnext/setup/doctype/currency/currency.json | 182 +++++++++---------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/erpnext/setup/doctype/currency/currency.json b/erpnext/setup/doctype/currency/currency.json index 26fd14e5f9..ee7be19a53 100644 --- a/erpnext/setup/doctype/currency/currency.json +++ b/erpnext/setup/doctype/currency/currency.json @@ -1,117 +1,117 @@ { - "autoname": "field:currency_name", - "creation": "2013-01-28 10:06:02", - "description": "**Currency** Master", - "docstatus": 0, - "doctype": "DocType", + "autoname": "field:currency_name", + "creation": "2013-01-28 10:06:02", + "description": "**Currency** Master", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "currency_name", - "fieldtype": "Data", - "label": "Currency Name", - "oldfieldname": "currency_name", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "currency_name", + "fieldtype": "Data", + "label": "Currency Name", + "oldfieldname": "currency_name", + "oldfieldtype": "Data", + "permlevel": 0, "reqd": 1 - }, + }, { - "fieldname": "enabled", - "fieldtype": "Check", - "in_list_view": 1, - "label": "Enabled", + "fieldname": "enabled", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Enabled", "permlevel": 0 - }, + }, { - "description": "Sub-currency. For e.g. \"Cent\"", - "fieldname": "fraction", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Fraction", + "description": "Sub-currency. For e.g. \"Cent\"", + "fieldname": "fraction", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Fraction", "permlevel": 0 - }, + }, { - "description": "1 Currency = [?] Fraction\nFor e.g. 1 USD = 100 Cent", - "fieldname": "fraction_units", - "fieldtype": "Int", - "in_list_view": 1, - "label": "Fraction Units", + "description": "1 Currency = [?] Fraction\nFor e.g. 1 USD = 100 Cent", + "fieldname": "fraction_units", + "fieldtype": "Int", + "in_list_view": 1, + "label": "Fraction Units", "permlevel": 0 - }, + }, { - "description": "A symbol for this currency. For e.g. $", - "fieldname": "symbol", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Symbol", + "description": "A symbol for this currency. For e.g. $", + "fieldname": "symbol", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Symbol", "permlevel": 0 - }, + }, { - "description": "How should this currency be formatted? If not set, will use system defaults", - "fieldname": "number_format", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Number Format", - "options": "\n#,###.##\n#.###,##\n# ###.##\n#,###.###\n#,##,###.##\n#.###\n#,###", + "description": "How should this currency be formatted? If not set, will use system defaults", + "fieldname": "number_format", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Number Format", + "options": "\n#,###.##\n#.###,##\n# ###.##\n# ###,##\n#'###.##\n#, ###.##\n#,##,###.##\n#,###.###\n#.###\n#,###", "permlevel": 0 } - ], - "icon": "icon-bitcoin", - "idx": 1, - "in_create": 0, - "modified": "2014-05-27 03:49:09.038451", - "modified_by": "Administrator", - "module": "Setup", - "name": "Currency", - "owner": "Administrator", + ], + "icon": "icon-bitcoin", + "idx": 1, + "in_create": 0, + "modified": "2014-06-18 03:49:09.038451", + "modified_by": "Administrator", + "module": "Setup", + "name": "Currency", + "owner": "Administrator", "permissions": [ { - "create": 1, - "delete": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "create": 1, - "delete": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Sales Master Manager", - "submit": 0, + "amend": 0, + "create": 1, + "delete": 1, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales Master Manager", + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "create": 1, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase Master Manager", - "submit": 0, + "amend": 0, + "create": 1, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase Master Manager", + "submit": 0, "write": 1 - }, + }, { - "apply_user_permissions": 1, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, + "apply_user_permissions": 1, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, "role": "All" } - ], + ], "read_only": 0 -} \ No newline at end of file +} From f654fea736c17d556f941f6b4d12469c798e5096 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 18 Jun 2014 21:09:19 +0530 Subject: [PATCH 29/57] Fixed feed type options --- erpnext/home/doctype/feed/feed.json | 101 ++++++++++++++-------------- 1 file changed, 51 insertions(+), 50 deletions(-) diff --git a/erpnext/home/doctype/feed/feed.json b/erpnext/home/doctype/feed/feed.json index a4018703c2..bef8aacfc0 100644 --- a/erpnext/home/doctype/feed/feed.json +++ b/erpnext/home/doctype/feed/feed.json @@ -1,72 +1,73 @@ { - "autoname": "hash", - "creation": "2012-07-03 13:29:42", - "docstatus": 0, - "doctype": "DocType", + "autoname": "hash", + "creation": "2012-07-03 13:29:42", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "feed_type", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Feed Type", + "fieldname": "feed_type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Feed Type", + "options": "\nComment\nLogin", "permlevel": 0 - }, + }, { - "fieldname": "doc_type", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Doc Type", + "fieldname": "doc_type", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Doc Type", "permlevel": 0 - }, + }, { - "fieldname": "doc_name", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Doc Name", + "fieldname": "doc_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Doc Name", "permlevel": 0 - }, + }, { - "fieldname": "subject", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Subject", + "fieldname": "subject", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Subject", "permlevel": 0 - }, + }, { - "fieldname": "color", - "fieldtype": "Data", - "in_list_view": 1, - "label": "Color", + "fieldname": "color", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Color", "permlevel": 0 - }, + }, { - "fieldname": "full_name", - "fieldtype": "Data", - "label": "Full Name", + "fieldname": "full_name", + "fieldtype": "Data", + "label": "Full Name", "permlevel": 0 } - ], - "icon": "icon-rss", - "idx": 1, - "modified": "2014-05-27 03:49:10.882587", - "modified_by": "Administrator", - "module": "Home", - "name": "Feed", - "owner": "Administrator", + ], + "icon": "icon-rss", + "idx": 1, + "modified": "2014-06-18 03:49:10.882587", + "modified_by": "Administrator", + "module": "Home", + "name": "Feed", + "owner": "Administrator", "permissions": [ { - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, "role": "System Manager" - }, + }, { - "apply_user_permissions": 1, - "permlevel": 0, - "read": 1, + "apply_user_permissions": 1, + "permlevel": 0, + "read": 1, "role": "All" } ] -} \ No newline at end of file +} From f5ec92c79ac38b87ede7cdadd747d18017f5eaa6 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 19 Jun 2014 15:52:19 +0530 Subject: [PATCH 30/57] Validate Select field values --- erpnext/accounts/doctype/account/account.json | 540 +++++++++--------- .../accounts/doctype/gl_entry/gl_entry.json | 364 ++++++------ .../purchase_invoice/test_records.json | 328 +++++------ .../production_order/production_order.json | 404 ++++++------- .../selling/doctype/lead/test_records.json | 2 +- .../support/doctype/newsletter/newsletter.py | 2 +- 6 files changed, 820 insertions(+), 820 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.json b/erpnext/accounts/doctype/account/account.json index 4649c3829a..f909ef60b2 100644 --- a/erpnext/accounts/doctype/account/account.json +++ b/erpnext/accounts/doctype/account/account.json @@ -1,332 +1,332 @@ { - "allow_copy": 1, - "allow_import": 1, - "allow_rename": 1, - "creation": "2013-01-30 12:49:46", - "description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Master", + "allow_copy": 1, + "allow_import": 1, + "allow_rename": 1, + "creation": "2013-01-30 12:49:46", + "description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Master", "fields": [ { - "fieldname": "properties", - "fieldtype": "Section Break", - "in_list_view": 0, - "label": "Account Details", - "oldfieldtype": "Section Break", + "fieldname": "properties", + "fieldtype": "Section Break", + "in_list_view": 0, + "label": "Account Details", + "oldfieldtype": "Section Break", "permlevel": 0 - }, + }, { - "fieldname": "column_break0", - "fieldtype": "Column Break", - "in_list_view": 0, - "permlevel": 0, + "fieldname": "column_break0", + "fieldtype": "Column Break", + "in_list_view": 0, + "permlevel": 0, "width": "50%" - }, + }, { - "fieldname": "account_name", - "fieldtype": "Data", - "in_filter": 1, - "in_list_view": 1, - "label": "Account Name", - "no_copy": 1, - "oldfieldname": "account_name", - "oldfieldtype": "Data", - "permlevel": 0, - "read_only": 1, - "reqd": 1, + "fieldname": "account_name", + "fieldtype": "Data", + "in_filter": 1, + "in_list_view": 1, + "label": "Account Name", + "no_copy": 1, + "oldfieldname": "account_name", + "oldfieldtype": "Data", + "permlevel": 0, + "read_only": 1, + "reqd": 1, "search_index": 1 - }, + }, { - "default": "Ledger", - "fieldname": "group_or_ledger", - "fieldtype": "Select", - "in_filter": 1, - "in_list_view": 1, - "label": "Group or Ledger", - "oldfieldname": "group_or_ledger", - "oldfieldtype": "Select", - "options": "\nLedger\nGroup", - "permlevel": 0, - "read_only": 1, - "reqd": 1, + "default": "Ledger", + "fieldname": "group_or_ledger", + "fieldtype": "Select", + "in_filter": 1, + "in_list_view": 1, + "label": "Group or Ledger", + "oldfieldname": "group_or_ledger", + "oldfieldtype": "Select", + "options": "\nLedger\nGroup", + "permlevel": 0, + "read_only": 1, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "company", - "fieldtype": "Link", - "in_filter": 1, - "label": "Company", - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "read_only": 1, - "reqd": 1, + "fieldname": "company", + "fieldtype": "Link", + "in_filter": 1, + "label": "Company", + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "read_only": 1, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "column_break1", - "fieldtype": "Column Break", - "permlevel": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "permlevel": 0, "width": "50%" - }, + }, { - "fieldname": "parent_account", - "fieldtype": "Link", - "ignore_user_permissions": 1, - "label": "Parent Account", - "oldfieldname": "parent_account", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, - "reqd": 1, + "fieldname": "parent_account", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "label": "Parent Account", + "oldfieldname": "parent_account", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, + "reqd": 1, "search_index": 1 - }, + }, { - "description": "Setting Account Type helps in selecting this Account in transactions.", - "fieldname": "account_type", - "fieldtype": "Select", - "in_filter": 1, - "label": "Account Type", - "oldfieldname": "account_type", - "oldfieldtype": "Select", - "options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment", - "permlevel": 0, + "description": "Setting Account Type helps in selecting this Account in transactions.", + "fieldname": "account_type", + "fieldtype": "Select", + "in_filter": 1, + "label": "Account Type", + "oldfieldname": "account_type", + "oldfieldtype": "Select", + "options": "\nBank\nCash\nTax\nChargeable\nWarehouse\nReceivable\nPayable\nEquity\nFixed Asset\nCost of Goods Sold\nExpense Account\nIncome Account\nStock Received But Not Billed\nExpenses Included In Valuation\nStock Adjustment\nStock", + "permlevel": 0, "search_index": 0 - }, + }, { - "description": "Rate at which this tax is applied", - "fieldname": "tax_rate", - "fieldtype": "Float", - "hidden": 0, - "label": "Rate", - "oldfieldname": "tax_rate", - "oldfieldtype": "Currency", - "permlevel": 0, + "description": "Rate at which this tax is applied", + "fieldname": "tax_rate", + "fieldtype": "Float", + "hidden": 0, + "label": "Rate", + "oldfieldname": "tax_rate", + "oldfieldtype": "Currency", + "permlevel": 0, "reqd": 0 - }, + }, { - "description": "If the account is frozen, entries are allowed to restricted users.", - "fieldname": "freeze_account", - "fieldtype": "Select", - "label": "Frozen", - "oldfieldname": "freeze_account", - "oldfieldtype": "Select", - "options": "No\nYes", + "description": "If the account is frozen, entries are allowed to restricted users.", + "fieldname": "freeze_account", + "fieldtype": "Select", + "label": "Frozen", + "oldfieldname": "freeze_account", + "oldfieldtype": "Select", + "options": "No\nYes", "permlevel": 0 - }, + }, { - "fieldname": "credit_days", - "fieldtype": "Int", - "hidden": 1, - "label": "Credit Days", - "oldfieldname": "credit_days", - "oldfieldtype": "Int", - "permlevel": 0, + "fieldname": "credit_days", + "fieldtype": "Int", + "hidden": 1, + "label": "Credit Days", + "oldfieldname": "credit_days", + "oldfieldtype": "Int", + "permlevel": 0, "print_hide": 1 - }, + }, { - "fieldname": "credit_limit", - "fieldtype": "Currency", - "hidden": 1, - "label": "Credit Limit", - "oldfieldname": "credit_limit", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, + "fieldname": "credit_limit", + "fieldtype": "Currency", + "hidden": 1, + "label": "Credit Limit", + "oldfieldname": "credit_limit", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", + "permlevel": 0, "print_hide": 1 - }, + }, { - "description": "If this Account represents a Customer, Supplier or Employee, set it here.", - "fieldname": "master_type", - "fieldtype": "Select", - "label": "Master Type", - "oldfieldname": "master_type", - "oldfieldtype": "Select", - "options": "\nSupplier\nCustomer\nEmployee", + "description": "If this Account represents a Customer, Supplier or Employee, set it here.", + "fieldname": "master_type", + "fieldtype": "Select", + "label": "Master Type", + "oldfieldname": "master_type", + "oldfieldtype": "Select", + "options": "\nSupplier\nCustomer\nEmployee", "permlevel": 0 - }, + }, { - "fieldname": "master_name", - "fieldtype": "Link", - "label": "Master Name", - "oldfieldname": "master_name", - "oldfieldtype": "Link", - "options": "[Select]", + "fieldname": "master_name", + "fieldtype": "Link", + "label": "Master Name", + "oldfieldname": "master_name", + "oldfieldtype": "Link", + "options": "[Select]", "permlevel": 0 - }, + }, { - "fieldname": "balance_must_be", - "fieldtype": "Select", - "label": "Balance must be", - "options": "\nDebit\nCredit", + "fieldname": "balance_must_be", + "fieldtype": "Select", + "label": "Balance must be", + "options": "\nDebit\nCredit", "permlevel": 0 - }, + }, { - "fieldname": "root_type", - "fieldtype": "Select", - "label": "Root Type", - "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", - "permlevel": 0, + "fieldname": "root_type", + "fieldtype": "Select", + "label": "Root Type", + "options": "\nAsset\nLiability\nIncome\nExpense\nEquity", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "report_type", - "fieldtype": "Select", - "label": "Report Type", - "options": "\nBalance Sheet\nProfit and Loss", - "permlevel": 0, + "fieldname": "report_type", + "fieldtype": "Select", + "label": "Report Type", + "options": "\nBalance Sheet\nProfit and Loss", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "lft", - "fieldtype": "Int", - "hidden": 1, - "label": "Lft", - "permlevel": 0, - "print_hide": 1, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "label": "Lft", + "permlevel": 0, + "print_hide": 1, "read_only": 1 - }, + }, { - "fieldname": "rgt", - "fieldtype": "Int", - "hidden": 1, - "label": "Rgt", - "permlevel": 0, - "print_hide": 1, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "label": "Rgt", + "permlevel": 0, + "print_hide": 1, "read_only": 1 - }, + }, { - "fieldname": "old_parent", - "fieldtype": "Data", - "hidden": 1, - "label": "Old Parent", - "permlevel": 0, - "print_hide": 1, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "label": "Old Parent", + "permlevel": 0, + "print_hide": 1, "read_only": 1 } - ], - "icon": "icon-money", - "idx": 1, - "in_create": 1, - "modified": "2014-06-17 04:30:56.689314", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Account", - "owner": "Administrator", + ], + "icon": "icon-money", + "idx": 1, + "in_create": 1, + "modified": "2014-06-19 18:27:58.109303", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Account", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 1, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 1, - "create": 0, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Auditor", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 0, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Auditor", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 1, - "create": 0, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Sales User", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 0, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales User", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 1, - "create": 0, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 0, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 2, - "read": 1, - "report": 1, - "role": "Auditor", - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 2, + "read": 1, + "report": 1, + "role": "Auditor", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 1, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 1, + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 2, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 2, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 2, - "read": 1, - "report": 1, - "role": "Accounts User", - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 2, + "read": 1, + "report": 1, + "role": "Accounts User", + "submit": 0, "write": 0 } - ], + ], "search_fields": "group_or_ledger" -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json index 1856386237..ce17278d82 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.json +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -1,226 +1,226 @@ { - "autoname": "GL.#######", - "creation": "2013-01-10 16:34:06", - "docstatus": 0, - "doctype": "DocType", + "autoname": "GL.#######", + "creation": "2013-01-10 16:34:06", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "posting_date", - "fieldtype": "Date", - "in_filter": 1, - "in_list_view": 1, - "label": "Posting Date", - "oldfieldname": "posting_date", - "oldfieldtype": "Date", - "permlevel": 0, + "fieldname": "posting_date", + "fieldtype": "Date", + "in_filter": 1, + "in_list_view": 1, + "label": "Posting Date", + "oldfieldname": "posting_date", + "oldfieldtype": "Date", + "permlevel": 0, "search_index": 1 - }, + }, { - "fieldname": "transaction_date", - "fieldtype": "Date", - "in_list_view": 1, - "label": "Transaction Date", - "oldfieldname": "transaction_date", - "oldfieldtype": "Date", + "fieldname": "transaction_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Transaction Date", + "oldfieldname": "transaction_date", + "oldfieldtype": "Date", "permlevel": 0 - }, + }, { - "fieldname": "aging_date", - "fieldtype": "Date", - "in_filter": 1, - "in_list_view": 1, - "label": "Aging Date", - "oldfieldname": "aging_date", - "oldfieldtype": "Date", - "permlevel": 0, + "fieldname": "aging_date", + "fieldtype": "Date", + "in_filter": 1, + "in_list_view": 1, + "label": "Aging Date", + "oldfieldname": "aging_date", + "oldfieldtype": "Date", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "account", - "fieldtype": "Link", - "in_filter": 1, - "in_list_view": 1, - "label": "Account", - "oldfieldname": "account", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, + "fieldname": "account", + "fieldtype": "Link", + "in_filter": 1, + "in_list_view": 1, + "label": "Account", + "oldfieldname": "account", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, "search_index": 1 - }, + }, { - "fieldname": "cost_center", - "fieldtype": "Link", - "in_filter": 1, - "in_list_view": 1, - "label": "Cost Center", - "oldfieldname": "cost_center", - "oldfieldtype": "Link", - "options": "Cost Center", - "permlevel": 0, + "fieldname": "cost_center", + "fieldtype": "Link", + "in_filter": 1, + "in_list_view": 1, + "label": "Cost Center", + "oldfieldname": "cost_center", + "oldfieldtype": "Link", + "options": "Cost Center", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "debit", - "fieldtype": "Currency", - "label": "Debit Amt", - "oldfieldname": "debit", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "fieldname": "debit", + "fieldtype": "Currency", + "label": "Debit Amt", + "oldfieldname": "debit", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", "permlevel": 0 - }, + }, { - "fieldname": "credit", - "fieldtype": "Currency", - "label": "Credit Amt", - "oldfieldname": "credit", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "fieldname": "credit", + "fieldtype": "Currency", + "label": "Credit Amt", + "oldfieldname": "credit", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", "permlevel": 0 - }, + }, { - "fieldname": "against", - "fieldtype": "Text", - "in_filter": 1, - "label": "Against", - "oldfieldname": "against", - "oldfieldtype": "Text", + "fieldname": "against", + "fieldtype": "Text", + "in_filter": 1, + "label": "Against", + "oldfieldname": "against", + "oldfieldtype": "Text", "permlevel": 0 - }, + }, { - "fieldname": "against_voucher", - "fieldtype": "Data", - "in_filter": 1, - "label": "Against Voucher", - "oldfieldname": "against_voucher", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "against_voucher", + "fieldtype": "Data", + "in_filter": 1, + "label": "Against Voucher", + "oldfieldname": "against_voucher", + "oldfieldtype": "Data", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "against_voucher_type", - "fieldtype": "Data", - "in_filter": 0, - "label": "Against Voucher Type", - "oldfieldname": "against_voucher_type", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "against_voucher_type", + "fieldtype": "Data", + "in_filter": 0, + "label": "Against Voucher Type", + "oldfieldname": "against_voucher_type", + "oldfieldtype": "Data", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "voucher_type", - "fieldtype": "Select", - "in_filter": 1, - "label": "Voucher Type", - "oldfieldname": "voucher_type", - "oldfieldtype": "Select", - "options": "Journal Voucher\nSales Invoice\nPurchase Invoice", - "permlevel": 0, + "fieldname": "voucher_type", + "fieldtype": "Select", + "in_filter": 1, + "label": "Voucher Type", + "oldfieldname": "voucher_type", + "oldfieldtype": "Select", + "options": "Journal Voucher\nSales Invoice\nPurchase Invoice\nPeriod Closing Voucher\nPurchase Receipt\nDelivery Note\nStock Entry\nStock Reconciliation", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "voucher_no", - "fieldtype": "Data", - "in_filter": 1, - "label": "Voucher No", - "oldfieldname": "voucher_no", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "voucher_no", + "fieldtype": "Data", + "in_filter": 1, + "label": "Voucher No", + "oldfieldname": "voucher_no", + "oldfieldtype": "Data", + "permlevel": 0, "search_index": 1 - }, + }, { - "fieldname": "remarks", - "fieldtype": "Text", - "in_filter": 1, - "label": "Remarks", - "no_copy": 1, - "oldfieldname": "remarks", - "oldfieldtype": "Text", - "permlevel": 0, + "fieldname": "remarks", + "fieldtype": "Text", + "in_filter": 1, + "label": "Remarks", + "no_copy": 1, + "oldfieldname": "remarks", + "oldfieldtype": "Text", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "is_opening", - "fieldtype": "Select", - "in_filter": 1, - "label": "Is Opening", - "oldfieldname": "is_opening", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, + "fieldname": "is_opening", + "fieldtype": "Select", + "in_filter": 1, + "label": "Is Opening", + "oldfieldname": "is_opening", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "is_advance", - "fieldtype": "Select", - "in_filter": 0, - "label": "Is Advance", - "oldfieldname": "is_advance", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, + "fieldname": "is_advance", + "fieldtype": "Select", + "in_filter": 0, + "label": "Is Advance", + "oldfieldname": "is_advance", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "fiscal_year", - "fieldtype": "Link", - "in_filter": 1, - "label": "Fiscal Year", - "oldfieldname": "fiscal_year", - "oldfieldtype": "Select", - "options": "Fiscal Year", - "permlevel": 0, + "fieldname": "fiscal_year", + "fieldtype": "Link", + "in_filter": 1, + "label": "Fiscal Year", + "oldfieldname": "fiscal_year", + "oldfieldtype": "Select", + "options": "Fiscal Year", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "company", - "fieldtype": "Link", - "in_filter": 1, - "label": "Company", - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, + "fieldname": "company", + "fieldtype": "Link", + "in_filter": 1, + "label": "Company", + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, "search_index": 0 } - ], - "icon": "icon-list", - "idx": 1, - "in_create": 1, - "modified": "2014-06-09 01:51:29.340077", - "modified_by": "Administrator", - "module": "Accounts", - "name": "GL Entry", - "owner": "Administrator", + ], + "icon": "icon-list", + "idx": 1, + "in_create": 1, + "modified": "2014-06-19 01:51:29.340077", + "modified_by": "Administrator", + "module": "Accounts", + "name": "GL Entry", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 1, - "create": 0, - "email": 1, - "export": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 0, + "email": 1, + "export": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "create": 0, - "email": 1, - "export": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "submit": 0, + "amend": 0, + "create": 0, + "email": 1, + "export": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "submit": 0, "write": 0 } - ], - "search_fields": "voucher_no,account,posting_date,against_voucher", - "sort_field": "modified", + ], + "search_fields": "voucher_no,account,posting_date,against_voucher", + "sort_field": "modified", "sort_order": "DESC" -} \ No newline at end of file +} diff --git a/erpnext/accounts/doctype/purchase_invoice/test_records.json b/erpnext/accounts/doctype/purchase_invoice/test_records.json index 67a705cc4a..48fb45d4d0 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_records.json +++ b/erpnext/accounts/doctype/purchase_invoice/test_records.json @@ -1,206 +1,206 @@ [ { - "bill_no": "NA", - "buying_price_list": "_Test Price List", - "company": "_Test Company", - "conversion_rate": 1, - "credit_to": "_Test Supplier - _TC", - "currency": "INR", - "doctype": "Purchase Invoice", + "bill_no": "NA", + "buying_price_list": "_Test Price List", + "company": "_Test Company", + "conversion_rate": 1, + "credit_to": "_Test Supplier - _TC", + "currency": "INR", + "doctype": "Purchase Invoice", "entries": [ { - "amount": 500, - "base_amount": 500, - "base_rate": 50, - "conversion_factor": 1.0, - "cost_center": "_Test Cost Center - _TC", - "doctype": "Purchase Invoice Item", - "expense_account": "_Test Account Cost for Goods Sold - _TC", - "item_code": "_Test Item Home Desktop 100", - "item_name": "_Test Item Home Desktop 100", - "item_tax_rate": "{\"_Test Account Excise Duty - _TC\": 10}", - "parentfield": "entries", - "qty": 10, - "rate": 50, + "amount": 500, + "base_amount": 500, + "base_rate": 50, + "conversion_factor": 1.0, + "cost_center": "_Test Cost Center - _TC", + "doctype": "Purchase Invoice Item", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "item_code": "_Test Item Home Desktop 100", + "item_name": "_Test Item Home Desktop 100", + "item_tax_rate": "{\"_Test Account Excise Duty - _TC\": 10}", + "parentfield": "entries", + "qty": 10, + "rate": 50, "uom": "_Test UOM" - }, + }, { - "amount": 750, - "base_amount": 750, - "base_rate": 150, - "conversion_factor": 1.0, - "cost_center": "_Test Cost Center - _TC", - "doctype": "Purchase Invoice Item", - "expense_account": "_Test Account Cost for Goods Sold - _TC", - "item_code": "_Test Item Home Desktop 200", - "item_name": "_Test Item Home Desktop 200", - "parentfield": "entries", - "qty": 5, - "rate": 150, + "amount": 750, + "base_amount": 750, + "base_rate": 150, + "conversion_factor": 1.0, + "cost_center": "_Test Cost Center - _TC", + "doctype": "Purchase Invoice Item", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "item_code": "_Test Item Home Desktop 200", + "item_name": "_Test Item Home Desktop 200", + "parentfield": "entries", + "qty": 5, + "rate": 150, "uom": "_Test UOM" } - ], - "fiscal_year": "_Test Fiscal Year 2013", - "grand_total_import": 0, - "naming_series": "BILL", + ], + "fiscal_year": "_Test Fiscal Year 2013", + "grand_total_import": 0, + "naming_series": "_T-BILL", "other_charges": [ { - "account_head": "_Test Account Shipping Charges - _TC", - "add_deduct_tax": "Add", - "category": "Valuation and Total", - "charge_type": "Actual", - "cost_center": "_Test Cost Center - _TC", - "description": "Shipping Charges", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", + "account_head": "_Test Account Shipping Charges - _TC", + "add_deduct_tax": "Add", + "category": "Valuation and Total", + "charge_type": "Actual", + "cost_center": "_Test Cost Center - _TC", + "description": "Shipping Charges", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", "rate": 100 - }, + }, { - "account_head": "_Test Account Customs Duty - _TC", - "add_deduct_tax": "Add", - "category": "Valuation", - "charge_type": "On Net Total", - "cost_center": "_Test Cost Center - _TC", - "description": "Customs Duty", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", + "account_head": "_Test Account Customs Duty - _TC", + "add_deduct_tax": "Add", + "category": "Valuation", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Customs Duty", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", "rate": 10 - }, + }, { - "account_head": "_Test Account Excise Duty - _TC", - "add_deduct_tax": "Add", - "category": "Total", - "charge_type": "On Net Total", - "cost_center": "_Test Cost Center - _TC", - "description": "Excise Duty", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", + "account_head": "_Test Account Excise Duty - _TC", + "add_deduct_tax": "Add", + "category": "Total", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Excise Duty", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", "rate": 12 - }, + }, { - "account_head": "_Test Account Education Cess - _TC", - "add_deduct_tax": "Add", - "category": "Total", - "charge_type": "On Previous Row Amount", - "cost_center": "_Test Cost Center - _TC", - "description": "Education Cess", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", - "rate": 2, + "account_head": "_Test Account Education Cess - _TC", + "add_deduct_tax": "Add", + "category": "Total", + "charge_type": "On Previous Row Amount", + "cost_center": "_Test Cost Center - _TC", + "description": "Education Cess", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", + "rate": 2, "row_id": 3 - }, + }, { - "account_head": "_Test Account S&H Education Cess - _TC", - "add_deduct_tax": "Add", - "category": "Total", - "charge_type": "On Previous Row Amount", - "cost_center": "_Test Cost Center - _TC", - "description": "S&H Education Cess", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", - "rate": 1, + "account_head": "_Test Account S&H Education Cess - _TC", + "add_deduct_tax": "Add", + "category": "Total", + "charge_type": "On Previous Row Amount", + "cost_center": "_Test Cost Center - _TC", + "description": "S&H Education Cess", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", + "rate": 1, "row_id": 3 - }, + }, { - "account_head": "_Test Account CST - _TC", - "add_deduct_tax": "Add", - "category": "Total", - "charge_type": "On Previous Row Total", - "cost_center": "_Test Cost Center - _TC", - "description": "CST", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", - "rate": 2, + "account_head": "_Test Account CST - _TC", + "add_deduct_tax": "Add", + "category": "Total", + "charge_type": "On Previous Row Total", + "cost_center": "_Test Cost Center - _TC", + "description": "CST", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", + "rate": 2, "row_id": 5 - }, + }, { - "account_head": "_Test Account VAT - _TC", - "add_deduct_tax": "Add", - "category": "Total", - "charge_type": "On Net Total", - "cost_center": "_Test Cost Center - _TC", - "description": "VAT", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", + "account_head": "_Test Account VAT - _TC", + "add_deduct_tax": "Add", + "category": "Total", + "charge_type": "On Net Total", + "cost_center": "_Test Cost Center - _TC", + "description": "VAT", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", "rate": 12.5 - }, + }, { - "account_head": "_Test Account Discount - _TC", - "add_deduct_tax": "Deduct", - "category": "Total", - "charge_type": "On Previous Row Total", - "cost_center": "_Test Cost Center - _TC", - "description": "Discount", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", - "rate": 10, + "account_head": "_Test Account Discount - _TC", + "add_deduct_tax": "Deduct", + "category": "Total", + "charge_type": "On Previous Row Total", + "cost_center": "_Test Cost Center - _TC", + "description": "Discount", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", + "rate": 10, "row_id": 7 } - ], - "posting_date": "2013-02-03", + ], + "posting_date": "2013-02-03", "supplier_name": "_Test Supplier" - }, + }, { - "bill_no": "NA", - "buying_price_list": "_Test Price List", - "company": "_Test Company", - "conversion_rate": 1.0, - "credit_to": "_Test Supplier - _TC", - "currency": "INR", - "doctype": "Purchase Invoice", + "bill_no": "NA", + "buying_price_list": "_Test Price List", + "company": "_Test Company", + "conversion_rate": 1.0, + "credit_to": "_Test Supplier - _TC", + "currency": "INR", + "doctype": "Purchase Invoice", "entries": [ { - "conversion_factor": 1.0, - "cost_center": "_Test Cost Center - _TC", - "doctype": "Purchase Invoice Item", - "expense_account": "_Test Account Cost for Goods Sold - _TC", - "item_code": "_Test Item", - "item_name": "_Test Item", - "parentfield": "entries", - "qty": 10.0, - "rate": 50.0, + "conversion_factor": 1.0, + "cost_center": "_Test Cost Center - _TC", + "doctype": "Purchase Invoice Item", + "expense_account": "_Test Account Cost for Goods Sold - _TC", + "item_code": "_Test Item", + "item_name": "_Test Item", + "parentfield": "entries", + "qty": 10.0, + "rate": 50.0, "uom": "_Test UOM" } - ], - "fiscal_year": "_Test Fiscal Year 2013", - "grand_total_import": 0, - "naming_series": "_T-Purchase Invoice-", + ], + "fiscal_year": "_Test Fiscal Year 2013", + "grand_total_import": 0, + "naming_series": "_T-Purchase Invoice-", "other_charges": [ { - "account_head": "_Test Account Shipping Charges - _TC", - "add_deduct_tax": "Add", - "category": "Valuation and Total", - "charge_type": "Actual", - "cost_center": "_Test Cost Center - _TC", - "description": "Shipping Charges", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", + "account_head": "_Test Account Shipping Charges - _TC", + "add_deduct_tax": "Add", + "category": "Valuation and Total", + "charge_type": "Actual", + "cost_center": "_Test Cost Center - _TC", + "description": "Shipping Charges", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", "rate": 100.0 - }, + }, { - "account_head": "_Test Account VAT - _TC", - "add_deduct_tax": "Add", - "category": "Total", - "charge_type": "Actual", - "cost_center": "_Test Cost Center - _TC", - "description": "VAT", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", + "account_head": "_Test Account VAT - _TC", + "add_deduct_tax": "Add", + "category": "Total", + "charge_type": "Actual", + "cost_center": "_Test Cost Center - _TC", + "description": "VAT", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", "rate": 120.0 - }, + }, { - "account_head": "_Test Account Customs Duty - _TC", - "add_deduct_tax": "Add", - "category": "Valuation", - "charge_type": "Actual", - "cost_center": "_Test Cost Center - _TC", - "description": "Customs Duty", - "doctype": "Purchase Taxes and Charges", - "parentfield": "other_charges", + "account_head": "_Test Account Customs Duty - _TC", + "add_deduct_tax": "Add", + "category": "Valuation", + "charge_type": "Actual", + "cost_center": "_Test Cost Center - _TC", + "description": "Customs Duty", + "doctype": "Purchase Taxes and Charges", + "parentfield": "other_charges", "rate": 150.0 } - ], - "posting_date": "2013-02-03", + ], + "posting_date": "2013-02-03", "supplier_name": "_Test Supplier" } -] \ No newline at end of file +] diff --git a/erpnext/manufacturing/doctype/production_order/production_order.json b/erpnext/manufacturing/doctype/production_order/production_order.json index b1b19e41c9..7e068cff74 100644 --- a/erpnext/manufacturing/doctype/production_order/production_order.json +++ b/erpnext/manufacturing/doctype/production_order/production_order.json @@ -1,256 +1,256 @@ { - "allow_import": 1, - "autoname": "naming_series:", - "creation": "2013-01-10 16:34:16", - "docstatus": 0, - "doctype": "DocType", + "allow_import": 1, + "autoname": "naming_series:", + "creation": "2013-01-10 16:34:16", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "item", - "fieldtype": "Section Break", - "label": "Item", - "options": "icon-gift", + "fieldname": "item", + "fieldtype": "Section Break", + "label": "Item", + "options": "icon-gift", "permlevel": 0 - }, + }, { - "default": "PRO", - "fieldname": "naming_series", - "fieldtype": "Select", - "label": "Series", - "options": "PRO-", - "permlevel": 0, + "default": "PRO-", + "fieldname": "naming_series", + "fieldtype": "Select", + "label": "Series", + "options": "PRO-", + "permlevel": 0, "reqd": 1 - }, + }, { - "depends_on": "eval:!doc.__islocal", - "fieldname": "status", - "fieldtype": "Select", - "in_filter": 1, - "in_list_view": 1, - "label": "Status", - "no_copy": 1, - "oldfieldname": "status", - "oldfieldtype": "Select", - "options": "\nDraft\nSubmitted\nStopped\nIn Process\nCompleted\nCancelled", - "permlevel": 0, - "read_only": 1, - "reqd": 1, + "depends_on": "eval:!doc.__islocal", + "fieldname": "status", + "fieldtype": "Select", + "in_filter": 1, + "in_list_view": 1, + "label": "Status", + "no_copy": 1, + "oldfieldname": "status", + "oldfieldtype": "Select", + "options": "\nDraft\nSubmitted\nStopped\nIn Process\nCompleted\nCancelled", + "permlevel": 0, + "read_only": 1, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "production_item", - "fieldtype": "Link", - "in_filter": 1, - "in_list_view": 1, - "label": "Item To Manufacture", - "oldfieldname": "production_item", - "oldfieldtype": "Link", - "options": "Item", - "permlevel": 0, - "read_only": 0, + "fieldname": "production_item", + "fieldtype": "Link", + "in_filter": 1, + "in_list_view": 1, + "label": "Item To Manufacture", + "oldfieldname": "production_item", + "oldfieldtype": "Link", + "options": "Item", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "depends_on": "production_item", - "description": "Bill of Material to be considered for manufacturing", - "fieldname": "bom_no", - "fieldtype": "Link", - "in_list_view": 1, - "label": "BOM No", - "oldfieldname": "bom_no", - "oldfieldtype": "Link", - "options": "BOM", - "permlevel": 0, - "read_only": 0, + "depends_on": "production_item", + "description": "Bill of Material to be considered for manufacturing", + "fieldname": "bom_no", + "fieldtype": "Link", + "in_list_view": 1, + "label": "BOM No", + "oldfieldname": "bom_no", + "oldfieldtype": "Link", + "options": "BOM", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "default": "1", - "description": "If checked, BOM for sub-assembly items will be considered for getting raw materials. Otherwise, all sub-assembly items will be treated as a raw material.", - "fieldname": "use_multi_level_bom", - "fieldtype": "Check", - "label": "Use Multi-Level BOM", + "default": "1", + "description": "If checked, BOM for sub-assembly items will be considered for getting raw materials. Otherwise, all sub-assembly items will be treated as a raw material.", + "fieldname": "use_multi_level_bom", + "fieldtype": "Check", + "label": "Use Multi-Level BOM", "permlevel": 0 - }, + }, { - "fieldname": "column_break1", - "fieldtype": "Column Break", - "oldfieldtype": "Column Break", - "permlevel": 0, - "read_only": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "oldfieldtype": "Column Break", + "permlevel": 0, + "read_only": 0, "width": "50%" - }, + }, { - "description": "Manufacture against Sales Order", - "fieldname": "sales_order", - "fieldtype": "Link", - "label": "Sales Order", - "options": "Sales Order", - "permlevel": 0, + "description": "Manufacture against Sales Order", + "fieldname": "sales_order", + "fieldtype": "Link", + "label": "Sales Order", + "options": "Sales Order", + "permlevel": 0, "read_only": 0 - }, + }, { - "depends_on": "production_item", - "fieldname": "qty", - "fieldtype": "Float", - "in_list_view": 1, - "label": "Qty To Manufacture", - "oldfieldname": "qty", - "oldfieldtype": "Currency", - "permlevel": 0, - "read_only": 0, + "depends_on": "production_item", + "fieldname": "qty", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Qty To Manufacture", + "oldfieldname": "qty", + "oldfieldtype": "Currency", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "depends_on": "eval:doc.docstatus==1", - "description": "Automatically updated via Stock Entry of type Manufacture/Repack", - "fieldname": "produced_qty", - "fieldtype": "Float", - "label": "Manufactured Qty", - "no_copy": 1, - "oldfieldname": "produced_qty", - "oldfieldtype": "Currency", - "permlevel": 0, + "depends_on": "eval:doc.docstatus==1", + "description": "Automatically updated via Stock Entry of type Manufacture/Repack", + "fieldname": "produced_qty", + "fieldtype": "Float", + "label": "Manufactured Qty", + "no_copy": 1, + "oldfieldname": "produced_qty", + "oldfieldtype": "Currency", + "permlevel": 0, "read_only": 1 - }, + }, { - "depends_on": "sales_order", - "fieldname": "expected_delivery_date", - "fieldtype": "Date", - "label": "Expected Delivery Date", - "permlevel": 0, + "depends_on": "sales_order", + "fieldname": "expected_delivery_date", + "fieldtype": "Date", + "label": "Expected Delivery Date", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "warehouses", - "fieldtype": "Section Break", - "label": "Warehouses", - "options": "icon-building", + "fieldname": "warehouses", + "fieldtype": "Section Break", + "label": "Warehouses", + "options": "icon-building", "permlevel": 0 - }, + }, { - "depends_on": "production_item", - "description": "Manufactured quantity will be updated in this warehouse", - "fieldname": "fg_warehouse", - "fieldtype": "Link", - "in_list_view": 0, - "label": "For Warehouse", - "options": "Warehouse", - "permlevel": 0, - "read_only": 0, + "depends_on": "production_item", + "description": "Manufactured quantity will be updated in this warehouse", + "fieldname": "fg_warehouse", + "fieldtype": "Link", + "in_list_view": 0, + "label": "For Warehouse", + "options": "Warehouse", + "permlevel": 0, + "read_only": 0, "reqd": 0 - }, + }, { - "fieldname": "column_break_12", - "fieldtype": "Column Break", + "fieldname": "column_break_12", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "fieldname": "wip_warehouse", - "fieldtype": "Link", - "label": "Work-in-Progress Warehouse", - "options": "Warehouse", - "permlevel": 0, + "fieldname": "wip_warehouse", + "fieldtype": "Link", + "label": "Work-in-Progress Warehouse", + "options": "Warehouse", + "permlevel": 0, "reqd": 0 - }, + }, { - "fieldname": "more_info", - "fieldtype": "Section Break", - "label": "More Info", - "options": "icon-file-text", - "permlevel": 0, + "fieldname": "more_info", + "fieldtype": "Section Break", + "label": "More Info", + "options": "icon-file-text", + "permlevel": 0, "read_only": 0 - }, + }, { - "fieldname": "description", - "fieldtype": "Small Text", - "label": "Item Description", - "permlevel": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Item Description", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "project_name", - "fieldtype": "Link", - "in_filter": 1, - "label": "Project Name", - "oldfieldname": "project_name", - "oldfieldtype": "Link", - "options": "Project", - "permlevel": 0, + "fieldname": "project_name", + "fieldtype": "Link", + "in_filter": 1, + "label": "Project Name", + "oldfieldname": "project_name", + "oldfieldtype": "Link", + "options": "Project", + "permlevel": 0, "read_only": 0 - }, + }, { - "fieldname": "column_break2", - "fieldtype": "Column Break", - "permlevel": 0, - "read_only": 0, + "fieldname": "column_break2", + "fieldtype": "Column Break", + "permlevel": 0, + "read_only": 0, "width": "50%" - }, + }, { - "depends_on": "production_item", - "fieldname": "stock_uom", - "fieldtype": "Link", - "label": "Stock UOM", - "oldfieldname": "stock_uom", - "oldfieldtype": "Data", - "options": "UOM", - "permlevel": 0, + "depends_on": "production_item", + "fieldname": "stock_uom", + "fieldtype": "Link", + "label": "Stock UOM", + "oldfieldname": "stock_uom", + "oldfieldtype": "Data", + "options": "UOM", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "company", - "fieldtype": "Link", - "label": "Company", - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "read_only": 0, + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "fieldname": "amended_from", - "fieldtype": "Data", - "ignore_user_permissions": 1, - "label": "Amended From", - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "amended_from", + "fieldtype": "Data", + "ignore_user_permissions": 1, + "label": "Amended From", + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Data", + "permlevel": 0, "read_only": 1 } - ], - "icon": "icon-cogs", - "idx": 1, - "in_create": 0, - "is_submittable": 1, - "modified": "2014-05-27 03:49:15.008942", - "modified_by": "Administrator", - "module": "Manufacturing", - "name": "Production Order", - "owner": "Administrator", + ], + "icon": "icon-cogs", + "idx": 1, + "in_create": 0, + "is_submittable": 1, + "modified": "2014-05-27 03:49:15.008942", + "modified_by": "Administrator", + "module": "Manufacturing", + "name": "Production Order", + "owner": "Administrator", "permissions": [ { - "amend": 1, - "apply_user_permissions": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Manufacturing User", - "submit": 1, + "amend": 1, + "apply_user_permissions": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Manufacturing User", + "submit": 1, "write": 1 - }, + }, { - "apply_user_permissions": 1, - "permlevel": 0, - "read": 1, - "report": 1, + "apply_user_permissions": 1, + "permlevel": 0, + "read": 1, + "report": 1, "role": "Material User" } ] -} \ No newline at end of file +} diff --git a/erpnext/selling/doctype/lead/test_records.json b/erpnext/selling/doctype/lead/test_records.json index ce9460489c..01b0a992d2 100644 --- a/erpnext/selling/doctype/lead/test_records.json +++ b/erpnext/selling/doctype/lead/test_records.json @@ -16,7 +16,7 @@ "doctype": "Lead", "email_id": "test_lead2@example.com", "lead_name": "_Test Lead 2", - "status": "Contacted" + "status": "Lead" }, { "doctype": "Lead", diff --git a/erpnext/support/doctype/newsletter/newsletter.py b/erpnext/support/doctype/newsletter/newsletter.py index 9072700fb6..88040e21b4 100644 --- a/erpnext/support/doctype/newsletter/newsletter.py +++ b/erpnext/support/doctype/newsletter/newsletter.py @@ -125,7 +125,7 @@ def create_lead(email_id): "doctype": "Lead", "email_id": email_id, "lead_name": real_name or email_id, - "status": "Contacted", + "status": "Lead", "naming_series": get_default_naming_series("Lead"), "company": frappe.db.get_default("company"), "source": "Email" From de5e397fd4c3f760d013ed950a02f0c19b6ead58 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 19 Jun 2014 19:25:19 +0530 Subject: [PATCH 31/57] Inventory Accounting: Cost Center only required for Expense Account --- erpnext/controllers/stock_controller.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py index 96b8a6e801..d31034753c 100644 --- a/erpnext/controllers/stock_controller.py +++ b/erpnext/controllers/stock_controller.py @@ -237,8 +237,11 @@ class StockController(AccountsController): if not item.get("expense_account"): frappe.throw(_("Expense or Difference account is mandatory for Item {0} as it impacts overall stock value").format(item.item_code)) - if item.get("expense_account") and not item.get("cost_center"): - frappe.throw(_("""Cost Center is mandatory for Item {0}""").format(item.get("item_code"))) + else: + is_expense_account = frappe.db.get_value("Account", item.get("expense_account"), "report_type")=="Profit and Loss" + if is_expense_account and not item.get("cost_center"): + frappe.throw(_("{0} {1}: Cost Center is mandatory for Item {2}").format( + _(self.doctype), self.name, item.get("item_code"))) def get_sl_entries(self, d, args): sl_dict = { From 9daca108b3c6f0512515aa7673901f25f60db489 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 20 Jun 2014 15:59:49 +0530 Subject: [PATCH 32/57] Pricing Rule fixes and improvements. Fixes #1795 --- .../doctype/pricing_rule/pricing_rule.js | 27 ++ .../doctype/pricing_rule/pricing_rule.json | 440 +++++++++--------- .../doctype/pricing_rule/pricing_rule.py | 196 +++++++- .../doctype/pricing_rule/test_pricing_rule.py | 7 +- .../purchase_invoice/purchase_invoice.json | 16 +- .../doctype/sales_invoice/sales_invoice.json | 16 +- .../purchase_order/purchase_order.json | 16 +- .../doctype/purchase_order/purchase_order.py | 13 +- .../supplier_quotation.json | 16 +- .../supplier_quotation/supplier_quotation.py | 1 + erpnext/controllers/accounts_controller.py | 6 +- erpnext/patches.txt | 1 + .../set_pricing_rule_for_buying_or_selling.py | 12 + erpnext/public/js/transaction.js | 117 +++-- .../selling/doctype/quotation/quotation.json | 16 +- .../selling/doctype/quotation/quotation.py | 2 +- .../doctype/sales_order/sales_order.json | 16 +- .../doctype/sales_order/sales_order.py | 9 +- .../doctype/delivery_note/delivery_note.json | 16 +- .../doctype/delivery_note/delivery_note.py | 1 + erpnext/stock/doctype/item/test_item.py | 12 +- .../purchase_receipt/purchase_receipt.json | 16 +- .../purchase_receipt/purchase_receipt.py | 1 + erpnext/stock/get_item_details.py | 161 +------ 24 files changed, 695 insertions(+), 439 deletions(-) create mode 100644 erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.js b/erpnext/accounts/doctype/pricing_rule/pricing_rule.js index 356cc0de9c..a1859e5d57 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.js +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.js @@ -61,4 +61,31 @@ frappe.ui.form.on("Pricing Rule", "refresh", function(frm) { '
'].join("\n"); set_field_options("pricing_rule_help", help_content); + + cur_frm.cscript.set_options_for_applicable_for(); }); + +cur_frm.cscript.set_options_for_applicable_for = function() { + var options = [""]; + var applicable_for = cur_frm.doc.applicable_for; + + if(cur_frm.doc.selling) { + options = $.merge(options, ["Customer", "Customer Group", "Territory", "Sales Partner", "Campaign"]); + } + if(cur_frm.doc.buying) { + $.merge(options, ["Supplier", "Supplier Type"]); + } + + set_field_options("applicable_for", options.join("\n")); + + if(!in_list(options, applicable_for)) applicable_for = null; + cur_frm.set_value("applicable_for", applicable_for) +} + +cur_frm.cscript.selling = function() { + cur_frm.cscript.set_options_for_applicable_for(); +} + +cur_frm.cscript.buying = function() { + cur_frm.cscript.set_options_for_applicable_for(); +} diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json index b20563fa76..e15cea83b8 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json @@ -1,288 +1,300 @@ { - "allow_import": 1, - "autoname": "PRULE.#####", - "creation": "2014-02-21 15:02:51", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Master", + "allow_import": 1, + "autoname": "PRULE.#####", + "creation": "2014-02-21 15:02:51", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Master", "fields": [ { - "fieldname": "applicability_section", - "fieldtype": "Section Break", - "in_list_view": 0, - "label": "Applicability", + "fieldname": "applicability_section", + "fieldtype": "Section Break", + "in_list_view": 0, + "label": "Applicability", "permlevel": 0 - }, + }, { - "default": "Item Code", - "fieldname": "apply_on", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Apply On", - "options": "\nItem Code\nItem Group\nBrand", - "permlevel": 0, + "default": "Item Code", + "fieldname": "apply_on", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Apply On", + "options": "\nItem Code\nItem Group\nBrand", + "permlevel": 0, "reqd": 1 - }, + }, { - "depends_on": "eval:doc.apply_on==\"Item Code\"", - "fieldname": "item_code", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Item Code", - "options": "Item", - "permlevel": 0, + "depends_on": "eval:doc.apply_on==\"Item Code\"", + "fieldname": "item_code", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Item Code", + "options": "Item", + "permlevel": 0, "reqd": 0 - }, + }, { - "depends_on": "eval:doc.apply_on==\"Item Group\"", - "fieldname": "item_group", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Item Group", - "options": "Item Group", + "depends_on": "eval:doc.apply_on==\"Item Group\"", + "fieldname": "item_group", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Item Group", + "options": "Item Group", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.apply_on==\"Brand\"", - "fieldname": "brand", - "fieldtype": "Link", - "in_list_view": 1, - "label": "Brand", - "options": "Brand", + "depends_on": "eval:doc.apply_on==\"Brand\"", + "fieldname": "brand", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Brand", + "options": "Brand", "permlevel": 0 - }, + }, { - "fieldname": "applicable_for", - "fieldtype": "Select", - "label": "Applicable For", - "options": "\nCustomer\nCustomer Group\nTerritory\nSales Partner\nCampaign\nSupplier\nSupplier Type", + "fieldname": "selling", + "fieldtype": "Check", + "label": "Selling", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.applicable_for==\"Customer\"", - "fieldname": "customer", - "fieldtype": "Link", - "label": "Customer", - "options": "Customer", + "fieldname": "buying", + "fieldtype": "Check", + "label": "Buying", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.applicable_for==\"Customer Group\"", - "fieldname": "customer_group", - "fieldtype": "Link", - "label": "Customer Group", - "options": "Customer Group", + "fieldname": "applicable_for", + "fieldtype": "Select", + "label": "Applicable For", + "options": "\nCustomer\nCustomer Group\nTerritory\nSales Partner\nCampaign\nSupplier\nSupplier Type", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.applicable_for==\"Territory\"", - "fieldname": "territory", - "fieldtype": "Link", - "label": "Territory", - "options": "Territory", + "depends_on": "eval:doc.applicable_for==\"Customer\"", + "fieldname": "customer", + "fieldtype": "Link", + "label": "Customer", + "options": "Customer", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.applicable_for==\"Sales Partner\"", - "fieldname": "sales_partner", - "fieldtype": "Link", - "label": "Sales Partner", - "options": "Sales Partner", + "depends_on": "eval:doc.applicable_for==\"Customer Group\"", + "fieldname": "customer_group", + "fieldtype": "Link", + "label": "Customer Group", + "options": "Customer Group", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.applicable_for==\"Campaign\"", - "fieldname": "campaign", - "fieldtype": "Link", - "label": "Campaign", - "options": "Campaign", + "depends_on": "eval:doc.applicable_for==\"Territory\"", + "fieldname": "territory", + "fieldtype": "Link", + "label": "Territory", + "options": "Territory", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.applicable_for==\"Supplier\"", - "fieldname": "supplier", - "fieldtype": "Link", - "label": "Supplier", - "options": "Supplier", + "depends_on": "eval:doc.applicable_for==\"Sales Partner\"", + "fieldname": "sales_partner", + "fieldtype": "Link", + "label": "Sales Partner", + "options": "Sales Partner", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.applicable_for==\"Supplier Type\"", - "fieldname": "supplier_type", - "fieldtype": "Link", - "label": "Supplier Type", - "options": "Supplier Type", + "depends_on": "eval:doc.applicable_for==\"Campaign\"", + "fieldname": "campaign", + "fieldtype": "Link", + "label": "Campaign", + "options": "Campaign", "permlevel": 0 - }, + }, { - "fieldname": "min_qty", - "fieldtype": "Float", - "label": "Min Qty", + "depends_on": "eval:doc.applicable_for==\"Supplier\"", + "fieldname": "supplier", + "fieldtype": "Link", + "label": "Supplier", + "options": "Supplier", "permlevel": 0 - }, + }, { - "fieldname": "max_qty", - "fieldtype": "Float", - "label": "Max Qty", + "depends_on": "eval:doc.applicable_for==\"Supplier Type\"", + "fieldname": "supplier_type", + "fieldtype": "Link", + "label": "Supplier Type", + "options": "Supplier Type", "permlevel": 0 - }, + }, { - "fieldname": "col_break1", - "fieldtype": "Column Break", + "fieldname": "max_qty", + "fieldtype": "Float", + "label": "Max Qty", "permlevel": 0 - }, + }, { - "fieldname": "company", - "fieldtype": "Link", - "label": "Company", - "options": "Company", + "fieldname": "min_qty", + "fieldtype": "Float", + "label": "Min Qty", "permlevel": 0 - }, + }, { - "default": "Today", - "fieldname": "valid_from", - "fieldtype": "Date", - "label": "Valid From", + "fieldname": "col_break1", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "fieldname": "valid_upto", - "fieldtype": "Date", - "label": "Valid Upto", + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "options": "Company", "permlevel": 0 - }, + }, { - "fieldname": "priority", - "fieldtype": "Select", - "label": "Priority", - "options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20", + "default": "Today", + "fieldname": "valid_from", + "fieldtype": "Date", + "label": "Valid From", "permlevel": 0 - }, + }, { - "fieldname": "disable", - "fieldtype": "Check", - "label": "Disable", + "fieldname": "valid_upto", + "fieldtype": "Date", + "label": "Valid Upto", "permlevel": 0 - }, + }, { - "fieldname": "price_discount_section", - "fieldtype": "Section Break", - "label": "Price / Discount", + "fieldname": "priority", + "fieldtype": "Select", + "label": "Priority", + "options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20", "permlevel": 0 - }, + }, { - "default": "Discount Percentage", - "fieldname": "price_or_discount", - "fieldtype": "Select", - "label": "Price or Discount", - "options": "\nPrice\nDiscount Percentage", - "permlevel": 0, + "fieldname": "disable", + "fieldtype": "Check", + "label": "Disable", + "permlevel": 0 + }, + { + "fieldname": "price_discount_section", + "fieldtype": "Section Break", + "label": "Price / Discount", + "permlevel": 0 + }, + { + "default": "Discount Percentage", + "fieldname": "price_or_discount", + "fieldtype": "Select", + "label": "Price or Discount", + "options": "\nPrice\nDiscount Percentage", + "permlevel": 0, "reqd": 1 - }, + }, { - "fieldname": "col_break2", - "fieldtype": "Column Break", + "fieldname": "col_break2", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.price_or_discount==\"Price\"", - "fieldname": "price", - "fieldtype": "Float", - "label": "Price", + "depends_on": "eval:doc.price_or_discount==\"Price\"", + "fieldname": "price", + "fieldtype": "Float", + "label": "Price", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.price_or_discount==\"Discount Percentage\"", - "fieldname": "discount_percentage", - "fieldtype": "Float", - "label": "Discount Percentage", + "depends_on": "eval:doc.price_or_discount==\"Discount Percentage\"", + "fieldname": "discount_percentage", + "fieldtype": "Float", + "label": "Discount Percentage", "permlevel": 0 - }, + }, { - "depends_on": "eval:doc.price_or_discount==\"Discount Percentage\"", - "fieldname": "for_price_list", - "fieldtype": "Link", - "label": "For Price List", - "options": "Price List", + "depends_on": "eval:doc.price_or_discount==\"Discount Percentage\"", + "fieldname": "for_price_list", + "fieldtype": "Link", + "label": "For Price List", + "options": "Price List", "permlevel": 0 - }, + }, { - "fieldname": "help_section", - "fieldtype": "Section Break", - "label": "", - "options": "Simple", + "fieldname": "help_section", + "fieldtype": "Section Break", + "label": "", + "options": "Simple", "permlevel": 0 - }, + }, { - "fieldname": "pricing_rule_help", - "fieldtype": "HTML", - "label": "Pricing Rule Help", + "fieldname": "pricing_rule_help", + "fieldtype": "HTML", + "label": "Pricing Rule Help", "permlevel": 0 } - ], - "icon": "icon-gift", - "idx": 1, - "istable": 0, - "modified": "2014-05-28 15:36:29.403659", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Pricing Rule", - "owner": "Administrator", + ], + "icon": "icon-gift", + "idx": 1, + "istable": 0, + "modified": "2014-06-19 15:00:09.962572", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Pricing Rule", + "owner": "Administrator", "permissions": [ { - "create": 1, - "delete": 1, - "export": 0, - "import": 0, - "permlevel": 0, - "read": 1, - "report": 1, - "role": "Accounts Manager", + "create": 1, + "delete": 1, + "export": 0, + "import": 0, + "permlevel": 0, + "read": 1, + "report": 1, + "role": "Accounts Manager", "write": 1 - }, + }, { - "create": 1, - "delete": 1, - "export": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 1, - "role": "Sales Manager", + "create": 1, + "delete": 1, + "export": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 1, + "role": "Sales Manager", "write": 1 - }, + }, { - "create": 1, - "delete": 1, - "permlevel": 0, - "read": 1, - "report": 1, - "role": "Purchase Manager", + "create": 1, + "delete": 1, + "permlevel": 0, + "read": 1, + "report": 1, + "role": "Purchase Manager", "write": 1 - }, + }, { - "create": 1, - "delete": 1, - "permlevel": 0, - "read": 1, - "report": 1, - "role": "Website Manager", + "create": 1, + "delete": 1, + "permlevel": 0, + "read": 1, + "report": 1, + "role": "Website Manager", "write": 1 - }, + }, { - "create": 1, - "delete": 1, - "export": 1, - "import": 1, - "permlevel": 0, - "read": 1, - "report": 1, - "set_user_permissions": 1, - "role": "System Manager", + "create": 1, + "delete": 1, + "export": 1, + "import": 1, + "permlevel": 0, + "read": 1, + "report": 1, + "restrict": 1, + "role": "System Manager", "write": 1 } - ], - "sort_field": "modified", + ], + "sort_field": "modified", "sort_order": "DESC" -} +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index a15b45a381..5cf500a597 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -5,13 +5,17 @@ from __future__ import unicode_literals import frappe +import json from frappe import throw, _ -from frappe.utils import flt +from frappe.utils import flt, cint from frappe.model.document import Document +class MultiplePricingRuleConflict(frappe.ValidationError): pass + class PricingRule(Document): def validate(self): self.validate_mandatory() + self.validate_applicable_for_selling_or_buying() self.validate_min_max_qty() self.cleanup_fields_value() self.validate_price_or_discount() @@ -22,6 +26,18 @@ class PricingRule(Document): if tocheck and not self.get(tocheck): throw(_("{0} is required").format(self.meta.get_label(tocheck)), frappe.MandatoryError) + def validate_applicable_for_selling_or_buying(self): + if not self.selling and not self.buying: + throw(_("Atleast one of the Selling or Buying must be selected")) + + if not self.selling and self.applicable_for in ["Customer", "Customer Group", + "Territory", "Sales Partner", "Campaign"]: + throw(_("Selling must be checked, if Applicable For is selected as {0}" + .format(self.applicable_for))) + + if not self.buying and self.applicable_for in ["Supplier", "Supplier Type"]: + throw(_("Buying must be checked, if Applicable For is selected as {0}" + .format(self.applicable_for))) def validate_min_max_qty(self): if self.min_qty and self.max_qty and flt(self.min_qty) > flt(self.max_qty): @@ -44,3 +60,181 @@ class PricingRule(Document): for field in ["Price", "Discount Percentage"]: if flt(self.get(frappe.scrub(field))) < 0: throw(_("{0} can not be negative").format(field)) + +#-------------------------------------------------------------------------------- + +@frappe.whitelist() +def apply_pricing_rule(args): + """ + args = { + "item_list": [{"doctype": "", "name": "", "item_code": "", "brand": "", "item_group": ""}, ...], + "customer": "something", + "customer_group": "something", + "territory": "something", + "supplier": "something", + "supplier_type": "something", + "currency": "something", + "conversion_rate": "something", + "price_list": "something", + "plc_conversion_rate": "something", + "company": "something", + "transaction_date": "something", + "campaign": "something", + "sales_partner": "something", + "ignore_pricing_rule": "something" + } + """ + if isinstance(args, basestring): + args = json.loads(args) + + args = frappe._dict(args) + + # list of dictionaries + out = [] + + if args.get("parenttype") == "Material Request": return out + + if not args.transaction_type: + args.transaction_type = "buying" if frappe.get_meta(args.parenttype).get_field("supplier") \ + else "selling" + + for item in args.get("item_list"): + args_copy = args.copy() + args_copy.update(item) + out.append(get_pricing_rule_for_item(args_copy)) + + return out + +def get_pricing_rule_for_item(args): + if args.get("parenttype") == "Material Request": return {} + + item_details = frappe._dict({ + "doctype": args.doctype, + "name": args.name, + "pricing_rule": None + }) + + if args.ignore_pricing_rule or not args.item_code: + return item_details + + if not (args.item_group and args.brand): + args.item_group, args.brand = frappe.db.get_value("Item", args.item_code, ["item_group", "brand"]) + + if args.customer and not (args.customer_group and args.territory): + args.customer_group, args.territory = frappe.db.get_value("Customer", args.customer, + ["customer_group", "territory"]) + elif args.supplier and not args.supplier_type: + args.supplier_type = frappe.db.get_value("Supplier", args.supplier, "supplier_type") + + pricing_rules = get_pricing_rules(args) + pricing_rule = filter_pricing_rules(args, pricing_rules) + + if pricing_rule: + item_details.pricing_rule = pricing_rule.name + if pricing_rule.price_or_discount == "Price": + item_details.update({ + "price_list_rate": pricing_rule.price*flt(args.plc_conversion_rate)/flt(args.conversion_rate), + "discount_percentage": 0.0 + }) + else: + item_details.discount_percentage = pricing_rule.discount_percentage + + return item_details + +def get_pricing_rules(args): + def _get_tree_conditions(parenttype, allow_blank=True): + field = frappe.scrub(parenttype) + condition = "" + if args.get(field): + lft, rgt = frappe.db.get_value(parenttype, args[field], ["lft", "rgt"]) + parent_groups = frappe.db.sql_list("""select name from `tab%s` + where lft<=%s and rgt>=%s""" % (parenttype, '%s', '%s'), (lft, rgt)) + + if parent_groups: + if allow_blank: parent_groups.append('') + condition = " ifnull("+field+", '') in ('" + "', '".join(parent_groups)+"')" + + return condition + + + conditions = "" + for field in ["company", "customer", "supplier", "supplier_type", "campaign", "sales_partner"]: + if args.get(field): + conditions += " and ifnull("+field+", '') in (%("+field+")s, '')" + else: + conditions += " and ifnull("+field+", '') = ''" + + for parenttype in ["Customer Group", "Territory"]: + group_condition = _get_tree_conditions(parenttype) + if group_condition: + conditions += " and " + group_condition + + conditions += " and ifnull(for_price_list, '') in (%(price_list)s, '')" + + if args.get("transaction_date"): + conditions += """ and %(transaction_date)s between ifnull(valid_from, '2000-01-01') + and ifnull(valid_upto, '2500-12-31')""" + + return frappe.db.sql("""select * from `tabPricing Rule` + where (item_code=%(item_code)s or {item_group_condition} or brand=%(brand)s) + and docstatus < 2 and ifnull(disable, 0) = 0 + and ifnull({transaction_type}, 0) = 1 {conditions} + order by priority desc, name desc""".format( + item_group_condition=_get_tree_conditions("Item Group", False), + transaction_type=args.transaction_type, conditions=conditions), args, as_dict=1) + +def filter_pricing_rules(args, pricing_rules): + # filter for qty + if pricing_rules and args.get("qty"): + pricing_rules = filter(lambda x: (args.qty>=flt(x.min_qty) + and (args.qty<=x.max_qty if x.max_qty else True)), pricing_rules) + + # find pricing rule with highest priority + if pricing_rules: + max_priority = max([cint(p.priority) for p in pricing_rules]) + if max_priority: + pricing_rules = filter(lambda x: cint(x.priority)==max_priority, pricing_rules) + + # apply internal priority + all_fields = ["item_code", "item_group", "brand", "customer", "customer_group", "territory", + "supplier", "supplier_type", "campaign", "sales_partner"] + + if len(pricing_rules) > 1: + for field_set in [["item_code", "item_group", "brand"], + ["customer", "customer_group", "territory"], ["supplier", "supplier_type"]]: + remaining_fields = list(set(all_fields) - set(field_set)) + if if_all_rules_same(pricing_rules, remaining_fields): + pricing_rules = apply_internal_priority(pricing_rules, field_set, args) + break + + if len(pricing_rules) > 1: + price_or_discount = list(set([d.price_or_discount for d in pricing_rules])) + if len(price_or_discount) == 1 and price_or_discount[0] == "Discount Percentage": + pricing_rules = filter(lambda x: x.for_price_list==args.price_list, pricing_rules) \ + or pricing_rules + + if len(pricing_rules) > 1: + frappe.throw(_("Multiple Price Rule exists with same criteria, please resolve \ + conflict by assigning priority. Price Rules: {0}") + .format("\n".join([d.name for d in pricing_rules])), MultiplePricingRuleConflict) + elif pricing_rules: + return pricing_rules[0] + +def if_all_rules_same(pricing_rules, fields): + all_rules_same = True + val = [pricing_rules[0][k] for k in fields] + for p in pricing_rules[1:]: + if val != [p[k] for k in fields]: + all_rules_same = False + break + + return all_rules_same + +def apply_internal_priority(pricing_rules, field_set, args): + filtered_rules = [] + for field in field_set: + if args.get(field): + filtered_rules = filter(lambda x: x[field]==args[field], pricing_rules) + if filtered_rules: break + + return filtered_rules or pricing_rules diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py index b17c995298..e8496d068b 100644 --- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py @@ -17,6 +17,7 @@ class TestPricingRule(unittest.TestCase): "doctype": "Pricing Rule", "apply_on": "Item Code", "item_code": "_Test Item", + "selling": 1, "price_or_discount": "Discount Percentage", "price": 0, "discount_percentage": 10, @@ -29,13 +30,15 @@ class TestPricingRule(unittest.TestCase): "company": "_Test Company", "price_list": "_Test Price List", "currency": "_Test Currency", - "doctype": "Sales Order", + "parenttype": "Sales Order", "conversion_rate": 1, "price_list_currency": "_Test Currency", "plc_conversion_rate": 1, "order_type": "Sales", "transaction_type": "selling", "customer": "_Test Customer", + "doctype": "Sales Order Item", + "name": None }) details = get_item_details(args) self.assertEquals(details.get("discount_percentage"), 10) @@ -71,7 +74,7 @@ class TestPricingRule(unittest.TestCase): self.assertEquals(details.get("discount_percentage"), 5) frappe.db.sql("update `tabPricing Rule` set priority=NULL where campaign='_Test Campaign'") - from erpnext.stock.get_item_details import MultiplePricingRuleConflict + from erpnext.accounts.doctype.pricing_rule.pricing_rule import MultiplePricingRuleConflict self.assertRaises(MultiplePricingRuleConflict, get_item_details, args) args.item_code = "_Test Item 2" diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index 505a3ba79a..8eb3b0907e 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -231,6 +231,14 @@ "print_hide": 1, "read_only": 0 }, + { + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "label": "Ignore Pricing Rule", + "no_copy": 1, + "permlevel": 1, + "print_hide": 1 + }, { "fieldname": "items", "fieldtype": "Section Break", @@ -744,7 +752,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-06-04 08:45:25.582170", + "modified": "2014-06-19 15:50:50.898237", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", @@ -823,6 +831,12 @@ "role": "Auditor", "submit": 0, "write": 0 + }, + { + "permlevel": 1, + "read": 1, + "role": "Accounts Manager", + "write": 1 } ], "read_only_onload": 1, diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 983f2bb405..a07b69d09f 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -241,6 +241,14 @@ "read_only": 0, "reqd": 1 }, + { + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "label": "Ignore Pricing Rule", + "no_copy": 1, + "permlevel": 1, + "print_hide": 1 + }, { "fieldname": "items", "fieldtype": "Section Break", @@ -1180,7 +1188,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:17.806077", + "modified": "2014-06-19 16:01:19.720382", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", @@ -1225,6 +1233,12 @@ "read": 1, "report": 1, "role": "Customer" + }, + { + "permlevel": 1, + "read": 1, + "role": "Accounts Manager", + "write": 1 } ], "read_only_onload": 1, diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index d293683ef4..794c0415bd 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -197,6 +197,14 @@ "permlevel": 0, "print_hide": 1 }, + { + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "label": "Ignore Pricing Rule", + "no_copy": 1, + "permlevel": 1, + "print_hide": 1 + }, { "fieldname": "items", "fieldtype": "Section Break", @@ -636,7 +644,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:15.948363", + "modified": "2014-06-19 15:58:06.375217", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", @@ -696,6 +704,12 @@ "read": 1, "report": 1, "role": "Supplier" + }, + { + "permlevel": 1, + "read": 1, + "role": "Purchase Manager", + "write": 1 } ], "read_only_onload": 1, diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 91cc865b7b..3a081249f3 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -187,12 +187,13 @@ class PurchaseOrder(BuyingController): def on_update(self): pass +def set_missing_values(source, target): + target.ignore_pricing_rule = 1 + target.run_method("set_missing_values") + target.run_method("calculate_taxes_and_totals") + @frappe.whitelist() def make_purchase_receipt(source_name, target_doc=None): - def set_missing_values(source, target): - target.run_method("set_missing_values") - target.run_method("calculate_taxes_and_totals") - def update_item(obj, target, source_parent): target.qty = flt(obj.qty) - flt(obj.received_qty) target.stock_qty = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.conversion_factor) @@ -226,10 +227,6 @@ def make_purchase_receipt(source_name, target_doc=None): @frappe.whitelist() def make_purchase_invoice(source_name, target_doc=None): - def set_missing_values(source, target): - target.run_method("set_missing_values") - target.run_method("calculate_taxes_and_totals") - def update_item(obj, target, source_parent): target.amount = flt(obj.amount) - flt(obj.billed_amt) target.base_amount = target.amount * flt(source_parent.conversion_rate) diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index 19b0283c50..c3c5bf4f39 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -196,6 +196,14 @@ "permlevel": 0, "print_hide": 1 }, + { + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "label": "Ignore Pricing Rule", + "no_copy": 1, + "permlevel": 1, + "print_hide": 1 + }, { "fieldname": "items", "fieldtype": "Section Break", @@ -562,7 +570,7 @@ "icon": "icon-shopping-cart", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:20.226683", + "modified": "2014-06-19 15:54:27.919675", "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation", @@ -640,6 +648,12 @@ "role": "Supplier", "submit": 0, "write": 0 + }, + { + "permlevel": 1, + "read": 1, + "role": "Purchase Manager", + "write": 1 } ], "read_only_onload": 1, diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py index 74a37b38d5..2af7bb93a6 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.py @@ -54,6 +54,7 @@ class SupplierQuotation(BuyingController): @frappe.whitelist() def make_purchase_order(source_name, target_doc=None): def set_missing_values(source, target): + target.ignore_pricing_rule = 1 target.run_method("set_missing_values") target.run_method("get_schedule_dates") target.run_method("calculate_taxes_and_totals") diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 3af82903a6..847e09e73d 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -89,14 +89,14 @@ class AccountsController(TransactionBase): """set missing item values""" from erpnext.stock.get_item_details import get_item_details if hasattr(self, "fname"): - parent_dict = {"doctype": self.doctype} + parent_dict = {} for fieldname in self.meta.get_valid_columns(): parent_dict[fieldname] = self.get(fieldname) for item in self.get(self.fname): if item.get("item_code"): - args = item.as_dict() - args.update(parent_dict) + args = parent_dict.copy() + args.update(item.as_dict()) ret = get_item_details(args) for fieldname, value in ret.items(): diff --git a/erpnext/patches.txt b/erpnext/patches.txt index dd57c60b18..041bbd3cc0 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -62,3 +62,4 @@ erpnext.patches.v4_0.update_other_charges_in_custom_purchase_print_formats erpnext.patches.v4_0.create_price_list_if_missing execute:frappe.db.sql("update `tabItem` set end_of_life=null where end_of_life='0000-00-00'") #2014-06-16 erpnext.patches.v4_0.update_users_report_view_settings +erpnext.patches.v4_0.set_pricing_rule_for_buying_or_selling diff --git a/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py b/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py new file mode 100644 index 0000000000..218029d8ae --- /dev/null +++ b/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py @@ -0,0 +1,12 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.db.sql("""update `tabPricing Rule` set selling=1 where ifnull(applicable_for, '') in + ('', 'Customer', 'Customer Group', 'Territory', 'Sales Partner', 'Campaign')""") + + frappe.db.sql("""update `tabPricing Rule` set buying=1 where ifnull(applicable_for, '') in + ('', 'Supplier', 'Supplier Type')""") diff --git a/erpnext/public/js/transaction.js b/erpnext/public/js/transaction.js index 2c372042ea..ea576d5ae0 100644 --- a/erpnext/public/js/transaction.js +++ b/erpnext/public/js/transaction.js @@ -116,8 +116,8 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ barcode: item.barcode, serial_no: item.serial_no, warehouse: item.warehouse, - doctype: me.frm.doc.doctype, - docname: me.frm.doc.name, + parenttype: me.frm.doc.doctype, + parent: me.frm.doc.name, customer: me.frm.doc.customer, supplier: me.frm.doc.supplier, currency: me.frm.doc.currency, @@ -130,7 +130,10 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ order_type: me.frm.doc.order_type, is_pos: cint(me.frm.doc.is_pos), is_subcontracted: me.frm.doc.is_subcontracted, - transaction_date: me.frm.doc.transaction_date + transaction_date: me.frm.doc.transaction_date, + ignore_pricing_rule: me.frm.doc.ignore_pricing_rule, + doctype: item.doctype, + name: item.name } }, callback: function(r) { @@ -196,7 +199,7 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ } this.frm.script_manager.trigger("currency"); - this.apply_pricing_rule() + this.apply_pricing_rule(); } }, @@ -229,7 +232,12 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ this.frm.set_value("plc_conversion_rate", this.frm.doc.conversion_rate); } if(flt(this.frm.doc.conversion_rate)>0.0) { - this.apply_pricing_rule(); + if(this.frm.doc.ignore_pricing_rule) { + this.calculate_taxes_and_totals(); + } else { + this.apply_pricing_rule(); + } + } }, @@ -283,12 +291,11 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ } if(this.frm.doc.price_list_currency === this.frm.doc.currency) { this.frm.set_value("conversion_rate", this.frm.doc.plc_conversion_rate); - this.apply_pricing_rule(); } }, qty: function(doc, cdt, cdn) { - this.apply_pricing_rule(frappe.get_doc(cdt, cdn)); + this.apply_pricing_rule(frappe.get_doc(cdt, cdn), true); }, // tax rate @@ -331,51 +338,71 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ this.calculate_taxes_and_totals(); }, - apply_pricing_rule: function(item) { + ignore_pricing_rule: function() { + this.apply_pricing_rule(); + }, + + apply_pricing_rule: function(item, calculate_taxes_and_totals) { var me = this; - - var _apply_pricing_rule = function(item) { - return me.frm.call({ - method: "erpnext.stock.get_item_details.apply_pricing_rule", - child: item, - args: { - args: { - item_code: item.item_code, - item_group: item.item_group, - brand: item.brand, - qty: item.qty, - customer: me.frm.doc.customer, - customer_group: me.frm.doc.customer_group, - territory: me.frm.doc.territory, - supplier: me.frm.doc.supplier, - supplier_type: me.frm.doc.supplier_type, - currency: me.frm.doc.currency, - conversion_rate: me.frm.doc.conversion_rate, - price_list: me.frm.doc.selling_price_list || - me.frm.doc.buying_price_list, - plc_conversion_rate: me.frm.doc.plc_conversion_rate, - company: me.frm.doc.company, - transaction_date: me.frm.doc.transaction_date || me.frm.doc.posting_date, - campaign: me.frm.doc.campaign, - sales_partner: me.frm.doc.sales_partner - } - }, - callback: function(r) { - if(!r.exc) { - me.frm.script_manager.trigger("price_list_rate", item.doctype, item.name); - } + var item_list = this._get_item_list(item); + var args = { + "item_list": item_list, + "customer": me.frm.doc.customer, + "customer_group": me.frm.doc.customer_group, + "territory": me.frm.doc.territory, + "supplier": me.frm.doc.supplier, + "supplier_type": me.frm.doc.supplier_type, + "currency": me.frm.doc.currency, + "conversion_rate": me.frm.doc.conversion_rate, + "price_list": me.frm.doc.selling_price_list || me.frm.doc.buying_price_list, + "plc_conversion_rate": me.frm.doc.plc_conversion_rate, + "company": me.frm.doc.company, + "transaction_date": me.frm.doc.transaction_date || me.frm.doc.posting_date, + "campaign": me.frm.doc.campaign, + "sales_partner": me.frm.doc.sales_partner, + "ignore_pricing_rule": me.frm.doc.ignore_pricing_rule, + "parenttype": me.frm.doc.doctype, + "parent": me.frm.doc.name + }; + return this.frm.call({ + method: "erpnext.accounts.doctype.pricing_rule.pricing_rule.apply_pricing_rule", + args: { args: args }, + callback: function(r) { + if (!r.exc) { + $.each(r.message, function(i, d) { + $.each(d, function(k, v) { + if (["doctype", "name"].indexOf(k)===-1) { + frappe.model.set_value(d.doctype, d.name, k, v); + } + }); + }); + if(calculate_taxes_and_totals) me.calculate_taxes_and_totals(); } + } + }); + }, + + _get_item_list: function(item) { + var item_list = []; + var append_item = function(d) { + item_list.push({ + "doctype": d.doctype, + "name": d.name, + "item_code": d.item_code, + "item_group": d.item_group, + "brand": d.brand, + "qty": d.qty }); - } + }; - - if(item) { - _apply_pricing_rule(item); + if (item) { + append_item(item); } else { - $.each(this.get_item_doclist(), function(n, item) { - _apply_pricing_rule(item); + $.each(this.get_item_doclist(), function(i, d) { + append_item(d); }); } + return item_list; }, included_in_print_rate: function(doc, cdt, cdn) { diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 02217386de..1ae0adb363 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -274,6 +274,14 @@ "read_only": 0, "reqd": 1 }, + { + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "label": "Ignore Pricing Rule", + "no_copy": 1, + "permlevel": 1, + "print_hide": 1 + }, { "fieldname": "items", "fieldtype": "Section Break", @@ -818,7 +826,7 @@ "idx": 1, "is_submittable": 1, "max_attachments": 1, - "modified": "2014-05-27 03:49:16.670976", + "modified": "2014-06-19 15:59:30.019826", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", @@ -896,6 +904,12 @@ "role": "Maintenance User", "submit": 1, "write": 1 + }, + { + "permlevel": 1, + "read": 1, + "role": "Sales Manager", + "write": 1 } ], "read_only_onload": 1, diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 62577db247..f396191a2d 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -102,7 +102,7 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False): if customer: target.customer = customer.name target.customer_name = customer.customer_name - + target.ignore_pricing_rule = 1 target.ignore_permissions = ignore_permissions target.run_method("set_missing_values") target.run_method("calculate_taxes_and_totals") diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index c8992271dc..a036370db5 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -285,6 +285,14 @@ "print_hide": 1, "reqd": 1 }, + { + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "label": "Ignore Pricing Rule", + "no_copy": 1, + "permlevel": 1, + "print_hide": 1 + }, { "fieldname": "items", "fieldtype": "Section Break", @@ -874,7 +882,7 @@ "idx": 1, "is_submittable": 1, "issingle": 0, - "modified": "2014-05-27 08:39:19.027965", + "modified": "2014-06-19 16:00:06.626037", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", @@ -953,6 +961,12 @@ "read": 1, "report": 1, "role": "Material User" + }, + { + "permlevel": 1, + "read": 1, + "role": "Sales Manager", + "write": 1 } ], "read_only_onload": 1, diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 24da5773a3..c14612ba34 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -245,9 +245,6 @@ class SalesOrder(SellingController): def get_portal_page(self): return "order" if self.docstatus==1 else None -def set_missing_values(source, target): - target.run_method("set_missing_values") - target.run_method("calculate_taxes_and_totals") @frappe.whitelist() def make_material_request(source_name, target_doc=None): @@ -274,6 +271,11 @@ def make_material_request(source_name, target_doc=None): @frappe.whitelist() def make_delivery_note(source_name, target_doc=None): + def set_missing_values(source, target): + target.ignore_pricing_rule = 1 + target.run_method("set_missing_values") + target.run_method("calculate_taxes_and_totals") + def update_item(source, target, source_parent): target.base_amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.base_rate) target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate) @@ -312,6 +314,7 @@ def make_delivery_note(source_name, target_doc=None): def make_sales_invoice(source_name, target_doc=None): def set_missing_values(source, target): target.is_pos = 0 + target.ignore_pricing_rule = 1 target.run_method("set_missing_values") target.run_method("calculate_taxes_and_totals") diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 9b13b10ec8..690fd055fa 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -275,6 +275,14 @@ "read_only": 0, "reqd": 1 }, + { + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "label": "Ignore Pricing Rule", + "no_copy": 1, + "permlevel": 1, + "print_hide": 1 + }, { "fieldname": "items", "fieldtype": "Section Break", @@ -999,7 +1007,7 @@ "idx": 1, "in_create": 0, "is_submittable": 1, - "modified": "2014-05-27 03:49:09.721622", + "modified": "2014-06-19 16:00:47.326127", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", @@ -1073,6 +1081,12 @@ "read": 1, "report": 1, "role": "Customer" + }, + { + "permlevel": 1, + "read": 1, + "role": "Material Manager", + "write": 1 } ], "read_only_onload": 1, diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index bbc9f81ff4..4b147cc361 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -280,6 +280,7 @@ def make_sales_invoice(source_name, target_doc=None): def update_accounts(source, target): target.is_pos = 0 + target.ignore_pricing_rule = 1 target.run_method("set_missing_values") if len(target.get("entries")) == 0: diff --git a/erpnext/stock/doctype/item/test_item.py b/erpnext/stock/doctype/item/test_item.py index 506e5d016c..7ab93ebf4c 100644 --- a/erpnext/stock/doctype/item/test_item.py +++ b/erpnext/stock/doctype/item/test_item.py @@ -17,7 +17,7 @@ class TestItem(unittest.TestCase): item.is_stock_item = "Yes" item.default_warehouse = None self.assertRaises(WarehouseNotSet, item.insert) - + def test_get_item_details(self): from erpnext.stock.get_item_details import get_item_details to_check = { @@ -41,23 +41,23 @@ class TestItem(unittest.TestCase): "uom": "_Test UOM", "conversion_factor": 1.0, } - + make_test_records("Item Price") - + details = get_item_details({ "item_code": "_Test Item", "company": "_Test Company", "price_list": "_Test Price List", "currency": "_Test Currency", - "doctype": "Sales Order", + "parenttype": "Sales Order", "conversion_rate": 1, "price_list_currency": "_Test Currency", "plc_conversion_rate": 1, "order_type": "Sales", "transaction_type": "selling" }) - + for key, value in to_check.iteritems(): self.assertEquals(value, details.get(key)) -test_records = frappe.get_test_records('Item') \ No newline at end of file +test_records = frappe.get_test_records('Item') diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index e585bef754..ae748ce3fe 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -195,6 +195,14 @@ "permlevel": 0, "print_hide": 1 }, + { + "fieldname": "ignore_pricing_rule", + "fieldtype": "Check", + "label": "Ignore Pricing Rule", + "no_copy": 1, + "permlevel": 1, + "print_hide": 1 + }, { "fieldname": "items", "fieldtype": "Section Break", @@ -754,7 +762,7 @@ "icon": "icon-truck", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:16.302198", + "modified": "2014-06-19 15:58:37.932064", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", @@ -821,6 +829,12 @@ "read": 1, "report": 1, "role": "Supplier" + }, + { + "permlevel": 1, + "read": 1, + "role": "Material Manager", + "write": 1 } ], "read_only_onload": 1, diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 13bb193f4b..71c07eba02 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -287,6 +287,7 @@ def make_purchase_invoice(source_name, target_doc=None): frappe.throw(_("All items have already been invoiced")) doc = frappe.get_doc(target) + doc.ignore_pricing_rule = 1 doc.run_method("set_missing_values") doc.run_method("calculate_taxes_and_totals") diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index c5c1280fdb..fe320d153a 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -6,8 +6,7 @@ import frappe from frappe import _, throw from frappe.utils import flt, cint, add_days import json - -class MultiplePricingRuleConflict(frappe.ValidationError): pass +from erpnext.accounts.doctype.pricing_rule.pricing_rule import get_pricing_rule_for_item @frappe.whitelist() def get_item_details(args): @@ -20,14 +19,15 @@ def get_item_details(args): "selling_price_list": None, "price_list_currency": None, "plc_conversion_rate": 1.0, - "doctype": "", - "docname": "", + "parenttype": "", + "parent": "", "supplier": None, "transaction_date": None, "conversion_rate": 1.0, "buying_price_list": None, "is_subcontracted": "Yes" / "No", - "transaction_type": "selling" + "transaction_type": "selling", + "ignore_pricing_rule": 0/1 } """ @@ -37,7 +37,8 @@ def get_item_details(args): args = frappe._dict(args) if not args.get("transaction_type"): - if args.get("doctype")=="Material Request" or frappe.get_meta(args.get("doctype")).get_field("supplier"): + if args.get("parenttype")=="Material Request" or \ + frappe.get_meta(args.get("parenttype")).get_field("supplier"): args.transaction_type = "buying" else: args.transaction_type = "selling" @@ -73,9 +74,9 @@ def get_item_details(args): if args.get(key) is None: args[key] = value - out.update(apply_pricing_rule(args)) + out.update(get_pricing_rule_for_item(args)) - if args.get("doctype") in ("Sales Invoice", "Delivery Note"): + if args.get("parenttype") in ("Sales Invoice", "Delivery Note"): if item_doc.has_serial_no == "Yes" and not args.serial_no: out.serial_no = get_serial_nos_by_fifo(args, item_doc) @@ -113,7 +114,7 @@ def validate_item_details(args, item): elif item.is_sales_item != "Yes": throw(_("Item {0} must be a Sales Item").format(item.name)) - elif args.transaction_type == "buying" and args.doctype != "Material Request": + elif args.transaction_type == "buying" and args.parenttype != "Material Request": # validate if purchase item or subcontracted item if item.is_purchase_item != "Yes": throw(_("Item {0} must be a Purchase Item").format(item.name)) @@ -144,7 +145,7 @@ def get_basic_details(args, item_doc): "item_tax_rate": json.dumps(dict(([d.tax_type, d.tax_rate] for d in item_doc.get("item_tax")))), "uom": item.stock_uom, - "min_order_qty": flt(item.min_order_qty) if args.doctype == "Material Request" else "", + "min_order_qty": flt(item.min_order_qty) if args.parenttype == "Material Request" else "", "conversion_factor": 1.0, "qty": 1.0, "price_list_rate": 0.0, @@ -162,7 +163,7 @@ def get_basic_details(args, item_doc): return out def get_price_list_rate(args, item_doc, out): - meta = frappe.get_meta(args.doctype) + meta = frappe.get_meta(args.parenttype) if meta.get_field("currency"): validate_price_list(args) @@ -179,7 +180,7 @@ def get_price_list_rate(args, item_doc, out): if not out.price_list_rate and args.transaction_type == "buying": from erpnext.stock.doctype.item.item import get_last_purchase_details out.update(get_last_purchase_details(item_doc.name, - args.docname, args.conversion_rate)) + args.parent, args.conversion_rate)) def validate_price_list(args): if args.get("price_list"): @@ -248,142 +249,6 @@ def get_pos_settings(company): return pos_settings and pos_settings[0] or None -@frappe.whitelist() -def apply_pricing_rule(args): - if isinstance(args, basestring): - args = json.loads(args) - - args = frappe._dict(args) - out = frappe._dict() - if args.get("doctype") == "Material Request" or not args.get("item_code"): return out - - if not args.get("item_group") or not args.get("brand"): - args.item_group, args.brand = frappe.db.get_value("Item", - args.item_code, ["item_group", "brand"]) - - if args.get("customer") and (not args.get("customer_group") or not args.get("territory")): - args.customer_group, args.territory = frappe.db.get_value("Customer", - args.customer, ["customer_group", "territory"]) - - if args.get("supplier") and not args.get("supplier_type"): - args.supplier_type = frappe.db.get_value("Supplier", args.supplier, "supplier_type") - - pricing_rules = get_pricing_rules(args) - - pricing_rule = filter_pricing_rules(args, pricing_rules) - - if pricing_rule: - out.pricing_rule = pricing_rule.name - if pricing_rule.price_or_discount == "Price": - out.base_price_list_rate = pricing_rule.price - out.price_list_rate = pricing_rule.price*flt(args.plc_conversion_rate)/flt(args.conversion_rate) - out.base_rate = out.base_price_list_rate - out.rate = out.price_list_rate - out.discount_percentage = 0.0 - else: - out.discount_percentage = pricing_rule.discount_percentage - else: - out.pricing_rule = None - - return out - - -def get_pricing_rules(args): - def _get_tree_conditions(doctype, allow_blank=True): - field = frappe.scrub(doctype) - condition = "" - if args.get(field): - lft, rgt = frappe.db.get_value(doctype, args[field], ["lft", "rgt"]) - parent_groups = frappe.db.sql_list("""select name from `tab%s` - where lft<=%s and rgt>=%s""" % (doctype, '%s', '%s'), (lft, rgt)) - - if parent_groups: - if allow_blank: parent_groups.append('') - condition = " ifnull("+field+", '') in ('" + "', '".join(parent_groups)+"')" - - return condition - - - conditions = "" - for field in ["company", "customer", "supplier", "supplier_type", "campaign", "sales_partner"]: - if args.get(field): - conditions += " and ifnull("+field+", '') in (%("+field+")s, '')" - else: - conditions += " and ifnull("+field+", '') = ''" - - for doctype in ["Customer Group", "Territory"]: - group_condition = _get_tree_conditions(doctype) - if group_condition: - conditions += " and " + group_condition - - conditions += " and ifnull(for_price_list, '') in (%(price_list)s, '')" - - if args.get("transaction_date"): - conditions += """ and %(transaction_date)s between ifnull(valid_from, '2000-01-01') - and ifnull(valid_upto, '2500-12-31')""" - - return frappe.db.sql("""select * from `tabPricing Rule` - where (item_code=%(item_code)s or {item_group_condition} or brand=%(brand)s) - and docstatus < 2 and ifnull(disable, 0) = 0 {conditions} - order by priority desc, name desc""".format( - item_group_condition=_get_tree_conditions("Item Group", False), conditions=conditions), - args, as_dict=1) - -def filter_pricing_rules(args, pricing_rules): - # filter for qty - if pricing_rules and args.get("qty"): - pricing_rules = filter(lambda x: (args.qty>=flt(x.min_qty) - and (args.qty<=x.max_qty if x.max_qty else True)), pricing_rules) - - # find pricing rule with highest priority - if pricing_rules: - max_priority = max([cint(p.priority) for p in pricing_rules]) - if max_priority: - pricing_rules = filter(lambda x: cint(x.priority)==max_priority, pricing_rules) - - # apply internal priority - all_fields = ["item_code", "item_group", "brand", "customer", "customer_group", "territory", - "supplier", "supplier_type", "campaign", "sales_partner"] - - if len(pricing_rules) > 1: - for field_set in [["item_code", "item_group", "brand"], - ["customer", "customer_group", "territory"], ["supplier", "supplier_type"]]: - remaining_fields = list(set(all_fields) - set(field_set)) - if if_all_rules_same(pricing_rules, remaining_fields): - pricing_rules = apply_internal_priority(pricing_rules, field_set, args) - break - - if len(pricing_rules) > 1: - price_or_discount = list(set([d.price_or_discount for d in pricing_rules])) - if len(price_or_discount) == 1 and price_or_discount[0] == "Discount Percentage": - pricing_rules = filter(lambda x: x.for_price_list==args.price_list, pricing_rules) \ - or pricing_rules - - if len(pricing_rules) > 1: - frappe.throw(_("Multiple Price Rule exists with same criteria, please resolve \ - conflict by assigning priority. Price Rules: {0}") - .format("\n".join([d.name for d in pricing_rules])), MultiplePricingRuleConflict) - elif pricing_rules: - return pricing_rules[0] - -def if_all_rules_same(pricing_rules, fields): - all_rules_same = True - val = [pricing_rules[0][k] for k in fields] - for p in pricing_rules[1:]: - if val != [p[k] for k in fields]: - all_rules_same = False - break - - return all_rules_same - -def apply_internal_priority(pricing_rules, field_set, args): - filtered_rules = [] - for field in field_set: - if args.get(field): - filtered_rules = filter(lambda x: x[field]==args[field], pricing_rules) - if filtered_rules: break - - return filtered_rules or pricing_rules def get_serial_nos_by_fifo(args, item_doc): return "\n".join(frappe.db.sql_list("""select name from `tabSerial No` From 4f6e31eb0882c5e81adc0f678319b9dcccf83b96 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 20 Jun 2014 16:19:55 +0530 Subject: [PATCH 33/57] validate pricing rule discount with item max discount --- erpnext/accounts/doctype/pricing_rule/pricing_rule.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index 5cf500a597..c86e3f61e5 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -19,6 +19,7 @@ class PricingRule(Document): self.validate_min_max_qty() self.cleanup_fields_value() self.validate_price_or_discount() + self.validate_max_discount() def validate_mandatory(self): for field in ["apply_on", "applicable_for"]: @@ -61,6 +62,13 @@ class PricingRule(Document): if flt(self.get(frappe.scrub(field))) < 0: throw(_("{0} can not be negative").format(field)) + def validate_max_discount(self): + if self.price_or_discount == "Discount Percentage" and self.item_code: + max_discount = frappe.db.get_value("Item", self.item_code, "max_discount") + if flt(self.discount_percentage) > max_discount: + throw(_("Max discount allowed for item: {0} is {1}%".format(self.item_code, max_discount))) + + #-------------------------------------------------------------------------------- @frappe.whitelist() From afffd656f6fab9f8119a1ad114f972f46e0b7d3e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 20 Jun 2014 16:30:44 +0530 Subject: [PATCH 34/57] Reload pricing rule in patch --- erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py b/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py index 218029d8ae..8be846ff16 100644 --- a/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py +++ b/erpnext/patches/v4_0/set_pricing_rule_for_buying_or_selling.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe def execute(): + frappe.reload_doc("accounts", "doctype", "pricing_rule") frappe.db.sql("""update `tabPricing Rule` set selling=1 where ifnull(applicable_for, '') in ('', 'Customer', 'Customer Group', 'Territory', 'Sales Partner', 'Campaign')""") From 1b1b3a8fd65d7280399e30aa82ed29809379ef32 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 20 Jun 2014 19:07:44 +0530 Subject: [PATCH 35/57] validate pricing rule discount with item max discount --- erpnext/accounts/doctype/pricing_rule/pricing_rule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index c86e3f61e5..77b52b18f8 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -65,7 +65,7 @@ class PricingRule(Document): def validate_max_discount(self): if self.price_or_discount == "Discount Percentage" and self.item_code: max_discount = frappe.db.get_value("Item", self.item_code, "max_discount") - if flt(self.discount_percentage) > max_discount: + if max_discount and flt(self.discount_percentage) > flt(max_discount): throw(_("Max discount allowed for item: {0} is {1}%".format(self.item_code, max_discount))) From 80142af9b8c1d6ea241d1155ddb3ca80a0fad5ba Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 20 Jun 2014 19:37:53 +0530 Subject: [PATCH 36/57] Minor fixes --- .../doctype/pricing_rule/pricing_rule.json | 19 +++++++++---------- .../doctype/pricing_rule/pricing_rule.py | 13 +++++++------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json index e15cea83b8..2d318c6360 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.json +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.json @@ -126,18 +126,18 @@ "options": "Supplier Type", "permlevel": 0 }, - { - "fieldname": "max_qty", - "fieldtype": "Float", - "label": "Max Qty", - "permlevel": 0 - }, { "fieldname": "min_qty", "fieldtype": "Float", "label": "Min Qty", "permlevel": 0 }, + { + "fieldname": "max_qty", + "fieldtype": "Float", + "label": "Max Qty", + "permlevel": 0 + }, { "fieldname": "col_break1", "fieldtype": "Column Break", @@ -235,7 +235,7 @@ "icon": "icon-gift", "idx": 1, "istable": 0, - "modified": "2014-06-19 15:00:09.962572", + "modified": "2014-06-20 19:36:22.502381", "modified_by": "Administrator", "module": "Accounts", "name": "Pricing Rule", @@ -244,8 +244,8 @@ { "create": 1, "delete": 1, - "export": 0, - "import": 0, + "export": 1, + "import": 1, "permlevel": 0, "read": 1, "report": 1, @@ -290,7 +290,6 @@ "permlevel": 0, "read": 1, "report": 1, - "restrict": 1, "role": "System Manager", "write": 1 } diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index 77b52b18f8..967d583aab 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -66,7 +66,7 @@ class PricingRule(Document): if self.price_or_discount == "Discount Percentage" and self.item_code: max_discount = frappe.db.get_value("Item", self.item_code, "max_discount") if max_discount and flt(self.discount_percentage) > flt(max_discount): - throw(_("Max discount allowed for item: {0} is {1}%".format(self.item_code, max_discount))) + throw(_("Max discount allowed for item: {0} is {1}%").format(self.item_code, max_discount)) #-------------------------------------------------------------------------------- @@ -141,7 +141,8 @@ def get_pricing_rule_for_item(args): item_details.pricing_rule = pricing_rule.name if pricing_rule.price_or_discount == "Price": item_details.update({ - "price_list_rate": pricing_rule.price*flt(args.plc_conversion_rate)/flt(args.conversion_rate), + "price_list_rate": pricing_rule.price/flt(args.conversion_rate) \ + if args.conversion_rate else 0.0, "discount_percentage": 0.0 }) else: @@ -167,10 +168,10 @@ def get_pricing_rules(args): conditions = "" for field in ["company", "customer", "supplier", "supplier_type", "campaign", "sales_partner"]: - if args.get(field): - conditions += " and ifnull("+field+", '') in (%("+field+")s, '')" - else: - conditions += " and ifnull("+field+", '') = ''" + if args.get(field): + conditions += " and ifnull("+field+", '') in (%("+field+")s, '')" + else: + conditions += " and ifnull("+field+", '') = ''" for parenttype in ["Customer Group", "Territory"]: group_condition = _get_tree_conditions(parenttype) From d709f4dfddf0b7e638a86227f1c265f5e8fb4b5d Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 20 Jun 2014 20:19:51 +0530 Subject: [PATCH 37/57] Naming Series property type as Text --- 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 100c8ba1cf..cb0d43780f 100644 --- a/erpnext/setup/doctype/naming_series/naming_series.py +++ b/erpnext/setup/doctype/naming_series/naming_series.py @@ -72,7 +72,7 @@ class NamingSeries(Document): 'field_name': 'naming_series', 'property': prop, 'value': prop_dict[prop], - 'property_type': 'Select', + 'property_type': 'Text', '__islocal': 1 }) ps.save() From 32303daf639daccc863ff9e637a7213d13b649dd Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 19 Jun 2014 14:43:54 +0530 Subject: [PATCH 38/57] fixes to bom.js --- erpnext/manufacturing/doctype/bom/bom.js | 41 ++++++++++++------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js index 1cee6b9103..ef4f399bdc 100644 --- a/erpnext/manufacturing/doctype/bom/bom.js +++ b/erpnext/manufacturing/doctype/bom/bom.js @@ -2,6 +2,7 @@ // License: GNU General Public License v3. See license.txt // On REFRESH +frappe.provide("erpnext.bom"); cur_frm.cscript.refresh = function(doc,dt,dn){ cur_frm.toggle_enable("item", doc.__islocal); @@ -10,7 +11,7 @@ cur_frm.cscript.refresh = function(doc,dt,dn){ } cur_frm.cscript.with_operations(doc); - set_operation_no(doc); + erpnext.bom.set_operation_no(doc); } cur_frm.cscript.update_cost = function() { @@ -30,10 +31,10 @@ cur_frm.cscript.with_operations = function(doc) { cur_frm.cscript.operation_no = function(doc, cdt, cdn) { var child = locals[cdt][cdn]; - if(child.parentfield=="bom_operations") set_operation_no(doc); + if(child.parentfield=="bom_operations") erpnext.bom.set_operation_no(doc); } -var set_operation_no = function(doc) { +erpnext.bom.set_operation_no = function(doc) { var op_table = doc.bom_operations || []; var operations = []; @@ -53,7 +54,7 @@ var set_operation_no = function(doc) { } cur_frm.fields_dict["bom_operations"].grid.on_row_delete = function(cdt, cdn){ - set_operation_no(doc); + erpnext.bom.set_operation_no(doc); } cur_frm.add_fetch("item", "description", "description"); @@ -64,15 +65,15 @@ cur_frm.cscript.workstation = function(doc,dt,dn) { frappe.model.with_doc("Workstation", d.workstation, function(i, r) { d.hour_rate = r.docs[0].hour_rate; refresh_field("hour_rate", dn, "bom_operations"); - calculate_op_cost(doc); - calculate_total(doc); + erpnext.bom.calculate_op_cost(doc); + erpnext.bom.calculate_total(doc); }); } cur_frm.cscript.hour_rate = function(doc, dt, dn) { - calculate_op_cost(doc); - calculate_total(doc); + erpnext.bom.calculate_op_cost(doc); + erpnext.bom.calculate_total(doc); } @@ -106,8 +107,8 @@ var get_bom_material_detail= function(doc, cdt, cdn) { $.extend(d, r.message); refresh_field("bom_materials"); doc = locals[doc.doctype][doc.name]; - calculate_rm_cost(doc); - calculate_total(doc); + erpnext.bom.calculate_rm_cost(doc); + erpnext.bom.calculate_total(doc); }, freeze: true }); @@ -116,8 +117,8 @@ var get_bom_material_detail= function(doc, cdt, cdn) { cur_frm.cscript.qty = function(doc, cdt, cdn) { - calculate_rm_cost(doc); - calculate_total(doc); + erpnext.bom.calculate_rm_cost(doc); + erpnext.bom.calculate_total(doc); } cur_frm.cscript.rate = function(doc, cdt, cdn) { @@ -126,12 +127,12 @@ cur_frm.cscript.rate = function(doc, cdt, cdn) { msgprint(__("You can not change rate if BOM mentioned agianst any item")); get_bom_material_detail(doc, cdt, cdn); } else { - calculate_rm_cost(doc); - calculate_total(doc); + erpnext.bom.calculate_rm_cost(doc); + erpnext.bom.calculate_total(doc); } } -var calculate_op_cost = function(doc) { +erpnext.bom.calculate_op_cost = function(doc) { var op = doc.bom_operations || []; total_op_cost = 0; for(var i=0;i Date: Mon, 23 Jun 2014 12:20:12 +0530 Subject: [PATCH 39/57] fix end of life query for item --- erpnext/controllers/queries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 789e7a331a..0f1d5f6dab 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -141,7 +141,7 @@ def item_query(doctype, txt, searchfield, start, page_len, filters): concat(substr(tabItem.description, 1, 40), "..."), description) as decription from tabItem where tabItem.docstatus < 2 - and (tabItem.end_of_life is null or tabItem.end_of_life > %(today)s) + and (tabItem.end_of_life > %(today)s or ifnull(tabItem.end_of_life, '0000-00-00')='0000-00-00') and (tabItem.`{key}` LIKE %(txt)s or tabItem.item_name LIKE %(txt)s) {fcond} {mcond} From 838aeb149f4a175bece2330296328a3223a966fc Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 23 Jun 2014 10:03:23 +0530 Subject: [PATCH 40/57] minor fix in sales invoice --- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 6 +++--- erpnext/selling/doctype/sms_center/sms_center.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 0d8eb50f03..0f11af42c9 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -263,10 +263,10 @@ class SalesInvoice(SellingController): for d in self.get('entries'): item = frappe.db.sql("""select name,is_asset_item,is_sales_item from `tabItem` where name = %s and (ifnull(end_of_life,'')='' or end_of_life > now())""", d.item_code) - acc = frappe.db.sql("""select account_type from `tabAccount` + acc = frappe.db.sql("""select account_type from `tabAccount` where name = %s and docstatus != 2""", d.income_account) - if item and item[0][1] == 'Yes' and not acc[0][0] == 'Fixed Asset': - msgprint(_("Account {0} must be of type 'Fixed Asset' as Item {1} is an Asset Item").format(d.item_code), raise_exception=True) + if item and item[0][1] == 'Yes' and acc and acc[0][0] != 'Fixed Asset': + msgprint(_("Account {0} must be of type 'Fixed Asset' as Item {1} is an Asset Item").format(acc[0][0], d.item_code), raise_exception=True) def validate_with_previous_doc(self): super(SalesInvoice, self).validate_with_previous_doc(self.tname, { diff --git a/erpnext/selling/doctype/sms_center/sms_center.py b/erpnext/selling/doctype/sms_center/sms_center.py index 81939546bf..8c4cad3207 100644 --- a/erpnext/selling/doctype/sms_center/sms_center.py +++ b/erpnext/selling/doctype/sms_center/sms_center.py @@ -12,7 +12,6 @@ from frappe.model.document import Document from erpnext.setup.doctype.sms_settings.sms_settings import send_sms class SMSCenter(Document): - def create_receiver_list(self): rec, where_clause = '', '' if self.send_to == 'All Customer Contact': @@ -71,6 +70,7 @@ class SMSCenter(Document): return receiver_nos def send_sms(self): + receiver_list = [] if not self.message: msgprint(_("Please enter message before sending")) else: From 43616619ecfd1fa3c6390f45d87f392fc65d563d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 23 Jun 2014 15:36:06 +0530 Subject: [PATCH 41/57] Set status button in serial no --- erpnext/stock/doctype/serial_no/serial_no.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext/stock/doctype/serial_no/serial_no.js b/erpnext/stock/doctype/serial_no/serial_no.js index bb131f35c1..f7c484b5f3 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.js +++ b/erpnext/stock/doctype/serial_no/serial_no.js @@ -17,4 +17,12 @@ cur_frm.cscript.onload = function() { frappe.ui.form.on("Serial No", "refresh", function(frm) { frm.toggle_enable("item_code", frm.doc.__islocal); + + if(frm.doc.status == "Sales Returned" && frm.doc.warehouse) + cur_frm.add_custom_button(__('Set Status as Available'), cur_frm.cscript.set_status_as_available); }); + +cur_frm.cscript.set_status_as_available = function() { + cur_frm.set_value("status", "Available"); + cur_frm.save() +} From 061c9744af7b6664ab12a2793e3ecc740c257c81 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 23 Jun 2014 15:51:03 +0530 Subject: [PATCH 42/57] Set status button in serial no --- erpnext/stock/doctype/serial_no/serial_no.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/erpnext/stock/doctype/serial_no/serial_no.js b/erpnext/stock/doctype/serial_no/serial_no.js index f7c484b5f3..dce9d4569c 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.js +++ b/erpnext/stock/doctype/serial_no/serial_no.js @@ -19,10 +19,8 @@ frappe.ui.form.on("Serial No", "refresh", function(frm) { frm.toggle_enable("item_code", frm.doc.__islocal); if(frm.doc.status == "Sales Returned" && frm.doc.warehouse) - cur_frm.add_custom_button(__('Set Status as Available'), cur_frm.cscript.set_status_as_available); + cur_frm.add_custom_button(__('Set Status as Available'), function() { + cur_frm.set_value("status", "Available"); + cur_frm.save(); + }); }); - -cur_frm.cscript.set_status_as_available = function() { - cur_frm.set_value("status", "Available"); - cur_frm.save() -} From b569930b2af185b98be41b94840c2395fd5b24af Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 23 Jun 2014 16:42:11 +0530 Subject: [PATCH 43/57] Made warehouse and selling pricing list non-mandatory in pos setting --- erpnext/accounts/doctype/pos_setting/pos_setting.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/pos_setting/pos_setting.json b/erpnext/accounts/doctype/pos_setting/pos_setting.json index 27d79f31df..d0a338c92a 100755 --- a/erpnext/accounts/doctype/pos_setting/pos_setting.json +++ b/erpnext/accounts/doctype/pos_setting/pos_setting.json @@ -62,7 +62,7 @@ "options": "Price List", "permlevel": 0, "read_only": 0, - "reqd": 1 + "reqd": 0 }, { "fieldname": "company", @@ -147,7 +147,7 @@ "options": "Warehouse", "permlevel": 0, "read_only": 0, - "reqd": 1 + "reqd": 0 }, { "fieldname": "cost_center", @@ -205,7 +205,7 @@ ], "icon": "icon-cog", "idx": 1, - "modified": "2014-05-27 03:49:14.735138", + "modified": "2014-06-23 16:40:59.510132", "modified_by": "Administrator", "module": "Accounts", "name": "POS Setting", From 8b2dfcff29fb5305015389405981f5dc5501d018 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 23 Jun 2014 18:04:07 +0530 Subject: [PATCH 44/57] Naming Series Property Setter Patch --- .../accounts/doctype/gl_entry/gl_entry.json | 367 ++++++++-------- .../period_closing_voucher.json | 5 +- .../purchase_order/purchase_order.json | 5 +- .../quality_inspection.json | 5 +- .../supplier_quotation.json | 5 +- erpnext/hr/doctype/appraisal/appraisal.json | 5 +- .../doctype/expense_claim/expense_claim.json | 5 +- .../leave_allocation/leave_allocation.json | 5 +- .../hr/doctype/salary_slip/salary_slip.json | 5 +- .../production_order/production_order.json | 405 +++++++++--------- erpnext/patches.txt | 1 + erpnext/patches/repair_tools/__init__.py | 0 ...ix_naming_series_records_lost_by_reload.py | 204 +++++++++ .../v4_0/set_naming_series_property_setter.py | 98 +++++ .../installation_note/installation_note.json | 5 +- .../doctype/opportunity/opportunity.json | 5 +- .../selling/doctype/quotation/quotation.json | 5 +- .../doctype/sales_order/sales_order.json | 5 +- .../doctype/delivery_note/delivery_note.json | 5 +- .../material_request/material_request.json | 5 +- .../purchase_receipt/purchase_receipt.json | 4 +- .../stock_ledger_entry.json | 8 +- .../customer_issue/customer_issue.json | 5 +- .../maintenance_visit/maintenance_visit.json | 5 +- 24 files changed, 746 insertions(+), 421 deletions(-) create mode 100644 erpnext/patches/repair_tools/__init__.py create mode 100644 erpnext/patches/repair_tools/fix_naming_series_records_lost_by_reload.py create mode 100644 erpnext/patches/v4_0/set_naming_series_property_setter.py diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json index ce17278d82..07578e2761 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.json +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -1,226 +1,229 @@ { - "autoname": "GL.#######", - "creation": "2013-01-10 16:34:06", - "docstatus": 0, - "doctype": "DocType", + "autoname": "GL.#######", + "creation": "2013-01-10 16:34:06", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "posting_date", - "fieldtype": "Date", - "in_filter": 1, - "in_list_view": 1, - "label": "Posting Date", - "oldfieldname": "posting_date", - "oldfieldtype": "Date", - "permlevel": 0, + "fieldname": "posting_date", + "fieldtype": "Date", + "in_filter": 1, + "in_list_view": 1, + "label": "Posting Date", + "oldfieldname": "posting_date", + "oldfieldtype": "Date", + "permlevel": 0, "search_index": 1 - }, + }, { - "fieldname": "transaction_date", - "fieldtype": "Date", - "in_list_view": 1, - "label": "Transaction Date", - "oldfieldname": "transaction_date", - "oldfieldtype": "Date", + "fieldname": "transaction_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Transaction Date", + "oldfieldname": "transaction_date", + "oldfieldtype": "Date", "permlevel": 0 - }, + }, { - "fieldname": "aging_date", - "fieldtype": "Date", - "in_filter": 1, - "in_list_view": 1, - "label": "Aging Date", - "oldfieldname": "aging_date", - "oldfieldtype": "Date", - "permlevel": 0, + "fieldname": "aging_date", + "fieldtype": "Date", + "in_filter": 1, + "in_list_view": 1, + "label": "Aging Date", + "oldfieldname": "aging_date", + "oldfieldtype": "Date", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "account", - "fieldtype": "Link", - "in_filter": 1, - "in_list_view": 1, - "label": "Account", - "oldfieldname": "account", - "oldfieldtype": "Link", - "options": "Account", - "permlevel": 0, + "fieldname": "account", + "fieldtype": "Link", + "in_filter": 1, + "in_list_view": 1, + "label": "Account", + "oldfieldname": "account", + "oldfieldtype": "Link", + "options": "Account", + "permlevel": 0, "search_index": 1 - }, + }, { - "fieldname": "cost_center", - "fieldtype": "Link", - "in_filter": 1, - "in_list_view": 1, - "label": "Cost Center", - "oldfieldname": "cost_center", - "oldfieldtype": "Link", - "options": "Cost Center", - "permlevel": 0, + "fieldname": "cost_center", + "fieldtype": "Link", + "in_filter": 1, + "in_list_view": 1, + "label": "Cost Center", + "oldfieldname": "cost_center", + "oldfieldtype": "Link", + "options": "Cost Center", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "debit", - "fieldtype": "Currency", - "label": "Debit Amt", - "oldfieldname": "debit", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "fieldname": "debit", + "fieldtype": "Currency", + "label": "Debit Amt", + "oldfieldname": "debit", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", "permlevel": 0 - }, + }, { - "fieldname": "credit", - "fieldtype": "Currency", - "label": "Credit Amt", - "oldfieldname": "credit", - "oldfieldtype": "Currency", - "options": "Company:company:default_currency", + "fieldname": "credit", + "fieldtype": "Currency", + "label": "Credit Amt", + "oldfieldname": "credit", + "oldfieldtype": "Currency", + "options": "Company:company:default_currency", "permlevel": 0 - }, + }, { - "fieldname": "against", - "fieldtype": "Text", - "in_filter": 1, - "label": "Against", - "oldfieldname": "against", - "oldfieldtype": "Text", + "fieldname": "against", + "fieldtype": "Text", + "in_filter": 1, + "label": "Against", + "oldfieldname": "against", + "oldfieldtype": "Text", "permlevel": 0 - }, + }, { - "fieldname": "against_voucher", - "fieldtype": "Data", - "in_filter": 1, - "label": "Against Voucher", - "oldfieldname": "against_voucher", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "against_voucher_type", + "fieldtype": "Link", + "in_filter": 0, + "label": "Against Voucher Type", + "oldfieldname": "against_voucher_type", + "oldfieldtype": "Data", + "options": "DocType", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "against_voucher_type", - "fieldtype": "Data", - "in_filter": 0, - "label": "Against Voucher Type", - "oldfieldname": "against_voucher_type", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "against_voucher", + "fieldtype": "Dynamic Link", + "in_filter": 1, + "label": "Against Voucher", + "oldfieldname": "against_voucher", + "oldfieldtype": "Data", + "options": "against_voucher_type", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "voucher_type", - "fieldtype": "Select", - "in_filter": 1, - "label": "Voucher Type", - "oldfieldname": "voucher_type", - "oldfieldtype": "Select", - "options": "Journal Voucher\nSales Invoice\nPurchase Invoice\nPeriod Closing Voucher\nPurchase Receipt\nDelivery Note\nStock Entry\nStock Reconciliation", - "permlevel": 0, + "fieldname": "voucher_type", + "fieldtype": "Link", + "in_filter": 1, + "label": "Voucher Type", + "oldfieldname": "voucher_type", + "oldfieldtype": "Select", + "options": "DocType", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "voucher_no", - "fieldtype": "Data", - "in_filter": 1, - "label": "Voucher No", - "oldfieldname": "voucher_no", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "voucher_no", + "fieldtype": "Dynamic Link", + "in_filter": 1, + "label": "Voucher No", + "oldfieldname": "voucher_no", + "oldfieldtype": "Data", + "options": "voucher_type", + "permlevel": 0, "search_index": 1 - }, + }, { - "fieldname": "remarks", - "fieldtype": "Text", - "in_filter": 1, - "label": "Remarks", - "no_copy": 1, - "oldfieldname": "remarks", - "oldfieldtype": "Text", - "permlevel": 0, + "fieldname": "remarks", + "fieldtype": "Text", + "in_filter": 1, + "label": "Remarks", + "no_copy": 1, + "oldfieldname": "remarks", + "oldfieldtype": "Text", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "is_opening", - "fieldtype": "Select", - "in_filter": 1, - "label": "Is Opening", - "oldfieldname": "is_opening", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, + "fieldname": "is_opening", + "fieldtype": "Select", + "in_filter": 1, + "label": "Is Opening", + "oldfieldname": "is_opening", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "is_advance", - "fieldtype": "Select", - "in_filter": 0, - "label": "Is Advance", - "oldfieldname": "is_advance", - "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, + "fieldname": "is_advance", + "fieldtype": "Select", + "in_filter": 0, + "label": "Is Advance", + "oldfieldname": "is_advance", + "oldfieldtype": "Select", + "options": "No\nYes", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "fiscal_year", - "fieldtype": "Link", - "in_filter": 1, - "label": "Fiscal Year", - "oldfieldname": "fiscal_year", - "oldfieldtype": "Select", - "options": "Fiscal Year", - "permlevel": 0, + "fieldname": "fiscal_year", + "fieldtype": "Link", + "in_filter": 1, + "label": "Fiscal Year", + "oldfieldname": "fiscal_year", + "oldfieldtype": "Select", + "options": "Fiscal Year", + "permlevel": 0, "search_index": 0 - }, + }, { - "fieldname": "company", - "fieldtype": "Link", - "in_filter": 1, - "label": "Company", - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, + "fieldname": "company", + "fieldtype": "Link", + "in_filter": 1, + "label": "Company", + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, "search_index": 0 } - ], - "icon": "icon-list", - "idx": 1, - "in_create": 1, - "modified": "2014-06-19 01:51:29.340077", - "modified_by": "Administrator", - "module": "Accounts", - "name": "GL Entry", - "owner": "Administrator", + ], + "icon": "icon-list", + "idx": 1, + "in_create": 1, + "modified": "2014-06-23 08:07:30.678730", + "modified_by": "Administrator", + "module": "Accounts", + "name": "GL Entry", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 1, - "create": 0, - "email": 1, - "export": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "submit": 0, + "amend": 0, + "apply_user_permissions": 1, + "create": 0, + "email": 1, + "export": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User", + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "create": 0, - "email": 1, - "export": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "submit": 0, + "amend": 0, + "create": 0, + "email": 1, + "export": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "submit": 0, "write": 0 } - ], - "search_fields": "voucher_no,account,posting_date,against_voucher", - "sort_field": "modified", + ], + "search_fields": "voucher_no,account,posting_date,against_voucher", + "sort_field": "modified", "sort_order": "DESC" -} +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json index e1aa66ff11..c9e7dc2c3d 100644 --- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json +++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.json @@ -43,13 +43,14 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "in_list_view": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Period Closing Voucher", "permlevel": 0, "read_only": 1 }, @@ -101,7 +102,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-05-26 03:05:50.722547", + "modified": "2014-06-23 07:55:49.946225", "modified_by": "Administrator", "module": "Accounts", "name": "Period Closing Voucher", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 794c0415bd..14693c434f 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -104,13 +104,14 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Purchase Order", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -644,7 +645,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-06-19 15:58:06.375217", + "modified": "2014-06-23 07:55:50.372486", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/doctype/quality_inspection/quality_inspection.json b/erpnext/buying/doctype/quality_inspection/quality_inspection.json index 4da6e63f36..3e05b319b6 100644 --- a/erpnext/buying/doctype/quality_inspection/quality_inspection.json +++ b/erpnext/buying/doctype/quality_inspection/quality_inspection.json @@ -168,12 +168,13 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Quality Inspection", "permlevel": 0, "print_hide": 1, "read_only": 1 @@ -206,7 +207,7 @@ "icon": "icon-search", "idx": 1, "is_submittable": 1, - "modified": "2014-05-26 03:05:52.140251", + "modified": "2014-06-23 07:55:51.183113", "modified_by": "Administrator", "module": "Buying", "name": "Quality Inspection", diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index c3c5bf4f39..955aa6857c 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -104,13 +104,14 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 1, "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Supplier Quotation", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -570,7 +571,7 @@ "icon": "icon-shopping-cart", "idx": 1, "is_submittable": 1, - "modified": "2014-06-19 15:54:27.919675", + "modified": "2014-06-23 07:55:52.993616", "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation", diff --git a/erpnext/hr/doctype/appraisal/appraisal.json b/erpnext/hr/doctype/appraisal/appraisal.json index 2fec94f1e0..beddeefdd9 100644 --- a/erpnext/hr/doctype/appraisal/appraisal.json +++ b/erpnext/hr/doctype/appraisal/appraisal.json @@ -179,13 +179,14 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 1, "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Appraisal", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -196,7 +197,7 @@ "icon": "icon-thumbs-up", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:07.393120", + "modified": "2014-06-23 07:55:40.801381", "modified_by": "Administrator", "module": "HR", "name": "Appraisal", diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.json b/erpnext/hr/doctype/expense_claim/expense_claim.json index 4ebc30f362..c13710af3f 100644 --- a/erpnext/hr/doctype/expense_claim/expense_claim.json +++ b/erpnext/hr/doctype/expense_claim/expense_claim.json @@ -171,12 +171,13 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Expense Claim", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -187,7 +188,7 @@ "icon": "icon-money", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:10.736177", + "modified": "2014-06-23 07:55:48.580747", "modified_by": "Administrator", "module": "HR", "name": "Expense Claim", diff --git a/erpnext/hr/doctype/leave_allocation/leave_allocation.json b/erpnext/hr/doctype/leave_allocation/leave_allocation.json index ca583a1e44..ede86f3c63 100644 --- a/erpnext/hr/doctype/leave_allocation/leave_allocation.json +++ b/erpnext/hr/doctype/leave_allocation/leave_allocation.json @@ -121,13 +121,14 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Leave Allocation", "permlevel": 0, "print_hide": 1, "read_only": 1 @@ -136,7 +137,7 @@ "icon": "icon-ok", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:12.744348", + "modified": "2014-06-23 07:55:48.989894", "modified_by": "Administrator", "module": "HR", "name": "Leave Allocation", diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.json b/erpnext/hr/doctype/salary_slip/salary_slip.json index 374d11e93b..5d2f028e9c 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.json +++ b/erpnext/hr/doctype/salary_slip/salary_slip.json @@ -180,13 +180,14 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Salary Slip", "permlevel": 0, "print_hide": 1, "report_hide": 0 @@ -325,7 +326,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:17.213045", + "modified": "2014-06-23 07:55:52.259962", "modified_by": "Administrator", "module": "HR", "name": "Salary Slip", diff --git a/erpnext/manufacturing/doctype/production_order/production_order.json b/erpnext/manufacturing/doctype/production_order/production_order.json index 7e068cff74..f5e43b0144 100644 --- a/erpnext/manufacturing/doctype/production_order/production_order.json +++ b/erpnext/manufacturing/doctype/production_order/production_order.json @@ -1,256 +1,257 @@ { - "allow_import": 1, - "autoname": "naming_series:", - "creation": "2013-01-10 16:34:16", - "docstatus": 0, - "doctype": "DocType", + "allow_import": 1, + "autoname": "naming_series:", + "creation": "2013-01-10 16:34:16", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "item", - "fieldtype": "Section Break", - "label": "Item", - "options": "icon-gift", + "fieldname": "item", + "fieldtype": "Section Break", + "label": "Item", + "options": "icon-gift", "permlevel": 0 - }, + }, { - "default": "PRO-", - "fieldname": "naming_series", - "fieldtype": "Select", - "label": "Series", - "options": "PRO-", - "permlevel": 0, + "default": "PRO-", + "fieldname": "naming_series", + "fieldtype": "Select", + "label": "Series", + "options": "PRO-", + "permlevel": 0, "reqd": 1 - }, + }, { - "depends_on": "eval:!doc.__islocal", - "fieldname": "status", - "fieldtype": "Select", - "in_filter": 1, - "in_list_view": 1, - "label": "Status", - "no_copy": 1, - "oldfieldname": "status", - "oldfieldtype": "Select", - "options": "\nDraft\nSubmitted\nStopped\nIn Process\nCompleted\nCancelled", - "permlevel": 0, - "read_only": 1, - "reqd": 1, + "depends_on": "eval:!doc.__islocal", + "fieldname": "status", + "fieldtype": "Select", + "in_filter": 1, + "in_list_view": 1, + "label": "Status", + "no_copy": 1, + "oldfieldname": "status", + "oldfieldtype": "Select", + "options": "\nDraft\nSubmitted\nStopped\nIn Process\nCompleted\nCancelled", + "permlevel": 0, + "read_only": 1, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "production_item", - "fieldtype": "Link", - "in_filter": 1, - "in_list_view": 1, - "label": "Item To Manufacture", - "oldfieldname": "production_item", - "oldfieldtype": "Link", - "options": "Item", - "permlevel": 0, - "read_only": 0, + "fieldname": "production_item", + "fieldtype": "Link", + "in_filter": 1, + "in_list_view": 1, + "label": "Item To Manufacture", + "oldfieldname": "production_item", + "oldfieldtype": "Link", + "options": "Item", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "depends_on": "production_item", - "description": "Bill of Material to be considered for manufacturing", - "fieldname": "bom_no", - "fieldtype": "Link", - "in_list_view": 1, - "label": "BOM No", - "oldfieldname": "bom_no", - "oldfieldtype": "Link", - "options": "BOM", - "permlevel": 0, - "read_only": 0, + "depends_on": "production_item", + "description": "Bill of Material to be considered for manufacturing", + "fieldname": "bom_no", + "fieldtype": "Link", + "in_list_view": 1, + "label": "BOM No", + "oldfieldname": "bom_no", + "oldfieldtype": "Link", + "options": "BOM", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "default": "1", - "description": "If checked, BOM for sub-assembly items will be considered for getting raw materials. Otherwise, all sub-assembly items will be treated as a raw material.", - "fieldname": "use_multi_level_bom", - "fieldtype": "Check", - "label": "Use Multi-Level BOM", + "default": "1", + "description": "If checked, BOM for sub-assembly items will be considered for getting raw materials. Otherwise, all sub-assembly items will be treated as a raw material.", + "fieldname": "use_multi_level_bom", + "fieldtype": "Check", + "label": "Use Multi-Level BOM", "permlevel": 0 - }, + }, { - "fieldname": "column_break1", - "fieldtype": "Column Break", - "oldfieldtype": "Column Break", - "permlevel": 0, - "read_only": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "oldfieldtype": "Column Break", + "permlevel": 0, + "read_only": 0, "width": "50%" - }, + }, { - "description": "Manufacture against Sales Order", - "fieldname": "sales_order", - "fieldtype": "Link", - "label": "Sales Order", - "options": "Sales Order", - "permlevel": 0, + "description": "Manufacture against Sales Order", + "fieldname": "sales_order", + "fieldtype": "Link", + "label": "Sales Order", + "options": "Sales Order", + "permlevel": 0, "read_only": 0 - }, + }, { - "depends_on": "production_item", - "fieldname": "qty", - "fieldtype": "Float", - "in_list_view": 1, - "label": "Qty To Manufacture", - "oldfieldname": "qty", - "oldfieldtype": "Currency", - "permlevel": 0, - "read_only": 0, + "depends_on": "production_item", + "fieldname": "qty", + "fieldtype": "Float", + "in_list_view": 1, + "label": "Qty To Manufacture", + "oldfieldname": "qty", + "oldfieldtype": "Currency", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "depends_on": "eval:doc.docstatus==1", - "description": "Automatically updated via Stock Entry of type Manufacture/Repack", - "fieldname": "produced_qty", - "fieldtype": "Float", - "label": "Manufactured Qty", - "no_copy": 1, - "oldfieldname": "produced_qty", - "oldfieldtype": "Currency", - "permlevel": 0, + "depends_on": "eval:doc.docstatus==1", + "description": "Automatically updated via Stock Entry of type Manufacture/Repack", + "fieldname": "produced_qty", + "fieldtype": "Float", + "label": "Manufactured Qty", + "no_copy": 1, + "oldfieldname": "produced_qty", + "oldfieldtype": "Currency", + "permlevel": 0, "read_only": 1 - }, + }, { - "depends_on": "sales_order", - "fieldname": "expected_delivery_date", - "fieldtype": "Date", - "label": "Expected Delivery Date", - "permlevel": 0, + "depends_on": "sales_order", + "fieldname": "expected_delivery_date", + "fieldtype": "Date", + "label": "Expected Delivery Date", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "warehouses", - "fieldtype": "Section Break", - "label": "Warehouses", - "options": "icon-building", + "fieldname": "warehouses", + "fieldtype": "Section Break", + "label": "Warehouses", + "options": "icon-building", "permlevel": 0 - }, + }, { - "depends_on": "production_item", - "description": "Manufactured quantity will be updated in this warehouse", - "fieldname": "fg_warehouse", - "fieldtype": "Link", - "in_list_view": 0, - "label": "For Warehouse", - "options": "Warehouse", - "permlevel": 0, - "read_only": 0, + "depends_on": "production_item", + "description": "Manufactured quantity will be updated in this warehouse", + "fieldname": "fg_warehouse", + "fieldtype": "Link", + "in_list_view": 0, + "label": "For Warehouse", + "options": "Warehouse", + "permlevel": 0, + "read_only": 0, "reqd": 0 - }, + }, { - "fieldname": "column_break_12", - "fieldtype": "Column Break", + "fieldname": "column_break_12", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "fieldname": "wip_warehouse", - "fieldtype": "Link", - "label": "Work-in-Progress Warehouse", - "options": "Warehouse", - "permlevel": 0, + "fieldname": "wip_warehouse", + "fieldtype": "Link", + "label": "Work-in-Progress Warehouse", + "options": "Warehouse", + "permlevel": 0, "reqd": 0 - }, + }, { - "fieldname": "more_info", - "fieldtype": "Section Break", - "label": "More Info", - "options": "icon-file-text", - "permlevel": 0, + "fieldname": "more_info", + "fieldtype": "Section Break", + "label": "More Info", + "options": "icon-file-text", + "permlevel": 0, "read_only": 0 - }, + }, { - "fieldname": "description", - "fieldtype": "Small Text", - "label": "Item Description", - "permlevel": 0, + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Item Description", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "project_name", - "fieldtype": "Link", - "in_filter": 1, - "label": "Project Name", - "oldfieldname": "project_name", - "oldfieldtype": "Link", - "options": "Project", - "permlevel": 0, + "fieldname": "project_name", + "fieldtype": "Link", + "in_filter": 1, + "label": "Project Name", + "oldfieldname": "project_name", + "oldfieldtype": "Link", + "options": "Project", + "permlevel": 0, "read_only": 0 - }, + }, { - "fieldname": "column_break2", - "fieldtype": "Column Break", - "permlevel": 0, - "read_only": 0, + "fieldname": "column_break2", + "fieldtype": "Column Break", + "permlevel": 0, + "read_only": 0, "width": "50%" - }, + }, { - "depends_on": "production_item", - "fieldname": "stock_uom", - "fieldtype": "Link", - "label": "Stock UOM", - "oldfieldname": "stock_uom", - "oldfieldtype": "Data", - "options": "UOM", - "permlevel": 0, + "depends_on": "production_item", + "fieldname": "stock_uom", + "fieldtype": "Link", + "label": "Stock UOM", + "oldfieldname": "stock_uom", + "oldfieldtype": "Data", + "options": "UOM", + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "company", - "fieldtype": "Link", - "label": "Company", - "oldfieldname": "company", - "oldfieldtype": "Link", - "options": "Company", - "permlevel": 0, - "read_only": 0, + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "oldfieldname": "company", + "oldfieldtype": "Link", + "options": "Company", + "permlevel": 0, + "read_only": 0, "reqd": 1 - }, + }, { - "fieldname": "amended_from", - "fieldtype": "Data", - "ignore_user_permissions": 1, - "label": "Amended From", - "no_copy": 1, - "oldfieldname": "amended_from", - "oldfieldtype": "Data", - "permlevel": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "label": "Amended From", + "no_copy": 1, + "oldfieldname": "amended_from", + "oldfieldtype": "Data", + "options": "Production Order", + "permlevel": 0, "read_only": 1 } - ], - "icon": "icon-cogs", - "idx": 1, - "in_create": 0, - "is_submittable": 1, - "modified": "2014-05-27 03:49:15.008942", - "modified_by": "Administrator", - "module": "Manufacturing", - "name": "Production Order", - "owner": "Administrator", + ], + "icon": "icon-cogs", + "idx": 1, + "in_create": 0, + "is_submittable": 1, + "modified": "2014-06-23 07:55:50.092300", + "modified_by": "Administrator", + "module": "Manufacturing", + "name": "Production Order", + "owner": "Administrator", "permissions": [ { - "amend": 1, - "apply_user_permissions": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Manufacturing User", - "submit": 1, + "amend": 1, + "apply_user_permissions": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Manufacturing User", + "submit": 1, "write": 1 - }, + }, { - "apply_user_permissions": 1, - "permlevel": 0, - "read": 1, - "report": 1, + "apply_user_permissions": 1, + "permlevel": 0, + "read": 1, + "report": 1, "role": "Material User" } ] -} +} \ No newline at end of file diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 041bbd3cc0..d94dd53097 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -63,3 +63,4 @@ erpnext.patches.v4_0.create_price_list_if_missing execute:frappe.db.sql("update `tabItem` set end_of_life=null where end_of_life='0000-00-00'") #2014-06-16 erpnext.patches.v4_0.update_users_report_view_settings erpnext.patches.v4_0.set_pricing_rule_for_buying_or_selling +erpnext.patches.v4_0.set_naming_series_property_setter diff --git a/erpnext/patches/repair_tools/__init__.py b/erpnext/patches/repair_tools/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/patches/repair_tools/fix_naming_series_records_lost_by_reload.py b/erpnext/patches/repair_tools/fix_naming_series_records_lost_by_reload.py new file mode 100644 index 0000000000..7fb54b3cc8 --- /dev/null +++ b/erpnext/patches/repair_tools/fix_naming_series_records_lost_by_reload.py @@ -0,0 +1,204 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +import json +from frappe.model.naming import make_autoname +from frappe.utils import cint +from frappe.utils.email_lib import sendmail_to_system_managers + +doctype_series_map = { + 'Attendance': 'ATT-', + 'C-Form': 'C-FORM-', + 'Customer': 'CUST-', + 'Customer Issue': 'CI-', + 'Delivery Note': 'DN-', + 'Installation Note': 'IN-', + 'Item': 'ITEM-', + 'Journal Voucher': 'JV-', + 'Lead': 'LEAD-', + 'Opportunity': 'OPTY-', + 'Packing Slip': 'PS-', + 'Production Order': 'PRO-', + 'Purchase Invoice': 'PINV-', + 'Purchase Order': 'PO-', + 'Purchase Receipt': 'PREC-', + 'Quality Inspection': 'QI-', + 'Quotation': 'QTN-', + 'Sales Invoice': 'SINV-', + 'Sales Order': 'SO-', + 'Stock Entry': 'STE-', + 'Supplier': 'SUPP-', + 'Supplier Quotation': 'SQTN-', + 'Support Ticket': 'SUP-' +} + +def check_docs_to_rename(): + if "erpnext" not in frappe.get_installed_apps(): + return + + docs_to_rename = get_docs_to_rename() + if docs_to_rename: + print "To Rename" + print json.dumps(docs_to_rename, indent=1, sort_keys=True) + + frappe.db.rollback() + +def check_gl_sl_entries_to_fix(): + if "erpnext" not in frappe.get_installed_apps(): + return + + gl_entries_to_fix = get_gl_entries_to_fix() + if gl_entries_to_fix: + print "General Ledger Entries to Fix" + print json.dumps(gl_entries_to_fix, indent=1, sort_keys=True) + + sl_entries_to_fix = get_sl_entries_to_fix() + if sl_entries_to_fix: + print "Stock Ledger Entries to Fix" + print json.dumps(sl_entries_to_fix, indent=1, sort_keys=True) + + frappe.db.rollback() + +def guess_reference_date(): + return (frappe.db.get_value("Patch Log", {"patch": "erpnext.patches.v4_0.validate_v3_patch"}, "creation") + or "2014-05-06") + +def get_docs_to_rename(): + reference_date = guess_reference_date() + + docs_to_rename = {} + for doctype, new_series in doctype_series_map.items(): + if doctype in ("Item", "Customer", "Lead", "Supplier"): + if not frappe.db.sql("""select name from `tab{doctype}` + where ifnull(naming_series, '')!='' + and name like concat(naming_series, '%%') limit 1""".format(doctype=doctype)): + continue + + # fix newly formed records using old series! + records_with_new_series = frappe.db.sql_list("""select name from `tab{doctype}` + where date(creation) >= date(%s) and naming_series=%s + and exists (select name from `tab{doctype}` where ifnull(naming_series, '') not in ('', %s) limit 1) + order by name asc""".format(doctype=doctype), (reference_date, new_series, new_series)) + + if records_with_new_series: + docs_to_rename[doctype] = records_with_new_series + + return docs_to_rename + +def get_gl_entries_to_fix(): + bad_gl_entries = {} + + for dt in frappe.db.sql_list("""select distinct voucher_type from `tabGL Entry` + where ifnull(voucher_type, '')!=''"""): + + if dt not in doctype_series_map: + continue + + out = frappe.db.sql("""select gl.name, gl.voucher_no from `tabGL Entry` gl + where ifnull(voucher_type, '')=%s and voucher_no like %s and + not exists (select name from `tab{voucher_type}` vt where vt.name=gl.voucher_no)""".format(voucher_type=dt), + (dt, doctype_series_map[dt] + "%%"), as_dict=True) + + if out: + bad_gl_entries.setdefault(dt, []).extend(out) + + for dt in frappe.db.sql_list("""select distinct against_voucher_type + from `tabGL Entry` where ifnull(against_voucher_type, '')!=''"""): + + if dt not in doctype_series_map: + continue + + out = frappe.db.sql("""select gl.name, gl.against_voucher from `tabGL Entry` gl + where ifnull(against_voucher_type, '')=%s and against_voucher like %s and + not exists (select name from `tab{against_voucher_type}` vt + where vt.name=gl.against_voucher)""".format(against_voucher_type=dt), + (dt, doctype_series_map[dt] + "%%"), as_dict=True) + + if out: + bad_gl_entries.setdefault(dt, []).extend(out) + + return bad_gl_entries + +def get_sl_entries_to_fix(): + bad_sl_entries = {} + + for dt in frappe.db.sql_list("""select distinct voucher_type from `tabStock Ledger Entry` + where ifnull(voucher_type, '')!=''"""): + + if dt not in doctype_series_map: + continue + + out = frappe.db.sql("""select sl.name, sl.voucher_no from `tabStock Ledger Entry` sl + where voucher_type=%s and voucher_no like %s and + not exists (select name from `tab{voucher_type}` vt where vt.name=sl.voucher_no)""".format(voucher_type=dt), + (dt, doctype_series_map[dt] + "%%"), as_dict=True) + if out: + bad_sl_entries.setdefault(dt, []).extend(out) + + return bad_sl_entries + +def add_comment(doctype, old_name, new_name): + frappe.get_doc({ + "doctype":"Comment", + "comment_by": frappe.session.user, + "comment_doctype": doctype, + "comment_docname": new_name, + "comment": """Renamed from **{old_name}** to {new_name}""".format(old_name=old_name, new_name=new_name) + }).insert(ignore_permissions=True) + +def _rename_doc(doctype, name, naming_series): + if frappe.get_meta(doctype).get_field("amended_from"): + amended_from = frappe.db.get_value(doctype, name, "amended_from") + else: + amended_from = None + + if amended_from: + am_id = 1 + am_prefix = amended_from + if frappe.db.get_value(doctype, amended_from, "amended_from"): + am_id = cint(amended_from.split('-')[-1]) + 1 + am_prefix = '-'.join(amended_from.split('-')[:-1]) # except the last hyphen + + fixed_name = am_prefix + '-' + str(am_id) + else: + fixed_name = make_autoname(naming_series+'.#####') + + frappe.db.set_value(doctype, name, "naming_series", naming_series) + frappe.rename_doc(doctype, name, fixed_name, force=True) + add_comment(doctype, name, fixed_name) + + return fixed_name + +def rename_docs(): + _log = [] + def log(msg): + _log.append(msg) + print msg + + commit = False + docs_to_rename = get_docs_to_rename() + for doctype, list_of_names in docs_to_rename.items(): + naming_series_field = frappe.get_meta(doctype).get_field("naming_series") + default_series = naming_series_field.default or filter(None, (naming_series_field.options or "").split("\n"))[0] + + print + print "Rename", doctype, list_of_names, "using series", default_series + confirm = raw_input("do it? (yes / anything else): ") + + if confirm == "yes": + commit = True + for name in list_of_names: + fixed_name = _rename_doc(doctype, name, default_series) + log("Renamed {doctype} {name} --> {fixed_name}".format(doctype=doctype, name=name, fixed_name=fixed_name)) + + if commit: + content = """These documents have been renamed in your ERPNext instance: {site}\n\n{_log}""".format(site=frappe.local.site, _log="\n".join(_log)) + + print content + + frappe.db.commit() + + sendmail_to_system_managers("[Important] [ERPNext] Renamed Documents via Patch", content) + diff --git a/erpnext/patches/v4_0/set_naming_series_property_setter.py b/erpnext/patches/v4_0/set_naming_series_property_setter.py new file mode 100644 index 0000000000..7161492cfa --- /dev/null +++ b/erpnext/patches/v4_0/set_naming_series_property_setter.py @@ -0,0 +1,98 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals + +import frappe +from frappe.core.doctype.property_setter.property_setter import make_property_setter + +doctype_series_map = { + 'Attendance': 'ATT-', + 'C-Form': 'C-FORM-', + 'Customer': 'CUST-', + 'Customer Issue': 'CI-', + 'Delivery Note': 'DN-', + 'Installation Note': 'IN-', + 'Item': 'ITEM-', + 'Journal Voucher': 'JV-', + 'Lead': 'LEAD-', + 'Opportunity': 'OPTY-', + 'Packing Slip': 'PS-', + 'Production Order': 'PRO-', + 'Purchase Invoice': 'PINV-', + 'Purchase Order': 'PO-', + 'Purchase Receipt': 'PREC-', + 'Quality Inspection': 'QI-', + 'Quotation': 'QTN-', + 'Sales Invoice': 'SINV-', + 'Sales Order': 'SO-', + 'Stock Entry': 'STE-', + 'Supplier': 'SUPP-', + 'Supplier Quotation': 'SQTN-', + 'Support Ticket': 'SUP-' +} + +def execute(): + series_to_set = get_series_to_set() + for doctype, opts in series_to_set.items(): + print "Setting naming series", doctype, opts + set_series(doctype, opts["options"], opts["default"]) + +def set_series(doctype, options, default): + make_property_setter(doctype, "naming_series", "options", options, "Text") + make_property_setter(doctype, "naming_series", "default", default, "Text") + +def get_series_to_set(): + series_to_set = {} + + for doctype, new_series in doctype_series_map.items(): + # you can't fix what does not exist :) + if not frappe.db.a_row_exists(doctype): + continue + + series_to_preserve = get_series_to_preserve(doctype, new_series) + + if not series_to_preserve: + continue + + default_series = get_default_series(doctype, new_series) + if not default_series: + continue + + existing_series = (frappe.get_meta(doctype).get_field("naming_series").options or "").split("\n") + existing_series = filter(None, [d.strip() for d in existing_series]) + + if (not (set(existing_series).difference(series_to_preserve) or set(series_to_preserve).difference(existing_series)) + and len(series_to_preserve)==len(existing_series)): + # print "No change for", doctype, ":", existing_series, "=", series_to_preserve + continue + + # set naming series property setter + series_to_preserve = list(set(series_to_preserve + existing_series)) + if new_series in series_to_preserve: + series_to_preserve.remove(new_series) + + if series_to_preserve: + series_to_set[doctype] = {"options": "\n".join(series_to_preserve), "default": default_series} + + return series_to_set + +def get_series_to_preserve(doctype, new_series): + series_to_preserve = frappe.db.sql_list("""select distinct naming_series from `tab{doctype}` + where ifnull(naming_series, '') not in ('', %s)""".format(doctype=doctype), new_series) + + series_to_preserve.sort() + + return series_to_preserve + +def get_default_series(doctype, new_series): + default_series = frappe.db.sql("""select naming_series from `tab{doctype}` where ifnull(naming_series, '') not in ('', %s) + and creation=(select max(creation) from `tab{doctype}` + where ifnull(naming_series, '') not in ('', %s)) order by creation desc limit 1""".format(doctype=doctype), + (new_series, new_series)) + + if not (default_series and default_series[0][0]): + print "[Skipping] Cannot guess which naming series to use for", doctype + return + + return default_series[0][0] diff --git a/erpnext/selling/doctype/installation_note/installation_note.json b/erpnext/selling/doctype/installation_note/installation_note.json index 859ff5f4ce..56df0615a3 100644 --- a/erpnext/selling/doctype/installation_note/installation_note.json +++ b/erpnext/selling/doctype/installation_note/installation_note.json @@ -195,12 +195,13 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Installation Note", "permlevel": 0, "print_hide": 1, "read_only": 1 @@ -235,7 +236,7 @@ "icon": "icon-wrench", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:11.449598", + "modified": "2014-06-23 07:55:48.805241", "modified_by": "Administrator", "module": "Selling", "name": "Installation Note", diff --git a/erpnext/selling/doctype/opportunity/opportunity.json b/erpnext/selling/doctype/opportunity/opportunity.json index 249a0ff50c..be5f52b483 100644 --- a/erpnext/selling/doctype/opportunity/opportunity.json +++ b/erpnext/selling/doctype/opportunity/opportunity.json @@ -385,12 +385,13 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Opportunity", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -409,7 +410,7 @@ "icon": "icon-info-sign", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:14.057062", + "modified": "2014-06-23 07:55:49.718301", "modified_by": "Administrator", "module": "Selling", "name": "Opportunity", diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index 1ae0adb363..bdd27c4cc7 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -139,12 +139,13 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Quotation", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -826,7 +827,7 @@ "idx": 1, "is_submittable": 1, "max_attachments": 1, - "modified": "2014-06-19 15:59:30.019826", + "modified": "2014-06-23 07:55:51.859025", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index a036370db5..6c330e67e2 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -112,13 +112,14 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 1, "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Sales Order", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -882,7 +883,7 @@ "idx": 1, "is_submittable": 1, "issingle": 0, - "modified": "2014-06-19 16:00:06.626037", + "modified": "2014-06-23 07:55:52.555192", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index 690fd055fa..f1dc5a390e 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -129,12 +129,13 @@ { "allow_on_submit": 0, "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Delivery Note", "permlevel": 0, "print_hide": 1, "print_width": "150px", @@ -1007,7 +1008,7 @@ "idx": 1, "in_create": 0, "is_submittable": 1, - "modified": "2014-06-19 16:00:47.326127", + "modified": "2014-06-23 07:55:47.859869", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", diff --git a/erpnext/stock/doctype/material_request/material_request.json b/erpnext/stock/doctype/material_request/material_request.json index 8e8f75662a..0f066dab3b 100644 --- a/erpnext/stock/doctype/material_request/material_request.json +++ b/erpnext/stock/doctype/material_request/material_request.json @@ -41,12 +41,13 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Material Request", "permlevel": 0, "print_hide": 1, "print_width": "150px", @@ -229,7 +230,7 @@ "icon": "icon-ticket", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:13.642995", + "modified": "2014-06-23 07:55:49.393708", "modified_by": "Administrator", "module": "Stock", "name": "Material Request", diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index ae748ce3fe..4ea3864258 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -524,7 +524,7 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 1, "ignore_user_permissions": 1, "label": "Amended From", @@ -762,7 +762,7 @@ "icon": "icon-truck", "idx": 1, "is_submittable": 1, - "modified": "2014-06-19 15:58:37.932064", + "modified": "2014-06-23 07:55:50.761516", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt", diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json index cdddabedf2..f6bd010ba8 100644 --- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json +++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.json @@ -91,11 +91,12 @@ }, { "fieldname": "voucher_type", - "fieldtype": "Data", + "fieldtype": "Link", "in_filter": 1, "label": "Voucher Type", "oldfieldname": "voucher_type", "oldfieldtype": "Data", + "options": "DocType", "permlevel": 0, "print_width": "150px", "read_only": 1, @@ -104,11 +105,12 @@ }, { "fieldname": "voucher_no", - "fieldtype": "Data", + "fieldtype": "Dynamic Link", "in_filter": 1, "label": "Voucher No", "oldfieldname": "voucher_no", "oldfieldtype": "Data", + "options": "voucher_type", "permlevel": 0, "print_width": "150px", "read_only": 1, @@ -264,7 +266,7 @@ "icon": "icon-list", "idx": 1, "in_create": 1, - "modified": "2014-06-09 01:51:44.014466", + "modified": "2014-06-23 08:07:56.370276", "modified_by": "Administrator", "module": "Stock", "name": "Stock Ledger Entry", diff --git a/erpnext/support/doctype/customer_issue/customer_issue.json b/erpnext/support/doctype/customer_issue/customer_issue.json index 8230f9cc88..b755135b73 100644 --- a/erpnext/support/doctype/customer_issue/customer_issue.json +++ b/erpnext/support/doctype/customer_issue/customer_issue.json @@ -379,13 +379,14 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "hidden": 1, "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Customer Issue", "permlevel": 0, "print_hide": 1, "width": "150px" @@ -394,7 +395,7 @@ "icon": "icon-bug", "idx": 1, "is_submittable": 0, - "modified": "2014-05-27 03:49:09.483145", + "modified": "2014-06-23 07:55:47.488335", "modified_by": "Administrator", "module": "Support", "name": "Customer Issue", diff --git a/erpnext/support/doctype/maintenance_visit/maintenance_visit.json b/erpnext/support/doctype/maintenance_visit/maintenance_visit.json index 4a13e40003..743d210861 100644 --- a/erpnext/support/doctype/maintenance_visit/maintenance_visit.json +++ b/erpnext/support/doctype/maintenance_visit/maintenance_visit.json @@ -190,12 +190,13 @@ }, { "fieldname": "amended_from", - "fieldtype": "Data", + "fieldtype": "Link", "ignore_user_permissions": 1, "label": "Amended From", "no_copy": 1, "oldfieldname": "amended_from", "oldfieldtype": "Data", + "options": "Maintenance Visit", "permlevel": 0, "print_hide": 1, "read_only": 1, @@ -278,7 +279,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-05-27 03:49:13.466221", + "modified": "2014-06-23 07:55:49.200714", "modified_by": "Administrator", "module": "Support", "name": "Maintenance Visit", From 379d86f9a350d5adef10e10ae81930c1d4f91fb8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 23 Jun 2014 18:21:37 +0530 Subject: [PATCH 45/57] sms sending issue fixed --- erpnext/setup/doctype/sms_settings/sms_settings.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/doctype/sms_settings/sms_settings.py b/erpnext/setup/doctype/sms_settings/sms_settings.py index a9afacfe30..de1164118e 100644 --- a/erpnext/setup/doctype/sms_settings/sms_settings.py +++ b/erpnext/setup/doctype/sms_settings/sms_settings.py @@ -16,8 +16,7 @@ def validate_receiver_nos(receiver_list): validated_receiver_list = [] for d in receiver_list: # remove invalid character - invalid_char_list = [' ', '+', '-', '(', ')'] - for x in invalid_char_list: + for x in [' ', '+', '-', '(', ')']: d = d.replace(x, '') validated_receiver_list.append(d) @@ -48,6 +47,13 @@ def get_contact_number(contact_name, value, key): @frappe.whitelist() def send_sms(receiver_list, msg, sender_name = ''): + + import json + if isinstance(receiver_list, basestring): + receiver_list = json.loads(receiver_list) + if not isinstance(receiver_list, list): + receiver_list = [receiver_list] + receiver_list = validate_receiver_nos(receiver_list) arg = { From 98bec6f96bf3f8cc69cbbe1a0d0356fbe2f306f7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 11:00:13 +0530 Subject: [PATCH 46/57] Fixes in pricing rule --- erpnext/accounts/doctype/pricing_rule/pricing_rule.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index 967d583aab..2d592d1f96 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals import frappe import json +import copy from frappe import throw, _ from frappe.utils import flt, cint from frappe.model.document import Document @@ -106,8 +107,9 @@ def apply_pricing_rule(args): args.transaction_type = "buying" if frappe.get_meta(args.parenttype).get_field("supplier") \ else "selling" + args_copy = copy.deepcopy(args) + args_copy.pop("item_list") for item in args.get("item_list"): - args_copy = args.copy() args_copy.update(item) out.append(get_pricing_rule_for_item(args_copy)) From f27fa5cbf37f042a096a8e4e4b0c30e68306954f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 11:11:08 +0530 Subject: [PATCH 47/57] Fixes in pricing rule --- erpnext/accounts/doctype/pricing_rule/pricing_rule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index 2d592d1f96..0474639377 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -107,9 +107,9 @@ def apply_pricing_rule(args): args.transaction_type = "buying" if frappe.get_meta(args.parenttype).get_field("supplier") \ else "selling" - args_copy = copy.deepcopy(args) - args_copy.pop("item_list") for item in args.get("item_list"): + args_copy = copy.deepcopy(args) + args_copy.pop("item_list") args_copy.update(item) out.append(get_pricing_rule_for_item(args_copy)) From 860b2e2bbb4b3965baf800e9f9e2c149b7318c1c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 12:07:56 +0530 Subject: [PATCH 48/57] Fixes in pricing rule --- erpnext/accounts/doctype/pricing_rule/pricing_rule.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py index 0474639377..2706603bc6 100644 --- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py @@ -107,9 +107,11 @@ def apply_pricing_rule(args): args.transaction_type = "buying" if frappe.get_meta(args.parenttype).get_field("supplier") \ else "selling" - for item in args.get("item_list"): + item_list = args.get("item_list") + args.pop("item_list") + + for item in item_list: args_copy = copy.deepcopy(args) - args_copy.pop("item_list") args_copy.update(item) out.append(get_pricing_rule_for_item(args_copy)) From 2b400dc2adef28bbe98092bc3c8ccc149b0cbe31 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 12:42:36 +0530 Subject: [PATCH 49/57] stock entry incoming rate based on precision --- erpnext/stock/doctype/stock_entry/stock_entry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 297542b50f..125a293586 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -220,8 +220,8 @@ class StockEntry(StockController): # get incoming rate if not d.bom_no: if not flt(d.incoming_rate) or d.s_warehouse or self.purpose == "Sales Return": - incoming_rate = self.get_incoming_rate(args) - if flt(incoming_rate) > 0: + incoming_rate = flt(self.get_incoming_rate(args), self.precision("incoming_rate", d)) + if incoming_rate > 0: d.incoming_rate = incoming_rate d.amount = flt(d.transfer_qty) * flt(d.incoming_rate) From e6440a75b50e3d30ae3af0e476a4dd569a93be43 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 12:44:49 +0530 Subject: [PATCH 50/57] Allowed renaming for project --- erpnext/projects/doctype/project/project.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json index 5489d33468..c894bb8b26 100644 --- a/erpnext/projects/doctype/project/project.json +++ b/erpnext/projects/doctype/project/project.json @@ -1,6 +1,7 @@ { "allow_attach": 1, "allow_import": 1, + "allow_rename": 1, "autoname": "field:project_name", "creation": "2013-03-07 11:55:07", "docstatus": 0, @@ -258,7 +259,7 @@ "icon": "icon-puzzle-piece", "idx": 1, "max_attachments": 4, - "modified": "2014-05-27 03:49:15.252736", + "modified": "2014-06-24 12:44:19.530707", "modified_by": "Administrator", "module": "Projects", "name": "Project", From ca37ff8b08d5b0dd6db1bd48912807aa40872aba Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 24 Jun 2014 15:26:40 +0530 Subject: [PATCH 51/57] Fix in pricing rule patch --- erpnext/patches/v4_0/customer_discount_to_pricing_rule.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/patches/v4_0/customer_discount_to_pricing_rule.py b/erpnext/patches/v4_0/customer_discount_to_pricing_rule.py index fa35898df3..bd27174a0e 100644 --- a/erpnext/patches/v4_0/customer_discount_to_pricing_rule.py +++ b/erpnext/patches/v4_0/customer_discount_to_pricing_rule.py @@ -24,7 +24,8 @@ def execute(): "applicable_for": "Customer", "customer": d.parent, "price_or_discount": "Discount Percentage", - "discount_percentage": d.discount + "discount_percentage": d.discount, + "selling": 1 }).insert() frappe.db.auto_commit_on_many_writes = False From 9c2459658ac34bf3d52c5c49575c78a28cd927d8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 16:19:16 +0530 Subject: [PATCH 52/57] Fixes for recurring invoice --- erpnext/accounts/doctype/sales_invoice/sales_invoice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 0f11af42c9..348543ee28 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -732,7 +732,7 @@ def notify_errors(inv, customer, owner): frappe.sendmail(recipients + [frappe.db.get_value("User", owner, "email")], subject="[Urgent] Error while creating recurring invoice for %s" % inv, - message = frappe.get_template("template/emails/recurring_invoice_failed.html").render({ + message = frappe.get_template("templates/emails/recurring_invoice_failed.html").render({ "name": inv, "customer": customer })) From 48f11425233c4e3cce3c251efd5520b76323d622 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 16:35:00 +0530 Subject: [PATCH 53/57] Fixed address deletion issue --- .../doctype/contact_control/contact_control.js | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/erpnext/setup/doctype/contact_control/contact_control.js b/erpnext/setup/doctype/contact_control/contact_control.js index 6b6878ffd5..b053541683 100755 --- a/erpnext/setup/doctype/contact_control/contact_control.js +++ b/erpnext/setup/doctype/contact_control/contact_control.js @@ -139,19 +139,10 @@ cur_frm.cscript.delete_doc = function(doctype, name) { var go_ahead = confirm(__("Delete {0} {1}?", [doctype, name])); if (!go_ahead) return; - return frappe.call({ - method: 'frappe.model.delete_doc', - args: { - dt: doctype, - dn: name - }, - callback: function(r) { - //console.log(r); - if (!r.exc) { - // run the correct list - var list_name = doctype.toLowerCase() + '_list'; - cur_frm[list_name].run(); - } + frappe.model.delete_doc(doctype, name, function(r) { + if (!r.exc) { + var list_name = doctype.toLowerCase() + '_list'; + cur_frm[list_name].run(); } }); } From c7c89a59274571f37925cd7f8c995c851c1f3e55 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 17:02:45 +0530 Subject: [PATCH 54/57] Cost center-wise net profit in financial analytics report --- .../financial_analytics.js | 4 +- erpnext/selling/sales_common.js | 45 +++++++++---------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/erpnext/accounts/page/financial_analytics/financial_analytics.js b/erpnext/accounts/page/financial_analytics/financial_analytics.js index 4574390ce1..2da93813e9 100644 --- a/erpnext/accounts/page/financial_analytics/financial_analytics.js +++ b/erpnext/accounts/page/financial_analytics/financial_analytics.js @@ -232,7 +232,7 @@ erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({ indent: 0, opening: 0, checked: false, - report_type: me.pl_or_bs, + report_type: me.pl_or_bs=="Balance Sheet"? "Balance Sheet" : "Profit and Loss", }; me.item_by_name[net_profit.name] = net_profit; @@ -244,7 +244,7 @@ erpnext.FinancialAnalytics = erpnext.AccountTreeGrid.extend({ $.each(me.data, function(i, ac) { if(!ac.parent_account && me.apply_filter(ac, "company") && - ac.report_type==me.pl_or_bs) { + ac.report_type==net_profit.report_type) { $.each(me.columns, function(i, col) { if(col.formatter==me.currency_formatter && col.balance_type=="Dr") { var bal = net_profit[col.date+"_dr"] - diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js index 63ffb36fb0..aba390e281 100644 --- a/erpnext/selling/sales_common.js +++ b/erpnext/selling/sales_common.js @@ -481,7 +481,27 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ set_dynamic_labels: function() { this._super(); - set_sales_bom_help(this.frm.doc); + this.set_sales_bom_help(this.frm.doc); + }, + + set_sales_bom_help: function(doc) { + if(!cur_frm.fields_dict.packing_list) return; + if ((doc.packing_details || []).length) { + $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true); + + if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) { + help_msg = "
" + + __("For 'Sales BOM' items, warehouse, serial no and batch no will be considered from the 'Packing List' table. If warehouse and batch no are same for all packing items for any 'Sales BOM' item, those values can be entered in the main item table, values will be copied to 'Packing List' table.")+ + "
"; + frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg; + } + } else { + $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false); + if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) { + frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = ''; + } + } + refresh_field('sales_bom_help'); }, change_form_labels: function(company_currency) { @@ -574,26 +594,5 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ var df = frappe.meta.get_docfield(fname[0], fname[1], me.frm.doc.name); if(df) df.label = label; }); - }, -}); - -// Help for Sales BOM items -var set_sales_bom_help = function(doc) { - if(!cur_frm.fields_dict.packing_list) return; - if ((doc.packing_details || []).length) { - $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(true); - - if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) { - help_msg = "
" + - __("For 'Sales BOM' items, warehouse, serial no and batch no will be considered from the 'Packing List' table. If warehouse and batch no are same for all packing items for any 'Sales BOM' item, those values can be entered in the main item table, values will be copied to 'Packing List' table.")+ - "
"; - frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg; - } - } else { - $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false); - if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) { - frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = ''; - } } - refresh_field('sales_bom_help'); -} +}); From 29de86253f4f28ceb636fbb3346e23bce5c48b23 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 24 Jun 2014 17:34:52 +0530 Subject: [PATCH 55/57] minor fixes --- erpnext/selling/sales_common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js index aba390e281..2021490bb7 100644 --- a/erpnext/selling/sales_common.js +++ b/erpnext/selling/sales_common.js @@ -491,7 +491,7 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) { help_msg = "
" + - __("For 'Sales BOM' items, warehouse, serial no and batch no will be considered from the 'Packing List' table. If warehouse and batch no are same for all packing items for any 'Sales BOM' item, those values can be entered in the main item table, values will be copied to 'Packing List' table.")+ + __("For 'Sales BOM' items, Warehouse, Serial No and Batch No will be considered from the 'Packing List' table. If Warehouse and Batch No are same for all packing items for any 'Sales BOM' item, those values can be entered in the main Item table, values will be copied to 'Packing List' table.")+ "
"; frappe.meta.get_docfield(doc.doctype, 'sales_bom_help', doc.name).options = help_msg; } From fda8858fc3a0e429618072058deafe7839110707 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 24 Jun 2014 18:53:04 +0530 Subject: [PATCH 56/57] Warehouse query filtered by company --- erpnext/controllers/queries.py | 1 + .../public/js/controllers/stock_controller.js | 37 +++++++++++++++++-- erpnext/public/js/queries.js | 6 +++ erpnext/public/js/transaction.js | 2 + 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index 0f1d5f6dab..16d27d47fc 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -254,3 +254,4 @@ def get_account_list(doctype, txt, searchfield, start, page_len, filters): return frappe.widgets.reportview.execute("Account", filters = filter_list, fields = ["name", "parent_account"], limit_start=start, limit_page_length=page_len, as_list=True) + diff --git a/erpnext/public/js/controllers/stock_controller.js b/erpnext/public/js/controllers/stock_controller.js index e50b2af35f..97bcb6cf1c 100644 --- a/erpnext/public/js/controllers/stock_controller.js +++ b/erpnext/public/js/controllers/stock_controller.js @@ -4,6 +4,37 @@ frappe.provide("erpnext.stock"); erpnext.stock.StockController = frappe.ui.form.Controller.extend({ + onload: function() { + // warehouse query if company + if (this.frm.fields_dict.company) { + this.setup_warehouse_query(); + } + }, + + setup_warehouse_query: function() { + var me = this; + + var _set_warehouse_query = function(doctype, parentfield) { + var warehouse_link_fields = frappe.meta.get_docfields(doctype, me.frm.doc.name, + {"fieldtype": "Link", "options": "Warehouse"}); + $.each(warehouse_link_fields, function(i, df) { + me.frm.set_query(df.fieldname, parentfield, function() { + return erpnext.queries.warehouse(me.frm.doc); + }) + }); + }; + + _set_warehouse_query(me.frm.doc.doctype); + + // warehouse field in tables + var table_fields = frappe.meta.get_docfields(me.frm.doc.doctype, me.frm.doc.name, + {"fieldtype": "Table"}); + + $.each(table_fields, function(i, df) { + _set_warehouse_query(df.options, df.fieldname); + }); + }, + show_stock_ledger: function() { var me = this; if(this.frm.doc.docstatus===1) { @@ -17,12 +48,12 @@ erpnext.stock.StockController = frappe.ui.form.Controller.extend({ frappe.set_route("query-report", "Stock Ledger"); }, "icon-bar-chart"); } - + }, show_general_ledger: function() { var me = this; - if(this.frm.doc.docstatus===1 && cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { + if(this.frm.doc.docstatus===1 && cint(frappe.defaults.get_default("auto_accounting_for_stock"))) { cur_frm.appframe.add_button(__('Accounting Ledger'), function() { frappe.route_options = { voucher_no: me.frm.doc.name, @@ -46,4 +77,4 @@ erpnext.stock.StockController = frappe.ui.form.Controller.extend({ } refresh_field(this.frm.cscript.fname); } -}); \ No newline at end of file +}); diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js index 1f404db39a..b57b765ad6 100644 --- a/erpnext/public/js/queries.js +++ b/erpnext/public/js/queries.js @@ -67,5 +67,11 @@ $.extend(erpnext.queries, { employee: function() { return { query: "erpnext.controllers.queries.employee_query" } + }, + + warehouse: function(doc) { + return { + filters: [["Warehouse", "company", "in", ["", doc.company]]] + } } }); diff --git a/erpnext/public/js/transaction.js b/erpnext/public/js/transaction.js index ea576d5ae0..a4b1abbb6a 100644 --- a/erpnext/public/js/transaction.js +++ b/erpnext/public/js/transaction.js @@ -7,6 +7,8 @@ frappe.require("assets/erpnext/js/controllers/stock_controller.js"); erpnext.TransactionController = erpnext.stock.StockController.extend({ onload: function() { var me = this; + this._super(); + if(this.frm.doc.__islocal) { var today = get_today(), currency = frappe.defaults.get_user_default("currency"); From d12be12f72212821d4d05b0df66252b44397bfb0 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 24 Jun 2014 18:53:17 +0530 Subject: [PATCH 57/57] Fixed gantt chart query for Task --- erpnext/projects/doctype/task/task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py index 7fbaa45138..6b0b237a40 100644 --- a/erpnext/projects/doctype/task/task.py +++ b/erpnext/projects/doctype/task/task.py @@ -52,7 +52,7 @@ def get_events(start, end, filters=None): frappe.msgprint(_("No Permission"), raise_exception=1) conditions = build_match_conditions("Task") - conditions and (" and " + conditions) or "" + conditions = conditions and (" and " + conditions) or "" if filters: filters = json.loads(filters)