diff --git a/Gemfile.lock b/Gemfile.lock
index 4bc35aafc..4ca0aeb22 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -9,7 +9,7 @@ GIT
GIT
remote: https://github.com/internetee/directo.git
- revision: 41f4b49da2d4155a76ab57f1cb07bb1d0ba9cdef
+ revision: c688c46134ce04f5a75b7a0563abc18cd9af030a
branch: directo-api
specs:
directo (0.1.0)
diff --git a/app/controllers/concerns/book_keeping.rb b/app/controllers/concerns/book_keeping.rb
index 284b6db71..e9d3e9ee9 100644
--- a/app/controllers/concerns/book_keeping.rb
+++ b/app/controllers/concerns/book_keeping.rb
@@ -6,6 +6,8 @@ module BookKeeping
def monthly_summary(month:)
activities = monthly_activites(month)
+ return unless activities.any?
+
inv = {
'number': 1,
'customer_code': accounting_customer_code,
@@ -15,6 +17,8 @@ module BookKeeping
}.as_json
lines = []
+
+ lines << { 'description': title_for_summary(month) }
activities.each do |activity|
fetch_invoice_lines(activity, lines)
end
@@ -25,11 +29,23 @@ module BookKeeping
inv
end
+ def title_for_summary(date)
+ if language == 'en'
+ I18n.with_locale('en') do
+ "Domains registrations - #{I18n.l(date, format: '%B %Y')}"
+ end
+ else
+ I18n.with_locale('et') do
+ "Domeenide registreerimine - #{I18n.l(date, format: '%B %Y')}"
+ end
+ end
+ end
+
def fetch_invoice_lines(activity, lines)
price = load_price(activity)
if price.duration.include? 'year'
price.duration.to_i.times do |duration|
- lines << new_montly_invoice_line(activity: activity, duration: duration + 1).as_json
+ lines << new_monthly_invoice_line(activity: activity, duration: duration + 1).as_json
end
else
lines << new_monthly_invoice_line(activity: activity).as_json
@@ -42,27 +58,28 @@ module BookKeeping
.where(activity_type: [AccountActivity::CREATE, AccountActivity::RENEW])
end
- def new_montly_invoice_line(activity:, duration: nil)
+ def new_monthly_invoice_line(activity:, duration: nil)
price = load_price(activity)
yearly = price.duration.include?('year')
line = {
'product_id': DOMAIN_TO_PRODUCT[price.zone_name.to_sym],
'quantity': 1,
- 'price': yearly ? (price.price.amount / price.duration.to_i) : price.amount,
+ 'price': yearly ? (price.price.amount / price.duration.to_i) : price.price.amount,
'unit': language == 'en' ? 'pc' : 'tk'
}
line['description'] = description_in_language(price: price, yearly: yearly)
- add_product_timeframe(line: line, activity: activity, duration: duration) if duration > 1
+ if yearly && duration
+ add_product_timeframe(line: line, activity: activity, duration: duration) if duration > 1
+ end
line
end
def add_product_timeframe(line:, activity:, duration:)
create_time = activity.created_at
- start_date = (create_time + (duration - 1).year).end_of_month
- end_date = (create_time + (duration - 1).year + 1).end_of_month
- line['period'] = start_date..end_date
+ line['start_date'] = (create_time + (duration - 1).year).end_of_month.strftime('%Y-%m-%d')
+ line['end_date'] = (create_time + (duration - 1).year + 1).end_of_month.strftime('%Y-%m-%d')
end
def description_in_language(price:, yearly:)
diff --git a/app/jobs/directo_invoice_forward_job.rb b/app/jobs/directo_invoice_forward_job.rb
index 3f0b11486..cd228fdaf 100644
--- a/app/jobs/directo_invoice_forward_job.rb
+++ b/app/jobs/directo_invoice_forward_job.rb
@@ -33,6 +33,8 @@ class DirectoInvoiceForwardJob < Que::Job
next unless registrar.cash_account
invoice = registrar.monthly_summary(month: month)
+ next if invoice.nil?
+
@client.invoices.add_with_schema(invoice: invoice, schema: 'summary')
end
@@ -104,9 +106,9 @@ class DirectoInvoiceForwardJob < Que::Job
end
def update_directo_number(num:)
- return unless num.to_i > Setting.directo_monthly_number_last
+ return unless num.to_i > Setting.directo_monthly_number_last.to_i
- Setting.directo_monthly_number_last = num
+ Setting.directo_monthly_number_last = num.to_i
end
def directo_counter_exceedable?(invoice_count)
diff --git a/test/fixtures/account_activities.yml b/test/fixtures/account_activities.yml
index dbe1dc2aa..8f883e424 100644
--- a/test/fixtures/account_activities.yml
+++ b/test/fixtures/account_activities.yml
@@ -2,4 +2,4 @@ one:
account: cash
invoice: one
bank_transaction: one
- created_at: <%= Time.zone.parse('2010-07-05 10:00') %>
\ No newline at end of file
+ created_at: <%= Time.zone.parse('2010-07-05 10:00') %>
diff --git a/test/jobs/directo_invoice_forward_job_test.rb b/test/jobs/directo_invoice_forward_job_test.rb
index ede17ce9e..bf92d77c0 100644
--- a/test/jobs/directo_invoice_forward_job_test.rb
+++ b/test/jobs/directo_invoice_forward_job_test.rb
@@ -3,6 +3,15 @@ require "test_helper"
class DirectoInvoiceForwardJobTest < ActiveSupport::TestCase
setup do
@invoice = invoices(:one)
+ @user = registrars(:bestnames)
+ travel_to Time.zone.parse('2010-07-06')
+ end
+
+ def teardown
+ Setting.clear_cache
+ Setting.directo_monthly_number_min = 309901
+ Setting.directo_monthly_number_max = 309999
+ Setting.directo_monthly_number_last = 309901
end
def test_xml_is_include_transaction_date
@@ -26,4 +35,109 @@ class DirectoInvoiceForwardJobTest < ActiveSupport::TestCase
assert_not_empty @invoice.directo_records.first.request
end
+
+ def test_fails_if_directo_bounds_exceedable
+ Setting.clear_cache
+ Setting.directo_monthly_number_max = 30990
+
+ assert_raises 'RuntimeError' do
+ DirectoInvoiceForwardJob.run(monthly: true, dry: false)
+ end
+ end
+
+ def test_monthly_summary_is_delivered_in_estonian
+ activity = account_activities(:one)
+ price = billing_prices(:create_one_year)
+ activity.update!(activity_type: 'create', price: price)
+ @user.update(language: 'et')
+
+ response = <<-XML
+
+
+
+
+ XML
+
+ stub_request(:post, ENV['directo_invoice_url']).with do |request|
+ body = CGI.unescape(request.body)
+
+ (body.include? '.test registreerimine: 1 aasta') &&
+ (body.include? 'Domeenide ettemaks') &&
+ (body.include? '309902')
+ end.to_return(status: 200, body: response)
+
+ assert_difference 'Setting.directo_monthly_number_last' do
+ DirectoInvoiceForwardJob.run(monthly: true, dry: false)
+ end
+ end
+
+ def test_monthly_summary_is_delivered_in_english
+ activity = account_activities(:one)
+ price = billing_prices(:create_one_year)
+ activity.update(activity_type: 'create', price: price)
+ @user.update(language: 'en')
+
+ response = <<-XML
+
+
+
+
+ XML
+
+ stub_request(:post, ENV['directo_invoice_url']).with do |request|
+ body = CGI.unescape(request.body)
+ (body.include? 'test registration') &&
+ (body.include? 'Domains prepayment') &&
+ (body.include? '309902')
+ end.to_return(status: 200, body: response)
+
+ assert_difference 'Setting.directo_monthly_number_last' do
+ DirectoInvoiceForwardJob.run(monthly: true, dry: false)
+ end
+ end
+
+ def test_multi_year_purchases_have_duration_assigned
+ activity = account_activities(:one)
+ price = billing_prices(:create_one_year)
+ price.update(duration: '3 years')
+ activity.update(activity_type: 'create', price: price)
+
+ response = <<-XML
+
+
+
+
+ XML
+
+ stub_request(:post, ENV['directo_invoice_url']).with do |request|
+ body = CGI.unescape(request.body)
+ (body.include? 'StartDate') && (body.include? 'EndDate')
+ end.to_return(status: 200, body: response)
+
+ assert_difference 'Setting.directo_monthly_number_last' do
+ DirectoInvoiceForwardJob.run(monthly: true, dry: false)
+ end
+ end
+
+ def test_monthly_duration_products_are_present_in_summary
+ activity = account_activities(:one)
+ price = billing_prices(:create_one_month)
+ activity.update(activity_type: 'create', price: price)
+
+ response = <<-XML
+
+
+
+
+ XML
+
+ stub_request(:post, ENV['directo_invoice_url']).with do |request|
+ body = CGI.unescape(request.body)
+ (body.include? 'months')
+ end.to_return(status: 200, body: response)
+
+ assert_difference 'Setting.directo_monthly_number_last' do
+ DirectoInvoiceForwardJob.run(monthly: true, dry: false)
+ end
+ end
end