Beispiel #1
0
    def _annually_report(self, year):
        year_start = datetime.date(year, 1, 1)
        year_end = datetime.date(year, 12, 31)
        excuses_error = None
        config_obj = ApplicationConfig.get_current_config()
        entries = DBSession.query('user_id', 'date').from_statement("""
        SELECT date_trunc('day', s.date) as date, s.user_id as user_id
        FROM time_entry s
        WHERE DATE(s.modified_ts) > s.date AND
              s.date >= :year_start AND
              s.date <= :year_end
        GROUP BY date_trunc('day', s.date), s.user_id
        """).params(year_start=year_start, year_end=year_end)

        users = User.query.filter(User.is_active==True)\
                          .filter(User.is_not_client())\
                          .order_by(User.is_freelancer(), User.name)

        entries_grouped = {}
        _excuses = excuses.wrongtime()

        for user_id, date in entries:
            month = date.month - 1
            entry = entries_grouped.setdefault(user_id, [0] * 12)
            if date.strftime('%Y-%m-%d') not in _excuses.get(user_id,
                                                             {}).keys():
                entry[month] += 1

        stats = {}

        for user_id, entry in entries_grouped.iteritems():
            stats_entry = stats.setdefault(user_id, [0])
            stats_entry[0] = sum(entry)

        return dict(
            entries=entries_grouped,
            stats=stats,
            users=users,
            year_start=year_start,
            limit=config_obj.monthly_incorrect_time_record_limit,
            excuses_error=excuses_error,
        )
Beispiel #2
0
    def _annually_report(self, year):
        year_start = datetime.date(year, 1, 1)
        year_end = datetime.date(year, 12, 31)
        excuses_error = None
        config_obj = ApplicationConfig.get_current_config()
        entries = DBSession.query('user_id', 'date').from_statement("""
        SELECT date_trunc('day', s.date) as date, s.user_id as user_id
        FROM time_entry s
        WHERE DATE(s.modified_ts) > s.date AND
              s.date >= :year_start AND
              s.date <= :year_end
        GROUP BY date_trunc('day', s.date), s.user_id
        """).params(year_start=year_start, year_end=year_end)

        users = User.query.filter(User.is_active==True)\
                          .filter(User.is_not_client())\
                          .order_by(User.is_freelancer(), User.name)

        entries_grouped = {}
        _excuses = excuses.wrongtime()

        for user_id, date in entries:
            month = date.month - 1
            entry = entries_grouped.setdefault(user_id, [0]*12)
            if date.strftime('%Y-%m-%d') not in _excuses.get(user_id, {}).keys():
                entry[month] += 1

        stats = {}

        for user_id, entry in entries_grouped.iteritems():
            stats_entry = stats.setdefault(user_id, [0])
            stats_entry[0] = sum(entry)

        return dict(
            entries=entries_grouped,
            stats=stats,
            users=users,
            year_start=year_start,
            limit=config_obj.monthly_incorrect_time_record_limit,
            excuses_error=excuses_error,
        )
Beispiel #3
0
    def get(self):
        # Requested (or current) year
        year = self.request.GET.get('year')
        year = int(year) if year else datetime.date.today().year
        # Year start day and end day
        start = datetime.date(year, 1, 1)
        end = datetime.date(year, 12, 31)
        start_day = dict(
            day=start.day,
            dow=start.weekday(),
        )

        day_count, date_range, months = self.necessary_data(start, end)
        holidays = Holiday.query \
                          .filter(Holiday.date >= start) \
                          .all()

        # Users
        users = []
        user_groups = []
        for name, (fullname, shortcut) in self.request.user.get_locations():
            usersq = User.query.filter(User.is_not_client()) \
                               .filter(User.is_active==True) \
                               .filter(User.location==name) \
                               .order_by(User.is_freelancer(), User.name).all()
            users.extend(usersq)
            user_groups.append((fullname, len(usersq)))

        # Leaves
        leave_mandated = Leave.get_for_year(start.year)
        leave_used = Leave.get_used_for_year(start.year)

        # Transform users to dictionary, group by city and order by leave days
        users = [dict(
            id=str(u.id),
            name=u.name,
            leave_mandated=leave_mandated[u.id][0],
            leave_used=leave_used[u.id],
            location=u.location,
        ) for u in users]

        users = sorted(
            users,
            key=lambda u: u['location'],
        )

        user_groups = sorted(
            user_groups,
            key=lambda u: u,
        )

        absences, absences_months = self.get_absences(start, end, users)
        lates = self.get_lates(start, end)
        absences_sum = (
            reduce(lambda s, u: s + u['leave_used'], users, 0),
            reduce(lambda s, u: s + u['leave_mandated'], users, 0),
        )

        data = {
            'users': users,
            'userGroups': user_groups,
            'year': start.year,
            'startDay': start_day,
            'dayCount': day_count,
            'months': months,
            'absences': absences,
            'absencesSum': absences_sum,
            'absencesMonths': absences_months,
            'lates': lates,
            'holidays': [h.date.strftime('%Y-%m-%d') for h in holidays],
        }

        return dict(
            data=json.dumps(data, ensure_ascii=False),
            year=start.year,
            v=self,
        )
Beispiel #4
0
    def get(self):
        month_start, month_end = self._get_month()

        entries = DBSession.query('user_id', 'date', 'time',
                                  'late_count').from_statement("""
        SELECT t.user_id as "user_id", t.date as "date", (
            SELECT COALESCE(SUM(h.time), 0.0) FROM
            time_entry h
            WHERE h.user_id = t.user_id
            AND h.date = t.date
            AND h.deleted = FALSE
        ) as "time", (
            SELECT COUNT(*)
            FROM time_entry s
            WHERE s.user_id = t.user_id
            AND s.date = t.date
            AND DATE(s.modified_ts) > s.date
        ) as "late_count"
        FROM time_entry t
        WHERE t.date >= :month_start
          AND t.date <= :month_end
        GROUP BY t.user_id, t.date;
        """).params(month_start=month_start, month_end=month_end)

        if not self.request.has_perm('can_see_users_times'):
            users = [self.request.user
                     ]  # TODO do we need to constrain entries also?
            locations = {self.request.user.location: ('', 1)}
        else:
            location_names = self.request.user.get_locations()

            users = {}
            for name, (fullname, shortcut) in location_names:
                usersq = User.query.filter(User.is_not_client()) \
                                   .filter(User.is_active==True) \
                                   .filter(User.location==name) \
                                   .order_by(User.is_freelancer(), User.name)
                users[name] = usersq.all()

            locations = {
                name: [User.LOCATIONS[name][0],
                       len(users)]
                for name, users in users.iteritems()
            }

            locations[self.request.user.location][1] -= 1

            ordered_users = []
            for name, (fullname, shortcut) in location_names:
                ordered_users.extend(users[name])

            users = ordered_users

        # move current user to the front of the list
        current_user_index = None
        for i, user in enumerate(users):
            if user.id == self.request.user.id:
                current_user_index = i

        users.insert(0, users.pop(current_user_index))

        today = datetime.date.today()
        grouped = defaultdict(lambda: defaultdict(lambda: 0.0))
        late = defaultdict(lambda: defaultdict(lambda: False))
        sums = defaultdict(lambda: 0.0)
        daily_sums = defaultdict(lambda: 0.0)
        for user_id, date, time, late_count in entries:
            grouped[user_id][date] = time
            if date <= today:
                sums[user_id] += time
                daily_sums[date] += time
            late[user_id][date] = late_count > 0

        holidays = Holiday.all()
        count_of_required_month_hours = {}
        count_of_required_hours_to_today = {}

        for user in users:
            sftw = user.start_full_time_work
            if sftw:
                if sftw > month_end:
                    start_work = datetime.date(today.year + 10, 1, 1)
                elif sftw < month_start:
                    start_work = month_start
                else:
                    start_work = sftw

                month_hours = h.get_working_days(start_work, month_end) * 8

                today_ = today if today < month_end else month_end
                hours_to_today = h.get_working_days(start_work, today_) * 8

                count_of_required_month_hours[user.id] = month_hours
                count_of_required_hours_to_today[user.id] = hours_to_today
            else:
                count_of_required_month_hours[user.id] = 0
                count_of_required_hours_to_today[user.id] = 0

        return dict(
            entries=grouped,
            users=users,
            sums=sums,
            late=late,
            excuses=excuses.wrongtime(),
            daily_sums=daily_sums,
            monthly_sum=sum(daily_sums.values()),
            dates=__builtin__.list(dates_between(month_start, month_end)),
            is_holiday=lambda date: Holiday.is_holiday(date, holidays=holidays
                                                       ),
            month_start=month_start,
            prev_date=previous_month(month_start),
            next_date=next_month(month_start),
            today=today,
            count_of_required_month_hours=count_of_required_month_hours,
            count_of_required_hours_to_today=count_of_required_hours_to_today,
            locations=locations,
        )
Beispiel #5
0
    def get(self):
        month_start, month_end = self._get_month()

        entries = DBSession.query('user_id', 'date', 'time', 'late_count').from_statement("""
        SELECT t.user_id as "user_id", t.date as "date", (
            SELECT COALESCE(SUM(h.time), 0.0) FROM
            time_entry h
            WHERE h.user_id = t.user_id
            AND h.date = t.date
            AND h.deleted = FALSE
        ) as "time", (
            SELECT COUNT(*)
            FROM time_entry s
            WHERE s.user_id = t.user_id
            AND s.date = t.date
            AND DATE(s.modified_ts) > s.date
        ) as "late_count"
        FROM time_entry t
        WHERE t.date >= :month_start
          AND t.date <= :month_end
        GROUP BY t.user_id, t.date;
        """).params(month_start=month_start, month_end=month_end)
        if not self.request.has_perm('can_see_users_times'):
            users = [self.request.user] # TODO do we need to constrain entries also?
            locations= {
                self.request.user.location: ('', 1)
            }
        else:
            users_w = User.query.filter(User.is_not_client()) \
                                .filter(User.is_active==True) \
                                .filter(User.location=='wroclaw') \
                                .order_by(User.is_freelancer(), User.name)
            users_w = users_w.all()

            users_p = User.query.filter(User.is_not_client()) \
                                .filter(User.is_active==True) \
                                .filter(User.location=='poznan') \
                                .order_by(User.is_freelancer(), User.name)
            users_p = users_p.all()

            locations = {
                'wroclaw': [u'Wrocław', len(users_w)],
                'poznan': [u'Poznań', len(users_p)],
            }
            locations[self.request.user.location][1] -= 1
            if self.request.user.location == 'wroclaw':
                users = users_w
                users.extend(users_p)
            else:
                users = users_p
                users.extend(users_w)

        today = datetime.date.today()
        grouped = defaultdict(lambda: defaultdict(lambda: 0.0))
        late = defaultdict(lambda: defaultdict(lambda: False))
        sums = defaultdict(lambda: 0.0)
        daily_sums = defaultdict(lambda: 0.0)
        for user_id, date, time, late_count in entries:
            grouped[user_id][date] = time
            if date <= today:
                sums[user_id] += time
                daily_sums[date] += time
            late[user_id][date] = late_count > 0

        holidays = Holiday.all()
        count_of_required_month_hours = {}
        count_of_required_hours_to_today = {}

        for user in users:
            sftw = user.start_full_time_work
            if sftw:
                if sftw > month_end:
                    start_work = datetime.date(today.year+10, 1, 1)
                elif sftw < month_start:
                    start_work = month_start
                else:
                    start_work = sftw

                month_hours = h.get_working_days(start_work, month_end) * 8

                today_ = today if today < month_end else month_end
                hours_to_today = h.get_working_days(start_work, today_) * 8

                count_of_required_month_hours[user.id] = month_hours
                count_of_required_hours_to_today[user.id] = hours_to_today
            else:
                count_of_required_month_hours[user.id] = 0
                count_of_required_hours_to_today[user.id] = 0

        # move current user to the front of the list
        current_user_index = None
        for i, user in enumerate(users):
            if user.id == self.request.user.id:
                current_user_index = i

        users.insert(0, users.pop(current_user_index))

        return dict(
            entries=grouped, users=users, sums=sums, late=late, excuses=excuses.wrongtime(),
            daily_sums=daily_sums, monthly_sum=sum(daily_sums.values()),
            dates=__builtin__.list(dates_between(month_start, month_end)),
            is_holiday=lambda date: Holiday.is_holiday(date, holidays=holidays),
            month_start=month_start,
            prev_date=previous_month(month_start),
            next_date=next_month(month_start),
            today=today,
            count_of_required_month_hours=count_of_required_month_hours,
            count_of_required_hours_to_today=count_of_required_hours_to_today,
            locations=locations,
        )
Beispiel #6
0
    def get(self):
        # Requested (or current) year
        year = self.request.GET.get('year')
        year = int(year) if year else datetime.date.today().year
        # Year start day and end day
        start = datetime.date(year, 1, 1)
        end = datetime.date(year, 12, 31)
        start_day = dict(
            day=start.day,
            dow=start.weekday(),
        )

        day_count, date_range, months = self.necessary_data(start, end)
        holidays = Holiday.query \
                          .filter(Holiday.date >= start) \
                          .all()

        # Users
        users_p = User.query.filter(User.is_not_client()) \
                            .filter(User.is_active==True) \
                            .filter(User.location=='poznan') \
                            .order_by(User.is_freelancer(), User.name)
        users_p = users_p.all()
        users_w = User.query.filter(User.is_not_client()) \
                            .filter(User.is_active==True) \
                            .filter(User.location=='wroclaw') \
                            .order_by(User.is_freelancer(), User.name)
        users_w = users_w.all()

        user_groups = [
            (u'Poznań', len(users_p)),
            (u'Wrocław', len(users_w)),
        ]

        reverse = False
        if self.request.user.location == 'wroclaw':
            user_groups.insert(0, user_groups.pop())
            reverse = True

        users_p.extend(users_w)

        # Leaves
        leave_mandated = Leave.get_for_year(start.year)
        leave_used = Leave.get_used_for_year(start.year)

        # Transform users to dictionary, group by city and order by leave days
        users = [dict(
                      id=str(u.id),
                      name=u.name,
                      leave_mandated=leave_mandated[u.id][0],
                      leave_used=leave_used[u.id],
                      location=u.location,
                     ) for u in users_p]


        employees, students = [], []
        for user in users:
            if user['leave_mandated'] > 0:
                employees.append(user)
            else:
                students.append(user)

        users = employees + students
        # groupby location
        users = sorted(
            users,
            key=lambda u: u['location'],
            reverse=reverse
        )

        absences, absences_months = self.get_absences(start, end, users)
        lates = self.get_lates(start, end)
        absences_sum = (
            reduce(lambda s, u: s + u['leave_used'], users, 0),
            reduce(lambda s, u: s + u['leave_mandated'], users, 0),
        )

        data = {
            'users': users,
            'userGroups': user_groups,
            'year': start.year,
            'startDay': start_day,
            'dayCount': day_count,
            'months': months,
            'absences': absences,
            'absencesSum': absences_sum,
            'absencesMonths': absences_months,
            'lates': lates,
            'holidays': [h.date.strftime('%Y-%m-%d') for h in holidays],
        }

        return dict(
            data=json.dumps(data, ensure_ascii=False),
            year=start.year,
            v=self,
        )
Beispiel #7
0
    def get(self):
        # Requested (or current) year
        year = self.request.GET.get('year')
        year = int(year) if year else datetime.date.today().year
        # Year start day and end day
        start = datetime.date(year, 1, 1)
        end = datetime.date(year, 12, 31)
        start_day = dict(
            day=start.day,
            dow=start.weekday(),
        )

        day_count, date_range, months = self.necessary_data(start, end)
        holidays = Holiday.query \
                          .filter(Holiday.date >= start) \
                          .all()

        # Users
        users = []
        user_groups = []
        for name, (fullname, shortcut) in self.request.user.get_locations():
            usersq = User.query.filter(User.is_not_client()) \
                               .filter(User.is_active==True) \
                               .filter(User.location==name) \
                               .order_by(User.is_freelancer(), User.name).all()
            users.extend(usersq)
            user_groups.append((fullname, len(usersq)))

        # Leaves
        leave_mandated = Leave.get_for_year(start.year)
        leave_used = Leave.get_used_for_year(start.year)

        # Transform users to dictionary, group by city and order by leave days
        users = [
            dict(
                id=str(u.id),
                name=u.name,
                leave_mandated=leave_mandated[u.id][0],
                leave_used=leave_used[u.id],
                location=u.location,
            ) for u in users
        ]

        users = sorted(
            users,
            key=lambda u: u['location'],
        )

        user_groups = sorted(
            user_groups,
            key=lambda u: u,
        )

        absences, absences_months = self.get_absences(start, end, users)
        lates = self.get_lates(start, end)
        absences_sum = (
            reduce(lambda s, u: s + u['leave_used'], users, 0),
            reduce(lambda s, u: s + u['leave_mandated'], users, 0),
        )

        data = {
            'users': users,
            'userGroups': user_groups,
            'year': start.year,
            'startDay': start_day,
            'dayCount': day_count,
            'months': months,
            'absences': absences,
            'absencesSum': absences_sum,
            'absencesMonths': absences_months,
            'lates': lates,
            'holidays': [h.date.strftime('%Y-%m-%d') for h in holidays],
        }

        return dict(
            data=json.dumps(data, ensure_ascii=False),
            year=start.year,
            v=self,
        )