Пример #1
0
def set_attendance_status_daily(date=""):
    """ A function that runs once a day, in order to set user's attendance attendance

    If user has checked out, set_attendance_status_on_check_out should be called.
    So this function should deal with illegal attendance, such as no_check_out, no_attendance_today, etc.
    """
    if not date:
        date = datetime.datetime.now().strftime("%Y-%m-%d")

    the_date = datetime.datetime.strptime(date, "%Y-%m-%d")

    default_check_time = datetime.datetime.strptime("{date}".format(date=date), "%Y-%m-%d")

    session = DB_Session()
    users = session.query(User).filter(
        User.is_present == 1,
        User.is_admin == 0
    ).order_by(User.id).all()

    for user in users:
        try:
            # 用户当天有打卡记录,说明来打过上班卡
            attendance = session.query(Attendance).filter(
                Attendance.userid == user.id,
                Attendance.date == date
            ).one()
            if attendance.attendance_status == 1:
                # 状态为待定,说明还没打下班卡
                attendance.check_out = default_check_time
                attendance.is_maintainable = 2
                if the_date.weekday() in [5, 6]:
                    # 周末加班忘打下班卡……
                    # 只能算作没加班了……
                    # ╮(╯▽╰)╭
                    attendance.attendance_status = 2
                else:
                    attendance.attendance_status = 9
            else:
                # 用户的状态已经计算过了,忽略
                pass
        except sqlalchemy.orm.exc.NoResultFound:
            # 没有找到用户当天的打卡记录
            # 需要强势插入一条记录!
            legal_check_in = datetime.datetime.strptime(
                "{date} {time}".format(date=date, time=user.banci), "%Y-%m-%d %H:%M"
            )
            legal_check_out = legal_check_in + datetime.timedelta(hours=9)
            attendance = Attendance(
                userid=user.id,
                legal_check_in=legal_check_in,
                legal_check_out=legal_check_out,
                date=date,
                check_in=default_check_time,
                check_out=default_check_time,
                updatetime=datetime.datetime.now()
            )
            if the_date.weekday() in [5, 6]:
                # 周末未打卡,正常
                attendance.is_maintainable = 1
                attendance.attendance_status = 2
            else:
                # 工作日未打卡,得多大心啊...
                attendance.is_maintainable = 2
                attendance.attendance_status = 9
            session.add(attendance)
        except sqlalchemy.orm.exc.MultipleResultsFound:
            # 找到当天有多条打卡记录
            # todo
            pass

    session.commit()
    session.close()