diff --git a/app/jobs/update_billable_periods.rb b/app/jobs/update_billable_periods.rb index bd8f4dd55a..3ba95d9dce 100644 --- a/app/jobs/update_billable_periods.rb +++ b/app/jobs/update_billable_periods.rb @@ -88,10 +88,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 begins_at <= (?) AND updated_at < (?)', start_date, end_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 begins_at <= (?) AND updated_at < (?)', start_date, end_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 1f4e4fceb9..6bf25d3841 100644 --- a/spec/jobs/update_billable_periods_spec.rb +++ b/spec/jobs/update_billable_periods_spec.rb @@ -467,8 +467,12 @@ describe UpdateBillablePeriods do 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 begins at end_date (ie. not before end_date, so should be ignored) EDGE CASE + let!(:bp5) { create(:billable_period, enterprise: enterprise, updated_at: job_start_time - 5.seconds, begins_at: start_of_july + 8.days, ends_at: start_of_july + 10.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 ) } + let!(:bp6) { 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 ) } + # Updated before start but ends at start_date (ie. not after start_date, so should be ignored) EDGE CASE + let!(:bp7) { create(:billable_period, enterprise: enterprise, updated_at: job_start_time - 5.seconds, begins_at: start_of_july - 5.days, ends_at: start_of_july ) } before do allow(Bugsnag).to receive(:notify) @@ -483,6 +487,8 @@ describe UpdateBillablePeriods do 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 + expect(bp6.reload.deleted_at).to be_nil + expect(bp7.reload.deleted_at).to be_nil end it "notifies bugsnag" do