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



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

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



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

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



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

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)


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

def damaged?
  status == "damaged"
end

#deliver!Object



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

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)


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

def delivered?
  status == "delivered"
end

#discrepancy_amountObject



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

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

#dispute_delivery!(reason, disputed_by) ⇒ Object



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

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)


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

def disputed?
  status == "disputed"
end

#has_discrepancy?Boolean

Returns:

  • (Boolean)


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

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

#mark_damaged!(quantity) ⇒ Object



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

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

#mark_missing!(quantity) ⇒ Object



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

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

#missing?Boolean

Returns:

  • (Boolean)


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

def missing?
  status == "missing"
end

#pending?Boolean

Returns:

  • (Boolean)


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

def pending?
  status == "pending"
end

#picked_up?Boolean

Returns:

  • (Boolean)


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

def picked_up?
  status == "picked_up"
end

#pickup!Object



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

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

#product_nameObject



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

def product_name
  order_item&.product_name
end

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

Handoff workflow methods



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

def receiver_confirm!(confirmed_quantity, notes = nil, confirmed_by = nil)
  return false unless in_transit?

  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)


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

def receiver_confirmed?
  status == "receiver_confirmed"
end

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



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

def report_issue!(issue_type, quantity, description, reported_by)
  return false unless delivered? || picked_up? || pending?
  return false unless [ "damaged", "missing" ].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)


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

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

#unit_nameObject



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

def unit_name
  order_item&.unit_name
end

#verification_complete?Boolean

Returns:

  • (Boolean)


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

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