diff --git a/app/jobs/ensure_sponsorship_tito_discount_code_job.rb b/app/jobs/ensure_sponsorship_tito_discount_code_job.rb new file mode 100644 index 0000000..4c4f1a4 --- /dev/null +++ b/app/jobs/ensure_sponsorship_tito_discount_code_job.rb @@ -0,0 +1,73 @@ +class EnsureSponsorshipTitoDiscountCodeJob < ApplicationJob + def perform(sponsorship, kind, ignore_quantity: false) + return unless Rails.application.config.x.tito.token + @kind = kind + @sponsorship = sponsorship + @conference = @sponsorship.conference + return unless @conference.tito_slug.present? + + @discount_code = @sponsorship.tito_discount_codes.where(kind: kind).first + + if @discount_code + return if @discount_code.quantity == quantity && !ignore_quantity + tito.update_discount_code(@conference.tito_slug, @discount_code.tito_discount_code_id, **discount_code_attributes) + @discount_code.update!(quantity: quantity) + else + return if quantity < 1 + tito_discount_code = tito.create_discount_code(@conference.tito_slug, **discount_code_attributes) + TitoDiscountCode.create!( + sponsorship: @sponsorship, + kind: @kind, + code: code, + quantity: quantity, + tito_discount_code_id: tito_discount_code.fetch(:discount_code).fetch(:id), + ) + end + end + + def code + "#{code_prefix}_#{@sponsorship.id}_#{@sponsorship.ticket_key[0,12]}" + end + + def discount_code_attributes + { + code: code, + type: 'PercentOffDiscountCode', + value: '100.0', + only_show_attached: true, + reveal_secret: true, + quantity: quantity, + release_ids: quantity > 0 ? [release_id] : nil, + description_for_organizer: "sponsorship=#{@sponsorship.id}, domain=#{@sponsorship.organization&.domain}, plan=#{@sponsorship.plan&.name}", + } + end + + def quantity + { + 'attendee' => @sponsorship.total_number_of_attendees, + 'booth_staff' => @sponsorship.total_number_of_booth_staff, + }.fetch(@kind) + end + + def code_prefix + { + 'attendee' => 'sa', + 'booth_staff' => 'sb', + }.fetch(@kind) + end + + def release_slug + { + 'attendee' => 'sponsor', + 'booth_staff' => 'booth-staff', + }.fetch(@kind) + end + + def release_id + @release_id ||= tito.get_release(@conference.tito_slug, release_slug).fetch(:release).fetch(:id) + end + + def tito + @tito ||= TitoApi.new + end +end diff --git a/app/jobs/process_sponsorship_edit_job.rb b/app/jobs/process_sponsorship_edit_job.rb index 2f22483..fdbf535 100644 --- a/app/jobs/process_sponsorship_edit_job.rb +++ b/app/jobs/process_sponsorship_edit_job.rb @@ -12,5 +12,8 @@ def perform(edit) ) # GenerateSponsorsYamlFileJob.perform_now(@conference) + + # EnsureSponsorshipTitoDiscountCodeJob.perform_now(@sponsorship, 'attendee') + # EnsureSponsorshipTitoDiscountCodeJob.perform_now(@sponsorship, 'booth_staff') end end diff --git a/app/jobs/sponsorship_welcome_job.rb b/app/jobs/sponsorship_welcome_job.rb index 99cc633..2bb1b36 100644 --- a/app/jobs/sponsorship_welcome_job.rb +++ b/app/jobs/sponsorship_welcome_job.rb @@ -14,5 +14,7 @@ def perform(sponsorship) SlackWebhookJob.perform_now( { text: ":tamago: *New sponsorship* (#{sponsorship.plan_name || '*OTHER*'}): #{sponsorship.name} <#{conference_sponsorship_url(sponsorship.conference, sponsorship)}|Open>" }, ) + + # EnsureSponsorshipTitoDiscountCodeJob.perform_later(sponsorship, 'attendee') end end diff --git a/config/environments/development.rb b/config/environments/development.rb index 9e947ab..19015ff 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -104,4 +104,6 @@ config.x.mailgun.api_key = ENV['MAILGUN_API_KEY'] config.x.sentry.dsn = ENV['SENTRY_DSN'] + + config.x.tito.token = ENV['TITO_API_TOKEN'] end diff --git a/config/environments/production.rb b/config/environments/production.rb index 3b3bcca..f539c55 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -14,6 +14,8 @@ config.x.github.app_id = ENV.fetch('GITHUB_APP_ID') config.x.github.private_key = OpenSSL::PKey::RSA.new(ENV.fetch('GITHUB_CLIENT_PRIVATE_KEY').unpack1('m*'), '') + config.x.tito.token = ENV.fetch('TITO_API_TOKEN') + config.x.slack.webhook_urls = { default: ENV.fetch('SLACK_WEBHOOK_URL'), feed: ENV.fetch('SLACK_WEBHOOK_URL_FOR_FEED', ENV.fetch('SLACK_WEBHOOK_URL')),