sie 1.0.4 → 1.0.5

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
- ZmU2YjMwNWYzNjk3NzUxYzUyZjAyODFiNWI3NzBkZTFjYjY0NmE5NQ==
4
+ NDlhZjFkZmQwYmY5YjFhMDQ5ODljYTU1ZGM1ODFkMzMxMmIxMTRhOA==
5
5
  data.tar.gz: !binary |-
6
- NDA1YTYxYjExOTI1ODNiZDdmZDlmOTkyM2Y5MTliMDE2ZDIxNDQxZg==
6
+ OWIzMjZlMTE5YjAxZjg0MDE0YmNiOWE4MTljMDYzMGY4ZTE0NDc5Ng==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YzYwOWJmYTBlNGI0MTg4ZTllZWU0ZWVhN2Y2OTcxNmNlMjc1MjA1M2ViNGUz
10
- OTgwZDM2NzE2N2IzZDNmMWQ1YjhhYWUxZWZiN2M4NDk3ZjNiODRkYWQ5YzI5
11
- MjRhODMwYWRlMWE1OGFjMGJiOGM0NmU2ZDk2OTYxMjAwNWY0YWM=
9
+ MDA2OWNhMjU2OWFmNzBkNjZlOTgzODQyODBjNGZhNzFkYThkZTU1Y2UxNTlk
10
+ YjhkNTNhNDUwOTcxMGQ3OGU3ZTFlYzkwNDIzMTgyZWYyMDIwYmY4NWEzNDU2
11
+ ZjEwNDYxZTg4ZTk4NTE4MGMzZTE0NGRkMjYwNzdlOTMxZGQ3ZDY=
12
12
  data.tar.gz: !binary |-
13
- MmY0OWZiZGUyY2U1NDI3NWM3NDZkYjBlMzFhOWQ4MGM3ZGQ4MTJmODY2MzI2
14
- ZGQxNzJjOWZhZTQ5NzRkY2UwN2I4MmIxMDU2NDAxMjJjMDNkNWU4MzhiMzA4
15
- NWZmNDlmZWE5ZmJhNmU0YTk5NGQyYmIwZWEzZDY1MjUxYjA1NjI=
13
+ MWFlMzY5ZmI4YjljZGQwMzY5Y2U3ZmIyZWE0ZDE5ZGMxYWE1YjY1ODJhNjk2
14
+ NmE3MjE1OThlZTAxN2VkNzU0NzgyNWFhZjgyODhiNDUzMmEyMzBiYmQwZDM5
15
+ Yjg2ODMxYjQ3NGIzZmE2MzI5M2Q0OGQ1MjNiMjlkMDNiYjg0N2M=
@@ -6,6 +6,7 @@ require "active_support/core_ext/module/delegation"
6
6
 
7
7
  class Sie::Document
8
8
  pattr_initialize :data_source
9
+ FORTNOX_DESCRIPTION_LENGTH_MAX = 30
9
10
 
10
11
  def render
11
12
  add_header
@@ -42,7 +43,7 @@ class Sie::Document
42
43
  def add_accounts
43
44
  accounts.each do |account|
44
45
  number = account.fetch(:number)
45
- description = account.fetch(:description)
46
+ description = account.fetch(:description).slice(0, FORTNOX_DESCRIPTION_LENGTH_MAX)
46
47
 
47
48
  add_line("KONTO", number, description)
48
49
  end
@@ -69,12 +70,13 @@ class Sie::Document
69
70
  end
70
71
  end
71
72
 
73
+
72
74
  def add_voucher(opts)
73
75
  creditor = opts.fetch(:creditor)
74
76
  type = opts.fetch(:type)
75
77
  number = opts.fetch(:number)
76
78
  booked_on = opts.fetch(:booked_on)
77
- description = opts.fetch(:description)
79
+ description = opts.fetch(:description).slice(0, FORTNOX_DESCRIPTION_LENGTH_MAX)
78
80
  voucher_lines = opts.fetch(:voucher_lines)
79
81
 
80
82
  add_line("VER", voucher_series(creditor, type), number, booked_on, description)
@@ -84,9 +86,18 @@ class Sie::Document
84
86
  account_number = line.fetch(:account_number)
85
87
  amount = line.fetch(:amount)
86
88
  booked_on = line.fetch(:booked_on)
87
- description = line.fetch(:description)
89
+ # Some SIE-importers (fortnox) cannot handle descriptions longer than 30 characters,
90
+ # but the specification has no limit.
91
+ description = line.fetch(:description).slice(0, FORTNOX_DESCRIPTION_LENGTH_MAX)
88
92
 
89
93
  add_line("TRANS", account_number, Renderer::EMPTY_ARRAY, amount, booked_on, description)
94
+
95
+ # Some consumers of SIE cannot handle single voucher lines (fortnox), so add another empty one to make
96
+ # it balance. The spec just requires the sum of lines to be 0, so single lines with zero amount would conform,
97
+ # but break for these implementations.
98
+ if voucher_lines.size < 2 && amount == 0
99
+ add_line("TRANS", account_number, Renderer::EMPTY_ARRAY, amount, booked_on, description)
100
+ end
90
101
  end
91
102
  end
92
103
  end
@@ -1,3 +1,3 @@
1
1
  module Sie
2
- VERSION = "1.0.4"
2
+ VERSION = "1.0.5"
3
3
  end
@@ -9,7 +9,7 @@ describe Sie::Document, "#render" do
9
9
  let(:generated_on) { Date.yesterday }
10
10
  let(:accounts) {
11
11
  [
12
- number: 1500, description: "Customer ledger"
12
+ number: 1500, description: "Customer ledger",
13
13
  ]
14
14
  }
15
15
  let(:vouchers) {
@@ -155,6 +155,48 @@ describe Sie::Document, "#render" do
155
155
  )
156
156
  end
157
157
 
158
+ context "with really long descriptions" do
159
+ let(:accounts) {
160
+ [
161
+ number: 1500, description: "Customer ledger with really really long description blablabla"
162
+ ]
163
+ }
164
+ let(:vouchers) {
165
+ [
166
+ {
167
+ creditor: true, type: :payment, number: 3, booked_on: from_date + 365, description: "Payout 1 with really really long description blablabla",
168
+ voucher_lines: [
169
+ { account_number: 2400, amount: 256.0, booked_on: from_date + 365, description: "Payout line 1 with really really long description blablabla" },
170
+ { account_number: 1970, amount: -256.0, booked_on: from_date + 365, description: "Payout line 2" },
171
+ ]
172
+ }
173
+ ]
174
+ }
175
+
176
+ it "truncates the descriptions" do
177
+ expect(indexed_entry_attributes("konto", 0)).to eq("kontonr" => "1500", "kontonamn" => "Customer ledger with really re")
178
+ expect(indexed_entry("ver", 0).attributes["vertext"]).to eq("Payout 1 with really really lo")
179
+ expect(indexed_voucher_entries(0)[0].attributes["transtext"]).to eq("Payout line 1 with really real")
180
+ end
181
+ end
182
+
183
+ context "with a zeroed single voucher line" do
184
+ let(:vouchers) {
185
+ [
186
+ {
187
+ creditor: false, type: :invoice, number: 1, booked_on: from_date + 2, description: "Invoice 1",
188
+ voucher_lines: [
189
+ { account_number: 1500, amount: 0, booked_on: from_date + 2, description: "Item 1" },
190
+ ]
191
+ },
192
+ ]
193
+ }
194
+
195
+ it "makes sure there is always a matching zeroed line" do
196
+ expect(indexed_voucher_entries(0).size).to eq(2)
197
+ end
198
+ end
199
+
158
200
  private
159
201
 
160
202
  def entry_attribute(label, attribute)
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.4
4
+ version: 1.0.5
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-05-18 00:00:00.000000000 Z
11
+ date: 2014-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: attr_extras
@@ -142,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
142
  version: '0'
143
143
  requirements: []
144
144
  rubyforge_project:
145
- rubygems_version: 2.2.1
145
+ rubygems_version: 2.2.2
146
146
  signing_key:
147
147
  specification_version: 4
148
148
  summary: Parses and generates SIE files (http://sie.se/)