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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1453b148008e135853ee34ec3c11a3e4ae92d1a63d692c46de443a2c65789f2a
4
- data.tar.gz: 102476ba6b33b913f846a3ea25fe52728d3b1a5875fe18b98bcb20dadc39faa5
3
+ metadata.gz: 2118a22dd49f19b75b611bcdbb8ca04485e641b0eef6c1314d3557f8e2bd9144
4
+ data.tar.gz: 94e03aa2b185429dc02b0698fc3a39b4efb8ff497f473b23c81c9ed05c9f9407
5
5
  SHA512:
6
- metadata.gz: a554fc5405b2a480cfc488ba0d5266b8219343549c6c873892d0b122f425e8643adeb27aaa4a056faa864cdb7af1d6562dcd125923cd1530812998242b8a7886
7
- data.tar.gz: fe584405ecbfa49efd3a7c3de767d9c795c3dab1bc17342d5e422d8b986a56eaced5771729e7412636104ab9b793803106aa97437e95d74f0008d0bea1445c63
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
@@ -85,6 +85,10 @@ module Dscf
85
85
  update: [ :user, :ordered_by, :ordered_to, :quotation, :listing, :order_items ]
86
86
  }
87
87
  end
88
+
89
+ def find_record
90
+ Dscf::Marketplace::Order.find(params[:id])
91
+ end
88
92
  end
89
93
  end
90
94
  end
@@ -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
@@ -4,7 +4,7 @@
4
4
  # Pattern: {model_name}.{success|errors}.{action_name} - using plural for controller consistency
5
5
 
6
6
  en:
7
- # Core Models
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
- # Delivery Models
237
+ # Delivery Models
238
238
  delivery_order:
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"
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
- index.success: "Delivery orders retrieved successfully"
271
+ orders_converted: "Orders converted to delivery successfully"
272
272
  errors:
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"
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
@@ -106,6 +106,7 @@ Dscf::Marketplace::Engine.routes.draw do
106
106
  end
107
107
  collection do
108
108
  get "filter"
109
+ post "convert_orders"
109
110
  end
110
111
  end
111
112
 
@@ -1,5 +1,5 @@
1
1
  module Dscf
2
2
  module Marketplace
3
- VERSION = "0.3.4".freeze
3
+ VERSION = "0.3.6".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dscf-marketplace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Asrat