lib/mindee/parsing/standard/tax_field.rb
# frozen_string_literal: true require_relative 'base_field' module Mindee module Parsing module Standard # Represents tax information. class TaxField < Field # Tax value as 3 decimal float # @return [Float, nil] attr_reader :value # Tax rate percentage # @return [Float] attr_reader :rate # Tax code # @return [String] attr_reader :code # Tax base # @return [Float] attr_reader :base # @param prediction [Hash] # @param page_id [Integer, nil] def initialize(prediction, page_id) super @value = prediction['value']&.round(3) @rate = prediction['rate'].to_f unless prediction['rate'].nil? @base = prediction['base'].to_f unless prediction['base'].nil? @code = prediction['code'] unless prediction['code'] == 'None' end # @param value [Float] def print_float(value) format('%.2f', value) end # @return [String] def to_s printable = printable_values out_str = String.new out_str << ("Base: #{printable[:base]}") out_str << (", Code: #{printable[:code]}") out_str << (", Rate (%): #{printable[:rate]}") out_str << (", Amount: #{printable[:value]}") out_str.strip end # @return [Hash] def printable_values out_h = {} out_h[:code] = @code.nil? ? '' : @code out_h[:base] = @base.nil? ? '' : print_float(@base) out_h[:rate] = @rate.nil? ? '' : print_float(@rate).to_s out_h[:value] = @value.nil? ? '' : print_float(@value).to_s out_h end # @return [String] def to_table_line printable = printable_values out_str = String.new out_str << ("| #{printable[:base].ljust(13, ' ')}") out_str << (" | #{printable[:code].ljust(6, ' ')}") out_str << (" | #{printable[:rate].ljust(8, ' ')}") out_str << (" | #{printable[:value].ljust(13, ' ')} |") out_str.strip end end # Represents tax information, grouped as an array. class Taxes < Array # @param prediction [Hash] # @param page_id [Integer, nil] def initialize(prediction, page_id) super(prediction.map { |entry| TaxField.new(entry, page_id) }) end # @param char [String] # @return [String] def line_separator(char) out_str = String.new out_str << ' ' out_str << "+#{char * 15}" out_str << "+#{char * 8}" out_str << "+#{char * 10}" out_str << "+#{char * 15}" out_str << '+' out_str end # @return [String] def to_s return '' if nil? || empty? out_str = String.new out_str << ("\n#{line_separator('-')}") out_str << "\n | Base | Code | Rate (%) | Amount |" out_str << "\n#{line_separator('=')}" each do |entry| out_str << "\n #{entry.to_table_line}\n#{line_separator('-')}" end out_str end end end end end