Class: Dscf::Marketplace::DeliveryOrderItem

Inherits:
ApplicationRecord show all
Defined in:
app/models/dscf/marketplace/delivery_order_item.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.ransackable_associations(_auth_object = nil) ⇒ Object



29
30
31
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 29

def self.ransackable_associations(_auth_object = nil)
  %w[delivery_order order_item pickup_address dropoff_address]
end

.ransackable_attributes(_auth_object = nil) ⇒ Object

Ransack configuration for secure filtering



25
26
27
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 25

def self.ransackable_attributes(_auth_object = nil)
  %w[id delivery_order_id order_item_id pickup_address_id dropoff_address_id quantity status pickup_verified_quantity dropoff_verified_quantity damaged_quantity missing_quantity receiver_confirmed_by receiver_confirmed_at receiver_notes handoff_checklist_completed created_at updated_at]
end

Instance Method Details

#comprehensive_damage_reportObject

Loss/Damage Reporting Methods



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 153

def comprehensive_damage_report
  {
    item_id: id,
    product_name: order_item&.product&.name,
    expected_quantity: quantity,
    received_quantity: dropoff_verified_quantity,
    damaged_quantity: damaged_quantity,
    missing_quantity: missing_quantity,
    total_discrepancy: discrepancy_amount,
    issue_description: receiver_notes,
    reported_at: receiver_confirmed_at,
    reported_by: receiver_confirmed_by,
    requires_resolution: requires_resolution?
  }
end

#damaged?Boolean

Returns:

  • (Boolean)


45
46
47
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 45

def damaged?
  status == "damaged"
end

#deliver!Object



67
68
69
70
71
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 67

def deliver!
  return false unless picked_up?
  update!(status: :delivered, dropoff_verified_quantity: pickup_verified_quantity.to_f - (damaged_quantity || 0) - (missing_quantity || 0))
  true
end

#delivered?Boolean

Returns:

  • (Boolean)


41
42
43
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 41

def delivered?
  status == "delivered"
end

#discrepancy_amountObject



139
140
141
142
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 139

def discrepancy_amount
  return 0 unless has_discrepancy?
  (pickup_verified_quantity - dropoff_verified_quantity).abs
end

#dispute_delivery!(reason, disputed_by) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 107

def dispute_delivery!(reason, disputed_by)
  return false unless delivered? || receiver_confirmed?

  update!(
    status: :disputed,
    receiver_notes: reason,
    receiver_confirmed_at: Time.current,
    receiver_confirmed_by: disputed_by
  )
  create_dispute_record
  true
end

#disputed?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 57

def disputed?
  status == "disputed"
end

#has_discrepancy?Boolean

Returns:

  • (Boolean)


134
135
136
137
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 134

def has_discrepancy?
  return false unless verification_complete?
  pickup_verified_quantity != dropoff_verified_quantity
end

#mark_damaged!(quantity) ⇒ Object



120
121
122
123
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 120

def mark_damaged!(quantity)
  update!(status: :damaged, damaged_quantity: quantity)
  true
end

#mark_missing!(quantity) ⇒ Object



125
126
127
128
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 125

def mark_missing!(quantity)
  update!(status: :missing, missing_quantity: quantity)
  true
end

#missing?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 49

def missing?
  status == "missing"
end

#pending?Boolean

Returns:

  • (Boolean)


33
34
35
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 33

def pending?
  status == "pending"
end

#picked_up?Boolean

Returns:

  • (Boolean)


37
38
39
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 37

def picked_up?
  status == "picked_up"
end

#pickup!Object



61
62
63
64
65
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 61

def pickup!
  return false unless pending?
  update!(status: :picked_up, pickup_verified_quantity: quantity)
  true
end

#product_nameObject



144
145
146
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 144

def product_name
  order_item&.product_name
end

#receiver_confirm!(confirmed_quantity, notes = nil, confirmed_by = nil) ⇒ Object

Handoff workflow methods



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 74

def receiver_confirm!(confirmed_quantity, notes = nil, confirmed_by = nil)
  return false unless picked_up? || pending? || delivered?

  update!(
    status: :receiver_confirmed,
    dropoff_verified_quantity: confirmed_quantity,
    receiver_notes: notes,
    receiver_confirmed_at: Time.current,
    receiver_confirmed_by: confirmed_by,
    handoff_checklist_completed: true
  )
  notify_receiver_confirmation
  true
end

#receiver_confirmed?Boolean

Returns:

  • (Boolean)


53
54
55
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 53

def receiver_confirmed?
  status == "receiver_confirmed"
end

#report_issue!(issue_type, quantity, description, reported_by) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 89

def report_issue!(issue_type, quantity, description, reported_by)
  return false unless delivered? || picked_up? || pending?
  return false unless [ "damaged", "missing", "wrong_item", "incomplete" ].include?(issue_type)
  return false if quantity > self.quantity

  update!(
    status: issue_type.to_sym, # :damaged or :missing
    damaged_quantity: ((issue_type == "damaged") ? quantity : 0),
    missing_quantity: ((issue_type == "missing") ? quantity : 0),
    receiver_notes: description,
    receiver_confirmed_at: Time.current,
    receiver_confirmed_by: reported_by,
    handoff_checklist_completed: true
  )
  notify_platform_of_issue
  true
end

#requires_resolution?Boolean

Returns:

  • (Boolean)


169
170
171
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 169

def requires_resolution?
  has_discrepancy? || damaged? || missing? || disputed?
end

#unit_nameObject



148
149
150
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 148

def unit_name
  order_item&.unit_name
end

#verification_complete?Boolean

Returns:

  • (Boolean)


130
131
132
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 130

def verification_complete?
  pickup_verified_quantity.present? && dropoff_verified_quantity.present?
end