sie 1.0.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZTJmMTM2NDcyNGI2ODIzZmZhZjdiMmUzMTNmOWM5ZjU5NDNjNWUyYw==
4
+ MmQ2NTU4OGIwMDIxOTQyN2FjNmZjMGY1MWUzYTBjOWY2YWNkODI4Zg==
5
5
  data.tar.gz: !binary |-
6
- MDI2MDliNGM4NWZlMjYyMWU1ODliOGQ5YTA4NzMyMGFmMzVmMTgyNQ==
6
+ MTIzODUzYWQyN2ZjNTAwNWM0NDg0NTQyZjQ1ZTY2Mjc4YmM1MTYwOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YzA1OTJjYzcyNTA3YWMxYmY5MTE0ZjY5ODk5ZDJkMjA2NDJiZGJhYTcyMGY5
10
- ODEwYzQ3ZDY4NjdkYjI5YzdlOTJmYzE0ZDJjZDkxNDIwODdiNDdkNzY0Yjcy
11
- MWYwODVmNjk4OWFjNGIxNzQ4MmExNGMyMTAyMTQ3ODFlZjcyNWI=
9
+ MDUyNWIzZWNmZWE3NzA4NDEzYThkODNkNWViZjI2N2M3MjZhZDlkMWI2OTRl
10
+ OGZlM2I2MzM4YzExODQ5ODg3Y2E0MDQxYTQ0Y2IzNTIyOGEyMmE1YmMxOWM2
11
+ MDhhNDE1YjAzOGEzNWYyNzc0MmYwMDQ3ZDQ5ODEzYWU3Njk5ZDY=
12
12
  data.tar.gz: !binary |-
13
- OGY2NTM1ZjgyZjU2ODMwYTc4YmNhOTFiZjNlMDJjYjhmMTgwMmQ3ZWFmZWQ4
14
- MGM3ZDI5MjgzN2Q5MDFiYjVkNmIzZGIyYmQwOTRjNzRlZTgyZDRhNGE4MTc4
15
- OWRhNTU1MGNiMTBlYzljZWZjNWNmNmM0M2QwNzM4ZjVkNjk0NTY=
13
+ NmE4N2Q4MzY0YzljYzJkZWZhYjM0OTYyNzVjZWI5OTZiNmVmYWQ2MzY1MDZj
14
+ YjNiNWJiNjg0Yzg4ZDMzMTQ3NDk2NTlhYjFiYWJkZDIyZTczOTFiNzlhMTY4
15
+ NDY3OWI0NGRiYjNkZjQwMjg1MmQ5OGFjNGRjMWYzNTVhMjIzM2M=
data/README.md CHANGED
@@ -38,25 +38,21 @@ class YourDataSource
38
38
  Date.today
39
39
  end
40
40
 
41
- def from_date
42
- Date.today
43
- end
44
-
45
- def to_date
46
- Date.today
41
+ def financial_years
42
+ [
43
+ Date.new(2011, 1, 1)..Date.new(2011, 12, 31),
44
+ Date.new(2012, 1, 1)..Date.new(2012, 12, 31),
45
+ Date.new(2013, 1, 1)..Date.new(2013, 12, 31),
46
+ ]
47
47
  end
48
48
 
49
49
  def company_name
50
50
  "Your company"
51
51
  end
52
52
 
53
- def financial_year_start_month
54
- 1
55
- end
56
-
57
53
  def accounts
58
54
  [
59
- { number: 1500, description: "Customer ledger" }
55
+ { number: 1500, description: "Customer ledger" },
60
56
  ]
61
57
  end
62
58
 
data/lib/sie/document.rb CHANGED
@@ -1,119 +1,120 @@
1
1
  require "attr_extras"
2
- require "sie/document/financial_years"
3
2
  require "sie/document/voucher_series"
4
3
  require "sie/document/renderer"
5
4
  require "active_support/core_ext/module/delegation"
6
5
 
7
- class Sie::Document
8
- pattr_initialize :data_source
9
- # Because fortnox imposes these limits
10
- DESCRIPTION_LENGTH_MAX = 30
6
+ module Sie
7
+ class Document
8
+ pattr_initialize :data_source
9
+ # Because fortnox imposes these limits
10
+ DESCRIPTION_LENGTH_MAX = 30
11
11
 
12
- def render
13
- add_header
14
- add_financial_years
15
- add_accounts
16
- add_balances
17
- add_vouchers
12
+ def render
13
+ add_header
14
+ add_financial_years
15
+ add_accounts
16
+ add_balances
17
+ add_vouchers
18
18
 
19
- renderer.render
20
- end
19
+ renderer.render
20
+ end
21
21
 
22
- private
22
+ private
23
23
 
24
- delegate :program, :program_version, :generated_on, :company_name,
25
- :accounts, :balance_account_numbers, :closing_account_numbers,
26
- :balance_before, :each_voucher, :from_date, :to_date, :financial_year_start_month,
27
- to: :data_source
24
+ delegate :program, :program_version, :generated_on, :company_name,
25
+ :accounts, :balance_account_numbers, :closing_account_numbers,
26
+ :balance_before, :each_voucher,
27
+ to: :data_source
28
28
 
29
- def add_header
30
- add_line("FLAGGA", 0)
31
- add_line("PROGRAM", program, program_version)
32
- add_line("FORMAT", "PC8")
33
- add_line("GEN", generated_on)
34
- add_line("SIETYP", 4)
35
- add_line("FNAMN", company_name)
36
- end
29
+ def add_header
30
+ add_line("FLAGGA", 0)
31
+ add_line("PROGRAM", program, program_version)
32
+ add_line("FORMAT", "PC8")
33
+ add_line("GEN", generated_on)
34
+ add_line("SIETYP", 4)
35
+ add_line("FNAMN", company_name)
36
+ end
37
37
 
38
- def add_financial_years
39
- financial_years.each_with_index do |date_range, index|
40
- add_line("RAR", -index, date_range.begin, date_range.end)
38
+ def add_financial_years
39
+ financial_years.each_with_index do |date_range, index|
40
+ add_line("RAR", -index, date_range.begin, date_range.end)
41
+ end
41
42
  end
42
- end
43
43
 
44
- def add_accounts
45
- accounts.each do |account|
46
- number = account.fetch(:number)
47
- description = account.fetch(:description).slice(0, DESCRIPTION_LENGTH_MAX)
44
+ def add_accounts
45
+ accounts.each do |account|
46
+ number = account.fetch(:number)
47
+ description = account.fetch(:description).slice(0, DESCRIPTION_LENGTH_MAX)
48
48
 
49
- add_line("KONTO", number, description)
49
+ add_line("KONTO", number, description)
50
+ end
50
51
  end
51
- end
52
52
 
53
- def add_balances
54
- financial_years.each_with_index do |date_range, index|
55
- add_balance_rows("IB", -index, balance_account_numbers, date_range.begin)
56
- add_balance_rows("UB", -index, balance_account_numbers, date_range.end)
57
- add_balance_rows("RES", -index, closing_account_numbers, date_range.end)
53
+ def add_balances
54
+ financial_years.each_with_index do |date_range, index|
55
+ add_balance_rows("IB", -index, balance_account_numbers, date_range.begin)
56
+ add_balance_rows("UB", -index, balance_account_numbers, date_range.end)
57
+ add_balance_rows("RES", -index, closing_account_numbers, date_range.end)
58
+ end
58
59
  end
59
- end
60
60
 
61
- def add_balance_rows(label, year_index, account_numbers, date, &block)
62
- account_numbers.each do |account_number|
63
- balance = balance_before(account_number, date)
64
- add_line(label, year_index, account_number, balance)
61
+ def add_balance_rows(label, year_index, account_numbers, date, &block)
62
+ account_numbers.each do |account_number|
63
+ balance = balance_before(account_number, date)
64
+ add_line(label, year_index, account_number, balance)
65
+ end
65
66
  end
66
- end
67
67
 
68
- def add_vouchers
69
- each_voucher do |voucher|
70
- add_voucher(voucher)
68
+ def add_vouchers
69
+ each_voucher do |voucher|
70
+ add_voucher(voucher)
71
+ end
71
72
  end
72
- end
73
73
 
74
74
 
75
- def add_voucher(opts)
76
- creditor = opts.fetch(:creditor)
77
- type = opts.fetch(:type)
78
- number = opts.fetch(:number)
79
- booked_on = opts.fetch(:booked_on)
80
- description = opts.fetch(:description).slice(0, DESCRIPTION_LENGTH_MAX)
81
- voucher_lines = opts.fetch(:voucher_lines)
75
+ def add_voucher(opts)
76
+ creditor = opts.fetch(:creditor)
77
+ type = opts.fetch(:type)
78
+ number = opts.fetch(:number)
79
+ booked_on = opts.fetch(:booked_on)
80
+ description = opts.fetch(:description).slice(0, DESCRIPTION_LENGTH_MAX)
81
+ voucher_lines = opts.fetch(:voucher_lines)
82
82
 
83
- add_line("VER", voucher_series(creditor, type), number, booked_on, description)
83
+ add_line("VER", voucher_series(creditor, type), number, booked_on, description)
84
84
 
85
- add_array do
86
- voucher_lines.each do |line|
87
- account_number = line.fetch(:account_number)
88
- amount = line.fetch(:amount)
89
- booked_on = line.fetch(:booked_on)
90
- # Some SIE-importers (fortnox) cannot handle descriptions longer than 30 characters,
91
- # but the specification has no limit.
92
- description = line.fetch(:description).slice(0, DESCRIPTION_LENGTH_MAX)
85
+ add_array do
86
+ voucher_lines.each do |line|
87
+ account_number = line.fetch(:account_number)
88
+ amount = line.fetch(:amount)
89
+ booked_on = line.fetch(:booked_on)
90
+ # Some SIE-importers (fortnox) cannot handle descriptions longer than 30 characters,
91
+ # but the specification has no limit.
92
+ description = line.fetch(:description).slice(0, DESCRIPTION_LENGTH_MAX)
93
93
 
94
- add_line("TRANS", account_number, Renderer::EMPTY_ARRAY, amount, booked_on, description)
95
-
96
- # Some consumers of SIE cannot handle single voucher lines (fortnox), so add another empty one to make
97
- # it balance. The spec just requires the sum of lines to be 0, so single lines with zero amount would conform,
98
- # but break for these implementations.
99
- if voucher_lines.size < 2 && amount.zero?
100
94
  add_line("TRANS", account_number, Renderer::EMPTY_ARRAY, amount, booked_on, description)
95
+
96
+ # Some consumers of SIE cannot handle single voucher lines (fortnox), so add another empty one to make
97
+ # it balance. The spec just requires the sum of lines to be 0, so single lines with zero amount would conform,
98
+ # but break for these implementations.
99
+ if voucher_lines.size < 2 && amount.zero?
100
+ add_line("TRANS", account_number, Renderer::EMPTY_ARRAY, amount, booked_on, description)
101
+ end
101
102
  end
102
103
  end
103
104
  end
104
- end
105
105
 
106
- delegate :add_line, :add_array, to: :renderer
106
+ delegate :add_line, :add_array, to: :renderer
107
107
 
108
- def renderer
109
- @renderer ||= Renderer.new
110
- end
108
+ def renderer
109
+ @renderer ||= Renderer.new
110
+ end
111
111
 
112
- def financial_years
113
- FinancialYears.between(financial_year_start_month, from_date, to_date).reverse
114
- end
112
+ def financial_years
113
+ data_source.financial_years.sort_by { |date_range| date_range.first }.reverse
114
+ end
115
115
 
116
- def voucher_series(creditor, type)
117
- VoucherSeries.for(creditor, type)
116
+ def voucher_series(creditor, type)
117
+ VoucherSeries.for(creditor, type)
118
+ end
118
119
  end
119
120
  end
data/lib/sie/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sie
2
- VERSION = "1.0.6"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -4,8 +4,13 @@ require "sie"
4
4
  require "active_support/core_ext/date/calculations"
5
5
 
6
6
  describe Sie::Document, "#render" do
7
- let(:from_date) { Date.new(2011, 9, 1) }
8
- let(:to_date) { Date.new(2013, 12, 31) }
7
+ let(:financial_years) {
8
+ [
9
+ Date.new(2011, 1, 1)..Date.new(2011, 12, 31),
10
+ Date.new(2012, 1, 1)..Date.new(2012, 12, 31),
11
+ Date.new(2013, 1, 1)..Date.new(2013, 12, 31),
12
+ ]
13
+ }
9
14
  let(:generated_on) { Date.yesterday }
10
15
  let(:accounts) {
11
16
  [
@@ -15,17 +20,17 @@ describe Sie::Document, "#render" do
15
20
  let(:vouchers) {
16
21
  [
17
22
  {
18
- creditor: false, type: :invoice, number: 1, booked_on: from_date + 2, description: "Invoice 1",
23
+ creditor: false, type: :invoice, number: 1, booked_on: Date.new(2011, 9, 3), description: "Invoice 1",
19
24
  voucher_lines: [
20
- { account_number: 1500, amount: 512.0, booked_on: from_date + 2, description: "Item 1" },
21
- { account_number: 3100, amount: -512.0, booked_on: from_date + 2, description: "Item 1" },
25
+ { account_number: 1500, amount: 512.0, booked_on: Date.new(2011, 9, 3), description: "Item 1" },
26
+ { account_number: 3100, amount: -512.0, booked_on: Date.new(2011, 9, 3), description: "Item 1" },
22
27
  ]
23
28
  },
24
29
  {
25
- creditor: true, type: :payment, number: 2, booked_on: from_date + 365, description: "Payout 1",
30
+ creditor: true, type: :payment, number: 2, booked_on: Date.new(2012, 8, 31), description: "Payout 1",
26
31
  voucher_lines: [
27
- { account_number: 2400, amount: 256.0, booked_on: from_date + 365, description: "Payout line 1" },
28
- { account_number: 1970, amount: -256.0, booked_on: from_date + 365, description: "Payout line 2" },
32
+ { account_number: 2400, amount: 256.0, booked_on: Date.new(2012, 8, 31), description: "Payout line 1" },
33
+ { account_number: 1970, amount: -256.0, booked_on: Date.new(2012, 8, 31), description: "Payout line 2" },
29
34
  ]
30
35
  }
31
36
  ]
@@ -34,7 +39,7 @@ describe Sie::Document, "#render" do
34
39
  class TestDataSource
35
40
  attr_accessor :program, :program_version, :generated_on, :company_name,
36
41
  :accounts, :balance_account_numbers, :closing_account_numbers,
37
- :vouchers, :from_date, :to_date, :financial_year_start_month
42
+ :vouchers, :financial_years
38
43
 
39
44
  # vouchers is not part of the expected interface so making it private.
40
45
  #
@@ -60,15 +65,13 @@ describe Sie::Document, "#render" do
60
65
 
61
66
  let(:doc) {
62
67
  data_source = TestDataSource.new(
63
- from_date: from_date,
64
- to_date: to_date,
65
68
  accounts: accounts,
66
69
  vouchers: vouchers,
67
70
  program: "Foonomic",
68
71
  program_version: "3.11",
69
72
  generated_on: generated_on,
70
73
  company_name: "Foocorp",
71
- financial_year_start_month: 1,
74
+ financial_years: financial_years,
72
75
  balance_account_numbers: [ 1500, 2400 ],
73
76
  closing_account_numbers: [ 3100 ]
74
77
  )
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sie
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Barsoom AB
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-18 00:00:00.000000000 Z
11
+ date: 2014-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: attr_extras
@@ -96,7 +96,6 @@ files:
96
96
  - Rakefile
97
97
  - lib/sie.rb
98
98
  - lib/sie/document.rb
99
- - lib/sie/document/financial_years.rb
100
99
  - lib/sie/document/renderer.rb
101
100
  - lib/sie/document/voucher_series.rb
102
101
  - lib/sie/parser.rb
@@ -116,7 +115,6 @@ files:
116
115
  - spec/fixtures/sie_file.se
117
116
  - spec/integration/parser_spec.rb
118
117
  - spec/spec_helper.rb
119
- - spec/unit/document/financial_years_spec.rb
120
118
  - spec/unit/document/voucher_series_spec.rb
121
119
  - spec/unit/document_spec.rb
122
120
  - spec/unit/parser/line_parser_spec.rb
@@ -142,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
140
  version: '0'
143
141
  requirements: []
144
142
  rubyforge_project:
145
- rubygems_version: 2.2.2
143
+ rubygems_version: 2.2.1
146
144
  signing_key:
147
145
  specification_version: 4
148
146
  summary: Parses and generates SIE files (http://sie.se/)
@@ -150,7 +148,6 @@ test_files:
150
148
  - spec/fixtures/sie_file.se
151
149
  - spec/integration/parser_spec.rb
152
150
  - spec/spec_helper.rb
153
- - spec/unit/document/financial_years_spec.rb
154
151
  - spec/unit/document/voucher_series_spec.rb
155
152
  - spec/unit/document_spec.rb
156
153
  - spec/unit/parser/line_parser_spec.rb
@@ -1,34 +0,0 @@
1
- require "active_support/time"
2
-
3
- class Sie::Document
4
- class FinancialYears
5
- method_object :between,
6
- :start_month, :from_date, :to_date
7
-
8
- def between
9
- from_date.year.upto(to_date.year).map { |year|
10
- FinancialYear.date_range(year, start_month)
11
- }
12
- end
13
- end
14
-
15
- class FinancialYear
16
- method_object :date_range,
17
- :year, :start_month
18
-
19
- def date_range
20
- (start_of_year.beginning_of_month..end_of_year.end_of_month)
21
- end
22
-
23
- private
24
-
25
- def start_of_year
26
- Date.new(year, start_month, 1)
27
- end
28
-
29
- def end_of_year
30
- a_year_later = start_of_year >> 11
31
- Date.new(a_year_later.year, a_year_later.month, -1)
32
- end
33
- end
34
- end
@@ -1,48 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Sie::Document::FinancialYears, ".between" do
4
- it "gives us the financial years between from_date and to_date" do
5
- Sie::Document::FinancialYears.between(
6
- 1,
7
- Date.new(2011, 1, 1),
8
- Date.new(2011, 12, 31)
9
- ).should == [
10
- Date.new(2011, 1, 1)..Date.new(2011, 12, 31)
11
- ]
12
- end
13
-
14
- it "gives us the financial years over multiple years" do
15
- Sie::Document::FinancialYears.between(
16
- 1,
17
- Date.new(2011, 9, 1),
18
- Date.new(2013, 12, 31)
19
- ).should == [
20
- Date.new(2011, 1, 1)..Date.new(2011, 12, 31),
21
- Date.new(2012, 1, 1)..Date.new(2012, 12, 31),
22
- Date.new(2013, 1, 1)..Date.new(2013, 12, 31),
23
- ]
24
- end
25
-
26
- it "normalizes start and end date for compatibility with other systems" do
27
- Sie::Document::FinancialYears.between(
28
- 1,
29
- Date.new(2011, 9, 15),
30
- Date.new(2011, 10, 10)
31
- ).should == [
32
- Date.new(2011, 1, 1)..Date.new(2011, 12, 31),
33
- ]
34
- end
35
-
36
- it "uses the start month" do
37
- Sie::Document::FinancialYears.between(
38
- 5,
39
- Date.new(2011, 9, 1),
40
- Date.new(2014, 1, 31)
41
- ).should == [
42
- Date.new(2011, 5, 1)..Date.new(2012, 4, 30),
43
- Date.new(2012, 5, 1)..Date.new(2013, 4, 30),
44
- Date.new(2013, 5, 1)..Date.new(2014, 4, 30),
45
- Date.new(2014, 5, 1)..Date.new(2015, 4, 30),
46
- ]
47
- end
48
- end