moss_generator 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2b6449aa374fa85522e28aa9675f7bfd45b0b4a5ce390c6d0e912d079175ea1
4
- data.tar.gz: 5c8dceae90fc3910fd31e575a131f35a8cda3641a5804757201f900ab6f65ea6
3
+ metadata.gz: b18873ce424594b2a4cafe9dd26d23f6688352561e59820aa7f8229911cc4857
4
+ data.tar.gz: cc35447764a10b96f53035af22e5429809ad7ea10dc7adcb835089e0e69b5024
5
5
  SHA512:
6
- metadata.gz: ad5637afa82ebf7b60ed543eb685ae8790d332b2062c360ff7ead5a2b714ffb6ec44719dea021f2496cb19dfe1eb75123bfb6a755ec9c4d6f682570fbca4a8dc
7
- data.tar.gz: 6db1366ba400e33e5f4e25458d4008fb4a01377950ad07775e454a3f251591fbefe7e1fe91bee589d809595cf9bd74b80e31d13b369f511bc7ebbf0ae98ddcdd
6
+ metadata.gz: 5ff56e1b296d590a99db183d73cd1b4ebb80efbfaaccceb4df5862bc7a01da9d06f50340fe5a941a3c463a556af1293b5dbc6a500938b6bb52b264c54d53af04
7
+ data.tar.gz: 6ec37d480db38da5abc948afd423928741e25b0c4273dbb02c8e373fe74ca697d04f86cc2e8c424061ae536c4697b6790a1910fff46ffef7fd33841380b68234
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- moss_generator (0.3.0)
4
+ moss_generator (0.4.0)
5
+ countries (~> 3.1)
5
6
  money (~> 6.14)
6
7
  valvat (~> 1.1)
7
8
 
@@ -15,23 +16,37 @@ GEM
15
16
  nokogiri
16
17
  ast (2.4.1)
17
18
  builder (3.2.4)
18
- concurrent-ruby (1.1.7)
19
+ byebug (11.1.3)
20
+ coderay (1.1.3)
21
+ concurrent-ruby (1.1.8)
22
+ countries (3.1.0)
23
+ i18n_data (~> 0.11.0)
24
+ sixarm_ruby_unaccent (~> 1.1)
25
+ unicode_utils (~> 1.4)
19
26
  diff-lcs (1.4.4)
20
27
  gyoku (1.3.1)
21
28
  builder (>= 2.1.2)
22
29
  httpi (2.4.5)
23
30
  rack
24
31
  socksify
25
- i18n (1.8.7)
32
+ i18n (1.8.10)
26
33
  concurrent-ruby (~> 1.0)
27
- money (6.14.0)
34
+ i18n_data (0.11.0)
35
+ method_source (1.0.0)
36
+ money (6.14.1)
28
37
  i18n (>= 0.6.4, <= 2)
29
- nokogiri (1.11.1-x86_64-darwin)
38
+ nokogiri (1.11.3-x86_64-darwin)
30
39
  racc (~> 1.4)
31
40
  nori (2.6.0)
32
41
  parallel (1.20.1)
33
42
  parser (3.0.0.0)
34
43
  ast (~> 2.4.1)
44
+ pry (0.13.1)
45
+ coderay (~> 1.1)
46
+ method_source (~> 1.0)
47
+ pry-byebug (3.9.0)
48
+ byebug (~> 11.0)
49
+ pry (~> 0.13.0)
35
50
  public_suffix (4.0.6)
36
51
  racc (1.5.2)
37
52
  rack (2.2.3)
@@ -80,8 +95,10 @@ GEM
80
95
  nokogiri (>= 1.8.1)
81
96
  nori (~> 2.4)
82
97
  wasabi (~> 3.4)
98
+ sixarm_ruby_unaccent (1.2.0)
83
99
  socksify (1.7.1)
84
100
  unicode-display_width (1.7.0)
101
+ unicode_utils (1.4.0)
85
102
  valvat (1.1.0)
86
103
  savon (>= 2.3.0)
87
104
  wasabi (3.6.1)
@@ -94,6 +111,7 @@ PLATFORMS
94
111
 
95
112
  DEPENDENCIES
96
113
  moss_generator!
114
+ pry-byebug
97
115
  rake (~> 13.0)
98
116
  rspec (~> 3.0)
99
117
  rubocop (~> 1.7)
@@ -8,17 +8,18 @@ module MossGenerator
8
8
  class Stripe
9
9
  class NoTurnoverCountryError < StandardError; end
10
10
 
11
- attr_reader :charges, :vat_number, :period, :year
11
+ attr_reader :charges, :vat_number, :period, :year, :rates
12
12
 
13
- def initialize(charges, vat_number, period, year)
13
+ def initialize(charges, vat_number, period, year, rates)
14
14
  @charges = charges
15
15
  @vat_number = vat_number
16
16
  @period = period
17
17
  @year = year
18
+ @rates = rates
18
19
  end
19
20
 
20
- def self.call(charges, vat_number, period, year)
21
- new(charges, vat_number, period, year).call
21
+ def self.call(charges, vat_number, period, year, rates)
22
+ new(charges, vat_number, period, year, rates).call
22
23
  end
23
24
 
24
25
  def call
@@ -45,7 +46,7 @@ module MossGenerator
45
46
 
46
47
  def group_charges_rows
47
48
  charges_rows = charges.map do |charge|
48
- charge_row = MossGenerator::StripeChargeRow.new(charge)
49
+ charge_row = MossGenerator::StripeChargeRow.new(charge, rates)
49
50
  next if charge_row.skippable?
50
51
 
51
52
  charge_row
@@ -3,6 +3,7 @@
3
3
  require 'moss_generator/vat_rate'
4
4
  require 'money'
5
5
  require 'valvat/local'
6
+ require 'countries'
6
7
 
7
8
  module MossGenerator
8
9
  # Parse charge data from single Stripe charge
@@ -11,12 +12,13 @@ module MossGenerator
11
12
 
12
13
  class NoVatRateForCountryError < StandardError; end
13
14
 
14
- class NotInEuroError < StandardError; end
15
+ class NoExchangeRateForCurrencyOrDateError < StandardError; end
15
16
 
16
- attr_reader :charge
17
+ attr_reader :charge, :rates
17
18
 
18
- def initialize(charge)
19
+ def initialize(charge, rates)
19
20
  @charge = charge
21
+ @rates = rates
20
22
  end
21
23
 
22
24
  def country_code
@@ -44,7 +46,12 @@ module MossGenerator
44
46
  end
45
47
 
46
48
  def skippable?
47
- company? || not_completed? || refunded?
49
+ not_completed? ||
50
+ company? ||
51
+ fetch_country_code.nil? ||
52
+ sold_outside_of_eu? ||
53
+ swedish_charge? ||
54
+ refunded?
48
55
  end
49
56
 
50
57
  private
@@ -55,6 +62,14 @@ module MossGenerator
55
62
  Valvat::Syntax.validate(charge.dig('metadata', 'vat_number'))
56
63
  end
57
64
 
65
+ def sold_outside_of_eu?
66
+ ISO3166::Country.new(fetch_country_code).in_eu? ? false : true
67
+ end
68
+
69
+ def swedish_charge?
70
+ fetch_country_code.casecmp?('SE')
71
+ end
72
+
58
73
  def not_completed?
59
74
  charge['status'] != 'succeeded'
60
75
  end
@@ -63,13 +78,6 @@ module MossGenerator
63
78
  charge['refunded']
64
79
  end
65
80
 
66
- def amount_with_vat
67
- return charge['amount'] if charge['currency'].casecmp?('eur')
68
- return if skippable?
69
-
70
- raise NotInEuroError, "charge: #{charge}"
71
- end
72
-
73
81
  def percent_without_vat
74
82
  1 / (vat_rate_calculatable_percent + 1)
75
83
  end
@@ -81,5 +89,28 @@ module MossGenerator
81
89
  def fetch_country_code
82
90
  charge.dig('payment_method_details', 'card', 'country')
83
91
  end
92
+
93
+ def amount_with_vat
94
+ return if skippable?
95
+ return charge['amount'] if charge['currency'].casecmp?('eur')
96
+
97
+ exchanged_amount = calculate_amount_from_rate
98
+ return exchanged_amount unless exchanged_amount.nil?
99
+
100
+ raise NoExchangeRateForCurrencyOrDateError, "charge: #{charge}"
101
+ end
102
+
103
+ def calculate_amount_from_rate
104
+ # Have to reverse the rate. The base rate is in EUR, so if we have a rate
105
+ # to SEK, the rate will represent the rate from EUR to SEK, but we need
106
+ # the other way around.
107
+ date = Time.at(charge['created']).to_date.to_s
108
+ currency = charge['currency'].upcase
109
+ rate = rates.dig(date, currency)
110
+ return if rate.nil?
111
+
112
+ reversed_rate = 1 / rate
113
+ charge['amount'] * reversed_rate
114
+ end
84
115
  end
85
116
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MossGenerator
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -31,9 +31,12 @@ Gem::Specification.new do |spec|
31
31
  spec.require_paths = ['lib']
32
32
 
33
33
  # spec.add_dependency to register a new dependency of your gem
34
+ spec.add_dependency 'countries', '~> 3.1'
34
35
  spec.add_dependency 'money', '~> 6.14'
35
36
  spec.add_dependency 'valvat', '~> 1.1'
36
37
 
38
+ spec.add_development_dependency 'pry-byebug'
39
+
37
40
  # For more information and examples about making a new gem, checkout our
38
41
  # guide at: https://bundler.io/guides/creating_gem.html
39
42
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moss_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - frdrkolsson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-20 00:00:00.000000000 Z
11
+ date: 2021-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: countries
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: money
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '1.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  description: Skatteverket Mini One Stop Shop (MOSS) generator.
42
70
  email:
43
71
  - fredrik.olsson@standout.se