nfe_reader 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/lib/nfe_reader.rb +4 -4
  4. data/lib/nfe_reader/address.rb +38 -0
  5. data/lib/nfe_reader/authorization.rb +8 -10
  6. data/lib/nfe_reader/billing.rb +21 -0
  7. data/lib/nfe_reader/billing/duplicate.rb +14 -0
  8. data/lib/nfe_reader/carrier.rb +12 -14
  9. data/lib/nfe_reader/customer.rb +15 -57
  10. data/lib/nfe_reader/delivery.rb +16 -18
  11. data/lib/nfe_reader/document.rb +63 -65
  12. data/lib/nfe_reader/export.rb +8 -10
  13. data/lib/nfe_reader/fiscal.rb +29 -31
  14. data/lib/nfe_reader/header.rb +114 -123
  15. data/lib/nfe_reader/helpers/attribute_helper.rb +24 -0
  16. data/lib/nfe_reader/helpers/creator_helper.rb +40 -0
  17. data/lib/{helpers → nfe_reader/helpers}/nokogiri_hash.rb +2 -0
  18. data/lib/nfe_reader/information.rb +17 -19
  19. data/lib/nfe_reader/nfe.rb +78 -87
  20. data/lib/nfe_reader/person.rb +53 -0
  21. data/lib/nfe_reader/product.rb +69 -67
  22. data/lib/nfe_reader/product/armament.rb +18 -20
  23. data/lib/nfe_reader/product/cane.rb +22 -24
  24. data/lib/nfe_reader/product/exportation.rb +15 -17
  25. data/lib/nfe_reader/product/fuel.rb +13 -15
  26. data/lib/nfe_reader/product/importation.rb +42 -44
  27. data/lib/nfe_reader/product/medicament.rb +15 -17
  28. data/lib/nfe_reader/product/vehicle.rb +113 -115
  29. data/lib/nfe_reader/provider.rb +10 -40
  30. data/lib/nfe_reader/purchase.rb +9 -12
  31. data/lib/nfe_reader/removal.rb +17 -19
  32. data/lib/nfe_reader/taxation/cofins.rb +41 -41
  33. data/lib/nfe_reader/taxation/cofins_st.rb +15 -17
  34. data/lib/nfe_reader/taxation/icms.rb +80 -81
  35. data/lib/nfe_reader/taxation/importation_tax.rb +14 -16
  36. data/lib/nfe_reader/taxation/ipi.rb +35 -37
  37. data/lib/nfe_reader/taxation/issqn.rb +17 -19
  38. data/lib/nfe_reader/taxation/pis.rb +41 -41
  39. data/lib/nfe_reader/taxation/pis_st.rb +16 -18
  40. data/lib/nfe_reader/total.rb +71 -71
  41. data/lib/nfe_reader/transport.rb +76 -89
  42. data/lib/nfe_reader/version.rb +2 -4
  43. data/nfe-reader.gemspec +2 -1
  44. data/test/nfe_reader/address_test.rb +75 -0
  45. data/test/nfe_reader/authorization_test.rb +2 -2
  46. data/test/nfe_reader/{collection → billing}/duplicate_test.rb +2 -2
  47. data/test/nfe_reader/{collection_test.rb → billing_test.rb} +13 -13
  48. data/test/nfe_reader/cane_test.rb +2 -2
  49. data/test/nfe_reader/carrier_test.rb +4 -4
  50. data/test/nfe_reader/customer_test.rb +6 -101
  51. data/test/nfe_reader/delivery_test.rb +2 -2
  52. data/test/nfe_reader/document_test.rb +2 -2
  53. data/test/nfe_reader/export_test.rb +2 -2
  54. data/test/nfe_reader/fiscal_test.rb +2 -2
  55. data/test/nfe_reader/header_test.rb +2 -2
  56. data/test/{helpers → nfe_reader/helpers}/attributte_helper_test.rb +3 -3
  57. data/test/{helpers → nfe_reader/helpers}/creator_helper_test.rb +3 -3
  58. data/test/{helpers → nfe_reader/helpers}/nokogiri_test.rb +1 -1
  59. data/test/nfe_reader/information_test.rb +2 -2
  60. data/test/nfe_reader/nfe_test.rb +13 -13
  61. data/test/nfe_reader/person_test.rb +60 -0
  62. data/test/nfe_reader/product/armament_test.rb +2 -2
  63. data/test/nfe_reader/product/exportation_test.rb +2 -2
  64. data/test/nfe_reader/product/fuel_test.rb +2 -2
  65. data/test/nfe_reader/product/importation_test.rb +2 -2
  66. data/test/nfe_reader/product/medicament_test.rb +2 -2
  67. data/test/nfe_reader/product/vehicle_test.rb +2 -2
  68. data/test/nfe_reader/product_test.rb +2 -2
  69. data/test/nfe_reader/provider_test.rb +5 -118
  70. data/test/nfe_reader/purchase_test.rb +2 -2
  71. data/test/nfe_reader/removal_test.rb +2 -2
  72. data/test/nfe_reader/taxation/cofins_st_test.rb +2 -2
  73. data/test/nfe_reader/taxation/cofins_test.rb +2 -2
  74. data/test/nfe_reader/taxation/icms_test.rb +2 -2
  75. data/test/nfe_reader/taxation/importation_tax_test.rb +2 -2
  76. data/test/nfe_reader/taxation/ipi_test.rb +2 -2
  77. data/test/nfe_reader/taxation/issqn_test.rb +2 -2
  78. data/test/nfe_reader/taxation/pis_st_test.rb +2 -2
  79. data/test/nfe_reader/taxation/pis_test.rb +2 -2
  80. data/test/nfe_reader/total_test.rb +2 -2
  81. data/test/nfe_reader/transport_test.rb +3 -3
  82. metadata +37 -17
  83. data/lib/helpers/attribute_helper.rb +0 -18
  84. data/lib/helpers/creator_helper.rb +0 -32
  85. data/lib/nfe_reader/collection.rb +0 -38
  86. data/lib/nfe_reader/collection/duplicate.rb +0 -16
@@ -1,46 +1,16 @@
1
1
  # encoding: UTF-8
2
- module Nfe
3
- module Reader
4
- # Identificação do Emitente da Nota Fiscal eletrônica
5
- class Provider
6
- include ::AttributeHelper
2
+ module NfeReader
3
+ # Identificação do Emitente da Nota Fiscal eletrônica
4
+ class Provider
5
+ attr_reader :person, :address
7
6
 
8
- attr_reader :cnpj, :cpf, :name, :phone, :state_registration, :state_registration_st,
9
- :city_registration, :regime, :cnae, :address, :number, :complement, :neighborhood,
10
- :city_code, :city, :zip_code, :country_code, :country, :fantasy, :state
7
+ def initialize(attrs = {})
8
+ # Person
9
+ @person = Person.new(attrs)
11
10
 
12
- # == Fields Values
13
- #
14
- # CRT: 1 - Simples Nacional,
15
- # 2 - Simples Nacional – excesso de sublimite de receita bruta,
16
- # 3 - Regime Normal
17
- #
18
- def initialize(attrs = {})
19
- # Provider Info
20
- @cnpj = attrs[:CNPJ]
21
- @cpf = attrs[:CPF]
22
- @name = attrs[:xNome]
23
- @fantasy = attrs[:xFant]
24
- @state_registration = attrs[:IE]
25
- @state_registration_st = attrs[:IEST]
26
- @city_registration = attrs[:IM]
27
- @regime = attrs[:CRT]
28
- @cnae = attrs[:CNAE]
29
-
30
- # Address
31
- if attrs[:enderEmit]
32
- @phone = attrs[:enderEmit][:fone]
33
- @address = attrs[:enderEmit][:xLgr]
34
- @number = attrs[:enderEmit][:nro]
35
- @complement = attrs[:enderEmit][:xCpl]
36
- @neighborhood = attrs[:enderEmit][:xBairro]
37
- @city_code = attrs[:enderEmit][:cMun]
38
- @city = attrs[:enderEmit][:xMun]
39
- @zip_code = attrs[:enderEmit][:CEP]
40
- @country_code = attrs[:enderEmit][:cPais]
41
- @country = attrs[:enderEmit][:xPais]
42
- @state = attrs[:enderEmit][:UF]
43
- end
11
+ # Address
12
+ if attrs[:enderEmit]
13
+ @address = Address.new(attrs[:enderEmit])
44
14
  end
45
15
  end
46
16
  end
@@ -1,18 +1,15 @@
1
1
  # encoding: UTF-8
2
+ module NfeReader
3
+ # Informações de Compras
4
+ class Purchase
5
+ include AttributeHelper
2
6
 
3
- # Informações de Compras
4
- module Nfe
5
- module Reader
6
- class Purchase
7
- include ::AttributeHelper
7
+ attr_reader :number, :demand, :contract
8
8
 
9
- attr_reader :number, :demand, :contract
10
-
11
- def initialize(attrs = {})
12
- @number = attrs[:xNEmp]
13
- @demand = attrs[:xPed]
14
- @contract = attrs[:xCont]
15
- end
9
+ def initialize(attrs = {})
10
+ @number = attrs[:xNEmp]
11
+ @demand = attrs[:xPed]
12
+ @contract = attrs[:xCont]
16
13
  end
17
14
  end
18
15
  end
@@ -1,24 +1,22 @@
1
- # Local de Retirada
2
- module Nfe
3
- module Reader
4
- # Identificação do Local de Retirada
5
- class Removal
6
- include ::AttributeHelper
1
+ # encoding: UTF-8
2
+ module NfeReader
3
+ # Identificação do Local de Retirada
4
+ class Removal
5
+ include AttributeHelper
7
6
 
8
- attr_reader :cnpj, :cpf, :address, :number, :complement,
9
- :neighborhood, :city_code, :city, :state
7
+ attr_reader :cnpj, :cpf, :address, :number, :complement,
8
+ :neighborhood, :city_code, :city, :state
10
9
 
11
- def initialize(attrs = {})
12
- @cnpj = attrs[:CNPJ]
13
- @cpf = attrs[:CPF]
14
- @address = attrs[:xLgr]
15
- @number = attrs[:nro]
16
- @complement = attrs[:xCpl]
17
- @neighborhood = attrs[:xBairro]
18
- @city_code = attrs[:cMun]
19
- @city = attrs[:xMun]
20
- @state = attrs[:UF]
21
- end
10
+ def initialize(attrs = {})
11
+ @cnpj = attrs[:CNPJ]
12
+ @cpf = attrs[:CPF]
13
+ @address = attrs[:xLgr]
14
+ @number = attrs[:nro]
15
+ @complement = attrs[:xCpl]
16
+ @neighborhood = attrs[:xBairro]
17
+ @city_code = attrs[:cMun]
18
+ @city = attrs[:xMun]
19
+ @state = attrs[:UF]
22
20
  end
23
21
  end
24
22
  end
@@ -1,47 +1,47 @@
1
1
  # encoding: UTF-8
2
- module Nfe
3
- module Reader
4
- class Cofins
5
- include ::AttributeHelper
2
+ module NfeReader
3
+ class Cofins
4
+ include AttributeHelper
6
5
 
7
- attr_reader :cst, :base, :percentage, :value, :amount,
8
- :aliquot
6
+ attr_reader :cst, :base, :percentage, :value, :amount,
7
+ :aliquot
9
8
 
10
- # Fieds Values
11
- #
12
- # cst:
13
- # COFINSAliq:
14
- # 01 - Operação Tributável
15
- # (base de cálculo = valor da operação alíquota normal (cumulativo/não cumulativo));
16
- # 02 - Operação Tributável
17
- # (base de cálculo = valor da operação (alíquota diferenciada));
18
- # COFINSQtde:
19
- # 03 - Operação Tributável
20
- # (base de cálculo = quantidade vendida x alíquota por unidadede produto);
21
- # COFINSNT:
22
- # 04 - Operação Tributável
23
- # (tributação monofásica(alíquota zero));
24
- # 06 - Operação Tributável(alíquota zero);
25
- # 07 - Operação Isenta da Contribuição;
26
- # 08 - Operação Sem Incidência da Contribuição;
27
- # 09 - Operação com Suspensão da Contribuição;
28
- # COFINSOutr:
29
- # 99 - Outras Operações;
30
- #
31
- def initialize(attrs = {})
32
- # Cst COFINS
33
- @cst = attrs[:CST]
34
- # Base COFINS
35
- @base = attrs[:vBC]
36
- # % COFINS
37
- @percentage = attrs[:pCOFINS]
38
- # Valor COFINS
39
- @value = attrs[:vCOFINS]
40
- # Quantidade Vendida
41
- @amount = attrs[:qBCProd]
42
- # Alíquota do COFINS
43
- @aliquot = attrs[:vAliqProd]
44
- end
9
+ # Fieds Values
10
+ #
11
+ # cst:
12
+ # COFINSAliq:
13
+ # 01 - Operação Tributável
14
+ # (base de cálculo = valor da operação alíquota normal (cumulativo/não cumulativo));
15
+ # 02 - Operação Tributável
16
+ # (base de cálculo = valor da operação (alíquota diferenciada));
17
+ # COFINSQtde:
18
+ # 03 - Operação Tributável
19
+ # (base de cálculo = quantidade vendida x alíquota por unidadede produto);
20
+ # COFINSNT:
21
+ # 04 - Operação Tributável
22
+ # (tributação monofásica(alíquota zero));
23
+ # 06 - Operação Tributável(alíquota zero);
24
+ # 07 - Operação Isenta da Contribuição;
25
+ # 08 - Operação Sem Incidência da Contribuição;
26
+ # 09 - Operação com Suspensão da Contribuição;
27
+ # COFINSOutr:
28
+ # 99 - Outras Operações;
29
+ #
30
+ def initialize(attrs = {})
31
+ attrs = attrs.values[0]
32
+
33
+ # Cst COFINS
34
+ @cst = attrs[:CST]
35
+ # Base COFINS
36
+ @base = attrs[:vBC]
37
+ # % COFINS
38
+ @percentage = attrs[:pCOFINS]
39
+ # Valor COFINS
40
+ @value = attrs[:vCOFINS]
41
+ # Quantidade Vendida
42
+ @amount = attrs[:qBCProd]
43
+ # Alíquota do COFINS
44
+ @aliquot = attrs[:vAliqProd]
45
45
  end
46
46
  end
47
47
  end
@@ -1,23 +1,21 @@
1
1
  # encoding: UTF-8
2
- module Nfe
3
- module Reader
4
- class CofinsSt
5
- include ::AttributeHelper
2
+ module NfeReader
3
+ class CofinsSt
4
+ include AttributeHelper
6
5
 
7
- attr_reader :base, :percentage, :amount, :aliquot, :value
6
+ attr_reader :base, :percentage, :amount, :aliquot, :value
8
7
 
9
- def initialize(attrs = {})
10
- # Valor Base
11
- @base = attrs[:vBC]
12
- # % COFINS ST
13
- @percentage = attrs[:pCOFINS]
14
- # Quantidade
15
- @amount = attrs[:qBCProd]
16
- # Aliquota COFINS ST
17
- @aliquot = attrs[:vAliqProd]
18
- # Valor COFINS ST
19
- @value = attrs[:vCOFINS]
20
- end
8
+ def initialize(attrs = {})
9
+ # Valor Base
10
+ @base = attrs[:vBC]
11
+ # % COFINS ST
12
+ @percentage = attrs[:pCOFINS]
13
+ # Quantidade
14
+ @amount = attrs[:qBCProd]
15
+ # Aliquota COFINS ST
16
+ @aliquot = attrs[:vAliqProd]
17
+ # Valor COFINS ST
18
+ @value = attrs[:vCOFINS]
21
19
  end
22
20
  end
23
21
  end
@@ -1,90 +1,89 @@
1
1
  # encoding: UTF-8
2
- module Nfe
3
- module Reader
4
- class Icms
5
- include ::AttributeHelper
2
+ module NfeReader
3
+ class Icms
4
+ include AttributeHelper
6
5
 
7
- attr_reader :origin, :cst, :icms_percentage, :icms, :icms_base_kind,
8
- :icms_base, :icms_base_reduction, :icms_st_base_kind, :icms_st_base_reduction,
9
- :mva, :icms_st_base, :icms_st_percentage, :icms_st, :icms_st_base_retained_sender,
10
- :icms_st_retained_sender, :icms_st_base_retained, :icms_st_retained, :state,
11
- :retained_reason, :credit_percentage, :icms_credit, :sn_operation_code
6
+ attr_reader :origin, :cst, :icms_percentage, :icms, :icms_base_kind,
7
+ :icms_base, :icms_base_reduction, :icms_st_base_kind, :icms_st_base_reduction,
8
+ :mva, :icms_st_base, :icms_st_percentage, :icms_st, :icms_st_base_retained_sender,
9
+ :icms_st_retained_sender, :icms_st_base_retained, :icms_st_retained, :state,
10
+ :retained_reason, :credit_percentage, :icms_credit, :sn_operation_code
11
+
12
+ # == Field Values
13
+ #
14
+ # ori: 0 - Nacional
15
+ # 1 - Estrangeira - Importação direta
16
+ # 2 - Estrangeira – Adquirida no mercado interno.
17
+ #
18
+ # modBC: 0 - Margem Valor Agregado (%);
19
+ # 1 - Pauta (Valor);
20
+ # 2 - Preço Tabelado Máx. (valor);
21
+ # 3 - valor da operação.
22
+ #
23
+ # modBCST: 0 – Preço tabelado ou máximosugerido;
24
+ # 1 - Lista Negativa (valor);
25
+ # 2 - Lista Positiva (valor);
26
+ # 3 - Lista Neutra (valor);
27
+ # 4 - Margem Valor Agregado (%);
28
+ # 5 - Pauta (valor);
29
+
30
+ def initialize(attrs = {})
31
+ attrs = attrs.values[0]
32
+
33
+ # Origem da mercadoria
34
+ @origin = attrs[:orig] || attrs[:Orig]
35
+
36
+ # Tributação do ICMS
37
+ @cst = attrs[:CST]
12
38
 
13
- # == Field Values
39
+ # == ICMS
14
40
  #
15
- # ori: 0 - Nacional
16
- # 1 - Estrangeira - Importação direta
17
- # 2 - Estrangeira – Adquirida no mercado interno.
41
+ # % ICMS
42
+ @icms_percentage = attrs[:pICMS]
43
+ # Valor ICMS
44
+ @icms = attrs[:vICMS]
45
+ # Modalidade de determinação da BC do ICMS
46
+ @icms_base_kind = attrs[:modBC]
47
+ # Base ICMS
48
+ @icms_base = attrs[:vBC]
49
+ # % Redução Base ICMS
50
+ @icms_base_reduction = attrs[:pRedBC]
51
+
52
+ # == ICMS ST
18
53
  #
19
- # modBC: 0 - Margem Valor Agregado (%);
20
- # 1 - Pauta (Valor);
21
- # 2 - Preço Tabelado Máx. (valor);
22
- # 3 - valor da operação.
54
+ # Modalidade de determinação da BC do ICMS ST
55
+ @icms_st_base_kind = attrs[:modBCST]
56
+ # % redução Base ICMS ST
57
+ @icms_st_base_reduction = attrs[:pRedBCST]
58
+ # MVA ST
59
+ @mva = attrs[:pMVAST]
60
+ # Base ICMS ST
61
+ @icms_st_base = attrs[:vBCST]
62
+ # % ICMS ST
63
+ @icms_st_percentage = attrs[:pICMSST]
64
+ # Valor ICMS ST
65
+ @icms_st = attrs[:vICMSST]
66
+ # Valor do BC do ICMS ST Retido UF Remetente
67
+ @icms_st_base_retained_sender = attrs[:vBCSTRet]
68
+ # Valor ICMS ST Retido UF Remetente
69
+ @icms_st_retained_sender = attrs[:vICMSSTRet]
70
+ # Valor do BC do ICMS ST Retido UF Destiantaria
71
+ @icms_st_base_retained = attrs[:vBCSTDest]
72
+ # Valor ICMS ST Retido UF Destinataria
73
+ @icms_st_retained = attrs[:vICMSSTDes]
74
+ # UF para qual é devido o ICMS ST
75
+ @state = attrs[:UFST]
76
+
77
+ # == Simples Nacional
23
78
  #
24
- # modBCST: 0 Preço tabelado ou máximosugerido;
25
- # 1 - Lista Negativa (valor);
26
- # 2 - Lista Positiva (valor);
27
- # 3 - Lista Neutra (valor);
28
- # 4 - Margem Valor Agregado (%);
29
- # 5 - Pauta (valor);
30
-
31
- def initialize(attrs = {})
32
- # Origem da mercadoria
33
- @origin = attrs[:orig]
34
- @origin ||= attrs[:Orig]
35
-
36
- # Tributação do ICMS
37
- @cst = attrs[:CST]
38
-
39
- # == ICMS
40
- #
41
- # % ICMS
42
- @icms_percentage = attrs[:pICMS]
43
- # Valor ICMS
44
- @icms = attrs[:vICMS]
45
- # Modalidade de determinação da BC do ICMS
46
- @icms_base_kind = attrs[:modBC]
47
- # Base ICMS
48
- @icms_base = attrs[:vBC]
49
- # % Redução Base ICMS
50
- @icms_base_reduction = attrs[:pRedBC]
51
-
52
- # == ICMS ST
53
- #
54
- # Modalidade de determinação da BC do ICMS ST
55
- @icms_st_base_kind = attrs[:modBCST]
56
- # % redução Base ICMS ST
57
- @icms_st_base_reduction = attrs[:pRedBCST]
58
- # MVA ST
59
- @mva = attrs[:pMVAST]
60
- # Base ICMS ST
61
- @icms_st_base = attrs[:vBCST]
62
- # % ICMS ST
63
- @icms_st_percentage = attrs[:pICMSST]
64
- # Valor ICMS ST
65
- @icms_st = attrs[:vICMSST]
66
- # Valor do BC do ICMS ST Retido UF Remetente
67
- @icms_st_base_retained_sender = attrs[:vBCSTRet]
68
- # Valor ICMS ST Retido UF Remetente
69
- @icms_st_retained_sender = attrs[:vICMSSTRet]
70
- # Valor do BC do ICMS ST Retido UF Destiantaria
71
- @icms_st_base_retained = attrs[:vBCSTDest]
72
- # Valor ICMS ST Retido UF Destinataria
73
- @icms_st_retained = attrs[:vICMSSTDes]
74
- # UF para qual é devido o ICMS ST
75
- @state = attrs[:UFST]
76
-
77
- # == Simples Nacional
78
- #
79
- # Motivo da desoneração do ICMS
80
- @retained_reason = attrs[:motDesICMS]
81
- # Alíquota aplicável de cálculo do crédito
82
- @credit_percentage = attrs[:pCredSN]
83
- # Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123
84
- @icms_credit = attrs[:vCredICMSSN]
85
- # Código de Situação da Operação
86
- @sn_operation_code = attrs[:CSOSN]
87
- end
79
+ # Motivo da desoneração do ICMS
80
+ @retained_reason = attrs[:motDesICMS]
81
+ # Alíquota aplicável de cálculo do crédito
82
+ @credit_percentage = attrs[:pCredSN]
83
+ # Valor crédito do ICMS que pode ser aproveitado nos termos do art. 23 da LC 123
84
+ @icms_credit = attrs[:vCredICMSSN]
85
+ # Código de Situação da Operação
86
+ @sn_operation_code = attrs[:CSOSN]
88
87
  end
89
88
  end
90
89
  end
@@ -1,21 +1,19 @@
1
1
  # encoding: UTF-8
2
- module Nfe
3
- module Reader
4
- class ImportationTax
5
- include ::AttributeHelper
2
+ module NfeReader
3
+ class ImportationTax
4
+ include AttributeHelper
6
5
 
7
- attr_reader :base, :expenditure, :taxes, :iof
8
-
9
- def initialize(attrs = {})
10
- # Base de Caluclo
11
- @base = attrs[:vBC]
12
- # Despesas Aduaneiras
13
- @expenditure = attrs[:vDespAdu]
14
- # Imposto de Importação
15
- @taxes = attrs[:vII]
16
- # IOF
17
- @iof = attrs[:vIOF]
18
- end
6
+ attr_reader :base, :expenditure, :taxes, :iof
7
+
8
+ def initialize(attrs = {})
9
+ # Base de Caluclo
10
+ @base = attrs[:vBC]
11
+ # Despesas Aduaneiras
12
+ @expenditure = attrs[:vDespAdu]
13
+ # Imposto de Importação
14
+ @taxes = attrs[:vII]
15
+ # IOF
16
+ @iof = attrs[:vIOF]
19
17
  end
20
18
  end
21
19
  end