asseinfo/br_danfe

View on GitHub
lib/br_danfe/danfe_lib/nfe.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
module BrDanfe
  module DanfeLib
    class Nfe < Base
      private

      def document
        NfeLib::Document.new
      end

      def create_watermark
        @document.create_stamp('has_no_fiscal_value') do
          @document.fill_color '7d7d7d'
          @document.text_box(
            I18n.t('danfe.others.has_no_fiscal_value'),
            size: 2.2.cm,
            width: @document.bounds.width,
            height: @document.bounds.height,
            align: :center,
            valign: :center,
            at: [0, @document.bounds.height],
            rotate: 45,
            rotate_around: :center
          )
        end
      end

      def generate(footer_info)
        last_index = @xmls.size - 1

        @xmls.each_with_index do |xml, index|
          break unless BrDanfe::Helper.nfe?(xml)

          initial_number_of_pages = @document.page_count
          render_on_first_page(xml)
          render_on_each_page(footer_info, xml, initial_number_of_pages)
          @document.start_new_page unless index == last_index
        end

        @document
      end

      def render_on_first_page(xml)
        NfeLib::Ticket.new(@document, xml).render
        NfeLib::Dest.new(@document, xml).render
        NfeLib::Dup.new(@document, xml).render
        NfeLib::Icmstot.new(@document, xml).render
        NfeLib::Transp.new(@document, xml).render
        n_vol = NfeLib::Vol.new(@document, xml).render
        has_issqn = NfeLib::Issqn.new(@document, xml).render
        NfeLib::Infadic.new(@document, xml).render(n_vol)

        render_products(has_issqn, xml)
      end

      def render_products(has_issqn, xml)
        NfeLib::DetBody.new(@document, xml).render(has_issqn)
      end

      def render_on_each_page(footer_info, xml, initial_number_of_pages)
        total_pages = @document.page_count + 1 - initial_number_of_pages

        emitter = NfeLib::EmitHeader.new(@document, xml, @options.logo, @options.logo_dimensions)

        total_pages.times do |page_index|
          page = page_index + initial_number_of_pages

          position = page_index + 1 == 1 ? 3.96 : 1.85
          repeated_information(page, position, emitter, footer_info, xml, total_pages, page_index + 1)
        end
      end

      def repeated_information(page, y_position, emitter, footer_info, xml, total_pages, initial_page_of_pdf)
        @document.go_to_page(page)

        emitter.render(initial_page_of_pdf, y_position, total_pages)
        render_product_table_title initial_page_of_pdf
        render_footer_information footer_info
        render_no_fiscal_value(xml)
      end

      def render_product_table_title(page)
        y_position = page == 1 ? 18.91 : 7.40
        @document.ititle 0.42, 10.00, 0.75, y_position, 'det.title'
      end

      def render_footer_information(footer_info)
        if footer_info.present?
          @document.ibox 0.35, 12.45, 0.75, 30.21, '', footer_info, size: 5, border: 0
        end
      end

      def render_no_fiscal_value(xml)
        @document.stamp('has_no_fiscal_value') if BrDanfe::Helper.no_fiscal_value?(xml)
      end
    end
  end
end