Class: DailyFocus::ReviewDataBuilder

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

Overview

Builds the per-rep rows and summary counters for the Daily Focus review page.

Defined Under Namespace

Classes: Result

Constant Summary collapse

BRIEFING_ACTIVE_STATUSES =

Statuses that mean this rep has (or shares) a Daily Focus artifact for the day.

%i[processing pending approved failed covered].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(date:, audience:) ⇒ ReviewDataBuilder

Returns a new instance of ReviewDataBuilder.



37
38
39
40
# File 'app/services/daily_focus/review_data_builder.rb', line 37

def initialize(date:, audience:)
  @date = date
  @audience = audience
end

Class Method Details

.call(date:, audience:) ⇒ Result

Parameters:

  • date (Date)
  • audience (String, Symbol)

Returns:



33
34
35
# File 'app/services/daily_focus/review_data_builder.rb', line 33

def self.call(date:, audience:)
  new(date: date, audience: audience).call
end

Instance Method Details

#callObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/services/daily_focus/review_data_builder.rb', line 42

def call
  reps = DailyFocus.rep_scope(@audience).order(:full_name).includes(:daily_focus_coaching_note).to_a
  DailyFocus::ReviewWorkDayPreloader.call(reps, @date)

  indexes = conversation_indexes
  covering_by_rep = DailyFocus::RunPolicy.covering_rows_for_review(
    date: @date, rep_ids: reps.map(&:id), audience: @audience
  )

  rep_rows = reps.map { |rep| row_for(rep, indexes, covering_by_rep) }

  Result.new(
    rep_rows: rep_rows,
    processing_count: rep_rows.count { |r| r[:status] == :processing },
    pending_count: rep_rows.count { |r| r[:status] == :pending },
    approved_count: rep_rows.count { |r| r[:status] == :approved },
    missing_count: rep_rows.count { |r| %i[missing failed].include?(r[:status]) },
    briefings_recorded_count: rep_rows.count { |r| BRIEFING_ACTIVE_STATUSES.include?(r[:status]) },
    total_reps_count: rep_rows.size
  )
end