moss_generator 0.1.1 → 0.3.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: da606f58ca3548eb7ce5fbef96498730f1046575caff4c23e741f3a6d4699e70
4
- data.tar.gz: babfb54c2a5c729390e336b243a2ddf86991ce84695922a744dfe00a2de2e00a
3
+ metadata.gz: b2b6449aa374fa85522e28aa9675f7bfd45b0b4a5ce390c6d0e912d079175ea1
4
+ data.tar.gz: 5c8dceae90fc3910fd31e575a131f35a8cda3641a5804757201f900ab6f65ea6
5
5
  SHA512:
6
- metadata.gz: 36de7663f16245f15ec8cddc423de8d686d5721fe5ce42f402f188a0e76a6582fe4b8df12eae36b6fd619af08927f7cafabc1fce6493c51fbd859262b936e222
7
- data.tar.gz: 8cbbd70a3e2992ba354042813dc9a19e22ee62b38160466fd30ef0a3686114d8fa1fe26922e1f4d81ca08a9521e709af22c510ea1c0fa84464027bb207f10048
6
+ metadata.gz: ad5637afa82ebf7b60ed543eb685ae8790d332b2062c360ff7ead5a2b714ffb6ec44719dea021f2496cb19dfe1eb75123bfb6a755ec9c4d6f682570fbca4a8dc
7
+ data.tar.gz: 6db1366ba400e33e5f4e25458d4008fb4a01377950ad07775e454a3f251591fbefe7e1fe91bee589d809595cf9bd74b80e31d13b369f511bc7ebbf0ae98ddcdd
@@ -1,5 +1,9 @@
1
1
  name: Gem push
2
- on: [push]
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
3
7
  jobs:
4
8
  github:
5
9
  name: Build + Publish to GitHub
@@ -1,6 +1,6 @@
1
1
  name: Ruby
2
2
 
3
- on: [push,pull_request]
3
+ on: [pull_request]
4
4
 
5
5
  jobs:
6
6
  build:
@@ -13,3 +13,6 @@ Layout/LineLength:
13
13
  Metrics/BlockLength:
14
14
  Exclude:
15
15
  - 'spec/**/*'
16
+
17
+ RSpec/NestedGroups:
18
+ Max: 4
@@ -1,16 +1,40 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- moss_generator (0.1.1)
4
+ moss_generator (0.3.0)
5
+ money (~> 6.14)
6
+ valvat (~> 1.1)
5
7
 
6
8
  GEM
7
9
  remote: https://rubygems.org/
8
10
  specs:
11
+ addressable (2.7.0)
12
+ public_suffix (>= 2.0.2, < 5.0)
13
+ akami (1.3.1)
14
+ gyoku (>= 0.4.0)
15
+ nokogiri
9
16
  ast (2.4.1)
17
+ builder (3.2.4)
18
+ concurrent-ruby (1.1.7)
10
19
  diff-lcs (1.4.4)
20
+ gyoku (1.3.1)
21
+ builder (>= 2.1.2)
22
+ httpi (2.4.5)
23
+ rack
24
+ socksify
25
+ i18n (1.8.7)
26
+ concurrent-ruby (~> 1.0)
27
+ money (6.14.0)
28
+ i18n (>= 0.6.4, <= 2)
29
+ nokogiri (1.11.1-x86_64-darwin)
30
+ racc (~> 1.4)
31
+ nori (2.6.0)
11
32
  parallel (1.20.1)
12
33
  parser (3.0.0.0)
13
34
  ast (~> 2.4.1)
35
+ public_suffix (4.0.6)
36
+ racc (1.5.2)
37
+ rack (2.2.3)
14
38
  rainbow (3.0.0)
15
39
  rake (13.0.3)
16
40
  regexp_parser (2.0.3)
@@ -48,7 +72,22 @@ GEM
48
72
  rubocop (~> 1.0)
49
73
  rubocop-ast (>= 1.1.0)
50
74
  ruby-progressbar (1.10.1)
75
+ savon (2.12.1)
76
+ akami (~> 1.2)
77
+ builder (>= 2.1.2)
78
+ gyoku (~> 1.2)
79
+ httpi (~> 2.3)
80
+ nokogiri (>= 1.8.1)
81
+ nori (~> 2.4)
82
+ wasabi (~> 3.4)
83
+ socksify (1.7.1)
51
84
  unicode-display_width (1.7.0)
85
+ valvat (1.1.0)
86
+ savon (>= 2.3.0)
87
+ wasabi (3.6.1)
88
+ addressable
89
+ httpi (~> 2.0)
90
+ nokogiri (>= 1.4.2)
52
91
 
53
92
  PLATFORMS
54
93
  x86_64-darwin-19
@@ -130,7 +130,7 @@
130
130
  },
131
131
  "DE": {
132
132
  "country_name": "Germany",
133
- "standard_rate": 19,
133
+ "standard_rate": 16,
134
134
  "reduced_rates": {
135
135
  "foodstuffs": 7,
136
136
  "books": 7,
@@ -6,4 +6,6 @@ require_relative 'moss_generator/stripe'
6
6
 
7
7
  # Generate CSV-formatted string for MOSS report
8
8
  module MossGenerator
9
+ Money.default_currency = Money::Currency.new('EUR')
10
+ Money.rounding_mode = BigDecimal::ROUND_HALF_UP
9
11
  end
@@ -45,8 +45,11 @@ module MossGenerator
45
45
 
46
46
  def group_charges_rows
47
47
  charges_rows = charges.map do |charge|
48
- MossGenerator::StripeChargeRow.new(charge)
49
- end
48
+ charge_row = MossGenerator::StripeChargeRow.new(charge)
49
+ next if charge_row.skippable?
50
+
51
+ charge_row
52
+ end.compact
50
53
  charges_rows.group_by(&:country_code)
51
54
  end
52
55
 
@@ -63,7 +66,7 @@ module MossGenerator
63
66
  [turnover_country,
64
67
  country,
65
68
  format_to_two_decimals(charges.first.vat_rate),
66
- format_to_two_decimals(charges.sum(&:amount)),
69
+ format_to_two_decimals(charges.sum(&:amount_without_vat)),
67
70
  format_to_two_decimals(charges.sum(&:vat_amount))]
68
71
  end
69
72
 
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'moss_generator/vat_rate'
4
+ require 'money'
5
+ require 'valvat/local'
4
6
 
5
7
  module MossGenerator
6
8
  # Parse charge data from single Stripe charge
@@ -9,6 +11,8 @@ module MossGenerator
9
11
 
10
12
  class NoVatRateForCountryError < StandardError; end
11
13
 
14
+ class NotInEuroError < StandardError; end
15
+
12
16
  attr_reader :charge
13
17
 
14
18
  def initialize(charge)
@@ -21,8 +25,12 @@ module MossGenerator
21
25
  raise NoConsumptionCountryError, "charge: #{charge}"
22
26
  end
23
27
 
24
- def amount
25
- charge.dig('balance_transaction', 'amount')
28
+ def amount_without_vat
29
+ Money.new(amount_with_vat * percent_without_vat).dollars.to_f
30
+ end
31
+
32
+ def amount_without_vat_cents
33
+ Money.new(amount_with_vat * percent_without_vat).cents
26
34
  end
27
35
 
28
36
  def vat_rate
@@ -30,18 +38,48 @@ module MossGenerator
30
38
  end
31
39
 
32
40
  def vat_amount
33
- amount * vat_rate_calculatable_percent
41
+ Money.new(amount_without_vat_cents * vat_rate_calculatable_percent)
42
+ .dollars
43
+ .to_f
44
+ end
45
+
46
+ def skippable?
47
+ company? || not_completed? || refunded?
34
48
  end
35
49
 
36
50
  private
37
51
 
52
+ def company?
53
+ return false if charge.dig('metadata', 'vat_number').nil?
54
+
55
+ Valvat::Syntax.validate(charge.dig('metadata', 'vat_number'))
56
+ end
57
+
58
+ def not_completed?
59
+ charge['status'] != 'succeeded'
60
+ end
61
+
62
+ def refunded?
63
+ charge['refunded']
64
+ end
65
+
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
+ def percent_without_vat
74
+ 1 / (vat_rate_calculatable_percent + 1)
75
+ end
76
+
38
77
  def vat_rate_calculatable_percent
39
78
  (vat_rate.to_f / 100)
40
79
  end
41
80
 
42
81
  def fetch_country_code
43
- charge.dig('payment_method_details', 'card', 'country') ||
44
- charge.dig('billing_details', 'address', 'country')
82
+ charge.dig('payment_method_details', 'card', 'country')
45
83
  end
46
84
  end
47
85
  end
@@ -18,7 +18,7 @@ module MossGenerator
18
18
 
19
19
  def vat_rates_path
20
20
  File.join(File.dirname(File.expand_path(__FILE__)),
21
- 'config/vat_rates.json')
21
+ '../../config/vat_rates.json')
22
22
  end
23
23
  end
24
24
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MossGenerator
4
- VERSION = '0.1.1'
4
+ VERSION = '0.3.0'
5
5
  end
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['frdrkolsson']
9
9
  spec.email = ['fredrik.olsson@standout.se']
10
10
 
11
- spec.summary = 'Skatteverket Mini One Stop Shop(MOSS) generator.'
11
+ spec.summary = 'Skatteverket Mini One Stop Shop (MOSS) generator.'
12
12
  spec.description = spec.summary
13
13
  spec.homepage = 'https://github.com/standout/moss_generator'
14
14
  spec.license = 'MIT'
@@ -30,8 +30,9 @@ Gem::Specification.new do |spec|
30
30
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ['lib']
32
32
 
33
- # Uncomment to register a new dependency of your gem
34
- # spec.add_dependency "example-gem", "~> 1.0"
33
+ # spec.add_dependency to register a new dependency of your gem
34
+ spec.add_dependency 'money', '~> 6.14'
35
+ spec.add_dependency 'valvat', '~> 1.1'
35
36
 
36
37
  # For more information and examples about making a new gem, checkout our
37
38
  # guide at: https://bundler.io/guides/creating_gem.html
metadata CHANGED
@@ -1,16 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moss_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.3.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-12 00:00:00.000000000 Z
12
- dependencies: []
13
- description: Skatteverket Mini One Stop Shop(MOSS) generator.
11
+ date: 2021-01-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: money
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '6.14'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '6.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: valvat
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
41
+ description: Skatteverket Mini One Stop Shop (MOSS) generator.
14
42
  email:
15
43
  - fredrik.olsson@standout.se
16
44
  executables: []
@@ -58,8 +86,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
86
  - !ruby/object:Gem::Version
59
87
  version: '0'
60
88
  requirements: []
61
- rubygems_version: 3.1.4
89
+ rubygems_version: 3.2.3
62
90
  signing_key:
63
91
  specification_version: 4
64
- summary: Skatteverket Mini One Stop Shop(MOSS) generator.
92
+ summary: Skatteverket Mini One Stop Shop (MOSS) generator.
65
93
  test_files: []