From 0fd682c6b94f4269939784ecad5281fc8ad1b0cc Mon Sep 17 00:00:00 2001 From: Stas Date: Wed, 9 Dec 2015 14:00:31 +0200 Subject: [PATCH 01/41] 107279984-credit_balance_views --- app/controllers/admin/registrars_controller.rb | 2 +- app/views/admin/account_activities/index.haml | 9 +++++++++ app/views/admin/registrars/index.haml | 7 +++++-- app/views/admin/registrars/show.haml | 3 +++ config/locales/en.yml | 1 + 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/controllers/admin/registrars_controller.rb b/app/controllers/admin/registrars_controller.rb index c0d28908f..cf8c89505 100644 --- a/app/controllers/admin/registrars_controller.rb +++ b/app/controllers/admin/registrars_controller.rb @@ -6,7 +6,7 @@ class Admin::RegistrarsController < AdminController end def index - @q = Registrar.ordered.search(params[:q]) + @q = Registrar.joins(:accounts).ordered.search(params[:q]) @registrars = @q.result.page(params[:page]) end diff --git a/app/views/admin/account_activities/index.haml b/app/views/admin/account_activities/index.haml index 35e270dce..521ebf84c 100644 --- a/app/views/admin/account_activities/index.haml +++ b/app/views/admin/account_activities/index.haml @@ -55,6 +55,7 @@ %th{class: 'col-xs-2'} = sort_link(@q, 'sum') %tbody + -total = 0 - @account_activities.each do |x| %tr %td= link_to(x.account.registrar.try(:code), admin_registrar_path(x.account.registrar)) @@ -63,7 +64,15 @@ %td= l(x.created_at) - c = x.sum > 0.0 ? 'text-success' : 'text-danger' - s = x.sum > 0.0 ? "+#{x.sum} #{x.currency}" : "#{x.sum} #{x.currency}" + -total += x.sum %td{class: c}= s + - if @account_activities.count > 0 + %tr + %td + %td + %td + %td{class: 'text-right'}= t(:total) + %td{class: 'text-success'}= total > 0 ? "+#{total} EUR" : "#{total} EUR" .row .col-md-12 = paginate @account_activities diff --git a/app/views/admin/registrars/index.haml b/app/views/admin/registrars/index.haml index a2604dbec..8ba45d205 100644 --- a/app/views/admin/registrars/index.haml +++ b/app/views/admin/registrars/index.haml @@ -8,15 +8,18 @@ %table.table.table-hover.table-bordered.table-condensed %thead %tr - %th{class: 'col-xs-6'} + %th{class: 'col-xs-4'} = sort_link(@q, 'name') - %th{class: 'col-xs-6'} + %th{class: 'col-xs-4'} = sort_link(@q, 'reg_no', t(:reg_no)) + %th{class: 'col-xs-4'} + = t(:credit_balance) %tbody - @registrars.each do |x| %tr %td= link_to(x, [:admin, x]) %td= x.reg_no + %td= "#{x.balance}" .row .col-md-12 = paginate @registrars diff --git a/app/views/admin/registrars/show.haml b/app/views/admin/registrars/show.haml index e3966583f..35938c0c6 100644 --- a/app/views/admin/registrars/show.haml +++ b/app/views/admin/registrars/show.haml @@ -32,6 +32,9 @@ %dt= t(:id) %dd= @registrar.code + %dt= t(:credit_balance) + %dd= @registrar.balance + .col-md-6 .panel.panel-default .panel-heading diff --git a/config/locales/en.yml b/config/locales/en.yml index 07f4ebc0a..07b8cde24 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -351,6 +351,7 @@ en: status: 'Status' eedirekt: 'EEDirekt' contact: 'Contact' + credit_balance: 'Credit balance' domain_transfer_requested: 'Domain transfer requested!' domain_transfer_approved: 'Domain transfer approved!' From 9ac1e8c933b95cb7f638365d09512ab22137e678 Mon Sep 17 00:00:00 2001 From: Matt Farnsworth Date: Thu, 17 Dec 2015 11:27:06 +0200 Subject: [PATCH 02/41] Story #110211760 - ensure that upDate is not shown when domain has not changed since creation --- app/views/epp/contacts/info.xml.builder | 2 +- app/views/epp/domains/info.xml.builder | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/epp/contacts/info.xml.builder b/app/views/epp/contacts/info.xml.builder index 39aa91b39..fe851a6d9 100644 --- a/app/views/epp/contacts/info.xml.builder +++ b/app/views/epp/contacts/info.xml.builder @@ -51,7 +51,7 @@ xml.epp_head do xml.tag!('contact:crID', @contact.cr_id) xml.tag!('contact:crDate', @contact.created_at.try(:iso8601)) - if @contact.updated_at != @contact.created_at + if @contact.updated_at > @contact.created_at upID = @contact.updator.try(:registrar) upID = upID.code if upID.present? # Did updator return a kind of User that has a registrar? xml.tag!('contact:upID', upID) if upID.present? # optional upID diff --git a/app/views/epp/domains/info.xml.builder b/app/views/epp/domains/info.xml.builder index ec5947b13..ef283ab07 100644 --- a/app/views/epp/domains/info.xml.builder +++ b/app/views/epp/domains/info.xml.builder @@ -41,7 +41,7 @@ xml.epp_head do xml.tag!('domain:crID', @domain.cr_id) xml.tag!('domain:crDate', @domain.created_at.try(:iso8601)) - if @domain.updated_at != @domain.created_at + if @domain.updated_at > @domain.created_at upID = @domain.updator.try(:registrar) upID = upID.code if upID.present? # Did updator return a kind of User that has a registrar? xml.tag!('domain:upID', upID) if upID.present? # optional upID From 6909f3d0ef19be4a05cbd26476a4b0d838536404 Mon Sep 17 00:00:00 2001 From: Stas Date: Fri, 18 Dec 2015 13:30:51 +0200 Subject: [PATCH 03/41] 10729984-starting_balance --- app/controllers/admin/account_activities_controller.rb | 1 + app/views/admin/account_activities/index.haml | 7 +++++++ config/locales/en.yml | 1 + 3 files changed, 9 insertions(+) diff --git a/app/controllers/admin/account_activities_controller.rb b/app/controllers/admin/account_activities_controller.rb index 1c447d8a6..640acf2e7 100644 --- a/app/controllers/admin/account_activities_controller.rb +++ b/app/controllers/admin/account_activities_controller.rb @@ -14,6 +14,7 @@ class Admin::AccountActivitiesController < AdminController @q = AccountActivity.includes(:invoice, account: :registrar).search(params[:q]) @q.sorts = 'id desc' if @q.sorts.empty? + @b = AccountActivity.where.not(id: @q.result.map(&:id)) respond_to do |format| format.html { @account_activities = @q.result.page(params[:page]) } diff --git a/app/views/admin/account_activities/index.haml b/app/views/admin/account_activities/index.haml index 521ebf84c..6efefb814 100644 --- a/app/views/admin/account_activities/index.haml +++ b/app/views/admin/account_activities/index.haml @@ -36,6 +36,13 @@   %button.btn.btn-default.js-reset-form = t(:clear_fields) +.row + .col-md-3 + .col-md-3 + .col-md-2 + .col-md-4{class: 'text-right'} + = t(:starting_balance) + " #{@b.sum('sum').to_f} EUR" + %hr .row diff --git a/config/locales/en.yml b/config/locales/en.yml index 07b8cde24..fbfc09780 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -352,6 +352,7 @@ en: eedirekt: 'EEDirekt' contact: 'Contact' credit_balance: 'Credit balance' + starting_balance: 'Starting balance' domain_transfer_requested: 'Domain transfer requested!' domain_transfer_approved: 'Domain transfer approved!' From f46c7f554397584b12b4d97fa07865891ddfdc7a Mon Sep 17 00:00:00 2001 From: Stas Date: Mon, 4 Jan 2016 16:35:02 +0200 Subject: [PATCH 04/41] 110152326-is_registrant_filter_modification --- app/controllers/admin/contacts_controller.rb | 10 ++++++++-- app/views/admin/contacts/index.haml | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index a1df165d2..50131066f 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -4,7 +4,13 @@ class Admin::ContactsController < AdminController def index params[:q] ||= {} - @q = Contact.includes(:registrar).search(params[:q]) + search_params = params[:q].deep_dup + + if search_params[:domain_contacts_type_in].is_a?(Array) && search_params[:domain_contacts_type_in].delete('registrant') + search_params[:registrant_domains_id_not_null] = 1 + end + + @q = Contact.includes(:registrar).search(search_params) @contacts = @q.result.page(params[:page]) if params[:statuses_contains] @@ -16,7 +22,7 @@ class Admin::ContactsController < AdminController end normalize_search_parameters do - @q = contacts.search(params[:q]) + @q = contacts.search(search_params) @contacts = @q.result.page(params[:page]) end diff --git a/app/views/admin/contacts/index.haml b/app/views/admin/contacts/index.haml index b8e7850e6..c200dac02 100644 --- a/app/views/admin/contacts/index.haml +++ b/app/views/admin/contacts/index.haml @@ -37,7 +37,7 @@ .col-md-3 .form-group = label_tag t(:contact_type) - = select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } + = select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact'], ['registrant', 'registrant']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } .row .col-md-3 .form-group From f3d22e0145d2b1f46fc21286685ff1db8f7d75d6 Mon Sep 17 00:00:00 2001 From: Stas Date: Tue, 5 Jan 2016 14:41:09 +0200 Subject: [PATCH 05/41] 110152326-registrar_portal_filter --- app/controllers/registrar/contacts_controller.rb | 13 ++++++++++--- app/views/admin/contacts/index.haml | 7 +------ app/views/registrar/contacts/index.haml | 9 ++------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/app/controllers/registrar/contacts_controller.rb b/app/controllers/registrar/contacts_controller.rb index 878e29cd2..c0b814993 100644 --- a/app/controllers/registrar/contacts_controller.rb +++ b/app/controllers/registrar/contacts_controller.rb @@ -6,8 +6,15 @@ class Registrar::ContactsController < Registrar::DeppController # EPP controller params[:q] ||= {} params[:q].delete_if { |_k, v| v.blank? } - if params[:q].length == 1 && params[:q][:name_matches].present? - @contacts = Contact.find_by(name: params[:q][:name_matches]) + + search_params = params[:q].deep_dup + + if search_params[:domain_contacts_type_in].is_a?(Array) && search_params[:domain_contacts_type_in].delete('registrant') + search_params[:registrant_domains_id_not_null] = 1 + end + + if search_params.length == 1 && search_params[:name_matches].present? + @contacts = Contact.find_by(name: search_params[:name_matches]) end if params[:statuses_contains] @@ -19,7 +26,7 @@ class Registrar::ContactsController < Registrar::DeppController # EPP controller end normalize_search_parameters do - @q = contacts.search(params[:q]) + @q = contacts.search(search_params) @contacts = @q.result.page(params[:page]) end diff --git a/app/views/admin/contacts/index.haml b/app/views/admin/contacts/index.haml index c200dac02..715b87eb6 100644 --- a/app/views/admin/contacts/index.haml +++ b/app/views/admin/contacts/index.haml @@ -29,12 +29,7 @@ .form-group = label_tag t(:country) = select_tag '[q][country_code_eq]', SortedCountry.all_options(params[:q][:country_code_eq]), { include_blank: true, placeholder: t(:choose), class: 'form-control selectize' } - .col-md-3 - .form-group - = f.label t(:is_registrant) - %div - = f.check_box :registrant_domains_id_not_null - .col-md-3 + .col-md-6 .form-group = label_tag t(:contact_type) = select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact'], ['registrant', 'registrant']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } diff --git a/app/views/registrar/contacts/index.haml b/app/views/registrar/contacts/index.haml index ae93a82fd..2226f7c6a 100644 --- a/app/views/registrar/contacts/index.haml +++ b/app/views/registrar/contacts/index.haml @@ -31,15 +31,10 @@ .form-group = label_tag t(:country) = select_tag '[q][country_code_eq]', SortedCountry.all_options(params[:q][:country_code_eq]), { include_blank: true, placeholder: t(:choose), class: 'form-control selectize' } - .col-md-3 - .form-group - = f.label t(:is_registrant) - %div - = f.check_box :registrant_domains_id_not_null - .col-md-3 + .col-md-6 .form-group = label_tag t(:contact_type) - = select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } + = select_tag '[q][domain_contacts_type_in]', options_for_select([['admin', 'AdminDomainContact'], ['tech', 'TechDomainContact'], ['registrant', 'registrant']], params[:q][:domain_contacts_type_in]), { multiple: true, placeholder: t(:choose), class: 'form-control js-combobox' } .row .col-md-3 .form-group From 0c36b3045acf8357778833d21f4d8635006ae55d Mon Sep 17 00:00:00 2001 From: Stas Date: Tue, 5 Jan 2016 16:22:06 +0200 Subject: [PATCH 06/41] 111055076-callback_added --- app/models/invoice.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/invoice.rb b/app/models/invoice.rb index 2f54e2287..fdcb3cf61 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -19,6 +19,8 @@ class Invoice < ActiveRecord::Base before_create :set_invoice_number, :check_vat + before_save :check_vat + def set_invoice_number last_no = Invoice.order(number: :desc).where('number IS NOT NULL').limit(1).pluck(:number).first From cbe0193cbfb1dbdba5085d8041ac906993be6315 Mon Sep 17 00:00:00 2001 From: Stas Date: Tue, 5 Jan 2016 17:57:56 +0200 Subject: [PATCH 07/41] 107279984-balance_fix --- app/controllers/admin/account_activities_controller.rb | 8 +++++++- app/views/admin/account_activities/index.haml | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/controllers/admin/account_activities_controller.rb b/app/controllers/admin/account_activities_controller.rb index 640acf2e7..bb5b72df8 100644 --- a/app/controllers/admin/account_activities_controller.rb +++ b/app/controllers/admin/account_activities_controller.rb @@ -12,9 +12,15 @@ class Admin::AccountActivitiesController < AdminController logger.warn('Invalid date') end + balance_params = params[:q].deep_dup + + if balance_params[:created_at_gteq] + balance_params.delete('created_at_gteq') + end + @q = AccountActivity.includes(:invoice, account: :registrar).search(params[:q]) @q.sorts = 'id desc' if @q.sorts.empty? - @b = AccountActivity.where.not(id: @q.result.map(&:id)) + @b = AccountActivity.search(balance_params).result.where.not(id: @q.result.map(&:id)) respond_to do |format| format.html { @account_activities = @q.result.page(params[:page]) } diff --git a/app/views/admin/account_activities/index.haml b/app/views/admin/account_activities/index.haml index 6efefb814..4999fd558 100644 --- a/app/views/admin/account_activities/index.haml +++ b/app/views/admin/account_activities/index.haml @@ -62,7 +62,7 @@ %th{class: 'col-xs-2'} = sort_link(@q, 'sum') %tbody - -total = 0 + -total = @b.sum('sum').to_f - @account_activities.each do |x| %tr %td= link_to(x.account.registrar.try(:code), admin_registrar_path(x.account.registrar)) @@ -79,7 +79,7 @@ %td %td %td{class: 'text-right'}= t(:total) - %td{class: 'text-success'}= total > 0 ? "+#{total} EUR" : "#{total} EUR" + %td{class: total > 0 ? 'text-success' : 'text-danger'}= total > 0 ? "+#{total} EUR" : "#{total} EUR" .row .col-md-12 = paginate @account_activities From c0f9a0105eb32bdc5a86123fe875b064bc2e7144 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Wed, 6 Jan 2016 17:30:05 +0200 Subject: [PATCH 08/41] Story#111065230 - send expiration_reminder Mail 2 days after --- app/mailers/domain_mailer.rb | 4 ++-- app/models/domain.rb | 2 +- app/views/admin/settings/index.haml | 1 + config/initializers/initial_settings.rb | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/mailers/domain_mailer.rb b/app/mailers/domain_mailer.rb index 66533e316..443ac6fa9 100644 --- a/app/mailers/domain_mailer.rb +++ b/app/mailers/domain_mailer.rb @@ -97,8 +97,8 @@ class DomainMailer < ApplicationMailer def expiration_reminder(domain_id) @domain = Domain.find_by(id: domain_id) - return unless @domain - return if whitelist_blocked?(@domain.registrant.email) + return if @domain.nil? || !@domain.statuses.include?(DomainStatus::EXPIRED) || whitelist_blocked?(@domain.registrant.email) + mail(to: format(@domain.registrant.email), subject: "#{I18n.t(:expiration_remind_subject, name: @domain.name)} [#{@domain.name}]") diff --git a/app/models/domain.rb b/app/models/domain.rb index 05ffafc4d..ca819783b 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -264,7 +264,7 @@ class Domain < ActiveRecord::Base domains.each do |domain| next unless domain.expirable? domain.set_graceful_expired - DomainMailer.expiration_reminder(domain.id).deliver + DomainMailer.expiration_reminder(domain.id).deliver_in(Setting.redemption_grace_period.days) STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? domain.save end diff --git a/app/views/admin/settings/index.haml b/app/views/admin/settings/index.haml index ede30e979..f03ca66bc 100644 --- a/app/views/admin/settings/index.haml +++ b/app/views/admin/settings/index.haml @@ -36,6 +36,7 @@ = render 'setting_row', var: :days_to_renew_domain_before_expire = render 'setting_row', var: :expire_warning_period = render 'setting_row', var: :redemption_grace_period + = render 'setting_row', var: :expiration_reminder_mail .panel.panel-default .panel-heading.clearfix diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb index 812641a09..193d179b0 100644 --- a/config/initializers/initial_settings.rb +++ b/config/initializers/initial_settings.rb @@ -37,6 +37,7 @@ if con.present? && con.table_exists?('settings') Setting.save_default(:days_to_renew_domain_before_expire, 90) Setting.save_default(:expire_warning_period, 15) Setting.save_default(:redemption_grace_period, 30) + Setting.save_default(:expiration_reminder_mail, 2) Setting.save_default(:registrar_ip_whitelist_enabled, true) Setting.save_default(:api_ip_whitelist_enabled, true) From 6b3bfe01d2e8bd6ec8049c1b3e13fbc53c7e0df8 Mon Sep 17 00:00:00 2001 From: Stas Date: Thu, 7 Jan 2016 18:06:43 +0200 Subject: [PATCH 09/41] 111068693-date_cfg_change --- config/locales/en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 893fe5665..91a3361b1 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -21,7 +21,7 @@ en: default: "%d. %B %Y, %H:%M" longer: "%a, %e. %b %Y, %H:%M" long: "%A, %e. %B %Y, %H:%M" - short: "%d.%m.%y, %H:%M" + short: "%d.%m.%y" shorts: "%d.%m.%y, %H:%M:%S" date: "%d.%m.%y" date_long: "%d. %B %Y" From 74ee6b3e8c88c7d930ee68f6444f83f60e82536f Mon Sep 17 00:00:00 2001 From: Stas Date: Thu, 7 Jan 2016 19:08:49 +0200 Subject: [PATCH 10/41] 111068694-template_changes --- .../mailers/domain_mailer/expiration_reminder.html.erb | 6 +++--- .../mailers/domain_mailer/expiration_reminder.text.erb | 6 +++--- app/views/mailers/domain_mailer/force_delete.html.erb | 6 +++--- app/views/mailers/domain_mailer/force_delete.text.erb | 6 +++--- config/locales/en.yml | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/views/mailers/domain_mailer/expiration_reminder.html.erb b/app/views/mailers/domain_mailer/expiration_reminder.html.erb index 59f02c510..e29ca826e 100644 --- a/app/views/mailers/domain_mailer/expiration_reminder.html.erb +++ b/app/views/mailers/domain_mailer/expiration_reminder.html.erb @@ -1,7 +1,7 @@ Domeen <%= @domain.name %> on aegunud
Lugupeetud .ee domeeni kasutaja

-Domeeninimi <%= @domain.name %> on aegunud ja ei ole alates <%= l(@domain.outzone_at, format: :short) %> internetis kättesaadav. Alates <%= l(@domain.delete_at, format: :short) %> on domeen <%= @domain.name %> avatud registreerimiseks kõigile huvilistele. +Domeeninimi <%= @domain.name %> on aegunud ja ei ole alates <%= l(@domain.outzone_at, format: :date) %> internetis kättesaadav. Alates <%= l(@domain.delete_at, format: :date) %> on domeen <%= @domain.name %> avatud registreerimiseks kõigile huvilistele.

Domeeni registreeringu pikendamiseks pöörduge palun oma registripidaja <%= @domain.registrar.name %> poole. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad.

@@ -27,7 +27,7 @@ Tel: +372 727 1000
The <%= @domain.name %> domain has expired
Dear user of .ee domain,

-The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :short) %>. From <%= l(@domain.delete_at, format: :short) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis. +The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :date) %>. From <%= l(@domain.delete_at, format: :date) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis.

To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://www.internet.ee/en/registripidajad/.

@@ -53,7 +53,7 @@ Phone: +372 727 1000
Домен <%= @domain.name %> устарел
Уважаемый пользователь домена .ee

-Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :short) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :short) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served". +Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :date) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :date) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served".

Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/.

diff --git a/app/views/mailers/domain_mailer/expiration_reminder.text.erb b/app/views/mailers/domain_mailer/expiration_reminder.text.erb index 988ae5e10..d16682ea5 100644 --- a/app/views/mailers/domain_mailer/expiration_reminder.text.erb +++ b/app/views/mailers/domain_mailer/expiration_reminder.text.erb @@ -1,7 +1,7 @@ Domeen <%= @domain.name %> on aegunud Lugupeetud .ee domeeni kasutaja -Domeeninimi <%= @domain.name %> on aegunud ja ei ole alates <%= l(@domain.outzone_at, format: :short) %> internetis kättesaadav. Alates <%= l(@domain.delete_at, format: :short) %> on domeen <%= @domain.name %> avatud registreerimiseks kõigile huvilistele. +Domeeninimi <%= @domain.name %> on aegunud ja ei ole alates <%= l(@domain.outzone_at, format: :date) %> internetis kättesaadav. Alates <%= l(@domain.delete_at, format: :date) %> on domeen <%= @domain.name %> avatud registreerimiseks kõigile huvilistele. Domeeni registreeringu pikendamiseks pöörduge palun oma registripidaja <%= @domain.registrar.name %> poole. Registripidajate kontaktid leiate aadressilt www.internet.ee/registripidajad. @@ -27,7 +27,7 @@ Tel: +372 727 1000 The <%= @domain.name %> domain has expired Dear user of .ee domain, -The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :short) %>. From <%= l(@domain.delete_at, format: :short) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis. +The domain name <%= @domain.name %> has expired and will not be available on the Internet from <%= l(@domain.outzone_at, format: :date) %>. From <%= l(@domain.delete_at, format: :date) %>, the <%= @domain.name %> domain will be available for registration on a first come first served basis. To renew the domain registration, please contact your registrar <%= @domain.registrar.name %>. You can find the registrar's contacts at http://www.internet.ee/en/registripidajad/. @@ -53,7 +53,7 @@ Phone: +372 727 1000 Домен <%= @domain.name %> устарел Уважаемый пользователь домена .ee -Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :short) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :short) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served". +Доменное имя <%= @domain.name %> устарело и с <%= l(@domain.outzone_at, format: :date) %> недоступно в Интернете. С <%= l(@domain.delete_at, format: :date) %> домен <%= @domain.name %> доступен для регистрации всем желающим по принципу "first come, first served". Для продления регистрации домена просим обратиться к своему регистратору <%= @domain.registrar.name %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/ru/p/. diff --git a/app/views/mailers/domain_mailer/force_delete.html.erb b/app/views/mailers/domain_mailer/force_delete.html.erb index 82bdee156..6f4f4cb27 100644 --- a/app/views/mailers/domain_mailer/force_delete.html.erb +++ b/app/views/mailers/domain_mailer/force_delete.html.erb @@ -20,7 +20,7 @@ Registrikood: <%= @domain.registrant.try(:ident) %>

Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes õigust omaval registreerijal võimalus esitada domeeni <%= @domain.name %> registripidajale <%= @domain.registrar %> domeeni üleandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist tõendavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 sätestatud üleandva registreerija nõusolekut. Vastav dokumentatsioon tuleks esitada Registripidajale esimesel võimalusel.

-

Kui üleandmine ei ole 30 päeva jooksul toimunud, kustub domeen <%= @domain.name %> 24 tunni jooksul <%= l(@domain.force_delete_at, format: :short) %> möödumisest juhuslikult valitud ajahetkel. Soovi korral on võimalik domeen pärast selle kustumist registrist “kes ees, see mees” põhimõttel uuesti registreerida.

+

Kui üleandmine ei ole 30 päeva jooksul toimunud, kustub domeen <%= @domain.name %> 24 tunni jooksul <%= l(@domain.force_delete_at, format: :date) %> möödumisest juhuslikult valitud ajahetkel. Soovi korral on võimalik domeen pärast selle kustumist registrist “kes ees, see mees” põhimõttel uuesti registreerida.

Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt http://www.internet.ee/registripidajad



@@ -39,7 +39,7 @@ Registry code: <%= @domain.registrant.try(:ident) %>

According to paragraph 6.4 of the Domain Regulation, the registrant holding a right to the domain name <%= @domain.name %> can submit a domain name transfer application to the registrar <%= @domain.registrar %> in accordance with paragraph 5.3.6.2 of the Domain Regulation. The application must be submitted together with documents certifying the acquisition of the domain that will replace the consent of the surrendering registrant as laid down in paragraph 5.3.6.3 of the Domain Regulation. The relevant documents should be submitted to the registrar as soon as possible.

-

If the transfer has not been made in 30 days, the domain <%= @domain.name %> will be deleted at a randomly chosen moment within 24 hours after <%= l(@domain.force_delete_at, format: :short) %>. After deletion it is possible to reregister the domain on a "first come, first served" basis.

+

If the transfer has not been made in 30 days, the domain <%= @domain.name %> will be deleted at a randomly chosen moment within 24 hours after <%= l(@domain.force_delete_at, format: :date) %>. After deletion it is possible to reregister the domain on a "first come, first served" basis.

Should you have additional questions, please contact your registrar <%= @domain.registrar %>, whose contact information can be found at http://www.internet.ee/registrars/



@@ -58,7 +58,7 @@ Registry code: <%= @domain.registrant.try(:ident) %>

Согласно пункту 6.4 Правил домена регистрант, имеющий право на домен, может подать регистратору <%= @domain.registrar %> домена <%= @domain.name %> ходатайство о передаче домена в соответствии с п. 5.3.6.2 Правил домена. К ходатайству следует приложить подтверждающие приобретение домена документы, заменяющие в соответствии с пунктом 5.3.6.3 Правил домена согласие передающего доменное имя регистранта. EIS предлагает представить соответствующую документацию Регистратору при первой возможности, начиная с инициирования процедуры удаления.

-

Если в течение 30 дней передача не произошла, домен <%= @domain.name %> удаляется по истечении 24 часов <%= l(@domain.force_delete_at, format: :short) %> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел".

+

Если в течение 30 дней передача не произошла, домен <%= @domain.name %> удаляется по истечении 24 часов <%= l(@domain.force_delete_at, format: :date) %> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел".

Просим обратиться к своему регистратору <%= @domain.registrar %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/registratory/



diff --git a/app/views/mailers/domain_mailer/force_delete.text.erb b/app/views/mailers/domain_mailer/force_delete.text.erb index 527288686..d6369c8cb 100644 --- a/app/views/mailers/domain_mailer/force_delete.text.erb +++ b/app/views/mailers/domain_mailer/force_delete.text.erb @@ -11,7 +11,7 @@ Kuivõrd äriregistrist kustutatud juriidiline isik ei saa olla domeeni registre Domeenireeglite punktist 6.4 tulenevalt on domeeni suhtes õigust omaval registreerijal võimalus esitada domeeni <%= @domain.name %> registripidajale <%= @domain.registrar %> domeeni üleandmise taotlus Domeenireeglite p 5.3.6.2 kohaselt. Taotlusele tuleb lisada domeeni omandamist tõendavad dokumendid, mis asendavad Domeenireeglite punktis 5.3.6.3 sätestatud üleandva registreerija nõusolekut. Vastav dokumentatsioon tuleks esitada Registripidajale esimesel võimalusel. -Kui üleandmine ei ole 30 päeva jooksul toimunud, kustub domeen <%= @domain.name %> 24 tunni jooksul <%= l(@domain.force_delete_at, format: :short) %> möödumisest juhuslikult valitud ajahetkel. Soovi korral on võimalik domeen pärast selle kustumist registrist "kes ees, see mees" põhimõttel uuesti registreerida. +Kui üleandmine ei ole 30 päeva jooksul toimunud, kustub domeen <%= @domain.name %> 24 tunni jooksul <%= l(@domain.force_delete_at, format: :date) %> möödumisest juhuslikult valitud ajahetkel. Soovi korral on võimalik domeen pärast selle kustumist registrist "kes ees, see mees" põhimõttel uuesti registreerida. Lisaküsimuste korral võtke palun ühendust oma registripidajaga <%= @domain.registrar %>, kelle kontaktandmed leiate lingilt http://www.internet.ee/registripidajad/ @@ -30,7 +30,7 @@ As a terminated legal person cannot be the registrant of a domain, the EIF start According to paragraph 6.4 of the Domain Regulation, the registrant holding a right to the domain name <%= @domain.name %> can submit a domain name transfer application to the registrar <%= @domain.registrar %> in accordance with paragraph 5.3.6.2 of the Domain Regulation. The application must be submitted together with documents certifying the acquisition of the domain that will replace the consent of the surrendering registrant as laid down in paragraph 5.3.6.3 of the Domain Regulation. The relevant documents should be submitted to the registrar as soon as possible. -If the transfer has not been made in 30 days, the domain <%= @domain.name %> will be deleted at a randomly chosen moment within 24 hours after <%= l(@domain.force_delete_at, format: :short) %>. After deletion it is possible to reregister the domain on a "first come, first served" basis. +If the transfer has not been made in 30 days, the domain <%= @domain.name %> will be deleted at a randomly chosen moment within 24 hours after <%= l(@domain.force_delete_at, format: :date) %>. After deletion it is possible to reregister the domain on a "first come, first served" basis. Should you have additional questions, please contact your registrar <%= @domain.registrar %>, whose contact information can be found at http://www.internet.ee/registrars/ @@ -49,7 +49,7 @@ EIS стало известно, что юридическое лицо с ре Согласно пункту 6.4 Правил домена регистрант, имеющий право на домен, может подать регистратору <%= @domain.registrar %> домена <%= @domain.name %> ходатайство о передаче домена в соответствии с п. 5.3.6.2 Правил домена. К ходатайству следует приложить подтверждающие приобретение домена документы, заменяющие в соответствии с пунктом 5.3.6.3 Правил домена согласие передающего доменное имя регистранта. EIS предлагает представить соответствующую документацию Регистратору при первой возможности, начиная с инициирования процедуры удаления. -Если в течение 30 дней передача не произошла, домен <%= @domain.name %> удаляется по истечении 24 часов <%= l(@domain.force_delete_at, format: :short) %> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел". +Если в течение 30 дней передача не произошла, домен <%= @domain.name %> удаляется по истечении 24 часов <%= l(@domain.force_delete_at, format: :date) %> в случайный момент времени. По желанию после удаления из регистра домен можно снова зарегистрировать по принципу "кто успел, тот и съел". Просим обратиться к своему регистратору <%= @domain.registrar %>. Контактные данные регистраторов можно найти по адресу http://www.internet.ee/registratory diff --git a/config/locales/en.yml b/config/locales/en.yml index 91a3361b1..893fe5665 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -21,7 +21,7 @@ en: default: "%d. %B %Y, %H:%M" longer: "%a, %e. %b %Y, %H:%M" long: "%A, %e. %B %Y, %H:%M" - short: "%d.%m.%y" + short: "%d.%m.%y, %H:%M" shorts: "%d.%m.%y, %H:%M:%S" date: "%d.%m.%y" date_long: "%d. %B %Y" From b047ce27ca5cb799a2b2efa22c65cdd0a21df2a8 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 11 Jan 2016 12:40:44 +0200 Subject: [PATCH 11/41] Story#111065230 - set whitelist check --- app/mailers/domain_mailer.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/mailers/domain_mailer.rb b/app/mailers/domain_mailer.rb index 443ac6fa9..28e232a8c 100644 --- a/app/mailers/domain_mailer.rb +++ b/app/mailers/domain_mailer.rb @@ -98,6 +98,7 @@ class DomainMailer < ApplicationMailer def expiration_reminder(domain_id) @domain = Domain.find_by(id: domain_id) return if @domain.nil? || !@domain.statuses.include?(DomainStatus::EXPIRED) || whitelist_blocked?(@domain.registrant.email) + return if whitelist_blocked?(@domain.registrant.email) mail(to: format(@domain.registrant.email), subject: "#{I18n.t(:expiration_remind_subject, From a807aba1f4f3f1bc032e049dc598549e365f99ff Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 11 Jan 2016 12:44:32 +0200 Subject: [PATCH 12/41] Story#111065230 - fix typo --- app/models/domain.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index ca819783b..8dace41a9 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -264,7 +264,7 @@ class Domain < ActiveRecord::Base domains.each do |domain| next unless domain.expirable? domain.set_graceful_expired - DomainMailer.expiration_reminder(domain.id).deliver_in(Setting.redemption_grace_period.days) + DomainMailer.expiration_reminder(domain.id).deliver_in(Setting.expiration_reminder_mail.days) STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? domain.save end From 96552a03440cd080eb4a570007a55d57a954505b Mon Sep 17 00:00:00 2001 From: Stas Date: Mon, 11 Jan 2016 15:44:26 +0200 Subject: [PATCH 13/41] 107279984-filter_changes --- .../admin/account_activities_controller.rb | 44 ++++++++++++++++++- app/views/admin/account_activities/index.haml | 10 +++-- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/app/controllers/admin/account_activities_controller.rb b/app/controllers/admin/account_activities_controller.rb index bb5b72df8..1419dbea9 100644 --- a/app/controllers/admin/account_activities_controller.rb +++ b/app/controllers/admin/account_activities_controller.rb @@ -19,11 +19,51 @@ class Admin::AccountActivitiesController < AdminController end @q = AccountActivity.includes(:invoice, account: :registrar).search(params[:q]) + @b = AccountActivity.search(balance_params) @q.sorts = 'id desc' if @q.sorts.empty? - @b = AccountActivity.search(balance_params).result.where.not(id: @q.result.map(&:id)) + + + + @account_activities = @q.result.page(params[:page]).per(params[:results_per_page]) + sort = @account_activities.orders.map(&:to_sql).join(",") + + + if params[:page] && params[:page].to_i > 1 + + + @sum = @q.result.reorder(sort).limit(@account_activities.offset_value) + @b.result.where.not(id: @q.result.map(&:id)) + + else + + @sum = @b.result.where.not(id: @q.result.map(&:id)) + + + end + + + + + + + # throw "cdsfs" + + # if params[:page] && params[:page].to_i > 1 + # + # @b = @q.result.page(params[:page].to_i - 1) + # + # @b = @b.per(params[:results_per_page]) + # + # + # else + # + # @b = AccountActivity.search(balance_params) + # + # @b = @b.result.where.not(id: @q.result.map(&:id)) + # + # end respond_to do |format| - format.html { @account_activities = @q.result.page(params[:page]) } + format.html format.csv do send_data @q.result.to_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" end diff --git a/app/views/admin/account_activities/index.haml b/app/views/admin/account_activities/index.haml index 4999fd558..80ebba2f6 100644 --- a/app/views/admin/account_activities/index.haml +++ b/app/views/admin/account_activities/index.haml @@ -29,7 +29,11 @@ .form-group = f.label t(:receipt_date_until) = f.search_field :created_at_lteq, value: params[:q][:created_at_lteq], class: 'form-control datepicker', placeholder: t(:receipt_date_until), autocomplete: 'off' - .col-md-6{style: 'padding-top: 25px;'} + .col-md-3 + .form-group + = label_tag t(:results_per_page) + = text_field_tag :results_per_page, params[:results_per_page], class: 'form-control', placeholder: t(:results_per_page) + .col-md-3{style: 'padding-top: 25px;'} %button.btn.btn-default.search   %span.glyphicon.glyphicon-search @@ -41,7 +45,7 @@ .col-md-3 .col-md-2 .col-md-4{class: 'text-right'} - = t(:starting_balance) + " #{@b.sum('sum').to_f} EUR" + = t(:starting_balance) + " #{@sum.to_a.map(&:sum).sum.to_f} EUR" %hr @@ -62,7 +66,7 @@ %th{class: 'col-xs-2'} = sort_link(@q, 'sum') %tbody - -total = @b.sum('sum').to_f + -total = @sum.to_a.map(&:sum).sum.to_f - @account_activities.each do |x| %tr %td= link_to(x.account.registrar.try(:code), admin_registrar_path(x.account.registrar)) From c4ead607da38e05f7c17a7bf420fff65fc0b38cd Mon Sep 17 00:00:00 2001 From: Stas Date: Mon, 11 Jan 2016 17:02:35 +0200 Subject: [PATCH 14/41] 107279984-refactor --- .../admin/account_activities_controller.rb | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/app/controllers/admin/account_activities_controller.rb b/app/controllers/admin/account_activities_controller.rb index 1419dbea9..0f095734f 100644 --- a/app/controllers/admin/account_activities_controller.rb +++ b/app/controllers/admin/account_activities_controller.rb @@ -22,46 +22,15 @@ class Admin::AccountActivitiesController < AdminController @b = AccountActivity.search(balance_params) @q.sorts = 'id desc' if @q.sorts.empty? - - @account_activities = @q.result.page(params[:page]).per(params[:results_per_page]) sort = @account_activities.orders.map(&:to_sql).join(",") - if params[:page] && params[:page].to_i > 1 - - @sum = @q.result.reorder(sort).limit(@account_activities.offset_value) + @b.result.where.not(id: @q.result.map(&:id)) - else - @sum = @b.result.where.not(id: @q.result.map(&:id)) - - end - - - - - - # throw "cdsfs" - - # if params[:page] && params[:page].to_i > 1 - # - # @b = @q.result.page(params[:page].to_i - 1) - # - # @b = @b.per(params[:results_per_page]) - # - # - # else - # - # @b = AccountActivity.search(balance_params) - # - # @b = @b.result.where.not(id: @q.result.map(&:id)) - # - # end - respond_to do |format| format.html format.csv do From b28748d667c76ef73e69ae69f2a303d4c195a49d Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 12 Jan 2016 14:06:32 +0200 Subject: [PATCH 15/41] Story#111503520 - couldn't apply pending update as registrar wasn't valid --- app/jobs/domain_update_confirm_job.rb | 7 ++----- app/models/epp/domain.rb | 13 ++++++------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/app/jobs/domain_update_confirm_job.rb b/app/jobs/domain_update_confirm_job.rb index be0ada219..3da95287d 100644 --- a/app/jobs/domain_update_confirm_job.rb +++ b/app/jobs/domain_update_confirm_job.rb @@ -3,19 +3,16 @@ class DomainUpdateConfirmJob < Que::Job # it's recommended to keep transaction against job table as short as possible. ActiveRecord::Base.transaction do domain = Epp::Domain.find(domain_id) + domain.is_admin = true case action when RegistrantVerification::CONFIRMED domain.poll_message!(:poll_pending_update_confirmed_by_registrant) - domain.apply_pending_update! do |e| - e.instance_variable_set("@changed_attributes", e.changed_attributes.merge("statuses"=>[])) - end + domain.apply_pending_update! domain.clean_pendings! - WhoisRecord.find_by(domain_id: domain.id).save when RegistrantVerification::REJECTED domain.send_mail :pending_update_rejected_notification_for_new_registrant domain.poll_message!(:poll_pending_update_rejected_by_registrant) domain.clean_pendings! - domain.instance_variable_set("@changed_attributes", domain.changed_attributes.merge("statuses"=>[])) domain.save end destroy # it's best to destroy the job in the same transaction diff --git a/app/models/epp/domain.rb b/app/models/epp/domain.rb index d84de4ca6..15e16163a 100644 --- a/app/models/epp/domain.rb +++ b/app/models/epp/domain.rb @@ -507,18 +507,17 @@ class Epp::Domain < Domain frame = Nokogiri::XML(pending_json['frame']) self.deliver_emails = true # turn on email delivery - send_mail :registrant_updated_notification_for_old_registrant - - statuses.delete(DomainStatus::PENDING_UPDATE) - yield(self) if block_given? # need to skip statuses check here - self.save - + self.statuses.delete(DomainStatus::PENDING_UPDATE) ::PaperTrail.whodunnit = user.id_role_username # updator str should be the request originator not the approval user + + send_mail :registrant_updated_notification_for_old_registrant return unless update(frame, user, false) clean_pendings! send_mail :registrant_updated_notification_for_new_registrant - update_whois_record + WhoisRecord.find_by(domain_id: id).save # need to reload model + + save! # for notification if everything fails true end From cb6601ce1dc688a61a4d69b448b9242828842ee3 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 12 Jan 2016 14:10:34 +0200 Subject: [PATCH 16/41] Story#111396470 - show special message on contact ident update --- app/models/contact.rb | 5 +++-- app/models/epp/contact.rb | 1 + config/locales/en.yml | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/models/contact.rb b/app/models/contact.rb index ccc44851d..573ffe22e 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -238,13 +238,14 @@ class Contact < ActiveRecord::Base def ident_valid_format? case ident_country_code when 'EE'.freeze + err_msg = "invalid_EE_identity_format#{"__update" if id}".to_sym case ident_type when 'priv'.freeze - errors.add(:ident, :invalid_EE_identity_format) unless Isikukood.new(ident).valid? + errors.add(:ident, err_msg) unless Isikukood.new(ident).valid? when 'org'.freeze # !%w(1 7 8 9).freeze.include?(ident.first) || if ident.size != 8 || !(ident =~/\A[0-9]{8}\z/) - errors.add(:ident, :invalid_EE_identity_format) + errors.add(:ident, err_msg) end end end diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb index f4773f732..5f0a7b209 100644 --- a/app/models/epp/contact.rb +++ b/app/models/epp/contact.rb @@ -123,6 +123,7 @@ class Epp::Contact < Contact [:email, :invalid], [:ident, :invalid], [:ident, :invalid_EE_identity_format], + [:ident, :invalid_EE_identity_format_update], [:ident, :invalid_birthday_format], [:ident, :invalid_country_code], [:ident_type, :missing], diff --git a/config/locales/en.yml b/config/locales/en.yml index 893fe5665..61a476ab6 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -49,6 +49,7 @@ en: ident: blank: "Required parameter missing - ident" invalid_EE_identity_format: "Ident not in valid Estonian identity format." + invalid_EE_identity_format_update: "Ident not in valid Estonian identity format. Please create new contact" invalid_birthday_format: "Ident not in valid birthady format, should be YYYY-MM-DD" invalid_country_code: "Ident country code is not valid, should be in ISO_3166-1 alpha 2 format" domains: From a20df5243a921a1bc762e02eb4d86d1651addf52 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 12 Jan 2016 14:24:32 +0200 Subject: [PATCH 17/41] Story#111396470 - show special message on contact ident update (typo fix) --- app/models/contact.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/contact.rb b/app/models/contact.rb index 573ffe22e..75f03de09 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -238,7 +238,7 @@ class Contact < ActiveRecord::Base def ident_valid_format? case ident_country_code when 'EE'.freeze - err_msg = "invalid_EE_identity_format#{"__update" if id}".to_sym + err_msg = "invalid_EE_identity_format#{"_update" if id}".to_sym case ident_type when 'priv'.freeze errors.add(:ident, err_msg) unless Isikukood.new(ident).valid? From e27cd0c31676675858fd4cd6f455ce99486e2a33 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 12 Jan 2016 17:11:31 +0200 Subject: [PATCH 18/41] Story#111396470 - better code --- app/models/contact.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/contact.rb b/app/models/contact.rb index 75f03de09..99a41a6a4 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -29,7 +29,7 @@ class Contact < ActiveRecord::Base uniqueness: { message: :epp_id_taken }, format: { with: /\A[\w\-\:\.\_]*\z/i, message: :invalid }, length: { maximum: 100, message: :too_long_contact_code } - validate :ident_valid_format? + validate :val_ident_valid_format? validate :uniq_statuses? validate :validate_html @@ -235,7 +235,7 @@ class Contact < ActiveRecord::Base name || '[no name]' end - def ident_valid_format? + def val_ident_valid_format? case ident_country_code when 'EE'.freeze err_msg = "invalid_EE_identity_format#{"_update" if id}".to_sym From 782fcc9deccb5d389e23c4f67a98e58b8fbe0c84 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 12 Jan 2016 17:29:13 +0200 Subject: [PATCH 19/41] Story#111503520 - reject verification shouldn't validate --- app/jobs/domain_update_confirm_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/domain_update_confirm_job.rb b/app/jobs/domain_update_confirm_job.rb index 3da95287d..f028b95f8 100644 --- a/app/jobs/domain_update_confirm_job.rb +++ b/app/jobs/domain_update_confirm_job.rb @@ -13,7 +13,7 @@ class DomainUpdateConfirmJob < Que::Job domain.send_mail :pending_update_rejected_notification_for_new_registrant domain.poll_message!(:poll_pending_update_rejected_by_registrant) domain.clean_pendings! - domain.save + domain.save(validate: false) end destroy # it's best to destroy the job in the same transaction end From d9d8aef813fdc99a529086da899a430d6af4e202 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 12 Jan 2016 18:27:29 +0200 Subject: [PATCH 20/41] Story#111503520 - custom lowlevel pending state rejection --- app/jobs/domain_update_confirm_job.rb | 3 +-- app/models/domain.rb | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/jobs/domain_update_confirm_job.rb b/app/jobs/domain_update_confirm_job.rb index f028b95f8..098b9853e 100644 --- a/app/jobs/domain_update_confirm_job.rb +++ b/app/jobs/domain_update_confirm_job.rb @@ -12,8 +12,7 @@ class DomainUpdateConfirmJob < Que::Job when RegistrantVerification::REJECTED domain.send_mail :pending_update_rejected_notification_for_new_registrant domain.poll_message!(:poll_pending_update_rejected_by_registrant) - domain.clean_pendings! - domain.save(validate: false) + domain.clean_pendings_lowlevel end destroy # it's best to destroy the job in the same transaction end diff --git a/app/models/domain.rb b/app/models/domain.rb index 05ffafc4d..baf7d0308 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -244,7 +244,7 @@ class Domain < ActiveRecord::Base if domain.pending_delete? || domain.pending_delete_confirmation? DomainMailer.pending_delete_expired_notification(domain.id, true).deliver end - domain.clean_pendings! + domain.clean_pendings_lowlevel unless Rails.env.test? STDOUT << "#{Time.zone.now.utc} Domain.clean_expired_pendings: ##{domain.id} (#{domain.name})\n" end @@ -439,6 +439,25 @@ class Domain < ActiveRecord::Base save end + + # state change shouln't be + def clean_pendings_lowlevel + statuses.delete(DomainStatus::PENDING_DELETE_CONFIRMATION) + statuses.delete(DomainStatus::PENDING_UPDATE) + statuses.delete(DomainStatus::PENDING_DELETE) + + status_notes[DomainStatus::PENDING_UPDATE] = '' + status_notes[DomainStatus::PENDING_DELETE] = '' + + update_columns( + registrant_verification_token: nil, + registrant_verification_asked_at: nil, + pending_json: {}, + status_notes: status_notes, + statuses: statuses.presence || [DomainStatus::OK] + ) + end + def pending_update! return true if pending_update? self.epp_pending_update = true # for epp From f019bf5e0da5adf093fa2a2a9558ca3b4071f11c Mon Sep 17 00:00:00 2001 From: Stas Date: Wed, 13 Jan 2016 15:41:21 +0200 Subject: [PATCH 21/41] 110152326-filter_fix --- app/controllers/admin/contacts_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/admin/contacts_controller.rb b/app/controllers/admin/contacts_controller.rb index 50131066f..960d74002 100644 --- a/app/controllers/admin/contacts_controller.rb +++ b/app/controllers/admin/contacts_controller.rb @@ -11,7 +11,7 @@ class Admin::ContactsController < AdminController end @q = Contact.includes(:registrar).search(search_params) - @contacts = @q.result.page(params[:page]) + @contacts = @q.result(distinct: :true).page(params[:page]) if params[:statuses_contains] contacts = Contact.includes(:registrar).where( @@ -23,7 +23,7 @@ class Admin::ContactsController < AdminController normalize_search_parameters do @q = contacts.search(search_params) - @contacts = @q.result.page(params[:page]) + @contacts = @q.result(distinct: :true).page(params[:page]) end @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 From b85a637ef2a9fc1b0dbb8f281c418a71b8bf1208 Mon Sep 17 00:00:00 2001 From: Stas Date: Fri, 15 Jan 2016 17:34:05 +0200 Subject: [PATCH 22/41] 111219288-template_fix_for_corrupted_log --- app/views/admin/domain_versions/_version.haml | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/app/views/admin/domain_versions/_version.haml b/app/views/admin/domain_versions/_version.haml index fd449b4b0..321e9abda 100644 --- a/app/views/admin/domain_versions/_version.haml +++ b/app/views/admin/domain_versions/_version.haml @@ -55,43 +55,47 @@ = "#{l(domain.valid_to, format: :date)}" %td - - registrant.each do |r| - %p - = r[:name] - = r[:phone] - = r[:email] - %p - = r[:code] + - if registrant + - registrant.each do |r| + %p + = r[:name] + = r[:phone] + = r[:email] + %p + = r[:code] %td - - admin_contacts.each do |ac| - %p - = ac[:name] - = ac[:phone] - = ac[:email] - %p - = ac[:code] + - if admin_contacts + - admin_contacts.each do |ac| + %p + = ac[:name] + = ac[:phone] + = ac[:email] + %p + = ac[:code] %td - - tech_contacts.each do |tc| - %p - = tc[:name] - = tc[:phone] - = tc[:email] - %p - = tc[:code] + - if tech_contacts + - tech_contacts.each do |tc| + %p + = tc[:name] + = tc[:phone] + = tc[:email] + %p + = tc[:code] %td %p - - nameservers.each do |ns| - = ns[:hostname] - %br - = ns[:ipv4] - = ns[:ipv6] + - if nameservers + - nameservers.each do |ns| + = ns[:hostname] + %br + = ns[:ipv4] + = ns[:ipv6] %td %p - = domain.registrar.name + = domain.registrar.name if domain.registrar - if domain.pending_json.present? %tr.js-pending{ style: 'display: none;' } From 49e66d33dee67e3ed353edbc3046ab091b754057 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 18 Jan 2016 14:13:28 +0200 Subject: [PATCH 23/41] Story#105852786 - Push bank transfers to directo --- Gemfile | 1 + Gemfile.lock | 13 +++++ app/models/bank_transaction.rb | 30 ++++++++---- app/models/directo.rb | 47 +++++++++++++++++++ app/views/admin/settings/index.haml | 2 + config/application-example.yml | 2 + config/initializers/initial_settings.rb | 2 + db/migrate/20160113143447_create_directos.rb | 10 ++++ ...2453_add_in_directo_to_bank_transaction.rb | 5 ++ spec/models/directo_spec.rb | 5 ++ 10 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 app/models/directo.rb create mode 100644 db/migrate/20160113143447_create_directos.rb create mode 100644 db/migrate/20160118092453_add_in_directo_to_bank_transaction.rb create mode 100644 spec/models/directo_spec.rb diff --git a/Gemfile b/Gemfile index 10c680786..d29fa223b 100644 --- a/Gemfile +++ b/Gemfile @@ -12,6 +12,7 @@ gem 'rails', '4.2.4' # when update, all initializers eis_custom files nee gem 'iso8601', '0.8.6' # for dates and times gem 'hashie-forbidden_attributes', '0.1.1' gem 'SyslogLogger', '2.0', require: 'syslog/logger' +gem 'rest-client' # load env gem 'figaro', '1.1.1' diff --git a/Gemfile.lock b/Gemfile.lock index b92d6dc1b..45eb09943 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -188,6 +188,8 @@ GEM nokogiri (>= 1.4.0) savon (>= 2.4.0) docile (1.1.5) + domain_name (0.5.25) + unf (>= 0.0.5, < 1.0.0) epp-xml (1.0.4) activesupport (~> 4.1) builder (~> 3.2) @@ -261,6 +263,8 @@ GEM nokogiri (~> 1.6.0) ruby_parser (~> 3.5) html5_validators (1.2.2) + http-cookie (1.0.2) + domain_name (~> 0.5) httpclient (2.6.0.1) httpi (2.4.1) rack @@ -320,6 +324,7 @@ GEM multi_json (1.11.2) multi_xml (0.5.5) nenv (0.2.0) + netrc (0.11.0) newrelic_rpm (3.12.0.288) nokogiri (1.6.6.2) mini_portile (~> 0.6.0) @@ -412,6 +417,10 @@ GEM request_store (1.1.0) responders (2.1.0) railties (>= 4.2.0, < 5) + rest-client (1.8.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 3.0) + netrc (~> 0.7) rspec (3.3.0) rspec-core (~> 3.3.0) rspec-expectations (~> 3.3.0) @@ -515,6 +524,9 @@ GEM uglifier (2.7.1) execjs (>= 0.3.0) json (>= 1.8.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.1) unicorn (4.9.0) kgio (~> 2.6) rack @@ -617,6 +629,7 @@ DEPENDENCIES rails-settings-cached (= 0.4.1) rake ransack (= 1.5.1) + rest-client rspec-rails (= 3.3.2) rubocop (= 0.32.1) rubycritic (= 1.4.0) diff --git a/app/models/bank_transaction.rb b/app/models/bank_transaction.rb index 2e5b90a2e..b827670c4 100644 --- a/app/models/bank_transaction.rb +++ b/app/models/bank_transaction.rb @@ -2,6 +2,7 @@ class BankTransaction < ActiveRecord::Base include Versions belongs_to :bank_statement has_one :account_activity + has_many :directo_records, as: :item, class_name: 'Directo' scope :unbinded, lambda { where('id NOT IN (SELECT bank_transaction_id FROM account_activities where bank_transaction_id IS NOT NULL)') @@ -16,21 +17,32 @@ class BankTransaction < ActiveRecord::Base account_activity.invoice end + + def invoice_num + return @invoice_no if defined?(@invoice_no) + + match = description.match(/^[^\d]*(\d+)/) + return unless match + + @invoice_no = match[1].try(:to_i) + end + + def invoice + @invoice ||= registrar.invoices.find_by(number: invoice_num) if registrar + end + + def registrar + @registrar ||= Registrar.find_by(reference_no: reference_no) + end + + # For successful binding, reference number, invoice id and sum must match with the invoice # rubocop: disable Metrics/PerceivedComplexity # rubocop: disable Metrics/CyclomaticComplexity def autobind_invoice return if binded? - registrar = Registrar.find_by(reference_no: reference_no) return unless registrar - - match = description.match(/^[^\d]*(\d+)/) - return unless match - - invoice_no = match[1].to_i - return unless invoice_no - - invoice = registrar.invoices.find_by(number: invoice_no) + return unless invoice_num return unless invoice return if invoice.binded? diff --git a/app/models/directo.rb b/app/models/directo.rb new file mode 100644 index 000000000..73b88e0ae --- /dev/null +++ b/app/models/directo.rb @@ -0,0 +1,47 @@ +class Directo < ActiveRecord::Base + belongs_to :item, polymorphic: true + + def self.send_receipts + new_trans = BankTransaction.where(in_directo: false) + new_trans.find_in_batches(batch_size: 10).each do |group| + mappers = {} # need them as no direct connection between transaction and invoice + builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| + xml.invoices { + group.each do |transaction| + next unless transaction.invoice + num = transaction.invoice_num + mappers[num] = transaction + + xml.invoice( + "SalesAgent" => transaction.invoice.seller_name, + "Number" => num, + "InvoiceDate" => (transaction.paid_at||transaction.created_at).strftime("%Y-%m-%dT%H:%M:%S"), + "PaymentTerm" => Setting.directo_receipt_payment_term, + "Currency" => transaction.currency, + "CustomerCode"=> transaction.invoice.try(:buyer).try(:directo_handle) + ){ + xml.line( + "ProductID"=> Setting.directo_receipt_product_name, + "Quantity" => 1, + "UnitPriceWoVAT" =>ActionController::Base.helpers.number_with_precision(transaction.sum.to_f/1.2, precision: 2, separator: "."), + "ProductName" => transaction.description + ) + } + end + } + end + + data = builder.to_xml.gsub("\n",'') + response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s + dump_result_to_db(mappers, response) + end + end + + def self.dump_result_to_db mappers, xml + Nokogiri::XML(xml).css("Result").each do |res| + obj = mappers[res.attributes["docid"].value.to_i] + obj.directo_records.first_or_create!(response: res.as_json.to_h) + obj.update_columns(in_directo: true) + end + end +end diff --git a/app/views/admin/settings/index.haml b/app/views/admin/settings/index.haml index f03ca66bc..52430eb2a 100644 --- a/app/views/admin/settings/index.haml +++ b/app/views/admin/settings/index.haml @@ -71,6 +71,8 @@ = render 'setting_row', var: :days_to_keep_invoices_active = render 'setting_row', var: :days_to_keep_overdue_invoices_active = render 'setting_row', var: :minimum_deposit + = render 'setting_row', var: :directo_receipt_payment_term + = render 'setting_row', var: :directo_receipt_product_name = render 'setting_row', var: :registry_billing_email = render 'setting_row', var: :registry_invoice_contact = render 'setting_row', var: :registry_vat_no diff --git a/config/application-example.yml b/config/application-example.yml index b08a1b007..cf6e26357 100644 --- a/config/application-example.yml +++ b/config/application-example.yml @@ -45,6 +45,8 @@ ca_cert_path: '/home/registry/registry/shared/ca/certs/ca.crt.pem' ca_key_path: '/home/registry/registry/shared/ca/private/ca.key.pem' ca_key_password: 'your-root-key-password' +directo_invoice_url: 'https://domain/ddddd.asp' + # # EPP diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb index 193d179b0..8309d299a 100644 --- a/config/initializers/initial_settings.rb +++ b/config/initializers/initial_settings.rb @@ -33,6 +33,8 @@ if con.present? && con.table_exists?('settings') Setting.save_default(:days_to_keep_invoices_active, 30) Setting.save_default(:days_to_keep_overdue_invoices_active, 30) Setting.save_default(:minimum_deposit, 0.0) + Setting.save_default(:directo_receipt_payment_term, "R") + Setting.save_default(:directo_receipt_product_name, "ETTEM06") Setting.save_default(:days_to_renew_domain_before_expire, 90) Setting.save_default(:expire_warning_period, 15) diff --git a/db/migrate/20160113143447_create_directos.rb b/db/migrate/20160113143447_create_directos.rb new file mode 100644 index 000000000..2fb6f85f8 --- /dev/null +++ b/db/migrate/20160113143447_create_directos.rb @@ -0,0 +1,10 @@ +class CreateDirectos < ActiveRecord::Migration + def change + create_table :directos do |t| + t.belongs_to :item, index: true, polymorphic: true + t.json :response + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160118092453_add_in_directo_to_bank_transaction.rb b/db/migrate/20160118092453_add_in_directo_to_bank_transaction.rb new file mode 100644 index 000000000..14433b341 --- /dev/null +++ b/db/migrate/20160118092453_add_in_directo_to_bank_transaction.rb @@ -0,0 +1,5 @@ +class AddInDirectoToBankTransaction < ActiveRecord::Migration + def change + add_column :bank_transactions, :in_directo, :boolean, default: false + end +end diff --git a/spec/models/directo_spec.rb b/spec/models/directo_spec.rb new file mode 100644 index 000000000..bf187d2bf --- /dev/null +++ b/spec/models/directo_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Directo, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From 975dd523689658c5fc78ddaceaf3a04b73a70d81 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 18 Jan 2016 20:26:03 +0200 Subject: [PATCH 24/41] Story#105852786 - Sales agent is set by config --- app/models/directo.rb | 2 +- app/views/admin/settings/index.haml | 1 + config/initializers/initial_settings.rb | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index 73b88e0ae..e51313b5b 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -13,7 +13,7 @@ class Directo < ActiveRecord::Base mappers[num] = transaction xml.invoice( - "SalesAgent" => transaction.invoice.seller_name, + "SalesAgent" => Setting.directo_sales_agent, "Number" => num, "InvoiceDate" => (transaction.paid_at||transaction.created_at).strftime("%Y-%m-%dT%H:%M:%S"), "PaymentTerm" => Setting.directo_receipt_payment_term, diff --git a/app/views/admin/settings/index.haml b/app/views/admin/settings/index.haml index 52430eb2a..e09e48396 100644 --- a/app/views/admin/settings/index.haml +++ b/app/views/admin/settings/index.haml @@ -73,6 +73,7 @@ = render 'setting_row', var: :minimum_deposit = render 'setting_row', var: :directo_receipt_payment_term = render 'setting_row', var: :directo_receipt_product_name + = render 'setting_row', var: :directo_sales_agent = render 'setting_row', var: :registry_billing_email = render 'setting_row', var: :registry_invoice_contact = render 'setting_row', var: :registry_vat_no diff --git a/config/initializers/initial_settings.rb b/config/initializers/initial_settings.rb index 8309d299a..1b25ddeb3 100644 --- a/config/initializers/initial_settings.rb +++ b/config/initializers/initial_settings.rb @@ -35,6 +35,7 @@ if con.present? && con.table_exists?('settings') Setting.save_default(:minimum_deposit, 0.0) Setting.save_default(:directo_receipt_payment_term, "R") Setting.save_default(:directo_receipt_product_name, "ETTEM06") + Setting.save_default(:directo_sales_agent, "JAANA") Setting.save_default(:days_to_renew_domain_before_expire, 90) Setting.save_default(:expire_warning_period, 15) From 51c54f77c7a4d728e7dd09c903950032c4c6633d Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 18 Jan 2016 21:29:16 +0200 Subject: [PATCH 25/41] Story#105852786 - Directo transaction sum is taken from invoice --- app/models/directo.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index e51313b5b..2a1ec118c 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -23,7 +23,7 @@ class Directo < ActiveRecord::Base xml.line( "ProductID"=> Setting.directo_receipt_product_name, "Quantity" => 1, - "UnitPriceWoVAT" =>ActionController::Base.helpers.number_with_precision(transaction.sum.to_f/1.2, precision: 2, separator: "."), + "UnitPriceWoVAT" =>ActionController::Base.helpers.number_with_precision(transaction.invoice.sum_without_vat, precision: 2, separator: "."), "ProductName" => transaction.description ) } From bc640c63fe2116a59cffa6cf70b11a3045e30d1b Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 19 Jan 2016 09:38:46 +0200 Subject: [PATCH 26/41] Story#105852786 - cleaner code --- app/models/directo.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index 2a1ec118c..3ca40eaf1 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -8,8 +8,9 @@ class Directo < ActiveRecord::Base builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| xml.invoices { group.each do |transaction| - next unless transaction.invoice - num = transaction.invoice_num + invoice = transaction.invoice + next unless invoice + num = transaction.invoice_num mappers[num] = transaction xml.invoice( @@ -18,12 +19,12 @@ class Directo < ActiveRecord::Base "InvoiceDate" => (transaction.paid_at||transaction.created_at).strftime("%Y-%m-%dT%H:%M:%S"), "PaymentTerm" => Setting.directo_receipt_payment_term, "Currency" => transaction.currency, - "CustomerCode"=> transaction.invoice.try(:buyer).try(:directo_handle) + "CustomerCode"=> invoice.buyer.try(:directo_handle) ){ xml.line( "ProductID"=> Setting.directo_receipt_product_name, "Quantity" => 1, - "UnitPriceWoVAT" =>ActionController::Base.helpers.number_with_precision(transaction.invoice.sum_without_vat, precision: 2, separator: "."), + "UnitPriceWoVAT" =>ActionController::Base.helpers.number_with_precision(invoice.sum_cache/(1+invoice.vat_prc), precision: 2, separator: "."), "ProductName" => transaction.description ) } From 72bd54dc7cac8814c3cf0f827bc80b3516001870 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 19 Jan 2016 12:39:42 +0200 Subject: [PATCH 27/41] Story#105852786 - Directo invoices are calculated based on invoices --- app/models/bank_link.rb | 3 ++- app/models/bank_transaction.rb | 2 +- app/models/directo.rb | 19 ++++++++----------- app/models/invoice.rb | 7 ++++++- ...2453_add_in_directo_to_bank_transaction.rb | 5 ----- ...0160118092454_add_in_directo_to_invoice.rb | 5 +++++ 6 files changed, 22 insertions(+), 19 deletions(-) delete mode 100644 db/migrate/20160118092453_add_in_directo_to_bank_transaction.rb create mode 100644 db/migrate/20160118092454_add_in_directo_to_invoice.rb diff --git a/app/models/bank_link.rb b/app/models/bank_link.rb index 31be3e222..29857951f 100644 --- a/app/models/bank_link.rb +++ b/app/models/bank_link.rb @@ -32,7 +32,7 @@ class BankLink hash["VK_AMOUNT"] = number_with_precision(invoice.sum_cache, :precision => 2, :separator => ".") hash["VK_CURR"] = invoice.currency hash["VK_REF"] = "" - hash["VK_MSG"] = "Order nr. #{invoice.number}" + hash["VK_MSG"] = invoice.description hash["VK_RETURN"] = controller.registrar_return_payment_with_url(type) hash["VK_CANCEL"] = controller.registrar_return_payment_with_url(type) hash["VK_DATETIME"] = Time.now.strftime("%Y-%m-%dT%H:%M:%S%z") @@ -101,6 +101,7 @@ class BankLink transaction.buyer_iban = params["VK_SND_ACC"] transaction.buyer_name = params["VK_SND_NAME"] transaction.paid_at = Time.parse(params["VK_T_DATETIME"]) + transaction.save! transaction.autobind_invoice end diff --git a/app/models/bank_transaction.rb b/app/models/bank_transaction.rb index b827670c4..1a34965bf 100644 --- a/app/models/bank_transaction.rb +++ b/app/models/bank_transaction.rb @@ -2,7 +2,7 @@ class BankTransaction < ActiveRecord::Base include Versions belongs_to :bank_statement has_one :account_activity - has_many :directo_records, as: :item, class_name: 'Directo' + has_many :directo_records, as: :item, class_name: 'Directo'# Deprecated scope :unbinded, lambda { where('id NOT IN (SELECT bank_transaction_id FROM account_activities where bank_transaction_id IS NOT NULL)') diff --git a/app/models/directo.rb b/app/models/directo.rb index 3ca40eaf1..4116e2985 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -2,30 +2,27 @@ class Directo < ActiveRecord::Base belongs_to :item, polymorphic: true def self.send_receipts - new_trans = BankTransaction.where(in_directo: false) + new_trans = Invoice.where(invoice_type: "DEB", in_directo: false) new_trans.find_in_batches(batch_size: 10).each do |group| - mappers = {} # need them as no direct connection between transaction and invoice + mappers = {} # need them as no direct connection between invoice builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| xml.invoices { - group.each do |transaction| - invoice = transaction.invoice - next unless invoice - num = transaction.invoice_num - mappers[num] = transaction - + group.each do |invoice| + num = invoice.number + mappers[num] = invoice xml.invoice( "SalesAgent" => Setting.directo_sales_agent, "Number" => num, - "InvoiceDate" => (transaction.paid_at||transaction.created_at).strftime("%Y-%m-%dT%H:%M:%S"), + "InvoiceDate" => (invoice.account_activity.try(:bank_transaction).try(:paid_at) || invoice.updated_at).strftime("%Y-%m-%dT%H:%M:%S"), "PaymentTerm" => Setting.directo_receipt_payment_term, - "Currency" => transaction.currency, + "Currency" => invoice.currency, "CustomerCode"=> invoice.buyer.try(:directo_handle) ){ xml.line( "ProductID"=> Setting.directo_receipt_product_name, "Quantity" => 1, "UnitPriceWoVAT" =>ActionController::Base.helpers.number_with_precision(invoice.sum_cache/(1+invoice.vat_prc), precision: 2, separator: "."), - "ProductName" => transaction.description + "ProductName" => invoice.description ) } end diff --git a/app/models/invoice.rb b/app/models/invoice.rb index fdcb3cf61..5c7dafe85 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -2,8 +2,9 @@ class Invoice < ActiveRecord::Base include Versions belongs_to :seller, class_name: 'Registrar' belongs_to :buyer, class_name: 'Registrar' + has_one :account_activity has_many :invoice_items - has_one :account_activity + has_many :directo_records, as: :item, class_name: 'Directo' accepts_nested_attributes_for :invoice_items @@ -99,6 +100,10 @@ class Invoice < ActiveRecord::Base kit.to_pdf end + def description + "Order nr. #{number}" + end + def pdf_name "invoice-#{number}.pdf" end diff --git a/db/migrate/20160118092453_add_in_directo_to_bank_transaction.rb b/db/migrate/20160118092453_add_in_directo_to_bank_transaction.rb deleted file mode 100644 index 14433b341..000000000 --- a/db/migrate/20160118092453_add_in_directo_to_bank_transaction.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddInDirectoToBankTransaction < ActiveRecord::Migration - def change - add_column :bank_transactions, :in_directo, :boolean, default: false - end -end diff --git a/db/migrate/20160118092454_add_in_directo_to_invoice.rb b/db/migrate/20160118092454_add_in_directo_to_invoice.rb new file mode 100644 index 000000000..0e93c3835 --- /dev/null +++ b/db/migrate/20160118092454_add_in_directo_to_invoice.rb @@ -0,0 +1,5 @@ +class AddInDirectoToInvoice < ActiveRecord::Migration + def change + add_column :invoices, :in_directo, :boolean, default: false + end +end From 67fb02d7c498e653634d0cc5e8ed88fdc73efcf3 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 19 Jan 2016 14:50:08 +0200 Subject: [PATCH 28/41] Story#105852786 - Directo skip if bank_transaction is not set --- app/models/directo.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index 4116e2985..502dfe089 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -8,12 +8,14 @@ class Directo < ActiveRecord::Base builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| xml.invoices { group.each do |invoice| + next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil? + num = invoice.number mappers[num] = invoice xml.invoice( "SalesAgent" => Setting.directo_sales_agent, "Number" => num, - "InvoiceDate" => (invoice.account_activity.try(:bank_transaction).try(:paid_at) || invoice.updated_at).strftime("%Y-%m-%dT%H:%M:%S"), + "InvoiceDate" => invoice.created_at.strftime("%Y-%m-%dT%H:%M:%S"), "PaymentTerm" => Setting.directo_receipt_payment_term, "Currency" => invoice.currency, "CustomerCode"=> invoice.buyer.try(:directo_handle) From 6c8bab56bf08d0853810c4edb97ff28155257448 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 19 Jan 2016 15:02:29 +0200 Subject: [PATCH 29/41] Story#105852786 - add Directo.send_receipts into whenever to generate cron jobs --- config/schedule.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/schedule.rb b/config/schedule.rb index 5524f10ab..f3bbad764 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -53,6 +53,10 @@ if @cron_group == 'registry' every 52.minutes do runner 'Domain.start_redemption_grace_period' end + + every :day, at: '19:00pm' do + runner 'Directo.send_receipts' + end if @environment == 'production' end every 10.minutes do From 63fcbd9515684e7f5e39a925cbaf482041b99f6f Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 19 Jan 2016 15:17:33 +0200 Subject: [PATCH 30/41] Story#105852786 - Invoice' bank transaction should have sum in order to mean that invoice payment finished --- app/models/directo.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index 502dfe089..bf5bc9043 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -8,7 +8,7 @@ class Directo < ActiveRecord::Base builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| xml.invoices { group.each do |invoice| - next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil? + next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil? || invoice.account_activity.bank_transaction.sum.nil? num = invoice.number mappers[num] = invoice @@ -32,8 +32,9 @@ class Directo < ActiveRecord::Base end data = builder.to_xml.gsub("\n",'') - response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s - dump_result_to_db(mappers, response) + # response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s + # dump_result_to_db(mappers, response) + binding.pry end end From c3db50b5cdd2f650cc495684b1276ab5a08ef253 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 19 Jan 2016 15:27:17 +0200 Subject: [PATCH 31/41] Story#105852786 - Invoice' bank transaction should have sum in order to mean that invoice payment finished --- app/models/directo.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index bf5bc9043..ae8c2b48c 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -8,7 +8,8 @@ class Directo < ActiveRecord::Base builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| xml.invoices { group.each do |invoice| - next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil? || invoice.account_activity.bank_transaction.sum.nil? + next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil? + next if invoice.account_activity.bank_transaction.sum.nil? num = invoice.number mappers[num] = invoice @@ -32,9 +33,8 @@ class Directo < ActiveRecord::Base end data = builder.to_xml.gsub("\n",'') - # response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s - # dump_result_to_db(mappers, response) - binding.pry + response = RestClient::Request.execute(url: ENV['directo_invoice_url'], method: :post, payload: {put: "1", what: "invoice", xmldata: data}, verify_ssl: false).to_s + dump_result_to_db(mappers, response) end end From 66bdc5146b9f1d94e8378697395aa81c4f0ca9bc Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 19 Jan 2016 15:36:50 +0200 Subject: [PATCH 32/41] Story#105852786 - Do not send invoice to directo if sum is not matching with bank transaction --- app/models/directo.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index ae8c2b48c..af62d21a2 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -9,7 +9,7 @@ class Directo < ActiveRecord::Base xml.invoices { group.each do |invoice| next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil? - next if invoice.account_activity.bank_transaction.sum.nil? + next if invoice.account_activity.bank_transaction.sum.nil? || invoice.account_activity.bank_transaction.sum != invoice.sum_cache num = invoice.number mappers[num] = invoice From d3295e349cd5f08859444ce7daa05e633a1a24fb Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Tue, 19 Jan 2016 17:00:00 +0200 Subject: [PATCH 33/41] Story#105852786 - Do not check for now bank transactions sum --- app/models/directo.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index af62d21a2..07b02e625 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -9,7 +9,7 @@ class Directo < ActiveRecord::Base xml.invoices { group.each do |invoice| next if invoice.account_activity.nil? || invoice.account_activity.bank_transaction.nil? - next if invoice.account_activity.bank_transaction.sum.nil? || invoice.account_activity.bank_transaction.sum != invoice.sum_cache + # next if invoice.account_activity.bank_transaction.sum.nil? || invoice.account_activity.bank_transaction.sum != invoice.sum_cache num = invoice.number mappers[num] = invoice From e99dbe9a18ceeaeb66e89439a58f43431617defb Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Wed, 20 Jan 2016 13:30:34 +0200 Subject: [PATCH 34/41] Story#105852786 - each time invoice is being sent to Directo, record is saved to DB --- app/models/directo.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index 07b02e625..2b82ee289 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -22,10 +22,10 @@ class Directo < ActiveRecord::Base "CustomerCode"=> invoice.buyer.try(:directo_handle) ){ xml.line( - "ProductID"=> Setting.directo_receipt_product_name, - "Quantity" => 1, - "UnitPriceWoVAT" =>ActionController::Base.helpers.number_with_precision(invoice.sum_cache/(1+invoice.vat_prc), precision: 2, separator: "."), - "ProductName" => invoice.description + "ProductID" => Setting.directo_receipt_product_name, + "Quantity" => 1, + "UnitPriceWoVAT" => ActionController::Base.helpers.number_with_precision(invoice.sum_cache/(1+invoice.vat_prc), precision: 2, separator: "."), + "ProductName" => invoice.description ) } end @@ -41,7 +41,7 @@ class Directo < ActiveRecord::Base def self.dump_result_to_db mappers, xml Nokogiri::XML(xml).css("Result").each do |res| obj = mappers[res.attributes["docid"].value.to_i] - obj.directo_records.first_or_create!(response: res.as_json.to_h) + obj.directo_records.create!(response: res.as_json.to_h) obj.update_columns(in_directo: true) end end From f86453fa0b9ef79f192b610b9a68bfadc9684d22 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Wed, 20 Jan 2016 13:49:44 +0200 Subject: [PATCH 35/41] Story#105852786 - skip cancelled invoices to be sent to directo --- app/models/directo.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/directo.rb b/app/models/directo.rb index 2b82ee289..83eaf1a29 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -2,7 +2,7 @@ class Directo < ActiveRecord::Base belongs_to :item, polymorphic: true def self.send_receipts - new_trans = Invoice.where(invoice_type: "DEB", in_directo: false) + new_trans = Invoice.where(invoice_type: "DEB", in_directo: false).where.not(cancelled_at: nil) new_trans.find_in_batches(batch_size: 10).each do |group| mappers = {} # need them as no direct connection between invoice builder = Nokogiri::XML::Builder.new(encoding: "UTF-8") do |xml| From 3b515ab2dd7afeebfc115588a9953d1b07c56fad Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Wed, 20 Jan 2016 16:41:55 +0200 Subject: [PATCH 36/41] Story#112054829 - Use casting --- app/models/domain.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index e4882473a..c57d742e1 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -264,7 +264,7 @@ class Domain < ActiveRecord::Base domains.each do |domain| next unless domain.expirable? domain.set_graceful_expired - DomainMailer.expiration_reminder(domain.id).deliver_in(Setting.expiration_reminder_mail.days) + DomainMailer.expiration_reminder(domain.id).deliver_in(Setting.expiration_reminder_mail.to_i.days) STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? domain.save end From 762aff6bc0caad95c94a1651ed940c267ec6609f Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 25 Jan 2016 11:19:23 +0200 Subject: [PATCH 37/41] Story#112043941 - Add syslog to directo --- app/models/directo.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/directo.rb b/app/models/directo.rb index 83eaf1a29..5a719d0a7 100644 --- a/app/models/directo.rb +++ b/app/models/directo.rb @@ -43,6 +43,7 @@ class Directo < ActiveRecord::Base obj = mappers[res.attributes["docid"].value.to_i] obj.directo_records.create!(response: res.as_json.to_h) obj.update_columns(in_directo: true) + Rails.logger.info("[DIRECTO] Invoice #{res.attributes["docid"].value} was pushed and return is #{res.as_json.to_h.inspect}") end end end From b2787a21bad33d6d3b3ea85d0e6d6df47d5a077c Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Mon, 25 Jan 2016 11:37:12 +0200 Subject: [PATCH 38/41] Story#112127475 - server set statuses were not applied on broken domains --- app/models/domain.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index c57d742e1..138afa66e 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -266,7 +266,7 @@ class Domain < ActiveRecord::Base domain.set_graceful_expired DomainMailer.expiration_reminder(domain.id).deliver_in(Setting.expiration_reminder_mail.to_i.days) STDOUT << "#{Time.zone.now.utc} Domain.start_expire_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? - domain.save + domain.save(validate: false) end STDOUT << "#{Time.zone.now.utc} - Successfully expired #{domains.count} domains\n" unless Rails.env.test? @@ -280,7 +280,7 @@ class Domain < ActiveRecord::Base next unless domain.server_holdable? domain.statuses << DomainStatus::SERVER_HOLD STDOUT << "#{Time.zone.now.utc} Domain.start_redemption_grace_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? - domain.save + domain.save(validate: false) end STDOUT << "#{Time.zone.now.utc} - Successfully set server_hold to #{d.count} domains\n" unless Rails.env.test? @@ -294,7 +294,7 @@ class Domain < ActiveRecord::Base next unless domain.delete_candidateable? domain.statuses << DomainStatus::DELETE_CANDIDATE STDOUT << "#{Time.zone.now.utc} Domain.start_delete_period: ##{domain.id} (#{domain.name}) #{domain.changes}\n" unless Rails.env.test? - domain.save + domain.save(validate: false) end return if Rails.env.test? From df68b705ff58f134968e3466a3479a4328afb454 Mon Sep 17 00:00:00 2001 From: Stas Date: Mon, 25 Jan 2016 11:58:13 +0200 Subject: [PATCH 39/41] 110152326-distinct_added --- app/controllers/registrar/contacts_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/registrar/contacts_controller.rb b/app/controllers/registrar/contacts_controller.rb index c0b814993..0581a3cfc 100644 --- a/app/controllers/registrar/contacts_controller.rb +++ b/app/controllers/registrar/contacts_controller.rb @@ -27,7 +27,7 @@ class Registrar::ContactsController < Registrar::DeppController # EPP controller normalize_search_parameters do @q = contacts.search(search_params) - @contacts = @q.result.page(params[:page]) + @contacts = @q.result(distinct: :true).page(params[:page]) end @contacts = @contacts.per(params[:results_per_page]) if params[:results_per_page].to_i > 0 From da2f30f8a9c95c6254798452ff8461d783353d37 Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Thu, 28 Jan 2016 13:10:32 +0200 Subject: [PATCH 40/41] Story#109590460 - fix ruby bug in comparing with regexp --- app/models/epp/contact.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb index 5f0a7b209..3526cd463 100644 --- a/app/models/epp/contact.rb +++ b/app/models/epp/contact.rb @@ -165,7 +165,7 @@ class Epp::Contact < Contact org_priv = %w(org priv).freeze if ident_country_code.blank? && org_priv.include?(ident_type) && org_priv.include?(ident_frame.attr('type')) at.merge!(ident_country_code: ident_frame.attr('cc'), ident_type: ident_frame.attr('type')) - elsif ident_type == "birthday" && ident !=~ /\d{4}-\d{2}-\d{2}/ && (Date.parse(ident) rescue false) + elsif ident_type == "birthday" && ident[/\A\d{4}-\d{2}-\d{2}\z/] && (Date.parse(ident) rescue false) at.merge!(ident: ident_frame.text) at.merge!(ident_country_code: ident_frame.attr('cc')) if ident_frame.attr('cc').present? elsif ident_type.blank? && ident_country_code.blank? From f1d4d1f5522d69e2efdfa8059728b05485932d2a Mon Sep 17 00:00:00 2001 From: Vladimir Krylov Date: Thu, 28 Jan 2016 14:39:39 +0200 Subject: [PATCH 41/41] Story#109590460 - fix --- app/models/epp/contact.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb index 3526cd463..54806b88d 100644 --- a/app/models/epp/contact.rb +++ b/app/models/epp/contact.rb @@ -165,7 +165,7 @@ class Epp::Contact < Contact org_priv = %w(org priv).freeze if ident_country_code.blank? && org_priv.include?(ident_type) && org_priv.include?(ident_frame.attr('type')) at.merge!(ident_country_code: ident_frame.attr('cc'), ident_type: ident_frame.attr('type')) - elsif ident_type == "birthday" && ident[/\A\d{4}-\d{2}-\d{2}\z/] && (Date.parse(ident) rescue false) + elsif ident_type == "birthday" && !ident[/\A\d{4}-\d{2}-\d{2}\z/] && (Date.parse(ident) rescue false) at.merge!(ident: ident_frame.text) at.merge!(ident_country_code: ident_frame.attr('cc')) if ident_frame.attr('cc').present? elsif ident_type.blank? && ident_country_code.blank?