mindee 3.2.0 → 3.3.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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +1 -0
  4. data/CHANGELOG.md +10 -0
  5. data/bin/mindee.rb +1 -1
  6. data/docs/barcode_reader_v1.md +2 -2
  7. data/docs/carte_grise_v1.md +454 -0
  8. data/docs/code_samples/carte_grise_v1.txt +19 -0
  9. data/docs/cropper_v1.md +1 -1
  10. data/docs/custom_v1.md +9 -1
  11. data/docs/expense_receipts_v5.md +1 -1
  12. data/docs/financial_document_v1.md +6 -6
  13. data/docs/invoices_v4.md +68 -99
  14. data/docs/multi_receipts_detector_v1.md +1 -1
  15. data/docs/us_w9_v1.md +3 -3
  16. data/lib/mindee/http/endpoint.rb +5 -1
  17. data/lib/mindee/http/error.rb +1 -1
  18. data/lib/mindee/parsing/common/api_response.rb +3 -2
  19. data/lib/mindee/parsing/common/document.rb +4 -1
  20. data/lib/mindee/parsing/custom/list_field.rb +7 -5
  21. data/lib/mindee/parsing/standard/base_field.rb +1 -1
  22. data/lib/mindee/product/financial_document/financial_document_v1_document.rb +2 -2
  23. data/lib/mindee/product/fr/carte_grise/carte_grise_v1.rb +39 -0
  24. data/lib/mindee/product/fr/carte_grise/carte_grise_v1_document.rb +235 -0
  25. data/lib/mindee/product/fr/carte_grise/carte_grise_v1_page.rb +34 -0
  26. data/lib/mindee/product/invoice/invoice_v4.rb +1 -2
  27. data/lib/mindee/product/invoice/invoice_v4_document.rb +105 -145
  28. data/lib/mindee/product/invoice/invoice_v4_line_item.rb +54 -30
  29. data/lib/mindee/product/us/w9/w9_v1.rb +2 -2
  30. data/lib/mindee/product/us/w9/w9_v1_document.rb +1 -1
  31. data/lib/mindee/product/us/w9/w9_v1_page.rb +2 -2
  32. data/lib/mindee/product.rb +1 -0
  33. data/lib/mindee/version.rb +1 -1
  34. data/lib/mindee.rb +0 -3
  35. metadata +7 -2
@@ -0,0 +1,235 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../parsing'
4
+
5
+ module Mindee
6
+ module Product
7
+ module FR
8
+ module CarteGrise
9
+ # Carte Grise V1 document prediction.
10
+ class CarteGriseV1Document < Mindee::Parsing::Common::Prediction
11
+ include Mindee::Parsing::Standard
12
+ # The vehicle's license plate number.
13
+ # @return [Mindee::Parsing::Standard::StringField]
14
+ attr_reader :a
15
+ # The vehicle's first release date.
16
+ # @return [Mindee::Parsing::Standard::DateField]
17
+ attr_reader :b
18
+ # The vehicle owner's full name including maiden name.
19
+ # @return [Mindee::Parsing::Standard::StringField]
20
+ attr_reader :c1
21
+ # The vehicle owner's address.
22
+ # @return [Mindee::Parsing::Standard::StringField]
23
+ attr_reader :c3
24
+ # Number of owners of the license certificate.
25
+ # @return [Mindee::Parsing::Standard::StringField]
26
+ attr_reader :c41
27
+ # Mentions about the ownership of the vehicle.
28
+ # @return [Mindee::Parsing::Standard::StringField]
29
+ attr_reader :c4a
30
+ # The vehicle's brand.
31
+ # @return [Mindee::Parsing::Standard::StringField]
32
+ attr_reader :d1
33
+ # The vehicle's commercial name.
34
+ # @return [Mindee::Parsing::Standard::StringField]
35
+ attr_reader :d3
36
+ # The Vehicle Identification Number (VIN).
37
+ # @return [Mindee::Parsing::Standard::StringField]
38
+ attr_reader :e
39
+ # The vehicle's maximum admissible weight.
40
+ # @return [Mindee::Parsing::Standard::StringField]
41
+ attr_reader :f1
42
+ # The vehicle's maximum admissible weight within the license's state.
43
+ # @return [Mindee::Parsing::Standard::StringField]
44
+ attr_reader :f2
45
+ # The vehicle's maximum authorized weight with coupling.
46
+ # @return [Mindee::Parsing::Standard::StringField]
47
+ attr_reader :f3
48
+ # The document's formula number.
49
+ # @return [Mindee::Parsing::Standard::StringField]
50
+ attr_reader :formula_number
51
+ # The vehicle's weight with coupling if tractor different than category M1.
52
+ # @return [Mindee::Parsing::Standard::StringField]
53
+ attr_reader :g
54
+ # The vehicle's national empty weight.
55
+ # @return [Mindee::Parsing::Standard::StringField]
56
+ attr_reader :g1
57
+ # The car registration date of the given certificate.
58
+ # @return [Mindee::Parsing::Standard::DateField]
59
+ attr_reader :i
60
+ # The vehicle's category.
61
+ # @return [Mindee::Parsing::Standard::StringField]
62
+ attr_reader :j
63
+ # The vehicle's national type.
64
+ # @return [Mindee::Parsing::Standard::StringField]
65
+ attr_reader :j1
66
+ # The vehicle's body type (CE).
67
+ # @return [Mindee::Parsing::Standard::StringField]
68
+ attr_reader :j2
69
+ # The vehicle's body type (National designation).
70
+ # @return [Mindee::Parsing::Standard::StringField]
71
+ attr_reader :j3
72
+ # Machine Readable Zone, first line.
73
+ # @return [Mindee::Parsing::Standard::StringField]
74
+ attr_reader :mrz1
75
+ # Machine Readable Zone, second line.
76
+ # @return [Mindee::Parsing::Standard::StringField]
77
+ attr_reader :mrz2
78
+ # The vehicle's owner first name.
79
+ # @return [Mindee::Parsing::Standard::StringField]
80
+ attr_reader :owner_first_name
81
+ # The vehicle's owner surname.
82
+ # @return [Mindee::Parsing::Standard::StringField]
83
+ attr_reader :owner_surname
84
+ # The vehicle engine's displacement (cm3).
85
+ # @return [Mindee::Parsing::Standard::StringField]
86
+ attr_reader :p1
87
+ # The vehicle's maximum net power (kW).
88
+ # @return [Mindee::Parsing::Standard::StringField]
89
+ attr_reader :p2
90
+ # The vehicle's fuel type or energy source.
91
+ # @return [Mindee::Parsing::Standard::StringField]
92
+ attr_reader :p3
93
+ # The vehicle's administrative power (fiscal horsepower).
94
+ # @return [Mindee::Parsing::Standard::StringField]
95
+ attr_reader :p6
96
+ # The vehicle's power to weight ratio.
97
+ # @return [Mindee::Parsing::Standard::StringField]
98
+ attr_reader :q
99
+ # The vehicle's number of seats.
100
+ # @return [Mindee::Parsing::Standard::StringField]
101
+ attr_reader :s1
102
+ # The vehicle's number of standing rooms (person).
103
+ # @return [Mindee::Parsing::Standard::StringField]
104
+ attr_reader :s2
105
+ # The vehicle's sound level (dB).
106
+ # @return [Mindee::Parsing::Standard::StringField]
107
+ attr_reader :u1
108
+ # The vehicle engine's rotation speed (RPM).
109
+ # @return [Mindee::Parsing::Standard::StringField]
110
+ attr_reader :u2
111
+ # The vehicle's CO2 emission (g/km).
112
+ # @return [Mindee::Parsing::Standard::StringField]
113
+ attr_reader :v7
114
+ # Next technical control date.
115
+ # @return [Mindee::Parsing::Standard::StringField]
116
+ attr_reader :x1
117
+ # Amount of the regional proportional tax of the registration (in euros).
118
+ # @return [Mindee::Parsing::Standard::StringField]
119
+ attr_reader :y1
120
+ # Amount of the additional parafiscal tax of the registration (in euros).
121
+ # @return [Mindee::Parsing::Standard::StringField]
122
+ attr_reader :y2
123
+ # Amount of the additional CO2 tax of the registration (in euros).
124
+ # @return [Mindee::Parsing::Standard::StringField]
125
+ attr_reader :y3
126
+ # Amount of the fee for managing the registration (in euros).
127
+ # @return [Mindee::Parsing::Standard::StringField]
128
+ attr_reader :y4
129
+ # Amount of the fee for delivery of the registration certificate in euros.
130
+ # @return [Mindee::Parsing::Standard::StringField]
131
+ attr_reader :y5
132
+ # Total amount of registration fee to be paid in euros.
133
+ # @return [Mindee::Parsing::Standard::StringField]
134
+ attr_reader :y6
135
+
136
+ # rubocop:disable Metrics/AbcSize
137
+ # @param prediction [Hash]
138
+ # @param page_id [Integer, nil]
139
+ def initialize(prediction, page_id)
140
+ super()
141
+ @a = StringField.new(prediction['a'], page_id)
142
+ @b = DateField.new(prediction['b'], page_id)
143
+ @c1 = StringField.new(prediction['c1'], page_id)
144
+ @c3 = StringField.new(prediction['c3'], page_id)
145
+ @c41 = StringField.new(prediction['c41'], page_id)
146
+ @c4a = StringField.new(prediction['c4a'], page_id)
147
+ @d1 = StringField.new(prediction['d1'], page_id)
148
+ @d3 = StringField.new(prediction['d3'], page_id)
149
+ @e = StringField.new(prediction['e'], page_id)
150
+ @f1 = StringField.new(prediction['f1'], page_id)
151
+ @f2 = StringField.new(prediction['f2'], page_id)
152
+ @f3 = StringField.new(prediction['f3'], page_id)
153
+ @formula_number = StringField.new(prediction['formula_number'], page_id)
154
+ @g = StringField.new(prediction['g'], page_id)
155
+ @g1 = StringField.new(prediction['g1'], page_id)
156
+ @i = DateField.new(prediction['i'], page_id)
157
+ @j = StringField.new(prediction['j'], page_id)
158
+ @j1 = StringField.new(prediction['j1'], page_id)
159
+ @j2 = StringField.new(prediction['j2'], page_id)
160
+ @j3 = StringField.new(prediction['j3'], page_id)
161
+ @mrz1 = StringField.new(prediction['mrz1'], page_id)
162
+ @mrz2 = StringField.new(prediction['mrz2'], page_id)
163
+ @owner_first_name = StringField.new(prediction['owner_first_name'], page_id)
164
+ @owner_surname = StringField.new(prediction['owner_surname'], page_id)
165
+ @p1 = StringField.new(prediction['p1'], page_id)
166
+ @p2 = StringField.new(prediction['p2'], page_id)
167
+ @p3 = StringField.new(prediction['p3'], page_id)
168
+ @p6 = StringField.new(prediction['p6'], page_id)
169
+ @q = StringField.new(prediction['q'], page_id)
170
+ @s1 = StringField.new(prediction['s1'], page_id)
171
+ @s2 = StringField.new(prediction['s2'], page_id)
172
+ @u1 = StringField.new(prediction['u1'], page_id)
173
+ @u2 = StringField.new(prediction['u2'], page_id)
174
+ @v7 = StringField.new(prediction['v7'], page_id)
175
+ @x1 = StringField.new(prediction['x1'], page_id)
176
+ @y1 = StringField.new(prediction['y1'], page_id)
177
+ @y2 = StringField.new(prediction['y2'], page_id)
178
+ @y3 = StringField.new(prediction['y3'], page_id)
179
+ @y4 = StringField.new(prediction['y4'], page_id)
180
+ @y5 = StringField.new(prediction['y5'], page_id)
181
+ @y6 = StringField.new(prediction['y6'], page_id)
182
+ end
183
+
184
+ # @return [String]
185
+ def to_s
186
+ out_str = String.new
187
+ out_str << "\n:a: #{@a}".rstrip
188
+ out_str << "\n:b: #{@b}".rstrip
189
+ out_str << "\n:c1: #{@c1}".rstrip
190
+ out_str << "\n:c3: #{@c3}".rstrip
191
+ out_str << "\n:c41: #{@c41}".rstrip
192
+ out_str << "\n:c4a: #{@c4a}".rstrip
193
+ out_str << "\n:d1: #{@d1}".rstrip
194
+ out_str << "\n:d3: #{@d3}".rstrip
195
+ out_str << "\n:e: #{@e}".rstrip
196
+ out_str << "\n:f1: #{@f1}".rstrip
197
+ out_str << "\n:f2: #{@f2}".rstrip
198
+ out_str << "\n:f3: #{@f3}".rstrip
199
+ out_str << "\n:g: #{@g}".rstrip
200
+ out_str << "\n:g1: #{@g1}".rstrip
201
+ out_str << "\n:i: #{@i}".rstrip
202
+ out_str << "\n:j: #{@j}".rstrip
203
+ out_str << "\n:j1: #{@j1}".rstrip
204
+ out_str << "\n:j2: #{@j2}".rstrip
205
+ out_str << "\n:j3: #{@j3}".rstrip
206
+ out_str << "\n:p1: #{@p1}".rstrip
207
+ out_str << "\n:p2: #{@p2}".rstrip
208
+ out_str << "\n:p3: #{@p3}".rstrip
209
+ out_str << "\n:p6: #{@p6}".rstrip
210
+ out_str << "\n:q: #{@q}".rstrip
211
+ out_str << "\n:s1: #{@s1}".rstrip
212
+ out_str << "\n:s2: #{@s2}".rstrip
213
+ out_str << "\n:u1: #{@u1}".rstrip
214
+ out_str << "\n:u2: #{@u2}".rstrip
215
+ out_str << "\n:v7: #{@v7}".rstrip
216
+ out_str << "\n:x1: #{@x1}".rstrip
217
+ out_str << "\n:y1: #{@y1}".rstrip
218
+ out_str << "\n:y2: #{@y2}".rstrip
219
+ out_str << "\n:y3: #{@y3}".rstrip
220
+ out_str << "\n:y4: #{@y4}".rstrip
221
+ out_str << "\n:y5: #{@y5}".rstrip
222
+ out_str << "\n:y6: #{@y6}".rstrip
223
+ out_str << "\n:Formula Number: #{@formula_number}".rstrip
224
+ out_str << "\n:Owner's First Name: #{@owner_first_name}".rstrip
225
+ out_str << "\n:Owner's Surname: #{@owner_surname}".rstrip
226
+ out_str << "\n:MRZ Line 1: #{@mrz1}".rstrip
227
+ out_str << "\n:MRZ Line 2: #{@mrz2}".rstrip
228
+ out_str[1..].to_s
229
+ end
230
+ # rubocop:enable Metrics/AbcSize
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../parsing'
4
+ require_relative 'carte_grise_v1_document'
5
+
6
+ module Mindee
7
+ module Product
8
+ module FR
9
+ module CarteGrise
10
+ # Carte Grise V1 page.
11
+ class CarteGriseV1Page < Mindee::Parsing::Common::Page
12
+ # @param prediction [Hash]
13
+ def initialize(prediction)
14
+ super(prediction)
15
+ @prediction = CarteGriseV1PagePrediction.new(
16
+ prediction['prediction'],
17
+ prediction['id']
18
+ )
19
+ end
20
+ end
21
+
22
+ # Carte Grise V1 page prediction.
23
+ class CarteGriseV1PagePrediction < CarteGriseV1Document
24
+ # @return [String]
25
+ def to_s
26
+ out_str = String.new
27
+ out_str << "\n#{super}"
28
+ out_str
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -8,9 +8,8 @@ module Mindee
8
8
  module Product
9
9
  # Invoice module.
10
10
  module Invoice
11
- # Invoice document.
11
+ # Invoice V4 prediction inference.
12
12
  class InvoiceV4 < Mindee::Parsing::Common::Inference
13
- include Mindee::Parsing::Common
14
13
  @endpoint_name = 'invoices'
15
14
  @endpoint_version = '4'
16
15
 
@@ -9,202 +9,162 @@ module Mindee
9
9
  # Invoice V4 document prediction.
10
10
  class InvoiceV4Document < Mindee::Parsing::Common::Prediction
11
11
  include Mindee::Parsing::Standard
12
-
13
- # Locale information.
14
- # @return [Mindee::Parsing::Standard::LocaleField]
15
- attr_reader :locale
16
- # The nature of the invoice.
12
+ # The address of the customer.
13
+ # @return [Mindee::Parsing::Standard::StringField]
14
+ attr_reader :customer_address
15
+ # List of company registrations associated to the customer.
16
+ # @return [Array<Mindee::Parsing::Standard::CompanyRegistrationField>]
17
+ attr_reader :customer_company_registrations
18
+ # The name of the customer or client.
19
+ # @return [Mindee::Parsing::Standard::StringField]
20
+ attr_reader :customer_name
21
+ # The date the purchase was made.
22
+ # @return [Mindee::Parsing::Standard::DateField]
23
+ attr_reader :date
24
+ # One of: 'INVOICE', 'CREDIT NOTE'.
17
25
  # @return [Mindee::Parsing::Standard::ClassificationField]
18
26
  attr_reader :document_type
19
- # The total amount with tax included.
20
- # @return [Mindee::Parsing::Standard::AmountField]
21
- attr_reader :total_amount
22
- # The total amount without the tax value.
23
- # @return [Mindee::Parsing::Standard::AmountField]
24
- attr_reader :total_net
25
- # The total tax.
26
- # @return [Mindee::Parsing::Standard::AmountField]
27
- attr_reader :total_tax
28
- # The creation date of the invoice.
27
+ # The date on which the payment is due.
29
28
  # @return [Mindee::Parsing::Standard::DateField]
30
- attr_reader :date
31
- # The invoice number.
29
+ attr_reader :due_date
30
+ # The invoice number or identifier.
32
31
  # @return [Mindee::Parsing::Standard::StringField]
33
32
  attr_reader :invoice_number
34
- # List of Reference numbers including PO number.
35
- # @return [Mindee::Parsing::Standard::StringField]
33
+ # List of line item details.
34
+ # @return [Array<Mindee::Product::Invoice::InvoiceV4LineItem>]
35
+ attr_reader :line_items
36
+ # The locale detected on the document.
37
+ # @return [Mindee::Parsing::Standard::LocaleField]
38
+ attr_reader :locale
39
+ # List of Reference numbers, including PO number.
40
+ # @return [Array<Mindee::Parsing::Standard::StringField>]
36
41
  attr_reader :reference_numbers
37
- # The due date of the invoice.
38
- # @return [Mindee::Parsing::Standard::DateField]
39
- attr_reader :due_date
40
- # The list of taxes.
41
- # @return [Mindee::Parsing::Standard::Taxes]
42
- attr_reader :taxes
43
- # The name of the customer.
42
+ # The address of the supplier or merchant.
44
43
  # @return [Mindee::Parsing::Standard::StringField]
45
- attr_reader :customer_name
46
- # The address of the customer.
47
- # @return [Mindee::Parsing::Standard::StringField]
48
- attr_reader :customer_address
49
- # The company registration information for the customer.
44
+ attr_reader :supplier_address
45
+ # List of company registrations associated to the supplier.
50
46
  # @return [Array<Mindee::Parsing::Standard::CompanyRegistrationField>]
51
- attr_reader :customer_company_registrations
52
- # The supplier's name.
47
+ attr_reader :supplier_company_registrations
48
+ # The name of the supplier or merchant.
53
49
  # @return [Mindee::Parsing::Standard::StringField]
54
50
  attr_reader :supplier_name
55
- # The supplier's address.
56
- # @return [Mindee::Parsing::Standard::StringField]
57
- attr_reader :supplier_address
58
- # The payment information.
51
+ # List of payment details associated to the supplier.
59
52
  # @return [Array<Mindee::Parsing::Standard::PaymentDetailsField>]
60
53
  attr_reader :supplier_payment_details
61
- # The supplier's company registration information.
62
- # @return [Array<Mindee::Parsing::Standard::CompanyRegistrationField>]
63
- attr_reader :supplier_company_registrations
64
- # Line items details.
65
- # @return [Array<Mindee::InvoiceV4LineItem>]
66
- attr_reader :line_items
54
+ # List of tax line details.
55
+ # @return [Mindee::Parsing::Standard::Taxes]
56
+ attr_reader :taxes
57
+ # The total amount paid: includes taxes, tips, fees, and other charges.
58
+ # @return [Mindee::Parsing::Standard::AmountField]
59
+ attr_reader :total_amount
60
+ # The net amount paid: does not include taxes, fees, and discounts.
61
+ # @return [Mindee::Parsing::Standard::AmountField]
62
+ attr_reader :total_net
67
63
 
68
64
  # @param prediction [Hash]
69
65
  # @param page_id [Integer, nil]
70
66
  def initialize(prediction, page_id)
71
67
  super()
72
- @locale = LocaleField.new(prediction['locale'])
73
- @document_type = ClassificationField.new(prediction['document_type'], page_id)
74
- @total_amount = AmountField.new(prediction['total_amount'], page_id)
75
- @total_net = AmountField.new(prediction['total_net'], page_id)
76
68
  @customer_address = StringField.new(prediction['customer_address'], page_id)
69
+ @customer_company_registrations = []
70
+ prediction['customer_company_registrations'].each do |item|
71
+ @customer_company_registrations.push(CompanyRegistrationField.new(item, page_id))
72
+ end
77
73
  @customer_name = StringField.new(prediction['customer_name'], page_id)
78
74
  @date = DateField.new(prediction['date'], page_id)
75
+ @document_type = ClassificationField.new(prediction['document_type'], page_id)
79
76
  @due_date = DateField.new(prediction['due_date'], page_id)
80
77
  @invoice_number = StringField.new(prediction['invoice_number'], page_id)
81
- @supplier_name = StringField.new(prediction['supplier_name'], page_id)
82
- @supplier_address = StringField.new(prediction['supplier_address'], page_id)
78
+ @line_items = []
79
+ prediction['line_items'].each do |item|
80
+ @line_items.push(InvoiceV4LineItem.new(item, page_id))
81
+ end
82
+ @locale = LocaleField.new(prediction['locale'], page_id)
83
83
  @reference_numbers = []
84
84
  prediction['reference_numbers'].each do |item|
85
85
  @reference_numbers.push(StringField.new(item, page_id))
86
86
  end
87
- @customer_company_registrations = []
88
- prediction['customer_company_registrations'].each do |item|
89
- @customer_company_registrations.push(CompanyRegistrationField.new(item, page_id))
90
- end
91
- @taxes = Taxes.new(prediction['taxes'], page_id)
92
- @supplier_payment_details = []
93
- prediction['supplier_payment_details'].each do |item|
94
- @supplier_payment_details.push(PaymentDetailsField.new(item, page_id))
95
- end
87
+ @supplier_address = StringField.new(prediction['supplier_address'], page_id)
96
88
  @supplier_company_registrations = []
97
89
  prediction['supplier_company_registrations'].each do |item|
98
90
  @supplier_company_registrations.push(CompanyRegistrationField.new(item, page_id))
99
91
  end
100
- @total_tax = AmountField.new(
101
- { value: nil, confidence: 0.0 }, page_id
102
- )
103
- @line_items = []
104
- prediction['line_items'].each do |item|
105
- @line_items.push(InvoiceV4LineItem.new(item, page_id))
92
+ @supplier_name = StringField.new(prediction['supplier_name'], page_id)
93
+ @supplier_payment_details = []
94
+ prediction['supplier_payment_details'].each do |item|
95
+ @supplier_payment_details.push(PaymentDetailsField.new(item, page_id))
106
96
  end
107
- reconstruct(page_id)
97
+ @taxes = Taxes.new(prediction['taxes'], page_id)
98
+ @total_amount = AmountField.new(prediction['total_amount'], page_id)
99
+ @total_net = AmountField.new(prediction['total_net'], page_id)
108
100
  end
109
101
 
110
102
  # @return [String]
111
103
  def to_s
112
- customer_company_registrations = @customer_company_registrations.map(&:value).join('; ')
113
- supplier_payment_details = @supplier_payment_details.map(&:to_s).join("\n ")
114
- supplier_company_registrations = @supplier_company_registrations.map(&:to_s).join('; ')
115
- reference_numbers = @reference_numbers.map(&:to_s).join(', ')
104
+ reference_numbers = @reference_numbers.join("\n #{' ' * 19}")
105
+ supplier_payment_details = @supplier_payment_details.join("\n #{' ' * 26}")
106
+ supplier_company_registrations = @supplier_company_registrations.join("\n #{' ' * 32}")
107
+ customer_company_registrations = @customer_company_registrations.join("\n #{' ' * 32}")
108
+ line_items = line_items_to_s
116
109
  out_str = String.new
117
110
  out_str << "\n:Locale: #{@locale}".rstrip
118
- out_str << "\n:Document type: #{@document_type}".rstrip
119
- out_str << "\n:Invoice number: #{@invoice_number}".rstrip
120
- out_str << "\n:Reference numbers: #{reference_numbers}".rstrip
121
- out_str << "\n:Invoice date: #{@date}".rstrip
122
- out_str << "\n:Invoice due date: #{@due_date}".rstrip
123
- out_str << "\n:Supplier name: #{@supplier_name}".rstrip
124
- out_str << "\n:Supplier address: #{@supplier_address}".rstrip
125
- out_str << "\n:Supplier company registrations: #{supplier_company_registrations}".rstrip
126
- out_str << "\n:Supplier payment details: #{supplier_payment_details}".rstrip
127
- out_str << "\n:Customer name: #{@customer_name}".rstrip
128
- out_str << "\n:Customer address: #{@customer_address}".rstrip
129
- out_str << "\n:Customer company registrations: #{customer_company_registrations}".rstrip
111
+ out_str << "\n:Invoice Number: #{@invoice_number}".rstrip
112
+ out_str << "\n:Reference Numbers: #{reference_numbers}".rstrip
113
+ out_str << "\n:Purchase Date: #{@date}".rstrip
114
+ out_str << "\n:Due Date: #{@due_date}".rstrip
115
+ out_str << "\n:Total Net: #{@total_net}".rstrip
116
+ out_str << "\n:Total Amount: #{@total_amount}".rstrip
130
117
  out_str << "\n:Taxes:#{@taxes}".rstrip
131
- out_str << "\n:Total net: #{@total_net}".rstrip
132
- out_str << "\n:Total tax: #{@total_tax}".rstrip
133
- out_str << "\n:Total amount: #{@total_amount}".rstrip
118
+ out_str << "\n:Supplier Payment Details: #{supplier_payment_details}".rstrip
119
+ out_str << "\n:Supplier Name: #{@supplier_name}".rstrip
120
+ out_str << "\n:Supplier Company Registrations: #{supplier_company_registrations}".rstrip
121
+ out_str << "\n:Supplier Address: #{@supplier_address}".rstrip
122
+ out_str << "\n:Customer Name: #{@customer_name}".rstrip
123
+ out_str << "\n:Customer Company Registrations: #{customer_company_registrations}".rstrip
124
+ out_str << "\n:Customer Address: #{@customer_address}".rstrip
125
+ out_str << "\n:Document Type: #{@document_type}".rstrip
134
126
  out_str << "\n:Line Items:"
135
- out_str << line_items_to_s
127
+ out_str << line_items
136
128
  out_str[1..].to_s
137
129
  end
138
130
 
139
131
  private
140
132
 
141
- def line_item_separator(char)
142
- " +#{char * 22}+#{char * 9}+#{char * 9}+#{char * 10}+#{char * 18}+#{char * 38}+"
133
+ # @param char [String]
134
+ # @return [String]
135
+ def line_items_separator(char)
136
+ out_str = String.new
137
+ out_str << ' '
138
+ out_str << "+#{char * 38}"
139
+ out_str << "+#{char * 14}"
140
+ out_str << "+#{char * 10}"
141
+ out_str << "+#{char * 12}"
142
+ out_str << "+#{char * 14}"
143
+ out_str << "+#{char * 14}"
144
+ out_str << "+#{char * 12}"
145
+ out_str << '+'
146
+ out_str
143
147
  end
144
148
 
149
+ # @return [String]
145
150
  def line_items_to_s
146
151
  return '' if @line_items.empty?
147
152
 
148
- line_items = @line_items.map(&:to_s).join("\n#{line_item_separator('-')}\n ")
153
+ line_items = @line_items.map(&:to_table_line).join("\n#{line_items_separator('-')}\n ")
149
154
  out_str = String.new
150
- out_str << "\n#{line_item_separator('-')}"
151
- out_str << "\n | Code#{' ' * 17}| QTY | Price | Amount | Tax (Rate) | Description #{' ' * 25}|"
152
- out_str << "\n#{line_item_separator('=')}"
155
+ out_str << "\n#{line_items_separator('-')}"
156
+ out_str << "\n |"
157
+ out_str << ' Description |'
158
+ out_str << ' Product code |'
159
+ out_str << ' Quantity |'
160
+ out_str << ' Tax Amount |'
161
+ out_str << ' Tax Rate (%) |'
162
+ out_str << ' Total Amount |'
163
+ out_str << ' Unit Price |'
164
+ out_str << "\n#{line_items_separator('=')}"
153
165
  out_str << "\n #{line_items}"
154
- out_str << "\n#{line_item_separator('-')}"
155
- end
156
-
157
- def reconstruct(page_id)
158
- construct_total_tax_from_taxes(page_id)
159
- return unless page_id.nil?
160
-
161
- construct_total_excl_from_tcc_and_taxes(page_id)
162
- construct_total_incl_from_taxes_plus_excl(page_id)
163
- construct_total_tax_from_totals(page_id)
164
- end
165
-
166
- def construct_total_excl_from_tcc_and_taxes(page_id)
167
- return if @total_amount.value.nil? || taxes.empty? || !@total_net.value.nil?
168
-
169
- total_excl = {
170
- 'value' => @total_amount.value - @taxes.map(&:value).sum,
171
- 'confidence' => StringField.array_confidence(@taxes) * @total_amount.confidence,
172
- }
173
- @total_net = AmountField.new(total_excl, page_id, reconstructed: true)
174
- end
175
-
176
- def construct_total_incl_from_taxes_plus_excl(page_id)
177
- return if @total_net.value.nil? || @taxes.empty? || !@total_amount.value.nil?
178
-
179
- total_incl = {
180
- 'value' => @taxes.map(&:value).sum + @total_net.value,
181
- 'confidence' => StringField.array_confidence(@taxes) * @total_net.confidence,
182
- }
183
- @total_amount = AmountField.new(total_incl, page_id, reconstructed: true)
184
- end
185
-
186
- def construct_total_tax_from_taxes(page_id)
187
- return if @taxes.empty?
188
-
189
- total_tax = {
190
- 'value' => @taxes.map(&:value).sum,
191
- 'confidence' => StringField.array_confidence(@taxes),
192
- }
193
- return unless total_tax['value'].positive?
194
-
195
- @total_tax = AmountField.new(total_tax, page_id, reconstructed: true)
196
- end
197
-
198
- def construct_total_tax_from_totals(page_id)
199
- return if !@total_tax.value.nil? || @total_amount.value.nil? || @total_net.value.nil?
200
-
201
- total_tax = {
202
- 'value' => @total_amount.value - @total_net.value,
203
- 'confidence' => StringField.array_confidence(@taxes),
204
- }
205
- return unless total_tax['value'] >= 0
206
-
207
- @total_tax = AmountField.new(total_tax, page_id, reconstructed: true)
166
+ out_str << "\n#{line_items_separator('-')}"
167
+ out_str
208
168
  end
209
169
  end
210
170
  end