Added fingerprint import.

Fingerprint shows in attendance forms.
Upated the fingerprint table.  MUST EXECUTE SQL.
This commit is contained in:
Tanshu 2012-11-30 22:53:16 +05:30
parent 1cb0347c86
commit 8331b18cce
8 changed files with 67 additions and 35 deletions

View File

@ -108,6 +108,7 @@ def main(global_config, **settings):
config.add_route('attendance_report', '/AttendanceReport') config.add_route('attendance_report', '/AttendanceReport')
config.add_route('credit_salary', '/CreditSalary') config.add_route('credit_salary', '/CreditSalary')
config.add_route('employee_functions', '/EmployeeFunctions') config.add_route('employee_functions', '/EmployeeFunctions')
config.add_route('fingerprint', '/Fingerprint')
config.add_route('ledger_id', '/Ledger/{id}') config.add_route('ledger_id', '/Ledger/{id}')
config.add_route('ledger', '/Ledger') config.add_route('ledger', '/Ledger')

View File

@ -247,7 +247,8 @@ class Employee(LedgerBase):
joining_date = Column('JoiningDate', DateTime) joining_date = Column('JoiningDate', DateTime)
leaving_date = Column('LeavingDate', 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, 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): 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( return DBSession.query(Employee).order_by(desc(Employee.is_active)).order_by(Ledger.costcenter_id).order_by(
Employee.designation).order_by(Employee.name).all() 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): class Ledger(LedgerBase):
__mapper_args__ = {'polymorphic_identity': ''} __mapper_args__ = {'polymorphic_identity': ''}

View File

@ -288,32 +288,24 @@ class Attendance(Base):
return DBSession.query(cls) return DBSession.query(cls)
def create(self): 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)\ old = DBSession.query(Attendance).filter(Attendance.date == self.date)\
.filter(Attendance.employee_id == self.employee_id)\ .filter(Attendance.employee_id == self.employee_id)\
.filter(Attendance.is_valid == True).first() .filter(Attendance.is_valid == True).first()
if not old is None: if old is None or old.attendance_type != self.attendance_type:
old.is_valid = False if old is not None:
DBSession.add(self) old.is_valid = False
DBSession.add(self)
class Fingerprint(Base): class Fingerprint(Base):
__tablename__ = 'entities_fingerprints' __tablename__ = 'entities_fingerprints'
id = Column('FingerprintID', GUID(), primary_key=True, default=uuid.uuid4) id = Column('FingerprintID', GUID(), primary_key=True, default=uuid.uuid4)
employee_id = Column('EmployeeID', GUID(), ForeignKey('entities_employees.LedgerID')) employee_code = Column('EmployeeCode', Integer, ForeignKey('entities_ledgers.Code'))
employee_code = Column('EmployeeCode', Integer)
date = Column('Date', DateTime) 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.id = id
self.employee_id = employee_id
self.employee_code = employee_code self.employee_code = employee_code
self.date = date self.date = date
self.fingerprint_type = 0 self.fingerprint_type = 0
@ -327,8 +319,11 @@ class Fingerprint(Base):
return DBSession.query(cls) return DBSession.query(cls)
def create(self): def create(self):
old = DBSession.query(func.count(Fingerprint.id)).filter(Fingerprint.date == self.date)\ old = DBSession.query(Fingerprint).filter(Fingerprint.date == self.date)\
.filter(Fingerprint.employee_id == self.employee_id).first() .filter(Fingerprint.employee_code == self.employee_code).first()
if old == 0: if old is None:
return DBSession.add(self)
DBSession.add(self) return self
else:
return old

View File

@ -20,6 +20,7 @@
<th>Designation</th> <th>Designation</th>
<th>Department</th> <th>Department</th>
<th>Status</th> <th>Status</th>
<th>Prints</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -35,6 +36,7 @@
ng-options="i.AttendanceTypeID as i.Name for i in attendance_types"> </select> ng-options="i.AttendanceTypeID as i.Name for i in attendance_types"> </select>
</td> </td>
<td>{{item.Prints}}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@ -26,6 +26,7 @@
<tr> <tr>
<th>Date</th> <th>Date</th>
<th>Status</th> <th>Status</th>
<th>Prints</th>
<th>isDirty</th> <th>isDirty</th>
</tr> </tr>
</thead> </thead>
@ -39,6 +40,7 @@
ng-options="i.AttendanceTypeID as i.Name for i in attendance_types"> </select> ng-options="i.AttendanceTypeID as i.Name for i in attendance_types"> </select>
</td> </td>
<td>{{item.Prints}}</td>
<td> <td>
<button ng-show="isDirty()" class="btn btn-primary">Is Dirty</button> <button ng-show="isDirty()" class="btn btn-primary">Is Dirty</button>
</td> </td>

View File

@ -23,7 +23,7 @@
<label for="uploadFingerprints" class="control-label"></label> <label for="uploadFingerprints" class="control-label"></label>
<div class="controls"> <div class="controls">
<input type="file" id="uploadFingerprints" /> <input type="file" id="uploadFingerprints" ng-model="upFile" onchange="angular.element(this).scope().setFile(this)" />
<button class="btn" ng-click="uploadFingerprints()">Upload</button> <button class="btn" ng-click="uploadFingerprints()">Upload</button>
</div> </div>
</div> </div>

View File

@ -15,9 +15,28 @@ var EmployeeFunctionsCtrl = ['$scope', '$http', function ($scope, $http) {
$scope.attendanceRecordUrl = function () { $scope.attendanceRecordUrl = function () {
var url = '/AttendanceReport?StartDate=' + $scope.record.Start + "&FinishDate=" + $scope.record.Finish; var url = '/AttendanceReport?StartDate=' + $scope.record.Start + "&FinishDate=" + $scope.record.Finish;
return url; return url;
}; }
$scope.setFile = function (element) {
$scope.uploadedFile = element.files[0];
}
$scope.uploadFingerprints = function () { $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});
});
}; };
}] }]

View File

@ -8,7 +8,7 @@ import transaction
from brewman.models import DBSession from brewman.models import DBSession
from brewman.models.master import AttendanceType, Employee from brewman.models.master import AttendanceType, Employee
from brewman.models.validation_exception import ValidationError 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 from brewman.views.services.session import session_period_start, session_period_finish, session_current_date
__author__ = 'tanshu' __author__ = 'tanshu'
@ -48,8 +48,6 @@ def attendance_date(request):
def attendance_date_report(date): def attendance_date_report(date):
report = {'Date': date, 'Body': []} report = {'Date': date, 'Body': []}
date = datetime.datetime.strptime(date, '%d-%b-%Y') date = datetime.datetime.strptime(date, '%d-%b-%Y')
# TODO: Add Fingerprints
# attendances = AttendanceType.list()
employees = DBSession().query(Employee)\ employees = DBSession().query(Employee)\
.filter(Employee.joining_date <= date)\ .filter(Employee.joining_date <= date)\
.filter(or_(Employee.is_active, Employee.leaving_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() Attendance.date == date).filter(Attendance.is_valid == True).first()
att = 0 if att is None else att.attendance_type 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, 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 return report
@ -102,17 +106,16 @@ def employee_attendance_report(request):
start_date = request.GET.get('StartDate', session_period_start(request)) start_date = request.GET.get('StartDate', session_period_start(request))
finish_date = request.GET.get('FinishDate', session_period_finish(request)) finish_date = request.GET.get('FinishDate', session_period_finish(request))
info = {'StartDate': start_date, 'FinishDate': finish_date, info = {'StartDate': start_date, 'FinishDate': finish_date,
'Employee': {'LedgerID': employee.id, 'Name': employee.name}, '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
start_date = datetime.datetime.strptime(start_date, '%d-%b-%Y') start_date = datetime.datetime.strptime(start_date, '%d-%b-%Y')
finish_date = datetime.datetime.strptime(finish_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 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 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 = [] list = []
for item in daterange(start_date, finish_date, inclusive=True): for item in daterange(start_date, finish_date, inclusive=True):
att = DBSession.query(Attendance)\ att = DBSession.query(Attendance)\
@ -121,7 +124,12 @@ def employee_attendance(employee, start_date, finish_date):
.filter(Attendance.is_valid == True)\ .filter(Attendance.is_valid == True)\
.first() .first()
att = 0 if att is None else att.attendance_type 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 return list