mindee 3.11.0 → 3.12.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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/bin/mindee.rb +7 -1
  4. data/docs/code_samples/financial_document_v1_async.txt +19 -0
  5. data/docs/code_samples/us_healthcare_cards_v1_async.txt +19 -0
  6. data/docs/expense_receipts_v5.md +12 -10
  7. data/docs/financial_document_v1.md +51 -22
  8. data/docs/invoices_v4.md +4 -3
  9. data/docs/us_healthcare_cards_v1.md +204 -0
  10. data/lib/mindee/image_extraction/common/extracted_image.rb +73 -0
  11. data/lib/mindee/image_extraction/common/image_extractor.rb +191 -0
  12. data/lib/mindee/image_extraction/common.rb +3 -0
  13. data/lib/mindee/image_extraction/multi_receipts_extractor/multi_receipts_extractor.rb +26 -0
  14. data/lib/mindee/image_extraction/multi_receipts_extractor.rb +3 -0
  15. data/lib/mindee/image_extraction.rb +4 -0
  16. data/lib/mindee/input/sources.rb +8 -0
  17. data/lib/mindee/parsing/standard/company_registration_field.rb +17 -0
  18. data/lib/mindee/product/financial_document/financial_document_v1_document.rb +3 -1
  19. data/lib/mindee/product/financial_document/financial_document_v1_line_item.rb +7 -0
  20. data/lib/mindee/product/financial_document/financial_document_v1_page.rb +1 -1
  21. data/lib/mindee/product/international_id/international_id_v2_document.rb +1 -1
  22. data/lib/mindee/product/international_id/international_id_v2_page.rb +1 -1
  23. data/lib/mindee/product/invoice/invoice_v4_document.rb +3 -1
  24. data/lib/mindee/product/invoice/invoice_v4_line_item.rb +7 -0
  25. data/lib/mindee/product/invoice/invoice_v4_page.rb +1 -1
  26. data/lib/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.rb +1 -1
  27. data/lib/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_page.rb +1 -1
  28. data/lib/mindee/product/receipt/receipt_v5_document.rb +1 -1
  29. data/lib/mindee/product/receipt/receipt_v5_page.rb +1 -1
  30. data/lib/mindee/product/us/healthcare_card/healthcare_card_v1.rb +41 -0
  31. data/lib/mindee/product/us/healthcare_card/healthcare_card_v1_copay.rb +57 -0
  32. data/lib/mindee/product/us/healthcare_card/healthcare_card_v1_document.rb +127 -0
  33. data/lib/mindee/product/us/healthcare_card/healthcare_card_v1_page.rb +34 -0
  34. data/lib/mindee/product.rb +1 -0
  35. data/lib/mindee/version.rb +1 -1
  36. data/mindee.gemspec +1 -0
  37. metadata +29 -2
@@ -0,0 +1,191 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mini_magick'
4
+ require 'origami'
5
+ require 'stringio'
6
+ require 'tempfile'
7
+ require_relative '../../input/sources'
8
+ require_relative 'extracted_image'
9
+
10
+ module Mindee
11
+ # Image Extraction Module.
12
+ module ImageExtraction
13
+ def attach_image_as_new_file(input_buffer)
14
+ # Attaches an image as a new page in a PdfDocument object.
15
+ #
16
+ # @param [StringIO] input_buffer Input buffer. Only supports JPEG.
17
+ # @return [Origami::PDF] A PdfDocument handle.
18
+
19
+ magick_image = MiniMagick::Image.read(input_buffer)
20
+ # NOTE: some jpeg images get rendered as three different versions of themselves per output if the format isn't
21
+ # converted.
22
+ magick_image.format('jpg')
23
+ original_density = magick_image.resolution
24
+ scale_factor = original_density[0].to_f / 4.166666 # No clue why bit the resolution needs to be reduced for
25
+ # the pdf otherwise the resulting image shrinks.
26
+ magick_image.format('pdf', 0, { density: scale_factor.to_s })
27
+ io_buffer = StringIO.new
28
+ magick_image.write(io_buffer)
29
+ Origami::PDF.read(io_buffer)
30
+ end
31
+
32
+ # Extracts multiple images from a given local input source.
33
+ #
34
+ # @param [Mindee::Input::Source::LocalInputSource] input_source
35
+ # @param [Integer] page_id ID of the Page to extract from.
36
+ # @param [Array<Array<Mindee::Geometry::Point>>, Array<Mindee::Geometry::Quadrangle>] polygons List of coordinates
37
+ # to extract.
38
+ # @return [Array<Mindee::ImageExtraction::ExtractedImage>] Extracted Images.
39
+ def extract_multiple_images_from_source(input_source, page_id, polygons)
40
+ new_stream = load_doc(input_source, page_id)
41
+ new_stream.seek(0)
42
+
43
+ extract_images_from_polygons(input_source, new_stream, page_id, polygons)
44
+ end
45
+
46
+ # Retrieves a PDF document's page.
47
+ #
48
+ # @param [Origami::PDF] pdf_doc Origami PDF handle.
49
+ # @param [Integer] page_id Page ID.
50
+ def get_page(pdf_doc, page_id)
51
+ stream = StringIO.new
52
+ pdf_doc.save(stream)
53
+
54
+ options = {
55
+ page_indexes: [page_id - 1],
56
+ }
57
+
58
+ Mindee::PDF::PdfProcessor.parse(stream, options)
59
+ end
60
+
61
+ # Extracts images from their positions on a file (as polygons).
62
+ #
63
+ # @param [Mindee::Input::Source::LocalInputSource] input_source Local input source.
64
+ # @param [StringIO] pdf_stream Buffer of the PDF.
65
+ # @param [Integer] page_id Page ID.
66
+ # @param [Array<Mindee::Geometry::Point, Mindee::Geometry::Polygon, Mindee::Geometry::Quadrangle>] polygons
67
+ # @return [Array<Mindee::ImageExtraction::ExtractedImage>] Extracted Images.
68
+ def extract_images_from_polygons(input_source, pdf_stream, page_id, polygons)
69
+ extracted_elements = []
70
+
71
+ polygons.each_with_index do |polygon, element_id|
72
+ polygon = normalize_polygon(polygon)
73
+ page_content = read_page_content(pdf_stream)
74
+
75
+ min_max_x = Geometry.get_min_max_x([
76
+ polygon.top_left,
77
+ polygon.bottom_right,
78
+ polygon.top_right,
79
+ polygon.bottom_left,
80
+ ])
81
+ min_max_y = Geometry.get_min_max_y([
82
+ polygon.top_left,
83
+ polygon.bottom_right,
84
+ polygon.top_right,
85
+ polygon.bottom_left,
86
+ ])
87
+ file_extension = determine_file_extension(input_source)
88
+ cropped_image = crop_image(page_content, min_max_x, min_max_y)
89
+ if file_extension == 'pdf'
90
+ cropped_image.format('jpg')
91
+ else
92
+ cropped_image.format(file_extension)
93
+ end
94
+
95
+ buffer = StringIO.new
96
+ write_image_to_buffer(cropped_image, buffer)
97
+ file_name = "#{input_source.filename}_page#{page_id}-#{element_id}.#{file_extension}"
98
+
99
+ extracted_elements << create_extracted_image(buffer, file_name, page_id, element_id)
100
+ end
101
+
102
+ extracted_elements
103
+ end
104
+
105
+ # Retrieves the bounding box of a polygon.
106
+ #
107
+ # @param [Array<Point>, Mindee::Geometry::Polygon] polygon
108
+ def normalize_polygon(polygon)
109
+ if polygon.is_a?(Mindee::Geometry::Polygon)
110
+ Mindee::Geometry.get_bounding_box(polygon)
111
+ else
112
+ polygon
113
+ end
114
+ end
115
+
116
+ # Loads a buffer into a MiniMagick Image.
117
+ #
118
+ # @param [StringIO] pdf_stream Buffer containg the PDF
119
+ # @return [MiniMagick::Image] a valid MiniMagick image handle.
120
+ def read_page_content(pdf_stream)
121
+ pdf_stream.rewind
122
+ MiniMagick::Image.read(pdf_stream)
123
+ end
124
+
125
+ # Crops a MiniMagick Image from a the given bounding box.
126
+ #
127
+ # @param [MiniMagick::Image] image Input Image.
128
+ # @param [Mindee::Geometry::MinMax] min_max_x minimum & maximum values for the x coordinates.
129
+ # @param [Mindee::Geometry::MinMax] min_max_y minimum & maximum values for the y coordinates.
130
+ def crop_image(image, min_max_x, min_max_y)
131
+ width = image[:width].to_i
132
+ height = image[:height].to_i
133
+
134
+ image.format('jpg')
135
+ new_width = (min_max_x.max - min_max_x.min) * width
136
+ new_height = (min_max_y.max - min_max_y.min) * height
137
+ image.crop("#{new_width}x#{new_height}+#{min_max_x.min * width}+#{min_max_y.min * height}")
138
+
139
+ image
140
+ end
141
+
142
+ # Writes a MiniMagick::Image to a buffer.
143
+ #
144
+ # @param [MiniMagick::Image] image a valid MiniMagick image.
145
+ # @param [StringIO] buffer
146
+ def write_image_to_buffer(image, buffer)
147
+ image.write(buffer)
148
+ end
149
+
150
+ # Retrieves the file extension from the main file to apply it to the extracted images. Note: coerces pdf as jpg.
151
+ #
152
+ # @param [Mindee::Input::Source::LocalInputSource] input_source Local input source.
153
+ # @return [String] A valid file extension.
154
+ def determine_file_extension(input_source)
155
+ if input_source.pdf? || input_source.filename.downcase.end_with?('pdf')
156
+ 'jpg'
157
+ else
158
+ File.extname(input_source.filename).strip.downcase[1..]
159
+ end
160
+ end
161
+
162
+ # Generates an ExtractedImage.
163
+ #
164
+ # @param [StringIO] buffer Buffer containing the image.
165
+ # @param [String] file_name Name for the file.
166
+ # @param [Object] page_id ID of the page the file was generated from.
167
+ # @param [Object] element_id ID of the element of a given page.
168
+ def create_extracted_image(buffer, file_name, page_id, element_id)
169
+ buffer.rewind
170
+ ExtractedImage.new(
171
+ Mindee::Input::Source::BytesInputSource.new(buffer.read, file_name),
172
+ page_id,
173
+ element_id
174
+ )
175
+ end
176
+
177
+ # Loads a single_page from an image file or a pdf document.
178
+ #
179
+ # @param input_file [LocalInputSource] Local input.
180
+ # @param [Integer] page_id Page ID.
181
+ # @return [MiniMagick::Image] A valid PdfDocument handle.
182
+ def load_doc(input_file, page_id)
183
+ input_file.io_stream.rewind
184
+ if input_file.pdf?
185
+ get_page(Origami::PDF.read(input_file.io_stream), page_id)
186
+ else
187
+ input_file.io_stream
188
+ end
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'common/image_extractor'
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ # Image Extraction Module.
5
+ module ImageExtraction
6
+ def extract_receipts(input_source, inference)
7
+ # Extracts individual receipts from multi-receipts documents.
8
+ #
9
+ # @param input_source [LocalInputSource] Local Input Source to extract sub-receipts from.
10
+ # @param inference [Inference] Results of the inference.
11
+ # @return [Array<ExtractedImage>] Individual extracted receipts as an array of ExtractedMultiReceiptsImage.
12
+
13
+ images = []
14
+ raise 'No possible receipts candidates found for MultiReceipts extraction.' unless inference.prediction.receipts
15
+
16
+ (0...input_source.count_pdf_pages).each do |page_id|
17
+ receipt_positions = inference.pages[page_id].prediction.receipts.map(&:bounding_box)
18
+ images.concat(
19
+ extract_multiple_images_from_source(input_source, page_id + 1, receipt_positions)
20
+ )
21
+ end
22
+
23
+ images
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'multi_receipts_extractor/multi_receipts_extractor'
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'image_extraction/common'
4
+ require_relative 'image_extraction/multi_receipts_extractor'
@@ -118,6 +118,14 @@ module Mindee
118
118
  @io_stream.close if close
119
119
  ['document', data, { filename: Mindee::Input::Source.convert_to_unicode_escape(@filename) }]
120
120
  end
121
+
122
+ def count_pdf_pages
123
+ return 1 unless pdf?
124
+
125
+ @io_stream.seek(0)
126
+ pdf_processor = Mindee::PDF::PdfProcessor.open_pdf(@io_stream)
127
+ pdf_processor.pages.size
128
+ end
121
129
  end
122
130
 
123
131
  # Load a document from a path.
@@ -15,6 +15,23 @@ module Mindee
15
15
  super
16
16
  @type = prediction['type']
17
17
  end
18
+
19
+ def to_table_line
20
+ printable = printable_values
21
+ format('| %<type>-15s | %<value>-20s ', type: printable['type'], value: printable['value'])
22
+ end
23
+
24
+ def to_s
25
+ printable = printable_values
26
+ format('Type: %<type>s, Value: %<value>s', type: printable['type'], value: printable['value'])
27
+ end
28
+
29
+ def printable_values
30
+ printable = {}
31
+ printable['type'] = type
32
+ printable['value'] = value
33
+ printable
34
+ end
18
35
  end
19
36
  end
20
37
  end
@@ -6,7 +6,7 @@ require_relative 'financial_document_v1_line_item'
6
6
  module Mindee
7
7
  module Product
8
8
  module FinancialDocument
9
- # Financial Document API version 1.7 document data.
9
+ # Financial Document API version 1.9 document data.
10
10
  class FinancialDocumentV1Document < Mindee::Parsing::Common::Prediction
11
11
  include Mindee::Parsing::Standard
12
12
  # The customer's address used for billing.
@@ -206,6 +206,7 @@ module Mindee
206
206
  out_str << "+#{char * 12}"
207
207
  out_str << "+#{char * 14}"
208
208
  out_str << "+#{char * 14}"
209
+ out_str << "+#{char * 17}"
209
210
  out_str << "+#{char * 12}"
210
211
  out_str << '+'
211
212
  out_str
@@ -225,6 +226,7 @@ module Mindee
225
226
  out_str << ' Tax Amount |'
226
227
  out_str << ' Tax Rate (%) |'
227
228
  out_str << ' Total Amount |'
229
+ out_str << ' Unit of measure |'
228
230
  out_str << ' Unit Price |'
229
231
  out_str << "\n#{line_items_separator('=')}"
230
232
  out_str << "\n #{line_items}"
@@ -26,6 +26,9 @@ module Mindee
26
26
  # The item total amount.
27
27
  # @return [Float]
28
28
  attr_reader :total_amount
29
+ # The item unit of measure.
30
+ # @return [String]
31
+ attr_reader :unit_measure
29
32
  # The item unit price.
30
33
  # @return [Float]
31
34
  attr_reader :unit_price
@@ -40,6 +43,7 @@ module Mindee
40
43
  @tax_amount = prediction['tax_amount']
41
44
  @tax_rate = prediction['tax_rate']
42
45
  @total_amount = prediction['total_amount']
46
+ @unit_measure = prediction['unit_measure']
43
47
  @unit_price = prediction['unit_price']
44
48
  @page_id = page_id
45
49
  end
@@ -53,6 +57,7 @@ module Mindee
53
57
  printable[:tax_amount] = @tax_amount.nil? ? '' : Field.float_to_string(@tax_amount)
54
58
  printable[:tax_rate] = @tax_rate.nil? ? '' : Field.float_to_string(@tax_rate)
55
59
  printable[:total_amount] = @total_amount.nil? ? '' : Field.float_to_string(@total_amount)
60
+ printable[:unit_measure] = format_for_display(@unit_measure, nil)
56
61
  printable[:unit_price] = @unit_price.nil? ? '' : Field.float_to_string(@unit_price)
57
62
  printable
58
63
  end
@@ -67,6 +72,7 @@ module Mindee
67
72
  out_str << format('| %- 11s', printable[:tax_amount])
68
73
  out_str << format('| %- 13s', printable[:tax_rate])
69
74
  out_str << format('| %- 13s', printable[:total_amount])
75
+ out_str << format('| %- 16s', printable[:unit_measure])
70
76
  out_str << format('| %- 11s', printable[:unit_price])
71
77
  out_str << '|'
72
78
  end
@@ -81,6 +87,7 @@ module Mindee
81
87
  out_str << "\n :Tax Amount: #{printable[:tax_amount]}"
82
88
  out_str << "\n :Tax Rate (%): #{printable[:tax_rate]}"
83
89
  out_str << "\n :Total Amount: #{printable[:total_amount]}"
90
+ out_str << "\n :Unit of measure: #{printable[:unit_measure]}"
84
91
  out_str << "\n :Unit Price: #{printable[:unit_price]}"
85
92
  out_str
86
93
  end
@@ -6,7 +6,7 @@ require_relative 'financial_document_v1_document'
6
6
  module Mindee
7
7
  module Product
8
8
  module FinancialDocument
9
- # Financial Document API version 1.7 page data.
9
+ # Financial Document API version 1.9 page data.
10
10
  class FinancialDocumentV1Page < Mindee::Parsing::Common::Page
11
11
  # @param prediction [Hash]
12
12
  def initialize(prediction)
@@ -5,7 +5,7 @@ require_relative '../../parsing'
5
5
  module Mindee
6
6
  module Product
7
7
  module InternationalId
8
- # International ID API version 2.0 document data.
8
+ # International ID API version 2.1 document data.
9
9
  class InternationalIdV2Document < Mindee::Parsing::Common::Prediction
10
10
  include Mindee::Parsing::Standard
11
11
  # The physical address of the document holder.
@@ -6,7 +6,7 @@ require_relative 'international_id_v2_document'
6
6
  module Mindee
7
7
  module Product
8
8
  module InternationalId
9
- # International ID API version 2.0 page data.
9
+ # International ID API version 2.1 page data.
10
10
  class InternationalIdV2Page < Mindee::Parsing::Common::Page
11
11
  # @param prediction [Hash]
12
12
  def initialize(prediction)
@@ -6,7 +6,7 @@ require_relative 'invoice_v4_line_item'
6
6
  module Mindee
7
7
  module Product
8
8
  module Invoice
9
- # Invoice API version 4.6 document data.
9
+ # Invoice API version 4.7 document data.
10
10
  class InvoiceV4Document < Mindee::Parsing::Common::Prediction
11
11
  include Mindee::Parsing::Standard
12
12
  # The customer's address used for billing.
@@ -176,6 +176,7 @@ module Mindee
176
176
  out_str << "+#{char * 12}"
177
177
  out_str << "+#{char * 14}"
178
178
  out_str << "+#{char * 14}"
179
+ out_str << "+#{char * 17}"
179
180
  out_str << "+#{char * 12}"
180
181
  out_str << '+'
181
182
  out_str
@@ -195,6 +196,7 @@ module Mindee
195
196
  out_str << ' Tax Amount |'
196
197
  out_str << ' Tax Rate (%) |'
197
198
  out_str << ' Total Amount |'
199
+ out_str << ' Unit of measure |'
198
200
  out_str << ' Unit Price |'
199
201
  out_str << "\n#{line_items_separator('=')}"
200
202
  out_str << "\n #{line_items}"
@@ -26,6 +26,9 @@ module Mindee
26
26
  # The item total amount.
27
27
  # @return [Float]
28
28
  attr_reader :total_amount
29
+ # The item unit of measure.
30
+ # @return [String]
31
+ attr_reader :unit_measure
29
32
  # The item unit price.
30
33
  # @return [Float]
31
34
  attr_reader :unit_price
@@ -40,6 +43,7 @@ module Mindee
40
43
  @tax_amount = prediction['tax_amount']
41
44
  @tax_rate = prediction['tax_rate']
42
45
  @total_amount = prediction['total_amount']
46
+ @unit_measure = prediction['unit_measure']
43
47
  @unit_price = prediction['unit_price']
44
48
  @page_id = page_id
45
49
  end
@@ -53,6 +57,7 @@ module Mindee
53
57
  printable[:tax_amount] = @tax_amount.nil? ? '' : Field.float_to_string(@tax_amount)
54
58
  printable[:tax_rate] = @tax_rate.nil? ? '' : Field.float_to_string(@tax_rate)
55
59
  printable[:total_amount] = @total_amount.nil? ? '' : Field.float_to_string(@total_amount)
60
+ printable[:unit_measure] = format_for_display(@unit_measure, nil)
56
61
  printable[:unit_price] = @unit_price.nil? ? '' : Field.float_to_string(@unit_price)
57
62
  printable
58
63
  end
@@ -67,6 +72,7 @@ module Mindee
67
72
  out_str << format('| %- 11s', printable[:tax_amount])
68
73
  out_str << format('| %- 13s', printable[:tax_rate])
69
74
  out_str << format('| %- 13s', printable[:total_amount])
75
+ out_str << format('| %- 16s', printable[:unit_measure])
70
76
  out_str << format('| %- 11s', printable[:unit_price])
71
77
  out_str << '|'
72
78
  end
@@ -81,6 +87,7 @@ module Mindee
81
87
  out_str << "\n :Tax Amount: #{printable[:tax_amount]}"
82
88
  out_str << "\n :Tax Rate (%): #{printable[:tax_rate]}"
83
89
  out_str << "\n :Total Amount: #{printable[:total_amount]}"
90
+ out_str << "\n :Unit of measure: #{printable[:unit_measure]}"
84
91
  out_str << "\n :Unit Price: #{printable[:unit_price]}"
85
92
  out_str
86
93
  end
@@ -6,7 +6,7 @@ require_relative 'invoice_v4_document'
6
6
  module Mindee
7
7
  module Product
8
8
  module Invoice
9
- # Invoice API version 4.6 page data.
9
+ # Invoice API version 4.7 page data.
10
10
  class InvoiceV4Page < Mindee::Parsing::Common::Page
11
11
  # @param prediction [Hash]
12
12
  def initialize(prediction)
@@ -5,7 +5,7 @@ require_relative '../../parsing'
5
5
  module Mindee
6
6
  module Product
7
7
  module MultiReceiptsDetector
8
- # Multi Receipts Detector API version 1.0 document data.
8
+ # Multi Receipts Detector API version 1.1 document data.
9
9
  class MultiReceiptsDetectorV1Document < Mindee::Parsing::Common::Prediction
10
10
  include Mindee::Parsing::Standard
11
11
  # Positions of the receipts on the document.
@@ -6,7 +6,7 @@ require_relative 'multi_receipts_detector_v1_document'
6
6
  module Mindee
7
7
  module Product
8
8
  module MultiReceiptsDetector
9
- # Multi Receipts Detector API version 1.0 page data.
9
+ # Multi Receipts Detector API version 1.1 page data.
10
10
  class MultiReceiptsDetectorV1Page < Mindee::Parsing::Common::Page
11
11
  # @param prediction [Hash]
12
12
  def initialize(prediction)
@@ -6,7 +6,7 @@ require_relative 'receipt_v5_line_item'
6
6
  module Mindee
7
7
  module Product
8
8
  module Receipt
9
- # Receipt API version 5.2 document data.
9
+ # Receipt API version 5.3 document data.
10
10
  class ReceiptV5Document < Mindee::Parsing::Common::Prediction
11
11
  include Mindee::Parsing::Standard
12
12
  # The purchase category among predefined classes.
@@ -6,7 +6,7 @@ require_relative 'receipt_v5_document'
6
6
  module Mindee
7
7
  module Product
8
8
  module Receipt
9
- # Receipt API version 5.2 page data.
9
+ # Receipt API version 5.3 page data.
10
10
  class ReceiptV5Page < Mindee::Parsing::Common::Page
11
11
  # @param prediction [Hash]
12
12
  def initialize(prediction)
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../parsing'
4
+ require_relative 'healthcare_card_v1_document'
5
+ require_relative 'healthcare_card_v1_page'
6
+
7
+ module Mindee
8
+ module Product
9
+ module US
10
+ # Healthcare Card module.
11
+ module HealthcareCard
12
+ # Healthcare Card API version 1 inference prediction.
13
+ class HealthcareCardV1 < Mindee::Parsing::Common::Inference
14
+ @endpoint_name = 'us_healthcare_cards'
15
+ @endpoint_version = '1'
16
+
17
+ # @param prediction [Hash]
18
+ def initialize(prediction)
19
+ super
20
+ @prediction = HealthcareCardV1Document.new(prediction['prediction'], nil)
21
+ @pages = []
22
+ prediction['pages'].each do |page|
23
+ if page.key?('prediction') && !page['prediction'].nil? && !page['prediction'].empty?
24
+ @pages.push(HealthcareCardV1Page.new(page))
25
+ end
26
+ end
27
+ end
28
+
29
+ class << self
30
+ # Name of the endpoint for this product.
31
+ # @return [String]
32
+ attr_reader :endpoint_name
33
+ # Version for this product.
34
+ # @return [String]
35
+ attr_reader :endpoint_version
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../parsing'
4
+
5
+ module Mindee
6
+ module Product
7
+ module US
8
+ module HealthcareCard
9
+ # Is a fixed amount for a covered service.
10
+ class HealthcareCardV1Copay < Mindee::Parsing::Standard::FeatureField
11
+ include Mindee::Parsing::Standard
12
+ # The price of service.
13
+ # @return [Float]
14
+ attr_reader :service_fees
15
+ # The name of service of the copay.
16
+ # @return [String]
17
+ attr_reader :service_name
18
+
19
+ # @param prediction [Hash]
20
+ # @param page_id [Integer, nil]
21
+ def initialize(prediction, page_id)
22
+ super(prediction, page_id)
23
+ @service_fees = prediction['service_fees']
24
+ @service_name = prediction['service_name']
25
+ @page_id = page_id
26
+ end
27
+
28
+ # @return [Hash]
29
+ def printable_values
30
+ printable = {}
31
+ printable[:service_fees] = @service_fees.nil? ? '' : Field.float_to_string(@service_fees)
32
+ printable[:service_name] = format_for_display(@service_name, nil)
33
+ printable
34
+ end
35
+
36
+ # @return [String]
37
+ def to_table_line
38
+ printable = printable_values
39
+ out_str = String.new
40
+ out_str << format('| %- 13s', printable[:service_fees])
41
+ out_str << format('| %- 13s', printable[:service_name])
42
+ out_str << '|'
43
+ end
44
+
45
+ # @return [String]
46
+ def to_s
47
+ printable = printable_values
48
+ out_str = String.new
49
+ out_str << "\n :Service Fees: #{printable[:service_fees]}"
50
+ out_str << "\n :Service Name: #{printable[:service_name]}"
51
+ out_str
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end