Skip to content

Commit

Permalink
Billing, allow in-advance membership invoice cancellation
Browse files Browse the repository at this point in the history
This patch allows an in-advance membership invoice made the previous fiscal
year to be cancelled.

This is need when a membership price is changed and its past invoices need to
be cancelled to have a new one generated with the new price.

https://appsignal.com/csa-admin/sites/672e0b61d2a5e4b5197f10e4/exceptions/incidents/378/samples/timestamp/2025-01-03T04:00:43Z

```
app/models/concerns/has_state.rb:24
app/models/invoice.rb:228
app/models/membership.rb:522
app/models/billing/invoicer.rb:70
app/models/billing/invoicer.rb:11
app/jobs/billing/member_invoicer_job.rb:14
activejob (8.0.1) lib/active_job/execution.rb:68
activesupport (8.0.1) lib/active_support/callbacks.rb:120
activesupport (8.0.1) lib/active_support/core_ext/object/with.rb:33
activesupport (8.0.1) lib/active_support/current_attributes.rb:214
activesupport (8.0.1) lib/active_support/current_attributes.rb:154
app/jobs/concerns/tenant_context.rb:23
lib/tenant.rb:59
activerecord (8.0.1) lib/active_record/connection_handling.rb:214
lib/tenant.rb:58
activerecord (8.0.1) lib/active_record/connection_handling.rb:398
activerecord (8.0.1) lib/active_record/connection_handling.rb:149
lib/tenant.rb:57
app/jobs/concerns/tenant_context.rb:22
app/jobs/concerns/tenant_context.rb:8
activesupport (8.0.1) lib/active_support/callbacks.rb:129
activesupport (8.0.1) lib/active_support/callbacks.rb:129
i18n (1.14.6) lib/i18n.rb:353
activejob (8.0.1) lib/active_job/translation.rb:9
activesupport (8.0.1) lib/active_support/callbacks.rb:129
activesupport (8.0.1) lib/active_support/callbacks.rb:129
activesupport (8.0.1) lib/active_support/core_ext/time/zones.rb:65
activejob (8.0.1) lib/active_job/timezones.rb:9
activesupport (8.0.1) lib/active_support/callbacks.rb:129
activesupport (8.0.1) lib/active_support/callbacks.rb:129
activesupport (8.0.1) lib/active_support/callbacks.rb:140
activejob (8.0.1) lib/active_job/execution.rb:67
activejob (8.0.1) lib/active_job/instrumentation.rb:32
activejob (8.0.1) lib/active_job/execution.rb:51
activejob (8.0.1) lib/active_job/instrumentation.rb:26
activerecord (8.0.1) lib/active_record/railties/job_runtime.rb:13
activejob (8.0.1) lib/active_job/instrumentation.rb:40
appsignal (4.3.2) lib/appsignal/hooks/active_support_notifications.rb:19
activesupport (8.0.1) lib/active_support/notifications/instrumenter.rb:58
appsignal (4.3.2) lib/appsignal/hooks/active_support_notifications.rb:18
activejob (8.0.1) lib/active_job/instrumentation.rb:39
activerecord (8.0.1) lib/active_record/railties/job_runtime.rb:11
activejob (8.0.1) lib/active_job/instrumentation.rb:26
activejob (8.0.1) lib/active_job/logging.rb:32
activesupport (8.0.1) lib/active_support/tagged_logging.rb:143
activesupport (8.0.1) lib/active_support/tagged_logging.rb:38
activesupport (8.0.1) lib/active_support/tagged_logging.rb:143
activejob (8.0.1) lib/active_job/logging.rb:39
activejob (8.0.1) lib/active_job/logging.rb:32
activejob (8.0.1) lib/active_job/execution.rb:29
activesupport (8.0.1) lib/active_support/callbacks.rb:120
activejob (8.0.1) lib/active_job/railtie.rb:95
activesupport (8.0.1) lib/active_support/reloader.rb:77
activesupport (8.0.1) lib/active_support/execution_wrapper.rb:87
activesupport (8.0.1) lib/active_support/reloader.rb:74
activejob (8.0.1) lib/active_job/railtie.rb:94
activesupport (8.0.1) lib/active_support/callbacks.rb:129
activesupport (8.0.1) lib/active_support/callbacks.rb:129
activesupport (8.0.1) lib/active_support/callbacks.rb:140
activejob (8.0.1) lib/active_job/execution.rb:27
appsignal (4.3.2) lib/appsignal/hooks/active_job.rb:69
solid_queue (1.1.2) app/models/solid_queue/claimed_execution.rb:95
solid_queue (1.1.2) app/models/solid_queue/claimed_execution.rb:61
solid_queue (1.1.2) lib/solid_queue/pool.rb:23
activesupport (8.0.1) lib/active_support/execution_wrapper.rb:91
solid_queue (1.1.2) lib/solid_queue/app_executor.rb:7
solid_queue (1.1.2) lib/solid_queue/pool.rb:22
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:24
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:22
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/ivar.rb:170
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/future.rb:55
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:359
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:350
<internal:kernel>:168
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:341
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340
concurrent-ruby (1.3.4) lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:340
```
  • Loading branch information
thibaudgg committed Jan 3, 2025
1 parent c0e03a4 commit 831cd0a
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 1 deletion.
2 changes: 1 addition & 1 deletion app/models/invoice.rb
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ def can_cancel?
!can_destroy? &&
!processing? &&
!canceled? &&
(current_year? || open?) &&
(current_year? || open? || (membership_type? && entity.current_year?)) &&
(!share_type? || open?) &&
(!entity_id? || entity_latest?)
end
Expand Down
4 changes: 4 additions & 0 deletions app/models/membership.rb
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,10 @@ def current?
started? && ended_on >= Date.current
end

def current_year?
fy_year == Current.fy_year
end

def current_or_future_year?
fy_year >= Current.fy_year
end
Expand Down
8 changes: 8 additions & 0 deletions spec/models/invoice_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,14 @@
expect(invoice.can_cancel?).to eq false
end

specify "when not current year, closed, but membership current year" do
membership = create(:membership)
invoice = create(:invoice, :membership, :closed,
date: 13.months.ago,
entity: membership)
expect(invoice.can_cancel?).to eq true
end

specify "when not current year but open" do
invoice = create(:invoice, :annual_fee, :open, date: 13.months.ago)
expect(invoice.can_cancel?).to eq true
Expand Down

0 comments on commit 831cd0a

Please sign in to comment.