dscf-marketplace 0.7.1 → 0.7.3

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: e53b77975600245983fafdc3d139b165d94b2b9e7c2315889098f01ca846aed4
4
- data.tar.gz: 6ccd1cd60dba72d0183f0643f2acab90c338c8302ba41dc1ab5034d10d786626
3
+ metadata.gz: 42792144bb56d00c7a6767aa3f8e2b4a0704fbbd815de3647bb942a764b34bb7
4
+ data.tar.gz: cb649cc916dedf3729a38b12e08714242647f34fd98971741decc3344fe8a776
5
5
  SHA512:
6
- metadata.gz: '09b86cef7aa49c287b7b0cb02abb7b87ec24b6f5a6ed8cc84f9ea2d2ac78f422d1ec031edad76f2a75b95d99ef42b995a45b2b5f5fa95c1cb3aa7ceda1e5f743'
7
- data.tar.gz: 5cbdd78cb9b6a7d32e362163b85a33c6f92854a2ff0775d90446e8bc1763eddd2f23ffa463a2d1f2b820b4837339fab20267023efddb953c97e8149eb544376e
6
+ metadata.gz: 8ed6fa17b79144e124102e838d34322d4b1735a77f2c9b9015c55f939669c6a6f16d059550394464e66402ceb9002ae33e8213c8da7af84e084c0dc15b9e9d83
7
+ data.tar.gz: babc3f0ccf9eef0f5be066fa59b0e77046ba03dae121c243ea8a946b3e49c3bfdea146c944486fe5bb1994d08a8e72e88cdcd8d362c2da4e802ba866c6db018c
@@ -0,0 +1,44 @@
1
+ module Dscf
2
+ module Marketplace
3
+ module DemoPermissionBypass
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_action :demo_bypass_permissions!
8
+ end
9
+
10
+ def bypass_permissions_for_demo?
11
+ true
12
+ end
13
+
14
+ def pundit_user
15
+ user = current_user
16
+ return nil unless user
17
+
18
+ bypass_permissions_on_user!(user)
19
+ end
20
+
21
+ def authorize_review_action!
22
+ skip_authorization if respond_to?(:skip_authorization, true)
23
+ end
24
+
25
+ private
26
+
27
+ def demo_bypass_permissions!
28
+ skip_authorization if respond_to?(:skip_authorization, true)
29
+ skip_policy_scope if respond_to?(:skip_policy_scope, true)
30
+ end
31
+
32
+ def bypass_permissions_on_user!(user)
33
+ return user if user.instance_variable_defined?(:@_banking_demo_permission_bypass)
34
+
35
+ user.define_singleton_method(:has_permission?) { |_permission_code| true }
36
+ user.define_singleton_method(:can?) { |permission_code| has_permission?(permission_code) }
37
+ user.define_singleton_method(:super_admin?) { true }
38
+ user.instance_variable_set(:@_banking_demo_permission_bypass, true)
39
+
40
+ user
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,6 +1,42 @@
1
1
  module Dscf
2
2
  module Marketplace
3
- class ApplicationController < Dscf::Core::ApplicationController
3
+ class ApplicationController < ActionController::API
4
+ include Dscf::Core::Authenticatable
5
+ include Dscf::Core::JsonResponse
6
+ before_action :authenticate_user
7
+ before_action :demo_bypass_permissions!
8
+
9
+ # TEMPORARY DEMO BYPASS:
10
+ # Bypass marketplace authorization checks for authenticated users only.
11
+ # Remove after the demo.
12
+ def bypass_permissions_for_demo?
13
+ true
14
+ end
15
+
16
+ def pundit_user
17
+ user = current_user
18
+ return nil unless user
19
+
20
+ bypass_permissions_on_user!(user)
21
+ end
22
+
23
+ private
24
+
25
+ def demo_bypass_permissions!
26
+ skip_authorization if respond_to?(:skip_authorization, true)
27
+ skip_policy_scope if respond_to?(:skip_policy_scope, true)
28
+ end
29
+
30
+ def bypass_permissions_on_user!(user)
31
+ return user if user.instance_variable_defined?(:@_banking_demo_permission_bypass)
32
+
33
+ user.define_singleton_method(:has_permission?) { |_permission_code| true }
34
+ user.define_singleton_method(:can?) { |permission_code| has_permission?(permission_code) }
35
+ user.define_singleton_method(:super_admin?) { true }
36
+ user.instance_variable_set(:@_banking_demo_permission_bypass, true)
37
+
38
+ user
39
+ end
4
40
  end
5
41
  end
6
42
  end
@@ -3,6 +3,24 @@ module Dscf
3
3
  class OrdersController < ApplicationController
4
4
  include Dscf::Core::Common
5
5
 
6
+ def create
7
+ authorize @clazz.new, :create?
8
+
9
+ return create_direct_listing_order if direct_listing_request?
10
+
11
+ obj = @clazz.new(model_params)
12
+ if obj.save
13
+ obj = @clazz.includes(eager_loaded_associations).find(obj.id) if eager_loaded_associations.present?
14
+ includes = default_serializer_includes[:create] || []
15
+ options = {include: includes} if includes.present?
16
+ render_success(data: obj, serializer_options: options, status: :created)
17
+ else
18
+ render_error(errors: obj.errors.full_messages.join(", "), status: :unprocessable_entity)
19
+ end
20
+ rescue => e
21
+ render_error(error: e.message)
22
+ end
23
+
6
24
  def filter
7
25
  authorize @clazz.new, :filter?
8
26
  orders = @clazz.all
@@ -48,7 +66,7 @@ module Dscf
48
66
  @obj = find_record
49
67
  authorize @obj, :complete?
50
68
  if @obj.can_be_completed? && @obj.update(status: :completed)
51
- @obj.order_items.update_all(status: OrderItem.statuses[:completed])
69
+ @obj.order_items.update_all(status: OrderItem.statuses[:fulfilled])
52
70
  render_success("orders.success.completed", data: @obj)
53
71
  else
54
72
  render_error("orders.errors.complete_failed")
@@ -70,6 +88,67 @@ module Dscf
70
88
 
71
89
  private
72
90
 
91
+ def create_direct_listing_order
92
+ listing = Dscf::Marketplace::Listing.active.find_by(id: model_params[:listing_id])
93
+ return render_error(errors: "Listing is not available", status: :unprocessable_entity) unless listing
94
+
95
+ quantity = direct_listing_quantity
96
+ return render_error(errors: "Quantity must be greater than 0", status: :unprocessable_entity) unless quantity.positive?
97
+
98
+ if quantity > listing.quantity
99
+ return render_error(errors: "Requested quantity exceeds available listing quantity", status: :unprocessable_entity)
100
+ end
101
+
102
+ order = nil
103
+ ActiveRecord::Base.transaction do
104
+ listing.lock!
105
+
106
+ if quantity > listing.quantity
107
+ listing.errors.add(:base, "Requested quantity exceeds available listing quantity")
108
+ raise ActiveRecord::RecordInvalid.new(listing)
109
+ end
110
+
111
+ order = @clazz.new(model_params.except(:order_items_attributes))
112
+ order.order_type = :direct_listing
113
+ order.status = :pending
114
+ order.listing = listing
115
+ order.ordered_to = listing.business
116
+
117
+ product = listing.supplier_product.product
118
+ order.order_items.build(
119
+ listing: listing,
120
+ product: product,
121
+ unit: product.unit,
122
+ quantity: quantity,
123
+ unit_price: listing.price,
124
+ status: :pending
125
+ )
126
+ order.save!
127
+
128
+ new_quantity = listing.quantity - quantity
129
+ listing.update!(quantity: new_quantity, status: (new_quantity.zero? ? :sold_out : listing.status))
130
+ end
131
+
132
+ order = @clazz.includes(eager_loaded_associations).find(order.id) if eager_loaded_associations.present?
133
+ includes = default_serializer_includes[:create] || []
134
+ options = {include: includes} if includes.present?
135
+ render_success(data: order, serializer_options: options, status: :created)
136
+ rescue ActiveRecord::RecordInvalid => e
137
+ errors = e.record&.errors&.full_messages&.presence || [e.message]
138
+ render_error(errors: errors.join(", "), status: :unprocessable_entity)
139
+ rescue => e
140
+ render_error(error: e.message)
141
+ end
142
+
143
+ def direct_listing_request?
144
+ %w[direct_listing 1].include?(model_params[:order_type].to_s)
145
+ end
146
+
147
+ def direct_listing_quantity
148
+ item = model_params[:order_items_attributes]&.first
149
+ (item&.[](:quantity) || item&.[]("quantity")).to_i
150
+ end
151
+
73
152
  def model_params
74
153
  params.require(:order).permit(
75
154
  :quotation_id, :listing_id, :user_id, :ordered_by_id, :ordered_to_id, :delivery_order_id, :dropoff_address_id,
data/db/seeds.rb CHANGED
@@ -1,343 +1,38 @@
1
- puts "🚀 Starting demo seed..."
2
- begin
3
- puts "🧹 Clearing existing demo data..."
4
- Dscf::Marketplace::DeliveryOrderItem.delete_all
5
- Dscf::Marketplace::DeliveryOrder.delete_all
6
- Dscf::Marketplace::OrderItem.delete_all
7
- Dscf::Marketplace::Order.delete_all
8
- Dscf::Marketplace::QuotationItem.delete_all
9
- Dscf::Marketplace::Quotation.delete_all
10
- Dscf::Marketplace::RfqItem.delete_all
11
- Dscf::Marketplace::RequestForQuotation.delete_all
12
- Dscf::Marketplace::Listing.delete_all
13
- Dscf::Marketplace::SupplierProduct.delete_all
14
- Dscf::Marketplace::Product.delete_all
15
- Dscf::Core::Business.delete_all
16
- Dscf::Core::User.where.not(email: "admin@example.com").delete_all
17
- Dscf::Core::Address.delete_all
18
-
19
- puts "🌱 Creating base units and categories..."
20
-
21
- # Units
22
- kg = Dscf::Marketplace::Unit.create!(name: "Kilogram", code: "kg", unit_type: :weight)
23
- Dscf::Marketplace::Unit.create!(name: "Piece", code: "pc", unit_type: :quantity)
24
- liter = Dscf::Marketplace::Unit.create!(name: "Liter", code: "L", unit_type: :volume)
25
-
26
- # Categories
27
- fruits_veg = Dscf::Marketplace::Category.create!(name: "Fruits & Vegetables")
28
- dairy = Dscf::Marketplace::Category.create!(name: "Dairy Products")
29
- Dscf::Marketplace::Category.create!(name: "Grains & Cereals")
30
- Dscf::Marketplace::Category.create!(name: "Beverages")
31
-
32
- puts "✅ Created #{Dscf::Marketplace::Unit.count} units and #{Dscf::Marketplace::Category.count} categories"
33
-
34
- puts "👥 Creating users and personas..."
35
-
36
- # Business Types
37
- wholesale_type = Dscf::Core::BusinessType.find_or_create_by!(name: "Wholesale Distributor")
38
- retail_type = Dscf::Core::BusinessType.find_or_create_by!(name: "Retail Store")
39
-
40
- # Consumers
41
- consumer1 = Dscf::Core::User.create!(
42
- email: "abebe.consumer@example.com",
43
- phone: "+251911123456"
44
- )
45
- consumer2 = Dscf::Core::User.create!(
46
- email: "tigist.consumer@example.com",
47
- phone: "+251922334567"
48
- )
49
-
50
- # Drivers
51
- driver1 = Dscf::Core::User.create!(
52
- email: "driver.ahmed@example.com",
53
- phone: "+251933445678"
54
- )
55
- Dscf::Core::User.create!(
56
- email: "driver.mariam@example.com",
57
- phone: "+251944556789"
58
- )
59
-
60
- puts "✅ Created #{Dscf::Core::User.count} users (#{Dscf::Core::User.where("email LIKE ?", "%consumer%").count} consumers, #{Dscf::Core::User.where("email LIKE ?", "%driver%").count} drivers)"
61
-
62
- puts "🏢 Creating businesses and linking to users..."
63
-
64
- # Wholesalers
65
- wholesale_user1 = Dscf::Core::User.create!(
66
- email: "wholesale.addis@example.com",
67
- phone: "+251955667890"
68
- )
69
- wholesaler1 = Dscf::Core::Business.create!(
70
- name: "Addis Wholesale Distributors",
71
- contact_email: "contact@addiswholesale.et",
72
- contact_phone: "+251966778901",
73
- tin_number: "1234567890",
74
- business_type: wholesale_type,
75
- user: wholesale_user1
76
- )
77
-
78
- wholesale_user2 = Dscf::Core::User.create!(
79
- email: "wholesale.ethio@example.com",
80
- phone: "+251977889012"
81
- )
82
- wholesaler2 = Dscf::Core::Business.create!(
83
- name: "Ethio Agricultural Wholesale",
84
- contact_email: "info@ethiowholesale.et",
85
- contact_phone: "+251988990123",
86
- tin_number: "0987654321",
87
- business_type: wholesale_type,
88
- user: wholesale_user2
89
- )
90
-
91
- # Retailers
92
- retail_user1 = Dscf::Core::User.create!(
93
- email: "retail.meklit@example.com",
94
- phone: "+251999001234"
95
- )
96
- Dscf::Core::Business.create!(
97
- name: "Meklit Fresh Market",
98
- contact_email: "meklit@freshmarket.et",
99
- contact_phone: "+251910112345",
100
- tin_number: "1122334455",
101
- business_type: retail_type,
102
- user: retail_user1
103
- )
104
-
105
- retail_user2 = Dscf::Core::User.create!(
106
- email: "retail.bole@example.com",
107
- phone: "+251921223456"
108
- )
109
- Dscf::Core::Business.create!(
110
- name: "Bole Modern Supermarket",
111
- contact_email: "info@bolesuper.et",
112
- contact_phone: "+251932334567",
113
- tin_number: "5566778899",
114
- business_type: retail_type,
115
- user: retail_user2
116
- )
117
-
118
- puts "✅ Created #{Dscf::Core::Business.count} businesses (#{Dscf::Core::Business.joins(:user).where("dscf_core_users.email LIKE ?", "%wholesale%").count} wholesalers, #{Dscf::Core::Business.joins(:user).where("dscf_core_users.email LIKE ?", "%retail%").count} retailers)"
119
-
120
- puts "📦 Creating products and supplier listings..."
121
-
122
- # Products from wholesalers
123
- banana_product = wholesaler1.supplier_products.create!(
124
- product: Dscf::Marketplace::Product.create!(
125
- name: "Fresh Bananas",
126
- category: fruits_veg,
127
- unit: kg
128
- )
129
- )
130
- banana_listing = Dscf::Marketplace::Listing.create!(
131
- supplier_product: banana_product,
132
- price: 25.00,
133
- quantity: 1000,
134
- status: :active
135
- )
136
-
137
- milk_product = wholesaler2.supplier_products.create!(
138
- product: Dscf::Marketplace::Product.create!(
139
- name: "Fresh Cow Milk",
140
- category: dairy,
141
- unit: liter
142
- )
143
- )
144
- milk_listing = Dscf::Marketplace::Listing.create!(
145
- supplier_product: milk_product,
146
- price: 45.00,
147
- quantity: 500,
148
- status: :active
149
- )
150
-
151
- puts "✅ Created #{Dscf::Marketplace::Product.count} products and #{Dscf::Marketplace::Listing.count} active listings"
152
-
153
- puts "📋 Creating RFQs and quotations..."
154
-
155
- # RFQ from retailer to wholesalers
156
- rfq = Dscf::Marketplace::RequestForQuotation.create!(
157
- user: retail_user1,
158
- status: :sent,
159
- notes: "Monthly supply of fresh produce"
160
- )
161
-
162
- # RFQ items
163
- rfq.rfq_items.create!(
164
- product: banana_product.product,
165
- unit: kg,
166
- quantity: 200,
167
- notes: "Premium quality bananas"
168
- )
169
-
170
- rfq.rfq_items.create!(
171
- product: milk_product.product,
172
- unit: liter,
173
- quantity: 100,
174
- notes: "Fresh morning milk"
175
- )
176
-
177
- # Quotations from wholesalers
178
- quotation1 = Dscf::Marketplace::Quotation.create!(
179
- request_for_quotation: rfq,
180
- business: wholesaler1,
181
- total_price: 5000.00,
182
- delivery_date: 3.days.from_now.to_date,
183
- valid_until: 10.days.from_now,
184
- status: :accepted,
185
- notes: "Competitive pricing for bulk orders"
186
- )
187
-
188
- quotation1.quotation_items.create!(
189
- rfq_item: rfq.rfq_items.first,
190
- product: banana_product.product,
191
- unit: kg,
192
- quantity: 200,
193
- unit_price: 25.00
194
- )
195
-
196
- quotation2 = Dscf::Marketplace::Quotation.create!(
197
- request_for_quotation: rfq,
198
- business: wholesaler2,
199
- total_price: 4500.00,
200
- delivery_date: 2.days.from_now.to_date,
201
- valid_until: 8.days.from_now,
202
- status: :sent,
203
- notes: "Direct from farm fresh milk"
204
- )
205
-
206
- quotation2.quotation_items.create!(
207
- rfq_item: rfq.rfq_items.second,
208
- product: milk_product.product,
209
- unit: liter,
210
- quantity: 100,
211
- unit_price: 45.00
212
- )
213
-
214
- puts "✅ Created #{Dscf::Marketplace::RequestForQuotation.count} RFQs with #{Dscf::Marketplace::Quotation.count} quotations"
215
-
216
- puts "🛒 Creating orders from consumers and retailers..."
217
-
218
- # Addresses for orders
219
- consumer_address = Dscf::Core::Address.create!(
220
- user: consumer1,
221
- address_type: :shipping,
222
- country: "Ethiopia",
223
- city: "Addis Ababa",
224
- sub_city: "Bole",
225
- woreda: "05",
226
- kebele: "09",
227
- house_numbers: "123",
228
- po_box: "5678",
229
- latitude: 9.0108,
230
- longitude: 38.7613
231
- )
232
-
233
- retailer_address = Dscf::Core::Address.create!(
234
- user: retail_user1,
235
- address_type: :shipping,
236
- country: "Ethiopia",
237
- city: "Addis Ababa",
238
- sub_city: "Piassa",
239
- woreda: "01",
240
- kebele: "12",
241
- house_numbers: "456",
242
- po_box: "9012",
243
- latitude: 9.0308,
244
- longitude: 38.7413
245
- )
246
-
247
- # Order from consumer via direct listing
248
- consumer_order = Dscf::Marketplace::Order.create_from_listing(
249
- milk_listing,
250
- consumer1,
251
- 10,
252
- consumer_address
253
- )
254
-
255
- # Order from retailer via accepted quotation
256
- retailer_order = Dscf::Marketplace::Order.create_from_quotation(
257
- quotation1,
258
- retailer_address
259
- )
260
-
261
- puts "✅ Created #{Dscf::Marketplace::Order.count} orders (#{Dscf::Marketplace::Order.where(order_type: :direct_listing).count} direct, #{Dscf::Marketplace::Order.where(order_type: :rfq_based).count} RFQ-based)"
262
-
263
- puts "🚚 Creating delivery orders with multiple dropoffs..."
264
-
265
- # Pickup address
266
- pickup_address = Dscf::Core::Address.create!(
267
- user: wholesaler1.user,
268
- address_type: :business,
269
- country: "Ethiopia",
270
- city: "Addis Ababa",
271
- sub_city: "Kazanchis",
272
- woreda: "03",
273
- kebele: "15",
274
- house_numbers: "789",
275
- po_box: "3456",
276
- latitude: 9.0208,
277
- longitude: 38.7513
278
- )
279
-
280
- # Additional dropoff
281
- extra_address = Dscf::Core::Address.create!(
282
- user: consumer2,
283
- address_type: :shipping,
284
- country: "Ethiopia",
285
- city: "Addis Ababa",
286
- sub_city: "Merkato",
287
- woreda: "07",
288
- kebele: "21",
289
- house_numbers: "101",
290
- po_box: "7890",
291
- latitude: 9.0008,
292
- longitude: 38.7713
293
- )
294
-
295
- # Create delivery order
296
- delivery_order = Dscf::Marketplace::DeliveryOrder.create!(
297
- driver: driver1,
298
- pickup_address: pickup_address,
299
- status: :assigned,
300
- vehicle_type: :motorcycle,
301
- estimated_delivery_price: 150.00,
302
- estimated_delivery_time: 2.hours.from_now
303
- )
304
-
305
- # Associate orders
306
- consumer_order.update!(delivery_order: delivery_order)
307
- retailer_order.update!(delivery_order: delivery_order)
308
-
309
- # Create additional order for third dropoff
310
- extra_order = Dscf::Marketplace::Order.create_from_listing(
311
- banana_listing,
312
- consumer2,
313
- 5,
314
- extra_address
315
- )
316
- extra_order.update!(delivery_order: delivery_order)
317
-
318
- # Create delivery order items
319
- delivery_order.delivery_order_items.create!(
320
- order_item: consumer_order.order_items.first,
321
- pickup_address: pickup_address,
322
- dropoff_address: consumer_address
323
- )
1
+ puts "🌱 Seeding marketplace permissions and default USER role..."
2
+
3
+ Dscf::Core::PermissionRegistry.register("dscf-marketplace") do
4
+ resource :categories, actions: %i[index show create update destroy subcategories]
5
+ resource :products, actions: %i[index show create update destroy filter supplier_products]
6
+ resource :units, actions: %i[index show create update destroy]
7
+ resource :unit_conversions, actions: %i[index show create update destroy]
8
+ resource :supplier_products, actions: %i[index show create update destroy my_products]
9
+ resource :listings, actions: %i[index show create update destroy activate pause sold_out my_listings listings_by_supplier]
10
+ resource :request_for_quotations, actions: %i[index show create update destroy send_rfq close respond my_rfqs filter]
11
+ resource :rfq_items, actions: %i[index show create update destroy]
12
+ resource :quotations, actions: %i[index show create update destroy accept reject send_quotation my_quotes filter]
13
+ resource :quotation_items, actions: %i[index show create update destroy]
14
+ resource :orders, actions: %i[index show create update destroy confirm cancel complete my_orders filter]
15
+ resource :order_items, actions: %i[index show create update destroy]
16
+ resource :delivery_orders, actions: %i[
17
+ index show create update destroy pickup start_delivery complete_delivery mark_failed accept summary
18
+ my_driver_deliveries filter convert_orders
19
+ ]
20
+ resource :delivery_stops, actions: %i[index show create update destroy verify]
21
+ resource :delivery_order_items, actions: %i[index show create update destroy receiver_confirm report_issue dispute_delivery]
22
+ resource :delivery_vehicles, actions: %i[index show create update destroy]
23
+ resource :locations, actions: %i[get_location]
24
+ end
324
25
 
325
- delivery_order.delivery_order_items.create!(
326
- order_item: retailer_order.order_items.first,
327
- pickup_address: pickup_address,
328
- dropoff_address: retailer_address
329
- )
26
+ user_role = Dscf::Core::Role.find_or_create_by!(code: "USER") do |role|
27
+ role.name = "User"
28
+ role.active = true
29
+ end
30
+ user_role.update!(name: "User", active: true)
330
31
 
331
- delivery_order.delivery_order_items.create!(
332
- order_item: extra_order.order_items.first,
333
- pickup_address: pickup_address,
334
- dropoff_address: extra_address
335
- )
32
+ marketplace_permissions = Dscf::Core::Permission.where(engine: "dscf-marketplace")
336
33
 
337
- puts "✅ Created #{Dscf::Marketplace::DeliveryOrder.count} delivery orders with #{Dscf::Marketplace::DeliveryOrderItem.count} total dropoffs"
338
- puts "🎉 Demo seed completed! Created realistic supply chain with #{Dscf::Core::User.count} users, #{Dscf::Core::Business.count} businesses, and #{Dscf::Marketplace::Order.count} orders across the platform."
339
- rescue => e
340
- puts "❌ Seed failed: #{e.message}"
341
- puts e.backtrace
342
- raise
34
+ marketplace_permissions.find_each do |permission|
35
+ Dscf::Core::RolePermission.find_or_create_by!(role: user_role, permission: permission)
343
36
  end
37
+
38
+ puts "✅ Seeded #{marketplace_permissions.count} marketplace permissions and assigned to USER role."
@@ -1,5 +1,5 @@
1
1
  module Dscf
2
2
  module Marketplace
3
- VERSION = "0.7.1".freeze
3
+ VERSION = "0.7.3".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.7.1
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Asrat
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-03-10 00:00:00.000000000 Z
10
+ date: 2026-04-17 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: rails
@@ -416,6 +416,7 @@ extra_rdoc_files: []
416
416
  files:
417
417
  - MIT-LICENSE
418
418
  - Rakefile
419
+ - app/controllers/concerns/dscf/marketplace/demo_permission_bypass.rb
419
420
  - app/controllers/dscf/marketplace/application_controller.rb
420
421
  - app/controllers/dscf/marketplace/categories_controller.rb
421
422
  - app/controllers/dscf/marketplace/delivery_order_items_controller.rb