def testLastBillable(self): """Test the get_last_billable_day utility for validity""" months = range(1, 13) first_days = [datetime.datetime(2011, month, 1) for month in months] last_billable = [utils.get_last_billable_day(day).day \ for day in first_days] #should equal the last saturday of every month in 2011 self.assertEqual(last_billable, [30, 27, 27, 24, 29, 26, 31, 28, 25, 30, 27, 25])
def report_payroll_summary(request): date = timezone.now() - relativedelta(months=1) from_date = utils.get_month_start(date).date() to_date = from_date + relativedelta(months=1) year_month_form = PayrollSummaryReportForm(request.GET or None, initial={ 'month': from_date.month, 'year': from_date.year }) if year_month_form.is_valid(): from_date, to_date = year_month_form.save() last_billable = utils.get_last_billable_day(from_date) projects = utils.get_setting('TIMEPIECE_PAID_LEAVE_PROJECTS') weekQ = Q(end_time__gt=utils.get_week_start(from_date), end_time__lt=last_billable + relativedelta(days=1)) monthQ = Q(end_time__gt=from_date, end_time__lt=to_date) workQ = ~Q(project__in=projects.values()) statusQ = Q(status=Entry.INVOICED) | Q(status=Entry.APPROVED) # Weekly totals week_entries = Entry.objects.date_trunc('week').filter( weekQ, statusQ, workQ) date_headers = generate_dates(from_date, last_billable, by='week') weekly_totals = list( get_project_totals(week_entries, date_headers, 'total', overtime=True)) # Monthly totals leave = Entry.objects.filter(monthQ, ~workQ).values('user', 'hours', 'project__name') extra_values = ('project__type__label', ) month_entries = Entry.objects.date_trunc('month', extra_values) month_entries_valid = month_entries.filter(monthQ, statusQ, workQ) labels, monthly_totals = get_payroll_totals(month_entries_valid, leave) # Unapproved and unverified hours entries = Entry.objects.filter(monthQ).order_by() # No ordering user_values = ['user__pk', 'user__first_name', 'user__last_name'] unverified = entries.filter(status=Entry.UNVERIFIED, user__is_active=True) \ .values_list(*user_values).distinct() unapproved = entries.filter(status=Entry.VERIFIED) \ .values_list(*user_values).distinct() return render( request, 'timepiece/reports/payroll_summary.html', { 'from_date': from_date, 'year_month_form': year_month_form, 'date_headers': date_headers, 'weekly_totals': weekly_totals, 'monthly_totals': monthly_totals, 'unverified': unverified, 'unapproved': unapproved, 'labels': labels, })
def report_payroll_summary(request): date = timezone.now() - relativedelta(months=1) from_date = utils.get_month_start(date).date() to_date = from_date + relativedelta(months=1) year_month_form = PayrollSummaryReportForm(request.GET or None, initial={ 'month': from_date.month, 'year': from_date.year, }) if year_month_form.is_valid(): from_date, to_date = year_month_form.save() last_billable = utils.get_last_billable_day(from_date) projects = utils.get_setting('TIMEPIECE_PAID_LEAVE_PROJECTS') weekQ = Q(end_time__gt=utils.get_week_start(from_date), end_time__lt=last_billable + relativedelta(days=1)) monthQ = Q(end_time__gt=from_date, end_time__lt=to_date) workQ = ~Q(project__in=projects.values()) statusQ = Q(status=Entry.INVOICED) | Q(status=Entry.APPROVED) # Weekly totals week_entries = Entry.objects.date_trunc('week').filter( weekQ, statusQ, workQ ) date_headers = generate_dates(from_date, last_billable, by='week') weekly_totals = list(get_project_totals(week_entries, date_headers, 'total', overtime=True)) # Monthly totals leave = Entry.objects.filter(monthQ, ~workQ) leave = leave.values('user', 'hours', 'project__name') extra_values = ('project__type__label',) month_entries = Entry.objects.date_trunc('month', extra_values) month_entries_valid = month_entries.filter(monthQ, statusQ, workQ) labels, monthly_totals = get_payroll_totals(month_entries_valid, leave) # Unapproved and unverified hours entries = Entry.objects.filter(monthQ).order_by() # No ordering user_values = ['user__pk', 'user__first_name', 'user__last_name'] unverified = entries.filter(status=Entry.UNVERIFIED, user__is_active=True) \ .values_list(*user_values).distinct() unapproved = entries.filter(status=Entry.VERIFIED) \ .values_list(*user_values).distinct() return render(request, 'timepiece/reports/payroll_summary.html', { 'from_date': from_date, 'year_month_form': year_month_form, 'date_headers': date_headers, 'weekly_totals': weekly_totals, 'monthly_totals': monthly_totals, 'unverified': unverified, 'unapproved': unapproved, 'labels': labels, })
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(), }
def test_get_last_billable_day(self): for idx, date in enumerate(self.dates): self.assertEquals(self.last_billable[idx], utils.get_last_billable_day(date))