Class: CustomerSalesActivityFlagSync

Inherits:
Object
  • Object
show all
Defined in:
app/services/customer_sales_activity_flag_sync.rb

Overview

Recomputes the denormalized parties.open_sales_activity flag for a customer
and its contacts based on currently-open sales activities. Returns true if
the customer itself has any open sales activity.

Flat name required because Customer is an AR model (Zeitwerk).

NOTE: preserves a pre-existing quirk -- Party.where(id: party_ids) .update_all(open_sales_activity: has_open_activities.include?(id)) applies a
single boolean (whether THE CUSTOMER has open activities) across all related
parties, rather than per-party. The customer's own row is then overwritten
with the same value. Whether that should be per-party is a separate concern;
this extraction keeps the historical behavior intact so callers do not break.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(customer) ⇒ CustomerSalesActivityFlagSync

Returns a new instance of CustomerSalesActivityFlagSync.



20
21
22
# File 'app/services/customer_sales_activity_flag_sync.rb', line 20

def initialize(customer)
  @customer = customer
end

Class Method Details

.call(customer) ⇒ Object



16
17
18
# File 'app/services/customer_sales_activity_flag_sync.rb', line 16

def self.call(customer)
  new(customer).call
end

Instance Method Details

#callObject



24
25
26
27
28
29
30
31
32
33
34
# File 'app/services/customer_sales_activity_flag_sync.rb', line 24

def call
  party_ids = @customer.self_and_contacts_party_ids_arr
  parties_with_open = Activity.sales_activities
                              .open_activities
                              .where(party_id: party_ids)
                              .group(:party_id)
                              .pluck(:party_id)
  customer_has_open = parties_with_open.include?(@customer.id)
  write_flags(party_ids, customer_has_open)
  parties_with_open.any?
end