spree_cm_commissioner 2.3.0.pre.pre16 → 2.3.0.pre.pre18

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +33 -0
  4. data/app/controllers/blazer/base_controller_decorator.rb +20 -1
  5. data/app/controllers/spree/api/v2/storefront/intercity_taxi/draft_orders_controller.rb +40 -0
  6. data/app/controllers/spree/api/v2/storefront/line_items_controller.rb +1 -0
  7. data/app/controllers/spree/api/v2/storefront/trip_search_controller.rb +47 -9
  8. data/app/controllers/spree_cm_commissioner/admin/variants_controller_decorator.rb +1 -1
  9. data/app/factory/spree_cm_commissioner/vendor_telegram_message_factory.rb +65 -0
  10. data/app/helpers/spree/base_helper_decorator.rb +2 -19
  11. data/app/interactors/spree_cm_commissioner/user_registration_with_id_token.rb +72 -36
  12. data/app/interactors/spree_cm_commissioner/vendor_creation_telegram_alert_sender.rb +28 -0
  13. data/app/jobs/spree_cm_commissioner/transit/route_fulfilled_order_count_incrementer_job.rb +1 -1
  14. data/app/jobs/spree_cm_commissioner/transit/route_order_count_incrementer_job.rb +1 -1
  15. data/app/jobs/spree_cm_commissioner/transit/route_previous_trip_count_decrementer_job.rb +1 -1
  16. data/app/jobs/spree_cm_commissioner/transit/route_trip_count_decrementer_job.rb +1 -1
  17. data/app/jobs/spree_cm_commissioner/transit/route_trip_count_incrementer_job.rb +1 -1
  18. data/app/jobs/spree_cm_commissioner/vendor_creation_telegram_alert_sender_job.rb +10 -0
  19. data/app/models/concerns/spree_cm_commissioner/line_item_transitable.rb +51 -0
  20. data/app/models/concerns/spree_cm_commissioner/option_type_attr_type.rb +7 -0
  21. data/app/models/concerns/spree_cm_commissioner/option_value_attr_type.rb +25 -0
  22. data/app/models/concerns/spree_cm_commissioner/route_order_countable.rb +3 -14
  23. data/app/models/concerns/spree_cm_commissioner/variant_options_concern.rb +18 -4
  24. data/app/models/spree_cm_commissioner/block.rb +19 -0
  25. data/app/models/spree_cm_commissioner/line_item_decorator.rb +5 -0
  26. data/app/models/spree_cm_commissioner/product_decorator.rb +1 -0
  27. data/app/models/spree_cm_commissioner/variant_decorator.rb +0 -5
  28. data/app/models/spree_cm_commissioner/variant_options.rb +8 -0
  29. data/app/models/spree_cm_commissioner/vendor_decorator.rb +6 -0
  30. data/app/overrides/spree/admin/variants/_form/add_permanent_stock.html.erb.deface +2 -1
  31. data/app/serializers/spree/v2/storefront/line_item_serializer_decorator.rb +2 -0
  32. data/app/serializers/spree_cm_commissioner/v2/storefront/intercity_taxi_cart_serializer.rb +12 -0
  33. data/app/serializers/spree_cm_commissioner/v2/storefront/intercity_taxi_line_item_serializer.rb +31 -0
  34. data/app/serializers/spree_cm_commissioner/v2/storefront/trip_result_serializer.rb +11 -0
  35. data/app/services/spree_cm_commissioner/intercity_taxi_order/create.rb +67 -0
  36. data/app/services/spree_cm_commissioner/intercity_taxi_order/update.rb +79 -0
  37. data/app/services/spree_cm_commissioner/{transit/base_route_order_metrics_updater.rb → routes/base_update_order_metrics.rb} +2 -2
  38. data/app/services/spree_cm_commissioner/{transit/route_previous_trip_count_decrementer_service.rb → routes/decrement_previous_trip_count.rb} +3 -3
  39. data/app/services/spree_cm_commissioner/{transit/route_trip_count_decrementer_service.rb → routes/decrement_trip_count.rb} +2 -2
  40. data/app/services/spree_cm_commissioner/{transit/route_fulfilled_order_count_incrementer_service.rb → routes/increment_fulfilled_order_count.rb} +3 -3
  41. data/app/services/spree_cm_commissioner/{transit/route_order_count_incrementer_service.rb → routes/increment_order_count.rb} +3 -3
  42. data/app/services/spree_cm_commissioner/{transit/route_trip_count_incrementer_service.rb → routes/increment_trip_count.rb} +2 -2
  43. data/app/services/spree_cm_commissioner/trips/search.rb +65 -0
  44. data/app/views/blazer/queries/embed/_content.html.erb +51 -2
  45. data/app/views/spree/admin/option_types/_color_field.html.erb +21 -0
  46. data/app/views/spree/admin/option_types/_option_value_fields.html.erb +2 -0
  47. data/app/views/spree/admin/variants/_color_field.html.erb +28 -0
  48. data/app/views/spree/admin/variants/_date_field.html.erb +11 -1
  49. data/app/views/spree/admin/variants/_default_field.html.erb +7 -3
  50. data/app/views/spree/admin/variants/_option_values.html.erb +5 -1
  51. data/app/views/spree/admin/variants/_time_field.html.erb +7 -1
  52. data/app/views/spree/order_mailer/_adjustment.html.erb +7 -0
  53. data/app/views/spree_cm_commissioner/event_transactional_mailer/_event_banner.html.erb +9 -3
  54. data/config/locales/km.yml +64 -0
  55. data/config/routes.rb +4 -1
  56. data/lib/spree_cm_commissioner/test_helper/factories/option_type_factory.rb +18 -0
  57. data/lib/spree_cm_commissioner/test_helper/factories/trip_factory.rb +30 -0
  58. data/lib/spree_cm_commissioner/trip_result.rb +15 -0
  59. data/lib/spree_cm_commissioner/version.rb +1 -1
  60. metadata +20 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 654baee3237bba36ebcc85458b09f73b076c6d1ffb782351cf697fa7ab287c7d
4
- data.tar.gz: ef9275e9c3d748cdd7947780dca206ea2ae75b4362731e9d9d1b04b2eab04aee
3
+ metadata.gz: 31d13343c99ba15786dc8ea2706e64fd79ada05ce505f06fea9dfdffd24f1313
4
+ data.tar.gz: 2638b1befd6df8abbc2ed8bcabfd447bb15bb2006336e2ff894662c58c07e933
5
5
  SHA512:
6
- metadata.gz: b35dd2fe6fc1815f72f0c1e33a88eb629437040de5ea73fc48f8cb249b6f322aedfe2be423847b74ef609a78783f62de13399b0c17c6fdebdf0c54c4a826cdf8
7
- data.tar.gz: 11131275c0fc9afec3d0ed082e10ac0471490e07fc04ebbc64ccb10d01ac1442acb102fd4178bfedad3a0e685939df1ad42459f5c62494dd168c699cbb105b57
6
+ metadata.gz: 487aa62c3894d83cd38036169a677ab79633f9792654e4d87e59c61fdbbe6a6bb60cd303f69727e093fc37fcf41c361ad43fbb2f60e79f84e5cd6e830aa05ed2
7
+ data.tar.gz: 608a5d18e523889840e11a31f2686d357636de604fb360abb0c5074c1f3eda129c33012e779f5dc5ce025aed2842eb605cb051014217fccf4fa36361b8315fb5
data/Gemfile.lock CHANGED
@@ -34,7 +34,7 @@ GIT
34
34
  PATH
35
35
  remote: .
36
36
  specs:
37
- spree_cm_commissioner (2.3.0.pre.pre16)
37
+ spree_cm_commissioner (2.3.0.pre.pre18)
38
38
  activerecord-multi-tenant
39
39
  activerecord_json_validator (~> 2.1, >= 2.1.3)
40
40
  aws-sdk-cloudfront
data/README.md CHANGED
@@ -32,6 +32,39 @@ If your server was running, restart it so that it can find the assets properly.
32
32
 
33
33
  Update the semantic version number in `lib/spree_cm_commissioner/version.rb`, then create and push a new tag to GitHub. When the tag is pushed, the GitHub Actions workflow will automatically build the gem and publish it to RubyGems.
34
34
 
35
+ Here's a cleaner and more polished version of your section:
36
+
37
+ ## PostgreSQL Configuration
38
+
39
+ By default, this Rails engine uses your current system login to connect to the PostgreSQL database. To allow passwordless connections, you need to configure PostgreSQL to trust local connections by editing `pg_hba.conf`:
40
+
41
+ ```conf
42
+ # pg_hba.conf
43
+ local all all trust
44
+ ```
45
+
46
+ With this `trust` configuration, PostgreSQL expects a role that matches your current system username.
47
+
48
+ To check your system username:
49
+
50
+ ```sh
51
+ whoami # e.g., superdev
52
+ ```
53
+
54
+ Then create a matching PostgreSQL role:
55
+
56
+ ```sh
57
+ createuser -U postgres -s superdev
58
+ ```
59
+
60
+ Or simply run the following to create a role matching your current system user:
61
+
62
+ ```sh
63
+ createuser -U postgres -s $(whoami)
64
+ ```
65
+
66
+ > 💡 We recommend using [Postgres.app](https://postgresapp.com) for local development. It supports multiple PostgreSQL versions and provides a developer-friendly setup out of the box.
67
+
35
68
  ## Config
36
69
 
37
70
  ### Rake tasks
@@ -12,11 +12,30 @@ module Blazer
12
12
  end
13
13
 
14
14
  def restrict_organizer_access
15
- return unless spree_current_user.organizer? && !spree_current_user.admin?
15
+ return if spree_current_user.admin?
16
+
17
+ return unless spree_current_user.organizer? || vendor_permissions?
16
18
  return if controller_name == 'queries' && %w[show run].include?(action_name)
17
19
 
18
20
  raise ActionController::RoutingError, 'Unauthorized'
19
21
  end
22
+
23
+ private
24
+
25
+ def current_vendor
26
+ @current_vendor ||= vendors&.find_by(id: session[:vendor_id]) || vendors&.first
27
+ end
28
+
29
+ def vendors
30
+ @vendors ||= spree_current_user&.vendors
31
+ end
32
+
33
+ def vendor_permissions?
34
+ return false unless current_vendor
35
+
36
+ permissions = spree_current_user.permissions_for_vendor(current_vendor.id)
37
+ permissions.exists?(entry: 'shared_console/reports', action: 'view_reports')
38
+ end
20
39
  end
21
40
  end
22
41
 
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module Api
3
+ module V2
4
+ module Storefront
5
+ module IntercityTaxi
6
+ class DraftOrdersController < ::Spree::Api::V2::ResourceController
7
+ def create
8
+ order = SpreeCmCommissioner::IntercityTaxiOrder::Create.call(
9
+ trip_id: params[:trip_id],
10
+ from_date: params[:from_date],
11
+ to_date: params[:to_date],
12
+ user_id: params[:user_id],
13
+ quantity: params[:quantity]
14
+ )
15
+
16
+ render_serialized_payload { serialize_resource(order) }
17
+ rescue StandardError => e
18
+ render_error_payload(e.message)
19
+ end
20
+
21
+ def update
22
+ order = SpreeCmCommissioner::IntercityTaxiOrder::Update.call(
23
+ order_number: params[:id],
24
+ params: params
25
+ )
26
+
27
+ render_serialized_payload { serialize_resource(order) }
28
+ rescue StandardError => e
29
+ render_error_payload(e.message)
30
+ end
31
+
32
+ def resource_serializer
33
+ SpreeCmCommissioner::V2::Storefront::IntercityTaxiCartSerializer
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -61,6 +61,7 @@ module Spree
61
61
 
62
62
  Spree::LineItem.joins(:order)
63
63
  .where(spree_orders: { token: order_tokens, state: 'complete', user_id: nil })
64
+ .includes(:guests, :saved_guests)
64
65
  .filter_by_event(event)
65
66
  .page(params[:page])
66
67
  .per(params[:per_page])
@@ -3,21 +3,59 @@ module Spree
3
3
  module V2
4
4
  module Storefront
5
5
  class TripSearchController < ::Spree::Api::V2::ResourceController
6
+ CACHE_EXPIRES_IN = 5.minutes
7
+
6
8
  def index
7
- trips = SpreeCmCommissioner::TripQuery.new(
8
- origin_id: params[:origin_id],
9
- destination_id: params[:destination_id],
10
- date: params[:date],
11
- vendor_id: params[:vendor_id],
12
- number_of_guests: params[:number_of_guests],
13
- params: params
14
- ).call
9
+ render_serialized_payload do
10
+ Rails.cache.fetch(collection_cache_key, collection_cache_opts) do
11
+ trips = SpreeCmCommissioner::TripQuery.new(
12
+ origin_id: params[:origin_id],
13
+ destination_id: params[:destination_id],
14
+ date: params[:date],
15
+ vendor_id: params[:vendor_id],
16
+ number_of_guests: params[:number_of_guests],
17
+ params: params
18
+ ).call
15
19
 
16
- render_serialized_payload { serialize_collection(trips) }
20
+ serialize_collection(trips)
21
+ end
22
+ end
17
23
  end
18
24
 
19
25
  private
20
26
 
27
+ # override from ContentCacheable
28
+ def max_age
29
+ CACHE_EXPIRES_IN.to_i
30
+ end
31
+
32
+ # override
33
+ def collection_cache_key
34
+ cache_key_parts = [
35
+ 'trip_search',
36
+ params[:origin_id],
37
+ params[:destination_id],
38
+ params[:date],
39
+ params[:vendor_id],
40
+ params[:number_of_guests],
41
+ resource_includes&.sort&.join(','),
42
+ sparse_fields&.sort&.join(','),
43
+ serializer_params.to_json,
44
+ params[:page]&.to_s&.strip,
45
+ params[:per_page]&.to_s&.strip
46
+ ].compact.join('-')
47
+
48
+ Digest::MD5.hexdigest(cache_key_parts)
49
+ end
50
+
51
+ # override
52
+ def collection_cache_opts
53
+ {
54
+ namespace: Spree::Api::Config[:api_v2_collection_cache_namespace],
55
+ expires_in: CACHE_EXPIRES_IN
56
+ }
57
+ end
58
+
21
59
  # override
22
60
  def default_resource_includes
23
61
  [
@@ -17,7 +17,7 @@ module SpreeCmCommissioner
17
17
  end
18
18
 
19
19
  # construct option values base on name & create new option value when not exist.
20
- # then set to variant.
20
+ # then set to variant. Empty values will remove the option value from variant.
21
21
  def build_option_values
22
22
  option_values = permitted_resource_params.delete(:option_values_attributes).to_h.values
23
23
  return if option_values.blank?
@@ -0,0 +1,65 @@
1
+ # 📋 ---[New Vendor]---
2
+ #
3
+ # 📝 Name: {{vendor.name}}
4
+ #
5
+ # ✉️ Email: <code>{{vendor.notification_email || vendor.support_email}}</code>
6
+ # 📱 Phone Number: {{vendor.phone_number}}
7
+ #
8
+ # 👤 Created by: {{first_user.name || 'Admin'}}
9
+ # 🗓️ Created at: {{vendor.created_at}}
10
+ #
11
+ # 🔗 URL: {{vendor.organizer_url}}
12
+ module SpreeCmCommissioner
13
+ class VendorTelegramMessageFactory < TelegramMessageFactory
14
+ attr_reader :vendor
15
+
16
+ def initialize(vendor:)
17
+ @vendor = vendor
18
+
19
+ title = '✨ New Vendor ✨'
20
+
21
+ super(title: title)
22
+ end
23
+
24
+ def body
25
+ [
26
+ "📝 Name: #{vendor.name}",
27
+ '',
28
+ email_line,
29
+ phone_line,
30
+ '',
31
+ creator_line,
32
+ created_at_line,
33
+ '',
34
+ url_line
35
+ ].compact.join("\n")
36
+ end
37
+
38
+ private
39
+
40
+ def email_line
41
+ return unless vendor.notification_email.present? || vendor.support_email.present?
42
+
43
+ "✉️ Email: #{inline_code(vendor.notification_email || vendor.support_email)}"
44
+ end
45
+
46
+ def phone_line
47
+ return if vendor.contact_us.blank?
48
+
49
+ "📱 Phone Number: #{vendor.contact_us}"
50
+ end
51
+
52
+ def creator_line
53
+ creator_email = vendor.users.first&.email
54
+ "👤 Created by: #{creator_email}" if creator_email.present?
55
+ end
56
+
57
+ def created_at_line
58
+ "🗓️ Created at: #{pretty_date(vendor.created_at)}" if vendor.created_at.present?
59
+ end
60
+
61
+ def url_line
62
+ "🔗 URL: #{vendor.organizer_url}" if vendor.organizer_url.present?
63
+ end
64
+ end
65
+ end
@@ -20,25 +20,8 @@ module Spree
20
20
  end
21
21
  end
22
22
 
23
- def custom_product_line_item_url(line_item, options = {})
24
- if defined?(locale_param) && locale_param.present?
25
- options.merge!(locale: locale_param)
26
- end
27
-
28
- localize = if options[:locale].present?
29
- "/#{options[:locale]}"
30
- else
31
- ''
32
- end
33
-
34
- line_item = Spree::LineItem.find(line_item.id)
35
- payload = { order_number: line_item.order.number, line_item_id: line_item.id }
36
-
37
- jwt_token = SpreeCmCommissioner::LineItemJwtToken.encode(payload, line_item.order.token)
38
-
39
- return if line_item.number.blank? && jwt_token.blank?
40
-
41
- "#{current_store.formatted_url + localize}/a/#{line_item.qr_data}"
23
+ def custom_product_line_item_url(line_item)
24
+ main_app.url_for("/a/#{line_item.qr_data}")
42
25
  end
43
26
  end
44
27
  end
@@ -2,26 +2,54 @@ module SpreeCmCommissioner
2
2
  class UserRegistrationWithIdToken < BaseInteractor
3
3
  # :id_token
4
4
  def call
5
+ firebase_context = validate_firebase_token!
6
+ return if firebase_context.nil?
7
+
8
+ ActiveRecord::Base.transaction do
9
+ find_or_register_user!(firebase_context.provider[:name], firebase_context.provider[:email])
10
+ link_user_account!(firebase_context.provider)
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def validate_firebase_token!
5
17
  firebase_context = SpreeCmCommissioner::FirebaseIdTokenProvider.call(id_token: context.id_token)
18
+ return firebase_context if firebase_context.success?
6
19
 
7
- if firebase_context.success?
8
- ActiveRecord::Base.transaction do
9
- register_user!(firebase_context.provider[:name], firebase_context.provider[:email])
10
- link_user_account!(firebase_context.provider)
11
- end
20
+ context.fail!(message: firebase_context.message)
21
+ nil
22
+ end
23
+
24
+ def find_or_register_user!(name, email)
25
+ if email.present?
26
+ register_user_with_email!(name, email)
12
27
  else
13
- context.fail!(message: firebase_context.message)
28
+ register_user_without_email!(name)
14
29
  end
15
30
  end
16
31
 
17
- def register_user!(name, email)
18
- user = Spree.user_class.new(
19
- password: SecureRandom.base64(16),
20
- email: email,
21
- tenant_id: context.tenant_id,
22
- **name_attributes(name)
23
- )
24
- user.confirmed_at = Time.zone.now
32
+ def register_user_with_email!(name, email)
33
+ user = Spree.user_class.find_by(email: email, tenant_id: context.tenant_id)
34
+ return context.user = ensure_user_confirmed!(user) if user.present?
35
+
36
+ begin
37
+ context.user = Spree.user_class.find_or_create_by!(email: email, tenant_id: context.tenant_id) do |u|
38
+ assign_user_attributes(u, name)
39
+ end
40
+ # Handle potential race condition: Another request might have created the user
41
+ # between our find_by and find_or_create_by calls. If we get a RecordNotUnique,
42
+ # it means the user was created by another process, so we find and return it.
43
+ rescue ActiveRecord::RecordNotUnique
44
+ user = Spree.user_class.find_by!(email: email, tenant_id: context.tenant_id)
45
+ context.user = ensure_user_confirmed!(user)
46
+ end
47
+ end
48
+
49
+ def register_user_without_email!(name)
50
+ user = Spree.user_class.new(email: nil, tenant_id: context.tenant_id)
51
+ assign_user_attributes(user, name)
52
+
25
53
  if user.save(validate: false)
26
54
  context.user = user
27
55
  else
@@ -29,39 +57,32 @@ module SpreeCmCommissioner
29
57
  end
30
58
  end
31
59
 
60
+ def assign_user_attributes(user, name)
61
+ user.password = SecureRandom.base64(16)
62
+ user.confirmed_at = Time.zone.now
63
+ user.assign_attributes(name_attributes(name))
64
+ end
65
+
32
66
  def name_attributes(name)
33
67
  full_name = name&.strip
34
68
  return {} if full_name.blank?
35
69
 
36
- split = full_name.split
37
- first_name = split[0]
38
- last_name = split[1..].join(' ')
39
-
40
- attributes = {}
41
- attributes[:first_name] = first_name if first_name.present?
42
- attributes[:last_name] = last_name if last_name.present?
70
+ parts = full_name.split
71
+ attributes = { first_name: parts[0] }
72
+ attributes[:last_name] = parts[1..].join(' ') if parts.size > 1
43
73
 
44
74
  attributes
45
75
  end
46
76
 
47
- # provider object
48
-
49
- # {
50
- # identity_type: identity_type,
51
- # sub: sub
52
- # }
53
-
54
77
  def link_user_account!(provider)
55
78
  identity_type = SpreeCmCommissioner::UserIdentityProvider.identity_types[provider[:identity_type]]
79
+ user_identity_provider = find_or_initialize_identity_provider(identity_type)
56
80
 
57
- user_identity_provider = SpreeCmCommissioner::UserIdentityProvider.where(
58
- user_id: context.user,
59
- identity_type: identity_type
60
- ).first_or_initialize
61
-
62
- user_identity_provider.sub = provider[:sub]
63
- user_identity_provider.email = provider[:email]
64
- user_identity_provider.name = provider[:name]
81
+ user_identity_provider.assign_attributes(
82
+ sub: provider[:sub],
83
+ email: provider[:email],
84
+ name: provider[:name]
85
+ )
65
86
 
66
87
  if user_identity_provider.save
67
88
  context.user_identity_provider = user_identity_provider
@@ -69,5 +90,20 @@ module SpreeCmCommissioner
69
90
  context.fail!(message: user_identity_provider.errors.full_messages)
70
91
  end
71
92
  end
93
+
94
+ def find_or_initialize_identity_provider(identity_type)
95
+ SpreeCmCommissioner::UserIdentityProvider.where(
96
+ user_id: context.user,
97
+ identity_type: identity_type
98
+ ).first_or_initialize
99
+ end
100
+
101
+ # Ensure user is confirmed when linking with identity provider.
102
+ # Users created via OAuth should be auto-confirmed since they've proven
103
+ # their identity through the OAuth provider.
104
+ def ensure_user_confirmed!(user)
105
+ user.update(confirmed_at: Time.zone.now) if user.confirmed_at.nil?
106
+ user
107
+ end
72
108
  end
73
109
  end
@@ -0,0 +1,28 @@
1
+ module SpreeCmCommissioner
2
+ class VendorCreationTelegramAlertSender < BaseInteractor
3
+ delegate :vendor, to: :context
4
+
5
+ def call
6
+ return if admin_chat_id.blank?
7
+
8
+ send_alert
9
+ end
10
+
11
+ def send_alert
12
+ TelegramNotificationSender.call(
13
+ chat_id: admin_chat_id,
14
+ message: alert_message,
15
+ parse_mode: 'HTML'
16
+ )
17
+ end
18
+
19
+ def alert_message
20
+ factory = SpreeCmCommissioner::VendorTelegramMessageFactory.new(vendor: vendor)
21
+ factory.message
22
+ end
23
+
24
+ def admin_chat_id
25
+ ENV.fetch('EXCEPTION_NOTIFIER_TELEGRAM_CHANNEL_ID', nil)
26
+ end
27
+ end
28
+ end
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
3
3
  class RouteFulfilledOrderCountIncrementerJob < ApplicationUniqueJob
4
4
  def perform(order_id:)
5
5
  order = Spree::Order.find(order_id)
6
- SpreeCmCommissioner::Transit::RouteFulfilledOrderCountIncrementerService.call(order: order)
6
+ SpreeCmCommissioner::Routes::IncrementFulfilledOrderCount.call(order: order)
7
7
  end
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
3
3
  class RouteOrderCountIncrementerJob < ApplicationUniqueJob
4
4
  def perform(order_id:)
5
5
  order = Spree::Order.find(order_id)
6
- SpreeCmCommissioner::Transit::RouteOrderCountIncrementerService.call(order: order)
6
+ SpreeCmCommissioner::Routes::IncrementOrderCount.call(order: order)
7
7
  end
8
8
  end
9
9
  end
@@ -6,7 +6,7 @@ module SpreeCmCommissioner
6
6
  queue_as :default
7
7
 
8
8
  def perform(previous_route_id:)
9
- SpreeCmCommissioner::Transit::RoutePreviousTripCountDecrementerService.call(previous_route_id: previous_route_id)
9
+ SpreeCmCommissioner::Routes::DecrementPreviousTripCount.call(previous_route_id: previous_route_id)
10
10
  end
11
11
  end
12
12
  end
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
3
3
  class RouteTripCountDecrementerJob < ApplicationUniqueJob
4
4
  def perform(trip_id:)
5
5
  trip = SpreeCmCommissioner::Trip.find(trip_id)
6
- SpreeCmCommissioner::Transit::RouteTripCountDecrementerService.call(trip: trip)
6
+ SpreeCmCommissioner::Routes::DecrementTripCount.call(trip: trip)
7
7
  end
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ module SpreeCmCommissioner
3
3
  class RouteTripCountIncrementerJob < ApplicationUniqueJob
4
4
  def perform(trip_id:)
5
5
  trip = SpreeCmCommissioner::Trip.find(trip_id)
6
- SpreeCmCommissioner::Transit::RouteTripCountIncrementerService.call(trip: trip)
6
+ SpreeCmCommissioner::Routes::IncrementTripCount.call(trip: trip)
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,10 @@
1
+ module SpreeCmCommissioner
2
+ class VendorCreationTelegramAlertSenderJob < ApplicationUniqueJob
3
+ queue_as :telegram_bot
4
+
5
+ def perform(vendor_id)
6
+ vendor = Spree::Vendor.find(vendor_id)
7
+ SpreeCmCommissioner::VendorCreationTelegramAlertSender.call(vendor: vendor)
8
+ end
9
+ end
10
+ end
@@ -63,11 +63,22 @@ module SpreeCmCommissioner
63
63
 
64
64
  def pickup_place_name = public_metadata['pickup_place_name']
65
65
  def drop_off_place_name = public_metadata['drop_off_place_name']
66
+
66
67
  def pickup_lat = public_metadata['pickup_lat']&.to_f
67
68
  def pickup_lng = public_metadata['pickup_lng']&.to_f
68
69
  def drop_off_lat = public_metadata['drop_off_lat']&.to_f
69
70
  def drop_off_lng = public_metadata['drop_off_lng']&.to_f
70
71
  def passenger_count = public_metadata['passenger_count']&.to_i
72
+ def distance_km = public_metadata['distance_km']&.to_f
73
+ def ordered_points = public_metadata['ordered_points']
74
+ def base_km = public_metadata['base_km']&.to_f
75
+ def detour_pickup_km = public_metadata['detour_pickup_km']&.to_f
76
+ def detour_dropoff_km = public_metadata['detour_dropoff_km']&.to_f
77
+ def extra_pickup_km = public_metadata['extra_pickup_km']&.to_f
78
+ def extra_dropoff_km = public_metadata['extra_dropoff_km']&.to_f
79
+ def extra_pickup_charge_usd = public_metadata['extra_pickup_charge_usd']&.to_f
80
+ def extra_dropoff_charge_usd = public_metadata['extra_dropoff_charge_usd']&.to_f
81
+ def estimated_time_minutes = public_metadata['estimated_time_minutes']&.to_i
71
82
  def pickup_oob_confirmed = private_metadata['pickup_oob_confirmed']
72
83
  def drop_off_oob_confirmed = private_metadata['drop_off_oob_confirmed']
73
84
 
@@ -123,6 +134,46 @@ module SpreeCmCommissioner
123
134
  set_public_metadata_value('passenger_count', value)
124
135
  end
125
136
 
137
+ def distance_km=(value)
138
+ set_public_metadata_value('distance_km', value)
139
+ end
140
+
141
+ def ordered_points=(value)
142
+ set_public_metadata_value('ordered_points', value)
143
+ end
144
+
145
+ def base_km=(value)
146
+ set_public_metadata_value('base_km', value)
147
+ end
148
+
149
+ def detour_pickup_km=(value)
150
+ set_public_metadata_value('detour_pickup_km', value)
151
+ end
152
+
153
+ def detour_dropoff_km=(value)
154
+ set_public_metadata_value('detour_dropoff_km', value)
155
+ end
156
+
157
+ def extra_pickup_km=(value)
158
+ set_public_metadata_value('extra_pickup_km', value)
159
+ end
160
+
161
+ def extra_dropoff_km=(value)
162
+ set_public_metadata_value('extra_dropoff_km', value)
163
+ end
164
+
165
+ def extra_pickup_charge_usd=(value)
166
+ set_public_metadata_value('extra_pickup_charge_usd', value)
167
+ end
168
+
169
+ def extra_dropoff_charge_usd=(value)
170
+ set_public_metadata_value('extra_dropoff_charge_usd', value)
171
+ end
172
+
173
+ def estimated_time_minutes=(value)
174
+ set_public_metadata_value('estimated_time_minutes', value)
175
+ end
176
+
126
177
  private
127
178
 
128
179
  def set_public_metadata_value(key, value)
@@ -10,6 +10,7 @@ module SpreeCmCommissioner
10
10
  array
11
11
  date
12
12
  time
13
+ color
13
14
  coordinate
14
15
  state_selection
15
16
  payment_option
@@ -41,6 +42,8 @@ module SpreeCmCommissioner
41
42
  'bib-display-prefix' => 'boolean',
42
43
  'bib-pre-generation-on-create' => 'boolean',
43
44
  'seat-number-positions' => 'array',
45
+ 'color' => 'color',
46
+ 'ticket-type' => 'string',
44
47
  'seat-type' => 'string',
45
48
  'intercity-taxi' => 'string'
46
49
  }.freeze
@@ -71,6 +74,10 @@ module SpreeCmCommissioner
71
74
  name.in?(RESERVED_OPTIONS.keys)
72
75
  end
73
76
 
77
+ def ticket_type?
78
+ name == 'ticket-type'
79
+ end
80
+
74
81
  def set_reverved_options_attributes
75
82
  self.attr_type = RESERVED_OPTIONS[name]
76
83
  self.kind = :variant