dscf-marketplace 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/dscf/marketplace/delivery_orders_controller.rb +39 -0
- data/app/controllers/dscf/marketplace/orders_controller.rb +4 -0
- data/app/services/dscf/marketplace/delivery_order_service.rb +72 -0
- data/config/locales/en.yml +41 -36
- data/config/routes.rb +1 -0
- data/lib/dscf/marketplace/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2118a22dd49f19b75b611bcdbb8ca04485e641b0eef6c1314d3557f8e2bd9144
|
4
|
+
data.tar.gz: 94e03aa2b185429dc02b0698fc3a39b4efb8ff497f473b23c81c9ed05c9f9407
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e931358752fc3d8623e021bc95b0bd5ab40b66950aee72bc5ec2df3f3e4d66e49bddcc4ea6aa24a7ca6cd6ccde522b74398d7aef2d38af64da3ac213369473e9
|
7
|
+
data.tar.gz: 949bb44f979f5edaaf6aaa7035cc51ca93ccfed13ae9fb5d0fd010543e670d09f19fbadbb403a661d57e6e787bc25a036e5166bc4118fdd7354b43b24d840b41
|
@@ -120,6 +120,45 @@ module Dscf
|
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
|
+
def convert_orders
|
124
|
+
order_ids = params[:order_ids]
|
125
|
+
vehicle_type = params[:vehicle_type]
|
126
|
+
pickup_address_id = params[:pickup_address_id]
|
127
|
+
delivery_notes = params[:delivery_notes]
|
128
|
+
|
129
|
+
# Validate required parameters
|
130
|
+
unless order_ids.present? && vehicle_type.present? && pickup_address_id.present?
|
131
|
+
render_error("delivery_orders.errors.convert_orders_missing_params")
|
132
|
+
return
|
133
|
+
end
|
134
|
+
|
135
|
+
# Find orders and pickup address
|
136
|
+
orders = Dscf::Marketplace::Order.where(id: order_ids)
|
137
|
+
pickup_address = Dscf::Core::Address.find_by(id: pickup_address_id)
|
138
|
+
|
139
|
+
unless pickup_address
|
140
|
+
render_error("delivery_orders.errors.pickup_address_not_found")
|
141
|
+
return
|
142
|
+
end
|
143
|
+
|
144
|
+
# Check if all orders exist
|
145
|
+
if orders.count != order_ids.length
|
146
|
+
missing_ids = order_ids - orders.pluck(:id)
|
147
|
+
render_error("delivery_orders.errors.orders_not_found", message: "Orders not found: #{missing_ids.join(", ")}")
|
148
|
+
return
|
149
|
+
end
|
150
|
+
|
151
|
+
service = Dscf::Marketplace::DeliveryOrderService.new
|
152
|
+
begin
|
153
|
+
delivery_order = service.convert_orders_to_delivery(orders, vehicle_type, pickup_address, delivery_notes)
|
154
|
+
render_success("delivery_orders.success.orders_converted", data: delivery_order)
|
155
|
+
rescue Dscf::Marketplace::DeliveryOrderService::ConversionError => e
|
156
|
+
render_error("delivery_orders.errors.orders_conversion_failed", message: e.message)
|
157
|
+
rescue => e
|
158
|
+
render_error("delivery_orders.errors.convert_orders_failed", message: e.message)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
123
162
|
private
|
124
163
|
|
125
164
|
def model_params
|
@@ -4,6 +4,8 @@ module Dscf::Marketplace
|
|
4
4
|
|
5
5
|
class AssignmentError < StandardError; end
|
6
6
|
|
7
|
+
class ConversionError < StandardError; end
|
8
|
+
|
7
9
|
def assign_driver(delivery_order, driver)
|
8
10
|
raise ArgumentError, "Delivery order is required" unless delivery_order
|
9
11
|
raise ArgumentError, "Driver is required" unless driver
|
@@ -21,5 +23,75 @@ module Dscf::Marketplace
|
|
21
23
|
|
22
24
|
delivery_order
|
23
25
|
end
|
26
|
+
|
27
|
+
def convert_orders_to_delivery(orders, vehicle_type, pickup_address, delivery_notes = nil)
|
28
|
+
raise ArgumentError, "Orders array is required" unless orders.present?
|
29
|
+
raise ArgumentError, "Vehicle type is required" unless vehicle_type.present?
|
30
|
+
raise ArgumentError, "Pickup address is required" unless pickup_address.present?
|
31
|
+
|
32
|
+
# Validate all orders can be converted
|
33
|
+
validate_orders_for_conversion(orders)
|
34
|
+
|
35
|
+
# Create delivery order in a transaction
|
36
|
+
DeliveryOrder.transaction do
|
37
|
+
delivery_order = create_delivery_order(vehicle_type, pickup_address, delivery_notes)
|
38
|
+
create_delivery_order_items(delivery_order, orders, pickup_address)
|
39
|
+
associate_orders_with_delivery(delivery_order, orders)
|
40
|
+
|
41
|
+
delivery_order
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def validate_orders_for_conversion(orders)
|
48
|
+
orders.each do |order|
|
49
|
+
unless order.delivery?
|
50
|
+
raise ConversionError, "Order #{order.id} is not a delivery order"
|
51
|
+
end
|
52
|
+
|
53
|
+
unless order.confirmed? || order.processing?
|
54
|
+
raise ConversionError, "Order #{order.id} must be confirmed or processing to be converted"
|
55
|
+
end
|
56
|
+
|
57
|
+
if order.delivery_order.present?
|
58
|
+
raise ConversionError, "Order #{order.id} is already associated with a delivery order"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_delivery_order(vehicle_type, pickup_address, delivery_notes)
|
64
|
+
DeliveryOrder.create!(
|
65
|
+
vehicle_type: vehicle_type,
|
66
|
+
pickup_address: pickup_address,
|
67
|
+
delivery_notes: delivery_notes,
|
68
|
+
status: :draft
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
def create_delivery_order_items(delivery_order, orders, pickup_address)
|
73
|
+
orders.each do |order|
|
74
|
+
order.order_items.each do |order_item|
|
75
|
+
# For now, use the pickup address as both pickup and dropoff
|
76
|
+
# In a real implementation, you'd need to get the buyer's delivery address
|
77
|
+
dropoff_address = pickup_address # Temporary fallback
|
78
|
+
|
79
|
+
DeliveryOrderItem.create!(
|
80
|
+
delivery_order: delivery_order,
|
81
|
+
order_item: order_item,
|
82
|
+
quantity: order_item.quantity,
|
83
|
+
pickup_address: pickup_address,
|
84
|
+
dropoff_address: dropoff_address,
|
85
|
+
status: :pending
|
86
|
+
)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def associate_orders_with_delivery(delivery_order, orders)
|
92
|
+
orders.each do |order|
|
93
|
+
order.update!(delivery_order: delivery_order)
|
94
|
+
end
|
95
|
+
end
|
24
96
|
end
|
25
97
|
end
|
data/config/locales/en.yml
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
# Pattern: {model_name}.{success|errors}.{action_name} - using plural for controller consistency
|
5
5
|
|
6
6
|
en:
|
7
|
-
|
7
|
+
# Core Models
|
8
8
|
category:
|
9
9
|
success:
|
10
10
|
index: "Categories retrieved successfully"
|
@@ -234,28 +234,28 @@ en:
|
|
234
234
|
update: "Failed to update order item"
|
235
235
|
destroy: "Failed to delete order item"
|
236
236
|
|
237
|
-
|
237
|
+
# Delivery Models
|
238
238
|
delivery_order:
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
239
|
+
success:
|
240
|
+
index: "Delivery orders retrieved successfully"
|
241
|
+
show: "Delivery order details retrieved successfully"
|
242
|
+
create: "Delivery order created successfully"
|
243
|
+
update: "Delivery order updated successfully"
|
244
|
+
destroy: "Delivery order deleted successfully"
|
245
|
+
pickup: "Delivery order picked up successfully"
|
246
|
+
start_delivery: "Delivery started successfully"
|
247
|
+
complete_delivery: "Delivery completed successfully"
|
248
|
+
mark_failed: "Delivery marked as failed"
|
249
|
+
errors:
|
250
|
+
index: "Failed to retrieve delivery orders"
|
251
|
+
show: "Failed to retrieve delivery order details"
|
252
|
+
create: "Failed to create delivery order"
|
253
|
+
update: "Failed to update delivery order"
|
254
|
+
destroy: "Failed to delete delivery order"
|
255
|
+
pickup: "Failed to pickup delivery order"
|
256
|
+
start_delivery: "Failed to start delivery"
|
257
|
+
complete_delivery: "Failed to complete delivery"
|
258
|
+
mark_failed: "Failed to mark delivery as failed"
|
259
259
|
|
260
260
|
delivery_orders:
|
261
261
|
success:
|
@@ -268,21 +268,26 @@ en:
|
|
268
268
|
delivery_started: "Delivery started successfully"
|
269
269
|
delivery_completed: "Delivery completed successfully"
|
270
270
|
marked_failed: "Delivery marked as failed"
|
271
|
-
|
271
|
+
orders_converted: "Orders converted to delivery successfully"
|
272
272
|
errors:
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
273
|
+
index: "Failed to retrieve delivery orders"
|
274
|
+
show: "Failed to retrieve delivery order details"
|
275
|
+
create: "Failed to create delivery order"
|
276
|
+
update: "Failed to update delivery order"
|
277
|
+
destroy: "Failed to delete delivery order"
|
278
|
+
picked_up: "Failed to pickup delivery order"
|
279
|
+
delivery_started: "Failed to start delivery"
|
280
|
+
delivery_completed: "Failed to complete delivery"
|
281
|
+
marked_failed: "Failed to mark delivery as failed"
|
282
|
+
pickup_failed: "Failed to pickup delivery order"
|
283
|
+
start_delivery_failed: "Failed to start delivery"
|
284
|
+
complete_delivery_failed: "Failed to complete delivery"
|
285
|
+
mark_failed_failed: "Failed to mark delivery as failed"
|
286
|
+
convert_orders_missing_params: "Missing required parameters: order_ids, vehicle_type, and pickup_address_id"
|
287
|
+
pickup_address_not_found: "Pickup address not found"
|
288
|
+
orders_not_found: "Some orders were not found"
|
289
|
+
orders_conversion_failed: "Failed to convert orders to delivery"
|
290
|
+
convert_orders_failed: "Unexpected error during order conversion"
|
286
291
|
|
287
292
|
delivery_order_item:
|
288
293
|
success:
|
data/config/routes.rb
CHANGED