def hourly_report(request, date_form, from_date, to_date, status, activity): if not from_date: from_date = utils.get_month_start(datetime.datetime.today()).date() if not to_date: to_date = from_date + relativedelta(months=1) header_to = to_date - relativedelta(days=1) trunc = timepiece_forms.ProjectFiltersForm.DEFAULT_TRUNC query = Q(end_time__gt=utils.get_week_start(from_date), end_time__lt=to_date) if 'ok' in request.GET or 'export' in request.GET: form = timepiece_forms.ProjectFiltersForm(request.GET) if form.is_valid(): trunc = form.cleaned_data['trunc'] if not form.cleaned_data['paid_leave']: projects = getattr(settings, 'TIMEPIECE_PROJECTS', {}) query &= ~Q(project__in=projects.values()) if form.cleaned_data['pj_select']: query &= Q(project__in=form.cleaned_data['pj_select']) else: form = timepiece_forms.ProjectFiltersForm() hour_type = form.get_hour_type() entries = timepiece.Entry.objects.date_trunc(trunc).filter(query) date_headers = utils.generate_dates(from_date, header_to, by=trunc) project_totals = utils.project_totals(entries, date_headers, hour_type, total_column=True) if entries else '' if not request.GET.get('export', False): return { 'date_form': date_form, 'from_date': from_date, 'date_headers': date_headers, 'pj_filters': form, 'trunc': trunc, 'project_totals': project_totals, } else: from_date_str = from_date.strftime('%m-%d') to_date_str = to_date.strftime('%m-%d') response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = \ 'attachment; filename="%s_hours_%s_to_%s_by_%s.csv"' % ( hour_type, from_date_str, to_date_str, trunc) writer = csv.writer(response) headers = ['Name'] headers.extend([date.strftime('%m/%d/%Y') for date in date_headers]) headers.append('Total') writer.writerow(headers) for rows, totals in project_totals: for name, hours in rows: data = [name] data.extend(hours) writer.writerow(data) total = ['Totals'] total.extend(totals) writer.writerow(total) return response
def hourly_report(request, date_form, from_date, to_date, status, activity): if not from_date: from_date = utils.get_month_start(datetime.datetime.today()).date() if not to_date: to_date = from_date + relativedelta(months=1) header_to = to_date - relativedelta(days=1) trunc = timepiece_forms.ProjectFiltersForm.DEFAULT_TRUNC query = Q(end_time__gt=utils.get_week_start(from_date), end_time__lt=to_date) if 'ok' in request.GET or 'export' in request.GET: form = timepiece_forms.ProjectFiltersForm(request.GET) if form.is_valid(): trunc = form.cleaned_data['trunc'] if not form.cleaned_data['paid_leave']: projects = getattr(settings, 'TIMEPIECE_PROJECTS', {}) query &= ~Q(project__in=projects.values()) if form.cleaned_data['pj_select']: query &= Q(project__in=form.cleaned_data['pj_select']) else: form = timepiece_forms.ProjectFiltersForm() hour_type = form.get_hour_type() entries = timepiece.Entry.objects.date_trunc(trunc).filter(query) date_headers = utils.generate_dates(from_date, header_to, by=trunc) project_totals = utils.project_totals( entries, date_headers, hour_type, total_column=True) if entries else '' if not request.GET.get('export', False): return { 'date_form': date_form, 'from_date': from_date, 'date_headers': date_headers, 'pj_filters': form, 'trunc': trunc, 'project_totals': project_totals, } else: from_date_str = from_date.strftime('%m-%d') to_date_str = to_date.strftime('%m-%d') response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = \ 'attachment; filename="%s_hours_%s_to_%s_by_%s.csv"' % ( hour_type, from_date_str, to_date_str, trunc) writer = csv.writer(response) headers = ['Name'] headers.extend([date.strftime('%m/%d/%Y') for date in date_headers]) headers.append('Total') writer.writerow(headers) for rows, totals in project_totals: for name, hours in rows: data = [name] data.extend(hours) writer.writerow(data) total = ['Totals'] total.extend(totals) writer.writerow(total) return response
def get_project_totals(self, date_headers, trunc, query=Q(), hour_type="total"): """Helper function for testing project_totals utility directly""" entries = timepiece.Entry.objects.date_trunc(trunc).filter(query) if entries: pj_totals = utils.project_totals(entries, date_headers, hour_type) pj_totals = list(pj_totals) rows = pj_totals[0][0] hours = [hours for name, hours in rows] totals = pj_totals[0][1] return hours, totals else: return ""
def get_project_totals(self, date_headers, trunc, query=Q(), hour_type='total'): """Helper function for testing project_totals utility directly""" entries = timepiece.Entry.objects.date_trunc(trunc).filter(query) if entries: pj_totals = utils.project_totals(entries, date_headers, hour_type) pj_totals = list(pj_totals) rows = pj_totals[0][0] hours = [hours for name, hours in rows] totals = pj_totals[0][1] return hours, totals else: return ''
def payroll_summary(request): year_month_form = timepiece_forms.YearMonthForm(request.GET or None) if request.GET and year_month_form.is_valid(): from_date, to_date, user = year_month_form.save() else: from_date = utils.get_month_start(datetime.datetime.today()).date() to_date = from_date + relativedelta(months=1) last_billable = utils.get_last_billable_day(from_date) projects = getattr(settings, 'TIMEPIECE_PROJECTS', {}) weekQ = Q(end_time__gt=utils.get_week_start(from_date), end_time__lt=last_billable + datetime.timedelta(days=1)) monthQ = Q(end_time__gt=from_date, end_time__lt=to_date) workQ = ~Q(project__in=projects.values()) statusQ = Q(status='invoiced') | Q(status='approved') # Weekly totals week_entries = timepiece.Entry.objects.date_trunc('week') week_entries = week_entries.filter(weekQ, statusQ, workQ) date_headers = utils.generate_dates(from_date, last_billable, by='week') weekly_totals = list( utils.project_totals(week_entries, date_headers, 'total', overtime=True)) # Monthly totals leave = timepiece.Entry.objects.filter(monthQ, ~workQ).values( 'user', 'hours', 'project__name') month_entries = timepiece.Entry.objects.date_trunc('month') month_entries_valid = month_entries.filter(monthQ, statusQ, workQ) monthly_totals = list( utils.payroll_totals(month_entries_valid, from_date, leave)) # Unapproved and unverified hours entries = timepiece.Entry.objects.filter(monthQ) user_values = ['user__pk', 'user__first_name', 'user__last_name'] unverified = entries.filter(monthQ, status='unverified', user__is_active=True) unapproved = entries.filter(monthQ, status='verified') return { 'from_date': from_date, 'year_month_form': year_month_form, 'date_headers': date_headers, 'weekly_totals': weekly_totals, 'monthly_totals': monthly_totals, 'unverified': unverified.values_list(*user_values).distinct(), 'unapproved': unapproved.values_list(*user_values).distinct(), }
def payroll_summary(request): year_month_form = timepiece_forms.YearMonthForm(request.GET or None) if request.GET and year_month_form.is_valid(): from_date, to_date = year_month_form.save() else: from_date = utils.get_month_start(datetime.datetime.today()).date() to_date = from_date + relativedelta(months=1) last_billable = utils.get_last_billable_day(from_date) projects = getattr(settings, 'TIMEPIECE_PROJECTS', {}) weekQ = Q(end_time__gt=utils.get_week_start(from_date), end_time__lt=last_billable + datetime.timedelta(days=1)) monthQ = Q(end_time__gt=from_date, end_time__lt=to_date) workQ = ~Q(project__in=projects.values()) statusQ = Q(status='invoiced') | Q(status='approved') # Weekly totals week_entries = timepiece.Entry.objects.date_trunc('week') week_entries = week_entries.filter(weekQ, statusQ, workQ) date_headers = utils.generate_dates(from_date, last_billable, by='week') weekly_totals = list(utils.project_totals(week_entries, date_headers, 'total', overtime=True)) # Monthly totals leave = timepiece.Entry.objects.filter(monthQ, ~workQ ).values('user', 'hours', 'project__name') month_entries = timepiece.Entry.objects.date_trunc('month') month_entries_valid = month_entries.filter(monthQ, statusQ, workQ) monthly_totals = list(utils.payroll_totals(month_entries_valid, from_date, leave)) # Unapproved and unverified hours entries = timepiece.Entry.objects.filter(monthQ) user_values = ['user__pk', 'user__first_name', 'user__last_name'] unverified = entries.filter(monthQ, status='unverified', user__is_active=True) unapproved = entries.filter(monthQ, status='verified') return { 'from_date': from_date, 'year_month_form': year_month_form, 'date_headers': date_headers, 'weekly_totals': weekly_totals, 'monthly_totals': monthly_totals, 'unverified': unverified.values_list(*user_values).distinct(), 'unapproved': unapproved.values_list(*user_values).distinct(), }