fixed hr issues

This commit is contained in:
Nabin Hait 2012-04-16 12:22:47 +05:30
parent 0c18b18b84
commit dbffc2d8d0
4 changed files with 120 additions and 165 deletions

View File

@ -59,48 +59,15 @@ class DocType:
msgprint("Employee's attendance already marked.") msgprint("Employee's attendance already marked.")
raise Exception raise Exception
#validation - leave_type is mandatory for status absent/ half day else not required to entered.
def validate_status(self):
if self.doc.status == 'Present' and self.doc.leave_type:
msgprint("You can not enter leave type for attendance status 'Present'")
raise Exception
elif (self.doc.status == 'Absent' or self.doc.status == 'Half Day') and not self.doc.leave_type:
msgprint("Please enter leave type for attendance status 'Absent'")
raise Exception
#check for already record present in leave transaction for same date #check for already record present in leave transaction for same date
def check_leave_record(self): def check_leave_record(self):
if self.doc.status == 'Present': if self.doc.status == 'Present':
chk = sql("select name from `tabLeave Transaction` where employee=%s and (from_date <= %s and to_date >= %s) and status = 'Submitted' and leave_transaction_type = 'Deduction' and docstatus!=2", (self.doc.employee, self.doc.att_date, self.doc.att_date)) chk = sql("select name from `tabLeave Application` where employee=%s and (from_date <= %s and to_date >= %s) and docstatus!=2", (self.doc.employee, self.doc.att_date, self.doc.att_date))
if chk: if chk:
msgprint("Leave Application created for employee "+self.doc.employee+" whom you are trying to mark as 'Present' ") msgprint("Leave Application created for employee "+self.doc.employee+" whom you are trying to mark as 'Present' ")
raise Exception raise Exception
#For absent/ half day record - check for leave balances of the employees
def validate_leave_type(self):
if not self.doc.status =='Present' and self.doc.leave_type not in ('Leave Without Pay','Compensatory Off'):
#check for leave allocated to employee from leave transaction
ret = sql("select name from `tabLeave Transaction` where employee = '%s' and leave_type = '%s' and leave_transaction_type = 'Allocation' and fiscal_year = '%s'"%(self.doc.employee,self.doc.leave_type,self.doc.fiscal_year))
#if leave allocation is present then calculate leave balance i.e. sum(allocation) - sum(deduction)
if ret:
q1 = 'SUM(CASE WHEN leave_transaction_type = "Allocation" THEN total_leave ELSE 0 END)-SUM(CASE WHEN leave_transaction_type = "Deduction" THEN total_leave ELSE 0 END)'
q2 = "select %s from `tabLeave Transaction` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1"
res = sql(q2%(q1,self.doc.employee,self.doc.leave_type,self.doc.fiscal_year))
if res:
if self.doc.status == 'Absent' and flt(res[0][0]) < 1:
msgprint("%s balances are insufficient to cover a day absence, please select other leave type."%self.doc.leave_type)
raise Exception
if self.doc.status == 'Half Day' and flt(res[0][0]) < 0.5:
msgprint("%s balances are insufficient to cover a half day absence, please select other leave type."%self.doc.leave_type)
raise Exception
else:
msgprint("Leave Allocation for employee %s not done.\n You can allocate leaves from HR -> Leave Transaction OR HR -> Leave Control Panel."%self.doc.employee)
raise Exception
def validate_fiscal_year(self): def validate_fiscal_year(self):
fy=sql("select year_start_date from `tabFiscal Year` where name='%s'"% self.doc.fiscal_year) fy=sql("select year_start_date from `tabFiscal Year` where name='%s'"% self.doc.fiscal_year)
@ -129,7 +96,6 @@ class DocType:
def validate(self): def validate(self):
self.validate_fiscal_year() self.validate_fiscal_year()
self.validate_att_date() self.validate_att_date()
#self.validate_leave_type()
self.validate_duplicate_record() self.validate_duplicate_record()
#self.validate_status() #self.validate_status()
self.check_leave_record() self.check_leave_record()

View File

@ -8,11 +8,11 @@
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# Please edit this list and import only required elements # Please edit this list and import only required elements
import webnotes import webnotes
@ -34,126 +34,126 @@ convert_to_lists = webnotes.conn.convert_to_lists
class DocType: class DocType:
def __init__(self, doc, doclist=[]): def __init__(self, doc, doclist=[]):
self.doc = doc self.doc = doc
self.doclist = doclist self.doclist = doclist
def get_employee_name(self): def get_employee_name(self):
emp_dtl = sql("select employee_name,company_email from `tabEmployee` where name=%s", self.doc.employee) emp_dtl = sql("select employee_name,company_email from `tabEmployee` where name=%s", self.doc.employee)
emp_nm = emp_dtl and emp_dtl[0][0] or '' emp_nm = emp_dtl and emp_dtl[0][0] or ''
self.doc.employee_name = emp_nm self.doc.employee_name = emp_nm
self.doc.email_id = emp_dtl and emp_dtl[0][1] or '' self.doc.email_id = emp_dtl and emp_dtl[0][1] or ''
return cstr(emp_nm) return cstr(emp_nm)
def get_approver_lst(self): def get_approver_lst(self):
approver_lst =[] approver_lst =[]
approver_lst1 = get_obj('Authorization Control').get_approver_name(self.doc.doctype,0,self) approver_lst1 = get_obj('Authorization Control').get_approver_name(self.doc.doctype,0,self)
if approver_lst1: if approver_lst1:
approver_lst=approver_lst1 approver_lst=approver_lst1
else: else:
approver_lst = [x[0] for x in sql("select distinct name from `tabProfile` where enabled=1 and name!='Administrator' and name!='Guest' and docstatus!=2")] approver_lst = [x[0] for x in sql("select distinct name from `tabProfile` where enabled=1 and name!='Administrator' and name!='Guest' and docstatus!=2")]
return approver_lst return approver_lst
def set_approver(self): def set_approver(self):
ret={} ret={}
approver_lst =[] approver_lst =[]
emp_nm = self.get_employee_name() emp_nm = self.get_employee_name()
approver_lst = self.get_approver_lst() approver_lst = self.get_approver_lst()
ret = {'app_lst':"\n" + "\n".join(approver_lst), 'emp_nm':cstr(emp_nm)} ret = {'app_lst':"\n" + "\n".join(approver_lst), 'emp_nm':cstr(emp_nm)}
return ret return ret
def update_voucher(self): def update_voucher(self):
sql("delete from `tabExpense Claim Detail` where parent = '%s'"%self.doc.name) sql("delete from `tabExpense Claim Detail` where parent = '%s'"%self.doc.name)
for d in getlist(self.doclist, 'expense_voucher_details'): for d in getlist(self.doclist, 'expense_voucher_details'):
if not d.expense_type or not d.claim_amount: if not d.expense_type or not d.claim_amount:
msgprint("Please remove the extra blank row added") msgprint("Please remove the extra blank row added")
raise Exception raise Exception
d.save(1) d.save(1)
if self.doc.total_sanctioned_amount: if self.doc.total_sanctioned_amount:
set(self.doc,'total_sanctioned_amount',self.doc.total_sanctioned_amount) set(self.doc,'total_sanctioned_amount',self.doc.total_sanctioned_amount)
if self.doc.remark: if self.doc.remark:
set(self.doc, 'remark', self.doc.remark) set(self.doc, 'remark', self.doc.remark)
def approve_voucher(self): def approve_voucher(self):
for d in getlist(self.doclist, 'expense_voucher_details'): for d in getlist(self.doclist, 'expense_voucher_details'):
if not d.sanctioned_amount: if not d.sanctioned_amount:
msgprint("Please add 'Sanctioned Amount' for all expenses") msgprint("Please add 'Sanctioned Amount' for all expenses")
return cstr('Incomplete') return cstr('Incomplete')
if not self.doc.total_sanctioned_amount: if not self.doc.total_sanctioned_amount:
msgprint("Please calculate total sanctioned amount using button 'Calculate Total Amount'") msgprint("Please calculate total sanctioned amount using button 'Calculate Total Amount'")
return cstr('No Amount') return cstr('No Amount')
self.update_voucher() self.update_voucher()
set(self.doc, 'approval_status', 'Approved') set(self.doc, 'approval_status', 'Approved')
# on approval notification # on approval notification
#get_obj('Notification Control').notify_contact('Expense Claim Approved', self.doc.doctype, self.doc.name, self.doc.email_id, self.doc.employee_name) #get_obj('Notification Control').notify_contact('Expense Claim Approved', self.doc.doctype, self.doc.name, self.doc.email_id, self.doc.employee_name)
return cstr('Approved') return cstr('Approved')
def reject_voucher(self): def reject_voucher(self):
if self.doc.remark: if self.doc.remark:
set(self.doc, 'remark', self.doc.remark) set(self.doc, 'remark', self.doc.remark)
set(self.doc, 'approval_status', 'Rejected') set(self.doc, 'approval_status', 'Rejected')
# on approval notification # on approval notification
#get_obj('Notification Control').notify_contact('Expense Claim Rejected', self.doc.doctype, self.doc.name, self.doc.email_id, self.doc.employee_name) #get_obj('Notification Control').notify_contact('Expense Claim Rejected', self.doc.doctype, self.doc.name, self.doc.email_id, self.doc.employee_name)
return cstr('Rejected') return cstr('Rejected')
def validate_curr_exp(self): def validate_curr_exp(self):
for d in getlist(self.doclist, 'expense_voucher_details'): for d in getlist(self.doclist, 'expense_voucher_details'):
if flt(d.sanctioned_amount) > 0: if flt(d.sanctioned_amount) > 0:
if self.doc.approval_status == 'Draft': if self.doc.approval_status == 'Draft':
msgprint("Sanctioned amount can be added by Approver person only for submitted Expense Claim") msgprint("Sanctioned amount can be added by Approver person only for submitted Expense Claim")
raise Exception raise Exception
elif self.doc.approval_status == 'Submitted' and session['user'] != self.doc.exp_approver: elif self.doc.approval_status == 'Submitted' and session['user'] != self.doc.exp_approver:
msgprint("Sanctioned amount can be added only by expense voucher Approver") msgprint("Sanctioned amount can be added only by expense voucher Approver")
raise Exception raise Exception
def validate_fiscal_year(self): def validate_fiscal_year(self):
fy=sql("select year_start_date from `tabFiscal Year` where name='%s'"%self.doc.fiscal_year) fy=sql("select year_start_date from `tabFiscal Year` where name='%s'"%self.doc.fiscal_year)
ysd=fy and fy[0][0] or "" ysd=fy and fy[0][0] or ""
yed=add_days(str(ysd),365) yed=add_days(str(ysd),365)
if str(self.doc.posting_date) < str(ysd) or str(self.doc.posting_date) > str(yed): if str(self.doc.posting_date) < str(ysd) or str(self.doc.posting_date) > str(yed):
msgprint("Posting Date is not within the Fiscal Year selected") msgprint("Posting Date is not within the Fiscal Year selected")
raise Exception raise Exception
def validate(self): def validate(self):
self.validate_curr_exp() self.validate_curr_exp()
self.validate_fiscal_year() self.validate_fiscal_year()
def on_update(self): def on_update(self):
set(self.doc, 'approval_status', 'Draft') set(self.doc, 'approval_status', 'Draft')
def validate_exp_details(self): def validate_exp_details(self):
if not getlist(self.doclist, 'expense_voucher_details'): if not getlist(self.doclist, 'expense_voucher_details'):
msgprint("Please add expense voucher details") msgprint("Please add expense voucher details")
raise Exception raise Exception
if not self.doc.total_claimed_amount: if not self.doc.total_claimed_amount:
msgprint("Please calculate Total Claimed Amount") msgprint("Please calculate Total Claimed Amount")
raise Exception raise Exception
if not self.doc.exp_approver: if not self.doc.exp_approver:
msgprint("Please select Expense Claim approver") msgprint("Please select Expense Claim approver")
raise Exception raise Exception
def validate_approver(self): def validate_approver(self):
app_lst = self.get_approver_lst() app_lst = self.get_approver_lst()
if self.doc.exp_approver and self.doc.exp_approver not in app_lst: if self.doc.exp_approver and self.doc.exp_approver not in app_lst:
msgprint("Approver "+self.doc.exp_approver+" is not authorized to approve this expense voucher. Please select another approver") msgprint("Approver "+self.doc.exp_approver+" is not authorized to approve this expense voucher. Please select another approver")
valid_app = 'No' valid_app = 'No'
else: else:
valid_app = 'Yes' valid_app = 'Yes'
ret = {'app_lst':("\n" + "\n".join(app_lst)), 'valid_approver':valid_app} ret = {'app_lst':("\n" + "\n".join(app_lst)), 'valid_approver':valid_app}
return ret return ret
def on_submit(self): def on_submit(self):
self.validate_exp_details() self.validate_exp_details()
set(self.doc, 'approval_status', 'Submitted') set(self.doc, 'approval_status', 'Submitted')
def on_cancel(self): def on_cancel(self):
set(self.doc, 'approval_status', 'Cancelled') set(self.doc, 'approval_status', 'Cancelled')

View File

@ -29,7 +29,6 @@ cur_frm.cscript.onload = function(doc, dt, dn){
//======================================================================= //=======================================================================
cur_frm.cscript.refresh = function(doc, dt, dn){ cur_frm.cscript.refresh = function(doc, dt, dn){
if((!doc.__islocal) && (doc.is_active == 'Yes')){ if((!doc.__islocal) && (doc.is_active == 'Yes')){
cur_frm.add_custom_button('Make IT Checklist', cur_frm.cscript['Make IT Checklist']);
cur_frm.add_custom_button('Make Salary Slip', cur_frm.cscript['Make Salary Slip']); cur_frm.add_custom_button('Make Salary Slip', cur_frm.cscript['Make Salary Slip']);
get_field(doc.doctype, 'employee', doc.name).permlevel = 1; get_field(doc.doctype, 'employee', doc.name).permlevel = 1;
@ -37,16 +36,6 @@ cur_frm.cscript.refresh = function(doc, dt, dn){
} }
} }
// Make IT checklist
//=======================================================================
cur_frm.cscript['Make IT Checklist']=function(){
var itc = LocalDB.create('IT Checklist');
itc = locals['IT Checklist'][itc];
itc.employee = cur_frm.doc.employee;
itc.fiscal_year = sys_defaults.fiscal_year;
itc.is_cheklist_active='Yes';
loaddoc('IT Checklist', itc.name);
}
// Make Salry Slip // Make Salry Slip
//======================================================================= //=======================================================================

View File

@ -143,7 +143,7 @@ def delete_search_criteria():
def change_report_module(): def change_report_module():
reports = {'itemwise_receipt_details': 'Stock'} reports = {'itemwise_receipt_details': 'Stock'}
for k in reports: for k in reports:
sql("update `tabSearch Criteria` set module = %s where name = %s", (reports[k], k)) webnotes.conn.sql("update `tabSearch Criteria` set module = %s where name = %s", (reports[k], k))
def rename_in_db(ren_data, data_type, is_doctype): def rename_in_db(ren_data, data_type, is_doctype):
for d in ren_data: for d in ren_data: