fiscalizer 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/doc/README.md +3 -0
- data/example/README.md +25 -0
- data/example/{invoice_fiscalization_with_arguments.rb → invoice_fiscalization_passing_arguments.rb} +16 -16
- data/example/invoice_fiscalization_passing_object.rb +48 -0
- data/example/office_fiscalization_passing_arguments.rb +22 -0
- data/example/office_fiscalization_passing_object.rb +26 -0
- data/lib/fiscalizer/communication.rb +2 -2
- data/lib/fiscalizer/invoice.rb +4 -4
- data/lib/fiscalizer/version.rb +1 -1
- data/lib/fiscalizer.rb +1 -1
- data/test/README.md +13 -0
- data/test/test_fiscalizer.rb +71 -15
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a28f77e9a2a9ab8611c8b9115ec048cf8380bbe2
|
4
|
+
data.tar.gz: ed956c0403bf6066779ec8176f4e1da2944693fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27c61c79639ff2642f62f91f7781d9d1553f9a78dc1b34ab60ce559e677374d3975c64de3873df32de0bcd446dd3ea914472ae0450ad397aed074dd40c8cb031
|
7
|
+
data.tar.gz: 55369a83446b63c7788ab86b1afb54e85558a3f01a6bb8f016731ec922a7b9d60db5f1f8a3b2b3efa532cc9b38b999f226bd86b3c7bcfb7b8385c3952efcb11b
|
data/Gemfile
CHANGED
data/doc/README.md
ADDED
data/example/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Examples
|
2
|
+
|
3
|
+
### echo_12
|
4
|
+
|
5
|
+
Demonstrates how to create a Fiscalizer object with a P12 certificate. How to make an echo request and check for, and print, errors.
|
6
|
+
|
7
|
+
### echo_public_and_private_keys
|
8
|
+
|
9
|
+
Demonstrates how to create a Fiscalizer object from public and private keys and a certificate.
|
10
|
+
|
11
|
+
### invoice_fiscalization_passing_object
|
12
|
+
|
13
|
+
Demonstrates how to ceate an Invoice object and fiscalize it. It also demonstrates how to create tax and fee objects and add them to the invoice object.
|
14
|
+
|
15
|
+
### invoice_fiscalization_passing_arguments
|
16
|
+
|
17
|
+
Demonstrates how to create an invoice object and fiscalize ti by passing argumentst to the fiscalize_invoice method.
|
18
|
+
|
19
|
+
### fiscalize_office
|
20
|
+
|
21
|
+
Demonstrates how to create and fiscalize an office object.
|
22
|
+
|
23
|
+
### fiscalize_office
|
24
|
+
|
25
|
+
Demonstrates how to create and fiscalize an office space, by passing arguments.
|
data/example/{invoice_fiscalization_with_arguments.rb → invoice_fiscalization_passing_arguments.rb}
RENAMED
@@ -24,21 +24,21 @@ end
|
|
24
24
|
taxes_other << tax
|
25
25
|
end
|
26
26
|
# Generate invoice
|
27
|
-
invoice_response = fiscal.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
27
|
+
invoice_response = fiscal.fiscalize_invoice uuid: UUID,
|
28
|
+
time_sent: Time.now,
|
29
|
+
pin: "00123456789",
|
30
|
+
in_vat_system: true,
|
31
|
+
time_issued: Time.now - 3600,
|
32
|
+
consistance_mark: "P",
|
33
|
+
issued_number: "1",
|
34
|
+
issued_office: "Pm2",
|
35
|
+
issued_machine: "3",
|
36
|
+
tax_vat: taxes_vat,
|
37
|
+
tax_spending: taxes_spending,
|
38
|
+
tax_other: taxes_other,
|
39
|
+
payment_method: "g",
|
40
|
+
operator_pin: "12345678900",
|
41
|
+
subsequent_delivery: false,
|
42
|
+
value_non_taxable: 200.0
|
43
43
|
|
44
44
|
puts "The server returned the following JIR: " + invoice_response.unique_identifier if !invoice_response.errors?
|
@@ -0,0 +1,48 @@
|
|
1
|
+
fiscal = Fiscalizer.new certificate_p12_path: "/path/to/FISKAL 1.p12",
|
2
|
+
password: "12345678"
|
3
|
+
|
4
|
+
# Generate Invoice
|
5
|
+
invoice = Fiscalizer::Invoice.new
|
6
|
+
invoice.uuid = UUID
|
7
|
+
invoice.time_sent = Time.now
|
8
|
+
invoice.pin = "00123456789"
|
9
|
+
invoice.in_vat_system = true
|
10
|
+
invoice.time_issued = Time.now - 3600
|
11
|
+
invoice.consistance_mark = "P"
|
12
|
+
invoice.issued_number = "1"
|
13
|
+
invoice.issued_office = "Pm2"
|
14
|
+
invoice.issued_machine = "3"
|
15
|
+
invoice.payment_method = "g"
|
16
|
+
invoice.operator_pin = "12345678900"
|
17
|
+
invoice.subsequent_delivery = false
|
18
|
+
invoice.value_non_taxable = 200.0
|
19
|
+
|
20
|
+
# Generate taxes
|
21
|
+
(0..5).each do |i|
|
22
|
+
tax = Fiscalizer::Tax.new
|
23
|
+
tax.base = rand(10000 * 100).to_f / 100.0
|
24
|
+
tax.rate = rand(100 * 100).to_f / 100.0
|
25
|
+
invoice.add_tax_vat tax
|
26
|
+
end
|
27
|
+
(0..5).each do |i|
|
28
|
+
tax = Fiscalizer::Tax.new
|
29
|
+
tax.base = rand(10000 * 100).to_f / 100.0
|
30
|
+
tax.rate = rand(100 * 100).to_f / 100.0
|
31
|
+
invoice.add_tax_other base: base, rate: rate, name: "Other tax #{i}"
|
32
|
+
end
|
33
|
+
(0..5).each do |i|
|
34
|
+
fee = Fiscalizer::Fee.new
|
35
|
+
fee.value = rand(10000 * 100).to_f / 100.0
|
36
|
+
fee.name = "My Test Fee #{i}"
|
37
|
+
invoice.add_fee fee
|
38
|
+
end
|
39
|
+
(0..5).each do |i|
|
40
|
+
fee = Fiscalizer::Fee.new
|
41
|
+
fee.value = rand(10000 * 100).to_f / 100.0
|
42
|
+
fee.name = "My Test Fee #{i}"
|
43
|
+
invoice.add_fee value: value, name: name
|
44
|
+
end
|
45
|
+
# Generate invoice
|
46
|
+
invoice_response = fiscal.fiscalize_invoice invoice
|
47
|
+
|
48
|
+
puts "The server returned the following JIR: " + invoice_response.unique_identifier if !invoice_response.errors?
|
@@ -0,0 +1,22 @@
|
|
1
|
+
fiscal = Fiscalizer.new certificate_p12_path: "/path/to/FISKAL 1.p12",
|
2
|
+
password: "12345678"
|
3
|
+
|
4
|
+
# Generate office
|
5
|
+
office_response = fiscal.office uuid: "ca996cc7-fcc3-4c50-961b-40c8b875a5e8",
|
6
|
+
time_sent: Time.now,
|
7
|
+
pin: "00123456789",
|
8
|
+
office_label: "Poslovnica1",
|
9
|
+
adress_street_name: "Somewhere",
|
10
|
+
adress_house_num: "42",
|
11
|
+
adress_house_num_addendum: "AD",
|
12
|
+
adress_post_num: "10000",
|
13
|
+
adress_settlement: "Block 25-C",
|
14
|
+
adress_township: "Vogsphere",
|
15
|
+
adress_other: nil,
|
16
|
+
office_time: "Pon-Pet: 8:00-16:00",
|
17
|
+
take_effect_date: Time.now + 3600 * 24 * 7,
|
18
|
+
closure_mark: nil,
|
19
|
+
specific_purpose: nil
|
20
|
+
|
21
|
+
puts "The server returned the following UUID: " + office_response.uuid if !office_response.errors?
|
22
|
+
puts "Office space fiscalization was successful!" if !office_response.errors?
|
@@ -0,0 +1,26 @@
|
|
1
|
+
fiscal = Fiscalizer.new certificate_p12_path: "/path/to/FISKAL 1.p12",
|
2
|
+
password: "12345678"
|
3
|
+
|
4
|
+
# Generate office
|
5
|
+
office = Fiscalizer::Office.new
|
6
|
+
office.uuid = "ca996cc7-fcc3-4c50-961b-40c8b875a5e8"
|
7
|
+
office.time_sent = Time.now
|
8
|
+
office.pin = "00123456789"
|
9
|
+
office.office_label = "Poslovnica1"
|
10
|
+
office.adress_street_name = "Somewhere"
|
11
|
+
office.adress_house_num = "42"
|
12
|
+
office.adress_house_num_addendum = "AD"
|
13
|
+
office.adress_post_num = "10000"
|
14
|
+
office.adress_settlement = "Block 25-C"
|
15
|
+
office.adress_township = "Vogsphere"
|
16
|
+
office.adress_other = nil
|
17
|
+
office.office_time = "Pon-Pet: 8:00-16:00"
|
18
|
+
office.take_effect_date = Time.now + 3600 * 24 * 7
|
19
|
+
office.closure_mark = nil
|
20
|
+
office.specific_purpose = nil
|
21
|
+
|
22
|
+
# Generate office
|
23
|
+
office_response = fiscal.fiscalize_office office
|
24
|
+
|
25
|
+
puts "The server returned the following UUID: " + office_response.uuid if !office_response.errors?
|
26
|
+
puts "Office space fiscalization was successful!" if !office_response.errors?
|
@@ -135,7 +135,7 @@ class Fiscalizer
|
|
135
135
|
end
|
136
136
|
|
137
137
|
body = soap_envelope(office_request_xml)
|
138
|
-
unsigned_document =
|
138
|
+
unsigned_document = Xmldsig_fiscalizer::SignedDocument.new(body.doc.root.to_xml)
|
139
139
|
signed_xml = unsigned_document.sign(@key_private)
|
140
140
|
signed_xml.sub! '<?xml version="1.0"?>', ''
|
141
141
|
signed_xml = signed_xml.gsub /^$\n/, ''
|
@@ -255,7 +255,7 @@ class Fiscalizer
|
|
255
255
|
end
|
256
256
|
|
257
257
|
body = soap_envelope(invoice_request_xml)
|
258
|
-
unsigned_document =
|
258
|
+
unsigned_document = Xmldsig_fiscalizer::SignedDocument.new(body.doc.root.to_xml)
|
259
259
|
signed_xml = unsigned_document.sign(@key_private)
|
260
260
|
signed_xml.sub! '<?xml version="1.0"?>', ''
|
261
261
|
signed_xml = signed_xml.gsub /^$\n/, ''
|
data/lib/fiscalizer/invoice.rb
CHANGED
@@ -53,26 +53,26 @@ class Fiscalizer
|
|
53
53
|
end # initialize
|
54
54
|
|
55
55
|
# Add taxes
|
56
|
-
def add_tax_vat base: 0.0, rate: 0.0, name: ""
|
56
|
+
def add_tax_vat tax=nil, base: 0.0, rate: 0.0, name: ""
|
57
57
|
tax = Fiscalizer::Tax.new base: base, rate: rate, name: name if tax == nil
|
58
58
|
@tax_vat = Array.new if @tax_vat.class != Array
|
59
59
|
@tax_vat << tax
|
60
60
|
end # add_tax_vat
|
61
61
|
|
62
|
-
def add_tax_spending base: 0.0, rate: 0.0, name: ""
|
62
|
+
def add_tax_spending tax=nil, base: 0.0, rate: 0.0, name: ""
|
63
63
|
tax = Fiscalizer::Tax.new base: base, rate: rate, name: name if tax == nil
|
64
64
|
@tax_spending = Array.new if @tax_spending.class != Array
|
65
65
|
@tax_spending << tax
|
66
66
|
end # add_tax_spending
|
67
67
|
|
68
|
-
def add_tax_other base: 0.0, rate: 0.0, name: ""
|
68
|
+
def add_tax_other tax=nil, base: 0.0, rate: 0.0, name: ""
|
69
69
|
tax = Fiscalizer::Tax.new base: base, rate: rate, name: name if tax == nil
|
70
70
|
@tax_other = Array.new if @tax_other.class != Array
|
71
71
|
@tax_other << tax
|
72
72
|
end # add_tax_spending
|
73
73
|
|
74
74
|
# Add fees
|
75
|
-
def add_fee name: "", value: 0.0
|
75
|
+
def add_fee fee=nil, name: "", value: 0.0
|
76
76
|
fee = Fiscalizer::Fee.new name: base, value: rate if fee == nil
|
77
77
|
@fee << fee
|
78
78
|
end # add_fee
|
data/lib/fiscalizer/version.rb
CHANGED
data/lib/fiscalizer.rb
CHANGED
data/test/README.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Test
|
2
|
+
|
3
|
+
## Setup
|
4
|
+
|
5
|
+
It is important that in test enviroments both a P12 certificate (`certificate_p12_path`) and a signing certificate are passed to the Fiscalizer object (`certificate_path`). This is important because the test P12 certificates (suffixed with `.pfx`) don't contain signing certificates in them!
|
6
|
+
|
7
|
+
Don't forget to configutre all static variables in `test_fiscalizer.rb`
|
8
|
+
|
9
|
+
`EXPORTED_KEYS` specifies weather to initialize a Fiscalizer object with a P12 key or to use public and private kays instead.
|
10
|
+
|
11
|
+
__Note:__ If `EXPORTED_KEYS` is set to `true` than `KEY_PUBLIC_PATH` and `KEY_PRIVATE_PATH` have to be set.
|
12
|
+
|
13
|
+
__Note:__ On some machines the path to the certificates has to be an absolut path
|
data/test/test_fiscalizer.rb
CHANGED
@@ -5,10 +5,10 @@ require 'openssl'
|
|
5
5
|
|
6
6
|
class FiscalizerTest < Test::Unit::TestCase
|
7
7
|
# Configure
|
8
|
-
KEY_PUBLIC_PATH = "/
|
9
|
-
KEY_PRIVATE_PATH = "/
|
10
|
-
CERTIFICATE_PATH = "/
|
11
|
-
CERTIFICATE_P12_PATH = "/
|
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
12
|
URL_FISKAL = "https://cistest.apis-it.hr:8449/FiskalizacijaServiceTest"
|
13
13
|
CER_ISSUED = "OU=DEMO,O=FINA,C=HR"
|
14
14
|
PASSWORD = "12345678"
|
@@ -18,7 +18,7 @@ class FiscalizerTest < Test::Unit::TestCase
|
|
18
18
|
UUID = "ca996cc7-fcc3-4c50-961b-40c8b875a5e8"
|
19
19
|
ECHO = "This is a simple test..."
|
20
20
|
# Personal information
|
21
|
-
PIN = "
|
21
|
+
PIN = "00123456789"
|
22
22
|
PIN_OPERATOR = "00000000000"
|
23
23
|
|
24
24
|
def test_initialization
|
@@ -48,22 +48,29 @@ class FiscalizerTest < Test::Unit::TestCase
|
|
48
48
|
end # fiscal_ruby_test
|
49
49
|
|
50
50
|
def test_echo
|
51
|
-
fiscal =
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
56
65
|
echo = fiscal.echo text: ECHO
|
57
66
|
assert_equal ECHO, echo.response, "Echo response message does not match sent message"
|
58
67
|
assert echo.echo?, "Automatic echo check failed"
|
59
68
|
end # test_echo
|
60
69
|
|
61
70
|
def test_office
|
62
|
-
# Configuration
|
63
|
-
use_exported_keys = true
|
64
71
|
# -- Here Be Dragons --
|
65
72
|
fiscal = nil
|
66
|
-
if
|
73
|
+
if EXPORTED_KEYS
|
67
74
|
fiscal = Fiscalizer.new url: URL_FISKAL,
|
68
75
|
key_public_path: KEY_PUBLIC_PATH,
|
69
76
|
key_private_path: KEY_PRIVATE_PATH,
|
@@ -99,11 +106,60 @@ class FiscalizerTest < Test::Unit::TestCase
|
|
99
106
|
assert office.processed_at != nil, "'Processed at' was not returned"
|
100
107
|
end # test_office
|
101
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
|
+
|
102
159
|
def test_invoice
|
103
|
-
use_exported_keys = true
|
104
160
|
# -- Here Be Dragons --
|
105
161
|
fiscal = nil
|
106
|
-
if
|
162
|
+
if EXPORTED_KEYS
|
107
163
|
fiscal = Fiscalizer.new url: URL_FISKAL,
|
108
164
|
key_public_path: KEY_PUBLIC_PATH,
|
109
165
|
key_private_path: KEY_PRIVATE_PATH,
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fiscalizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stanko Krtalić Rusendić
|
@@ -79,12 +79,16 @@ files:
|
|
79
79
|
- README.md
|
80
80
|
- Rakefile
|
81
81
|
- doc/FiskalizacijaSchema.xsd
|
82
|
+
- doc/README.md
|
82
83
|
- doc/Tehnicka_specifikacija_za_korisnike_1.2.pdf
|
83
84
|
- doc/fiskalizacija_faq_v2.1_objava.pdf
|
85
|
+
- example/README.md
|
84
86
|
- example/echo_P12.rb
|
85
87
|
- example/echo_public_and_private_keys.rb
|
88
|
+
- example/invoice_fiscalization_passing_arguments.rb
|
86
89
|
- example/invoice_fiscalization_passing_object.rb
|
87
|
-
- example/
|
90
|
+
- example/office_fiscalization_passing_arguments.rb
|
91
|
+
- example/office_fiscalization_passing_object.rb
|
88
92
|
- fiscalizer.gemspec
|
89
93
|
- lib/README.md
|
90
94
|
- lib/fiscalizer.rb
|
@@ -98,6 +102,7 @@ files:
|
|
98
102
|
- lib/fiscalizer/response.rb
|
99
103
|
- lib/fiscalizer/tax.rb
|
100
104
|
- lib/fiscalizer/version.rb
|
105
|
+
- test/README.md
|
101
106
|
- test/test_echo.rb
|
102
107
|
- test/test_fee
|
103
108
|
- test/test_fiscalizer.rb
|
@@ -130,6 +135,7 @@ signing_key:
|
|
130
135
|
specification_version: 4
|
131
136
|
summary: A gem that automatically handles fiscalization
|
132
137
|
test_files:
|
138
|
+
- test/README.md
|
133
139
|
- test/test_echo.rb
|
134
140
|
- test/test_fee
|
135
141
|
- test/test_fiscalizer.rb
|