diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index a12b36c..fa6a47f 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -58,6 +58,7 @@ jobs: gem install nokogiri -v '~> 1.11.3' gem install savon gem install webmock + gem install mocha gem install minitest -v '~> 5.14' bundle install rake diff --git a/CHANGELOG.md b/CHANGELOG.md index dc304a4..38d6477 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +03.10.2023 +* Added Balance element to InvoiceSumGroup [#41] (https://github.com/internetee/e_invoice/pull/41) + 26.09.2023 * Updated wsdl test address [#36](https://github.com/internetee/e_invoice/pull/36) diff --git a/estonian_e_invoice.gemspec b/estonian_e_invoice.gemspec index 99016c6..d1e098e 100644 --- a/estonian_e_invoice.gemspec +++ b/estonian_e_invoice.gemspec @@ -32,7 +32,8 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency 'savon' spec.add_development_dependency 'bundler', '>= 2.2.10' spec.add_development_dependency 'minitest', '~> 5.0' + spec.add_development_dependency 'mocha' spec.add_development_dependency 'rake', '~> 13.0' spec.add_development_dependency 'simplecov' spec.add_development_dependency 'webmock' -end \ No newline at end of file +end diff --git a/lib/e_invoice/generator.rb b/lib/e_invoice/generator.rb index b2522ec..bb70931 100644 --- a/lib/e_invoice/generator.rb +++ b/lib/e_invoice/generator.rb @@ -108,14 +108,36 @@ def build_invoice_details(invoice) def build_invoice_totals(invoice) builder.InvoiceSumGroup do + build_invoice_balance(invoice) builder.InvoiceSum format_decimal(invoice.subtotal, scale: 4) builder.TotalVATSum format_decimal(invoice.vat_amount) builder.TotalSum format_decimal(invoice.total) - builder.TotalToPay format_decimal(invoice.payable == false ? 0 : invoice.total) + if invoice.payable == false + builder.TotalToPay format_decimal(0) + else + builder.TotalToPay format_decimal(invoice.total_to_pay || invoice.total) + end builder.Currency invoice.currency end end + def build_invoice_balance(invoice) + builder.Balance do + build_element('BalanceDate', invoice.balance_date) + build_element('BalanceBegin', invoice.balance_begin, :format_decimal) + build_element('Inbound', invoice.inbound, :format_decimal) + build_element('Outbound', invoice.outbound, :format_decimal) + build_element('BalanceEnd', invoice.balance_end, :format_decimal) + end + end + + def build_element(name, value, format_method = nil) + return unless value + + formatted_value = format_method ? send(format_method, value) : value + builder.__send__(name, formatted_value) + end + def build_invoice_payment_details(invoice) builder.PaymentInfo do builder.Currency invoice.currency @@ -123,7 +145,11 @@ def build_invoice_payment_details(invoice) builder.PaymentDescription invoice.number builder.Payable invoice.payable == false ? 'NO' : 'YES' builder.PayDueDate invoice.due_date - builder.PaymentTotalSum format_decimal(invoice.payable == false ? 0 : invoice.total) + if invoice.payable == false + builder.PaymentTotalSum format_decimal(0) + else + builder.PaymentTotalSum format_decimal(invoice.total_to_pay || invoice.total) + end builder.PayerName invoice.payer_name builder.PaymentId invoice.number builder.PayToAccount invoice.beneficiary_account_number @@ -203,7 +229,7 @@ def build_footer(e_invoice) end def format_decimal(decimal, scale: 2) - format("%.#{scale}f", decimal) + format("%.#{scale}f", decimal) if decimal end end -end \ No newline at end of file +end diff --git a/lib/e_invoice/invoice.rb b/lib/e_invoice/invoice.rb index fd79557..9590f3f 100644 --- a/lib/e_invoice/invoice.rb +++ b/lib/e_invoice/invoice.rb @@ -4,8 +4,9 @@ class Invoice :date, :recipient_id_code, :reference_number, :due_date, :payable, :payer_name, :beneficiary_name, :beneficiary_account_number, - :subtotal, :vat_amount, :total, :currency, - :monthly_invoice + :subtotal, :vat_amount, :total, :total_to_pay, :currency, + :balance_date, :balance_begin, :inbound, :outbound, + :balance_end, :monthly_invoice alias_method :id, :number @@ -35,4 +36,4 @@ def validate_delivery_channels(channels) end end end -end \ No newline at end of file +end diff --git a/lib/e_invoice/version.rb b/lib/e_invoice/version.rb index 10a5716..ce30362 100644 --- a/lib/e_invoice/version.rb +++ b/lib/e_invoice/version.rb @@ -1,3 +1,3 @@ module EInvoice - VERSION = '0.1.4'.freeze + VERSION = '0.1.5'.freeze end diff --git a/test/generator_test.rb b/test/generator_test.rb index 16f5032..c996388 100644 --- a/test/generator_test.rb +++ b/test/generator_test.rb @@ -75,7 +75,13 @@ def invoice(payable: @payable) invoice.subtotal = 100 invoice.vat_amount = 20 invoice.total = 120 + invoice.total_to_pay = nil invoice.delivery_channel = :internet_bank + invoice.balance_date = nil + invoice.balance_begin = nil + invoice.inbound = nil + invoice.outbound = nil + invoice.balance_end = nil end end @@ -160,6 +166,7 @@ def test_generates_e_invoice_xml + 100.0000 20.00 120.00 @@ -274,6 +281,7 @@ def test_generates_prepaid_e_invoice_xml + 100.0000 20.00 120.00 @@ -329,6 +337,128 @@ def test_generates_prepaid_e_invoice_xml assert_equal expected_xml, actual_xml end + def test_generates_prepaid_e_invoice_xml_with_balance_inbound + expected_xml = <<~XML + + +
+ 2010-07-05 + id1234 + 1.2 +
+ + + + John Doe + john-1234 + US1234 + + + seller address line1 + seller address line2 + seller address city + 12345 + seller address country + + + + + Jane Doe + 1234 + US1234 + + info@buyer.test + + buyer address line1 + buyer address line2 + buyer address city + 123456 + buyer address country + + + + GB33BUKB20201555555555 + + + + + + ARVE + invoice-1234 + 1234 + 2010-07-06 + 2010-07-07 + + INTERNET_BANK + + + SENT + + + + + 60.00 + + 100.0000 + 20.00 + 120.00 + 60.00 + EUR + + + + + acme services + + pc + 1.0000 + 100.0000 + + 100.0000 + + 20.00 + 20.0000 + + 120.0000 + + + + 120.0000 + 100.0000 + 120.0000 + + + + EUR + 1234 + invoice-1234 + YES + 2010-07-07 + 60.00 + John Smith + invoice-1234 + GB33BUKB20201555555556 + Acme Ltd + + + +
+ XML + + e_invoice = EInvoiceDouble.new(payable: true) + EInvoice::Invoice.any_instance.stubs(:total_to_pay).returns(60) + EInvoice::Invoice.any_instance.stubs(:inbound).returns(60) + + actual_xml = Nokogiri::XML(@generator.generate(e_invoice)) { |config| config.noblanks } + .to_xml + + expected_xml = Nokogiri::XML(expected_xml) { |config| config.noblanks }.to_xml + assert_equal expected_xml, actual_xml + end + def test_generated_xml_conforms_to_estonian_e_invoice_standard_v1_2 schema = Nokogiri::XML::Schema(File.read('test/xml_schemas/v1.2.xsd')) xml = @generator.generate(EInvoiceDouble.new) @@ -337,4 +467,4 @@ def test_generated_xml_conforms_to_estonian_e_invoice_standard_v1_2 valid = errors.empty? assert valid, proc { errors.each { |error| puts error } } end -end \ No newline at end of file +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 9a1cf15..e6c27d4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -6,4 +6,5 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) require 'e_invoice' require 'minitest/autorun' -require 'webmock/minitest' \ No newline at end of file +require 'webmock/minitest' +require 'mocha/minitest' \ No newline at end of file