From e9c1fd9d646933d3498a9c95386eef2711e9ad4b Mon Sep 17 00:00:00 2001 From: oleghasjanov Date: Sat, 13 Dec 2025 21:04:45 +0200 Subject: [PATCH 1/4] check for org single domain --- ...mpany_register_status_for_single_domain.rb | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 app/jobs/company_register_status_for_single_domain.rb diff --git a/app/jobs/company_register_status_for_single_domain.rb b/app/jobs/company_register_status_for_single_domain.rb new file mode 100644 index 0000000000..f828430080 --- /dev/null +++ b/app/jobs/company_register_status_for_single_domain.rb @@ -0,0 +1,92 @@ +class CompanyRegisterStatusForSingleDomainJob < ApplicationJob + REGISTRY_STATUSES = { + Contact::REGISTERED => 'registered', + Contact::LIQUIDATED => 'liquidated', + Contact::BANKRUPT => 'bankrupt', + Contact::DELETED => 'deleted' + }.freeze + + queue_as :default + + def perform(domain_name) + puts "=" * 60 + puts "Checking domain: #{domain_name}" + puts "=" * 60 + + domain = Domain.find_by(name: domain_name) + unless domain + puts "ERROR: Domain '#{domain_name}' not found" + return + end + + puts "Domain ID: #{domain.id}" + puts "Domain status: #{domain.statuses.join(', ')}" + puts "-" * 60 + + registrant = domain.registrant + unless registrant + puts "ERROR: Registrant not found for domain" + return + end + + puts "REGISTRANT INFO:" + puts " Code: #{registrant.code}" + puts " Name: #{registrant.name}" + puts " Ident: #{registrant.ident}" + puts " Ident type: #{registrant.ident_type}" + puts " Ident country: #{registrant.ident_country_code}" + puts " Email: #{registrant.email}" + puts " Current DB status: #{registrant.company_register_status || 'NULL'}" + puts " Last checked at: #{registrant.checked_company_at || 'NEVER'}" + puts "-" * 60 + + unless registrant.ident_type == 'org' && registrant.ident_country_code == 'EE' + puts "SKIP: Not an Estonian organization (ident_type=#{registrant.ident_type}, country=#{registrant.ident_country_code})" + return + end + + puts "BUSINESS REGISTRY CHECK:" + puts " Querying registry for ident: #{registrant.ident}" + + company_status = registrant.return_company_status + puts " Raw status from registry: #{company_status.inspect}" + puts " Human status: #{REGISTRY_STATUSES.fetch(company_status, 'NOT_FOUND')}" + puts "-" * 60 + + puts "COMPANY DETAILS (for deletion reason):" + company_details = registrant.return_company_details + + if company_details.blank? + puts " No company details returned (company may not exist in registry)" + else + puts " Raw response class: #{company_details.class}" + puts " Response count: #{company_details.size}" + + begin + kandeliik = company_details.first.kandeliik + puts " Kandeliik entries: #{kandeliik.size}" + + kandeliik_tekstina = kandeliik.last.last.kandeliik_tekstina + puts " Last kandeliik_tekstina: #{kandeliik_tekstina}" + puts " Is PAYMENT_STATEMENT reason: #{kandeliik_tekstina == 'Kustutamiskanne dokumentide hoidjata'}" + rescue => e + puts " Error extracting kandeliik: #{e.message}" + puts " Raw company_details: #{company_details.inspect}" + end + end + + puts "-" * 60 + puts "SUMMARY:" + puts " Domain: #{domain_name}" + puts " Registrant: #{registrant.name} (#{registrant.ident})" + puts " Registry status: #{REGISTRY_STATUSES.fetch(company_status, 'NOT_FOUND')} (#{company_status.inspect})" + puts " Force delete scheduled: #{domain.force_delete_scheduled?}" + + if domain.force_delete_scheduled? + puts " Force delete type: #{domain.template_name}" + puts " Force delete data: #{domain.force_delete_data}" + end + + puts "=" * 60 + end +end From 058ff43e7d66ced6d6809ec073fe59b2550c465a Mon Sep 17 00:00:00 2001 From: oleghasjanov Date: Sat, 13 Dec 2025 21:13:44 +0200 Subject: [PATCH 2/4] added job name to the end --- ...domain.rb => company_register_status_for_single_domain_job.rb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/jobs/{company_register_status_for_single_domain.rb => company_register_status_for_single_domain_job.rb} (100%) diff --git a/app/jobs/company_register_status_for_single_domain.rb b/app/jobs/company_register_status_for_single_domain_job.rb similarity index 100% rename from app/jobs/company_register_status_for_single_domain.rb rename to app/jobs/company_register_status_for_single_domain_job.rb From e877ae7eb6c5b232f97302c9f200fa4d3c6003fa Mon Sep 17 00:00:00 2001 From: oleghasjanov Date: Mon, 15 Dec 2025 09:21:07 +0200 Subject: [PATCH 3/4] added test for ident --- ...y_register_status_for_single_domain_job.rb | 153 +++++++++++++++--- 1 file changed, 131 insertions(+), 22 deletions(-) diff --git a/app/jobs/company_register_status_for_single_domain_job.rb b/app/jobs/company_register_status_for_single_domain_job.rb index f828430080..467bcd0895 100644 --- a/app/jobs/company_register_status_for_single_domain_job.rb +++ b/app/jobs/company_register_status_for_single_domain_job.rb @@ -8,9 +8,26 @@ class CompanyRegisterStatusForSingleDomainJob < ApplicationJob queue_as :default - def perform(domain_name) + # Usage: + # CompanyRegisterStatusForSingleDomainJob.perform_now('example.ee') - by domain + # CompanyRegisterStatusForSingleDomainJob.perform_now('12345678', type: :reg) - by registration number + def perform(identifier, type: :domain) puts "=" * 60 - puts "Checking domain: #{domain_name}" + + case type.to_sym + when :reg, :registration_number, :ident + check_by_registration_number(identifier.to_s) + else + check_by_domain(identifier) + end + + puts "=" * 60 + end + + private + + def check_by_domain(domain_name) + puts "Checking by DOMAIN: #{domain_name}" puts "=" * 60 domain = Domain.find_by(name: domain_name) @@ -29,32 +46,72 @@ def perform(domain_name) return end - puts "REGISTRANT INFO:" - puts " Code: #{registrant.code}" - puts " Name: #{registrant.name}" - puts " Ident: #{registrant.ident}" - puts " Ident type: #{registrant.ident_type}" - puts " Ident country: #{registrant.ident_country_code}" - puts " Email: #{registrant.email}" - puts " Current DB status: #{registrant.company_register_status || 'NULL'}" - puts " Last checked at: #{registrant.checked_company_at || 'NEVER'}" - puts "-" * 60 + print_registrant_info(registrant) - unless registrant.ident_type == 'org' && registrant.ident_country_code == 'EE' + unless estonian_org?(registrant) puts "SKIP: Not an Estonian organization (ident_type=#{registrant.ident_type}, country=#{registrant.ident_country_code})" return end - puts "BUSINESS REGISTRY CHECK:" - puts " Querying registry for ident: #{registrant.ident}" + check_registry(registrant.ident) + print_domain_summary(domain, registrant) + end + + def check_by_registration_number(registration_number) + puts "Checking by REGISTRATION NUMBER: #{registration_number}" + puts "=" * 60 + + # Check if we have contacts with this ident in DB + contacts = Contact.where(ident: registration_number, ident_type: 'org', ident_country_code: 'EE') + if contacts.exists? + puts "Found #{contacts.count} contact(s) in DB with this ident:" + contacts.each do |c| + puts " - #{c.code}: #{c.name} (#{c.email})" + end + puts "-" * 60 + else + puts "No contacts found in DB with this ident (checking registry directly)" + puts "-" * 60 + end + + check_registry(registration_number) + print_registration_summary(registration_number, contacts) + end - company_status = registrant.return_company_status - puts " Raw status from registry: #{company_status.inspect}" - puts " Human status: #{REGISTRY_STATUSES.fetch(company_status, 'NOT_FOUND')}" + def check_registry(registration_number) + puts "BUSINESS REGISTRY CHECK:" + puts " Querying registry for ident: #{registration_number}" + + # Debug: show configuration + puts "" + puts " CONFIG DEBUG:" + puts " Username: #{CompanyRegister.configuration.username.present? ? '***SET***' : 'NOT SET!'}" + puts " Password: #{CompanyRegister.configuration.password.present? ? '***SET***' : 'NOT SET!'}" + puts " Test mode: #{CompanyRegister.configuration.test_mode}" + puts " Cache period: #{CompanyRegister.configuration.cache_period}" + endpoint = CompanyRegister.configuration.test_mode ? 'https://demo-ariregxmlv6.rik.ee/' : 'https://ariregxmlv6.rik.ee/' + puts " Endpoint: #{endpoint}" + puts "" + + client = CompanyRegister::Client.new + + # Simple data (status) + puts " Calling simple_data..." + simple_data = client.simple_data(registration_number: registration_number) + if simple_data.blank? + puts " Simple data: EMPTY (company not found in registry)" + @company_status = nil + else + @company_status = simple_data.first[:status] + puts " Raw status from registry: #{@company_status.inspect}" + puts " Human status: #{REGISTRY_STATUSES.fetch(@company_status, 'UNKNOWN')}" + end puts "-" * 60 + # Company details (for deletion reason) puts "COMPANY DETAILS (for deletion reason):" - company_details = registrant.return_company_details + puts " Calling company_details..." + company_details = client.company_details(registration_number: registration_number) if company_details.blank? puts " No company details returned (company may not exist in registry)" @@ -74,19 +131,71 @@ def perform(domain_name) puts " Raw company_details: #{company_details.inspect}" end end + rescue CompanyRegister::NotAvailableError => e + puts "" + puts " ERROR: Company register not available!" + puts " This is usually caused by:" + puts " 1. Missing/invalid credentials (username/password)" + puts " 2. Network connectivity issues" + puts " 3. Registry service is down" + puts " 4. IP not whitelisted on registry side" + puts "" + puts " Original Savon error was caught and wrapped." + puts " To see the actual error, run in rails console:" + puts " client = CompanyRegister::Client.new" + puts " Savon.client(wsdl: 'https://ariregxmlv6.rik.ee/?wsdl').call(:lihtandmed_v2, message: { keha: { ariregistri_kood: '#{registration_number}' } })" + puts "" + rescue => e + puts " ERROR: #{e.class} - #{e.message}" + puts " Backtrace: #{e.backtrace.first(5).join("\n ")}" + end + def print_registrant_info(registrant) + puts "REGISTRANT INFO:" + puts " Code: #{registrant.code}" + puts " Name: #{registrant.name}" + puts " Ident: #{registrant.ident}" + puts " Ident type: #{registrant.ident_type}" + puts " Ident country: #{registrant.ident_country_code}" + puts " Email: #{registrant.email}" + puts " Current DB status: #{registrant.company_register_status || 'NULL'}" + puts " Last checked at: #{registrant.checked_company_at || 'NEVER'}" + puts "-" * 60 + end + + def print_domain_summary(domain, registrant) puts "-" * 60 puts "SUMMARY:" - puts " Domain: #{domain_name}" + puts " Domain: #{domain.name}" puts " Registrant: #{registrant.name} (#{registrant.ident})" - puts " Registry status: #{REGISTRY_STATUSES.fetch(company_status, 'NOT_FOUND')} (#{company_status.inspect})" + puts " Registry status: #{REGISTRY_STATUSES.fetch(@company_status, 'NOT_FOUND')} (#{@company_status.inspect})" puts " Force delete scheduled: #{domain.force_delete_scheduled?}" if domain.force_delete_scheduled? puts " Force delete type: #{domain.template_name}" puts " Force delete data: #{domain.force_delete_data}" end + end - puts "=" * 60 + def print_registration_summary(registration_number, contacts) + puts "-" * 60 + puts "SUMMARY:" + puts " Registration number: #{registration_number}" + puts " Registry status: #{REGISTRY_STATUSES.fetch(@company_status, 'NOT_FOUND')} (#{@company_status.inspect})" + puts " Contacts in DB: #{contacts.count}" + + return unless contacts.exists? + + puts " Domains affected:" + contacts.each do |contact| + contact.registrant_domains.each do |domain| + fd_status = domain.force_delete_scheduled? ? " [FORCE DELETE: #{domain.template_name}]" : "" + puts " - #{domain.name}#{fd_status}" + end + end + end + + def estonian_org?(contact) + contact.ident_type == 'org' && contact.ident_country_code == 'EE' end end From cbdcafc1a7fd53b8667ecb880ceb9e33c3d9b784 Mon Sep 17 00:00:00 2001 From: oleghasjanov Date: Mon, 15 Dec 2025 09:41:31 +0200 Subject: [PATCH 4/4] added soap error handler --- Gemfile | 2 +- Gemfile.lock | 4 ++-- app/jobs/company_register_status_for_single_domain_job.rb | 5 +++++ app/models/contact/company_register.rb | 6 ++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 124b3dc09b..a0a75b0c17 100644 --- a/Gemfile +++ b/Gemfile @@ -62,7 +62,7 @@ gem 'omniauth-tara', github: 'internetee/omniauth-tara' # gem 'omniauth-tara', path: 'vendor/gems/omniauth-tara' gem 'airbrake' -gem 'company_register', github: 'internetee/company_register', branch: :master +gem 'company_register', github: 'internetee/company_register', branch: 'soap-fault-exception-handler' gem 'directo', github: 'internetee/directo', branch: 'master' gem 'domain_name' gem 'dry-struct' diff --git a/Gemfile.lock b/Gemfile.lock index 8766da290d..9f166587e0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ GIT remote: https://github.com/internetee/company_register.git - revision: 2c31da54c57db13324161eeb8db7e9f81af81987 - branch: master + revision: f87f64b231f112ccfdb1dac5e43965f9fd7b2c56 + branch: soap-fault-exception-handler specs: company_register (0.1.0) activesupport diff --git a/app/jobs/company_register_status_for_single_domain_job.rb b/app/jobs/company_register_status_for_single_domain_job.rb index 467bcd0895..1ac8431ffc 100644 --- a/app/jobs/company_register_status_for_single_domain_job.rb +++ b/app/jobs/company_register_status_for_single_domain_job.rb @@ -98,6 +98,8 @@ def check_registry(registration_number) # Simple data (status) puts " Calling simple_data..." simple_data = client.simple_data(registration_number: registration_number) + + if simple_data.blank? puts " Simple data: EMPTY (company not found in registry)" @company_status = nil @@ -131,6 +133,9 @@ def check_registry(registration_number) puts " Raw company_details: #{company_details.inspect}" end end + rescue CompanyRegister::SoapFaultError => e + puts " ERROR: Company register SOAP fault: #{e.message}" + return rescue CompanyRegister::NotAvailableError => e puts "" puts " ERROR: Company register not available!" diff --git a/app/models/contact/company_register.rb b/app/models/contact/company_register.rb index e0d2e822fe..e2a5a67598 100644 --- a/app/models/contact/company_register.rb +++ b/app/models/contact/company_register.rb @@ -16,6 +16,9 @@ def return_company_data return unless org? company_register.simple_data(registration_number: ident.to_s) + rescue CompanyRegister::SoapFaultError => e + Rails.logger.error("Error getting company data for #{ident}: #{e.message}") + false rescue CompanyRegister::NotAvailableError [] end @@ -24,6 +27,9 @@ def return_company_details return unless org? company_register.company_details(registration_number: ident.to_s) + rescue CompanyRegister::SoapFaultError => e + Rails.logger.error("Error getting company details for #{ident}: #{e.message}") + false rescue CompanyRegister::NotAvailableError [] end