Class: Dscf::Marketplace::DeliveryOrder
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- Dscf::Marketplace::DeliveryOrder
- Defined in:
- app/models/dscf/marketplace/delivery_order.rb
Class Method Summary collapse
-
.ransack(params = {}, options = {}) ⇒ Object
Override ransack to handle JSON fields and filtering.
- .ransackable_associations(_auth_object = nil) ⇒ Object
-
.ransackable_attributes(_auth_object = nil) ⇒ Object
Ransack configuration for secure filtering.
Instance Method Summary collapse
- #all_handoffs_confirmed? ⇒ Boolean
- #complete_delivery! ⇒ Object
- #delivery_duration ⇒ Object
- #formatted_delivery_duration ⇒ Object
- #generate_handoff_summary_report ⇒ Object
- #handoff_completion_status ⇒ Object
- #items_requiring_attention ⇒ Object
- #mark_failed!(reason = nil) ⇒ Object
- #on_time? ⇒ Boolean
- #pickup! ⇒ Object
- #start_delivery! ⇒ Object
- #total_items ⇒ Object
- #total_orders ⇒ Object
- #total_stops ⇒ Object
Class Method Details
.ransack(params = {}, options = {}) ⇒ Object
Override ransack to handle JSON fields and filtering
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 28 def self.ransack(params = {}, = {}) params ||= {} # Remove JSON fields that can't be filtered filtered_params = params.except("optimized_route") # Also remove any q parameters that reference JSON fields if filtered_params["q"].present? q_params = filtered_params["q"] # Remove any predicates that reference the optimized_route field q_params = q_params.reject { |key, _| key.to_s.include?("optimized_route") } filtered_params["q"] = q_params end # Call super with filtered params result = super(filtered_params, ) # If result is a relation, ensure we don't select JSON fields that might cause issues if result.is_a?(ActiveRecord::Relation) # Force selection of only the columns we want to avoid JSON field issues result = result.select(column_names - [ "optimized_route" ]) end result end |
.ransackable_associations(_auth_object = nil) ⇒ Object
54 55 56 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 54 def self.ransackable_associations(_auth_object = nil) %w[driver pickup_address delivery_vehicle delivery_order_items marketplace_orders delivery_stops] end |
.ransackable_attributes(_auth_object = nil) ⇒ Object
Ransack configuration for secure filtering
23 24 25 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 23 def self.ransackable_attributes(_auth_object = nil) %w[id driver_id pickup_address_id delivery_vehicle_id status vehicle_type estimated_delivery_price actual_delivery_price estimated_delivery_time actual_delivery_time delivery_notes created_at updated_at] end |
Instance Method Details
#all_handoffs_confirmed? ⇒ Boolean
115 116 117 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 115 def all_handoffs_confirmed? delivery_order_items.all?(&:receiver_confirmed?) end |
#complete_delivery! ⇒ Object
70 71 72 73 74 75 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 70 def complete_delivery! return false unless in_transit? update!(status: :delivered, actual_delivery_time: Time.current) update_associated_orders true end |
#delivery_duration ⇒ Object
94 95 96 97 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 94 def delivery_duration return nil unless actual_delivery_time && estimated_delivery_time (actual_delivery_time - estimated_delivery_time).to_i end |
#formatted_delivery_duration ⇒ Object
147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 147 def formatted_delivery_duration return "N/A" unless delivery_duration hours = delivery_duration / 3600 minutes = (delivery_duration % 3600) / 60 if hours > 0 "#{hours}h #{minutes}m" else "#{minutes}m" end end |
#generate_handoff_summary_report ⇒ Object
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 123 def generate_handoff_summary_report { delivery_order_id: id, driver: [driver&.user_profile&.first_name, driver&.user_profile&.last_name].compact.join(" "), vehicle: vehicle_type, # Financials & Metrics delivery_price: actual_delivery_price || estimated_delivery_price, time_taken: formatted_delivery_duration, distance_covered: 0, # Placeholder until distance tracking is implemented stops: delivery_stops.order(:sequence_number).map do |stop| { id: stop.id, address: [stop.dropoff_address&.city, stop.dropoff_address&.sub_city].compact.join(", ").presence || "Unknown Address", city: stop.dropoff_address&.city, status: stop.status&.titleize } end, generated_at: Time.current } end |
#handoff_completion_status ⇒ Object
104 105 106 107 108 109 110 111 112 113 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 104 def handoff_completion_status items = delivery_order_items { total_items: items.count, confirmed_items: items.count(&:receiver_confirmed?), pending_confirmation: items.count { |item| item.delivered? && !item.receiver_confirmed? }, issues_reported: items.count(&:requires_resolution?), completion_percentage: items.present? ? (items.count(&:receiver_confirmed?).to_f / items.count * 100).round(2) : 0 } end |
#items_requiring_attention ⇒ Object
119 120 121 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 119 def items_requiring_attention delivery_order_items.select(&:requires_resolution?) end |
#mark_failed!(reason = nil) ⇒ Object
77 78 79 80 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 77 def mark_failed!(reason = nil) update!(status: :failed, delivery_notes: reason) true end |
#on_time? ⇒ Boolean
99 100 101 102 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 99 def on_time? return nil unless actual_delivery_time && estimated_delivery_time actual_delivery_time <= estimated_delivery_time end |
#pickup! ⇒ Object
58 59 60 61 62 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 58 def pickup! return false unless assigned? update!(status: :picked_up, actual_delivery_time: Time.current) true end |
#start_delivery! ⇒ Object
64 65 66 67 68 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 64 def start_delivery! return false unless picked_up? update!(status: :in_transit) true end |
#total_items ⇒ Object
82 83 84 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 82 def total_items delivery_order_items.sum(:quantity) end |
#total_orders ⇒ Object
86 87 88 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 86 def total_orders marketplace_orders.count end |
#total_stops ⇒ Object
90 91 92 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 90 def total_stops delivery_order_items.distinct.pluck(:dropoff_address_id).count end |