dscf-marketplace 0.2.93 → 0.2.95

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: 40d81c92e7033ba2d583bca456a9fa0114795f713c118e92c1b70d2141c1c3ac
4
- data.tar.gz: e8f5cca804a50156aff124176f482980628a069a3961c295d0480c395607fbc8
3
+ metadata.gz: 0527a6d20223fad43a251608164395ab9f5980898a5842ba450e122f541b5236
4
+ data.tar.gz: 2b66ae4e2d4142eefa0f0f5449f7dcd309b98fe6126d28e515f19533ca40dd21
5
5
  SHA512:
6
- metadata.gz: 75ba3df20836f6e89c20b2a35a01822f132f13fec48c2604807e96ad5b75f675bc6cbf0f72d65acbf40492e4d03d80d8e28532ac1941d6cde80779f4611e208b
7
- data.tar.gz: 1e3620e360ec311517da1ff4955960a301523b0375801b236b9c3f518dc70ddf97daa7bd576068f9955eed2658f72619ffad90cbca02a13dcccf5e62ffa85fbd
6
+ metadata.gz: 3c79b44a67e6e072223a15f9eb89f6f7e305f091840f0e6b43975a79e4b025a92c3f391a6c7f40af84a1e0df2a4fa111be685d0cdb1bd3dd569c90b8cb91ba17
7
+ data.tar.gz: 2c83fbc4dcde1eb655eeffbb153c9f52cb80191fe533b6ec083e6d6c1a6c703a1f475b1a7959feff538408e137a6f22e94219c7be79b4ac009be66fceb4d0607
@@ -3,24 +3,102 @@ module Dscf
3
3
  class DeliveryVehiclesController < ApplicationController
4
4
  include Dscf::Core::Common
5
5
 
6
+ def create
7
+ vehicle = @clazz.new(model_params.except(:vehicle_license, :driver_license))
8
+ if vehicle.save
9
+ # Handle vehicle license upload
10
+ if params[:delivery_vehicle][:vehicle_license].present?
11
+ document = Dscf::Core::Document.new(
12
+ documentable: vehicle,
13
+ document_type: :business_license
14
+ )
15
+ document.file.attach(params[:delivery_vehicle][:vehicle_license])
16
+ document.save!
17
+ end
18
+
19
+ # Handle driver license upload
20
+ if params[:delivery_vehicle][:driver_license].present?
21
+ driver_document = Dscf::Core::Document.new(
22
+ documentable: vehicle.driver,
23
+ document_type: :drivers_license
24
+ )
25
+ driver_document.file.attach(params[:delivery_vehicle][:driver_license])
26
+ driver_document.save!
27
+ end
28
+
29
+ vehicle = @clazz.includes(eager_loaded_associations).find(vehicle.id) if eager_loaded_associations.present?
30
+ includes = serializer_includes_for_action(:create)
31
+ options = {include: includes} if includes.present?
32
+ render_success(data: vehicle, serializer_options: options, status: :created)
33
+ else
34
+ render_error(errors: vehicle.errors.full_messages[0], status: :unprocessable_entity)
35
+ end
36
+ rescue => e
37
+ render_error(error: e.message)
38
+ end
39
+
40
+ def update
41
+ vehicle = @clazz.find(params[:id])
42
+ if vehicle.update(model_params.except(:vehicle_license, :driver_license))
43
+ # Handle vehicle license update/replacement
44
+ if params[:delivery_vehicle][:vehicle_license].present?
45
+ # Remove existing vehicle license if any
46
+ vehicle.documents.where(document_type: :business_license).destroy_all
47
+
48
+ # Add new vehicle license
49
+ document = Dscf::Core::Document.new(
50
+ documentable: vehicle,
51
+ document_type: :business_license
52
+ )
53
+ document.file.attach(params[:delivery_vehicle][:vehicle_license])
54
+ document.save!
55
+ end
56
+
57
+ # Handle driver license update/replacement
58
+ if params[:delivery_vehicle][:driver_license].present?
59
+ # Remove existing driver license if any
60
+ vehicle.driver.documents.where(document_type: :drivers_license).destroy_all
61
+
62
+ # Add new driver license
63
+ driver_document = Dscf::Core::Document.new(
64
+ documentable: vehicle.driver,
65
+ document_type: :drivers_license
66
+ )
67
+ driver_document.file.attach(params[:delivery_vehicle][:driver_license])
68
+ driver_document.save!
69
+ end
70
+
71
+ vehicle = @clazz.includes(eager_loaded_associations).find(vehicle.id) if eager_loaded_associations.present?
72
+ includes = serializer_includes_for_action(:update)
73
+ options = {include: includes} if includes.present?
74
+ render_success(data: vehicle, serializer_options: options)
75
+ else
76
+ render_error(errors: vehicle.errors.full_messages[0], status: :unprocessable_entity)
77
+ end
78
+ rescue => e
79
+ render_error(error: e.message)
80
+ end
81
+
6
82
  private
7
83
 
8
84
  def model_params
9
85
  params.require(:delivery_vehicle).permit(
10
- :driver_id, :plate_number, :vehicle_type, :year, :brand, :model, :color
86
+ :driver_id, :plate_number, :vehicle_type, :year, :brand, :model, :color,
87
+ vehicle_license: :file,
88
+ driver_license: :file
11
89
  )
12
90
  end
13
91
 
14
92
  def eager_loaded_associations
15
- [ :driver, :delivery_orders ]
93
+ [ :driver, :delivery_orders, :documents ]
16
94
  end
17
95
 
18
96
  def default_serializer_includes
19
97
  {
20
- index: [ :driver ],
21
- show: [ :driver, :delivery_orders ],
22
- create: [ :driver ],
23
- update: [ :driver ]
98
+ index: [ :driver, :documents ],
99
+ show: [ :driver, :delivery_orders, :documents ],
100
+ create: [ :driver, :documents ],
101
+ update: [ :driver, :documents ]
24
102
  }
25
103
  end
26
104
  end
@@ -2,7 +2,6 @@ module Dscf
2
2
  module Marketplace
3
3
  class OrdersController < ApplicationController
4
4
  include Dscf::Core::Common
5
- include Dscf::Marketplace::NestedCreatable
6
5
 
7
6
  def confirm
8
7
  @obj = find_record
@@ -63,8 +62,8 @@ module Dscf
63
62
  {
64
63
  index: [ :user, :ordered_by, :ordered_to, :quotation, order_items: [ :product ] ],
65
64
  show: [ :user, :ordered_by, :ordered_to, :quotation, :listing, :delivery_order, :order_items ],
66
- create: [ :user, :ordered_by, :ordered_to, :quotation, :listing ],
67
- update: [ :user, :ordered_by, :ordered_to, :quotation, :listing ]
65
+ create: [ :user, :ordered_by, :ordered_to, :quotation, :listing, :order_items ],
66
+ update: [ :user, :ordered_by, :ordered_to, :quotation, :listing, :order_items ]
68
67
  }
69
68
  end
70
69
  end
@@ -2,7 +2,6 @@ module Dscf
2
2
  module Marketplace
3
3
  class QuotationsController < ApplicationController
4
4
  include Dscf::Core::Common
5
- include Dscf::Marketplace::NestedCreatable
6
5
 
7
6
  def accept
8
7
  @obj = find_record
@@ -2,7 +2,6 @@ module Dscf
2
2
  module Marketplace
3
3
  class RequestForQuotationsController < ApplicationController
4
4
  include Dscf::Core::Common
5
- include Dscf::Marketplace::NestedCreatable
6
5
 
7
6
  def send_rfq
8
7
  @obj = find_record
@@ -5,6 +5,7 @@ module Dscf
5
5
 
6
6
  belongs_to :driver, class_name: "Dscf::Core::User"
7
7
  has_many :delivery_orders, dependent: :nullify
8
+ has_many :documents, as: :documentable, class_name: "Dscf::Core::Document"
8
9
 
9
10
  validates :driver_id, presence: true
10
11
  validates :plate_number, presence: true, uniqueness: true
@@ -20,7 +21,7 @@ module Dscf
20
21
  end
21
22
 
22
23
  def self.ransackable_associations(_auth_object = nil)
23
- %w[driver delivery_orders]
24
+ %w[driver delivery_orders documents]
24
25
  end
25
26
 
26
27
  def motorcycle?
@@ -65,6 +66,14 @@ module Dscf
65
66
  return 0 if total_deliveries.zero?
66
67
  (completed_deliveries.count.to_f / total_deliveries * 100).round(2)
67
68
  end
69
+
70
+ def vehicle_license
71
+ documents.find_by(document_type: :business_license)
72
+ end
73
+
74
+ def driver_license
75
+ driver.documents.find_by(document_type: :drivers_license)
76
+ end
68
77
  end
69
78
  end
70
79
  end
@@ -10,7 +10,7 @@ module Dscf::Marketplace
10
10
  belongs_to :ordered_by, class_name: "Dscf::Core::User"
11
11
  belongs_to :ordered_to, class_name: "Dscf::Core::Business"
12
12
  belongs_to :delivery_order, optional: true
13
- has_many :order_items, dependent: :destroy
13
+ has_many :order_items, dependent: :destroy, inverse_of: :order
14
14
  accepts_nested_attributes_for :order_items, allow_destroy: true
15
15
 
16
16
  validates :order_type, presence: true
@@ -4,7 +4,7 @@ module Dscf::Marketplace
4
4
 
5
5
  delegate :name, :description, :thumbnail_url, :images_urls, to: :product, allow_nil: true
6
6
 
7
- belongs_to :order, optional: true
7
+ belongs_to :order, optional: true, inverse_of: :order_items
8
8
  belongs_to :quotation_item, optional: true
9
9
  belongs_to :listing, optional: true
10
10
  belongs_to :product
@@ -4,7 +4,7 @@ module Dscf
4
4
  belongs_to :request_for_quotation, class_name: "Dscf::Marketplace::RequestForQuotation"
5
5
  belongs_to :business, class_name: "Dscf::Core::Business", optional: true if defined?(Dscf::Core)
6
6
 
7
- has_many :quotation_items, class_name: "Dscf::Marketplace::QuotationItem", dependent: :destroy
7
+ has_many :quotation_items, class_name: "Dscf::Marketplace::QuotationItem", dependent: :destroy, inverse_of: :quotation
8
8
  has_one :order, class_name: "Dscf::Marketplace::Order", dependent: :destroy
9
9
  accepts_nested_attributes_for :quotation_items, allow_destroy: true
10
10
 
@@ -1,7 +1,7 @@
1
1
  module Dscf
2
2
  module Marketplace
3
3
  class QuotationItem < ApplicationRecord
4
- belongs_to :quotation, class_name: "Dscf::Marketplace::Quotation"
4
+ belongs_to :quotation, class_name: "Dscf::Marketplace::Quotation", inverse_of: :quotation_items
5
5
  belongs_to :rfq_item, class_name: "Dscf::Marketplace::RfqItem"
6
6
  belongs_to :product, class_name: "Dscf::Marketplace::Product"
7
7
  belongs_to :unit, class_name: "Dscf::Marketplace::Unit"
@@ -4,7 +4,7 @@ module Dscf
4
4
  belongs_to :user, class_name: "Dscf::Core::User", optional: true if defined?(Dscf::Core)
5
5
  belongs_to :selected_quotation, class_name: "Dscf::Marketplace::Quotation", optional: true
6
6
 
7
- has_many :rfq_items, class_name: "Dscf::Marketplace::RfqItem", dependent: :destroy
7
+ has_many :rfq_items, class_name: "Dscf::Marketplace::RfqItem", dependent: :destroy, inverse_of: :request_for_quotation
8
8
  has_many :quotations, class_name: "Dscf::Marketplace::Quotation", dependent: :destroy
9
9
  accepts_nested_attributes_for :rfq_items, allow_destroy: true
10
10
 
@@ -1,7 +1,7 @@
1
1
  module Dscf
2
2
  module Marketplace
3
3
  class RfqItem < ApplicationRecord
4
- belongs_to :request_for_quotation, class_name: "Dscf::Marketplace::RequestForQuotation"
4
+ belongs_to :request_for_quotation, class_name: "Dscf::Marketplace::RequestForQuotation", inverse_of: :rfq_items
5
5
  belongs_to :product, class_name: "Dscf::Marketplace::Product"
6
6
  belongs_to :unit, class_name: "Dscf::Marketplace::Unit"
7
7
 
@@ -7,6 +7,7 @@ module Dscf
7
7
 
8
8
  belongs_to :driver
9
9
  has_many :delivery_orders
10
+ has_many :documents
10
11
  end
11
12
  end
12
13
  end
@@ -1,5 +1,5 @@
1
1
  module Dscf
2
2
  module Marketplace
3
- VERSION = "0.2.93".freeze
3
+ VERSION = "0.2.95".freeze
4
4
  end
5
5
  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.2.93
4
+ version: 0.2.95
5
5
  platform: ruby
6
6
  authors:
7
7
  - Asrat
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-09-11 00:00:00.000000000 Z
10
+ date: 2025-09-12 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rails
@@ -416,7 +416,6 @@ extra_rdoc_files: []
416
416
  files:
417
417
  - MIT-LICENSE
418
418
  - Rakefile
419
- - app/controllers/concerns/dscf/marketplace/nested_creatable.rb
420
419
  - app/controllers/dscf/marketplace/application_controller.rb
421
420
  - app/controllers/dscf/marketplace/businesses_controller.rb
422
421
  - app/controllers/dscf/marketplace/categories_controller.rb
@@ -1,47 +0,0 @@
1
- module Dscf::Marketplace::NestedCreatable
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- # Override the create method from Dscf::Core::Common
6
- def create
7
- obj = @clazz.new(model_params)
8
- assign_current_user(obj) if respond_to?(:assign_current_user)
9
-
10
- if obj.save
11
- obj = @clazz.includes(eager_loaded_associations).find(obj.id) if eager_loaded_associations.present?
12
-
13
- includes = serializer_includes_for_action(:create)
14
- options = {include: includes} if includes.present?
15
-
16
- # Get success message from locales
17
- model_name = @clazz.name.demodulize.underscore
18
- message_key = "#{model_name}.success.create"
19
- message = I18n.t(message_key, default: "#{model_name.titleize} created successfully")
20
-
21
- # Include associated items in response for orders
22
- if model_name == "order" && obj.respond_to?(:order_items)
23
- render_success(message, data: obj, order_items: obj.order_items, serializer_options: options, status: :created)
24
- else
25
- render_success(message, data: obj, serializer_options: options, status: :created)
26
- end
27
- else
28
- Rails.logger.error("#{model_name} save failed: #{obj.errors.full_messages}")
29
-
30
- # Get error message from locales
31
- error_key = "#{model_name}.errors.create"
32
- error_message = I18n.t(error_key, default: "Failed to create #{model_name}")
33
-
34
- render_error(error_message, status: :unprocessable_entity)
35
- end
36
- rescue => e
37
- render_error(e.message)
38
- end
39
- end
40
-
41
- private
42
-
43
- def assign_current_user(obj)
44
- obj.user = current_user if obj.respond_to?(:user=)
45
- obj.ordered_by = current_user if obj.respond_to?(:ordered_by=)
46
- end
47
- end