fiscalizer 0.0.12 → 1.0.0

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.rspec +2 -0
  4. data/Gemfile +0 -4
  5. data/LICENSE.txt +1 -1
  6. data/README.md +187 -171
  7. data/bin/console +14 -0
  8. data/bin/setup +7 -0
  9. data/doc/Tehnicka specifikacija za korisnike 1.4.pdf +0 -0
  10. data/fiscalizer.gemspec +14 -13
  11. data/lib/fiscalizer.rb +33 -4
  12. data/lib/fiscalizer/constants.rb +11 -0
  13. data/lib/fiscalizer/data_objects/echo.rb +10 -0
  14. data/lib/fiscalizer/data_objects/fee.rb +18 -0
  15. data/lib/fiscalizer/data_objects/invoice.rb +79 -0
  16. data/lib/fiscalizer/data_objects/office.rb +41 -0
  17. data/lib/fiscalizer/{tax.rb → data_objects/tax.rb} +3 -5
  18. data/lib/fiscalizer/deserializers/base.rb +58 -0
  19. data/lib/fiscalizer/deserializers/echo.rb +13 -0
  20. data/lib/fiscalizer/deserializers/invoice.rb +9 -0
  21. data/lib/fiscalizer/deserializers/office.rb +6 -0
  22. data/lib/fiscalizer/fiscalizer.rb +36 -152
  23. data/lib/fiscalizer/fiscalizers/base.rb +54 -0
  24. data/lib/fiscalizer/fiscalizers/echo.rb +13 -0
  25. data/lib/fiscalizer/fiscalizers/invoice.rb +24 -0
  26. data/lib/fiscalizer/fiscalizers/office.rb +15 -0
  27. data/lib/fiscalizer/serializers/base.rb +58 -0
  28. data/lib/fiscalizer/serializers/echo.rb +21 -0
  29. data/lib/fiscalizer/serializers/invoice.rb +92 -0
  30. data/lib/fiscalizer/serializers/office.rb +85 -0
  31. data/lib/fiscalizer/serializers/signature.rb +62 -0
  32. data/lib/fiscalizer/serializers/tax.rb +81 -0
  33. data/lib/fiscalizer/services/request_sender.rb +68 -0
  34. data/lib/fiscalizer/services/security_code_generator.rb +29 -0
  35. data/lib/fiscalizer/version.rb +1 -1
  36. data/spec/fiscalizer_spec.rb +119 -0
  37. data/spec/spec_helper.rb +9 -0
  38. metadata +67 -39
  39. data/doc/README.md +0 -3
  40. data/doc/Tehnicka_specifikacija_za_korisnike_1.2.pdf +0 -0
  41. data/example/README.md +0 -25
  42. data/example/echo_P12.rb +0 -13
  43. data/example/echo_public_and_private_keys.rb +0 -16
  44. data/example/invoice_fiscalization_passing_arguments.rb +0 -44
  45. data/example/invoice_fiscalization_passing_object.rb +0 -48
  46. data/example/office_fiscalization_passing_arguments.rb +0 -22
  47. data/example/office_fiscalization_passing_object.rb +0 -26
  48. data/lib/README.md +0 -0
  49. data/lib/fiscalizer/README.md +0 -9
  50. data/lib/fiscalizer/communication.rb +0 -305
  51. data/lib/fiscalizer/echo.rb +0 -11
  52. data/lib/fiscalizer/fee.rb +0 -20
  53. data/lib/fiscalizer/invoice.rb +0 -190
  54. data/lib/fiscalizer/office.rb +0 -66
  55. data/lib/fiscalizer/response.rb +0 -124
  56. data/test/README.md +0 -13
  57. data/test/test_echo.rb +0 -20
  58. data/test/test_fee +0 -64
  59. data/test/test_fiscalizer.rb +0 -222
  60. data/test/test_fiscalizer_communication.rb +0 -28
  61. data/test/test_invoice.rb +0 -11
  62. data/test/test_office.rb +0 -11
  63. data/test/test_tax.rb +0 -89
@@ -1,64 +0,0 @@
1
- require "test/unit"
2
- require "fiscalizer"
3
-
4
- class FeeTest < Test::Unit::TestCase
5
-
6
- def test_initialization
7
- # Manual build
8
- fee = Fiscalizer::Fee.new
9
- fee.name = "My cool new fee"
10
- fee.value = 234.16
11
- assert_equal "My cool new fee", fee.name, "Fee's name not set"
12
- assert_equal 234.16, fee.value, "Fee's value not set"
13
-
14
- # Automatic build
15
- fee = Fiscalizer::Fee.new name: "My cool new fee", value: 234.16
16
- assert_equal "My cool new fee", fee.name, "Fee's name not set"
17
- assert_equal 234.16, fee.value, "Fee's value not set"
18
- end # test_initialization
19
-
20
- def test_math
21
- # Whole number
22
- fee = Fiscalizer::Fee.new name: "Test", value: 100
23
- assert_equal 100, fee.value, "Whole number is wrong"
24
-
25
- # Decimal number
26
- fee = Fiscalizer::Fee.new name: "Test", value: 13.67
27
- assert_equal 13.67, fee.value, "Decimal number is wrong"
28
-
29
- # Decimal whole number
30
- fee = Fiscalizer::Fee.new name: "Test", value: 13.00
31
- assert_equal 13.00, fee.value, "Decimal whole number is wrong"
32
-
33
- # Rounding down
34
- fee = Fiscalizer::Fee.new name: "Test", value: 13.674961205
35
- assert_equal 13.67, fee.value, "Rounding down is wrong"
36
-
37
- # Rounding up
38
- fee = Fiscalizer::Fee.new name: "Test", value: 13.675961205
39
- assert_equal 13.68, fee.value, "Rounding down is wrong"
40
- end # test_math
41
-
42
- def test_string
43
- # Whole number
44
- fee = Fiscalizer::Fee.new name: "Test", value: 100
45
- assert_equal "100.00", fee.value_str, "Whole number string is wrong"
46
-
47
- # Decimal number
48
- fee = Fiscalizer::Fee.new name: "Test", value: 13.67
49
- assert_equal "13.67", fee.value_str, "Decimal number string is wrong"
50
-
51
- # Decimal whole number
52
- fee = Fiscalizer::Fee.new name: "Test", value: 13.00
53
- assert_equal "13.00", fee.value_str, "Decimal whole number string is wrong"
54
-
55
- # Rounding down
56
- fee = Fiscalizer::Fee.new name: "Test", value: 13.674961205
57
- assert_equal "13.67", fee.value_str, "Rounding down string is wrong"
58
-
59
- # Rounding up
60
- fee = Fiscalizer::Fee.new name: "Test", value: 13.675961205
61
- assert_equal "13.68", fee.value_str, "Rounding down string is wrong"
62
- end # test_string
63
-
64
- end
@@ -1,222 +0,0 @@
1
- require "test/unit"
2
- require "fiscalizer"
3
- require 'nokogiri'
4
- require 'openssl'
5
-
6
- class FiscalizerTest < Test::Unit::TestCase
7
- # Configure
8
- KEY_PUBLIC_PATH = "/test/assets/fiskal1.cert"
9
- KEY_PRIVATE_PATH = "/test/assets/privateKey.key"
10
- CERTIFICATE_PATH = "/test/assets/democacert.pem"
11
- CERTIFICATE_P12_PATH = "/test/assets/fiskal1.pfx"
12
- URL_FISKAL = "https://cistest.apis-it.hr:8449/FiskalizacijaServiceTest"
13
- CER_ISSUED = "OU=DEMO,O=FINA,C=HR"
14
- PASSWORD = "12345678"
15
- # Use P12
16
- EXPORTED_KEYS = false
17
- # Test specific info
18
- UUID = "ca996cc7-fcc3-4c50-961b-40c8b875a5e8"
19
- ECHO = "This is a simple test..."
20
- # Personal information
21
- PIN = "00123456789"
22
- PIN_OPERATOR = "00000000000"
23
-
24
- def test_initialization
25
- # Manual build
26
- fiscal = Fiscalizer.new
27
-
28
- # Populate
29
- fiscal.url = "www.somewhere.com"
30
- fiscal.key_public_path = "path/to/my/cert.pem"
31
- fiscal.key_private_path = "path/to/my/cert.cer"
32
-
33
- # Test
34
- assert_equal "www.somewhere.com", fiscal.url, "Manual URL assignment"
35
- assert_equal "path/to/my/cert.pem", fiscal.key_public_path, "Manual public certificate location assignment"
36
- assert_equal "path/to/my/cert.cer", fiscal.key_private_path, "Manual private certificate location assignment"
37
-
38
- # Automatic Build
39
- fiscal = nil
40
- fiscal = Fiscalizer.new url: "www.somewhere.com",
41
- key_public_path: "path/to/my/cert.pem",
42
- key_private_path: "path/to/my/cert.cer"
43
-
44
- # Test
45
- assert_equal "www.somewhere.com", fiscal.url, "Automatic URL assignment"
46
- assert_equal "path/to/my/cert.pem", fiscal.key_public_path, "Automatic public certificate location assignment"
47
- assert_equal "path/to/my/cert.cer", fiscal.key_private_path, "Automatic private certificate location assignment"
48
- end # fiscal_ruby_test
49
-
50
- def test_echo
51
- fiscal = nil
52
- if EXPORTED_KEYS
53
- fiscal = Fiscalizer.new url: URL_FISKAL,
54
- key_public_path: KEY_PUBLIC_PATH,
55
- key_private_path: KEY_PRIVATE_PATH,
56
- certificate_path: CERTIFICATE_PATH,
57
- certificate_issued_by: CER_ISSUED
58
- else
59
- fiscal = Fiscalizer.new url: URL_FISKAL,
60
- certificate_path: CERTIFICATE_PATH,
61
- certificate_p12_path: CERTIFICATE_P12_PATH,
62
- certificate_issued_by: CER_ISSUED,
63
- password: PASSWORD
64
- end
65
- echo = fiscal.echo text: ECHO
66
- assert_equal ECHO, echo.response, "Echo response message does not match sent message"
67
- assert echo.echo?, "Automatic echo check failed"
68
- end # test_echo
69
-
70
- def test_office
71
- # -- Here Be Dragons --
72
- fiscal = nil
73
- if EXPORTED_KEYS
74
- fiscal = Fiscalizer.new url: URL_FISKAL,
75
- key_public_path: KEY_PUBLIC_PATH,
76
- key_private_path: KEY_PRIVATE_PATH,
77
- certificate_path: CERTIFICATE_PATH,
78
- certificate_issued_by: CER_ISSUED
79
- else
80
- fiscal = Fiscalizer.new url: URL_FISKAL,
81
- certificate_path: CERTIFICATE_PATH,
82
- certificate_p12_path: CERTIFICATE_P12_PATH,
83
- certificate_issued_by: CER_ISSUED,
84
- password: PASSWORD
85
- end
86
-
87
- assert fiscal!=nil, "Failed to initialize"
88
- # Generate invoice
89
- office = fiscal.office uuid: UUID,
90
- time_sent: Time.now,
91
- pin: PIN,
92
- office_label: "Poslovnica1",
93
- adress_street_name: "Somewhere",
94
- adress_house_num: "42",
95
- adress_house_num_addendum: "AD",
96
- adress_post_num: "10000",
97
- adress_settlement: "Block 25-C",
98
- adress_township: "Vogsphere",
99
- adress_other: nil,
100
- office_time: "Pon-Pet: 8:00-16:00",
101
- take_effect_date: Time.now + 3600 * 24 * 7,
102
- closure_mark: nil,
103
- specific_purpose: nil
104
- assert !office.errors?, "Returned an error"
105
- assert office.uuid != nil, "'UUID' was not returned"
106
- assert office.processed_at != nil, "'Processed at' was not returned"
107
- end # test_office
108
-
109
- def test_office_object
110
- # -- Here Be Dragons --
111
- fiscal = nil
112
- if EXPORTED_KEYS
113
- fiscal = Fiscalizer.new url: URL_FISKAL,
114
- key_public_path: KEY_PUBLIC_PATH,
115
- key_private_path: KEY_PRIVATE_PATH,
116
- certificate_path: CERTIFICATE_PATH,
117
- certificate_issued_by: CER_ISSUED
118
- else
119
- fiscal = Fiscalizer.new url: URL_FISKAL,
120
- certificate_path: CERTIFICATE_PATH,
121
- certificate_p12_path: CERTIFICATE_P12_PATH,
122
- certificate_issued_by: CER_ISSUED,
123
- password: PASSWORD
124
- end
125
-
126
- # Generate office
127
- office = Fiscalizer::Office.new
128
- office.uuid = UUID
129
- office.time_sent = Time.now
130
- office.pin = PIN
131
- office.office_label = "Poslovnica1"
132
- office.adress_street_name = "Somewhere"
133
- office.adress_house_num = "42"
134
- office.adress_house_num_addendum = "AD"
135
- office.adress_post_num = "10000"
136
- office.adress_settlement = "Block 25-C"
137
- office.adress_township = "Vogsphere"
138
- office.adress_other = nil
139
- office.office_time = "Pon-Pet: 8:00-16:00"
140
- office.take_effect_date = Time.now + 3600 * 24 * 7
141
- office.closure_mark = nil
142
- office.specific_purpose = nil
143
-
144
- # Generate office
145
- office_response = fiscal.fiscalize_office office
146
-
147
- if office_response.errors?
148
- puts "There were some nasty errors!"
149
- office_response.errors.each do |error_code, error_message|
150
- puts " " + error_code + " : " + error_message
151
- end
152
- end
153
-
154
- assert !office_response.errors?, "Returned an error"
155
- assert office_response.uuid != nil, "'UUID' was not returned"
156
- assert office_response.processed_at != nil, "'Processed at' was not returned"
157
- end # test_office_object
158
-
159
- def test_invoice
160
- # -- Here Be Dragons --
161
- fiscal = nil
162
- if EXPORTED_KEYS
163
- fiscal = Fiscalizer.new url: URL_FISKAL,
164
- key_public_path: KEY_PUBLIC_PATH,
165
- key_private_path: KEY_PRIVATE_PATH,
166
- certificate_path: CERTIFICATE_PATH,
167
- certificate_issued_by: CER_ISSUED
168
- else
169
- fiscal = Fiscalizer.new url: URL_FISKAL,
170
- certificate_path: CERTIFICATE_PATH,
171
- certificate_p12_path: CERTIFICATE_P12_PATH,
172
- certificate_issued_by: CER_ISSUED,
173
- password: PASSWORD
174
- end
175
- # Generate taxes
176
- taxes_vat = []
177
- taxes_spending = []
178
- taxes_other = []
179
- (0..5).each do |i|
180
- tax = Fiscalizer::Tax.new
181
- tax.base = rand(10000 * 100).to_f / 100.0
182
- tax.rate = rand(100 * 100).to_f / 100.0
183
- taxes_vat << tax
184
- end
185
- (0..5).each do |i|
186
- tax = Fiscalizer::Tax.new
187
- tax.base = rand(10000 * 100).to_f / 100.0
188
- tax.rate = rand(100 * 100).to_f / 100.0
189
- taxes_spending << tax
190
- end
191
- (0..5).each do |i|
192
- tax = Fiscalizer::Tax.new
193
- tax.base = rand(10000 * 100).to_f / 100.0
194
- tax.rate = rand(100 * 100).to_f / 100.0
195
- tax.name = "My Test Tax #{i}"
196
- taxes_other << tax
197
- end
198
- # Generate invoice
199
- invoice = fiscal.invoice uuid: UUID,
200
- time_sent: Time.now,
201
- pin: PIN,
202
- in_vat_system: true,
203
- time_issued: Time.now - 3600,
204
- consistance_mark: "P",
205
- issued_number: "1",
206
- issued_office: "Pm2",
207
- issued_machine: "3",
208
- tax_vat: taxes_vat,
209
- tax_spending: taxes_spending,
210
- tax_other: taxes_other,
211
- payment_method: "g",
212
- operator_pin: PIN_OPERATOR,
213
- subsequent_delivery: false,
214
- value_non_taxable: 200.0
215
-
216
- assert !invoice.errors?, "Returned an error"
217
- assert invoice.uuid != nil, "'UUID' was not returned"
218
- assert invoice.processed_at != nil, "'Processed at' was not returned"
219
- assert invoice.unique_identifier != nil, "Uniqe Identifier (JIR) was not returned"
220
- end # test_invoice
221
-
222
- end # FiscalizerRubyTest
@@ -1,28 +0,0 @@
1
- require "test/unit"
2
- require "fiscalizer"
3
-
4
- class CommunicationTest < Test::Unit::TestCase
5
-
6
- def test_initialization
7
- # Manual build
8
- comm = Fiscalizer::Communication.new
9
- assert comm, "Failed to initialize"
10
-
11
- # Default value
12
- assert_equal "http://www.apis-it.hr/fin/2012/types/f73", comm.tns, "Tns was not assigned by default"
13
- assert_equal "http://www.apis-it.hr/fin/2012/types/f73 FiskalizacijaSchema.xsd", comm.schemaLocation, "Schema Location was not assigned by default"
14
-
15
- # Manual assignment
16
- comm.tns = "test.tns.hr"
17
- comm.schemaLocation = "test.tns.hr/Schema.xml"
18
- assert_equal "test.tns.hr", comm.tns, "Tns was not assigned"
19
- assert_equal "test.tns.hr/Schema.xml", comm.schemaLocation, "Schema Location was not assigned"
20
-
21
- # Automatic assignment
22
- comm = nil
23
- comm = Fiscalizer::Communication.new tns: "test.tns.hr", schemaLocation: "test.tns.hr/Schema.xml"
24
- assert_equal "test.tns.hr", comm.tns, "Tns was not assigned"
25
- assert_equal "test.tns.hr/Schema.xml", comm.schemaLocation, "Schema Location was not assigned"
26
- end # test_initialization
27
-
28
- end
@@ -1,11 +0,0 @@
1
- require "test/unit"
2
- require "fiscalizer"
3
-
4
- class InvoiceTest < Test::Unit::TestCase
5
-
6
- def test_initialization
7
- # Manual build
8
- # Automatic build
9
- end # test_initialization
10
-
11
- end
@@ -1,11 +0,0 @@
1
- require "test/unit"
2
- require "fiscalizer"
3
-
4
- class OfficeTest < Test::Unit::TestCase
5
-
6
- def test_initialization
7
- # Manual build
8
- # Automatic build
9
- end # test_initialization
10
-
11
- end
@@ -1,89 +0,0 @@
1
- require "test/unit"
2
- require "fiscalizer"
3
-
4
- class TaxTest < Test::Unit::TestCase
5
-
6
- def test_initialization
7
- # Manual build
8
- tax = Fiscalizer::Tax.new
9
- assert tax, "Failed to initialize"
10
- tax.base = 100
11
- tax.rate = 25
12
- tax.name = "My test tax"
13
- assert_equal 100, tax.base, "Wrong base assigned"
14
- assert_equal 25, tax.rate, "Wrong rate assigned"
15
- assert_equal "My test tax", tax.name, "Wrong name assigned"
16
-
17
- tax = nil
18
- tax = Fiscalizer::Tax.new base: 100, rate: 25, name: "My test tax"
19
- assert tax, "Failed to initialize"
20
- assert_equal 100, tax.base, "Automatically assigned wrong base"
21
- assert_equal 25, tax.rate, "Automatically assigned wrong rate"
22
- assert_equal "My test tax", tax.name, "Automatically assigned worng name"
23
- end # test_initialization
24
-
25
- def test_rounding
26
- # Whole numbers
27
- tax = Fiscalizer::Tax.new base: 100, rate: 1
28
- assert_equal 100, tax.base, "Whole number base is wrong" # 100 -> 100
29
- assert_equal 1, tax.rate, "Whole number rate is wrong" # 1 -> 1 -> 0.01
30
- assert_equal 1, tax.total, "Whole number total is wrong" # 100 * 0.01 = 1
31
- assert_equal 101, tax.summed, "Whole number summed is wrong" # 100 + 1 = 101
32
-
33
- # Decimal numbers
34
- tax = Fiscalizer::Tax.new base: 1.5, rate: 10.5
35
- assert_equal 1.50, tax.base, "Decimal number base is wrong" # 1.5 -> 1.5
36
- assert_equal 10.5, tax.rate, "Decimal number rate is wrong" # 10.5 -> 10.5 -> 0.105
37
- assert_equal 0.16, tax.total, "Decimal number total is wrong" # 1.5 * 0.105 = 0.1575
38
- assert_equal 1.66, tax.summed, "Decimal number summed is wrong" # 1.5 + 0.16 = 1.66
39
-
40
- # Whole decimal numbers
41
- tax = Fiscalizer::Tax.new base: 100.0, rate: 1.0
42
- assert_equal 100.0, tax.base, "Whole decimal number base is wrong" # 100 -> 100
43
- assert_equal 1.000, tax.rate, "Whole decimal number rate is wrong" # 1 -> 1 -> 0.01
44
- assert_equal 1.000, tax.total, "Whole decimal number total is wrong" # 100 * 0.01 = 1
45
- assert_equal 101.0, tax.summed, "Whole decimal number summed is wrong" # 100 + 1 = 101
46
-
47
- # Round down
48
- tax = Fiscalizer::Tax.new base: 13.111992, rate: 10.10499999999
49
- assert_equal 13.11, tax.base, "Round down number base is wrong" # 13.111992 -> 13.11
50
- assert_equal 10.10, tax.rate, "Round down number rate is wrong" # 10.10499999999 -> 10.10 -> 0.1010
51
- assert_equal 1.320, tax.total, "Round down number total is wrong" # 13.11 * 0.1010 = 1.32411
52
- assert_equal 14.43, tax.summed, "Round down number summed is wrong" # 13.11 + 1.32 = 14.43
53
-
54
- # Round up
55
- tax = Fiscalizer::Tax.new base: 13.2450000001, rate: 25.9989541
56
- assert_equal 13.25, tax.base, "Round up number base is wrong" # 13.2450000001 -> 13.25
57
- assert_equal 26.00, tax.rate, "Round up number rate is wrong" # 25.9989541 -> 26 -> 0.26
58
- assert_equal 3.450, tax.total, "Round up number total is wrong" # 13.25 * 0.26 = 3.445
59
- assert_equal 16.70, tax.summed, "Round up number summed is wrong" # 13.25 + 3.45 = 16.7
60
- end # test_rounding
61
-
62
- def test_string_conversion
63
- # Whole numbers
64
- tax = Fiscalizer::Tax.new base: 100, rate: 1
65
- assert_equal "100.00", tax.base_str, "Whole number base is wrong"
66
- assert_equal "1.00", tax.rate_str, "Whole number rate is wrong"
67
- assert_equal "1.00", tax.total_str, "Whole number total is wrong"
68
- assert_equal "101.00", tax.summed_str, "Whole number summed is wrong"
69
-
70
- # Decimal numbers
71
- tax = Fiscalizer::Tax.new base: 1.5, rate: 10.5
72
- assert_equal "1.50", tax.base_str, "Decimal number base is wrong"
73
- assert_equal "10.50", tax.rate_str, "Decimal number rate is wrong"
74
- assert_equal "0.16", tax.total_str, "Decimal number total is wrong"
75
- assert_equal "1.66", tax.summed_str, "Decimal number summed is wrong"
76
-
77
- # Whole decimal numbers
78
- tax = Fiscalizer::Tax.new base: 100.000, rate: 1.000
79
- assert_equal "100.00", tax.base_str, "Whole decimal number base is wrong"
80
- assert_equal "1.00", tax.rate_str, "Whole decimal number rate is wrong"
81
- assert_equal "1.00", tax.total_str, "Whole decimal number total is wrong"
82
- assert_equal "101.00", tax.summed_str, "Whole decimal number summed is wrong"
83
- end # test_string_conversion
84
-
85
- def test_math
86
-
87
- end # test_math
88
-
89
- end