diff --git a/app/controllers/registrar/domains_controller.rb b/app/controllers/registrar/domains_controller.rb
index 5bf1a51f5..3e721666b 100644
--- a/app/controllers/registrar/domains_controller.rb
+++ b/app/controllers/registrar/domains_controller.rb
@@ -59,6 +59,7 @@ class Registrar
def info
authorize! :info, Depp::Domain
@data = @domain.info(params[:domain_name]) if params[:domain_name]
+ @client_holded = client_holded(@data)
if response_ok?
render 'info'
else
@@ -153,12 +154,26 @@ class Registrar
render json: scope.pluck(:name, :code).map { |c| { display_key: "#{c.second} #{c.first}", value: c.second } }
end
+ def remove_hold
+ authorize! :remove_hold, Depp::Domain
+ return unless params[:domain_name]
+
+ @data = @domain.remove_hold(params)
+
+ flash[:alert] = @data.css('msg').text unless response_ok?
+ redirect_to info_registrar_domains_url(domain_name: params[:domain_name])
+ end
+
private
def init_domain
@domain = Depp::Domain.new(current_user: depp_current_user)
end
+ def client_holded(data)
+ data.css('status')&.map { |element| element.attribute('s').value }
+ &.any? { |status| status == DomainStatus::CLIENT_HOLD }
+ end
def contacts
current_registrar_user.registrar.contacts
diff --git a/app/models/ability.rb b/app/models/ability.rb
index 9a0676ac8..a727254ad 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -50,6 +50,7 @@ class Ability
can(:check, Epp::Domain)
can(:create, Epp::Domain)
can(:renew, Epp::Domain) { |d| d.registrar_id == @user.registrar_id }
+ can(:remove_hold, Epp::Domain) { |d| d.registrar_id == @user.registrar_id }
can(:update, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || d.transfer_code == pw }
can(:transfer, Epp::Domain)
can(:delete, Epp::Domain) { |d, pw| d.registrar_id == @user.registrar_id || d.transfer_code == pw }
diff --git a/app/models/concerns/remove_hold.rb b/app/models/concerns/remove_hold.rb
new file mode 100644
index 000000000..1da3b5a7f
--- /dev/null
+++ b/app/models/concerns/remove_hold.rb
@@ -0,0 +1,9 @@
+module RemoveHold
+ extend ActiveSupport::Concern
+
+ def remove_hold(params)
+ xml = epp_xml.update(name: { value: params[:domain_name] },
+ rem: [status: { attrs: { s: 'clientHold' }, value: '' }])
+ current_user.request(xml)
+ end
+end
diff --git a/app/models/depp/domain.rb b/app/models/depp/domain.rb
index e2413a004..3bb3b7473 100644
--- a/app/models/depp/domain.rb
+++ b/app/models/depp/domain.rb
@@ -1,6 +1,7 @@
module Depp
class Domain
include ActiveModel::Conversion
+ include RemoveHold
extend ActiveModel::Naming
attr_accessor :name, :current_user, :epp_xml
diff --git a/app/views/registrar/domains/info.html.erb b/app/views/registrar/domains/info.html.erb
index 1fcfc23c3..e88882233 100644
--- a/app/views/registrar/domains/info.html.erb
+++ b/app/views/registrar/domains/info.html.erb
@@ -6,6 +6,10 @@
class: 'btn btn-default') %>
<%= link_to(t(:delete), delete_registrar_domains_path(domain_name: params[:domain_name]),
class: 'btn btn-default') %>
+ <% if @client_holded %>
+ <%= link_to(t(:remove_client_hold), remove_hold_registrar_domains_path(domain_name: params[:domain_name]),
+ class: 'btn btn-default') %>
+ <% end %>
<% else %>
<%= link_to t('.transfer_btn'), new_registrar_domain_transfer_path(domain_name: params[:domain_name]),
class: 'btn btn-default' %>
diff --git a/app/views/registrar/xml_consoles/epp_requests/domain/client_hold.xml b/app/views/registrar/xml_consoles/epp_requests/domain/client_hold.xml
new file mode 100644
index 000000000..fcafec538
--- /dev/null
+++ b/app/views/registrar/xml_consoles/epp_requests/domain/client_hold.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ example.ee
+
+
+
+
+
+ timo-1579351654
+
+
diff --git a/app/views/registrar/xml_consoles/show.haml b/app/views/registrar/xml_consoles/show.haml
index f96b67738..bb66116ee 100644
--- a/app/views/registrar/xml_consoles/show.haml
+++ b/app/views/registrar/xml_consoles/show.haml
@@ -29,6 +29,9 @@
,
%a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'domain', epp_action: 'delete'}}
Delete
+ ,
+ %a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'domain', epp_action: 'client_hold'}}
+ Remove Client Hold
%h4 Poll
%a.js-load-xml{href: 'javascript:void(0)', data: {obj: 'poll', epp_action: 'poll'}}
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 74040fe98..cf72b1027 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -206,6 +206,7 @@ en:
statuses: 'Statuses'
description: 'Description'
delete: 'Delete'
+ remove_client_hold: 'Remove clientHold'
are_you_sure: 'Are you sure?'
back: 'Back'
new_domain: 'New domain'
@@ -580,6 +581,7 @@ en:
tech: Tech contact
valid: Valid
object_is_not_eligible_for_renewal: 'Object is not eligible for renewal'
+ object_is_not_holded: 'Object is not holded'
bank_statement_desc: 'Import file row will match only when matching following attributes:
ref number
payment amount
invoice number (the first numerical value in comment field).'
create_bank_statement: 'Create bank statement'
create_bank_transaction: 'Create bank transaction'
diff --git a/config/routes.rb b/config/routes.rb
index 135fe8eb0..8315e78ce 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -99,6 +99,7 @@ Rails.application.routes.draw do
get 'check'
get 'delete'
get 'search_contacts'
+ get 'remove_hold'
end
end
resources :domain_transfers, only: %i[new create]