fixed hr issues
This commit is contained in:
parent
0c18b18b84
commit
dbffc2d8d0
@ -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()
|
||||||
|
@ -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')
|
||||||
|
@ -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
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user