Merge branch 'develop' of https://github.com/frappe/erpnext into print-templates-fix

This commit is contained in:
Neil Trini Lasrado 2014-08-29 15:48:42 +05:30
commit 45a0ea9628
33 changed files with 423 additions and 380 deletions

View File

@ -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",

View File

@ -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)

View File

@ -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",

View File

@ -0,0 +1,19 @@
{
"creation": "2014-08-28 11:11:39.796473",
"disabled": 0,
"doc_type": "Journal Voucher",
"docstatus": 0,
"doctype": "Print Format",
"html": "{%- from \"templates/print_formats/standard_macros.html\" import add_header -%}\n\n<div class=\"page-break\">\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\"), \"<strong>\" + doc.total_amount + \"</strong><br>\" + (doc.total_amount_in_words or \"\") + \"<br>\"),\n (_(\"Remarks\"), doc.remark)\n ) -%}\n\n <div class=\"row\">\n <div class=\"col-sm-3\"><label class=\"text-right\">{{ label }}</label></div>\n <div class=\"col-sm-9\">{{ value }}</div>\n </div>\n\n {%- endfor -%}\n\n <hr>\n <br>\n <p class=\"strong\">\n {{ _(\"For\") }} {{ doc.company }},<br>\n <br>\n <br>\n <br>\n {{ _(\"Authorized Signatory\") }}\n </p>\n</div>\n\n\n",
"idx": 2,
"modified": "2014-08-29 13:20:15.789533",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Credit Note",
"owner": "Administrator",
"parent": "Journal Voucher",
"parentfield": "__print_formats",
"parenttype": "DocType",
"print_format_type": "Server",
"standard": "Yes"
}

View File

@ -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;

View File

@ -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

View File

@ -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",

View File

@ -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",

View File

@ -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)

View File

@ -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",

View File

@ -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"]]
};
});
}

View File

@ -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
}
],

View File

@ -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

View File

@ -0,0 +1 @@
[]

View File

@ -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) {

View File

@ -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"
}
}

View File

@ -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)

View File

@ -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")

View File

@ -0,0 +1 @@
[]

View File

@ -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
},
{

View File

@ -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")

View File

@ -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

View File

@ -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)

View File

@ -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",

View File

@ -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")

View File

@ -151,9 +151,11 @@ 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) {
if(!r.exc) {
me.frm.script_manager.trigger("price_list_rate", cdt, cdn);

View File

@ -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"]
};

View File

@ -585,3 +585,18 @@ 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.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));
})
}
}
})
})

View File

@ -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

View File

@ -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",

View File

@ -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,

View File

@ -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"
}