Added Labels to attendance showing hours worked according to fingerprint data.
Table styles made to exclude the fingerprint column. Bumped version to 3.2
This commit is contained in:
parent
5f4e96be88
commit
9a8e504e46
brewman
@ -6,51 +6,42 @@
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
.table tbody tr.success td {
|
||||
background-color: #1F7A1F;
|
||||
}
|
||||
|
||||
.table tbody tr.success td {
|
||||
background-color: #1F7A1F;
|
||||
}
|
||||
|
||||
|
||||
.table tbody tr.Present td {
|
||||
.table tbody tr.Present td:not(.no-bg) {
|
||||
background-color: #228B22;
|
||||
}
|
||||
.table tbody tr.Off td {
|
||||
.table tbody tr.Off td:not(.no-bg) {
|
||||
background-color: #87CEFA;
|
||||
}
|
||||
.table tbody tr.Leave td {
|
||||
.table tbody tr.Leave td:not(.no-bg) {
|
||||
background-color: #CD5C5C;
|
||||
}
|
||||
.table tbody tr.Absent td {
|
||||
.table tbody tr.Absent td:not(.no-bg) {
|
||||
background-color: #CD0000;
|
||||
}
|
||||
.table tbody tr.HalfDay td {
|
||||
.table tbody tr.HalfDay td:not(.no-bg) {
|
||||
background-color: #98FB98;
|
||||
}
|
||||
.table tbody tr.Double td {
|
||||
.table tbody tr.Double td:not(.no-bg) {
|
||||
background-color: #006400;
|
||||
}
|
||||
.table tbody tr.PaidLeaveAvailed td {
|
||||
.table tbody tr.PaidLeaveAvailed td:not(.no-bg) {
|
||||
background-color: #EEEE00;
|
||||
}
|
||||
.table tbody tr.CasualLeaveAvailed td {
|
||||
.table tbody tr.CasualLeaveAvailed td:not(.no-bg) {
|
||||
background-color: #800080;
|
||||
}
|
||||
.table tbody tr.Overtime td {
|
||||
.table tbody tr.Overtime td:not(.no-bg) {
|
||||
background-color: #006400;
|
||||
}
|
||||
.table tbody tr.OffWorked td {
|
||||
.table tbody tr.OffWorked td:not(.no-bg) {
|
||||
background-color: #F5DEB3;
|
||||
}
|
||||
.table tbody tr.COff td {
|
||||
.table tbody tr.COff td:not(.no-bg) {
|
||||
background-color: #F5DEB3;
|
||||
}
|
||||
.table tbody tr.HalfPL td {
|
||||
.table tbody tr.HalfPL td:not(.no-bg) {
|
||||
background-color: #FFF68F;
|
||||
}
|
||||
.table tbody tr.HalfCL td {
|
||||
.table tbody tr.HalfCL td:not(.no-bg) {
|
||||
background-color: #FF00FF;
|
||||
}
|
@ -36,7 +36,9 @@
|
||||
ng-options="i.AttendanceTypeID as i.Name for i in attendance_types"> </select>
|
||||
|
||||
</td>
|
||||
<td>{{item.Prints}}</td>
|
||||
<td class="no-bg">{{item.Prints}} <span ng-show="item.Hours.length > 0"
|
||||
ng-class="{'label': isLabel(), 'label-success': isGood(), 'label-warning': isBad(), 'label-important': isError()}">{{item.Hours}}</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
@ -40,7 +40,9 @@
|
||||
ng-options="i.AttendanceTypeID as i.Name for i in attendance_types"> </select>
|
||||
|
||||
</td>
|
||||
<td>{{item.Prints}}</td>
|
||||
<td class="no-bg">{{item.Prints}} <span ng-show="item.Hours.length > 0"
|
||||
ng-class="{'label': isLabel(), 'label-success': !isError(), 'label-important': isError()}">{{item.Hours}}</span>
|
||||
</td>
|
||||
<td>
|
||||
<button ng-show="isDirty()" class="btn btn-primary">Is Dirty</button>
|
||||
</td>
|
||||
|
@ -20,6 +20,22 @@ var AttendanceSubCtrl = ['$scope', function ($scope) {
|
||||
$scope.original = {};
|
||||
angular.copy($scope.item, $scope.original);
|
||||
|
||||
$scope.isLabel = function(){
|
||||
return true;
|
||||
}
|
||||
|
||||
$scope.isError = function(){
|
||||
return $scope.item.Worked === 'Error';
|
||||
}
|
||||
|
||||
$scope.isGood = function(){
|
||||
return $scope.item.Worked === true;
|
||||
}
|
||||
|
||||
$scope.isBad = function(){
|
||||
return $scope.item.Worked === false;
|
||||
}
|
||||
|
||||
$scope.isDirty = function(){
|
||||
return !angular.equals($scope.original, $scope.item)
|
||||
}
|
||||
|
@ -30,6 +30,22 @@ function EmployeeAttendanceSubCtrl($scope) {
|
||||
$scope.original = {};
|
||||
angular.copy($scope.item, $scope.original);
|
||||
|
||||
$scope.isLabel = function(){
|
||||
return true;
|
||||
}
|
||||
|
||||
$scope.isError = function(){
|
||||
return $scope.item.Worked === 'Error';
|
||||
}
|
||||
|
||||
$scope.isGood = function(){
|
||||
return $scope.item.Worked === true;
|
||||
}
|
||||
|
||||
$scope.isBad = function(){
|
||||
return $scope.item.Worked === false;
|
||||
}
|
||||
|
||||
$scope.isDirty = function(){
|
||||
return !angular.equals($scope.original, $scope.item)
|
||||
}
|
||||
|
@ -8,7 +8,8 @@ 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, Fingerprint
|
||||
from brewman.models.voucher import Attendance
|
||||
from brewman.views.fingerprint import get_prints
|
||||
from brewman.views.services.session import session_period_start, session_period_finish, session_current_date
|
||||
|
||||
__author__ = 'tanshu'
|
||||
@ -57,14 +58,10 @@ 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])
|
||||
|
||||
prints, hours, worked = get_prints(item.code, date)
|
||||
report['Body'].append({'id': item.id, 'Code': item.code, 'Name': item.name, 'Designation': item.designation,
|
||||
'Department': item.costcenter.name, 'AttendanceTypeID': att, 'Prints': prints})
|
||||
'Department': item.costcenter.name, 'AttendanceTypeID': att, 'Prints': prints,
|
||||
'Hours': hours, 'Worked': worked})
|
||||
return report
|
||||
|
||||
|
||||
@ -124,12 +121,9 @@ def employee_attendance(employee, start_date, finish_date):
|
||||
.filter(Attendance.is_valid == True)\
|
||||
.first()
|
||||
att = 0 if att is None else att.attendance_type
|
||||
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})
|
||||
prints, hours, worked = get_prints(employee.code, item)
|
||||
list.append({'Date': item.strftime('%d-%b-%Y'), 'AttendanceTypeID': att, 'Prints': prints, 'Hours': hours,
|
||||
'Worked': worked})
|
||||
return list
|
||||
|
||||
|
||||
|
@ -2,6 +2,7 @@ import csv
|
||||
import datetime
|
||||
from io import StringIO
|
||||
from pyramid.view import view_config
|
||||
from brewman.models import DBSession
|
||||
from brewman.models.voucher import Fingerprint
|
||||
|
||||
__author__ = 'tanshu'
|
||||
@ -34,3 +35,38 @@ def add_fingerprint(row):
|
||||
except ValueError:
|
||||
return
|
||||
Fingerprint(employee_code=employee_code, date=date).create()
|
||||
|
||||
|
||||
def get_prints(employee_code, date):
|
||||
start_fp = date + datetime.timedelta(hours=7)
|
||||
finish_fp = date + 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()
|
||||
|
||||
last = None
|
||||
for i in range(len(prints), 0, -1):
|
||||
item = prints[i - 1].date
|
||||
if last is not None and last - item < datetime.timedelta(minutes=10):
|
||||
prints.remove(prints[i - 1])
|
||||
else:
|
||||
last = item
|
||||
|
||||
if len(prints) == 0:
|
||||
hours = '', ''
|
||||
elif len(prints) == 2:
|
||||
hours = prints[1].date - prints[0].date
|
||||
hours = working_hours(hours)
|
||||
elif len(prints) == 4:
|
||||
hours = (prints[1].date - prints[0].date) + (prints[3].date - prints[2].date)
|
||||
hours = working_hours(hours)
|
||||
else:
|
||||
hours = 'Error', 'Error'
|
||||
return ', '.join([x.date.strftime('%H:%M') for x in prints]) + ' ', hours[0], hours[1]
|
||||
|
||||
|
||||
def working_hours(delta):
|
||||
minutes = (delta.seconds // 60) % 60
|
||||
minutes = int(5 * round(float(minutes) / 5))
|
||||
hours = delta.seconds // 3600
|
||||
worked = str(hours).zfill(2) + ':' + str(minutes).zfill(2)
|
||||
return worked, delta.seconds >= 60 * 60 * 9 # 9hrs
|
@ -16,7 +16,7 @@ requires = [
|
||||
]
|
||||
|
||||
setup(name='brewman',
|
||||
version='0.0',
|
||||
version='3.2',
|
||||
description='brewman',
|
||||
long_description=README + '\n\n' + CHANGES,
|
||||
classifiers=[
|
||||
|
Loading…
x
Reference in New Issue
Block a user