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 ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fina_files.gemspec
4
+ gemspec
5
+
6
+
7
+ group :development do
8
+ gem 'rspec'
9
+ end
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
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -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,3 @@
1
+ module FinaFiles
2
+ VERSION = "0.0.1"
3
+ 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,5 @@
1
+ require "fina_files/version"
2
+
3
+ module FinaFiles
4
+ # Your code goes here...
5
+ end
@@ -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