예제 #1
0
def post(idm):
    person = Person.query.filter(Person.idm == idm).first()
    if person is None:
        return jsonify({"name": "該当者無し"}), 404
    cache.set('person.id', None)
    cache.set('person.idm', None)
    now = datetime.now()
    yymm = now.strftime('%Y%m')
    dd = now.day
    hhmm = now.strftime('%H:%M')
    worklog = WorkLog.get(person.id, yymm, dd)
    if worklog is None:
        worklog = WorkLog(person_id=person.id, yymm=yymm, dd=dd)
    worklog.absence = False
    if not bool(worklog.work_in):
        worklog.work_in = hhmm
    else:
        worklog.work_out = hhmm
        worklog.value = None
        worklog.break_t = None
        worklog.over_t = None
    worklog.presented = True
    db.session.add(worklog)
    if not person.staff:
        performlog = PerformLog.get(person.id, yymm, dd)
        if performlog is None:
            performlog = PerformLog(person_id=person.id, yymm=yymm, dd=dd)
        performlog.sync_from_worklog(worklog)
        db.session.add(performlog)
    try:
        db.session.commit()
        update_worklog_value.delay(person.id, yymm, dd)
        if not person.staff:
            update_performlogs_enabled.delay(person.id, yymm)
            update_absencelog_enabled.delay(person.id, yymm)
    except Exception as e:
        db.session.rollback()
        return jsonify({"message": "{}".format(e)}), 500
    if bool(worklog.work_out):
        result = dict(
            work_in = worklog.work_in,
            work_out = worklog.work_out
        )
        return jsonify(result), 200
    result = dict(
        work_in = worklog.work_in,
        work_out = '--:--'
    )
    return jsonify(result), 201
예제 #2
0
def destroy(id, yymm, dd):
    if (not _check_yymmdd(yymm, dd=dd)):
        abort(400)
    person = Person.get(id)
    if person is None:
        abort(404)
    if not person.is_idm():
        flash('利用者のICカードをセットしてください', 'danger')
        return redirect(url_for('performlogs.index', id=id, yymm=yymm))
    performlog = PerformLog.get(id, yymm, dd)
    if performlog is None:
        abort(404)
    if bool(performlog.absencelog):
        db.session.delete(performlog.absencelog)
    db.session.delete(performlog)
    worklog = WorkLog.get(id, yymm, dd)
    db.session.delete(worklog)
    try:
        db.session.commit()
        update_performlogs_enabled.delay(id, yymm)
        update_absencelog_enabled.delay(id, yymm)
        flash('実績の削除ができました', 'success')
    except Exception as e:
        db.session.rollback()
        flash('実績削除時にエラーが発生しました "{}"'.format(e), 'danger')
    return redirect(url_for('performlogs.index', id=id, yymm=yymm))
예제 #3
0
def _is_persent(performlog):
    if bool(performlog.work_in) or bool(performlog.work_out):
        return True
    worklog = WorkLog.get(performlog.person_id, performlog.yymm, performlog.dd)
    if (worklog is None) or (worklog.value is None):
        return False
    return True
예제 #4
0
def make_items(id, yymm):
    yy = int(yymm[:4])
    mm = int(yymm[4:])
    foot = dict(
        count = 0,
        value = 0.0,
        break_t = 0.0,
        over_t = 0.0,
        absence = 0,
        late = 0,
        leave = 0
    )
    first = date(yy,mm,1)
    items = []
    for dd in range(1, 32):
        if mm != first.month:
            items.append(None)
            continue
        first = first + relativedelta(days=1)
        item = dict(
            dd = dd,
            ww = weeka[date(yy,mm,dd).weekday()],
            work_in = '',
            work_out = '',
            break_t = '',
            value = '',
            over_t = '',
            absence = '',
            leave = '',
            late = '',
            remarks = ''
        )
        worklog = WorkLog.get(id, yymm, dd)
        if worklog is None:
            items.append(item)
            continue
        item['work_in'] = worklog.work_in if bool(worklog.work_in) else ''
        item['work_out'] = worklog.work_out if bool(worklog.work_out) else ''
        if worklog.break_t is not None:
            item['break_t'] = worklog.break_t
            foot['break_t'] +=  worklog.break_t
        if worklog.value is not None:
            item['value'] = worklog.value
            foot['value'] += worklog.value
        if worklog.presented:
            foot['count'] += 1
        if worklog.over_t is not None:
            item['over_t'] = worklog.over_t
            foot['over_t'] += worklog.over_t
        item['absence'] = '○' if bool(worklog.absence) else ''
        foot['absence'] = foot['absence'] + (1 if bool(worklog.absence) else 0) 
        item['leave'] = '○' if bool(worklog.leave) else ''
        foot['leave'] = foot['leave'] + (1 if bool(worklog.leave) else 0)
        item['late'] = '○' if bool(worklog.late) else ''
        foot['late'] = foot['late'] + (1 if bool(worklog.late) else 0)
        item['remarks'] = worklog.remarks if bool(worklog.remarks) else ''
        items.append(item)
    return items, foot
예제 #5
0
def edit(id, yymm, dd):
    if (not _check_yymmdd(yymm, dd=dd)):
        abort(400)
    person = Person.get(id)
    if person is None:
        abort(404)
    yymmdd = date(int(yymm[:4]), int(yymm[4:]), int(dd))
    worklog = WorkLog.get(id, yymm, dd)
    item = dict(
        id=person.id,
        yymm=yymm,
        name=person.get_display(),
        yymmdd=yymmdd.strftime('%Y/%m/%d(%a)'),
        absence=worklog.absence,
        work_in=worklog.work_in if worklog.work_in is not None else '',
        work_out=worklog.work_out if worklog.work_out is not None else '')
    if worklog is None:
        abort(404)
    if person.staff:
        form = WorkLogFormStaff(obj=worklog)
    else:
        if worklog.absence:
            form = WorkLogFormRemarks(obj=worklog)
        else:
            form = WorkLogForm(obj=worklog)
    if form.validate_on_submit():
        worklog.populate_form(form)
        try:
            db.session.add(worklog)
            try:
                db.session.commit()
                if (person.staff) and (worklog.value is None):
                    update_worklog_value.delay(id, yymm, dd)
                if not person.staff:
                    update_performlogs_enabled(id, yymm)
                flash('勤怠の更新ができました', 'success')
                return redirect(url_for('worklogs.index', id=id, yymm=yymm))
            except Exception as e:
                db.session.rollback()
                flash('勤怠更新時にエラーが発生しました "{}"'.format(e), 'danger')
        except ValidationError as e:
            flash(e, 'danger')
    if person.staff:
        return render_template('worklogs/edit_staff.pug',
                               id=id,
                               yymm=yymm,
                               form=form,
                               item=item)
    return render_template('worklogs/edit.pug',
                           id=id,
                           yymm=yymm,
                           form=form,
                           item=item)
예제 #6
0
 def update(self, form):
     form.populate_obj(self)
     worklog = WorkLog.get_or_new(self.person_id, self.yymm, self.dd)
     self.presented = self.is_presented(worklog)
     self.enabled = self.is_enabled()
     db.session.add(self)
     absencelog = AbsenceLog.query.get((self.person_id, self.yymm, self.dd))
     if bool(absencelog) and (not self.absence_add):
         db.session.delete(absencelog)
     elif (not bool(absencelog)) and self.absence_add:
         absencelog = AbsenceLog(person_id=self.person_id, yymm=self.yymm, dd=self.dd)
         db.session.add(absencelog)
     self.sync_to_worklog(worklog)
     db.session.commit()
예제 #7
0
def edit(id, yymm, dd):
    if (not _check_yymmdd(yymm, dd=dd)):
        abort(400)
    person = Person.get(id)
    if person is None:
        abort(404)
    yymmdd = date(int(yymm[:4]), int(yymm[4:]), int(dd))
    item = dict(name=person.get_display(),
                yymmdd=yymmdd.strftime('%Y/%m/%d(%a)'))
    performlog = PerformLog.get(id, yymm, dd)
    if performlog is None:
        abort(404)
    if person.is_idm():
        form = PerformLogsFormIDM(obj=performlog)
    else:
        form = PerformLogsForm(obj=performlog)
    if form.validate_on_submit():
        performlog.populate_form(form)
        try:
            performlog.validate()
            if performlog.absence_add:
                if bool(performlog.absencelog):
                    performlog.absencelog.deleted = False
                else:
                    absencelog = AbsenceLog()
                    performlog.absencelog = absencelog
            else:
                if bool(performlog.absencelog):
                    performlog.absencelog.deleted = True
            db.session.add(performlog)
            worklog = WorkLog.get(id, yymm, dd)
            performlog.sync_to_worklog(worklog)
            try:
                db.session.commit()
                update_performlogs_enabled.delay(id, yymm)
                update_absencelog_enabled.delay(id, yymm)
                update_worklog_value.delay(id, yymm, dd)
                flash('実績の更新ができました', 'success')
                return redirect(url_for('performlogs.index', id=id, yymm=yymm))
            except Exception as e:
                db.session.rollback()
                flash('実績更新時にエラーが発生しました "{}"'.format(e), 'danger')
        except ValidationError as e:
            flash(e, 'danger')
    return render_template('performlogs/edit.pug',
                           id=id,
                           yymm=yymm,
                           item=item,
                           form=form)
예제 #8
0
def create(id, yymm, dd):
    if (not _check_yymmdd(yymm, dd=dd)):
        abort(400)
    person = Person.get(id)
    if person is None:
        abort(404)
    yymmdd = date(int(yymm[:4]), int(yymm[4:]), int(dd))
    item = dict(id=person.id,
                yymm=yymm,
                name=person.get_display(),
                yymmdd=yymmdd.strftime('%Y/%m/%d(%a)'))
    if not person.staff:
        flash('職員以外は勤怠登録はできません。実績登録で行ってください ', 'danger')
        return redirect(url_for('worklogs.index', id=id, yymm=yymm))
    form = WorkLogFormStaff()
    if form.validate_on_submit():
        worklog = WorkLog(person_id=id, yymm=yymm, dd=dd)
        worklog.populate_form(form)
        try:
            db.session.add(worklog)
            try:
                db.session.commit()
                if (person.staff) and (worklog.value is None):
                    update_worklog_value.delay(id, yymm, dd)
                flash('勤怠の追加ができました', 'success')
                return redirect(url_for('worklogs.index', id=id, yymm=yymm))
            except Exception as e:
                db.session.rollback()
                flash('勤怠追加時にエラーが発生しました "{}"'.format(e), 'danger')
        except ValidationError as e:
            flash(e, 'danger')
    return render_template('worklogs/edit_staff.pug',
                           id=id,
                           yymm=yymm,
                           form=form,
                           item=item)
예제 #9
0
def destroy(id, yymm, dd):
    if (not _check_yymmdd(yymm, dd=dd)):
        abort(400)
    person = Person.get(id)
    if person is None:
        abort(404)
    if not person.staff:
        flash('職員以外は勤怠削除はできません。実績削除で行ってください "{}"'.format(e), 'danger')
        return redirect(url_for('performlogs.index', id=id, yymm=yymm))
    worklog = WorkLog.get(id, yymm, dd)
    if worklog is None:
        abort(404)
    db.session.delete(worklog)
    try:
        db.session.commit()
        flash('勤怠の削除ができました', 'success')
    except Exception as e:
        db.session.rollback()
        flash('勤怠削除時にエラーが発生しました "{}"'.format(e), 'danger')
    return redirect(url_for('worklogs.index', id=id, yymm=yymm))
예제 #10
0
def update_worklog_value(id, yymm, dd=None):
    app.logger.info(
        'Update WorkLog value from Time-Table. id={} yymm={} dd={}'.format(
            id, yymm, dd))
    person = Person.get(id)
    if person is None:
        return
    if person.timerule_id is None:
        return
    timerule = TimeRule.get(person.timerule_id)
    if timerule is None:
        return
    if dd is None:
        dds = range(1, 32)
    else:
        dds = (dd, )
    for d in dds:
        worklog = WorkLog.get(id, yymm, d)
        if worklog is None:
            continue
        if worklog.value is not None:
            continue
        app.logger.info(
            'Updating WorkLog value from Time-Table. id={} yymm={} dd={}'.
            format(id, yymm, d))
        if not bool(worklog.work_in):
            continue
        if not bool(worklog.work_out):
            continue
        rules = json.loads(timerule.rules)
        work_in = rules['core']['start']
        work_out = rules['core']['end']
        for i in rules['times']:
            if (i['in']) and (i['start'] <= worklog.work_in) and (
                    worklog.work_in < i['end']):
                work_in = i['value']
                break
        for i in rules['times']:
            if (i['out']) and (i['start'] <= worklog.work_out) and (
                    worklog.work_out < i['end']):
                work_out = i['value']
                break
        value = work_out - work_in
        break_t = 0.0
        if 'break' in rules:
            for i in rules['break']:
                if (work_in <= i['start']) and (work_out >= i['end']):
                    break_t = break_t + i['value']
        if value < 0:
            value = 0
        elif ('max' in rules) and (value > rules['max']):
            value = rules['max']
        worklog.value = value - break_t
        worklog.break_t = break_t
        worklog.over_t = worklog.value - rules['core']['value']
        if worklog.over_t < 0:
            worklog.over_t = 0
        worklog.late = work_in > rules['core']['start']
        worklog.leave = work_out < rules['core']['end']
        db.session.add(worklog)
    try:
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        app.logger.error(e)
예제 #11
0
def index(id, yymm=None):
    if (yymm is not None) and (not _check_yymmdd(yymm)):
        abort(400)
    person = Person.get(id)
    if person is None:
        abort(404)
    if yymm is None:
        now = date.today()
        yymm = now.strftime('%Y%m')
    else:
        now = date(int(yymm[:4]), int(yymm[4:]), 1)
    first = date(now.year, now.month, 1)
    last = first + relativedelta(months=1)
    prev = first - relativedelta(months=1)
    head = dict(id=person.id,
                name=person.get_display(),
                staff=person.staff,
                yymm=yymm,
                ym='{}年{}月'.format(first.year, first.month),
                prev=prev.strftime('%Y%m'),
                next=last.strftime('%Y%m'))
    foot = dict(cnt=0,
                sum=0,
                avg=0,
                break_t=0,
                over_t=0,
                absence=0,
                late=0,
                leave=0)
    items = []
    while first < last:
        item = dict(dd=first.day,
                    presented=None,
                    week=weeka[first.weekday()],
                    situation=None,
                    work_in=None,
                    work_out=None,
                    value=None,
                    break_t=None,
                    over_t=None,
                    remarks=None,
                    absence=False,
                    late=False,
                    leave=False,
                    edit=False)
        worklog = WorkLog.get_date(id, first)
        if worklog is not None:
            item['edit'] = True
            item['presented'] = worklog.presented
            item['work_in'] = worklog.work_in
            item['work_out'] = worklog.work_out
            item['value'] = worklog.value
            item['break_t'] = worklog.break_t
            item['over_t'] = worklog.over_t
            item['absence'] = worklog.absence
            item['late'] = worklog.late
            item['leave'] = worklog.leave
            item['remarks'] = worklog.remarks
            foot['cnt'] += 1 if bool(worklog.value) else 0
            foot['sum'] += worklog.value if bool(worklog.value) else 0
            foot['break_t'] += worklog.break_t if bool(worklog.break_t) else 0
            foot['over_t'] += worklog.over_t if bool(worklog.over_t) else 0
            foot['absence'] += 1 if bool(worklog.absence) else 0
            foot['late'] += 1 if bool(worklog.late) else 0
            foot['leave'] += 1 if bool(worklog.leave) else 0
        items.append(item)
        first = first + relativedelta(days=1)
    return render_template('worklogs/index.pug',
                           id=id,
                           yymm=yymm,
                           head=head,
                           items=items,
                           foot=foot)