dscf-marketplace 0.7.5 → 0.7.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: e66e6a4fac1c4edcfd47fee2305ae1f1003e0f5b67d1de4ed92437efab52c51d
4
- data.tar.gz: 938e70e67ec267163bdb2414da889a90ecb5d46c4c72c016af6b26bac160a4cb
3
+ metadata.gz: 4beaf427e69fdbc843de062d0083c55ece3d751cca2adab8cf989c20de633886
4
+ data.tar.gz: 8479a97308423b04afa67d95c2cc3fde8096b01a6b24ec1c9f3519e0dfe0d35f
5
5
  SHA512:
6
- metadata.gz: 74555ff90a3951e9ba75d3fc451da200458a4b15c6eb4cd227f48dee569fe14e70174c292e7e7f1454200a6765431f3b3e66cd2862e4885dc474e0a1eddfc6eb
7
- data.tar.gz: 999a3fa20ea0ee8db77b9d39c48efcffb9f5f9d19c73d1fd7555c7a9b0b9a77c9cf76ee363564e5acfabf1ed3cfbfe5b84f6bda1525fdb018903429495f3a21f
6
+ metadata.gz: 98399d8626f0fdd09979f7be48bc34f36126d3c07ad268d57338b1de4a9575ece83a8eabf13e279dcb0ea1824dd68317c211025ff6c3eb57ebf07121d3ec261a
7
+ data.tar.gz: b9e8eec981a2c12e01a06dac62e7d22d98c170d4c08760486321e6acbd61601e2380a9bf33cd1cf5fd5806f545543fdeb527795521e4c908c5eb6f394930a670
@@ -5,6 +5,7 @@ module Dscf
5
5
 
6
6
  def create
7
7
  authorize @clazz.new, :create?
8
+ return render_unsupported_payment_method if unsupported_payment_method_for_new_order?(model_params[:payment_method])
8
9
 
9
10
  return create_direct_listing_order if direct_listing_request?
10
11
 
@@ -134,7 +135,7 @@ module Dscf
134
135
  options = {include: includes} if includes.present?
135
136
  render_success(data: order, serializer_options: options, status: :created)
136
137
  rescue ActiveRecord::RecordInvalid => e
137
- errors = e.record&.errors&.full_messages&.presence || [e.message]
138
+ errors = e.record&.errors&.full_messages&.presence || [ e.message ]
138
139
  render_error(errors: errors.join(", "), status: :unprocessable_entity)
139
140
  rescue => e
140
141
  render_error(error: e.message)
@@ -150,11 +151,13 @@ module Dscf
150
151
  end
151
152
 
152
153
  def model_params
153
- params.require(:order).permit(
154
+ @model_params ||= params.require(:order).permit(
154
155
  :quotation_id, :listing_id, :user_id, :ordered_by_id, :ordered_to_id, :delivery_order_id, :dropoff_address_id,
155
- :order_type, :status, :fulfillment_type, :payment_method,
156
+ :order_type, :status, :fulfillment_type, :payment_method, :received_bank_name, :transaction_reference,
156
157
  order_items_attributes: [ :id, :quotation_item_id, :listing_id, :product_id, :unit_id, :quantity, :unit_price, :status, :_destroy ]
157
158
  )
159
+ @model_params[:payment_method] = normalize_payment_method(@model_params[:payment_method]) if @model_params.key?(:payment_method)
160
+ @model_params
158
161
  end
159
162
 
160
163
  def eager_loaded_associations
@@ -173,6 +176,27 @@ module Dscf
173
176
  def find_record
174
177
  Dscf::Marketplace::Order.find(params[:id])
175
178
  end
179
+
180
+ def normalize_payment_method(value)
181
+ case value.to_s
182
+ when "", "0", "cash"
183
+ "cash"
184
+ when "1", "credit"
185
+ "credit"
186
+ when "2", "transfer", "bank transfer", "bank_transfer"
187
+ "bank_transfer"
188
+ else
189
+ value
190
+ end
191
+ end
192
+
193
+ def unsupported_payment_method_for_new_order?(payment_method)
194
+ payment_method.present? && payment_method == "credit"
195
+ end
196
+
197
+ def render_unsupported_payment_method
198
+ render_error(errors: "Credit is no longer supported for new marketplace orders", status: :unprocessable_entity)
199
+ end
176
200
  end
177
201
  end
178
202
  end
@@ -29,6 +29,7 @@ module Dscf
29
29
 
30
30
  fulfillment_type = params[:fulfillment_type]
31
31
  dropoff_address_id = params[:dropoff_address_id]
32
+ payment_method = normalize_payment_method(params[:payment_method]).presence || "cash"
32
33
 
33
34
  # Validate fulfillment_type
34
35
  unless fulfillment_type.present? && Dscf::Marketplace::Order.fulfillment_types.keys.include?(fulfillment_type)
@@ -50,7 +51,12 @@ module Dscf
50
51
  return
51
52
  end
52
53
 
53
- if @obj.accept!(fulfillment_type: fulfillment_type, dropoff_address: dropoff_address)
54
+ unless %w[cash bank_transfer].include?(payment_method)
55
+ render_error(errors: "Credit is no longer supported for new marketplace orders", status: :unprocessable_entity)
56
+ return
57
+ end
58
+
59
+ if @obj.accept!(fulfillment_type: fulfillment_type, dropoff_address: dropoff_address, payment_method: payment_method)
54
60
  render_success("quotations.success.accepted", data: @obj)
55
61
  else
56
62
  render_error("quotations.errors.accept_failed")
@@ -116,6 +122,19 @@ module Dscf
116
122
  update: [ :request_for_quotation, :business ]
117
123
  }
118
124
  end
125
+
126
+ def normalize_payment_method(value)
127
+ case value.to_s
128
+ when "", "0", "cash"
129
+ "cash"
130
+ when "1", "credit"
131
+ "credit"
132
+ when "2", "transfer", "bank transfer", "bank_transfer"
133
+ "bank_transfer"
134
+ else
135
+ value
136
+ end
137
+ end
119
138
  end
120
139
  end
121
140
  end
@@ -3,7 +3,7 @@ module Dscf::Marketplace
3
3
  enum :order_type, {rfq_based: 0, direct_listing: 1}
4
4
  enum :status, {pending: 0, confirmed: 1, processing: 2, completed: 3, cancelled: 4}
5
5
  enum :fulfillment_type, {self_pickup: 0, delivery: 1}
6
- enum :payment_method, {cash: 0, credit: 1, transfer: 2}, default: :cash
6
+ enum :payment_method, {cash: 0, credit: 1, bank_transfer: 2}, default: :cash
7
7
 
8
8
  belongs_to :quotation, optional: true
9
9
  belongs_to :listing, optional: true
@@ -23,13 +23,17 @@ module Dscf::Marketplace
23
23
  validates :ordered_by, presence: true
24
24
  validates :ordered_to, presence: true
25
25
  validates :dropoff_address, presence: true, if: :delivery?
26
+ validates :received_bank_name, :transaction_reference, absence: true, if: :cash?
26
27
  validate :quotation_or_listing_present
28
+ validate :credit_payment_method_disabled, if: :will_save_change_to_payment_method?
29
+ validate :bank_transfer_reference_required_for_completed_orders
27
30
 
31
+ before_validation :clear_payment_references_for_cash
28
32
  before_save :calculate_total_amount
29
33
 
30
34
  # Ransack configuration for secure filtering
31
35
  def self.ransackable_attributes(_auth_object = nil)
32
- %w[id quotation_id listing_id user_id ordered_by_id ordered_to_id delivery_order_id dropoff_address_id order_type status fulfillment_type payment_method total_amount created_at updated_at]
36
+ %w[id quotation_id listing_id user_id ordered_by_id ordered_to_id delivery_order_id dropoff_address_id order_type status fulfillment_type payment_method received_bank_name transaction_reference total_amount created_at updated_at]
33
37
  end
34
38
 
35
39
  def self.ransackable_associations(_auth_object = nil)
@@ -152,12 +156,32 @@ module Dscf::Marketplace
152
156
  self.total_amount = order_items.sum { |item| item.quantity * item.unit_price }
153
157
  end
154
158
 
155
- private
159
+ private
156
160
 
157
161
  def quotation_or_listing_present
158
162
  unless quotation.present? || listing.present?
159
163
  errors.add(:base, "Either quotation or listing must be present")
160
164
  end
161
165
  end
166
+
167
+ def credit_payment_method_disabled
168
+ return unless credit?
169
+
170
+ errors.add(:payment_method, "is no longer supported for new marketplace orders")
171
+ end
172
+
173
+ def bank_transfer_reference_required_for_completed_orders
174
+ return unless completed? && bank_transfer?
175
+
176
+ errors.add(:received_bank_name, "can't be blank") if received_bank_name.blank?
177
+ errors.add(:transaction_reference, "can't be blank") if transaction_reference.blank?
178
+ end
179
+
180
+ def clear_payment_references_for_cash
181
+ return unless cash?
182
+
183
+ self.received_bank_name = nil
184
+ self.transaction_reference = nil
185
+ end
162
186
  end
163
187
  end
@@ -122,11 +122,13 @@ module Dscf
122
122
 
123
123
  fulfillment_type = options[:fulfillment_type] || "self_pickup"
124
124
  dropoff_address = options[:dropoff_address]
125
+ payment_method = options[:payment_method].presence || :cash
125
126
 
126
127
  order = Dscf::Marketplace::Order.create!(
127
128
  order_type: :rfq_based,
128
129
  status: :processing,
129
130
  fulfillment_type: fulfillment_type,
131
+ payment_method: payment_method,
130
132
  quotation: self,
131
133
  user: request_for_quotation.user, # Keep for backward compatibility
132
134
  ordered_by: request_for_quotation.user,
@@ -2,7 +2,7 @@ module Dscf
2
2
  module Marketplace
3
3
  class OrderSerializer < ActiveModel::Serializer
4
4
  attributes :id, :quotation_id, :listing_id, :user_id, :ordered_by_id, :ordered_to_id, :delivery_order_id, :dropoff_address_id,
5
- :order_type, :status, :fulfillment_type, :payment_method, :total_amount,
5
+ :order_type, :status, :fulfillment_type, :payment_method, :received_bank_name, :transaction_reference, :total_amount,
6
6
  :buyer_phone, :buyer_email, :seller_name, :seller_phone, :seller_email,
7
7
  :created_at, :updated_at
8
8
 
@@ -423,4 +423,4 @@ en:
423
423
  url: "is not a valid URL"
424
424
  email: "is not a valid email"
425
425
  format: "is invalid"
426
- required: "can't be blank"
426
+ required: "can't be blank"
@@ -0,0 +1,6 @@
1
+ class AddPaymentReferencesToDscfMarketplaceOrders < ActiveRecord::Migration[8.0]
2
+ def change
3
+ add_column :dscf_marketplace_orders, :received_bank_name, :string
4
+ add_column :dscf_marketplace_orders, :transaction_reference, :string
5
+ end
6
+ end
@@ -1,5 +1,5 @@
1
1
  module Dscf
2
2
  module Marketplace
3
- VERSION = "0.7.5".freeze
3
+ VERSION = "0.7.6".freeze
4
4
  end
5
5
  end
@@ -37,6 +37,10 @@ FactoryBot.define do
37
37
  association :dropoff_address, factory: :dscf_core_address
38
38
  end
39
39
 
40
+ trait :bank_transfer do
41
+ payment_method { :bank_transfer }
42
+ end
43
+
40
44
  trait :confirmed do
41
45
  status { :confirmed }
42
46
  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.7.5
4
+ version: 0.7.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Asrat
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-05-02 00:00:00.000000000 Z
10
+ date: 2026-05-06 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rails
@@ -533,6 +533,7 @@ files:
533
533
  - db/migrate/20260310120000_add_active_and_description_to_dscf_core_roles.rb
534
534
  - db/migrate/20260310122000_add_missing_fields_to_dscf_core_user_roles.rb
535
535
  - db/migrate/20260501000002_add_supplier_contact_fields_to_supplier_products.rb
536
+ - db/migrate/20260506100000_add_payment_references_to_dscf_marketplace_orders.rb
536
537
  - db/seeds.rb
537
538
  - lib/dscf/marketplace.rb
538
539
  - lib/dscf/marketplace/engine.rb