Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/hr/doctype/expense_claim/expense_claim.js b/hr/doctype/expense_claim/expense_claim.js
index 28487a8..4c9a5c5 100644
--- a/hr/doctype/expense_claim/expense_claim.js
+++ b/hr/doctype/expense_claim/expense_claim.js
@@ -52,13 +52,14 @@
if(doc.__islocal && !in_list(user_roles, "HR User")) {
cur_frm.set_intro("Fill the form and save it")
} else {
- if(doc.approval_status=="Draft") {
+ if(doc.docstatus==0 && doc.approval_status=="Draft") {
if(user==doc.exp_approver) {
cur_frm.set_intro("You are the Expense Approver for this record. Please Update the 'Status' and Save");
cur_frm.toggle_enable("approval_status", true);
} else {
cur_frm.set_intro("Expense Claim is pending approval. Only the Expense Approver can update status.");
cur_frm.toggle_enable("approval_status", false);
+ if(!doc.__islocal) cur_frm.frm_head.appframe.buttons.Submit.toggle(false);
}
} else {
if(doc.approval_status=="Approved") {
@@ -98,6 +99,9 @@
}
cur_frm.cscript.claim_amount = function(doc,cdt,cdn){
cur_frm.cscript.calculate_total(doc,cdt,cdn);
+
+ var child = locals[cdt][cdn];
+ refresh_field("sanctioned_amount", child.name, child.parentfield);
}
cur_frm.cscript.sanctioned_amount = function(doc,cdt,cdn){
cur_frm.cscript.calculate_total(doc,cdt,cdn);
diff --git a/hr/doctype/expense_claim/expense_claim.txt b/hr/doctype/expense_claim/expense_claim.txt
index 638a9f7..5ef2c59 100644
--- a/hr/doctype/expense_claim/expense_claim.txt
+++ b/hr/doctype/expense_claim/expense_claim.txt
@@ -4,7 +4,7 @@
"docstatus": 0,
"creation": "2012-12-05 16:53:59",
"modified_by": "Administrator",
- "modified": "2012-12-06 17:34:37"
+ "modified": "2012-12-07 13:25:44"
},
{
"is_submittable": 1,
@@ -35,14 +35,6 @@
"doctype": "DocType"
},
{
- "oldfieldtype": "Section Break",
- "doctype": "DocField",
- "label": "Details",
- "fieldname": "details",
- "fieldtype": "Section Break",
- "permlevel": 0
- },
- {
"permlevel": 0,
"no_copy": 1,
"oldfieldtype": "Select",
@@ -68,17 +60,6 @@
"permlevel": 0
},
{
- "oldfieldtype": "Date",
- "doctype": "DocField",
- "label": "Posting Date",
- "oldfieldname": "posting_date",
- "fieldname": "posting_date",
- "fieldtype": "Date",
- "reqd": 1,
- "permlevel": 0,
- "in_filter": 1
- },
- {
"oldfieldtype": "Column Break",
"doctype": "DocField",
"width": "50%",
@@ -87,17 +68,70 @@
"permlevel": 0
},
{
+ "reqd": 0,
+ "no_copy": 1,
+ "oldfieldtype": "Currency",
+ "colour": "White:FFF",
+ "doctype": "DocField",
+ "label": "Total Claimed Amount",
+ "oldfieldname": "total_claimed_amount",
+ "width": "160px",
+ "fieldname": "total_claimed_amount",
+ "fieldtype": "Currency",
+ "permlevel": 1,
+ "in_filter": 0
+ },
+ {
+ "no_copy": 1,
+ "oldfieldtype": "Currency",
+ "colour": "White:FFF",
+ "doctype": "DocField",
+ "label": "Total Sanctioned Amount",
+ "oldfieldname": "total_sanctioned_amount",
+ "width": "160px",
+ "fieldname": "total_sanctioned_amount",
+ "fieldtype": "Currency",
+ "permlevel": 1,
+ "in_filter": 0
+ },
+ {
+ "oldfieldtype": "Section Break",
+ "doctype": "DocField",
+ "label": "Expense Details",
+ "fieldname": "expense_details",
+ "fieldtype": "Section Break",
+ "permlevel": 0
+ },
+ {
+ "oldfieldtype": "Table",
+ "allow_on_submit": 0,
+ "doctype": "DocField",
+ "label": "Expense Claim Details",
+ "oldfieldname": "expense_voucher_details",
+ "options": "Expense Claim Detail",
+ "fieldname": "expense_voucher_details",
+ "fieldtype": "Table",
+ "permlevel": 0
+ },
+ {
+ "doctype": "DocField",
+ "options": "Simple",
+ "fieldname": "sb1",
+ "fieldtype": "Section Break",
+ "permlevel": 0
+ },
+ {
+ "permlevel": 0,
"oldfieldtype": "Link",
"colour": "White:FFF",
"doctype": "DocField",
"label": "From Employee",
"oldfieldname": "employee",
- "permlevel": 0,
+ "reqd": 1,
"trigger": "Client",
"fieldname": "employee",
"fieldtype": "Link",
"search_index": 1,
- "reqd": 1,
"options": "Employee",
"in_filter": 1
},
@@ -114,10 +148,51 @@
"in_filter": 1
},
{
+ "oldfieldtype": "Select",
+ "doctype": "DocField",
+ "label": "Fiscal Year",
+ "oldfieldname": "fiscal_year",
+ "options": "link:Fiscal Year",
+ "fieldname": "fiscal_year",
+ "fieldtype": "Select",
+ "reqd": 1,
+ "permlevel": 0,
+ "in_filter": 1
+ },
+ {
+ "oldfieldtype": "Link",
+ "doctype": "DocField",
+ "label": "Company",
+ "oldfieldname": "company",
+ "options": "link:Company",
+ "fieldname": "company",
+ "fieldtype": "Select",
+ "reqd": 1,
+ "permlevel": 0,
+ "in_filter": 1
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "cb1",
+ "fieldtype": "Column Break",
+ "permlevel": 0
+ },
+ {
+ "oldfieldtype": "Date",
+ "doctype": "DocField",
+ "label": "Posting Date",
+ "oldfieldname": "posting_date",
+ "fieldname": "posting_date",
+ "fieldtype": "Date",
+ "reqd": 1,
+ "permlevel": 0,
+ "in_filter": 1
+ },
+ {
+ "allow_on_submit": 0,
"no_copy": 1,
"oldfieldtype": "Small Text",
"colour": "White:FFF",
- "allow_on_submit": 0,
"doctype": "DocField",
"label": "Remark",
"oldfieldname": "remark",
@@ -127,6 +202,17 @@
},
{
"print_hide": 1,
+ "oldfieldtype": "Data",
+ "doctype": "DocField",
+ "label": "Employees Email Id",
+ "oldfieldname": "email_id",
+ "fieldname": "email_id",
+ "fieldtype": "Data",
+ "hidden": 1,
+ "permlevel": 0
+ },
+ {
+ "print_hide": 1,
"no_copy": 1,
"oldfieldtype": "Data",
"colour": "White:FFF",
@@ -154,87 +240,6 @@
"report_hide": 1
},
{
- "oldfieldtype": "Section Break",
- "doctype": "DocField",
- "label": "Expense Details",
- "fieldname": "expense_details",
- "fieldtype": "Section Break",
- "permlevel": 0
- },
- {
- "oldfieldtype": "Table",
- "allow_on_submit": 0,
- "doctype": "DocField",
- "label": "Expense Claim Details",
- "oldfieldname": "expense_voucher_details",
- "options": "Expense Claim Detail",
- "fieldname": "expense_voucher_details",
- "fieldtype": "Table",
- "permlevel": 0
- },
- {
- "no_copy": 1,
- "oldfieldtype": "Currency",
- "colour": "White:FFF",
- "doctype": "DocField",
- "label": "Total Claimed Amount",
- "oldfieldname": "total_claimed_amount",
- "width": "160px",
- "fieldname": "total_claimed_amount",
- "fieldtype": "Currency",
- "reqd": 0,
- "permlevel": 1,
- "in_filter": 0
- },
- {
- "no_copy": 1,
- "oldfieldtype": "Currency",
- "colour": "White:FFF",
- "doctype": "DocField",
- "label": "Total Sanctioned Amount",
- "oldfieldname": "total_sanctioned_amount",
- "width": "160px",
- "fieldname": "total_sanctioned_amount",
- "fieldtype": "Currency",
- "permlevel": 1,
- "in_filter": 0
- },
- {
- "print_hide": 1,
- "oldfieldtype": "Data",
- "doctype": "DocField",
- "label": "Employees Email Id",
- "oldfieldname": "email_id",
- "fieldname": "email_id",
- "fieldtype": "Data",
- "hidden": 1,
- "permlevel": 0
- },
- {
- "oldfieldtype": "Select",
- "doctype": "DocField",
- "label": "Fiscal Year",
- "oldfieldname": "fiscal_year",
- "options": "link:Fiscal Year",
- "fieldname": "fiscal_year",
- "fieldtype": "Select",
- "reqd": 1,
- "permlevel": 0,
- "in_filter": 1
- },
- {
- "oldfieldtype": "Link",
- "doctype": "DocField",
- "label": "Company",
- "oldfieldname": "company",
- "options": "link:Company",
- "fieldname": "company",
- "fieldtype": "Select",
- "reqd": 1,
- "permlevel": 0,
- "in_filter": 1
- },
- {
"create": 1,
"doctype": "DocPerm",
"write": 1,
diff --git a/hr/doctype/leave_application/leave_application.js b/hr/doctype/leave_application/leave_application.js
index f3560c0..042ccca 100755
--- a/hr/doctype/leave_application/leave_application.js
+++ b/hr/doctype/leave_application/leave_application.js
@@ -26,7 +26,7 @@
method:"get_approver_list",
callback: function(r) {
cur_frm.set_df_property("leave_approver", "options", r.message);
- get_leave_balance(cur_frm.doc);
+ cur_frm.cscript.get_leave_balance(cur_frm.doc);
}
});
}
@@ -39,13 +39,14 @@
if(doc.__islocal && !in_list(user_roles, "HR User")) {
cur_frm.set_intro("Fill the form and save it")
} else {
- if(doc.status=="Open") {
+ if(doc.docstatus==0 && doc.status=="Open") {
if(user==doc.leave_approver) {
cur_frm.set_intro("You are the Leave Approver for this record. Please Update the 'Status' and Save");
cur_frm.toggle_enable("status", true);
} else {
cur_frm.set_intro("This Leave Application is pending approval. Only the Leave Apporver can update status.")
cur_frm.toggle_enable("status", false);
+ if(!doc.__islocal) cur_frm.frm_head.appframe.buttons.Submit.toggle(false);
}
} else {
if(doc.status=="Approved") {
@@ -62,21 +63,21 @@
}
cur_frm.cscript.employee = function (doc, dt, dn){
- get_leave_balance(doc, dt, dn);
+ cur_frm.cscript.get_leave_balance(doc, dt, dn);
}
cur_frm.cscript.fiscal_year = function (doc, dt, dn){
- get_leave_balance(doc, dt, dn);
+ cur_frm.cscript.get_leave_balance(doc, dt, dn);
}
cur_frm.cscript.leave_type = function (doc, dt, dn){
- get_leave_balance(doc, dt, dn);
+ cur_frm.cscript.get_leave_balance(doc, dt, dn);
}
cur_frm.cscript.half_day = function(doc, dt, dn) {
if(doc.from_date) {
set_multiple(dt,dn,{to_date:doc.from_date});
- calculate_total_days(doc, dt, dn);
+ cur_frm.cscript.calculate_total_days(doc, dt, dn);
}
}
@@ -84,7 +85,7 @@
if(cint(doc.half_day) == 1){
set_multiple(dt,dn,{to_date:doc.from_date});
}
- calculate_total_days(doc, dt, dn);
+ cur_frm.cscript.calculate_total_days(doc, dt, dn);
}
cur_frm.cscript.to_date = function(doc, dt, dn) {
@@ -92,11 +93,11 @@
msgprint("To Date should be same as From Date for Half Day leave");
set_multiple(dt,dn,{to_date:doc.from_date});
}
- calculate_total_days(doc, dt, dn);
+ cur_frm.cscript.calculate_total_days(doc, dt, dn);
}
-get_leave_balance = function(doc, dt, dn) {
- if(doc.employee && doc.leave_type && doc.fiscal_year) {
+cur_frm.cscript.get_leave_balance = function(doc, dt, dn) {
+ if(doc.docstatus==0 && doc.employee && doc.leave_type && doc.fiscal_year) {
cur_frm.call({
method: "get_leave_balance",
args: {
@@ -104,16 +105,15 @@
fiscal_year: doc.fiscal_year,
leave_type: doc.leave_type
}
- })
+ });
}
}
-calculate_total_days = function(doc, dt, dn) {
+cur_frm.cscript.calculate_total_days = function(doc, dt, dn) {
if(doc.from_date && doc.to_date){
if(cint(doc.half_day) == 1) set_multiple(dt,dn,{total_leave_days:0.5});
else{
- //d = new DateFn();
- //set_multiple(dt,dn,{total_leave_days:d.get_diff(d.str_to_obj(doc.to_date),d.str_to_obj(doc.from_date))+1});
+ // server call is done to include holidays in leave days calculations
get_server_fields('get_total_leave_days', '', '', doc, dt, dn, 1);
}
}
diff --git a/hr/doctype/leave_application/leave_application.py b/hr/doctype/leave_application/leave_application.py
index 47cdae8..c0a5179 100755
--- a/hr/doctype/leave_application/leave_application.py
+++ b/hr/doctype/leave_application/leave_application.py
@@ -28,7 +28,21 @@
class DocType:
def __init__(self, doc, doclist):
self.doc = doc
- self.doclist = doclist
+ self.doclist = doclist
+
+ def validate(self):
+ # if self.doc.leave_approver == self.doc.owner:
+ # webnotes.msgprint("""Self Approval is not allowed.""", raise_exception=1)
+
+ self.validate_to_date()
+ self.validate_balance_leaves()
+ self.validate_leave_overlap()
+ self.validate_max_days()
+
+ def on_submit(self):
+ if self.doc.status != "Approved":
+ webnotes.msgprint("""Only Approved Leave Applications can be Submitted.""",
+ raise_exception=True)
def get_holidays(self):
"""
@@ -40,9 +54,7 @@
return tot_hol and flt(tot_hol[0][0]) or 0
def get_total_leave_days(self):
- """
- Calculates total leave days based on input and holidays
- """
+ """Calculates total leave days based on input and holidays"""
ret = {'total_leave_days' : 0.5}
if not self.doc.half_day:
tot_days = date_diff(self.doc.to_date, self.doc.from_date) + 1
@@ -53,24 +65,20 @@
return ret
def validate_to_date(self):
- if self.doc.from_date and self.doc.to_date and (getdate(self.doc.to_date) < getdate(self.doc.from_date)):
+ if self.doc.from_date and self.doc.to_date and \
+ (getdate(self.doc.to_date) < getdate(self.doc.from_date)):
msgprint("To date cannot be before from date")
raise Exception
- def is_lwp(self):
- lwp = sql("select is_lwp from `tabLeave Type` where name = %s", self.doc.leave_type)
- return lwp and cint(lwp[0][0]) or 0
-
def validate_balance_leaves(self):
- if self.doc.from_date and self.doc.to_date and not self.is_lwp():
- bal = get_leave_balance(self.doc.leave_type, self.doc.employee,
- self.doc.fiscal_year)
- tot_leaves = self.get_total_leave_days()
- bal, tot_leaves = bal, tot_leaves
- webnotes.conn.set(self.doc, 'leave_balance', flt(bal['leave_balance']))
- webnotes.conn.set(self.doc, 'total_leave_days', flt(tot_leaves['total_leave_days']))
- if flt(bal['leave_balance']) < flt(tot_leaves['total_leave_days']):
- msgprint("Warning : There is not enough leave balance")
+ if self.doc.from_date and self.doc.to_date and not is_lwp(self.doc.leave_type):
+ self.doc.leave_balance = get_leave_balance(self.doc.employee,
+ self.doc.leave_type, self.doc.fiscal_year)["leave_balance"]
+ self.doc.total_leave_days = self.get_total_leave_days()["total_leave_days"]
+
+ if self.doc.leave_balance - self.doc.total_leave_days < 0:
+ msgprint("There is not enough leave balance for Leave Type: %s" % \
+ (self.doc.leave_type,), raise_exception=1)
def validate_leave_overlap(self):
for d in sql("""select name, leave_type, posting_date, from_date, to_date
@@ -90,36 +98,23 @@
msgprint("Sorry ! You cannot apply for %s for more than %s days" % (self.doc.leave_type, max_days))
raise Exception
- def validate(self):
- # if self.doc.leave_approver == self.doc.owner:
- # webnotes.msgprint("""Self Approval is not allowed.""", raise_exception=1)
-
- self.validate_to_date()
- self.validate_balance_leaves()
- self.validate_leave_overlap()
- self.validate_max_days()
-
- def on_submit(self):
- if self.doc.status != "Approved":
- webnotes.msgprint("""Only Approved Leave Applications can be Submitted.""",
- raise_exception=True)
@webnotes.whitelist()
def get_leave_balance(employee, leave_type, fiscal_year):
leave_all = webnotes.conn.sql("""select total_leaves_allocated
from `tabLeave Allocation` where employee = %s and leave_type = %s
and fiscal_year = %s and docstatus = 1""", (employee,
- leave_type, fiscal_year))
-
+ leave_type, fiscal_year), debug=1)
+
leave_all = leave_all and flt(leave_all[0][0]) or 0
leave_app = webnotes.conn.sql("""select SUM(total_leave_days)
from `tabLeave Application`
where employee = %s and leave_type = %s and fiscal_year = %s
- and docstatus = 1""", (employee, leave_type, fiscal_year))
+ and docstatus = 1""", (employee, leave_type, fiscal_year), debug=1)
leave_app = leave_app and flt(leave_app[0][0]) or 0
-
- ret = {'leave_balance':leave_all - leave_app}
+
+ ret = {'leave_balance': leave_all - leave_app}
return ret
@webnotes.whitelist()
@@ -130,3 +125,7 @@
webnotes.msgprint("No Leave Approvers. Please assign 'Leave Approver' Role to atleast one user.")
return roles
+
+def is_lwp(leave_type):
+ lwp = sql("select is_lwp from `tabLeave Type` where name = %s", leave_type)
+ return lwp and cint(lwp[0][0]) or 0
\ No newline at end of file
diff --git a/hr/doctype/leave_application/leave_application.txt b/hr/doctype/leave_application/leave_application.txt
index 556889c..dd5846a 100644
--- a/hr/doctype/leave_application/leave_application.txt
+++ b/hr/doctype/leave_application/leave_application.txt
@@ -2,9 +2,9 @@
{
"owner": "Administrator",
"docstatus": 0,
- "creation": "2012-12-06 15:56:41",
+ "creation": "2012-12-07 11:51:20",
"modified_by": "Administrator",
- "modified": "2012-12-07 10:23:53"
+ "modified": "2012-12-07 13:31:40"
},
{
"is_submittable": 1,
@@ -43,7 +43,7 @@
"options": "Open\nApproved\nRejected",
"fieldname": "status",
"fieldtype": "Select",
- "permlevel": 3
+ "permlevel": 2
},
{
"description": "Leave can be approved by users with Role, \"Leave Approver\"",
@@ -58,7 +58,7 @@
"search_index": 1,
"doctype": "DocField",
"label": "Leave Type",
- "options": "link:Leave Type",
+ "options": "\nCasual Leave",
"fieldname": "leave_type",
"fieldtype": "Select",
"reqd": 1,
@@ -105,17 +105,10 @@
},
{
"doctype": "DocField",
- "label": "Leave Balance",
- "fieldname": "leave_balance",
- "fieldtype": "Currency",
- "permlevel": 1
- },
- {
- "doctype": "DocField",
- "label": "Total Leave Days",
- "fieldname": "total_leave_days",
- "fieldtype": "Currency",
- "permlevel": 1
+ "label": "Reason",
+ "fieldname": "description",
+ "fieldtype": "Small Text",
+ "permlevel": 0
},
{
"search_index": 1,
@@ -138,27 +131,29 @@
"in_filter": 1
},
{
+ "no_copy": 1,
"doctype": "DocField",
+ "label": "Leave Balance Before Application",
+ "fieldname": "leave_balance",
+ "fieldtype": "Currency",
+ "permlevel": 1
+ },
+ {
+ "no_copy": 1,
+ "doctype": "DocField",
+ "label": "Total Leave Days",
+ "fieldname": "total_leave_days",
+ "fieldtype": "Currency",
+ "permlevel": 1
+ },
+ {
+ "doctype": "DocField",
+ "label": "More Info",
"fieldname": "sb10",
"fieldtype": "Section Break",
"permlevel": 0
},
{
- "doctype": "DocField",
- "label": "Reason",
- "width": "300px",
- "fieldname": "description",
- "fieldtype": "Text Editor",
- "permlevel": 0
- },
- {
- "doctype": "DocField",
- "label": "HR Details",
- "fieldname": "sb12",
- "fieldtype": "Section Break",
- "permlevel": 2
- },
- {
"default": "Today",
"colour": "White:FFF",
"doctype": "DocField",
@@ -173,7 +168,7 @@
"search_index": 0,
"doctype": "DocField",
"label": "Fiscal Year",
- "options": "link:Fiscal Year",
+ "options": "\n2008-2009\n2009-2010\n2010-2011\n2011-2012\n2012-2013\n2013-2014",
"fieldname": "fiscal_year",
"fieldtype": "Select",
"reqd": 1,
@@ -181,6 +176,7 @@
"in_filter": 1
},
{
+ "print_hide": 1,
"doctype": "DocField",
"label": "Letter Head",
"options": "Letter Head",
@@ -251,10 +247,5 @@
"role": "Leave Approver",
"cancel": 0,
"permlevel": 2
- },
- {
- "doctype": "DocPerm",
- "role": "All",
- "permlevel": 3
}
]
\ No newline at end of file