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



31
32
33
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 31

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



27
28
29
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 27

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



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

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)


47
48
49
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 47

def damaged?
  status == "damaged"
end

#deliver!Object



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

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)


43
44
45
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 43

def delivered?
  status == "delivered"
end

#discrepancy_amountObject



141
142
143
144
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 141

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

#dispute_delivery!(reason, disputed_by) ⇒ Object



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

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)


59
60
61
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 59

def disputed?
  status == "disputed"
end

#has_discrepancy?Boolean

Returns:

  • (Boolean)


136
137
138
139
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 136

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

#mark_damaged!(quantity) ⇒ Object



122
123
124
125
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 122

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

#mark_missing!(quantity) ⇒ Object



127
128
129
130
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 127

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

#missing?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 51

def missing?
  status == "missing"
end

#pending?Boolean

Returns:

  • (Boolean)


35
36
37
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 35

def pending?
  status == "pending"
end

#picked_up?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 39

def picked_up?
  status == "picked_up"
end

#pickup!Object



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

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

#product_nameObject



146
147
148
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 146

def product_name
  order_item&.product_name
end

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

Handoff workflow methods



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

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)


55
56
57
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 55

def receiver_confirmed?
  status == "receiver_confirmed"
end

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



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

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)


171
172
173
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 171

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

#unit_nameObject



150
151
152
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 150

def unit_name
  order_item&.unit_name
end

#verification_complete?Boolean

Returns:

  • (Boolean)


132
133
134
# File 'app/models/dscf/marketplace/delivery_order_item.rb', line 132

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