예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
from app.resources.notifications import notify
	notify('*****@*****.**')
예제 #6
0
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'])
예제 #7
0
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)