dscf-marketplace 0.1.7 → 0.1.9

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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/dscf/marketplace/application_controller.rb +2 -0
  3. data/app/controllers/dscf/marketplace/categories_controller.rb +26 -0
  4. data/app/controllers/dscf/marketplace/listings_controller.rb +55 -0
  5. data/app/controllers/dscf/marketplace/orders_controller.rb +58 -0
  6. data/app/controllers/dscf/marketplace/products_controller.rb +30 -0
  7. data/app/controllers/dscf/marketplace/quotations_controller.rb +56 -0
  8. data/app/controllers/dscf/marketplace/request_for_quotations_controller.rb +46 -0
  9. data/app/models/dscf/marketplace/category.rb +9 -0
  10. data/app/models/dscf/marketplace/delivery_order.rb +116 -0
  11. data/app/models/dscf/marketplace/delivery_order_item.rb +201 -0
  12. data/app/models/dscf/marketplace/delivery_vehicle.rb +70 -0
  13. data/app/models/dscf/marketplace/listing.rb +9 -0
  14. data/app/models/dscf/marketplace/order.rb +35 -0
  15. data/app/models/dscf/marketplace/order_item.rb +17 -0
  16. data/app/models/dscf/marketplace/product.rb +9 -0
  17. data/app/models/dscf/marketplace/quotation.rb +9 -0
  18. data/app/models/dscf/marketplace/quotation_item.rb +10 -3
  19. data/app/models/dscf/marketplace/request_for_quotation.rb +9 -0
  20. data/app/models/dscf/marketplace/rfq_item.rb +9 -0
  21. data/app/models/dscf/marketplace/supplier_product.rb +9 -0
  22. data/app/models/dscf/marketplace/unit.rb +9 -0
  23. data/app/models/dscf/marketplace/unit_conversion.rb +9 -0
  24. data/app/serializers/dscf/marketplace/category_serializer.rb +11 -0
  25. data/app/serializers/dscf/marketplace/listing_serializer.rb +13 -0
  26. data/app/serializers/dscf/marketplace/order_serializer.rb +15 -0
  27. data/app/serializers/dscf/marketplace/product_serializer.rb +13 -0
  28. data/app/serializers/dscf/marketplace/quotation_serializer.rb +14 -0
  29. data/app/serializers/dscf/marketplace/request_for_quotation_serializer.rb +13 -0
  30. data/config/locales/en.yml +254 -0
  31. data/config/routes.rb +85 -0
  32. data/db/migrate/20250831110907_create_dscf_marketplace_delivery_orders.rb +21 -0
  33. data/db/migrate/20250831110921_create_dscf_marketplace_delivery_order_items.rb +27 -0
  34. data/db/migrate/20250831110933_create_dscf_marketplace_delivery_vehicles.rb +17 -0
  35. data/db/migrate/20250901074509_add_delivery_handoff_fields_to_delivery_order_items.rb +16 -0
  36. data/db/migrate/20250901074746_add_delivery_order_to_orders.rb +7 -0
  37. data/db/migrate/20250901075511_add_delivery_vehicle_to_delivery_orders.rb +7 -0
  38. data/db/migrate/20250901080134_add_fulfillment_type_to_orders.rb +6 -0
  39. data/lib/dscf/marketplace/version.rb +1 -1
  40. data/spec/factories/dscf/core/addresses.rb +15 -0
  41. data/spec/factories/dscf/marketplace/delivery_order_items.rb +46 -0
  42. data/spec/factories/dscf/marketplace/delivery_orders.rb +14 -0
  43. data/spec/factories/dscf/marketplace/delivery_vehicles.rb +37 -0
  44. data/spec/factories/dscf/marketplace/order_items.rb +1 -1
  45. data/spec/factories/dscf/marketplace/orders.rb +10 -1
  46. metadata +29 -3
  47. data/README.md +0 -28
data/config/routes.rb CHANGED
@@ -1,2 +1,87 @@
1
1
  Dscf::Marketplace::Engine.routes.draw do
2
+ # Core Models
3
+ resources :categories do
4
+ resources :products, only: [ :index ]
5
+ get "subcategories", on: :member
6
+ end
7
+
8
+ resources :products do
9
+ resources :listings, only: [ :index ]
10
+ get "supplier_products", on: :member
11
+ end
12
+
13
+ resources :units do
14
+ resources :unit_conversions, only: [ :index ]
15
+ end
16
+
17
+ resources :unit_conversions
18
+
19
+ # Trading Models
20
+ resources :supplier_products do
21
+ resources :listings, only: [ :index ]
22
+ end
23
+
24
+ resources :listings do
25
+ member do
26
+ post "activate"
27
+ post "pause"
28
+ post "sold_out"
29
+ end
30
+ end
31
+
32
+ # RFQ System
33
+ resources :request_for_quotations do
34
+ resources :rfq_items, only: [ :index, :create ]
35
+ resources :quotations, only: [ :index ]
36
+ member do
37
+ post "send_rfq"
38
+ post "close"
39
+ end
40
+ end
41
+
42
+ resources :rfq_items, only: [ :show, :update, :destroy ]
43
+
44
+ resources :quotations do
45
+ resources :quotation_items, only: [ :index, :create ]
46
+ member do
47
+ post "accept"
48
+ post "reject"
49
+ post "send_quotation"
50
+ end
51
+ end
52
+
53
+ resources :quotation_items, only: [ :show, :update, :destroy ]
54
+
55
+ # Order Management
56
+ resources :orders do
57
+ resources :order_items, only: [ :index ]
58
+ member do
59
+ post "confirm"
60
+ post "cancel"
61
+ post "complete"
62
+ end
63
+ end
64
+
65
+ resources :order_items, only: [ :show, :update ]
66
+
67
+ # Delivery System
68
+ resources :delivery_orders do
69
+ resources :delivery_order_items, only: [ :index ]
70
+ member do
71
+ post "pickup"
72
+ post "start_delivery"
73
+ post "complete_delivery"
74
+ post "mark_failed"
75
+ end
76
+ end
77
+
78
+ resources :delivery_order_items, only: [ :show, :update ] do
79
+ member do
80
+ post "receiver_confirm"
81
+ post "report_issue"
82
+ post "dispute_delivery"
83
+ end
84
+ end
85
+
86
+ resources :delivery_vehicles
2
87
  end
@@ -0,0 +1,21 @@
1
+ class CreateDscfMarketplaceDeliveryOrders < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :dscf_marketplace_delivery_orders do |t|
4
+ t.bigint :driver_id, null: false
5
+ t.bigint :pickup_address_id, null: false
6
+ t.integer :status
7
+ t.text :delivery_notes
8
+ t.datetime :estimated_delivery_time
9
+ t.datetime :actual_delivery_time
10
+ t.decimal :estimated_delivery_price
11
+ t.decimal :actual_delivery_price
12
+ t.json :optimized_route
13
+ t.integer :vehicle_type
14
+
15
+ t.timestamps
16
+ end
17
+
18
+ add_foreign_key :dscf_marketplace_delivery_orders, :dscf_core_users, column: :driver_id
19
+ add_foreign_key :dscf_marketplace_delivery_orders, :dscf_core_addresses, column: :pickup_address_id
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ class CreateDscfMarketplaceDeliveryOrderItems < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :dscf_marketplace_delivery_order_items do |t|
4
+ t.bigint :delivery_order_id, null: false
5
+ t.bigint :order_item_id, null: false
6
+ t.bigint :pickup_address_id, null: false
7
+ t.bigint :dropoff_address_id, null: false
8
+ t.decimal :quantity
9
+ t.integer :status
10
+ t.text :notes
11
+ t.decimal :pickup_verified_quantity
12
+ t.decimal :dropoff_verified_quantity
13
+ t.decimal :damaged_quantity
14
+ t.decimal :missing_quantity
15
+ t.text :pickup_notes
16
+ t.text :dropoff_notes
17
+ t.integer :position
18
+
19
+ t.timestamps
20
+ end
21
+
22
+ add_foreign_key :dscf_marketplace_delivery_order_items, :dscf_marketplace_delivery_orders, column: :delivery_order_id
23
+ add_foreign_key :dscf_marketplace_delivery_order_items, :dscf_marketplace_order_items, column: :order_item_id
24
+ add_foreign_key :dscf_marketplace_delivery_order_items, :dscf_core_addresses, column: :pickup_address_id
25
+ add_foreign_key :dscf_marketplace_delivery_order_items, :dscf_core_addresses, column: :dropoff_address_id
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ class CreateDscfMarketplaceDeliveryVehicles < ActiveRecord::Migration[8.0]
2
+ def change
3
+ create_table :dscf_marketplace_delivery_vehicles do |t|
4
+ t.bigint :driver_id, null: false
5
+ t.string :plate_number
6
+ t.integer :vehicle_type
7
+ t.string :brand
8
+ t.string :model
9
+ t.integer :year
10
+ t.string :color
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ add_foreign_key :dscf_marketplace_delivery_vehicles, :dscf_core_users, column: :driver_id
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ class AddDeliveryHandoffFieldsToDeliveryOrderItems < ActiveRecord::Migration[8.0]
2
+ def change
3
+ # Add new handoff fields
4
+ add_column :dscf_marketplace_delivery_order_items, :receiver_confirmed_at, :datetime
5
+ add_column :dscf_marketplace_delivery_order_items, :receiver_confirmed_by, :integer
6
+ add_column :dscf_marketplace_delivery_order_items, :receiver_notes, :text
7
+ add_column :dscf_marketplace_delivery_order_items, :handoff_checklist_completed, :boolean, default: false
8
+
9
+ # Add indexes for performance
10
+ add_index :dscf_marketplace_delivery_order_items, :receiver_confirmed_by
11
+ add_index :dscf_marketplace_delivery_order_items, :handoff_checklist_completed
12
+
13
+ # Note: Status enum migration handled separately to avoid data loss
14
+ # The status values will be updated in the model after this migration
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ class AddDeliveryOrderToOrders < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :dscf_marketplace_orders, :delivery_order_id, :bigint
4
+ add_foreign_key :dscf_marketplace_orders, :dscf_marketplace_delivery_orders, column: :delivery_order_id
5
+ add_index :dscf_marketplace_orders, :delivery_order_id
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class AddDeliveryVehicleToDeliveryOrders < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :dscf_marketplace_delivery_orders, :delivery_vehicle_id, :bigint
4
+ add_foreign_key :dscf_marketplace_delivery_orders, :dscf_marketplace_delivery_vehicles, column: :delivery_vehicle_id
5
+ add_index :dscf_marketplace_delivery_orders, :delivery_vehicle_id
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ class AddFulfillmentTypeToOrders < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :dscf_marketplace_orders, :fulfillment_type, :integer, default: 0
4
+ add_index :dscf_marketplace_orders, :fulfillment_type
5
+ end
6
+ end
@@ -1,5 +1,5 @@
1
1
  module Dscf
2
2
  module Marketplace
3
- VERSION = "0.1.7".freeze
3
+ VERSION = "0.1.9".freeze
4
4
  end
5
5
  end
@@ -0,0 +1,15 @@
1
+ FactoryBot.define do
2
+ factory :dscf_core_address, class: "Dscf::Core::Address" do
3
+ user
4
+ address_type { 0 } # home
5
+ country { "Ethiopia" }
6
+ city { "Addis Ababa" }
7
+ sub_city { "Bole" }
8
+ woreda { "03" }
9
+ kebele { "07" }
10
+ house_numbers { "123" }
11
+ po_box { "1234" }
12
+ latitude { 9.1450 }
13
+ longitude { 38.7525 }
14
+ end
15
+ end
@@ -0,0 +1,46 @@
1
+ FactoryBot.define do
2
+ factory :dscf_marketplace_delivery_order_item, class: "Dscf::Marketplace::DeliveryOrderItem" do
3
+ association :delivery_order, factory: :dscf_marketplace_delivery_order
4
+ association :order_item, factory: :dscf_marketplace_order_item
5
+ pickup_address { create(:dscf_core_address) }
6
+ dropoff_address { create(:dscf_core_address) }
7
+ quantity { 10.0 }
8
+ status { :pending }
9
+ notes { "Test delivery item" }
10
+ pickup_verified_quantity { nil }
11
+ dropoff_verified_quantity { nil }
12
+ damaged_quantity { nil }
13
+ missing_quantity { nil }
14
+ pickup_notes { nil }
15
+ dropoff_notes { nil }
16
+ position { 1 }
17
+
18
+ trait :picked_up do
19
+ status { :picked_up }
20
+ pickup_verified_quantity { 10.0 }
21
+ end
22
+
23
+ trait :delivered do
24
+ status { :delivered }
25
+ pickup_verified_quantity { 10.0 }
26
+ dropoff_verified_quantity { 10.0 }
27
+ end
28
+
29
+ trait :receiver_confirmed do
30
+ status { :receiver_confirmed }
31
+ pickup_verified_quantity { 10.0 }
32
+ dropoff_verified_quantity { 10.0 }
33
+ receiver_confirmed_at { Time.current }
34
+ receiver_confirmed_by { create(:dscf_core_user).id }
35
+ handoff_checklist_completed { true }
36
+ end
37
+
38
+ trait :with_damage do
39
+ status { :damaged }
40
+ pickup_verified_quantity { 10.0 }
41
+ dropoff_verified_quantity { 8.0 }
42
+ damaged_quantity { 2.0 }
43
+ receiver_notes { "Package damaged during transport" }
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,14 @@
1
+ FactoryBot.define do
2
+ factory :dscf_marketplace_delivery_order, class: "Dscf::Marketplace::DeliveryOrder" do
3
+ association :driver, factory: :dscf_core_user
4
+ association :pickup_address, factory: :dscf_core_address
5
+ status { :assigned }
6
+ delivery_notes { "Test delivery order" }
7
+ estimated_delivery_time { 2.hours.from_now }
8
+ actual_delivery_time { nil }
9
+ estimated_delivery_price { 50.0 }
10
+ actual_delivery_price { nil }
11
+ optimized_route { {} }
12
+ vehicle_type { :motorcycle }
13
+ end
14
+ end
@@ -0,0 +1,37 @@
1
+ FactoryBot.define do
2
+ factory :dscf_marketplace_delivery_vehicle, class: "Dscf::Marketplace::DeliveryVehicle" do
3
+ association :driver, factory: :dscf_core_user
4
+ sequence(:plate_number) { |n| "ABC#{n.to_s.rjust(3, "0")}" }
5
+ vehicle_type { :motorcycle }
6
+ brand { "Honda" }
7
+ model { "CBR" }
8
+ year { 2020 }
9
+ color { "Red" }
10
+
11
+ trait :car do
12
+ vehicle_type { :car }
13
+ brand { "Toyota" }
14
+ model { "Corolla" }
15
+ end
16
+
17
+ trait :van do
18
+ vehicle_type { :van }
19
+ brand { "Ford" }
20
+ model { "Transit" }
21
+ end
22
+
23
+ trait :truck do
24
+ vehicle_type { :truck }
25
+ brand { "Volvo" }
26
+ model { "FH16" }
27
+ end
28
+
29
+ trait :old_vehicle do
30
+ year { 2010 }
31
+ end
32
+
33
+ trait :future_vehicle do
34
+ year { Time.current.year + 2 }
35
+ end
36
+ end
37
+ end
@@ -1,6 +1,6 @@
1
1
  FactoryBot.define do
2
2
  factory :dscf_marketplace_order_item, class: "Dscf::Marketplace::OrderItem" do
3
- # Don't create order by default, let tests specify
3
+ association :order, factory: :dscf_marketplace_order
4
4
  quantity { 5 }
5
5
  unit_price { 10.0 }
6
6
  status { :pending }
@@ -2,8 +2,9 @@ FactoryBot.define do
2
2
  factory :dscf_marketplace_order, class: "Dscf::Marketplace::Order" do
3
3
  order_type { :rfq_based }
4
4
  status { :pending }
5
+ fulfillment_type { :self_pickup }
5
6
  association :user, factory: :dscf_core_user
6
- quotation { nil }
7
+ association :quotation, factory: :dscf_marketplace_quotation
7
8
  listing { nil }
8
9
 
9
10
  trait :rfq_based do
@@ -17,6 +18,14 @@ FactoryBot.define do
17
18
  quotation { nil }
18
19
  end
19
20
 
21
+ trait :self_pickup do
22
+ fulfillment_type { :self_pickup }
23
+ end
24
+
25
+ trait :delivery do
26
+ fulfillment_type { :delivery }
27
+ end
28
+
20
29
  trait :confirmed do
21
30
  status { :confirmed }
22
31
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dscf-marketplace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Asrat
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-08-31 00:00:00.000000000 Z
10
+ date: 2025-09-01 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rails
@@ -415,13 +415,21 @@ extensions: []
415
415
  extra_rdoc_files: []
416
416
  files:
417
417
  - MIT-LICENSE
418
- - README.md
419
418
  - Rakefile
420
419
  - app/controllers/dscf/marketplace/application_controller.rb
420
+ - app/controllers/dscf/marketplace/categories_controller.rb
421
+ - app/controllers/dscf/marketplace/listings_controller.rb
422
+ - app/controllers/dscf/marketplace/orders_controller.rb
423
+ - app/controllers/dscf/marketplace/products_controller.rb
424
+ - app/controllers/dscf/marketplace/quotations_controller.rb
425
+ - app/controllers/dscf/marketplace/request_for_quotations_controller.rb
421
426
  - app/jobs/dscf/marketplace/application_job.rb
422
427
  - app/mailers/dscf/marketplace/application_mailer.rb
423
428
  - app/models/dscf/marketplace/application_record.rb
424
429
  - app/models/dscf/marketplace/category.rb
430
+ - app/models/dscf/marketplace/delivery_order.rb
431
+ - app/models/dscf/marketplace/delivery_order_item.rb
432
+ - app/models/dscf/marketplace/delivery_vehicle.rb
425
433
  - app/models/dscf/marketplace/listing.rb
426
434
  - app/models/dscf/marketplace/order.rb
427
435
  - app/models/dscf/marketplace/order_item.rb
@@ -433,6 +441,13 @@ files:
433
441
  - app/models/dscf/marketplace/supplier_product.rb
434
442
  - app/models/dscf/marketplace/unit.rb
435
443
  - app/models/dscf/marketplace/unit_conversion.rb
444
+ - app/serializers/dscf/marketplace/category_serializer.rb
445
+ - app/serializers/dscf/marketplace/listing_serializer.rb
446
+ - app/serializers/dscf/marketplace/order_serializer.rb
447
+ - app/serializers/dscf/marketplace/product_serializer.rb
448
+ - app/serializers/dscf/marketplace/quotation_serializer.rb
449
+ - app/serializers/dscf/marketplace/request_for_quotation_serializer.rb
450
+ - config/locales/en.yml
436
451
  - config/routes.rb
437
452
  - db/migrate/20250827172043_create_dscf_marketplace_categories.rb
438
453
  - db/migrate/20250827173526_update_dscf_marketplace_categories_indexes.rb
@@ -449,14 +464,25 @@ files:
449
464
  - db/migrate/20250828090500_change_quotation_status_to_integer.rb
450
465
  - db/migrate/20250828115509_create_dscf_marketplace_orders.rb
451
466
  - db/migrate/20250828115525_create_dscf_marketplace_order_items.rb
467
+ - db/migrate/20250831110907_create_dscf_marketplace_delivery_orders.rb
468
+ - db/migrate/20250831110921_create_dscf_marketplace_delivery_order_items.rb
469
+ - db/migrate/20250831110933_create_dscf_marketplace_delivery_vehicles.rb
470
+ - db/migrate/20250901074509_add_delivery_handoff_fields_to_delivery_order_items.rb
471
+ - db/migrate/20250901074746_add_delivery_order_to_orders.rb
472
+ - db/migrate/20250901075511_add_delivery_vehicle_to_delivery_orders.rb
473
+ - db/migrate/20250901080134_add_fulfillment_type_to_orders.rb
452
474
  - lib/dscf/marketplace.rb
453
475
  - lib/dscf/marketplace/engine.rb
454
476
  - lib/dscf/marketplace/version.rb
455
477
  - lib/tasks/dscf/marketplace_tasks.rake
478
+ - spec/factories/dscf/core/addresses.rb
456
479
  - spec/factories/dscf/core/business_types.rb
457
480
  - spec/factories/dscf/core/businesses.rb
458
481
  - spec/factories/dscf/core/users.rb
459
482
  - spec/factories/dscf/marketplace/categories.rb
483
+ - spec/factories/dscf/marketplace/delivery_order_items.rb
484
+ - spec/factories/dscf/marketplace/delivery_orders.rb
485
+ - spec/factories/dscf/marketplace/delivery_vehicles.rb
460
486
  - spec/factories/dscf/marketplace/listings.rb
461
487
  - spec/factories/dscf/marketplace/order_items.rb
462
488
  - spec/factories/dscf/marketplace/orders.rb
data/README.md DELETED
@@ -1,28 +0,0 @@
1
- # Dscf::Marketplace
2
- Short description and motivation.
3
-
4
- ## Usage
5
- How to use my plugin.
6
-
7
- ## Installation
8
- Add this line to your application's Gemfile:
9
-
10
- ```ruby
11
- gem "dscf-marketplace"
12
- ```
13
-
14
- And then execute:
15
- ```bash
16
- $ bundle
17
- ```
18
-
19
- Or install it yourself as:
20
- ```bash
21
- $ gem install dscf-marketplace
22
- ```
23
-
24
- ## Contributing
25
- Contribution directions go here.
26
-
27
- ## License
28
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).