fina_files 0.0.1
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.
- data/.gitignore +17 -0
- data/.rspec +1 -0
- data/Gemfile +9 -0
- data/LICENSE +22 -0
- data/README.md +23 -0
- data/Rakefile +2 -0
- data/fina_files.gemspec +17 -0
- data/lib/fina_files/fina_izvadak.rb +68 -0
- data/lib/fina_files/version.rb +3 -0
- data/lib/fina_files/zbrojni_nalog.rb +44 -0
- data/lib/fina_files.rb +5 -0
- data/spec/fina_files/fina_izvadak_spec.rb +99 -0
- data/spec/fina_files/zbrojni_nalog_spec.rb +62 -0
- metadata +60 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 drKreso
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# Fina files
|
2
|
+
|
3
|
+
Podrzani su:
|
4
|
+
|
5
|
+
1. Import FINA formata za izvadak i zbrojni nalog
|
6
|
+
2. Generiranje FINA zbrojnog naloga
|
7
|
+
|
8
|
+
Radi se o novom formatu koji je aktualan od 4. lipnja 2012 (Novi univerzalni HUB3 obrazac)
|
9
|
+
|
10
|
+
## Instalacija
|
11
|
+
|
12
|
+
Treba dodati redak u Gemfile
|
13
|
+
|
14
|
+
gem 'fina_files'
|
15
|
+
|
16
|
+
I nakon toga izvrsiti:
|
17
|
+
|
18
|
+
$ bundle
|
19
|
+
|
20
|
+
Ako se ne koristi u Rails aplikaciji dovoljno je samo instalirati ovako:
|
21
|
+
|
22
|
+
$ gem install fina_files
|
23
|
+
|
data/Rakefile
ADDED
data/fina_files.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/fina_files/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["drKreso"]
|
6
|
+
gem.email = ["kresimir.bojcic@gmail.com"]
|
7
|
+
gem.description = %q{FINA formati na jednom mjestu}
|
8
|
+
gem.summary = %q{Podrska za rad sa fina datotekama}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "fina_files"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = FinaFiles::VERSION
|
17
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#HUB3 verzija specifikacije
|
2
|
+
class FinaIzvadak
|
3
|
+
DEFINICIJA= {
|
4
|
+
"900" => 'a7a50a11a4a8a917a3',
|
5
|
+
"903" => 'a7a11a21a3a70a35a8a11a3a3a8a4a4a809a3',
|
6
|
+
"905" => 'a2a34a70a35a35a8a8a3a15a1a15a1a15a26a26a4a140a42a35a482a3',
|
7
|
+
"907" => 'a21a3a70a3a3a8a8a1a15a1a15a8a15a15a1a15a1a15a1a15a1a15a4a6a420a317a3',
|
8
|
+
"909" => 'a8a5a6a978a3',
|
9
|
+
"999" => 'a997a3'
|
10
|
+
}
|
11
|
+
|
12
|
+
def type(line)
|
13
|
+
raise "Duljina mora biti 1000 (dobio duljinu #{line.length} - znakovno: '#{line}')" unless line.length == 1000
|
14
|
+
|
15
|
+
line.unpack('a997a3')[-1]
|
16
|
+
end
|
17
|
+
|
18
|
+
def decode(line)
|
19
|
+
raise "Ne postoji slog tipa #{type(line)} koji je poslan" if DEFINICIJA[type(line)].nil?
|
20
|
+
|
21
|
+
line.unpack(DEFINICIJA.fetch(type(line))).map(&:strip)
|
22
|
+
end
|
23
|
+
|
24
|
+
def prometi(izvadak)
|
25
|
+
[].tap do |result|
|
26
|
+
grupa = nil
|
27
|
+
counter = nil
|
28
|
+
izvadak.lines.map do |line|
|
29
|
+
decoded = decode(line.chomp)
|
30
|
+
tip = decoded[-1]
|
31
|
+
if tip == "900"
|
32
|
+
next
|
33
|
+
elsif tip == "903"
|
34
|
+
grupa = decoded
|
35
|
+
counter = 0
|
36
|
+
elsif tip == "905"
|
37
|
+
counter += 1
|
38
|
+
result << [
|
39
|
+
grupa[8].to_i,
|
40
|
+
counter,
|
41
|
+
DateTime.parse(grupa[10]),
|
42
|
+
decoded[0] == "10" ? :na_teret : :u_korist,
|
43
|
+
grupa[2],
|
44
|
+
grupa[3],
|
45
|
+
decoded[1],
|
46
|
+
decoded[2],
|
47
|
+
decoded[3],
|
48
|
+
decoded[4],
|
49
|
+
DateTime.parse(decoded[5]),
|
50
|
+
DateTime.parse(decoded[6]),
|
51
|
+
(BigDecimal.new(decoded[11] + decoded[12])/100.0).round(2),
|
52
|
+
decoded[13],
|
53
|
+
decoded[14],
|
54
|
+
decoded[16],
|
55
|
+
decoded[18]
|
56
|
+
]
|
57
|
+
elsif tip == "907"
|
58
|
+
next
|
59
|
+
elsif tip == "909"
|
60
|
+
next
|
61
|
+
elsif tip == "999"
|
62
|
+
next
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
|
3
|
+
class ZbrojniNalog
|
4
|
+
attr_accessor :datum, :nalozi
|
5
|
+
attr_reader :rows, :iban_platitelj
|
6
|
+
|
7
|
+
def initialize(iban_platitelj)
|
8
|
+
@rows = []
|
9
|
+
@nalozi = []
|
10
|
+
@datum = DateTime.now
|
11
|
+
@iban_platitelj = iban_platitelj
|
12
|
+
end
|
13
|
+
|
14
|
+
def rows
|
15
|
+
@rows << row_300
|
16
|
+
@rows << row_301
|
17
|
+
@nalozi.each { |nalog| @rows << row_309(nalog) }
|
18
|
+
@rows << row_399
|
19
|
+
end
|
20
|
+
|
21
|
+
def row_300
|
22
|
+
datum.strftime('%Y%m%d') + "1701" + " "*985 + "300"
|
23
|
+
end
|
24
|
+
|
25
|
+
def row_301
|
26
|
+
"#{@iban_platitelj}HRK" + " "*24 + "%05d" % nalozi.count + zbroj_to_s + datum.strftime('%Y%m%d') + " "*916 + "301"
|
27
|
+
end
|
28
|
+
|
29
|
+
def row_309(nalog)
|
30
|
+
nalog[2].ljust(34) + nalog[3].ljust(70) + " "*103 + nalog[1].ljust(140) +("%016.2f" % nalog[4]).gsub(".","") + nalog[0].gsub(" ","").ljust(26) + " "*159 + "0" + " "*449 + "309"
|
31
|
+
end
|
32
|
+
|
33
|
+
def zbroj_to_s
|
34
|
+
raise 'nema naloga' if nalozi.count == 0
|
35
|
+
amount = nalozi.map do |nalog|
|
36
|
+
BigDecimal.new(nalog[4].to_s).round(2)
|
37
|
+
end.reduce(:+)
|
38
|
+
("%021.2f" % amount).gsub(".","")
|
39
|
+
end
|
40
|
+
|
41
|
+
def row_399
|
42
|
+
" "*997 + "399"
|
43
|
+
end
|
44
|
+
end
|
data/lib/fina_files.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'fina_files/fina_izvadak'
|
2
|
+
|
3
|
+
describe FinaIzvadak do
|
4
|
+
|
5
|
+
REDAK_900 = "2503007VOLKSBANK D.D. ZAGREB 78427478595100020121029 900"
|
6
|
+
REDAK_903 = "2503007VBCRHR22 HR2225030071100023270HRKTOMMY D.O.O ZA TRGOVINU,TU SPLIT 03953084002782600102510002012102700011000 903"
|
7
|
+
REDAK_905_1 = "2025030071011111116 TOMMY D.O.O. DOMOVINSKOG RATA 93 SPLIT 2012102720121027 000000000000000+000000000000000+000000000053000HR001010707032 HR026026102012 BONORA PARKING 26/10/2012 20121027000022 905"
|
8
|
+
REDAK_905_2 = "1025030071011111116 TOMMY D.O.O. DOMOVINSKOG RATA 93 SPLIT 2012102720121027 000000000000000+000000000000000-000000000132000HR001010487032 HR02932610212 POLOG 20121027000097 905"
|
9
|
+
REDAK_907 = "HR2225030071100023270HRKTOMMY D.O.O ZA TRGOVINU,TU 25100020121027 +000000198343125 00000000000000020130228000001000000000000000000000000+000001287360525+000000002870000+000000091887400+0000002873605250001000002 907"
|
10
|
+
REDAK_909 = "2012102900001000002 909"
|
11
|
+
REDAK_999 = " 999"
|
12
|
+
REDAK_KRIVI = "2503007VOLKSBANK D.D. ZAGREB 78427478595100020121029 900"
|
13
|
+
REDAK_KRIVI_TIP = "2503007VOLKSBANK D.D. ZAGREB 78427478595100020121029 901"
|
14
|
+
|
15
|
+
FINA_FILE = "#{REDAK_900}\r\n#{REDAK_903}\r\n#{REDAK_905_1}\r\n#{REDAK_905_2}\r\n#{REDAK_907}\r\n#{REDAK_909}\r\n#{REDAK_999}"
|
16
|
+
|
17
|
+
it 'zna prepoznati redak 900 i izvaditi podatke' do
|
18
|
+
subject.decode(REDAK_900).should == ["2503007", "VOLKSBANK D.D. ZAGREB", "78427478595", "1000", "20121029", "", "900"]
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'zna prepoznati redak 903 i izvaditi podatke' do
|
22
|
+
subject.decode(REDAK_903).should == ["2503007", "VBCRHR22", "HR2225030071100023270", "HRK", "TOMMY D.O.O ZA TRGOVINU,TU",
|
23
|
+
"SPLIT", "03953084", "00278260010", "251", "000", "20121027", "0001", "1000", "", "903"]
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'zna prepoznati redak 905 i izvaditi podatke' do
|
27
|
+
subject.decode(REDAK_905_1).should == ["20", "25030071011111116", "TOMMY D.O.O.", "DOMOVINSKOG RATA 93", "SPLIT", "20121027",
|
28
|
+
"20121027", "", "000000000000000", "+", "000000000000000", "+", "000000000053000", "HR001010707032",
|
29
|
+
"HR026026102012", "", "BONORA PARKING 26/10/2012", "", "20121027000022", "", "905"]
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'zna prepoznati redak 907 i izvaditi podatke' do
|
33
|
+
subject.decode(REDAK_907).should == ["HR2225030071100023270", "HRK", "TOMMY D.O.O ZA TRGOVINU,TU", "251", "000", "20121027", "",
|
34
|
+
"+", "000000198343125", "", "000000000000000", "20130228", "000001000000000", "000000000000000",
|
35
|
+
"+", "000001287360525", "+", "000000002870000", "+", "000000091887400", "+", "000000287360525",
|
36
|
+
"0001", "000002", "", "", "907"]
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'zna prepoznati redak 909 i izvaditi podatke' do
|
40
|
+
subject.decode(REDAK_909).should == ["20121029", "00001", "000002", "", "909"]
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'zna prepoznati redak 999 i izvaditi podatke' do
|
44
|
+
subject.decode(REDAK_999).should == ["", "999"]
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'zna prepoznati redak krive duljine' do
|
48
|
+
lambda do
|
49
|
+
subject.decode(REDAK_KRIVI)
|
50
|
+
end.should raise_error "Duljina mora biti 1000 (dobio duljinu 999 - znakovno: '2503007VOLKSBANK D.D. ZAGREB 78427478595100020121029 900')"
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'zna prepoznati krvi tip' do
|
54
|
+
lambda do
|
55
|
+
subject.decode(REDAK_KRIVI_TIP)
|
56
|
+
end.should raise_error "Ne postoji slog tipa 901 koji je poslan"
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'zna broj naloga' do
|
60
|
+
subject.prometi(FINA_FILE).count.should == 2
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'zna podatke naloga' do
|
64
|
+
subject.prometi(FINA_FILE)[0].should == [
|
65
|
+
251,
|
66
|
+
1,
|
67
|
+
DateTime.parse('2012-10-27'),
|
68
|
+
:u_korist,
|
69
|
+
"HR2225030071100023270",
|
70
|
+
"HRK",
|
71
|
+
"25030071011111116", "TOMMY D.O.O.", "DOMOVINSKOG RATA 93", "SPLIT",
|
72
|
+
DateTime.parse('2012-10-27'),
|
73
|
+
DateTime.parse('2012-10-27'),
|
74
|
+
BigDecimal(530).round(2),
|
75
|
+
"HR001010707032",
|
76
|
+
"HR026026102012",
|
77
|
+
"BONORA PARKING 26/10/2012",
|
78
|
+
"20121027000022"
|
79
|
+
]
|
80
|
+
|
81
|
+
subject.prometi(FINA_FILE)[1].should == [
|
82
|
+
251,
|
83
|
+
2,
|
84
|
+
DateTime.parse('2012-10-27'),
|
85
|
+
:na_teret,
|
86
|
+
"HR2225030071100023270",
|
87
|
+
"HRK",
|
88
|
+
"25030071011111116", "TOMMY D.O.O.", "DOMOVINSKOG RATA 93", "SPLIT",
|
89
|
+
DateTime.parse('2012-10-27'),
|
90
|
+
DateTime.parse('2012-10-27'),
|
91
|
+
-1320.0,
|
92
|
+
"HR001010487032",
|
93
|
+
"HR02932610212",
|
94
|
+
"POLOG",
|
95
|
+
"20121027000097"
|
96
|
+
]
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#encoding:utf-8
|
2
|
+
require 'fina_files/zbrojni_nalog'
|
3
|
+
|
4
|
+
describe ZbrojniNalog do
|
5
|
+
NALOZI = [
|
6
|
+
[
|
7
|
+
"HR68 8109-58913703560-1209",
|
8
|
+
"MIO I STUP",
|
9
|
+
"1001005-1863000160",
|
10
|
+
"DRŽAVNI PRORAČUN REPUBLIKE HRVATSKE",
|
11
|
+
574.6
|
12
|
+
],
|
13
|
+
[
|
14
|
+
"HR68 2003-58913703560-1209",
|
15
|
+
"MIO II STUP",
|
16
|
+
"1001005-1700036001",
|
17
|
+
"DOPRINOS ZA MIROVINSKO OSIGURANJE",
|
18
|
+
191.53
|
19
|
+
]
|
20
|
+
]
|
21
|
+
|
22
|
+
let(:subject) do
|
23
|
+
ZbrojniNalog.new('HR1111111111111111111')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'stavlja red 300' do
|
27
|
+
subject.datum = DateTime.parse('2012-07-25')
|
28
|
+
subject.nalozi = NALOZI
|
29
|
+
subject.rows[0].should == ("201207251701" + " "*985 + "300")
|
30
|
+
subject.rows[0].length.should == 1000
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'stavlja red 301' do
|
34
|
+
subject.datum = DateTime.parse('2012-07-25')
|
35
|
+
subject.nalozi = NALOZI
|
36
|
+
subject.rows[1].should == "#{subject.iban_platitelj}HRK" + " "*24 + "00002" + "00000000000000076613" + "20120725" + " "*916 + "301"
|
37
|
+
subject.rows[1].length.should == 1000
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'stavlja red 309 prvi' do
|
41
|
+
subject.datum = DateTime.parse('2012-07-25')
|
42
|
+
subject.nalozi = NALOZI
|
43
|
+
subject.rows[2].should == "1001005-1863000160" + " "*16 + "DRŽAVNI PRORAČUN REPUBLIKE HRVATSKE" + " "*35 + " "*103 +
|
44
|
+
"MIO I STUP" + " "*130 + "000000000057460" + "HR68" + "8109-58913703560-1209 " + " "*159 + "0" + " "*449 + "309"
|
45
|
+
subject.rows[2].length.should == 1000
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'stavlja red 309 drugi' do
|
49
|
+
subject.datum = DateTime.parse('2012-07-25')
|
50
|
+
subject.nalozi = NALOZI
|
51
|
+
subject.rows[3].should == "1001005-1700036001 DOPRINOS ZA MIROVINSKO OSIGURANJE MIO II STUP 000000000019153HR682003-58913703560-1209 0 309"
|
52
|
+
|
53
|
+
subject.rows[3].length.should == 1000
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'stavlja na kraj red 399' do
|
57
|
+
subject.nalozi = NALOZI
|
58
|
+
subject.rows[-1].should == " "*997 + "399"
|
59
|
+
subject.rows[-1].length.should == 1000
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fina_files
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- drKreso
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-04 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: FINA formati na jednom mjestu
|
15
|
+
email:
|
16
|
+
- kresimir.bojcic@gmail.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- .rspec
|
23
|
+
- Gemfile
|
24
|
+
- LICENSE
|
25
|
+
- README.md
|
26
|
+
- Rakefile
|
27
|
+
- fina_files.gemspec
|
28
|
+
- lib/fina_files.rb
|
29
|
+
- lib/fina_files/fina_izvadak.rb
|
30
|
+
- lib/fina_files/version.rb
|
31
|
+
- lib/fina_files/zbrojni_nalog.rb
|
32
|
+
- spec/fina_files/fina_izvadak_spec.rb
|
33
|
+
- spec/fina_files/zbrojni_nalog_spec.rb
|
34
|
+
homepage: ''
|
35
|
+
licenses: []
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options: []
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
requirements: []
|
53
|
+
rubyforge_project:
|
54
|
+
rubygems_version: 1.8.24
|
55
|
+
signing_key:
|
56
|
+
specification_version: 3
|
57
|
+
summary: Podrska za rad sa fina datotekama
|
58
|
+
test_files:
|
59
|
+
- spec/fina_files/fina_izvadak_spec.rb
|
60
|
+
- spec/fina_files/zbrojni_nalog_spec.rb
|