lib/mindee/product/fr/energy_bill/energy_bill_v1_document.rb



# frozen_string_literal: true

require_relative '../../../parsing'
require_relative 'energy_bill_v1_energy_supplier'
require_relative 'energy_bill_v1_energy_consumer'
require_relative 'energy_bill_v1_subscriptions'
require_relative 'energy_bill_v1_energy_usages'
require_relative 'energy_bill_v1_taxes_and_contributions'
require_relative 'energy_bill_v1_meter_detail'

module Mindee
  module Product
    module FR
      module EnergyBill
        # Energy Bill API version 1.0 document data.
        class EnergyBillV1Document < Mindee::Parsing::Common::Prediction
          include Mindee::Parsing::Standard
          # The unique identifier associated with a specific contract.
          # @return [Mindee::Parsing::Standard::StringField]
          attr_reader :contract_id
          # The unique identifier assigned to each electricity or gas consumption point. It specifies the exact
          # location where the energy is delivered.
          # @return [Mindee::Parsing::Standard::StringField]
          attr_reader :delivery_point
          # The date by which the payment for the energy invoice is due.
          # @return [Mindee::Parsing::Standard::DateField]
          attr_reader :due_date
          # The entity that consumes the energy.
          # @return [Mindee::Product::FR::EnergyBill::EnergyBillV1EnergyConsumer]
          attr_reader :energy_consumer
          # The company that supplies the energy.
          # @return [Mindee::Product::FR::EnergyBill::EnergyBillV1EnergySupplier]
          attr_reader :energy_supplier
          # Details of energy consumption.
          # @return [Mindee::Product::FR::EnergyBill::EnergyBillV1EnergyUsages]
          attr_reader :energy_usage
          # The date when the energy invoice was issued.
          # @return [Mindee::Parsing::Standard::DateField]
          attr_reader :invoice_date
          # The unique identifier of the energy invoice.
          # @return [Mindee::Parsing::Standard::StringField]
          attr_reader :invoice_number
          # Information about the energy meter.
          # @return [Mindee::Product::FR::EnergyBill::EnergyBillV1MeterDetail]
          attr_reader :meter_details
          # The subscription details fee for the energy service.
          # @return [Mindee::Product::FR::EnergyBill::EnergyBillV1Subscriptions]
          attr_reader :subscription
          # Details of Taxes and Contributions.
          # @return [Mindee::Product::FR::EnergyBill::EnergyBillV1TaxesAndContributions]
          attr_reader :taxes_and_contributions
          # The total amount to be paid for the energy invoice.
          # @return [Mindee::Parsing::Standard::AmountField]
          attr_reader :total_amount
          # The total amount to be paid for the energy invoice before taxes.
          # @return [Mindee::Parsing::Standard::AmountField]
          attr_reader :total_before_taxes
          # Total of taxes applied to the invoice.
          # @return [Mindee::Parsing::Standard::AmountField]
          attr_reader :total_taxes

          # @param prediction [Hash]
          # @param page_id [Integer, nil]
          def initialize(prediction, page_id)
            super
            @contract_id = Parsing::Standard::StringField.new(
              prediction['contract_id'],
              page_id
            )
            @delivery_point = Parsing::Standard::StringField.new(
              prediction['delivery_point'],
              page_id
            )
            @due_date = Parsing::Standard::DateField.new(
              prediction['due_date'],
              page_id
            )
            @energy_consumer = Product::FR::EnergyBill::EnergyBillV1EnergyConsumer.new(
              prediction['energy_consumer'],
              page_id
            )
            @energy_supplier = Product::FR::EnergyBill::EnergyBillV1EnergySupplier.new(
              prediction['energy_supplier'],
              page_id
            )
            @energy_usage = Product::FR::EnergyBill::EnergyBillV1EnergyUsages.new(prediction['energy_usage'], page_id)
            @invoice_date = Parsing::Standard::DateField.new(
              prediction['invoice_date'],
              page_id
            )
            @invoice_number = Parsing::Standard::StringField.new(
              prediction['invoice_number'],
              page_id
            )
            @meter_details = Product::FR::EnergyBill::EnergyBillV1MeterDetail.new(
              prediction['meter_details'],
              page_id
            )
            @subscription = Product::FR::EnergyBill::EnergyBillV1Subscriptions.new(prediction['subscription'], page_id)
            @taxes_and_contributions = Product::FR::EnergyBill::EnergyBillV1TaxesAndContributions.new(
              prediction['taxes_and_contributions'], page_id
            )
            @total_amount = Parsing::Standard::AmountField.new(
              prediction['total_amount'],
              page_id
            )
            @total_before_taxes = Parsing::Standard::AmountField.new(
              prediction['total_before_taxes'],
              page_id
            )
            @total_taxes = Parsing::Standard::AmountField.new(
              prediction['total_taxes'],
              page_id
            )
          end

          # @return [String]
          def to_s
            energy_supplier = @energy_supplier.to_s
            energy_consumer = @energy_consumer.to_s
            subscription = subscription_to_s
            energy_usage = energy_usage_to_s
            taxes_and_contributions = taxes_and_contributions_to_s
            meter_details = @meter_details.to_s
            out_str = String.new
            out_str << "\n:Invoice Number: #{@invoice_number}".rstrip
            out_str << "\n:Contract ID: #{@contract_id}".rstrip
            out_str << "\n:Delivery Point: #{@delivery_point}".rstrip
            out_str << "\n:Invoice Date: #{@invoice_date}".rstrip
            out_str << "\n:Due Date: #{@due_date}".rstrip
            out_str << "\n:Total Before Taxes: #{@total_before_taxes}".rstrip
            out_str << "\n:Total Taxes: #{@total_taxes}".rstrip
            out_str << "\n:Total Amount: #{@total_amount}".rstrip
            out_str << "\n:Energy Supplier:"
            out_str << energy_supplier
            out_str << "\n:Energy Consumer:"
            out_str << energy_consumer
            out_str << "\n:Subscription:"
            out_str << subscription
            out_str << "\n:Energy Usage:"
            out_str << energy_usage
            out_str << "\n:Taxes and Contributions:"
            out_str << taxes_and_contributions
            out_str << "\n:Meter Details:"
            out_str << meter_details
            out_str[1..].to_s
          end

          private

          # @param char [String]
          # @return [String]
          def subscription_separator(char)
            out_str = String.new
            out_str << '  '
            out_str << "+#{char * 38}"
            out_str << "+#{char * 12}"
            out_str << "+#{char * 12}"
            out_str << "+#{char * 10}"
            out_str << "+#{char * 11}"
            out_str << "+#{char * 12}"
            out_str << '+'
            out_str
          end

          # @return [String]
          def subscription_to_s
            return '' if @subscription.empty?

            line_items = @subscription.map(&:to_table_line).join("\n#{subscription_separator('-')}\n  ")
            out_str = String.new
            out_str << "\n#{subscription_separator('-')}"
            out_str << "\n  |"
            out_str << ' Description                          |'
            out_str << ' End Date   |'
            out_str << ' Start Date |'
            out_str << ' Tax Rate |'
            out_str << ' Total     |'
            out_str << ' Unit Price |'
            out_str << "\n#{subscription_separator('=')}"
            out_str << "\n  #{line_items}"
            out_str << "\n#{subscription_separator('-')}"
            out_str
          end

          # @param char [String]
          # @return [String]
          def energy_usage_separator(char)
            out_str = String.new
            out_str << '  '
            out_str << "+#{char * 38}"
            out_str << "+#{char * 12}"
            out_str << "+#{char * 12}"
            out_str << "+#{char * 10}"
            out_str << "+#{char * 11}"
            out_str << "+#{char * 12}"
            out_str << '+'
            out_str
          end

          # @return [String]
          def energy_usage_to_s
            return '' if @energy_usage.empty?

            line_items = @energy_usage.map(&:to_table_line).join("\n#{energy_usage_separator('-')}\n  ")
            out_str = String.new
            out_str << "\n#{energy_usage_separator('-')}"
            out_str << "\n  |"
            out_str << ' Description                          |'
            out_str << ' End Date   |'
            out_str << ' Start Date |'
            out_str << ' Tax Rate |'
            out_str << ' Total     |'
            out_str << ' Unit Price |'
            out_str << "\n#{energy_usage_separator('=')}"
            out_str << "\n  #{line_items}"
            out_str << "\n#{energy_usage_separator('-')}"
            out_str
          end

          # @param char [String]
          # @return [String]
          def taxes_and_contributions_separator(char)
            out_str = String.new
            out_str << '  '
            out_str << "+#{char * 38}"
            out_str << "+#{char * 12}"
            out_str << "+#{char * 12}"
            out_str << "+#{char * 10}"
            out_str << "+#{char * 11}"
            out_str << "+#{char * 12}"
            out_str << '+'
            out_str
          end

          # @return [String]
          def taxes_and_contributions_to_s
            return '' if @taxes_and_contributions.empty?

            line_items = @taxes_and_contributions.map(&:to_table_line).join(
              "\n#{taxes_and_contributions_separator('-')}\n  "
            )
            out_str = String.new
            out_str << "\n#{taxes_and_contributions_separator('-')}"
            out_str << "\n  |"
            out_str << ' Description                          |'
            out_str << ' End Date   |'
            out_str << ' Start Date |'
            out_str << ' Tax Rate |'
            out_str << ' Total     |'
            out_str << ' Unit Price |'
            out_str << "\n#{taxes_and_contributions_separator('=')}"
            out_str << "\n  #{line_items}"
            out_str << "\n#{taxes_and_contributions_separator('-')}"
            out_str
          end
        end
      end
    end
  end
end