Class: RmaPresenter
- Inherits:
-
BasePresenter
- Object
- SimpleDelegator
- BasePresenter
- RmaPresenter
- 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.
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
-
#milestone_dates ⇒ Hash{Symbol => Date, nil}
Ordered milestone dates assembled from audit history, persisted domain dates, and inbound carrier events.
-
#tracking_event_badge_class(event) ⇒ String
Bootstrap semantic badge class for one normalized carrier state.
-
#tracking_event_description(event) ⇒ String
Most useful carrier-side description for one scan.
-
#tracking_event_location(event) ⇒ String
Compact carrier location for one scan.
-
#tracking_event_status(event) ⇒ String
Human-readable normalized event state.
-
#tracking_event_time(event) ⇒ String
CRM display timestamp for a carrier scan.
-
#tracking_events_for(tracking_number) ⇒ Array<ShipmentEvent>
Carrier events for one inbound number, newest first.
-
#tracking_numbers ⇒ Array<ShipmentTrackingNumber>
Parsed tracking-number display objects for every inbound number, whether it came from a generated return shipment or external/manual entry.
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_dates ⇒ Hash{Symbol => Date, nil}
Ordered milestone dates assembled from audit history, persisted domain
dates, and inbound carrier events.
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.
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.
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.
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.
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.
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.
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_numbers ⇒ Array<ShipmentTrackingNumber>
Parsed tracking-number display objects for every inbound number, whether
it came from a generated return shipment or external/manual entry.
73 74 75 |
# File 'app/presenters/rma_presenter.rb', line 73 def tracking_numbers @tracking_numbers ||= rma.shipment_tracking_numbers.uniq(&:tracking_number) end |