diff --git a/app/controllers/registrar/bulk_change_controller.rb b/app/controllers/registrar/bulk_change_controller.rb index 7a882c950..60bde9b6f 100644 --- a/app/controllers/registrar/bulk_change_controller.rb +++ b/app/controllers/registrar/bulk_change_controller.rb @@ -16,8 +16,12 @@ class Registrar if domain_ids_for_bulk_renew.present? domains = Epp::Domain.where(id: domain_ids_for_bulk_renew).to_a - task = Domains::BulkRenew::Start.run(domains: domains) - flash[:notice] = t(:bulk_renew_completed) + task = Domains::BulkRenew::Start.run(domains: domains, period_element: @period) + if task.valid? + flash[:notice] = t(:bulk_renew_completed) + else + flash[:notice] = task.errors.full_messages.join(' and ') + end end render file: 'registrar/bulk_change/new', locals: { active_tab: :bulk_renew } end diff --git a/app/interactions/domains/bulk_renew/start.rb b/app/interactions/domains/bulk_renew/start.rb index 725f6245f..e00e7e984 100644 --- a/app/interactions/domains/bulk_renew/start.rb +++ b/app/interactions/domains/bulk_renew/start.rb @@ -4,9 +4,18 @@ module Domains array :domains do object class: Epp::Domain end + string :period_element def execute - + period = (period_element.to_i == 0) ? 1 : period_element.to_i + unit = period_element[-1] || 'y' + task = Domains::CheckBalance::Mass.run(domains: domains, + operation: 'renew', + period: period, + unit: unit) + unless task.valid? + errors.merge!(task.errors) + end end end end diff --git a/app/interactions/domains/check_balance/mass.rb b/app/interactions/domains/check_balance/mass.rb new file mode 100644 index 000000000..68dee0019 --- /dev/null +++ b/app/interactions/domains/check_balance/mass.rb @@ -0,0 +1,23 @@ +module Domains + module CheckBalance + class Mass < ActiveInteraction::Base + array :domains do + object class: Epp::Domain + end + + string :operation + integer :period + string :unit + + def execute + domains.each do |domain| + compose(Domains::CheckBalance::SingleDomain, + domain: domain, + operation: 'renew', + period: period, + unit: unit) + end + end + end + end +end diff --git a/app/interactions/domains/check_balance/single_domain.rb b/app/interactions/domains/check_balance/single_domain.rb new file mode 100644 index 000000000..a9e7f0e1a --- /dev/null +++ b/app/interactions/domains/check_balance/single_domain.rb @@ -0,0 +1,26 @@ +module Domains + module CheckBalance + class SingleDomain < ActiveInteraction::Base + object :domain, + class: Epp::Domain + + string :operation + integer :period + string :unit + + def execute + domain_pricelist = domain.pricelist(operation, period.try(:to_i), unit) + if domain_pricelist.try(:price) # checking if price list is not found + if current_user.registrar.balance < domain_pricelist.price.amount + errors.add(:domain, I18n.t('billing_failure_credit_balance_low_for_domain', domain: domain.name)) + return false + end + else + errors.add(:domain, I18n.t(:active_price_missing_for_operation_with_domain, domain: domain.name)) + return false + end + true + end + end + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 788030456..2470062ab 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -588,6 +588,7 @@ en: create_bank_transaction: 'Create bank transaction' create_new_invoice: 'Create new invoice' billing_failure_credit_balance_low: 'Billing failure - credit balance low' + billing_failure_credit_balance_low_for_domain: 'Billing failure - credit balance low for %{domain}' create: 'Create' activity_type: 'Activity type' receipt_date_from: 'Receipt date from' @@ -602,6 +603,7 @@ en: notes: Notes active_price_for_this_operation_is: 'Active price for this operation is %{price}' active_price_missing_for_this_operation: 'Active price missing for this operation!' + active_price_missing_for_operation_with_domain: 'Active price missing for operation with %{domain}' valid_to_from: 'Valid to from' valid_to_until: 'Valid to until' registrant_ident: 'Registrant ident'