From 43f087c99da1a89373d1fe2310c76669bdf999ca Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Tue, 26 Aug 2014 14:25:53 +0530 Subject: [PATCH 01/14] [hotfix] Supplier read permission for Purchase User [Fix] Issue #448 [Fix] Issue #448 2 --- .../doctype/cost_center/cost_center.json | 4 +- .../purchase_invoice_item.json | 58 +++++++++---------- .../purchase_common/purchase_common.js | 2 +- erpnext/projects/doctype/project/project.json | 12 +++- erpnext/projects/doctype/project/project.py | 4 ++ erpnext/public/js/transaction.js | 3 +- erpnext/selling/sales_common.js | 18 ++++++ .../purchase_receipt_item.json | 22 +++---- erpnext/stock/get_item_details.py | 4 +- 9 files changed, 80 insertions(+), 47 deletions(-) diff --git a/erpnext/accounts/doctype/cost_center/cost_center.json b/erpnext/accounts/doctype/cost_center/cost_center.json index 36cb6ae7e9c..e65f74bdb90 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.json +++ b/erpnext/accounts/doctype/cost_center/cost_center.json @@ -144,8 +144,8 @@ ], "icon": "icon-money", "idx": 1, - "in_create": 1, - "modified": "2014-05-27 03:49:08.910126", + "in_create": 0, + "modified": "2014-08-26 12:16:11.163750", "modified_by": "Administrator", "module": "Accounts", "name": "Cost Center", diff --git a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json index 22757430bff..d26dec0a922 100755 --- a/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json +++ b/erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json @@ -227,6 +227,17 @@ "fieldtype": "Column Break", "permlevel": 0 }, + { + "fieldname": "project_name", + "fieldtype": "Link", + "in_filter": 1, + "in_list_view": 0, + "label": "Project Name", + "options": "Project", + "permlevel": 0, + "print_hide": 1, + "read_only": 0 + }, { "default": ":Company", "fieldname": "cost_center", @@ -249,17 +260,6 @@ "label": "Reference", "permlevel": 0 }, - { - "fieldname": "project_name", - "fieldtype": "Link", - "in_filter": 1, - "in_list_view": 0, - "label": "Project Name", - "options": "Project", - "permlevel": 0, - "print_hide": 1, - "read_only": 0 - }, { "fieldname": "brand", "fieldtype": "Data", @@ -317,23 +317,6 @@ "search_index": 0, "width": "150px" }, - { - "allow_on_submit": 1, - "fieldname": "page_break", - "fieldtype": "Check", - "in_list_view": 0, - "label": "Page Break", - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "read_only": 0, - "report_hide": 1 - }, - { - "fieldname": "col_break6", - "fieldtype": "Column Break", - "permlevel": 0 - }, { "fieldname": "purchase_order", "fieldtype": "Link", @@ -349,6 +332,11 @@ "read_only": 1, "search_index": 1 }, + { + "fieldname": "col_break6", + "fieldtype": "Column Break", + "permlevel": 0 + }, { "fieldname": "po_detail", "fieldtype": "Data", @@ -379,6 +367,18 @@ "read_only": 1, "search_index": 1 }, + { + "allow_on_submit": 1, + "fieldname": "page_break", + "fieldtype": "Check", + "in_list_view": 0, + "label": "Page Break", + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "read_only": 0, + "report_hide": 1 + }, { "fieldname": "pr_detail", "fieldtype": "Data", @@ -421,7 +421,7 @@ ], "idx": 1, "istable": 1, - "modified": "2014-07-24 05:50:20.570629", + "modified": "2014-08-26 12:34:42.790959", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice Item", diff --git a/erpnext/buying/doctype/purchase_common/purchase_common.js b/erpnext/buying/doctype/purchase_common/purchase_common.js index 3c635089912..c2e76e2ab75 100644 --- a/erpnext/buying/doctype/purchase_common/purchase_common.js +++ b/erpnext/buying/doctype/purchase_common/purchase_common.js @@ -385,6 +385,6 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({ }); } }); - +cur_frm.add_fetch('project_name', 'cost_center', 'cost_center'); var tname = cur_frm.cscript.tname; var fname = cur_frm.cscript.fname; diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json index c7c459c5bc4..f7a5754fb08 100644 --- a/erpnext/projects/doctype/project/project.json +++ b/erpnext/projects/doctype/project/project.json @@ -1,5 +1,6 @@ { - "allow_import": 1, + "allow_attach": 1, + "allow_import": 1, "allow_rename": 1, "autoname": "field:project_name", "creation": "2013-03-07 11:55:07", @@ -207,6 +208,13 @@ "permlevel": 0, "search_index": 0 }, + { + "fieldname": "cost_center", + "fieldtype": "Link", + "label": "Default Cost Center", + "options": "Cost Center", + "permlevel": 0 + }, { "fieldname": "column_break0", "fieldtype": "Column Break", @@ -265,7 +273,7 @@ "icon": "icon-puzzle-piece", "idx": 1, "max_attachments": 4, - "modified": "2014-08-04 03:22:11.416219", + "modified": "2014-08-26 14:59:27.052172", "modified_by": "Administrator", "module": "Projects", "name": "Project", diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index 547e12aebc5..88e6e122feb 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -67,3 +67,7 @@ class Project(Document): def on_trash(self): delete_events(self.doctype, self.name) + +@frappe.whitelist() +def get_cost_center_name(project_name): + return frappe.db.get_value("Project", project_name, "cost_center") \ No newline at end of file diff --git a/erpnext/public/js/transaction.js b/erpnext/public/js/transaction.js index 801ea57d21a..4c0b341d489 100644 --- a/erpnext/public/js/transaction.js +++ b/erpnext/public/js/transaction.js @@ -151,7 +151,8 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ transaction_date: me.frm.doc.transaction_date, ignore_pricing_rule: me.frm.doc.ignore_pricing_rule, doctype: item.doctype, - name: item.name + name: item.name, + project_name: item.project_name || me.frm.doc.project_name } }, callback: function(r) { diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js index 20f1028d9ab..8bb05c694f9 100644 --- a/erpnext/selling/sales_common.js +++ b/erpnext/selling/sales_common.js @@ -585,3 +585,21 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ }); } }); + +frappe.ui.form.on(cur_frm.doctype,"project_name", function(frm) { + frappe.call({ + + method:'erpnext.projects.doctype.project.project.get_cost_center_name' , + args: { + project_name: frm.doc.project_name + }, + callback: function(r, rt) { + if(!r.exe) { + $.each(frm.doc[cur_frm.cscript.fname], function(i, row) { + frappe.model.set_value(row.doctype, row.name, "cost_center", r.message); + msgprint(__("Cost Center For Item with Item Code '"+row.item_name+"' has been Changed to "+ r.message)); + }) + } + } + }) +}) diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json index 0222e58da55..69c27556ce1 100755 --- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json +++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json @@ -300,16 +300,6 @@ "read_only": 0, "width": "100px" }, - { - "default": ":Company", - "depends_on": "eval:cint(sys_defaults.auto_accounting_for_stock)", - "fieldname": "cost_center", - "fieldtype": "Link", - "label": "Cost Center", - "options": "Cost Center", - "permlevel": 0, - "print_hide": 1 - }, { "fieldname": "project_name", "fieldtype": "Link", @@ -320,6 +310,16 @@ "print_hide": 1, "read_only": 0 }, + { + "default": ":Company", + "depends_on": "eval:cint(sys_defaults.auto_accounting_for_stock)", + "fieldname": "cost_center", + "fieldtype": "Link", + "label": "Cost Center", + "options": "Cost Center", + "permlevel": 0, + "print_hide": 1 + }, { "fieldname": "qa_no", "fieldtype": "Link", @@ -557,7 +557,7 @@ ], "idx": 1, "istable": 1, - "modified": "2014-08-11 12:48:13.509109", + "modified": "2014-08-26 12:38:04.065982", "modified_by": "Administrator", "module": "Stock", "name": "Purchase Receipt Item", diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index efb793deea0..fffb52e835f 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -29,6 +29,7 @@ def get_item_details(args): "is_subcontracted": "Yes" / "No", "transaction_type": "selling", "ignore_pricing_rule": 0/1 + "project_name": "", } """ args = process_args(args) @@ -149,7 +150,8 @@ def get_basic_details(args, item_doc): or args.expense_account or frappe.db.get_value("Item Group", item.item_group, "default_expense_account") or frappe.db.get_value("Company", args.company, "default_expense_account")), - "cost_center": ((item.selling_cost_center if args.transaction_type == "selling" else item.buying_cost_center) + "cost_center": (frappe.db.get_value("Project", args.project_name, "cost_center") + or (item.selling_cost_center if args.transaction_type == "selling" else item.buying_cost_center) or frappe.db.get_value("Item Group", item.item_group, "default_cost_center") or frappe.db.get_value("Company", args.company, "cost_center")), "batch_no": None, From 3b1733bc044942689baa3ef456c485a205272fb9 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 26 Aug 2014 16:20:38 +0530 Subject: [PATCH 02/14] minor fix in sales invoice test records --- erpnext/accounts/doctype/sales_invoice/test_records.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/erpnext/accounts/doctype/sales_invoice/test_records.json b/erpnext/accounts/doctype/sales_invoice/test_records.json index eb86672ccd1..76c70cc4169 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_records.json +++ b/erpnext/accounts/doctype/sales_invoice/test_records.json @@ -17,6 +17,7 @@ "description": "138-CMS Shoe", "doctype": "Sales Invoice Item", "income_account": "Sales - _TC", + "expense_account": "_Test Account Cost for Goods Sold - _TC", "item_name": "138-CMS Shoe", "parentfield": "entries", "qty": 1.0, @@ -137,6 +138,7 @@ "cost_center": "_Test Cost Center - _TC", "doctype": "Sales Invoice Item", "income_account": "Sales - _TC", + "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}", @@ -150,6 +152,7 @@ "cost_center": "_Test Cost Center - _TC", "doctype": "Sales Invoice Item", "income_account": "Sales - _TC", + "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", @@ -261,6 +264,7 @@ "cost_center": "_Test Cost Center - _TC", "doctype": "Sales Invoice Item", "income_account": "Sales - _TC", + "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}", @@ -273,6 +277,7 @@ "cost_center": "_Test Cost Center - _TC", "doctype": "Sales Invoice Item", "income_account": "Sales - _TC", + "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", From ad24069cdc10e0232d94d704c4b7cbf04b8a3529 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Tue, 26 Aug 2014 16:27:59 +0530 Subject: [PATCH 03/14] [fix] issue 448 final --- erpnext/public/js/transaction.js | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/public/js/transaction.js b/erpnext/public/js/transaction.js index 4c0b341d489..d5209c18744 100644 --- a/erpnext/public/js/transaction.js +++ b/erpnext/public/js/transaction.js @@ -155,6 +155,7 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({ project_name: item.project_name || me.frm.doc.project_name } }, + callback: function(r) { if(!r.exc) { me.frm.script_manager.trigger("price_list_rate", cdt, cdn); From d6d71e8078a3c50a39dc2071ebc7b62bc030fa25 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Wed, 27 Aug 2014 18:48:57 +0530 Subject: [PATCH 04/14] [fix] issue 448 final 1 --- erpnext/selling/sales_common.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js index 8bb05c694f9..66e935ab6fd 100644 --- a/erpnext/selling/sales_common.js +++ b/erpnext/selling/sales_common.js @@ -588,16 +588,13 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({ frappe.ui.form.on(cur_frm.doctype,"project_name", function(frm) { frappe.call({ - method:'erpnext.projects.doctype.project.project.get_cost_center_name' , - args: { - project_name: frm.doc.project_name - }, + args: { project_name: frm.doc.project_name }, callback: function(r, rt) { - if(!r.exe) { - $.each(frm.doc[cur_frm.cscript.fname], function(i, row) { + if(!r.exc) { + $.each(frm.doc[cur_frm.cscript.fname] || [], function(i, row) { frappe.model.set_value(row.doctype, row.name, "cost_center", r.message); - msgprint(__("Cost Center For Item with Item Code '"+row.item_name+"' has been Changed to "+ r.message)); + msgprint(__("Cost Center For Item with Item Code '"+row.item_name+"' has been Changed to "+ r.message)); }) } } From 37cb544839ac332900f9ecd662e1f3d36cabe634 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 28 Aug 2014 11:27:18 +0530 Subject: [PATCH 05/14] [fix] default quotation list filter --- erpnext/selling/doctype/quotation/quotation_list.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/quotation/quotation_list.js b/erpnext/selling/doctype/quotation/quotation_list.js index 91b65eeb9fb..bbc264d033f 100644 --- a/erpnext/selling/doctype/quotation/quotation_list.js +++ b/erpnext/selling/doctype/quotation/quotation_list.js @@ -1,5 +1,4 @@ frappe.listview_settings['Quotation'] = { add_fields: ["customer_name", "quotation_to", "grand_total", "status", - "company", "currency", "order_type", "lead", "customer"], - filters: [["status", "=", "Submitted"]] + "company", "currency", "order_type", "lead", "customer"] }; From f680626f535e415eb6b0af1589e9feca340e1ee0 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 27 Aug 2014 14:53:54 +0530 Subject: [PATCH 06/14] [minor] send translations in response --- erpnext/setup/page/setup_wizard/setup_wizard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.py b/erpnext/setup/page/setup_wizard/setup_wizard.py index 343cba56c42..1151b1ac8d0 100644 --- a/erpnext/setup/page/setup_wizard/setup_wizard.py +++ b/erpnext/setup/page/setup_wizard/setup_wizard.py @@ -7,7 +7,7 @@ import frappe, json from frappe.utils import cstr, flt, getdate from frappe import _ from frappe.utils.file_manager import save_file -from frappe.translate import set_default_language, get_dict, get_lang_dict +from frappe.translate import set_default_language, get_dict, get_lang_dict, send_translations from frappe.country_info import get_country_info from frappe.utils.nestedset import get_root_of from default_website import website_maker @@ -423,7 +423,7 @@ def load_messages(language): frappe.local.lang = lang m = get_dict("page", "setup-wizard") m.update(get_dict("boot")) - frappe.local.response["__messages"] = m + send_translations(m) return lang From bb370f3b6ac5176240fe5661919027eba85cdf76 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 27 Aug 2014 16:57:13 +0530 Subject: [PATCH 07/14] HR - Leave Approver and Expense Approver fields changed to Link Fields, better default permissions --- erpnext/hr/doctype/employee/employee.js | 21 +- erpnext/hr/doctype/employee/employee.json | 13 +- erpnext/hr/doctype/employee/employee.py | 10 - .../employee_leave_approver.json | 7 +- .../hr/doctype/expense_claim/expense_claim.js | 14 +- .../doctype/expense_claim/expense_claim.json | 9 +- .../expense_claim/test_expense_claim.py | 10 + .../doctype/expense_claim/test_records.json | 1 + .../leave_application/leave_application.js | 19 +- .../leave_application/leave_application.json | 459 +++++++++--------- .../leave_application/leave_application.py | 3 +- .../test_leave_application.py | 2 + .../leave_application/test_records.json | 1 + .../hr/doctype/salary_slip/salary_slip.json | 4 +- erpnext/hr/utils.py | 18 - 15 files changed, 285 insertions(+), 306 deletions(-) create mode 100644 erpnext/hr/doctype/expense_claim/test_expense_claim.py create mode 100644 erpnext/hr/doctype/expense_claim/test_records.json create mode 100644 erpnext/hr/doctype/leave_application/test_records.json diff --git a/erpnext/hr/doctype/employee/employee.js b/erpnext/hr/doctype/employee/employee.js index 0934bc592e9..b068bdea6fc 100644 --- a/erpnext/hr/doctype/employee/employee.js +++ b/erpnext/hr/doctype/employee/employee.js @@ -11,8 +11,12 @@ erpnext.hr.EmployeeController = frappe.ui.form.Controller.extend({ }, onload: function() { - this.setup_leave_approver_select(); if(this.frm.doc.__islocal) this.frm.set_value("employee_name", ""); + this.frm.set_query("leave_approver", "employee_leave_approvers", function() { + return { + filters: [["UserRole", "role", "=", "Leave Approver"]] + } + }); }, refresh: function() { @@ -25,21 +29,6 @@ erpnext.hr.EmployeeController = frappe.ui.form.Controller.extend({ } }, - setup_leave_approver_select: function() { - var me = this; - return this.frm.call({ - method: "erpnext.hr.utils.get_leave_approver_list", - callback: function(r) { - var df = frappe.meta.get_docfield("Employee Leave Approver", "leave_approver", - me.frm.doc.name); - df.options = $.map(r.message, function(user) { - return {value: user, label: frappe.user_info(user).fullname}; - }); - me.frm.fields_dict.employee_leave_approvers.refresh(); - } - }); - }, - date_of_birth: function() { return cur_frm.call({ method: "get_retirement_date", diff --git a/erpnext/hr/doctype/employee/employee.json b/erpnext/hr/doctype/employee/employee.json index 254e76344d7..7be1c40afaa 100644 --- a/erpnext/hr/doctype/employee/employee.json +++ b/erpnext/hr/doctype/employee/employee.json @@ -1,5 +1,5 @@ { - "allow_import": 1, + "allow_import": 1, "allow_rename": 1, "autoname": "naming_series:", "creation": "2013-03-07 09:04:18", @@ -172,6 +172,7 @@ { "fieldname": "employment_type", "fieldtype": "Link", + "ignore_user_permissions": 1, "in_filter": 1, "in_list_view": 1, "label": "Employment Type", @@ -185,6 +186,7 @@ "description": "Applicable Holiday List", "fieldname": "holiday_list", "fieldtype": "Link", + "ignore_user_permissions": 1, "label": "Holiday List", "oldfieldname": "holiday_list", "oldfieldtype": "Link", @@ -672,7 +674,7 @@ ], "icon": "icon-user", "idx": 1, - "modified": "2014-05-27 07:34:49.337586", + "modified": "2014-08-27 05:55:00.514660", "modified_by": "Administrator", "module": "HR", "name": "Employee", @@ -704,6 +706,7 @@ "report": 1, "role": "HR User", "submit": 0, + "user_permission_doctypes": "[\"Branch\",\"Company\",\"Department\",\"Designation\"]", "write": 1 }, { @@ -719,12 +722,6 @@ "set_user_permissions": 1, "submit": 0, "write": 1 - }, - { - "apply_user_permissions": 1, - "permlevel": 0, - "read": 1, - "role": "Leave Approver" } ], "search_fields": "employee_name", diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py index 01ab91db27d..5d4beaf75da 100644 --- a/erpnext/hr/doctype/employee/employee.py +++ b/erpnext/hr/doctype/employee/employee.py @@ -50,21 +50,11 @@ class Employee(Document): self.update_user_permissions() self.update_dob_event() - self.update_leave_approver_user_permissions() def update_user_permissions(self): frappe.permissions.add_user_permission("Employee", self.name, self.user_id) frappe.permissions.set_user_permission_if_allowed("Company", self.company, self.user_id) - def update_leave_approver_user_permissions(self): - """add employee user permission for leave approver""" - employee_leave_approvers = [d.leave_approver for d in self.get("employee_leave_approvers")] - if self.reports_to and self.reports_to not in employee_leave_approvers: - employee_leave_approvers.append(frappe.db.get_value("Employee", self.reports_to, "user_id")) - - for user in employee_leave_approvers: - frappe.permissions.add_user_permission("Employee", self.name, user) - def update_user(self): # add employee role if missing user = frappe.get_doc("User", self.user_id) diff --git a/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.json b/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.json index 0302bc95fa8..76335fb9717 100644 --- a/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.json +++ b/erpnext/hr/doctype/employee_leave_approver/employee_leave_approver.json @@ -8,10 +8,11 @@ "fields": [ { "fieldname": "leave_approver", - "fieldtype": "Select", + "fieldtype": "Link", + "ignore_user_permissions": 1, "in_list_view": 1, "label": "Leave Approver", - "options": "[Select]", + "options": "User", "permlevel": 0, "print_hide": 1, "reqd": 1, @@ -20,7 +21,7 @@ ], "idx": 1, "istable": 1, - "modified": "2014-05-15 19:32:14.134420", + "modified": "2014-08-27 06:21:36.887205", "modified_by": "Administrator", "module": "HR", "name": "Employee Leave Approver", diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.js b/erpnext/hr/doctype/expense_claim/expense_claim.js index 4ef2efc7221..70984458f72 100644 --- a/erpnext/hr/doctype/expense_claim/expense_claim.js +++ b/erpnext/hr/doctype/expense_claim/expense_claim.js @@ -57,14 +57,12 @@ cur_frm.cscript.onload = function(doc,cdt,cdn) { return{ query: "erpnext.controllers.queries.employee_query" } - } - var exp_approver = doc.exp_approver; - return cur_frm.call({ - method: "erpnext.hr.utils.get_expense_approver_list", - callback: function(r) { - cur_frm.set_df_property("exp_approver", "options", r.message); - if(exp_approver) cur_frm.set_value("exp_approver", exp_approver); - } + }; + + cur_frm.set_query("exp_approver", function() { + return { + filters: [["UserRole", "role", "=", "Expense Approver"]] + }; }); } diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.json b/erpnext/hr/doctype/expense_claim/expense_claim.json index c13710af3fe..15ef03ed178 100644 --- a/erpnext/hr/doctype/expense_claim/expense_claim.json +++ b/erpnext/hr/doctype/expense_claim/expense_claim.json @@ -20,11 +20,13 @@ "search_index": 1 }, { + "description": "A user with \"Expense Approver\" role", "fieldname": "exp_approver", - "fieldtype": "Select", + "fieldtype": "Link", "label": "Approver", "oldfieldname": "exp_approver", "oldfieldtype": "Select", + "options": "User", "permlevel": 0, "width": "160px" }, @@ -188,7 +190,7 @@ "icon": "icon-money", "idx": 1, "is_submittable": 1, - "modified": "2014-06-23 07:55:48.580747", + "modified": "2014-08-27 07:08:48.454580", "modified_by": "Administrator", "module": "HR", "name": "Expense Claim", @@ -204,6 +206,7 @@ "read": 1, "report": 1, "role": "Employee", + "user_permission_doctypes": "[\"Company\",\"Employee\",\"Expense Claim\",\"Fiscal Year\"]", "write": 1 }, { @@ -219,6 +222,7 @@ "report": 1, "role": "Expense Approver", "submit": 1, + "user_permission_doctypes": "[\"Expense Claim\",\"User\"]", "write": 1 }, { @@ -234,6 +238,7 @@ "report": 1, "role": "HR User", "submit": 1, + "user_permission_doctypes": "[\"Company\",\"Expense Claim\",\"Fiscal Year\"]", "write": 1 } ], diff --git a/erpnext/hr/doctype/expense_claim/test_expense_claim.py b/erpnext/hr/doctype/expense_claim/test_expense_claim.py new file mode 100644 index 00000000000..5a55cbfa4e2 --- /dev/null +++ b/erpnext/hr/doctype/expense_claim/test_expense_claim.py @@ -0,0 +1,10 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and Contributors +# See license.txt + +import frappe +import unittest + +test_records = frappe.get_test_records('Expense Claim') + +class TestExpenseClaim(unittest.TestCase): + pass diff --git a/erpnext/hr/doctype/expense_claim/test_records.json b/erpnext/hr/doctype/expense_claim/test_records.json new file mode 100644 index 00000000000..fe51488c706 --- /dev/null +++ b/erpnext/hr/doctype/expense_claim/test_records.json @@ -0,0 +1 @@ +[] diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js index acb91c6bbf4..0d8b37e9a46 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.js +++ b/erpnext/hr/doctype/leave_application/leave_application.js @@ -11,20 +11,13 @@ cur_frm.cscript.onload = function(doc, dt, dn) { cur_frm.cscript.calculate_total_days(doc, dt, dn); } - var leave_approver = doc.leave_approver; - return cur_frm.call({ - method: "erpnext.hr.utils.get_leave_approver_list", - callback: function(r) { - cur_frm.set_df_property("leave_approver", "options", $.map(r.message, - function(user) { - return {value: user, label: frappe.user_info(user).fullname}; - })); - - if(leave_approver) cur_frm.set_value("leave_approver", leave_approver); - - cur_frm.cscript.get_leave_balance(cur_frm.doc); - } + cur_frm.set_query("leave_approver", function() { + return { + filters: [["UserRole", "role", "=", "Leave Approver"]] + }; }); + + cur_frm.cscript.get_leave_balance(cur_frm.doc); } cur_frm.cscript.refresh = function(doc, dt, dn) { diff --git a/erpnext/hr/doctype/leave_application/leave_application.json b/erpnext/hr/doctype/leave_application/leave_application.json index 959f30d4e3a..98181500295 100644 --- a/erpnext/hr/doctype/leave_application/leave_application.json +++ b/erpnext/hr/doctype/leave_application/leave_application.json @@ -1,285 +1,294 @@ { - "autoname": "LAP/.#####", - "creation": "2013-02-20 11:18:11", - "description": "Apply / Approve Leaves", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Transaction", + "autoname": "LAP/.#####", + "creation": "2013-02-20 11:18:11", + "description": "Apply / Approve Leaves", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Transaction", "fields": [ { - "default": "Open", - "fieldname": "status", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Status", - "no_copy": 1, - "options": "Open\nApproved\nRejected", + "default": "Open", + "fieldname": "status", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Status", + "no_copy": 1, + "options": "Open\nApproved\nRejected", "permlevel": 1 - }, + }, { - "description": "Leave can be approved by users with Role, \"Leave Approver\"", - "fieldname": "leave_approver", - "fieldtype": "Select", - "label": "Leave Approver", - "options": "[Select]", + "description": "Leave can be approved by users with Role, \"Leave Approver\"", + "fieldname": "leave_approver", + "fieldtype": "Link", + "label": "Leave Approver", + "options": "User", "permlevel": 0 - }, + }, { - "fieldname": "leave_type", - "fieldtype": "Link", - "in_filter": 1, - "in_list_view": 1, - "label": "Leave Type", - "options": "Leave Type", - "permlevel": 0, - "reqd": 1, + "fieldname": "leave_type", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "in_filter": 1, + "in_list_view": 1, + "label": "Leave Type", + "options": "Leave Type", + "permlevel": 0, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "from_date", - "fieldtype": "Date", - "in_list_view": 1, - "label": "From Date", - "permlevel": 0, - "reqd": 1, + "fieldname": "from_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "From Date", + "permlevel": 0, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "to_date", - "fieldtype": "Date", - "in_list_view": 0, - "label": "To Date", - "permlevel": 0, - "reqd": 1, + "fieldname": "to_date", + "fieldtype": "Date", + "in_list_view": 0, + "label": "To Date", + "permlevel": 0, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "half_day", - "fieldtype": "Check", - "label": "Half Day", + "fieldname": "half_day", + "fieldtype": "Check", + "label": "Half Day", "permlevel": 0 - }, + }, { - "fieldname": "column_break1", - "fieldtype": "Column Break", - "permlevel": 0, - "print_width": "50%", + "fieldname": "column_break1", + "fieldtype": "Column Break", + "permlevel": 0, + "print_width": "50%", "width": "50%" - }, + }, { - "fieldname": "description", - "fieldtype": "Small Text", - "label": "Reason", + "fieldname": "description", + "fieldtype": "Small Text", + "label": "Reason", "permlevel": 0 - }, + }, { - "fieldname": "employee", - "fieldtype": "Link", - "in_filter": 1, - "label": "Employee", - "options": "Employee", - "permlevel": 0, - "reqd": 1, + "fieldname": "employee", + "fieldtype": "Link", + "in_filter": 1, + "label": "Employee", + "options": "Employee", + "permlevel": 0, + "reqd": 1, "search_index": 1 - }, + }, { - "fieldname": "employee_name", - "fieldtype": "Data", - "in_filter": 1, - "in_list_view": 1, - "label": "Employee Name", - "permlevel": 0, - "read_only": 1, + "fieldname": "employee_name", + "fieldtype": "Data", + "in_filter": 1, + "in_list_view": 1, + "label": "Employee Name", + "permlevel": 0, + "read_only": 1, "search_index": 0 - }, + }, { - "fieldname": "leave_balance", - "fieldtype": "Float", - "label": "Leave Balance Before Application", - "no_copy": 1, - "permlevel": 0, + "fieldname": "leave_balance", + "fieldtype": "Float", + "label": "Leave Balance Before Application", + "no_copy": 1, + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "total_leave_days", - "fieldtype": "Float", - "label": "Total Leave Days", - "no_copy": 1, - "permlevel": 0, + "fieldname": "total_leave_days", + "fieldtype": "Float", + "label": "Total Leave Days", + "no_copy": 1, + "permlevel": 0, "read_only": 1 - }, + }, { - "fieldname": "sb10", - "fieldtype": "Section Break", - "label": "More Info", + "fieldname": "sb10", + "fieldtype": "Section Break", + "label": "More Info", "permlevel": 0 - }, + }, { - "allow_on_submit": 1, - "default": "1", - "fieldname": "follow_via_email", - "fieldtype": "Check", - "label": "Follow via Email", - "permlevel": 0, + "allow_on_submit": 1, + "default": "1", + "fieldname": "follow_via_email", + "fieldtype": "Check", + "label": "Follow via Email", + "permlevel": 0, "print_hide": 1 - }, + }, { - "default": "Today", - "fieldname": "posting_date", - "fieldtype": "Date", - "label": "Posting Date", - "no_copy": 1, - "permlevel": 0, + "default": "Today", + "fieldname": "posting_date", + "fieldtype": "Date", + "label": "Posting Date", + "no_copy": 1, + "permlevel": 0, "reqd": 1 - }, + }, { - "fieldname": "fiscal_year", - "fieldtype": "Link", - "in_filter": 1, - "label": "Fiscal Year", - "options": "Fiscal Year", - "permlevel": 0, - "read_only": 0, - "reqd": 1, + "fieldname": "fiscal_year", + "fieldtype": "Link", + "in_filter": 1, + "label": "Fiscal Year", + "options": "Fiscal Year", + "permlevel": 0, + "read_only": 0, + "reqd": 1, "search_index": 0 - }, + }, { - "fieldname": "column_break_17", - "fieldtype": "Column Break", + "fieldname": "column_break_17", + "fieldtype": "Column Break", "permlevel": 0 - }, + }, { - "fieldname": "company", - "fieldtype": "Link", - "label": "Company", - "options": "Company", - "permlevel": 0, + "fieldname": "company", + "fieldtype": "Link", + "label": "Company", + "options": "Company", + "permlevel": 0, "reqd": 1 - }, + }, { - "fieldname": "letter_head", - "fieldtype": "Link", - "label": "Letter Head", - "options": "Letter Head", - "permlevel": 0, - "print_hide": 1, + "fieldname": "letter_head", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "label": "Letter Head", + "options": "Letter Head", + "permlevel": 0, + "print_hide": 1, "read_only": 0 - }, + }, { - "fieldname": "amended_from", - "fieldtype": "Link", - "ignore_user_permissions": 1, - "label": "Amended From", - "no_copy": 1, - "options": "Leave Application", - "permlevel": 0, - "print_hide": 1, + "fieldname": "amended_from", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "label": "Amended From", + "no_copy": 1, + "options": "Leave Application", + "permlevel": 0, + "print_hide": 1, "read_only": 1 } - ], - "icon": "icon-calendar", - "idx": 1, - "is_submittable": 1, - "max_attachments": 3, - "modified": "2014-06-06 05:06:44.594229", - "modified_by": "Administrator", - "module": "HR", - "name": "Leave Application", - "owner": "Administrator", + ], + "icon": "icon-calendar", + "idx": 1, + "is_submittable": 1, + "max_attachments": 3, + "modified": "2014-08-28 03:32:38.865202", + "modified_by": "Administrator", + "module": "HR", + "name": "Leave Application", + "owner": "Administrator", "permissions": [ { - "apply_user_permissions": 1, - "create": 1, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Employee", + "apply_user_permissions": 1, + "create": 1, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "user_permission_doctypes": "[\"Company\",\"Employee\",\"Fiscal Year\",\"Leave Application\"]", "write": 1 - }, + }, { - "amend": 1, - "cancel": 1, - "create": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR Manager", - "set_user_permissions": 1, - "submit": 1, + "amend": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "set_user_permissions": 1, + "submit": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 1, - "read": 1, - "role": "All", + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 1, + "read": 1, + "role": "All", "submit": 0 - }, + }, { - "amend": 1, - "apply_user_permissions": 1, - "cancel": 1, - "create": 1, - "delete": 1, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "HR User", - "set_user_permissions": 1, - "submit": 1, + "amend": 1, + "apply_user_permissions": 1, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "set_user_permissions": 1, + "submit": 1, + "user_permission_doctypes": "[\"Company\"]", "write": 1 - }, + }, { - "amend": 1, - "apply_user_permissions": 1, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Leave Approver", - "submit": 1, + "amend": 1, + "apply_user_permissions": 1, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Leave Approver", + "submit": 1, + "user_permission_doctypes": "[\"Company\",\"User\"]", "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 1, - "read": 1, - "report": 1, - "role": "HR User", - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 1, + "read": 1, + "report": 1, + "role": "HR User", + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "permlevel": 1, - "read": 1, - "report": 1, - "role": "Leave Approver", - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "permlevel": 1, + "read": 1, + "report": 1, + "role": "Leave Approver", + "submit": 0, "write": 1 } - ], - "search_fields": "employee,employee_name,leave_type,from_date,to_date,total_leave_days,fiscal_year", - "sort_field": "modified", + ], + "search_fields": "employee,employee_name,leave_type,from_date,to_date,total_leave_days,fiscal_year", + "sort_field": "modified", "sort_order": "DESC" -} +} \ No newline at end of file diff --git a/erpnext/hr/doctype/leave_application/leave_application.py b/erpnext/hr/doctype/leave_application/leave_application.py index 3222a0c2166..32c4443261e 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.py +++ b/erpnext/hr/doctype/leave_application/leave_application.py @@ -155,8 +155,7 @@ class LeaveApplication(Document): def validate_leave_approver(self): employee = frappe.get_doc("Employee", self.employee) - leave_approvers = [l.leave_approver for l in - employee.get("employee_leave_approvers")] + leave_approvers = [l.leave_approver for l in employee.get("employee_leave_approvers")] if len(leave_approvers) and self.leave_approver not in leave_approvers: frappe.throw(_("Leave approver must be one of {0}").format(comma_or(leave_approvers)), InvalidLeaveApproverError) diff --git a/erpnext/hr/doctype/leave_application/test_leave_application.py b/erpnext/hr/doctype/leave_application/test_leave_application.py index f5476407bd6..7ad28dec162 100644 --- a/erpnext/hr/doctype/leave_application/test_leave_application.py +++ b/erpnext/hr/doctype/leave_application/test_leave_application.py @@ -91,6 +91,7 @@ class TestLeaveApplication(unittest.TestCase): from frappe.utils.user import add_role add_role("test1@example.com", "HR User") + add_role("test1@example.com", "Leave Approver") clear_user_permissions_for_doctype("Employee") frappe.db.set_value("Department", "_Test Department", @@ -157,6 +158,7 @@ class TestLeaveApplication(unittest.TestCase): from frappe.utils.user import add_role add_role("test@example.com", "Employee") + add_role("test1@example.com", "HR User") add_role("test1@example.com", "Leave Approver") add_role("test2@example.com", "Leave Approver") diff --git a/erpnext/hr/doctype/leave_application/test_records.json b/erpnext/hr/doctype/leave_application/test_records.json new file mode 100644 index 00000000000..fe51488c706 --- /dev/null +++ b/erpnext/hr/doctype/leave_application/test_records.json @@ -0,0 +1 @@ +[] diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.json b/erpnext/hr/doctype/salary_slip/salary_slip.json index 88a7ef2ae9d..b288c50cecc 100644 --- a/erpnext/hr/doctype/salary_slip/salary_slip.json +++ b/erpnext/hr/doctype/salary_slip/salary_slip.json @@ -74,6 +74,7 @@ { "fieldname": "letter_head", "fieldtype": "Link", + "ignore_user_permissions": 1, "label": "Letter Head", "options": "Letter Head", "permlevel": 0, @@ -335,7 +336,7 @@ "icon": "icon-file-text", "idx": 1, "is_submittable": 1, - "modified": "2014-07-21 07:58:08.033784", + "modified": "2014-08-27 06:38:10.006224", "modified_by": "Administrator", "module": "HR", "name": "Salary Slip", @@ -353,6 +354,7 @@ "report": 1, "role": "HR User", "submit": 1, + "user_permission_doctypes": "[\"Branch\",\"Company\",\"Department\",\"Designation\",\"Fiscal Year\",\"Salary Slip\"]", "write": 1 }, { diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py index 857f936e9ed..5d165c3ee4d 100644 --- a/erpnext/hr/utils.py +++ b/erpnext/hr/utils.py @@ -5,24 +5,6 @@ from __future__ import unicode_literals import frappe from frappe import _ -@frappe.whitelist() -def get_leave_approver_list(): - roles = [r[0] for r in frappe.db.sql("""select distinct parent from `tabUserRole` - where role='Leave Approver'""")] - if not roles: - frappe.msgprint(_("No Leave Approvers. Please assign 'Leave Approver' Role to atleast one user")) - - return roles - - -@frappe.whitelist() -def get_expense_approver_list(): - roles = [r[0] for r in frappe.db.sql("""select distinct parent from `tabUserRole` - where role='Expense Approver'""")] - if not roles: - frappe.msgprint(_("No Expense Approvers. Please assign 'Expense Approver' Role to atleast one user")) - return roles - def set_employee_name(doc): if doc.employee and not doc.employee_name: doc.employee_name = frappe.db.get_value("Employee", doc.employee, "employee_name") From 818bacae491b591d167657e14f70384c29c8f863 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 28 Aug 2014 11:45:12 +0530 Subject: [PATCH 08/14] Minor fix in maintenance schedule --- .../maintenance_schedule.json | 15 ++++++++++++--- .../test_maintenance_schedule.py | 10 ++++++++++ .../maintenance_schedule/test_records.json | 6 ++++++ 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py create mode 100644 erpnext/support/doctype/maintenance_schedule/test_records.json diff --git a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.json b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.json index 7035f43215d..56344b19dfd 100644 --- a/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.json +++ b/erpnext/support/doctype/maintenance_schedule/maintenance_schedule.json @@ -1,6 +1,6 @@ { "autoname": "MS.#####", - "creation": "2013-01-10 16:34:30.000000", + "creation": "2013-01-10 16:34:30", "docstatus": 0, "doctype": "DocType", "fields": [ @@ -213,12 +213,21 @@ "permlevel": 0, "reqd": 1, "search_index": 0 + }, + { + "fieldname": "amended_from", + "fieldtype": "Link", + "label": "Amended From", + "no_copy": 1, + "options": "Maintenance Schedule", + "print_hide": 1, + "read_only": 1 } ], "icon": "icon-calendar", "idx": 1, "is_submittable": 1, - "modified": "2014-01-20 17:48:56.000000", + "modified": "2014-08-28 11:39:17.152817", "modified_by": "Administrator", "module": "Support", "name": "Maintenance Schedule", @@ -239,5 +248,5 @@ "write": 1 } ], - "search_fields": "status,customer,customer_name, sales_order_no" + "search_fields": "status,customer,customer_name" } \ No newline at end of file diff --git a/erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py b/erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py new file mode 100644 index 00000000000..c2c6e013ecd --- /dev/null +++ b/erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py @@ -0,0 +1,10 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and Contributors +# See license.txt + +import frappe +import unittest + +test_records = frappe.get_test_records('Maintenance Schedule') + +class TestMaintenanceSchedule(unittest.TestCase): + pass diff --git a/erpnext/support/doctype/maintenance_schedule/test_records.json b/erpnext/support/doctype/maintenance_schedule/test_records.json new file mode 100644 index 00000000000..8c2a0595b8f --- /dev/null +++ b/erpnext/support/doctype/maintenance_schedule/test_records.json @@ -0,0 +1,6 @@ +[ + { + "doctype": "Maintenance Schedule", + "name": "_Test Maintenance Schedule 1" + } +] From 14b8af2e6537a02ad97e4c653830f98e9a4c1732 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 28 Aug 2014 12:42:28 +0530 Subject: [PATCH 09/14] Rounding issue fixed for bom quantity --- erpnext/controllers/buying_controller.py | 5 ++-- erpnext/manufacturing/doctype/bom/bom.py | 24 +++++++++++-------- .../production_planning_tool.py | 15 ++++++------ 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py index 8bc0c9d5766..5f418c4df26 100644 --- a/erpnext/controllers/buying_controller.py +++ b/erpnext/controllers/buying_controller.py @@ -197,7 +197,7 @@ class BuyingController(StockController): landed_cost_voucher_amount = flt(item.landed_cost_voucher_amount) \ if self.doctype == "Purchase Receipt" else 0.0 - + item.valuation_rate = ((item.base_amount + item.item_tax_amount + rm_supp_cost + landed_cost_voucher_amount) / qty_in_stock_uom) else: @@ -289,7 +289,8 @@ class BuyingController(StockController): self.append(raw_material_table, d) def get_items_from_default_bom(self, item_code): - bom_items = frappe.db.sql("""select t2.item_code, t2.qty_consumed_per_unit, + bom_items = frappe.db.sql("""select t2.item_code, + ifnull(t2.qty, 0) / ifnull(t1.quantity, 1) as qty_consumed_per_unit, t2.rate, t2.stock_uom, t2.name, t2.description from `tabBOM` t1, `tabBOM Item` t2 where t2.parent = t1.name and t1.item = %s and t1.is_default = 1 diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index ffcbbd9920d..5fa2cc75645 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -288,8 +288,8 @@ class BOM(Document): for d in self.get('bom_materials'): if d.bom_no: d.rate = self.get_bom_unitcost(d.bom_no) - d.amount = flt(d.rate) * flt(d.qty) - d.qty_consumed_per_unit = flt(d.qty) / flt(self.quantity) + d.amount = flt(d.rate, self.precision("rate", d)) * flt(d.qty, self.precision("qty", d)) + d.qty_consumed_per_unit = flt(d.qty, self.precision("qty", d)) / flt(self.quantity, self.precision("quantity")) total_rm_cost += d.amount self.raw_material_cost = total_rm_cost @@ -322,17 +322,19 @@ class BOM(Document): def get_child_exploded_items(self, bom_no, qty): """ Add all items from Flat BOM of child BOM""" - - child_fb_items = frappe.db.sql("""select item_code, description, stock_uom, qty, rate, - qty_consumed_per_unit from `tabBOM Explosion Item` - where parent = %s and docstatus = 1""", bom_no, as_dict = 1) + # Did not use qty_consumed_per_unit in the query, as it leads to rounding loss + child_fb_items = frappe.db.sql("""select bom_item.item_code, bom_item.description, + bom_item.stock_uom, bom_item.qty, bom_item.rate, + ifnull(bom_item.qty, 0 ) / ifnull(bom.quantity, 1) as qty_consumed_per_unit + from `tabBOM Explosion Item` bom_item, tabBOM bom + where bom_item.parent = bom.name and bom.name = %s and bom.docstatus = 1""", bom_no, as_dict = 1) for d in child_fb_items: self.add_to_cur_exploded_items(frappe._dict({ 'item_code' : d['item_code'], 'description' : d['description'], 'stock_uom' : d['stock_uom'], - 'qty' : flt(d['qty_consumed_per_unit'])*qty, + 'qty' : d['qty_consumed_per_unit']*qty, 'rate' : flt(d['rate']), })) @@ -362,19 +364,21 @@ class BOM(Document): def get_bom_items_as_dict(bom, qty=1, fetch_exploded=1): item_dict = {} + # Did not use qty_consumed_per_unit in the query, as it leads to rounding loss query = """select bom_item.item_code, item.item_name, - ifnull(sum(bom_item.qty_consumed_per_unit),0) * %(qty)s as qty, + sum(ifnull(bom_item.qty, 0)/ifnull(bom.quantity, 1)) * %(qty)s as qty, item.description, item.stock_uom, item.default_warehouse, item.expense_account as expense_account, item.buying_cost_center as cost_center from - `tab%(table)s` bom_item, `tabItem` item + `tab%(table)s` bom_item, `tabBOM` bom, `tabItem` item where - bom_item.docstatus < 2 + bom_item.parent = bom.name + and bom_item.docstatus < 2 and bom_item.parent = "%(bom)s" and item.name = bom_item.item_code %(conditions)s diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py index 945c77e5356..547ca8b4ac6 100644 --- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py +++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py @@ -250,23 +250,24 @@ class ProductionPlanningTool(Document): bom_wise_item_details = {} if self.use_multi_level_bom: # get all raw materials with sub assembly childs + # Did not use qty_consumed_per_unit in the query, as it leads to rounding loss for d in frappe.db.sql("""select fb.item_code, - ifnull(sum(fb.qty_consumed_per_unit), 0) as qty, + ifnull(sum(ifnull(fb.qty, 0)/ifnull(bom.quantity, 1)), 0) as qty, fb.description, fb.stock_uom, it.min_order_qty - from `tabBOM Explosion Item` fb,`tabItem` it - where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No' + from `tabBOM Explosion Item` fb, `tabBOM` bom, `tabItem` it + where bom.name = fb.parent and it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No' and ifnull(it.is_sub_contracted_item, 'No') = 'No' - and fb.docstatus<2 and fb.parent=%s + and fb.docstatus<2 and bom.name=%s group by item_code, stock_uom""", bom, as_dict=1): bom_wise_item_details.setdefault(d.item_code, d) else: # Get all raw materials considering SA items as raw materials, # so no childs of SA items for d in frappe.db.sql("""select bom_item.item_code, - ifnull(sum(bom_item.qty_consumed_per_unit), 0) as qty, + ifnull(sum(ifnull(bom_item.qty, 0)/ifnull(bom.quantity, 1)), 0) as qty, bom_item.description, bom_item.stock_uom, item.min_order_qty - from `tabBOM Item` bom_item, tabItem item - where bom_item.parent = %s and bom_item.docstatus < 2 + from `tabBOM Item` bom_item, `tabBOM` bom, tabItem item + where bom.name = bom_item.parent and bom.name = %s and bom_item.docstatus < 2 and bom_item.item_code = item.name group by item_code""", bom, as_dict=1): bom_wise_item_details.setdefault(d.item_code, d) From 0514e07ef4c792f67cc082bf90a3e1d70bcef0bb Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 29 Aug 2014 11:50:52 +0530 Subject: [PATCH 10/14] minor fix --- .../maintenance_schedule/test_maintenance_schedule.py | 10 ---------- .../doctype/maintenance_schedule/test_records.json | 6 ------ 2 files changed, 16 deletions(-) delete mode 100644 erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py delete mode 100644 erpnext/support/doctype/maintenance_schedule/test_records.json diff --git a/erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py b/erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py deleted file mode 100644 index c2c6e013ecd..00000000000 --- a/erpnext/support/doctype/maintenance_schedule/test_maintenance_schedule.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors and Contributors -# See license.txt - -import frappe -import unittest - -test_records = frappe.get_test_records('Maintenance Schedule') - -class TestMaintenanceSchedule(unittest.TestCase): - pass diff --git a/erpnext/support/doctype/maintenance_schedule/test_records.json b/erpnext/support/doctype/maintenance_schedule/test_records.json deleted file mode 100644 index 8c2a0595b8f..00000000000 --- a/erpnext/support/doctype/maintenance_schedule/test_records.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - { - "doctype": "Maintenance Schedule", - "name": "_Test Maintenance Schedule 1" - } -] From 014346acbabf478431da220d71d6126d0bd874c0 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Wed, 27 Aug 2014 16:35:59 +0530 Subject: [PATCH 11/14] [print-template] Credit Note --- .../accounts/print_format/credit_note/__init__.py | 0 .../print_format/credit_note/credit_note.json | 15 +++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 erpnext/accounts/print_format/credit_note/__init__.py create mode 100644 erpnext/accounts/print_format/credit_note/credit_note.json diff --git a/erpnext/accounts/print_format/credit_note/__init__.py b/erpnext/accounts/print_format/credit_note/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/print_format/credit_note/credit_note.json b/erpnext/accounts/print_format/credit_note/credit_note.json new file mode 100644 index 00000000000..0b231a3d2a0 --- /dev/null +++ b/erpnext/accounts/print_format/credit_note/credit_note.json @@ -0,0 +1,15 @@ +{ + "creation": "2014-08-27 14:39:00.593377", + "disabled": 0, + "doc_type": "Journal Voucher", + "docstatus": 0, + "doctype": "Print Format", + "html": "
\n\n\t{% if letter_head and not no_letterhead %}{{ letter_head }}{%- endif -%}\n\t

{{ _(\"Credit Note\") }}

\n
\n\t
\n\t
\n\t
{{ doc.pay_to_recd_from }}
\n\t
\n\t
\n\t
\n\t
{{ doc.name }}
\n\t
\n\t
\n\t
\n\t
{{ frappe.utils.formatdate(doc.voucher_date) }}
\n\t
\n\t
\n\t
\n\t
{{ doc.cheque_no }}
\n\t
\n\t
\n\t
\n\t
{{ frappe.utils.formatdate(doc.cheque_date) }}
\n\t
\n\t
\n\t
\n\t
{{ frappe.utils.formatdate(doc.voucher_date) }}
\n\t
\n\t
\n\t

{{ _(\"This amount is in full / part settlement of the listed bills\") }}:

\n\t
\n\t
\n\t
\n\t
{{ \n\t \tfrappe.format_value(doc.total_amount, doc.meta.get_field(\"total_amount\"), doc) }}
\n\t
\n\t
\n\t
\n\t
{{ doc.remark }}
\n\t
\n\n\t
\n\t\tPrepared By
\n\t
\n\t\tAuthorised Signatory
\n\t
\n\t\tReceived Payment as Above
\n\t
\n\t\t_____________
\n\t
\n\t\tA/C Payee
\n\t
\n\t\t_____________
\n\t
\n\t\t{{ frappe.utils.formatdate(doc.cheque_date) }}
\n\t
\n\t\t{{ doc.pay_to_recd_from }}
\n\t
\n\t\t{{ doc.total_amount_in_words }}
\n\t
\n\t\t{{ doc.total_amount }}
\n
", + "modified": "2014-08-27 14:49:40.088410", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Credit Note", + "owner": "Administrator", + "print_format_type": "Server", + "standard": "Yes" +} \ No newline at end of file From 7a435bb4f18a629f7c95973bda4b3675efc5b54d Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Wed, 27 Aug 2014 18:10:23 +0530 Subject: [PATCH 12/14] [print-template] Credit Note Issue #31 1 --- .../print_format/credit_note/credit_note.json | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/print_format/credit_note/credit_note.json b/erpnext/accounts/print_format/credit_note/credit_note.json index 0b231a3d2a0..bbb04635f21 100644 --- a/erpnext/accounts/print_format/credit_note/credit_note.json +++ b/erpnext/accounts/print_format/credit_note/credit_note.json @@ -4,7 +4,43 @@ "doc_type": "Journal Voucher", "docstatus": 0, "doctype": "Print Format", - "html": "
\n\n\t{% if letter_head and not no_letterhead %}{{ letter_head }}{%- endif -%}\n\t

{{ _(\"Credit Note\") }}

\n
\n\t
\n\t
\n\t
{{ doc.pay_to_recd_from }}
\n\t
\n\t
\n\t
\n\t
{{ doc.name }}
\n\t
\n\t
\n\t
\n\t
{{ frappe.utils.formatdate(doc.voucher_date) }}
\n\t
\n\t
\n\t
\n\t
{{ doc.cheque_no }}
\n\t
\n\t
\n\t
\n\t
{{ frappe.utils.formatdate(doc.cheque_date) }}
\n\t
\n\t
\n\t
\n\t
{{ frappe.utils.formatdate(doc.voucher_date) }}
\n\t
\n\t
\n\t

{{ _(\"This amount is in full / part settlement of the listed bills\") }}:

\n\t
\n\t
\n\t
\n\t
{{ \n\t \tfrappe.format_value(doc.total_amount, doc.meta.get_field(\"total_amount\"), doc) }}
\n\t
\n\t
\n\t
\n\t
{{ doc.remark }}
\n\t
\n\n\t
\n\t\tPrepared By
\n\t
\n\t\tAuthorised Signatory
\n\t
\n\t\tReceived Payment as Above
\n\t
\n\t\t_____________
\n\t
\n\t\tA/C Payee
\n\t
\n\t\t_____________
\n\t
\n\t\t{{ frappe.utils.formatdate(doc.cheque_date) }}
\n\t
\n\t\t{{ doc.pay_to_recd_from }}
\n\t
\n\t\t{{ doc.total_amount_in_words }}
\n\t
\n\t\t{{ doc.total_amount }}
\n
", + "html": "

{{ doc.select_print_heading or _("Credit Note") }}

+
+
+
+
{{ doc.name }}
+
+
+
+
{{ frappe.utils.formatdate(doc.voucher_date) }}
+
+
+
+
{{ _("Credit Note ") }}
+
+
+
+
{{ doc.pay_to_recd_from }}
+
+
+ +
+
+
+
+
+
+
+
{{ doc.remark }}
+
+
+
+

+{{ _("For") }} {{ doc.company }},
+
+
+
+{{ _("Authorized Signatory") }}

", "modified": "2014-08-27 14:49:40.088410", "modified_by": "Administrator", "module": "Accounts", From 9f0ea97d8540e640e47d13054748a367d5f74d31 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 27 Aug 2014 22:09:03 +0530 Subject: [PATCH 13/14] [fix] get future vouchers query [print-template] Credit Note Issue #31 2 --- .../print_format/credit_note/credit_note.json | 46 +++---------------- 1 file changed, 7 insertions(+), 39 deletions(-) diff --git a/erpnext/accounts/print_format/credit_note/credit_note.json b/erpnext/accounts/print_format/credit_note/credit_note.json index bbb04635f21..4b32cc8f5c0 100644 --- a/erpnext/accounts/print_format/credit_note/credit_note.json +++ b/erpnext/accounts/print_format/credit_note/credit_note.json @@ -1,51 +1,19 @@ { - "creation": "2014-08-27 14:39:00.593377", + "creation": "2014-08-28 11:11:39.796473", "disabled": 0, "doc_type": "Journal Voucher", "docstatus": 0, "doctype": "Print Format", - "html": "

{{ doc.select_print_heading or _("Credit Note") }}

-
-
-
-
{{ doc.name }}
-
-
-
-
{{ frappe.utils.formatdate(doc.voucher_date) }}
-
-
-
-
{{ _("Credit Note ") }}
-
-
-
-
{{ doc.pay_to_recd_from }}
-
-
- -
-
-
-
-
-
-
-
{{ doc.remark }}
-
-
-
-

-{{ _("For") }} {{ doc.company }},
-
-
-
-{{ _("Authorized Signatory") }}

", - "modified": "2014-08-27 14:49:40.088410", + "html": "

{{ doc.select_print_heading or _(\"Credit Note\") }}

\n
\n
\n
\n
{{ doc.name }}
\n
\n
\n
\n
{{ frappe.utils.formatdate(doc.voucher_date) }}
\n
\n
\n
\n
{{ _(\"Credit Note \") }}
\n
\n
\n
\n
{{ doc.pay_to_recd_from }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ doc.remark }}
\n
\n
\n
\n

\n{{ _(\"For\") }} {{ doc.company }},
\n
\n
\n
\n{{ _(\"Authorized Signatory\") }}

\n", + "idx": 2, + "modified": "2014-08-28 11:15:38.677618", "modified_by": "Administrator", "module": "Accounts", "name": "Credit Note", "owner": "Administrator", + "parent": "Journal Voucher", + "parentfield": "__print_formats", + "parenttype": "DocType", "print_format_type": "Server", "standard": "Yes" } \ No newline at end of file From 4e16e9ed897fd1b39317314d48ba7485e69fcf92 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Fri, 29 Aug 2014 13:20:58 +0530 Subject: [PATCH 14/14] Refactored Credit Note Print Format --- erpnext/accounts/doctype/journal_voucher/journal_voucher.py | 2 +- erpnext/accounts/print_format/credit_note/credit_note.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py index cb2ebace26e..03bedc708d9 100644 --- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py +++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py @@ -203,7 +203,7 @@ class JournalVoucher(AccountsController): if account_type in ['Bank', 'Cash']: company_currency = get_company_currency(self.company) amt = flt(d.debit) and d.debit or d.credit - self.total_amount = company_currency + ' ' + cstr(amt) + self.total_amount = fmt_money(amt, currency=company_currency) from frappe.utils import money_in_words self.total_amount_in_words = money_in_words(amt, company_currency) diff --git a/erpnext/accounts/print_format/credit_note/credit_note.json b/erpnext/accounts/print_format/credit_note/credit_note.json index 4b32cc8f5c0..31507b480d3 100644 --- a/erpnext/accounts/print_format/credit_note/credit_note.json +++ b/erpnext/accounts/print_format/credit_note/credit_note.json @@ -4,9 +4,9 @@ "doc_type": "Journal Voucher", "docstatus": 0, "doctype": "Print Format", - "html": "

{{ doc.select_print_heading or _(\"Credit Note\") }}

\n
\n
\n
\n
{{ doc.name }}
\n
\n
\n
\n
{{ frappe.utils.formatdate(doc.voucher_date) }}
\n
\n
\n
\n
{{ _(\"Credit Note \") }}
\n
\n
\n
\n
{{ doc.pay_to_recd_from }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ doc.remark }}
\n
\n
\n
\n

\n{{ _(\"For\") }} {{ doc.company }},
\n
\n
\n
\n{{ _(\"Authorized Signatory\") }}

\n", + "html": "{%- from \"templates/print_formats/standard_macros.html\" import add_header -%}\n\n
\n {%- if not doc.get(\"print_heading\") and not doc.get(\"select_print_heading\") \n and doc.set(\"select_print_heading\", _(\"Credit Note\")) -%}{%- endif -%}\n {{ add_header(0, 1, doc, letter_head, no_letterhead) }}\n\n {%- for label, value in (\n (_(\"Credit To\"), doc.pay_to_recd_from),\n (_(\"Date\"), frappe.utils.formatdate(doc.voucher_date)),\n (_(\"Amount\"), \"\" + doc.total_amount + \"
\" + (doc.total_amount_in_words or \"\") + \"
\"),\n (_(\"Remarks\"), doc.remark)\n ) -%}\n\n
\n
\n
{{ value }}
\n
\n\n {%- endfor -%}\n\n
\n
\n

\n {{ _(\"For\") }} {{ doc.company }},
\n
\n
\n
\n {{ _(\"Authorized Signatory\") }}\n

\n
\n\n\n", "idx": 2, - "modified": "2014-08-28 11:15:38.677618", + "modified": "2014-08-29 13:20:15.789533", "modified_by": "Administrator", "module": "Accounts", "name": "Credit Note",