Class: Nfcom::Models::Fatura

Inherits:
Object
  • Object
show all
Includes:
Utils::Helpers
Defined in:
lib/nfcom/models/fatura.rb,
lib/nfcom/models/fatura/codigo_de_barras.rb,
lib/nfcom/models/fatura/codigo_de_barras/formato_44.rb

Overview

Representa as informações de faturamento da NF-COM (grupo gFat)

Este grupo contém as informações sobre o período de faturamento, vencimento e valores da fatura.

Atributos obrigatórios:

  • competencia (formato AAAAMM, ex: ‘202601’ ou aceita ‘2026-01’)

  • data_vencimento (formato YYYY-MM-DD, ex: ‘2026-02-15’)

  • codigo_barras (linha digitável do boleto, 1-48 caracteres)

  • valor_fatura (valor total da fatura)

Atributos opcionais:

  • valor_liquido (valor líquido após descontos)

  • periodo_uso_inicio (início do período de uso - YYYY-MM-DD)

  • periodo_uso_fim (fim do período de uso - YYYY-MM-DD)

  • codigo_debito_automatico (código de autorização débito em conta)

  • codigo_banco (número do banco - se houver débito automático)

  • codigo_agencia (número da agência - se houver débito automático)

Examples:

Criar fatura básica para ISP

fatura = Nfcom::Models::Fatura.new(
  competencia: '2026-01',        # Aceita YYYY-MM ou AAAAMM
  data_vencimento: '2026-02-15', # Data de vencimento
  codigo_barras: '23793381286000000099901234567890123456789012',
  valor_fatura: 99.90
)

Fatura com período de uso

fatura = Nfcom::Models::Fatura.new(
  competencia: '202601',
  data_vencimento: '2026-02-15',
  codigo_barras: '23793381286000000099901234567890123456789012',
  periodo_uso_inicio: '2026-01-01',
  periodo_uso_fim: '2026-01-31',
  valor_fatura: 99.90
)

Defined Under Namespace

Classes: CodigoDeBarras

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utils::Helpers

apenas_numeros, cnpj_valido?, cpf_valido?, formatar_cep, formatar_cnpj, formatar_cpf, formatar_data, formatar_data_hora, formatar_decimal, gerar_id, limitar_texto, remover_acentos, safe_to_date, vazio?

Constructor Details

#initialize(attributes = {}) ⇒ Fatura

Returns a new instance of Fatura.



56
57
58
59
60
61
62
63
# File 'lib/nfcom/models/fatura.rb', line 56

def initialize(attributes = {})
  attributes.each do |key, value|
    send("#{key}=", value) if respond_to?("#{key}=")
  end

  # Se valor_liquido não foi informado, usa o mesmo da fatura
  @valor_liquido ||= @valor_fatura
end

Instance Attribute Details

#codigo_agenciaObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def codigo_agencia
  @codigo_agencia
end

#codigo_bancoObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def codigo_banco
  @codigo_banco
end

#codigo_barrasObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def codigo_barras
  @codigo_barras
end

#codigo_debito_automaticoObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def codigo_debito_automatico
  @codigo_debito_automatico
end

#competenciaObject

CompetFat - AAAAMM



54
55
56
# File 'lib/nfcom/models/fatura.rb', line 54

def competencia
  @competencia
end

#data_vencimentoObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def data_vencimento
  @data_vencimento
end

#periodo_uso_fimObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def periodo_uso_fim
  @periodo_uso_fim
end

#periodo_uso_inicioObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def periodo_uso_inicio
  @periodo_uso_inicio
end

#valor_faturaObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def valor_fatura
  @valor_fatura
end

#valor_liquidoObject

dVencFat - YYYY-MM-DD



44
45
46
# File 'lib/nfcom/models/fatura.rb', line 44

def valor_liquido
  @valor_liquido
end

Instance Method Details

#errosObject

rubocop:disable Metrics/MethodLength



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/nfcom/models/fatura.rb', line 82

def erros # rubocop:disable Metrics/MethodLength
  errors = []

  # Validar competência
  if competencia.to_s.strip.empty?
    errors << 'Competência é obrigatória'
  elsif !competencia_valida?
    errors << 'Competência deve estar no formato AAAAMM (ex: 202601)'
  end

  # Validar data de vencimento
  if data_vencimento.to_s.strip.empty?
    errors << 'Data de vencimento é obrigatória'
  elsif !data_vencimento_valida?
    errors << 'Data de vencimento deve estar no formato YYYY-MM-DD (ex: 2026-02-15)'
  end

  # Validar código de barras (OBRIGATÓRIO)
  if codigo_barras.to_s.strip.empty?
    errors << 'Código de barras é obrigatório'
  elsif codigo_barras.to_s.length > 48
    errors << 'Código de barras deve ter no máximo 48 caracteres'
  end

  # Validar valor da fatura
  if valor_fatura.nil?
    errors << 'Valor da fatura é obrigatório'
  elsif valor_fatura.to_f <= 0
    errors << 'Valor da fatura deve ser maior que zero'
  end

  # Validar períodos de uso (se informados)
  if periodo_uso_inicio && periodo_uso_fim
    inicio = safe_to_date(periodo_uso_inicio)
    fim = safe_to_date(periodo_uso_fim)

    if inicio.nil? || fim.nil?
      errors << 'Período de uso: datas inválidas'
    elsif inicio > fim
      errors << 'Período de uso: data inicial não pode ser posterior à data final'
    end
  elsif periodo_uso_inicio || periodo_uso_fim
    errors << 'Período de uso: ambas as datas (início e fim) devem ser informadas'
  end

  # Validar débito automático (se informado)
  if codigo_debito_automatico
    errors << 'Código do banco é obrigatório quando há débito automático' if codigo_banco.to_s.strip.empty?
    errors << 'Código da agência é obrigatório quando há débito automático' if codigo_agencia.to_s.strip.empty?
  end

  errors
end

#linha_digitavelObject



136
137
138
139
140
# File 'lib/nfcom/models/fatura.rb', line 136

def linha_digitavel
  CodigoDeBarras.new(codigo_barras).linha_digitavel
rescue StandardError
  ''
end

#valido?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/nfcom/models/fatura.rb', line 78

def valido?
  erros.empty?
end