From 8331b18cce998a7484b3cb488147f6d37709f481 Mon Sep 17 00:00:00 2001 From: Tanshu Date: Fri, 30 Nov 2012 22:53:16 +0530 Subject: [PATCH] Added fingerprint import. Fingerprint shows in attendance forms. Upated the fingerprint table. MUST EXECUTE SQL. --- brewman/brewman/__init__.py | 1 + brewman/brewman/models/master.py | 7 +++- brewman/brewman/models/voucher.py | 33 ++++++++----------- .../brewman/static/partial/attendance.html | 2 ++ .../static/partial/employee-attendance.html | 2 ++ .../static/partial/employee-functions.html | 2 +- .../static/scripts/employee-functions.js | 23 +++++++++++-- brewman/brewman/views/attendance.py | 32 +++++++++++------- 8 files changed, 67 insertions(+), 35 deletions(-) diff --git a/brewman/brewman/__init__.py b/brewman/brewman/__init__.py index d742a32d..4e0f6ec9 100644 --- a/brewman/brewman/__init__.py +++ b/brewman/brewman/__init__.py @@ -108,6 +108,7 @@ def main(global_config, **settings): config.add_route('attendance_report', '/AttendanceReport') config.add_route('credit_salary', '/CreditSalary') config.add_route('employee_functions', '/EmployeeFunctions') + config.add_route('fingerprint', '/Fingerprint') config.add_route('ledger_id', '/Ledger/{id}') config.add_route('ledger', '/Ledger') diff --git a/brewman/brewman/models/master.py b/brewman/brewman/models/master.py index 6a0d415a..e23053fd 100644 --- a/brewman/brewman/models/master.py +++ b/brewman/brewman/models/master.py @@ -247,7 +247,8 @@ class Employee(LedgerBase): joining_date = Column('JoiningDate', DateTime) leaving_date = Column('LeavingDate', DateTime) - attendances = relationship('Attendance', backref='employe', cascade=None, cascade_backrefs=False) + attendances = relationship('Attendance', backref='employee', cascade=None, cascade_backrefs=False) + fingerprints = relationship('Fingerprint', backref='employee', cascade=None, cascade_backrefs=False) def __init__(self, code=None, name=None, is_active=None, costcenter_id=None, designation=None, salary=None, service_points=None, joining_date=None, leaving_date=None): @@ -274,6 +275,10 @@ class Employee(LedgerBase): return DBSession.query(Employee).order_by(desc(Employee.is_active)).order_by(Ledger.costcenter_id).order_by( Employee.designation).order_by(Employee.name).all() + @classmethod + def by_code(cls, code): + return DBSession.query(cls).filter(cls.code == code).first() + class Ledger(LedgerBase): __mapper_args__ = {'polymorphic_identity': ''} diff --git a/brewman/brewman/models/voucher.py b/brewman/brewman/models/voucher.py index a176f5bc..e5077504 100644 --- a/brewman/brewman/models/voucher.py +++ b/brewman/brewman/models/voucher.py @@ -288,32 +288,24 @@ class Attendance(Base): return DBSession.query(cls) def create(self): - old = DBSession.query(func.count(Attendance.id)).filter(Attendance.date == self.date)\ - .filter(Attendance.employee_id == self.employee_id)\ - .filter(Attendance.attendance_type == self.attendance_type)\ - .filter(Attendance.is_valid == True).first() - if old == 0: - return old = DBSession.query(Attendance).filter(Attendance.date == self.date)\ .filter(Attendance.employee_id == self.employee_id)\ .filter(Attendance.is_valid == True).first() - if not old is None: - old.is_valid = False - DBSession.add(self) + if old is None or old.attendance_type != self.attendance_type: + if old is not None: + old.is_valid = False + DBSession.add(self) class Fingerprint(Base): __tablename__ = 'entities_fingerprints' id = Column('FingerprintID', GUID(), primary_key=True, default=uuid.uuid4) - employee_id = Column('EmployeeID', GUID(), ForeignKey('entities_employees.LedgerID')) - employee_code = Column('EmployeeCode', Integer) + employee_code = Column('EmployeeCode', Integer, ForeignKey('entities_ledgers.Code')) date = Column('Date', DateTime) - fingerprint_type = Column('FingerprintType', Integer) - def __init__(self, id=None, employee_id=None, employee_code=None, date=None): + def __init__(self, id=None, employee_code=None, date=None): self.id = id - self.employee_id = employee_id self.employee_code = employee_code self.date = date self.fingerprint_type = 0 @@ -327,8 +319,11 @@ class Fingerprint(Base): return DBSession.query(cls) def create(self): - old = DBSession.query(func.count(Fingerprint.id)).filter(Fingerprint.date == self.date)\ - .filter(Fingerprint.employee_id == self.employee_id).first() - if old == 0: - return - DBSession.add(self) + old = DBSession.query(Fingerprint).filter(Fingerprint.date == self.date)\ + .filter(Fingerprint.employee_code == self.employee_code).first() + if old is None: + DBSession.add(self) + return self + else: + return old + diff --git a/brewman/brewman/static/partial/attendance.html b/brewman/brewman/static/partial/attendance.html index bd51a5e8..f2ea266b 100644 --- a/brewman/brewman/static/partial/attendance.html +++ b/brewman/brewman/static/partial/attendance.html @@ -20,6 +20,7 @@ Designation Department Status + Prints @@ -35,6 +36,7 @@ ng-options="i.AttendanceTypeID as i.Name for i in attendance_types"> + {{item.Prints}} diff --git a/brewman/brewman/static/partial/employee-attendance.html b/brewman/brewman/static/partial/employee-attendance.html index 6462348c..ae8bd243 100644 --- a/brewman/brewman/static/partial/employee-attendance.html +++ b/brewman/brewman/static/partial/employee-attendance.html @@ -26,6 +26,7 @@ Date Status + Prints isDirty @@ -39,6 +40,7 @@ ng-options="i.AttendanceTypeID as i.Name for i in attendance_types"> + {{item.Prints}} diff --git a/brewman/brewman/static/partial/employee-functions.html b/brewman/brewman/static/partial/employee-functions.html index 277f9dad..9a32304b 100644 --- a/brewman/brewman/static/partial/employee-functions.html +++ b/brewman/brewman/static/partial/employee-functions.html @@ -23,7 +23,7 @@
- +
diff --git a/brewman/brewman/static/scripts/employee-functions.js b/brewman/brewman/static/scripts/employee-functions.js index b9f7b294..c714e53c 100644 --- a/brewman/brewman/static/scripts/employee-functions.js +++ b/brewman/brewman/static/scripts/employee-functions.js @@ -15,9 +15,28 @@ var EmployeeFunctionsCtrl = ['$scope', '$http', function ($scope, $http) { $scope.attendanceRecordUrl = function () { var url = '/AttendanceReport?StartDate=' + $scope.record.Start + "&FinishDate=" + $scope.record.Finish; return url; - }; + } + $scope.setFile = function (element) { + $scope.uploadedFile = element.files[0]; + } $scope.uploadFingerprints = function () { - $scope.toasts.push({Type:'Error', Message:'Not Implemented Yet'}); + if (!$scope.uploadedFile) { + $scope.toasts.push({Type:'Error', Message:'Please choose a file first!'}); + return; + } + var fd = new FormData(); + fd.append("uploadedFile", $scope.uploadedFile); + $http + .post('/Fingerprint', fd, { + headers:{ + 'Content-Type':undefined + }, + transformRequest:angular.identity + }).success(function () { + $scope.toasts.push({Type:'Success', Message:'Data uploaded'}); + }).error(function (data, status, headers, config) { + $scope.toasts.push({Type:'Error', Message:data}); + }); }; }] diff --git a/brewman/brewman/views/attendance.py b/brewman/brewman/views/attendance.py index dd39e571..97d1ac6c 100644 --- a/brewman/brewman/views/attendance.py +++ b/brewman/brewman/views/attendance.py @@ -8,7 +8,7 @@ import transaction from brewman.models import DBSession from brewman.models.master import AttendanceType, Employee from brewman.models.validation_exception import ValidationError -from brewman.models.voucher import Attendance +from brewman.models.voucher import Attendance, Fingerprint from brewman.views.services.session import session_period_start, session_period_finish, session_current_date __author__ = 'tanshu' @@ -48,8 +48,6 @@ def attendance_date(request): def attendance_date_report(date): report = {'Date': date, 'Body': []} date = datetime.datetime.strptime(date, '%d-%b-%Y') - # TODO: Add Fingerprints - # attendances = AttendanceType.list() employees = DBSession().query(Employee)\ .filter(Employee.joining_date <= date)\ .filter(or_(Employee.is_active, Employee.leaving_date >= date))\ @@ -59,8 +57,14 @@ def attendance_date_report(date): Attendance.date == date).filter(Attendance.is_valid == True).first() att = 0 if att is None else att.attendance_type + start_fp = date + datetime.timedelta(hours=7) + finish_fp = date + datetime.timedelta(hours=7, days=1) + prints = DBSession.query(Fingerprint).filter(Fingerprint.employee_code == item.code)\ + .filter(Fingerprint.date >= start_fp).filter(Fingerprint.date < finish_fp).order_by(Fingerprint.date).all() + prints = ', '.join([x.date.strftime('%H:%M') for x in prints]) + report['Body'].append({'id': item.id, 'Code': item.code, 'Name': item.name, 'Designation': item.designation, - 'Department': item.costcenter.name, 'AttendanceTypeID': att}) + 'Department': item.costcenter.name, 'AttendanceTypeID': att, 'Prints': prints}) return report @@ -102,17 +106,16 @@ def employee_attendance_report(request): start_date = request.GET.get('StartDate', session_period_start(request)) finish_date = request.GET.get('FinishDate', session_period_finish(request)) info = {'StartDate': start_date, 'FinishDate': finish_date, - 'Employee': {'LedgerID': employee.id, 'Name': employee.name}, - 'Body': employee_attendance(employee, start_date, finish_date)} - return info - - -def employee_attendance(employee, start_date, finish_date): - # TODO: Add Fingerprints + 'Employee': {'LedgerID': employee.id, 'Name': employee.name}} start_date = datetime.datetime.strptime(start_date, '%d-%b-%Y') finish_date = datetime.datetime.strptime(finish_date, '%d-%b-%Y') start_date = employee.joining_date if employee.joining_date > start_date else start_date finish_date = employee.leaving_date if not employee.is_active and employee.leaving_date < finish_date else finish_date + info['Body'] = employee_attendance(employee, start_date, finish_date) + return info + + +def employee_attendance(employee, start_date, finish_date): list = [] for item in daterange(start_date, finish_date, inclusive=True): att = DBSession.query(Attendance)\ @@ -121,7 +124,12 @@ def employee_attendance(employee, start_date, finish_date): .filter(Attendance.is_valid == True)\ .first() att = 0 if att is None else att.attendance_type - list.append({'Date': item.strftime('%d-%b-%Y'), 'AttendanceTypeID': att}) + start_fp = item + datetime.timedelta(hours=7) + finish_fp = item + datetime.timedelta(hours=7, days=1) + prints = DBSession.query(Fingerprint).filter(Fingerprint.employee_code == employee.code)\ + .filter(Fingerprint.date >= start_fp).filter(Fingerprint.date < finish_fp).order_by(Fingerprint.date).all() + prints = ', '.join([x.date.strftime('%H:%M') for x in prints]) + list.append({'Date': item.strftime('%d-%b-%Y'), 'AttendanceTypeID': att, 'Prints': prints}) return list