moss_generator 0.1.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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: []