diff --git a/.codeclimate.yml b/.codeclimate.yml index 3760d0042a..ec9b25820d 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -33,12 +33,10 @@ exclude_patterns: - "lib/gem_ext/" - "lib/tasks/api_log.rake" - "lib/tasks/bootstrap.rake" - - "lib/tasks/convert.rake" - "lib/tasks/db.rake" - "lib/tasks/documents.rake" - "lib/tasks/import.rake" - "lib/tasks/legal_doc.rake" - - "lib/tasks/statuses.rake" - "lib/tasks/whois.rake" - "spec/" - "test/" diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dc8e6bbed..d7554c0b8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +27.8.2019 +* Added some new database constraints [#1265](https://github.com/internetee/registry/pull/1265) + +26.08.2019 +* Introduced automatic payment processing using LHV Connect [#1232](https://github.com/internetee/registry/issues/1232) +* removed unused script [#1261](https://github.com/internetee/registry/pull/1261) +* removed unused factory [#1262](https://github.com/internetee/registry/pull/1262) +* removed unused seller_it column from invoices db table [#1264](https://github.com/internetee/registry/pull/1264) +* removed unused rake tasks [#1268](https://github.com/internetee/registry/pull/1268) + +21.08.2019 +* Nokogiri update to 1.10.4 (CVE-2019-5477) [#1266](https://github.com/internetee/registry/pull/1266) + 08.07.2019 * Invoices are not delivered to e-invoice provider when registrar has no billing email [#1255](https://github.com/internetee/registry/issues/1255) diff --git a/Gemfile b/Gemfile index fb61fd2baa..59882bed6e 100644 --- a/Gemfile +++ b/Gemfile @@ -92,6 +92,7 @@ gem 'airbrake' gem 'company_register', github: 'internetee/company_register', branch: :master gem 'e_invoice', github: 'internetee/e_invoice', branch: :master +gem 'lhv', github: 'internetee/lhv', tag: 'v0.1.0' group :development do # deploy diff --git a/Gemfile.lock b/Gemfile.lock index 094e337880..966cce0779 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -41,6 +41,15 @@ GIT hpricot libxml-ruby +GIT + remote: https://github.com/internetee/lhv.git + revision: e211516bc5fff2139584d4da41c17511863c229d + tag: v0.1.0 + specs: + lhv (0.1.0) + keystores + nokogiri + GIT remote: https://github.com/tarmotalu/digidoc_client.git revision: 1645e83a5a548addce383f75703b0275c5310c32 @@ -231,6 +240,7 @@ GEM kaminari (0.16.3) actionpack (>= 3.0.0) activesupport (>= 3.0.0) + keystores (0.4.0) libxml-ruby (3.0.0) loofah (2.2.3) crass (~> 1.0.2) @@ -479,6 +489,7 @@ DEPENDENCIES jquery-rails (= 4.0.4) jquery-ui-rails (= 5.0.5) kaminari (= 0.16.3) + lhv! mina (= 0.3.1) money-rails nokogiri diff --git a/app/models/invoice.rb b/app/models/invoice.rb index a36825848d..cde439c706 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -3,7 +3,6 @@ class Invoice < ActiveRecord::Base include Concerns::Invoice::Cancellable include Concerns::Invoice::Payable - belongs_to :seller, class_name: 'Registrar' belongs_to :buyer, class_name: 'Registrar' has_one :account_activity has_many :items, class_name: 'InvoiceItem', dependent: :destroy @@ -36,7 +35,7 @@ class Invoice < ActiveRecord::Base attribute :vat_rate, ::Type::VATRate.new def set_invoice_number - last_no = Invoice.order(number: :desc).where('number IS NOT NULL').limit(1).pluck(:number).first + last_no = Invoice.order(number: :desc).limit(1).pluck(:number).first if last_no && last_no >= Setting.invoice_number_min.to_i self.number = last_no + 1 diff --git a/app/views/registrar/invoices/index.haml b/app/views/registrar/invoices/index.haml index 9ed8b91d54..76a2966b53 100644 --- a/app/views/registrar/invoices/index.haml +++ b/app/views/registrar/invoices/index.haml @@ -57,7 +57,7 @@ %th{class: 'col-xs-3'}= t(:total) %tbody - @invoices.each do |invoice| - %tr.invoice + %tr %td= link_to(invoice, [:registrar, invoice]) - if invoice.paid? %td= l invoice.receipt_date diff --git a/bin/update-repo b/bin/update-repo deleted file mode 100755 index ae0cd536b1..0000000000 --- a/bin/update-repo +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# -# Update repo -# - -# cd to Rails root directory -cd "$(dirname "$0")"; cd .. - -git pull origin master &> /dev/null -git reset --hard &> /dev/null -unset GIT_DIR GIT_WORK_TREE diff --git a/config/application-example.yml b/config/application-example.yml index 0738a92784..de0e8f6819 100644 --- a/config/application-example.yml +++ b/config/application-example.yml @@ -152,6 +152,12 @@ action_mailer_default_port: # default: no port (80) action_mailer_default_from: # no-reply@example.com action_mailer_force_delete_from: # `From` header for `DomainDeleteMailer#forced` email +lhv_keystore: +lhv_keystore_password: +lhv_keystore_alias: +lhv_ca_file: # Needed only in dev mode +lhv_dev_mode: 'false' + # Since the keys for staging are absent from the repo, we need to supply them separate for testing. test: payments_seb_bank_certificate: 'test/fixtures/files/seb_bank_cert.pem' @@ -161,6 +167,9 @@ test: action_mailer_default_host: 'registry.test' action_mailer_default_from: 'no-reply@registry.test' action_mailer_force_delete_from: 'legal@registry.test' + lhv_keystore: 'test/fixtures/files/keystore.jks' + lhv_keystore_password: 'testtest' + lhv_keystore_alias: 'testtest' # Airbrake // Errbit: airbrake_host: "https://your-errbit-host.ee" diff --git a/config/schedule.rb b/config/schedule.rb index d47b45ea91..fe920dc6de 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -57,6 +57,13 @@ every 42.minutes do rake 'domain:discard' end + + # Should be at least once every 4 days, since according to LHV specs: + # "Unread messages older than 5 days are automatically scheduled for deletion" + # https://partners.lhv.ee/en/connect/#messaging + every :day, at: '12:01am' do + rake 'invoices:process_payments' + end end every 10.minutes do diff --git a/db/migrate/20190811184334_remove_invoices_seller_id.rb b/db/migrate/20190811184334_remove_invoices_seller_id.rb new file mode 100644 index 0000000000..d96dfedb41 --- /dev/null +++ b/db/migrate/20190811184334_remove_invoices_seller_id.rb @@ -0,0 +1,5 @@ +class RemoveInvoicesSellerId < ActiveRecord::Migration + def change + remove_column :invoices, :seller_id + end +end diff --git a/db/migrate/20190811195814_change_invoices_number_to_not_null.rb b/db/migrate/20190811195814_change_invoices_number_to_not_null.rb new file mode 100644 index 0000000000..122e27572a --- /dev/null +++ b/db/migrate/20190811195814_change_invoices_number_to_not_null.rb @@ -0,0 +1,5 @@ +class ChangeInvoicesNumberToNotNull < ActiveRecord::Migration + def change + change_column_null :invoices, :number, false + end +end diff --git a/db/migrate/20190811202042_add_invoices_number_uniq_constraint.rb b/db/migrate/20190811202042_add_invoices_number_uniq_constraint.rb new file mode 100644 index 0000000000..4232143556 --- /dev/null +++ b/db/migrate/20190811202042_add_invoices_number_uniq_constraint.rb @@ -0,0 +1,13 @@ +class AddInvoicesNumberUniqConstraint < ActiveRecord::Migration + def up + execute <<-SQL + ALTER TABLE invoices ADD CONSTRAINT unique_number UNIQUE (number) + SQL + end + + def down + execute <<-SQL + ALTER TABLE invoices DROP CONSTRAINT unique_number + SQL + end +end diff --git a/db/migrate/20190811202347_add_invoices_buyer_id_fk.rb b/db/migrate/20190811202347_add_invoices_buyer_id_fk.rb new file mode 100644 index 0000000000..de2a82fcd6 --- /dev/null +++ b/db/migrate/20190811202347_add_invoices_buyer_id_fk.rb @@ -0,0 +1,5 @@ +class AddInvoicesBuyerIdFk < ActiveRecord::Migration + def change + add_foreign_key :invoices, :registrars, column: :buyer_id + end +end diff --git a/db/migrate/20190811202711_change_invoices_required_columns_to_not_null.rb b/db/migrate/20190811202711_change_invoices_required_columns_to_not_null.rb new file mode 100644 index 0000000000..fc8f0f895a --- /dev/null +++ b/db/migrate/20190811202711_change_invoices_required_columns_to_not_null.rb @@ -0,0 +1,15 @@ +class ChangeInvoicesRequiredColumnsToNotNull < ActiveRecord::Migration + def change + change_column_null :invoices, :buyer_id, false + change_column_null :invoices, :seller_reg_no, false + change_column_null :invoices, :seller_bank, false + change_column_null :invoices, :seller_swift, false + change_column_null :invoices, :seller_country_code, false + change_column_null :invoices, :seller_street, false + change_column_null :invoices, :seller_city, false + change_column_null :invoices, :buyer_reg_no, false + change_column_null :invoices, :buyer_country_code, false + change_column_null :invoices, :buyer_street, false + change_column_null :invoices, :buyer_city, false + end +end diff --git a/db/migrate/20190811205406_change_invoices_required_columns_to_not_null_part2.rb b/db/migrate/20190811205406_change_invoices_required_columns_to_not_null_part2.rb new file mode 100644 index 0000000000..57e9d7d9bd --- /dev/null +++ b/db/migrate/20190811205406_change_invoices_required_columns_to_not_null_part2.rb @@ -0,0 +1,7 @@ +class ChangeInvoicesRequiredColumnsToNotNullPart2 < ActiveRecord::Migration + def change + change_column_null :invoices, :seller_email, false + change_column_null :invoices, :seller_contact_name, false + change_column_null :invoices, :buyer_email, false + end +end diff --git a/db/structure.sql b/db/structure.sql index befd74afd3..0dcb196439 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -935,36 +935,35 @@ CREATE TABLE public.invoices ( description character varying, reference_no character varying NOT NULL, vat_rate numeric(4,3) NOT NULL, - seller_id integer, seller_name character varying NOT NULL, - seller_reg_no character varying, + seller_reg_no character varying NOT NULL, seller_iban character varying NOT NULL, - seller_bank character varying, - seller_swift character varying, + seller_bank character varying NOT NULL, + seller_swift character varying NOT NULL, seller_vat_no character varying, - seller_country_code character varying, + seller_country_code character varying NOT NULL, seller_state character varying, - seller_street character varying, - seller_city character varying, + seller_street character varying NOT NULL, + seller_city character varying NOT NULL, seller_zip character varying, seller_phone character varying, seller_url character varying, - seller_email character varying, - seller_contact_name character varying, - buyer_id integer, + seller_email character varying NOT NULL, + seller_contact_name character varying NOT NULL, + buyer_id integer NOT NULL, buyer_name character varying NOT NULL, - buyer_reg_no character varying, - buyer_country_code character varying, + buyer_reg_no character varying NOT NULL, + buyer_country_code character varying NOT NULL, buyer_state character varying, - buyer_street character varying, - buyer_city character varying, + buyer_street character varying NOT NULL, + buyer_city character varying NOT NULL, buyer_zip character varying, buyer_phone character varying, buyer_url character varying, - buyer_email character varying, + buyer_email character varying NOT NULL, creator_str character varying, updator_str character varying, - number integer, + number integer NOT NULL, cancelled_at timestamp without time zone, total numeric(10,2) NOT NULL, in_directo boolean DEFAULT false, @@ -3199,6 +3198,14 @@ ALTER TABLE ONLY public.registrars ADD CONSTRAINT unique_name UNIQUE (name); +-- +-- Name: unique_number; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY public.invoices + ADD CONSTRAINT unique_number UNIQUE (number); + + -- -- Name: unique_reference_no; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -3453,13 +3460,6 @@ CREATE INDEX index_invoice_items_on_invoice_id ON public.invoice_items USING btr CREATE INDEX index_invoices_on_buyer_id ON public.invoices USING btree (buyer_id); --- --- Name: index_invoices_on_seller_id; Type: INDEX; Schema: public; Owner: -; Tablespace: --- - -CREATE INDEX index_invoices_on_seller_id ON public.invoices USING btree (seller_id); - - -- -- Name: index_keyrelays_on_accepter_id; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -3913,6 +3913,14 @@ ALTER TABLE ONLY public.domains ADD CONSTRAINT domains_registrar_id_fk FOREIGN KEY (registrar_id) REFERENCES public.registrars(id); +-- +-- Name: fk_rails_242b91538b; Type: FK CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.invoices + ADD CONSTRAINT fk_rails_242b91538b FOREIGN KEY (buyer_id) REFERENCES public.registrars(id); + + -- -- Name: fk_rails_59c422f73d; Type: FK CONSTRAINT; Schema: public; Owner: - -- @@ -4817,3 +4825,15 @@ INSERT INTO schema_migrations (version) VALUES ('20190617122505'); INSERT INTO schema_migrations (version) VALUES ('20190620084334'); +INSERT INTO schema_migrations (version) VALUES ('20190811184334'); + +INSERT INTO schema_migrations (version) VALUES ('20190811195814'); + +INSERT INTO schema_migrations (version) VALUES ('20190811202042'); + +INSERT INTO schema_migrations (version) VALUES ('20190811202347'); + +INSERT INTO schema_migrations (version) VALUES ('20190811202711'); + +INSERT INTO schema_migrations (version) VALUES ('20190811205406'); + diff --git a/lib/tasks/convert.rake b/lib/tasks/convert.rake deleted file mode 100644 index 47e0ec7c2d..0000000000 --- a/lib/tasks/convert.rake +++ /dev/null @@ -1,117 +0,0 @@ -namespace :convert do - desc 'Convert punycodes to unicode' - task punycode: :environment do - start = Time.zone.now.to_f - puts "-----> Convert domain punycodes to unicode..." - count = 0 - Domain.find_each(:batch_size => 1000) do |x| - old_name = x.name - if old_name != SimpleIDN.to_unicode(x.name.strip.downcase) - x.update_column(:name, (SimpleIDN.to_unicode(x.name.strip.downcase))) - x.update_column(:name_puny, (SimpleIDN.to_ascii(x.name.strip.downcase))) - count += 1 - puts "Domain #{x.id} changed from #{old_name} to #{SimpleIDN.to_unicode(old_name)} " - end - end - puts "-----> all done in #{(Time.zone.now.to_f - start).round(2)} seconds. #{count} domains changed." - end - - desc 'Convert punycodes in history to unicode' - task history_punycode: :environment do - DomainVersion.find_each do |d| - if obj = d.object - obj["name"] = SimpleIDN.to_unicode(obj["name"]) - obj["name_puny"] = SimpleIDN.to_ascii(obj["name_puny"]) - d.object = obj - end - if (obj_c = d.object_changes).present? - obj_c["name"].map!{|e| e ? SimpleIDN.to_unicode(e) : e } if obj_c["name"] - obj_c["name_puny"].map!{|e| e ? SimpleIDN.to_ascii(e) : e } if obj_c["name_puny"] - d.object_changes = obj_c - end - d.save! - end - end - - - desc 'Contact Address Country Code Upcase' - task country_code_upcase: :environment do - count = 0 - Contact.find_each do |c| - if c.country_code.present? && c.country_code != c.country_code.upcase - c.country_code = c.country_code.upcase - c.update_columns(country_code: c.country_code.upcase) - - count +=1 - puts "#{count} contacts has been changed" if count % 1000 == 0 - end - end - puts "Contacts change has been finished. Starting ContactVersions" - - count = 0 - ContactVersion.find_each do |c| - if (if_object = (c.object && c.object["country_code"].present? && c.object["country_code"] != c.object["country_code"].upcase)) || - (if_changes = (c.object_changes && c.object_changes["country_code"].present? && c.object_changes["country_code"] != c.object_changes["country_code"].map{|e|e.try(:upcase)})) - - if if_object - h = c.object - h["country_code"] = h["country_code"].try(:upcase) - c.object = h - end - - if if_changes - h = c.object_changes - h["country_code"] = h["country_code"].map{|e|e.try(:upcase)} - c.object_changes = h - end - c.update_columns(object: c.object, object_changes: c.object_changes) - - count +=1 - puts "#{count} contact histories has been changed" if count % 1000 == 0 - end - end - end - - desc 'Convert nameservers hostname and hostname_puny' - task nameserves_hostname: :environment do - - start = Time.zone.now.to_f - count = 0 - puts '-----> Converting hostnames...' - - Nameserver.find_each(:batch_size => 1000) do |ns| - ns.hostname = SimpleIDN.to_unicode(ns.hostname) - ns.hostname_puny = SimpleIDN.to_ascii(ns.hostname_puny) - ns.save validate: false - count += 1 - puts "-----> Converted #{count} nameservers" if count % 1000 == 0 - end - puts "-----> Converted #{count} nameservers #{(Time.zone.now.to_f - start).round(2)} seconds" - - end - - desc 'Convert nameservers history hostname' - task nameserves_history_hostname: :environment do - - start = Time.zone.now.to_f - count = 0 - puts '-----> Converting hostnames history...' - - NameserverVersion.find_each do |ns| - if obj = ns.object - obj["hostname"] = SimpleIDN.to_unicode(obj["hostname"]) - ns.object = obj - end - - if (obj_c = ns.object_changes).present? - obj_c["name"].map!{|e| e ? SimpleIDN.to_unicode(e) : e } if obj_c["hostname"] - ns.object_changes = obj_c - end - count += 1 - ns.save! - end - puts "-----> Converted #{count} history rows #{(Time.zone.now.to_f - start).round(2)} seconds" - end - -end - diff --git a/lib/tasks/dev/create_bank_transactions/bank_transactions.xml b/lib/tasks/dev/create_bank_transactions/bank_transactions.xml new file mode 100644 index 0000000000..72a53b697d --- /dev/null +++ b/lib/tasks/dev/create_bank_transactions/bank_transactions.xml @@ -0,0 +1,73 @@ + + + + + populated by rake task + 2019-07-28T10:00:00 + 1 + + 0.1 + + ABC Corporation + + + + test3 + TRF + false + 1 + 2019-07-28 + + test + + + + populated by rake task + + EUR + + + + LHVBEE22 + + + + + ABC/090928/CCT001/01 + ABC/4562/2009-09-08 + + + + 0.1 + + SHAR + + + LHVBEE22 + + + + DEF Electronics + + Corn Exchange 5th Floor + + + + + populated by rake task + + + + + 1 + + + + 13 + + + + + + + diff --git a/lib/tasks/dev/create_bank_transactions/create_bank_transactions.rake b/lib/tasks/dev/create_bank_transactions/create_bank_transactions.rake new file mode 100644 index 0000000000..33614d049f --- /dev/null +++ b/lib/tasks/dev/create_bank_transactions/create_bank_transactions.rake @@ -0,0 +1,41 @@ +namespace :dev do + task create_bank_transactions: :environment do + remitter_iban = ENV['remitter_iban'] + beneficiary_iban = Setting.registry_iban + + keystore_password = ENV['lhv_keystore_password'] + keystore_alias = ENV['lhv_keystore_alias'] + keystore = Keystores::JavaKeystore.new + keystore.load(ENV['lhv_keystore'], keystore_password) + cert = keystore.get_certificate(keystore_alias) + key = keystore.get_key(keystore_alias, keystore_password) + + api_base_uri = URI.parse('https://testconnect.lhv.eu/connect-prelive') + request_headers = { 'content-type' => 'application/xml' } + + request_xml = File.binread(File.join(__dir__, 'bank_transactions.xml')) + request_xml_doc = Nokogiri::XML(request_xml) + request_xml_doc.at_css('CstmrCdtTrfInitn > GrpHdr > MsgId').content = SecureRandom.hex + request_xml_doc.at_css('CstmrCdtTrfInitn > PmtInf > DbtrAcct > Id > IBAN') + .content = remitter_iban + request_xml_doc.at_css('CstmrCdtTrfInitn > PmtInf > CdtTrfTxInf > CdtrAcct > Id > IBAN') + .content = beneficiary_iban + request_body = request_xml_doc.to_xml + + http = Net::HTTP.new(api_base_uri.host, api_base_uri.port) + http.use_ssl = api_base_uri.is_a?(URI::HTTPS) + http.cert = cert + http.key = key + http.ca_file = ENV['lhv_ca_file'] + + http.start do + response = http.post(api_base_uri.path + '/payment', request_body, request_headers) + + if response.is_a?(Net::HTTPSuccess) + puts 'Success' + else + puts 'Failure' + end + end + end +end \ No newline at end of file diff --git a/lib/tasks/invoices/process_payments.rake b/lib/tasks/invoices/process_payments.rake new file mode 100644 index 0000000000..6e4c572139 --- /dev/null +++ b/lib/tasks/invoices/process_payments.rake @@ -0,0 +1,49 @@ +namespace :invoices do + task process_payments: :environment do + registry_bank_account_iban = Setting.registry_iban + + keystore_password = ENV['lhv_keystore_password'] + keystore_alias = ENV['lhv_keystore_alias'] + keystore = Keystores::JavaKeystore.new + keystore.load(ENV['lhv_keystore'], keystore_password) + cert = keystore.get_certificate(keystore_alias) + key = keystore.get_key(keystore_alias, keystore_password) + + api = Lhv::ConnectApi.new + api.cert = cert + api.key = key + api.ca_file = ENV['lhv_ca_file'] + api.dev_mode = ENV['lhv_dev_mode'] == 'true' + + incoming_transactions = [] + + api.credit_debit_notification_messages.each do |message| + next unless message.bank_account_iban == registry_bank_account_iban + + message.credit_transactions.each do |credit_transaction| + incoming_transactions << credit_transaction + end + end + + if incoming_transactions.any? + bank_statement = BankStatement.new(bank_code: Setting.registry_bank_code, + iban: Setting.registry_iban) + + ActiveRecord::Base.transaction do + bank_statement.save! + + incoming_transactions.each do |incoming_transaction| + transaction_attributes = { sum: incoming_transaction.amount, + currency: incoming_transaction.currency, + paid_at: incoming_transaction.date, + reference_no: incoming_transaction.payment_reference_number, + description: incoming_transaction.payment_description } + transaction = bank_statement.bank_transactions.create!(transaction_attributes) + transaction.autobind_invoice + end + end + end + + puts "Transactions processed: #{incoming_transactions.size}" + end +end \ No newline at end of file diff --git a/lib/tasks/statuses.rake b/lib/tasks/statuses.rake deleted file mode 100644 index 61adf372d4..0000000000 --- a/lib/tasks/statuses.rake +++ /dev/null @@ -1,625 +0,0 @@ -desc 'Schema load for all databases: registry, api_log and whois' -task statuses: [:environment] do - statuses = { - 'ok': [ - ], - 'inactive': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'clientDeleteProhibited': [ - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverDeleteProhibited': [ - 'clientDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'clientHold': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverHold': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'clientRenewProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingTransfer', - 'pendingUpdate', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverRenewProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingTransfer', - 'pendingUpdate', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'clientTransferProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingUpdate', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverTransferProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingUpdate', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'clientUpdateProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingTransfer', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverUpdateProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingTransfer', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'pendingCreate': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'pendingDelete': [ - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingDeleteConfirmation', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'pendingRenew': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - - ], - 'pendingTransfer': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'pendingUpdate': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'inactive', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverManualInzone': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingTransfer', - 'pendingUpdate', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverRegistrantChangeProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingTransfer', - 'pendingUpdate', - 'serverManualInzone', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverAdminChangeProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingTransfer', - 'pendingUpdate', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverTechChangeProhibited': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingTransfer', - 'pendingUpdate', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'serverForceDelete': [ - 'clientHold', - 'serverHold', - 'inactive', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'deleteCandidate', - 'expired' - ], - 'deleteCandidate': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingTransfer', - 'pendingUpdate', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate', - 'expired' - ], - 'expired': [ - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientHold', - 'serverHold', - 'clientRenewProhibited', - 'serverRenewProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'inactive', - 'pendingCreate', - 'pendingDelete', - 'pendingDeleteConfirmation', - 'pendingRenew', - 'pendingTransfer', - 'pendingUpdate', - 'serverManualInzone', - 'serverRegistrantChangeProhibited', - 'serverAdminChangeProhibited', - 'serverTechChangeProhibited', - 'serverForceDelete', - 'deleteCandidate' - ] - } - - puts "\nDomain status can be with other statuses map\n" - puts "---------------------------------------------" - statuses.each do |s, _v| - puts "\n#{s} =>" - statuses[s].map { |u| puts " #{u}" } - puts - end - - contact_statuses = { - 'ok': [ - 'linked' - ], - 'linked': [ - 'ok' - ], - 'clientDeleteProhibited': [ - 'linked', - 'serverDeleteProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'pendingCreate', - 'pendingTransfer', - 'pendingUpdate' - ], - 'serverDeleteProhibited': [ - 'linked', - 'clientDeleteProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'pendingCreate', - 'pendingTransfer', - 'pendingUpdate' - ], - 'clientTransferProhibited': [ - 'linked', - 'serverDeleteProhibited', - 'clientDeleteProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'pendingCreate', - 'pendingDelete', - 'pendingUpdate' - ], - 'serverTransferProhibited': [ - 'linked', - 'serverDeleteProhibited', - 'clientDeleteProhibited', - 'clientTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited', - 'pendingCreate', - 'pendingDelete', - 'pendingUpdate' - ], - 'clientUpdateProhibited': [ - 'linked', - 'serverDeleteProhibited', - 'clientDeleteProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'serverUpdateProhibited', - 'pendingCreate', - 'pendingDelete', - 'pendingTransfer' - ], - 'serverUpdateProhibited': [ - 'linked', - 'serverDeleteProhibited', - 'clientDeleteProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'pendingCreate', - 'pendingDelete', - 'pendingTransfer' - ], - 'pendingCreate': [ - 'linked', - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited' - ], - 'pendingDelete': [ - 'linked', - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited' - ], - 'pendingTransfer': [ - 'linked', - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited' - ], - 'pendingUpdate': [ - 'linked', - 'clientDeleteProhibited', - 'serverDeleteProhibited', - 'clientTransferProhibited', - 'serverTransferProhibited', - 'clientUpdateProhibited', - 'serverUpdateProhibited' - ] - } - - puts "\n\nContact status can be with other statuses map\n" - puts "---------------------------------------------" - contact_statuses.each do |s, _v| - puts "\n#{s} =>" - contact_statuses[s].map { |u| puts " #{u}" } - puts - end -end diff --git a/spec/factories/bank_transaction.rb b/spec/factories/bank_transaction.rb deleted file mode 100644 index ebe4719848..0000000000 --- a/spec/factories/bank_transaction.rb +++ /dev/null @@ -1,8 +0,0 @@ -FactoryBot.define do - factory :bank_transaction do - currency { 'EUR' } - sum { 100.0 } - description { 'Invoice no. 1' } - reference_no { 'RF2405752128' } - end -end diff --git a/test/fixtures/files/keystore.jks b/test/fixtures/files/keystore.jks new file mode 100644 index 0000000000..7ce34f308d Binary files /dev/null and b/test/fixtures/files/keystore.jks differ diff --git a/test/fixtures/invoices.yml b/test/fixtures/invoices.yml index c3e3bac797..3fe18b4b2b 100644 --- a/test/fixtures/invoices.yml +++ b/test/fixtures/invoices.yml @@ -3,9 +3,22 @@ one: due_date: <%= Date.parse '2010-07-06' %> currency: EUR seller_name: Seller Ltd + seller_reg_no: 1234 seller_iban: US75512108001245126199 + seller_bank: Main Bank + seller_swift: swift + seller_email: info@seller.test + seller_country_code: US + seller_street: Main Street 1 + seller_city: New York + seller_contact_name: John Doe buyer: bestnames buyer_name: Buyer Ltd + buyer_reg_no: 12345 + buyer_email: info@buyer.test + buyer_country_code: GB + buyer_street: Main Street 2 + buyer_city: London vat_rate: 0.1 total: 16.50 reference_no: 13 diff --git a/test/system/registrar_area/invoices/list_test.rb b/test/system/registrar_area/invoices/list_test.rb index e63d8c1a48..b6d659a96b 100644 --- a/test/system/registrar_area/invoices/list_test.rb +++ b/test/system/registrar_area/invoices/list_test.rb @@ -3,10 +3,9 @@ class ListInvoicesTest < ApplicationSystemTestCase setup do @user = users(:api_bestnames) - sign_in @user - @invoice = invoices(:one) - eliminate_effect_of_other_invoices + + sign_in @user end def test_show_balance @@ -14,31 +13,23 @@ def test_show_balance assert_text "Your current account balance is 100,00 EUR" end - def test_show_invoices_of_current_registrar - registrar = registrars(:bestnames) - @user.update!(registrar: registrar) - @invoice.update!(seller: registrar) + def test_shows_invoice_owned_by_current_user + owning_registrar = registrars(:bestnames) + assert_equal owning_registrar, @user.registrar + @invoice.update!(buyer: owning_registrar) visit registrar_invoices_url - assert_css '.invoice' + assert_text @invoice.to_s end - def test_do_not_show_invoices_of_other_registrars - registrar = registrars(:goodnames) - @user.update!(registrar: registrar) - @invoice.update!(seller: registrar) + def test_hides_invoice_owned_by_other_user + other_registrar = registrars(:goodnames) + assert_not_equal other_registrar, @user.registrar + @invoice.update!(buyer: other_registrar) visit registrar_invoices_url - assert_no_css '.invoice' - end - - private - - def eliminate_effect_of_other_invoices - Invoice.connection.disable_referential_integrity do - Invoice.delete_all("id != #{@invoice.id}") - end + assert_no_text @invoice.to_s end end \ No newline at end of file diff --git a/test/tasks/invoices/process_payments_test.rb b/test/tasks/invoices/process_payments_test.rb new file mode 100644 index 0000000000..8c3b6ec73d --- /dev/null +++ b/test/tasks/invoices/process_payments_test.rb @@ -0,0 +1,78 @@ +require 'test_helper' + +class ProcessPaymentsTaskTest < ActiveSupport::TestCase + setup do + @payment_amount = payment_amount = 0.1 + @payment_currency = payment_currency = 'EUR' + @payment_date = payment_date = Date.parse('2010-07-05') + @payment_reference_number = payment_reference_number = '13' + @payment_description = payment_description = @invoice_number = '1234' + beneficiary_iban = 'GB33BUKB20201555555555' + + @invoice = create_payable_invoice(number: @invoice_number, + total: payment_amount, + currency: @payment_currency, + reference_no: @payment_reference_number) + Setting.registry_iban = beneficiary_iban + + Lhv::ConnectApi.class_eval do + define_method :credit_debit_notification_messages do + transaction = OpenStruct.new(amount: payment_amount, + currency: payment_currency, + date: payment_date, + payment_reference_number: payment_reference_number, + payment_description: payment_description) + message = OpenStruct.new(bank_account_iban: beneficiary_iban, + credit_transactions: [transaction]) + [message] + end + end + end + + def test_doubles_are_valid + assert Lhv::ConnectApi.method_defined?(:credit_debit_notification_messages) + assert Lhv::ConnectApi::Messages::CreditDebitNotification.method_defined?(:bank_account_iban) + assert Lhv::ConnectApi::Messages::CreditDebitNotification.method_defined?(:credit_transactions) + end + + def test_saves_transactions + assert_difference 'BankStatement.count' do + assert_difference 'BankTransaction.count' do + capture_io { run_task } + end + end + transaction = BankTransaction.last + assert_equal @payment_amount, transaction.sum + assert_equal @payment_currency, transaction.currency + assert_equal @payment_date, transaction.paid_at.to_date + assert_equal @payment_reference_number, transaction.reference_no + assert_equal @payment_description, transaction.description + end + + def test_marks_matched_invoice_as_paid + assert @invoice.unpaid? + + capture_io { run_task } + @invoice.reload + + assert @invoice.paid? + end + + def test_output + assert_output "Transactions processed: 1\n" do + run_task + end + end + + private + + def run_task + Rake::Task['invoices:process_payments'].execute + end + + def create_payable_invoice(attributes = {}) + invoice = invoices(:one) + invoice.update!({ account_activity: nil, cancelled_at: nil }.merge(attributes)) + invoice + end +end \ No newline at end of file