lib/mindee/product/fr/payslip/payslip_v2_document.rb



# frozen_string_literal: true

require_relative '../../../parsing'
require_relative 'payslip_v2_employee'
require_relative 'payslip_v2_employer'
require_relative 'payslip_v2_bank_account_detail'
require_relative 'payslip_v2_employment'
require_relative 'payslip_v2_salary_details'
require_relative 'payslip_v2_pay_detail'
require_relative 'payslip_v2_pto'
require_relative 'payslip_v2_pay_period'

module Mindee
  module Product
    module FR
      module Payslip
        # Payslip API version 2.0 document data.
        class PayslipV2Document < Mindee::Parsing::Common::Prediction
          include Mindee::Parsing::Standard
          # Information about the employee's bank account.
          # @return [Mindee::Product::FR::Payslip::PayslipV2BankAccountDetail]
          attr_reader :bank_account_details
          # Information about the employee.
          # @return [Mindee::Product::FR::Payslip::PayslipV2Employee]
          attr_reader :employee
          # Information about the employer.
          # @return [Mindee::Product::FR::Payslip::PayslipV2Employer]
          attr_reader :employer
          # Information about the employment.
          # @return [Mindee::Product::FR::Payslip::PayslipV2Employment]
          attr_reader :employment
          # Detailed information about the pay.
          # @return [Mindee::Product::FR::Payslip::PayslipV2PayDetail]
          attr_reader :pay_detail
          # Information about the pay period.
          # @return [Mindee::Product::FR::Payslip::PayslipV2PayPeriod]
          attr_reader :pay_period
          # Information about paid time off.
          # @return [Mindee::Product::FR::Payslip::PayslipV2Pto]
          attr_reader :pto
          # Detailed information about the earnings.
          # @return [Mindee::Product::FR::Payslip::PayslipV2SalaryDetails]
          attr_reader :salary_details

          # @param prediction [Hash]
          # @param page_id [Integer, nil]
          def initialize(prediction, page_id)
            super
            @bank_account_details = Product::FR::Payslip::PayslipV2BankAccountDetail.new(
              prediction['bank_account_details'],
              page_id
            )
            @employee = Product::FR::Payslip::PayslipV2Employee.new(
              prediction['employee'],
              page_id
            )
            @employer = Product::FR::Payslip::PayslipV2Employer.new(
              prediction['employer'],
              page_id
            )
            @employment = Product::FR::Payslip::PayslipV2Employment.new(
              prediction['employment'],
              page_id
            )
            @pay_detail = Product::FR::Payslip::PayslipV2PayDetail.new(
              prediction['pay_detail'],
              page_id
            )
            @pay_period = Product::FR::Payslip::PayslipV2PayPeriod.new(
              prediction['pay_period'],
              page_id
            )
            @pto = Product::FR::Payslip::PayslipV2Pto.new(prediction['pto'], page_id)
            @salary_details = Product::FR::Payslip::PayslipV2SalaryDetails.new(prediction['salary_details'], page_id)
          end

          # @return [String]
          def to_s
            employee = @employee.to_s
            employer = @employer.to_s
            bank_account_details = @bank_account_details.to_s
            employment = @employment.to_s
            salary_details = salary_details_to_s
            pay_detail = @pay_detail.to_s
            pto = @pto.to_s
            pay_period = @pay_period.to_s
            out_str = String.new
            out_str << "\n:Employee:"
            out_str << employee
            out_str << "\n:Employer:"
            out_str << employer
            out_str << "\n:Bank Account Details:"
            out_str << bank_account_details
            out_str << "\n:Employment:"
            out_str << employment
            out_str << "\n:Salary Details:"
            out_str << salary_details
            out_str << "\n:Pay Detail:"
            out_str << pay_detail
            out_str << "\n:PTO:"
            out_str << pto
            out_str << "\n:Pay Period:"
            out_str << pay_period
            out_str[1..].to_s
          end

          private

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

          # @return [String]
          def salary_details_to_s
            return '' if @salary_details.empty?

            line_items = @salary_details.map(&:to_table_line).join("\n#{salary_details_separator('-')}\n  ")
            out_str = String.new
            out_str << "\n#{salary_details_separator('-')}"
            out_str << "\n  |"
            out_str << ' Amount       |'
            out_str << ' Base      |'
            out_str << ' Description                          |'
            out_str << ' Rate      |'
            out_str << "\n#{salary_details_separator('=')}"
            out_str << "\n  #{line_items}"
            out_str << "\n#{salary_details_separator('-')}"
            out_str
          end
        end
      end
    end
  end
end