Class: Workarea::Admin::OrderTimelineViewModel

Inherits:
ApplicationViewModel
  • Object
show all
Includes:
Enumerable
Defined in:
app/view_models/workarea/admin/order_timeline_view_model.rb

Defined Under Namespace

Classes: Entry

Instance Method Summary collapse

Instance Method Details

#by_dayObject



42
43
44
45
46
47
48
49
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 42

def by_day
  @days ||= entries.reduce({}) do |memo, entry|
    day = entry.occured_at.to_date
    memo[day] ||= []
    memo[day] << entry
    memo
  end
end

#canceled_entryObject



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 118

def canceled_entry
  return if model.canceled_at.blank?

  audit_log_entry = model.audit_log_entries.detect do |event|
    event.tracked_changes['canceled_at'].present? &&
      event.tracked_changes['canceled_at'].first.blank? &&
      event.tracked_changes['canceled_at'].last.present?
  end

  Entry.new(
    :canceled,
    model.canceled_at,
    audit_log_entry.try(:modifier),
    model
  )
end

#checkout_byObject



135
136
137
138
139
140
141
142
143
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 135

def checkout_by
  @checkout_by ||=
    User.where(id: model.checkout_by_id).first ||
    User.where(id: model.user_id).first ||
    User.new(
      email: model.email,
      name: "#{payment.first_name} #{payment.last_name}"
    )
end

#comment_entriesObject



100
101
102
103
104
105
106
107
108
109
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 100

def comment_entries
  model.comments.map do |comment|
    Entry.new(
      :comment,
      comment.created_at,
      User.where(id: comment.author_id).first,
      comment
    )
  end
end

#copied_entriesObject



111
112
113
114
115
116
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 111

def copied_entries
  Order.copied_from(model.id).map do |order|
    copier = order.audit_log_entries.desc(:created_at).first.try(:modifier)
    Entry.new(:copied, order.created_at, copier, order)
  end
end

#created_entryObject



51
52
53
54
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 51

def created_entry
  return if model.created_at.blank?
  Entry.new(:created, model.created_at, checkout_by, model)
end

#entriesObject



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 22

def entries
  @entries ||=
    begin
      result = []
      result << created_entry if created_entry.present?
      result << placed_entry if placed_entry.present?
      result += payment_entries
      result += fulfillment_entries
      result << canceled_entry if canceled_entry.present?
      result += comment_entries
      result += copied_entries
      result << price_override_entry if price_override_entry.present?

      result
        .reject { |r| r.occured_at.blank? }
        .sort_by(&:occured_at)
        .reverse
    end
end

#fulfillment_entriesObject



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 76

def fulfillment_entries
  results = []
  grouped = fulfillment.events.group_by do |event|
    [event.status, event.created_at]
  end

  grouped.each do |(type, created_at), events|
    # Try to find the audit log entry based on rounding creation to
    # nearest second.
    audit_log_entry = fulfillment.audit_log_entries.detect do |entry|
      entry.created_at.round.to_i == created_at.round.to_i
    end

    results << Entry.new(
      type == 'canceled' ? :canceled_fulfillment : type.to_sym,
      created_at,
      audit_log_entry.try(:modifier),
      events
    )
  end

  results
end

#payment_entriesObject



61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 61

def payment_entries
  # TODO v4 - use payment.transactions
  transactions = Payment::Transaction.where(payment_id: payment.id).to_a
  transactions.reduce([]) do |memo, transaction|
    admin_modifier = transaction.audit_log_entries.first.try(:modifier)

    memo << Entry.new(
      transaction.action.to_sym,
      transaction.created_at,
      admin_modifier || checkout_by,
      transaction
    )
  end
end

#placed_entryObject



56
57
58
59
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 56

def placed_entry
  return if model.placed_at.blank?
  Entry.new(:placed, model.placed_at, checkout_by, model)
end

#price_override_entryObject



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'app/view_models/workarea/admin/order_timeline_view_model.rb', line 145

def price_override_entry
  return @price_override_entry if defined?(@price_override_entry)
  override = Pricing::Override.find(model.id)

  @price_override_entry =
    if override.has_adjustments?
      Admin::OrderTimelineViewModel::Entry.new(
        :price_overridden,
        override.created_at,
        User.find(override.created_by_id),
        override
      )
    end
rescue Mongoid::Errors::DocumentNotFound
  @price_override_entry = nil
end