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
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))
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
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
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)
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()
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)
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)
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))
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)
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)