Class: FocusNfe::Esquemas::Campo

Inherits:
Object
  • Object
show all
Defined in:
lib/focus_nfe/esquemas/campo.rb

Overview

Um campo de um Esquema de emissão, derivado das definições de campos.focusnfe.com.br. Conhece o nome do campo, sua obrigatoriedade e sabe parsear o tipo fiscal (+String+, Integer[1-9], Decimal[13.2], Date, DateTime, enum, coleção) em restrições aplicáveis a um valor.

Constant Summary collapse

ESCALAR =

Returns captura base e tamanho de um escalar de comprimento (ex.: String[1-60]).

Returns:

  • (Regexp)

    captura base e tamanho de um escalar de comprimento (ex.: String[1-60])

/\A(?<base>String|Integer)\[(?<inicio>\d+)(?:-(?<fim>\d+))?\]/
CODIGO_ENUM =

Returns captura os códigos declarados em um enum (+* 0: …+ ou +*+0+: …+).

Returns:

  • (Regexp)

    captura os códigos declarados em um enum (+* 0: …+ ou +*+0+: …+)

/\*\s*\+([^+]+)\+/

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(definicao) ⇒ Campo

Returns a new instance of Campo.

Parameters:

  • definicao (Hash)

    entrada do schema ({ "name", "type", "required", "collection", … })



19
20
21
22
# File 'lib/focus_nfe/esquemas/campo.rb', line 19

def initialize(definicao)
  @definicao = definicao
  parsear_tipo
end

Instance Attribute Details

#decimalDecimal? (readonly)

Returns especificação decimal do campo, ou nil se não for decimal.

Returns:

  • (Decimal, nil)

    especificação decimal do campo, ou nil se não for decimal



85
86
87
# File 'lib/focus_nfe/esquemas/campo.rb', line 85

def decimal
  @decimal
end

#tamanho_maximoInteger? (readonly)

Returns tamanho/quantidade de dígitos máximo (escalares).

Returns:

  • (Integer, nil)

    tamanho/quantidade de dígitos máximo (escalares)



82
83
84
# File 'lib/focus_nfe/esquemas/campo.rb', line 82

def tamanho_maximo
  @tamanho_maximo
end

#tamanho_minimoInteger? (readonly)

Returns tamanho/quantidade de dígitos mínimo (escalares).

Returns:

  • (Integer, nil)

    tamanho/quantidade de dígitos mínimo (escalares)



79
80
81
# File 'lib/focus_nfe/esquemas/campo.rb', line 79

def tamanho_minimo
  @tamanho_minimo
end

#tipoSymbol (readonly)

Returns tipo parseado (+:string+, :integer, :decimal, :date, :datetime, :enum, :colecao ou :desconhecido).

Returns:

  • (Symbol)

    tipo parseado (+:string+, :integer, :decimal, :date, :datetime, :enum, :colecao ou :desconhecido)



68
69
70
# File 'lib/focus_nfe/esquemas/campo.rb', line 68

def tipo
  @tipo
end

Instance Method Details

#colecao?Boolean

Returns se o campo é uma coleção de subitens.

Returns:

  • (Boolean)

    se o campo é uma coleção de subitens



64
# File 'lib/focus_nfe/esquemas/campo.rb', line 64

def colecao? = tipo == :colecao

#descricaoString?

Returns descrição do campo conforme campos.focusnfe.com.br.

Returns:

  • (String, nil)

    descrição do campo conforme campos.focusnfe.com.br



28
# File 'lib/focus_nfe/esquemas/campo.rb', line 28

def descricao = @definicao["description"]

#enumString?

Returns enumeração dos valores aceitos, como documentada.

Returns:

  • (String, nil)

    enumeração dos valores aceitos, como documentada



34
# File 'lib/focus_nfe/esquemas/campo.rb', line 34

def enum = @definicao["enum"]

#enum?Boolean

Returns se o campo declara um conjunto de valores aceitos.

Returns:

  • (Boolean)

    se o campo declara um conjunto de valores aceitos



42
# File 'lib/focus_nfe/esquemas/campo.rb', line 42

def enum? = !valores_enum.empty?

#esquema_colecaoEsquema?

Returns esquema dos subcampos da coleção, ou nil se o campo não for coleção ou não declarar object_attributes.

Returns:

  • (Esquema, nil)

    esquema dos subcampos da coleção, ou nil se o campo não for coleção ou não declarar object_attributes



72
73
74
75
76
# File 'lib/focus_nfe/esquemas/campo.rb', line 72

def esquema_colecao
  return unless colecao?

  @esquema_colecao ||= (atributos = @definicao.dig("collection", "object_attributes")) && Esquema.new(atributos)
end

#nomeString

Returns nome do campo no payload de emissão.

Returns:

  • (String)

    nome do campo no payload de emissão



25
# File 'lib/focus_nfe/esquemas/campo.rb', line 25

def nome = @definicao["name"]

#obrigatorio?Boolean

Returns se o campo é obrigatório na emissão.

Returns:

  • (Boolean)

    se o campo é obrigatório na emissão



61
# File 'lib/focus_nfe/esquemas/campo.rb', line 61

def obrigatorio? = @definicao["required"] == true

#tagString?

Returns tag XML subjacente do campo.

Returns:

  • (String, nil)

    tag XML subjacente do campo



45
# File 'lib/focus_nfe/esquemas/campo.rb', line 45

def tag = @definicao["tag"]

#tipo_brutoString?

Returns tipo bruto como documentado (ex.: "String[1-60]").

Returns:

  • (String, nil)

    tipo bruto como documentado (ex.: "String[1-60]")



31
# File 'lib/focus_nfe/esquemas/campo.rb', line 31

def tipo_bruto = @definicao["type"]

#to_hHash

Representação serializável do campo, para introspecção externa (devs e ferramentas automatizadas). Coleções aninham a descrição dos subcampos em :colecao, em profundidade arbitrária; campos escalares têm :colecao nil.

Returns:

  • (Hash)

    descrição estruturada do campo



52
53
54
55
56
57
58
# File 'lib/focus_nfe/esquemas/campo.rb', line 52

def to_h
  {
    nome: nome, descricao: descricao, tipo: tipo, tipo_bruto: tipo_bruto,
    obrigatorio: obrigatorio?, tamanho_minimo: tamanho_minimo, tamanho_maximo: tamanho_maximo,
    decimal: decimal&.to_h, enum: enum, tag: tag, colecao: esquema_colecao&.descrever
  }
end

#validar_valor(valor) ⇒ String?

Valida um valor contra o tipo/tamanho e o conjunto de enum do campo. Coleções e tipos desconhecidos não restringem nesta etapa.

Parameters:

  • valor (Object)

    valor informado para o campo

Returns:

  • (String, nil)

    mensagem de erro ou nil se válido



92
93
94
95
96
97
# File 'lib/focus_nfe/esquemas/campo.rb', line 92

def validar_valor(valor)
  erro = validar_tipo(valor)
  return erro if erro

  validar_enum(valor) if enum?
end

#valores_enumArray<String>

Returns códigos aceitos extraídos do #enum (vazio se não houver).

Returns:

  • (Array<String>)

    códigos aceitos extraídos do #enum (vazio se não houver)



37
38
39
# File 'lib/focus_nfe/esquemas/campo.rb', line 37

def valores_enum
  @valores_enum ||= enum.to_s.scan(CODIGO_ENUM).flatten
end