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
- #generate_handoff_summary_report ⇒ Object
-
#handoff_completion_status ⇒ Object
Handoff tracking methods.
- #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
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 27 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
53 54 55 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 53 def self.ransackable_associations(_auth_object = nil) %w[driver pickup_address delivery_vehicle delivery_order_items marketplace_orders] end |
.ransackable_attributes(_auth_object = nil) ⇒ Object
Ransack configuration for secure filtering
22 23 24 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 22 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
69 70 71 72 73 74 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 69 def complete_delivery! return false unless in_transit? update!(status: :delivered, actual_delivery_time: Time.current) update_associated_orders true end |
#delivery_duration ⇒ Object
93 94 95 96 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 93 def delivery_duration return nil unless actual_delivery_time && estimated_delivery_time (actual_delivery_time - estimated_delivery_time).to_i end |
#generate_handoff_summary_report ⇒ Object
123 124 125 126 127 128 129 130 131 132 133 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 123 def generate_handoff_summary_report { delivery_order_id: id, driver: driver&.name, vehicle: vehicle_type, total_destinations: delivery_order_items.distinct.pluck(:dropoff_address_id).count, handoff_status: handoff_completion_status, issues: items_requiring_attention.map(&:comprehensive_damage_report), generated_at: Time.current } end |
#handoff_completion_status ⇒ Object
Handoff tracking methods
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
76 77 78 79 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 76 def mark_failed!(reason = nil) update!(status: :failed, delivery_notes: reason) true end |
#on_time? ⇒ Boolean
98 99 100 101 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 98 def on_time? return nil unless actual_delivery_time && estimated_delivery_time actual_delivery_time <= estimated_delivery_time end |
#pickup! ⇒ Object
57 58 59 60 61 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 57 def pickup! return false unless assigned? update!(status: :picked_up, actual_delivery_time: Time.current) true end |
#start_delivery! ⇒ Object
63 64 65 66 67 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 63 def start_delivery! return false unless picked_up? update!(status: :in_transit) true end |
#total_items ⇒ Object
81 82 83 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 81 def total_items delivery_order_items.sum(:quantity) end |
#total_orders ⇒ Object
85 86 87 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 85 def total_orders marketplace_orders.count end |
#total_stops ⇒ Object
89 90 91 |
# File 'app/models/dscf/marketplace/delivery_order.rb', line 89 def total_stops delivery_order_items.distinct.pluck(:dropoff_address_id).count end |