def employee(): if request.method == 'GET': return jsonify(employee_sqlalchemy_to_list(Employees.query.all())) if request.method == 'POST': data_employee = request.get_json(force=True) #Refactor this thing #============================= data_employee['role'] = "Employee" data_employee['probation'] = 1 password = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7)) new_user = User(data_employee['email'], generate_password_hash(password), data_employee['role']) try: db.session.add(new_user) db.session.flush() db.session.refresh(new_user) except: db.session.rollback() return redirect(url_for('dashboard')) employee_created = {"email":data_employee['email'],"role":data_employee['role'], "id":new_user.id, "name":data_employee['first_name'] + " " + data_employee['last_name'], "department_id": int(data_employee['department_id']), "designation": data_employee['designation']} del data_employee['email'] data_employee['general_leaves_availed'] = '0' data_employee['medical_leaves_availed'] = '0' data_employee['date_of_joining'] = datetime.strptime(data_employee['date_of_joining'], '%b %d, %Y') data_employee['general_leaves_remaining'] = int(settings_to_dict()['probation_leaves_limit']) data_employee['medical_leaves_remaining'] = int(settings_to_dict()['medical_leaves_limit']) data_employee['last_updated'] = data_employee['date_of_joining'] data_employee['first_year'] = True if is_first_year(fiscal_year= settings_to_dict()['fiscal_year_starting'],\ doj=data_employee['date_of_joining'] ,\ probation_period=int(settings_to_dict()['probation_period'])) == 1 else False data_employee['user_id'] = new_user.id new_employee = Employees() key = list(data_employee.keys()) for item in key: setattr(new_employee, item, data_employee[item]) try: db.session.add(new_employee) db.session.commit() db.session.refresh(new_employee) except Exception as e: print(e) db.session.rollback() return error_response_handler(str(e), 400) notify(subject='Welcome To HOH Leave Portal', body=password, receiver_id=new_user.id) return jsonify(employee_created)
def scheduling(): sql = text('select name from penguins') result = db.engine.execute( "SELECT * FROM balance_sheet WHERE manager_approval IS NULL \ OR `hr_approval` IS NULL ") names = [] for row in result: names.append(row[0]) # Use all the SQL you like cur = db.engine.execute( "SELECT * FROM balance_sheet WHERE manager_approval IS NULL \ OR `hr_approval` IS NULL ") # print all the first cell of all the rows dict_of_employees = {} send_email_to_HR_manager = False for row in cur: today = datetime.datetime.now().date() diffrence = (today - row[-1]).days if diffrence >= 2: if row[-2] == None: send_email_to_HR_manager = True if int(row[1]) in list(dict_of_employees.keys()): if row[-2] == None: dict_of_employees[int(row[1])]['hr_approval'] = row[-2] elif row[-3] == None: dict_of_employees[int( row[1])]['manager_approval'] = row[-3] else: dict_of_employees[int(row[1])] = { 'hr_approval': row[-2], 'manager_approval': row[-3] } sending_email_and_password = {} cur = db.engine.execute('SELECT * FROM configuration') for row in cur: sending_email_and_password[row[1]] = row[2] if send_email_to_HR_manager == True: cur = db.engine.execute( 'SELECT email FROM user WHERE role = "HR Manager"') for row in cur: print('hr', row[0]) full_dict = {'senders_email':sending_email_and_password['email_address'] ,\ 'password':sending_email_and_password['password'],\ 'recievers_email':row[0]} notify(hr_email=row[0]) break for i in list_of_employee_id: full_dict = {'senders_email':sending_email_and_password['email_address'] ,\ 'password':sending_email_and_password['password'],\ 'recievers_email':i} notify(recievers_id=i) break return ('', 204)
def leave_form(): leave_data = request.get_json(force=True) if 'from_date' not in leave_data or 'to_date' not in leave_data or 'purpose' not in leave_data or 'leave_type' not in leave_data: return error_response_handler("Incomplete Data", 400) leave_data['emp_id'] = current_user.employee.id if current_user.role == "HR Manager": leave_data['hr_approval'] = "Approved" leave_data['time_stamp'] = datetime.datetime.now().strftime("%Y-%m-%d") leave_data['from_date'] = datetime.datetime.strptime( leave_data['from_date'], "%b %d, %Y") leave_data['to_date'] = datetime.datetime.strptime(leave_data['to_date'], "%b %d, %Y") days = workdays.networkdays( leave_data['from_date'], leave_data['to_date'], gazetted_holidays_list(current_user.employee.religion)) if days > current_user.employee.general_leaves_remaining: return error_response_handler( "Leave request exceeds available leaves request", 400) new_leave = Balance_sheet() key = list(leave_data.keys()) for item in key: setattr(new_leave, item, leave_data[item]) try: db.session.add(new_leave) db.session.commit() except: db.session.rollback() flash(u"Something went wrong. Try again", "error") return redirect(url_for("dashboard")) leave_dict = {} for col_name in Balance_sheet.__mapper__.columns.keys(): leave_dict[col_name] = getattr(new_leave, col_name) notify(subject='Leave Request', receiver_id=current_user.employee.manager.user_id) return jsonify(leave_dict)
def respond_request(): response = request.get_json(force=True) if 'id' not in response or 'remark' not in response or 'approval' not in response: return error_response_handler("Incomplete Data", 400) leave = Balance_sheet.query.get(response['id']) if leave is None: return error_response_handler("Not found") employee = Employees.query.get(leave.emp_id) if employee is None: return error_response_handler("Employee for the leave not found") if current_user.role == "HR Manager": response['hr_remark'] = response['remark'] response['hr_approval'] = response['approval'] if response['approval'] == "Approved": notify(subject='Leave Approved', receiver_id=employee.user_id) elif response['approval'] == "Unapproved": notify(subject='Leave Unapproved', receiver_id=employee.user_id) if employee.reporting_manager_id == current_user.employee.id: response['manager_remark'] = response['hr_remark'] response['manager_approval'] = response['hr_approval'] else: if current_user.employee.id != employee.reporting_manager_id: return error_response_handler("Unauthorized request", 401) response['manager_remark'] = response['remark'] response['manager_approval'] = response['approval'] if response['approval'] == "Approved": notify(subject='Leave Request', send_hr=True) elif response['approval'] == "Unapproved": notify(subject='Leave Unapproved', receiver_id=employee.user_id) key = list(response.keys()) for item in key: setattr(leave, item, response[item]) if leave.manager_approval == "Approved" and leave.hr_approval == "Approved": update_employee_leaves_after_approval( datetime.datetime.combine(leave.from_date, datetime.datetime.min.time()), datetime.datetime.combine(leave.to_date, datetime.datetime.min.time()), leave.emp_id, leave.leave_type) del response['id'] try: db.session.commit() except: db.session.rollback() flash(u"Something went wrong, please try again.", "error") return redirect(url_for("dashboard")) return jsonify(response)
from app.resources.notifications import notify notify('*****@*****.**')
def encashment(): leaves_remaining = current_user.employee.general_leaves_remaining salary = (current_user.employee.salary * 12) / 365 if request.method == 'GET': store = {} requests_history = Encashment.query.filter( Encashment.emp_id == current_user.employee.id).order_by( asc(Encashment.time_stamp)).all() leaves_onhold = 0 for item in requests_history: if item.hr_approval != item.gm_approval != item.manager_approval != "": leaves_onhold += item.leaves_utilized store.update({ 'history': requests_history, 'leaves_available': leaves_remaining - leaves_onhold, 'salary': salary }) return render_template('encashment.html', data=store) if request.method == 'POST': encashment_data = request.form.copy() if 'amount' not in encashment_data: flash(u'Please enter the amount to be encashed', 'error') return redirect(url_for('encashment')) encashment_data['emp_id'] = current_user.employee.id encashment_data['time_stamp'] = datetime.datetime.now().strftime( "%Y-%m-%d") encashment_data['leaves_utilized'] = float( encashment_data['amount']) / salary if current_user.role == 'HR Manager': encashment_data['hr_approval'] = 'Approved' encashment_data['manager_approval'] = 'Approved' notify(subject='Encashment request', send_gm=True) elif current_user.role == "General Manager": encashment_data['gm_approval'] = 'Approved' notify(subject='Encashment request', send_director=True) else: if current_user.employee.reporting_manager_id == User.query.filter_by( role='General Manager').first().employee.id: encashment_data['manager_approval'] = 'Approved' notify(subject='Encashment request', receiver_id=current_user.employee.manager.user_id) encashment_request = Encashment() for item in list(encashment_data.keys()): setattr(encashment_request, item, encashment_data[item]) try: db.session.add(encashment_request) db.session.commit() except: db.session.rollback() flash(u'Some internal error occured, please refresh the page.', 'error') return redirect(url_for('encashment')) flash(u'Your encashment request is sent successfully.', 'success') return redirect(url_for('encashment')) #=========================================================== #Refactor This if request.method == 'DELETE': arg_id = request.args.get("id") if arg_id is None or arg_id == "": return error_response_handler("Bad request", 400) encashment_request = Encashment.query.get(arg_id) if encashment_request is None: return error_response_handler("Request ID not found", 404) try: db.session.delete(encashment_request) db.session.commit() except: db.session.rollback() return redirect(url_for('encashment')) return jsonify(arg_id) #========================================================== #This is not tested if request.method == 'PUT': encashment_data = request.get_json(force=True) if 'id' not in encashment_data or 'amount' not in encashment_data: return error_response_handler("Incomplete Data", 400) encashment_request = Encashment.query.get(encashment_data['id']) if encashment_request is None: return error_response_handler("Encashment request not found", 404) setattr(encashment_request, 'amount', encashment_data['amount']) setattr(encashment_request, 'hr_approval', None) setattr(encashment_request, 'manager_approval', None) setattr(encashment_request, 'gm_approval', None) try: db.session.commit() except: db.session.rollback() return redirect(url_for('encashment')) return jsonify(encashment_data['amount'])
def encashment_request(): if request.method == 'GET': requests = {} if current_user.role == "HR Manager": pending = db.session.query( Employees, Encashment).join(Encashment).filter( and_(Encashment.hr_approval == None, Encashment.manager_approval == "Approved", Encashment.gm_approval == "Approved", Encashment.emp_id != current_user.employee.id)).order_by( asc(Encashment.time_stamp)).all() responded = db.session.query( Employees, Encashment).join(Encashment).filter( and_(Encashment.hr_approval != None, Encashment.emp_id != current_user.employee.id)).order_by( asc(Encashment.time_stamp)).all() elif current_user.role == "General Manager": pending = db.session.query( Employees, Encashment).join(Encashment).filter( and_(Encashment.gm_approval == None, Encashment.manager_approval == "Approved", Encashment.emp_id != current_user.employee.id)).order_by( asc(Encashment.time_stamp)).all() responded = db.session.query( Employees, Encashment).join(Encashment).filter( and_(Encashment.gm_approval != None, Encashment.emp_id != current_user.employee.id)).order_by( asc(Encashment.time_stamp)).all() else: pending = db.session.query( Employees, Encashment ).join(Encashment).filter( and_( Encashment.manager_approval == None, Employees.reporting_manager_id == current_user.employee.id, Encashment.emp_id != current_user.employee.id)).order_by( asc(Encashment.time_stamp)).all() responded = db.session.query( Employees, Encashment ).join(Encashment).filter( and_( Encashment.manager_approval != None, Employees.reporting_manager_id == current_user.employee.id, Encashment.emp_id != current_user.employee.id)).order_by( asc(Encashment.time_stamp)).all() requests.update({'pending': pending, 'responded': responded}) return render_template('encashment-requests.html', data={'requests': requests}) if request.method == 'PUT': encashment_data = request.get_json(force=True) if 'id' not in encashment_data and 'approval' not in encashment_data: return error_response_handler("Incomplete Data", 400) encashment_request = Encashment.query.get(encashment_data['id']) employee = Employees.query.get(encashment_request.emp_id) if encashment_request is None: return error_response_handler("Encashment request not found", 404) if current_user.role == 'HR Manager': setattr(encashment_request, 'hr_approval', encashment_data['approval']) if encashment_data['approval'] == 'Approved': #flash("Encashment form sent") notify(subject='Encashment Approved', receiver_id=employee.user_id) notify(subject='Encashment Form', send_hr=True) if encashment_data['approval'] == 'Unapproved': notify(subject='Encashment Unapproved', receiver_id=employee.user_id) elif current_user.role == 'General Manager': setattr(encashment_request, 'gm_approval', encashment_data['approval']) if encashment_data['approval'] == 'Approved': notify(subject='Encashment request', send_hr=True) elif encashment_data['approval'] == 'Unapproved': notify(subject='encashment_unapproved', receiver_id=employee.user_id) else: if employee.reporting_manager_id != current_user.employee.id: return error_response_handler("Unauthorized request", 401) setattr(encashment_request, 'manager_approval', encashment_data['approval']) if encashment_data['approval'] == 'Approved': notify(subject='Encashment request', send_gm=True) elif encashment_data['approval'] == 'Unapproved': notify(subject='encashment_unapproved', receiver_id=employee.user_id) if encashment_request.hr_approval == 'Approved' and encashment_request.gm_approval == 'Approved' and encashment_request.manager_approval == 'Approved': line_manager = Employees.query.get(employee.reporting_manager_id) general_manager = Employees.query.filter_by( user_id=((User.query.filter_by( role='General Manager')).first()).id).first() hr_manager = Employees.query.filter_by( user_id=((User.query.filter_by( role='HR Manager')).first()).id).first() if employee.last_name is not None: employee_name = employee.first_name + " " + employee.last_name else: employee_name = employee.first_name if line_manager.last_name is not None: line_manager_name = line_manager.first_name + " " + line_manager.last_name else: line_manager_name = line_manager.first_name if general_manager.last_name is not None: general_manager_name = general_manager.first_name + " " + general_manager.last_name else: general_manager_name = general_manager.first_name if hr_manager.last_name is not None: hr_manager_name = hr_manager.first_name + " " + hr_manager.last_name else: hr_manager_name = hr_manager.first_name store = {} store.update({ 'name': employee_name, 'designation': employee.designation, 'email': employee.user.email, 'available_leave_balance': employee.general_leaves_remaining, 'leaves_encashed': encashment_request.leaves_utilized, 'remaining_leave_balance': employee.general_leaves_remaining - encashment_request.leaves_utilized, 'amount_encashable': employee.general_leaves_remaining * (employee.salary * 12) / 365, 'amount_encashed': encashment_request.leaves_utilized * (employee.salary * 12) / 365, 'line_manager_status': encashment_request.manager_approval, 'general_manager_status': encashment_request.gm_approval, 'hr_manager_status': encashment_request.hr_approval, 'line_manager': line_manager_name, 'general_manager': general_manager_name, 'hr_manager': hr_manager_name }) employee.general_leaves_remaining = employee.general_leaves_remaining - encashment_request.leaves_utilized employee.general_leaves_availed = employee.general_leaves_availed + encashment_request.leaves_utilized dirname = os.path.join(app.config['PDF_URL'], 'mypdf.txt') store_object = json.dumps(store) f = open(dirname, "w") f.write(store_object) f.close() encashment_data['redirect_url'] = url_for('encashment_pdf', _external=True) db.session.commit() del encashment_data['id'] return jsonify(encashment_data)