Class: RmaPresenter

Inherits:
BasePresenter show all
Defined in:
app/presenters/rma_presenter.rb

Overview

View-specific projection for one RMA's lifecycle and inbound tracking.

The versions database is supplementary: the current RMA state and persisted
business dates remain authoritative when audit history is unavailable. Carrier
scans are keyed by tracking number so external returns and labels generated by
Heatwave share the same ShipmentEvent history.

See Also:

Constant Summary collapse

RETURNED_OR_LATER_STATES =

Lifecycle states in which the physical return is already complete.

%w[
  returned
  credit_in_process
  credited_partially_refunded
  credited_fully_refunded
].freeze
CREDITED_STATES =

Lifecycle states in which at least one refund has been issued.

%w[
  credited_partially_refunded
  credited_fully_refunded
].freeze
TRACKING_BADGE_CLASSES =

Bootstrap badge class for each normalized ShipEngine tracking status.

{
  'DE' => 'text-bg-success',
  'SP' => 'text-bg-success',
  'EX' => 'text-bg-danger',
  'AT' => 'text-bg-warning',
  'IT' => 'text-bg-primary',
  'AC' => 'text-bg-info',
  'NY' => 'text-bg-secondary',
  'UN' => 'text-bg-secondary'
}.freeze

Instance Attribute Summary

Attributes inherited from BasePresenter

#current_account, #options, #url_helper

Instance Method Summary collapse

Methods inherited from BasePresenter

#can?, #capture, #concat, #content_tag, #fa_icon, #h, #initialize, #link_to, #number_to_currency, #present, presents, #r, #safe_present, #simple_format, #u

Constructor Details

This class inherits a constructor from BasePresenter

Instance Method Details

#milestone_datesHash{Symbol => Date, nil}

Ordered milestone dates assembled from audit history, persisted domain
dates, and inbound carrier events.

Returns:

  • (Hash{Symbol => Date, nil})


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'app/presenters/rma_presenter.rb', line 45

def milestone_dates
  audit_dates = rma.versions_for_dates_tracker
  audit_dates = audit_dates.to_h.symbolize_keys if audit_dates.respond_to?(:to_h)

  dates = {}
  dates[:dropped_off] = audit_dates[:dropped_off] if inbound_tracking_numbers.any? || audit_dates.key?(:dropped_off)
  %i[warehouse_received submitted_for_inspection returned process_refund refunded fully_refunded].each do |key|
    dates[key] = audit_dates[key]
  end

  dates[:dropped_off] ||= first_movement_event&.occurred_at&.to_date if dates.key?(:dropped_off)
  dates[:dropped_off] ||= rma.earliest_return_label_ship_date if dates.key?(:dropped_off)
  dates[:warehouse_received] ||= first_warehouse_delivery_event&.occurred_at&.to_date
  dates[:warehouse_received] ||= date_value(rma.arrival_date)
  dates[:warehouse_received] ||= date_value(rma.arrival_datetime)

  dates[:returned] ||= date_value(rma.returned_date) if RETURNED_OR_LATER_STATES.include?(rma.state)

  dates[:refunded] ||= date_value(rma.credited_date) if CREDITED_STATES.include?(rma.state)
  dates[:fully_refunded] ||= date_value(rma.credited_date) if rma.state == 'credited_fully_refunded'

  dates
end

#tracking_event_badge_class(event) ⇒ String

Bootstrap semantic badge class for one normalized carrier state.

Parameters:

Returns:

  • (String)


119
120
121
# File 'app/presenters/rma_presenter.rb', line 119

def tracking_event_badge_class(event)
  TRACKING_BADGE_CLASSES.fetch(event.status_code, 'text-bg-secondary')
end

#tracking_event_description(event) ⇒ String

Most useful carrier-side description for one scan.

Parameters:

Returns:

  • (String)


98
99
100
101
102
103
104
105
# File 'app/presenters/rma_presenter.rb', line 98

def tracking_event_description(event)
  event.event_description.presence ||
    event.carrier_status_description.presence ||
    event.status_description.presence ||
    event.description.presence ||
    event.event_code.presence ||
    tracking_event_status(event)
end

#tracking_event_location(event) ⇒ String

Compact carrier location for one scan.

Parameters:

Returns:

  • (String)


111
112
113
# File 'app/presenters/rma_presenter.rb', line 111

def tracking_event_location(event)
  [event.city_locality, event.state_province, event.country_code].compact_blank.join(', ')
end

#tracking_event_status(event) ⇒ String

Human-readable normalized event state.

Parameters:

Returns:

  • (String)


90
91
92
# File 'app/presenters/rma_presenter.rb', line 90

def tracking_event_status(event)
  ShipmentEvent::STATUS_CODE_LABELS.fetch(event.status_code, 'unknown').humanize
end

#tracking_event_time(event) ⇒ String

CRM display timestamp for a carrier scan.

Parameters:

Returns:

  • (String)


127
128
129
# File 'app/presenters/rma_presenter.rb', line 127

def tracking_event_time(event)
  event.occurred_at.in_time_zone.strftime('%b %-d, %Y %-l:%M %p %Z')
end

#tracking_events_for(tracking_number) ⇒ Array<ShipmentEvent>

Carrier events for one inbound number, newest first.

Parameters:

Returns:



81
82
83
84
# File 'app/presenters/rma_presenter.rb', line 81

def tracking_events_for(tracking_number)
  number = tracking_number.respond_to?(:tracking_number) ? tracking_number.tracking_number : tracking_number
  tracking_events_by_number.fetch(number, [])
end

#tracking_numbersArray<ShipmentTrackingNumber>

Parsed tracking-number display objects for every inbound number, whether
it came from a generated return shipment or external/manual entry.

Returns:



73
74
75
# File 'app/presenters/rma_presenter.rb', line 73

def tracking_numbers
  @tracking_numbers ||= rma.shipment_tracking_numbers.uniq(&:tracking_number)
end