From ddb0aa4e74d9e7db71cee23081f601f326cc4c7d Mon Sep 17 00:00:00 2001 From: Rob Harrington Date: Thu, 9 Jul 2015 00:10:03 +0800 Subject: [PATCH] Billable periods from the future are not obsolete --- app/jobs/update_billable_periods.rb | 4 ++-- spec/jobs/update_billable_periods_spec.rb | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/jobs/update_billable_periods.rb b/app/jobs/update_billable_periods.rb index 3a60d51435..f594c8f166 100644 --- a/app/jobs/update_billable_periods.rb +++ b/app/jobs/update_billable_periods.rb @@ -83,10 +83,10 @@ class UpdateBillablePeriods def clean_up_untouched_billable_periods_for(enterprise, job_start_time) # Snag and then delete any BillablePeriods which overlap - obsolete_billable_periods = enterprise.billable_periods.where('ends_at >= (?) AND updated_at < (?)', start_date, job_start_time) + obsolete_billable_periods = enterprise.billable_periods.where('ends_at >= (?) AND begins_at <= (?) AND updated_at < (?)', start_date, end_date, job_start_time) if obsolete_billable_periods.any? - current_billable_periods = enterprise.billable_periods.where('ends_at >= (?) AND updated_at >= (?)', start_date, job_start_time) + current_billable_periods = enterprise.billable_periods.where('ends_at >= (?) AND begins_at <= (?) AND updated_at < (?)', start_date, end_date, job_start_time) Delayed::Worker.logger.info "#{enterprise.name} #{start_date.strftime("%F %T")} #{job_start_time.strftime("%F %T")}" Delayed::Worker.logger.info "#{obsolete_billable_periods.first.updated_at.strftime("%F %T")}" diff --git a/spec/jobs/update_billable_periods_spec.rb b/spec/jobs/update_billable_periods_spec.rb index 7213fed5e8..493a8fc74a 100644 --- a/spec/jobs/update_billable_periods_spec.rb +++ b/spec/jobs/update_billable_periods_spec.rb @@ -449,13 +449,20 @@ describe UpdateBillablePeriods do context "cleaning up untouched billable periods" do let(:job_start_time) { Time.now } let(:enterprise) { create(:enterprise) } + # Updated after start let!(:bp1) { create(:billable_period, enterprise: enterprise, updated_at: job_start_time + 2.seconds, begins_at: start_of_july, ends_at: start_of_july + 5.days ) } let!(:bp2) { create(:billable_period, enterprise: enterprise, updated_at: job_start_time + 2.seconds, begins_at: start_of_july + 5.days, ends_at: start_of_july + 10.days ) } + # Updated before start let!(:bp3) { create(:billable_period, enterprise: enterprise, updated_at: job_start_time - 5.seconds, begins_at: start_of_july, ends_at: start_of_july + 10.days ) } + # Updated before start but begins after end_date + let!(:bp4) { create(:billable_period, enterprise: enterprise, updated_at: job_start_time - 5.seconds, begins_at: start_of_july + 10.days, ends_at: start_of_july + 15.days ) } + # Updated before start but ends before start_date + let!(:bp5) { create(:billable_period, enterprise: enterprise, updated_at: job_start_time - 5.seconds, begins_at: start_of_july - 10.days, ends_at: start_of_july - 5.days ) } before do allow(Bugsnag).to receive(:notify) allow(updater).to receive(:start_date) { start_of_july } + allow(updater).to receive(:end_date) { start_of_july + 8.days } updater.clean_up_untouched_billable_periods_for(enterprise, job_start_time) end @@ -463,6 +470,8 @@ describe UpdateBillablePeriods do expect(bp1.reload.deleted_at).to be_nil expect(bp2.reload.deleted_at).to be_nil expect(bp3.reload.deleted_at).to_not be_nil + expect(bp4.reload.deleted_at).to be_nil + expect(bp5.reload.deleted_at).to be_nil end it "notifies bugsnag" do