asseinfo/br_danfe

View on GitHub
lib/br_danfe/danfe_lib/nfe_lib/document.rb

Summary

Maintainability
C
1 day
Test Coverage
A
97%
module BrDanfe
  module DanfeLib
    module NfeLib
      class Document
        def initialize
          @document = BrDanfe::DocumentBuilder.build(
            page_size: 'A4',
            page_layout: :portrait,
            left_margin: 0,
            right_margin: 0,
            top_margin: 0,
            botton_margin: 0
          )

          @document.font 'tinos'

          @document.line_width = 0.3
        end

        def method_missing(method_name, *args, &block)
          if @document.respond_to? method_name
            @document.send method_name, *args, &block
          else
            super
          end
        end

        def respond_to_missing?(method_name, include_private = false)
          @document.respond_to?(method_name, include_private) || super
        end

        def ititle(h, w, x, y, i18n)
          title = ''
          title = I18n.t("danfe.#{i18n}") if i18n != ''

          text_box title, size: 8, at: [x.cm, Helper.invert(y.cm) - 4], width: w.cm, height: h.cm, style: :bold
        end

        def ibarcode(h, w, x, y, info)
          if info != ''
            Barby::Code128C.new(info).annotate_pdf(self, x: x.cm, y: Helper.invert(y.cm), width: w.cm, height: h.cm)
          end
        end

        def ibox(h, w, x, y, title = '', info = '', options = {})
          box [x.cm, Helper.invert(y.cm)], w.cm, h.cm, title, info, options
        end

        def lbox(h, w, x, y, xml, xpath, options = {})
          i18n = xpath.tr('/', '.')
          label = I18n.t("danfe.#{i18n}")
          data = xml[xpath]

          ibox(h, w, x, y, label, data, options)
        end

        def ldate(h, w, x, y, i18n = '', info = '', options = {})
          data = Helper.format_date(info)
          i18n_lbox(h, w, x, y, i18n, data, options)
        end

        def ltime(h, w, x, y, i18n = '', info = '', options = {})
          data = Helper.format_time(info)
          i18n_lbox(h, w, x, y, i18n, data, options)
        end

        def lcnpj(h, w, x, y, xml, xpath, options = {})
          i18n = xpath.tr('/', '.')

          cnpj = BrDocuments::CnpjCpf::Cnpj.new(xml[xpath])
          data = if cnpj.valid?
                   cnpj.formatted
                 else
                   ''
                 end

          i18n_lbox(h, w, x, y, i18n, data, options)
        end

        def lie(h, w, x, y, xml, xpath_uf, xpath_ie, options = {})
          i18n = xpath_ie.tr('/', '.')

          data = ''
          if BrDanfe::Uf.include?(xml[xpath_uf])
            ie = BrDocuments::IE::Factory.create(xml[xpath_uf], xml[xpath_ie])
            data = ie.formatted if ie.valid?
          end

          i18n_lbox(h, w, x, y, i18n, data, options)
        end

        def lnumeric(h, w, x, y, xml, xpath, options = {})
          i18n = xpath.tr('/', '.')
          data = xml[xpath]

          inumeric(h, w, x, y, i18n, data, options)
        end

        def inumeric(h, w, x, y, i18n = '', data = '', options = {})
          label = i18n != '' ? I18n.t("danfe.#{i18n}") : ''
          numeric [x.cm, Helper.invert(y.cm)], w.cm, h.cm, label, data, options
        end

        def i18n_lbox(h, w, x, y, i18n = '', info = '', options = {})
          label = i18n != '' ? I18n.t("danfe.#{i18n}") : ''
          ibox h, w, x, y, label, info, options
        end

        private

        def numeric(at, w, h, title = '', info = '', options = {})
          info = BrDanfe::Helper.numerify(info) if info != ''
          box at, w, h, title, info, options.merge(align: :right)
        end

        def box(at, w, h, title = '', info = '', options = {})
          options = {
            align: :left,
            size: 10,
            style: nil,
            valign: :top,
            border: 1
          }.merge(options)

          stroke_rectangle at, w, h if options[:border] == 1

          at[0] += 2

          if title != ''
            title_coord = Array.new(at)
            title_coord[1] -= 2
            text_box title, size: 6, at: title_coord, width: w - 4, height: 8
          end

          title_adjustment = title == '' ? 4 : 13
          at[1] -= title_adjustment
          text_box info, size: options[:size], at: at, width: w - 4, height: h - title_adjustment, align: options[:align],
            style: options[:style], valign: options[:valign]
        end
      end
    end
  end
end