class DfeTaxweb::Nfe

Attributes

documento[R]
nfe[R]

Public Class Methods

new(nfe) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 6
def initialize(nfe)
  @documento = {}
  hash = nfe.is_a?(Hash) ? nfe : Hash.from_xml(nfe)
  if hash.blank?
    raise TypeError, 'Invalid NFe type, need Hash ou XML(string)'
  end
  @nfe = Conjunto.new(hash)
end

Public Instance Methods

codigo_pais(cod_pais) click to toggle source

cod_pais = NFe cPais

# File lib/dfe_taxweb/nfe.rb, line 391
def codigo_pais(cod_pais)
  if cod_pais.nil? || cod_pais == '1058'
    '105'
  else
    cod_pais
  end
end
cofins_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 214
def cofins_do_item(item)
  unless item.dados(:cofins).present?
    imposto = item.atributo('imposto.COFINS')
    ['COFINSAliq', 'COFINSQtde', 'COFINSNT', 'COFINSOutr'].each do |tipo|
      item.dados(:cofins, imposto.atributo(tipo))
      if item.dados(:cofins).present?
        item.dados(:cofins).atualizar(tipo: tipo)
        break
      end
    end
  end
  item.dados(:cofins)
end
contribuinte_ipi?(cnae=nil) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 456
def contribuinte_ipi?(cnae=nil)
  case cnae
    when /^[123]/
      'S'
    when /^\d/
      'N'
    else
      nil
  end
end
cst_cofins_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 417
def cst_cofins_do_item(item)
  cofins_do_item(item).atributo('CST')
end
cst_icms_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 403
def cst_icms_do_item(item)
  icms = icms_do_item(item)
  cst_icms = "#{icms.atributo('orig')}#{icms.atributo('CST')}"
  cst_icms.present? ? cst_icms : nil
end
cst_ipi_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 409
def cst_ipi_do_item(item)
  ipi_do_item(item).atributo('CST')
end
cst_pis_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 413
def cst_pis_do_item(item)
  pis_do_item(item).atributo('CST')
end
data_de_emissao() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 378
def data_de_emissao
  inf_nfe.atributo('ide.dEmi') || inf_nfe.atributo('ide.dhEmi')
end
dest_contribuinte_icms?() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 445
def dest_contribuinte_icms?
  case inf_nfe.atributo('ide.indIEDest').to_s
    when '1'
      'S'
    when '2', '9'
      'N'
    else
      !!inf_nfe.atributo('dest.IE') ? 'S' : 'N'
  end
end
destinatario() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 80
def destinatario
  dest = inf_nfe.atributo('dest')
  endereco = endereco(dest.atributo('enderDest'))
  {
      cnpj: dest.atributo('CNPJ'),
      cpf: dest.atributo('CPF'),
      nome: dest.atributo('xNome'),
      inscricaoEstadual: dest.atributo('IE'),
      contribuinteICMS: dest_contribuinte_icms?,
      contribuintePIS: dest.atributo('CNPJ') ? 'S' : 'N',
      contribuinteCOFINS: dest.atributo('CNPJ') ? 'S' : 'N',
      contribuinteII: 'S',
      ISUF: dest.atributo('ISUF'),
      email: dest.atributo('email')
  }.merge(endereco).compact
end
emitente() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 56
def emitente
  emit = inf_nfe.atributo('emit')
  endereco = endereco(emit.atributo('enderEmit'))
  cnae = emit.atributo('CNAE')
  {
      cnpj: emit.atributo('CNPJ'),
      cpf: emit.atributo('CPF'),
      nome: emit.atributo('xNome'),
      xFant: emit.atributo('xFant'),
      inscricaoEstadual: emit.atributo('IE'),
      IEST: emit.atributo('IEST'),
      inscricaoMunicipal: emit.atributo('IM'),
      cdAtividadeEconomica: cnae,
      contribuinteICMS: emit.atributo('IE') ? 'S' : 'N',
      contribuinteIPI: contribuinte_ipi?(cnae),
      contribuinteST: emit.atributo('IEST') ? 'S' : 'N',
      contribuinteISS: emit.atributo('IM') ? 'S' : 'N',
      contribuintePIS: emit.atributo('CNPJ') ? 'S' : 'N',
      contribuinteCOFINS: emit.atributo('CNPJ') ? 'S' : 'N',
      contribuinteII: 'S',
      simplesNac: [1, 2].include?(emit.atributo('CRT')) ? 'S' : 'N'
  }.merge(endereco).compact
end
endereco(ender) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 97
def endereco(ender)
  return {} unless ender.present?
  {
      xLgr: ender.atributo('xLgr'),
      Nro: ender.atributo('Nro'),
      xCpl: ender.atributo('xCpl'),
      xBairro: ender.atributo('xBairro'),
      cdMunicipio: ender.atributo('cMun'),
      xMun: ender.atributo('xMun'),
      uf: ender.atributo('UF'),
      cep: ender.atributo('CEP'),
      cdPais: codigo_pais(ender.atributo('cPais')),
      xPais: ender.atributo('xPais'),
      fone: ender.atributo('fone')
  }.compact
end
enquadramento_cofins(cofins) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 351
def enquadramento_cofins(cofins)
  return unless cofins.present?
  {
      dsSigla: 'COFINS',
      tpEnquadramento: 'IM',
      situacao: cofins.atributo('tipo') == 'COFINSNT' ? 'N' : 'T',
      vlTributavel: cofins.atributo('vBC'),
      vlAliquota: cofins.atributo('pCOFINS'),
      vlImposto: cofins.atributo('vCOFINS'),
      qBCProd: cofins.atributo('qBCProd'),
      vlImpostoUnitario: cofins.atributo('vAliqProd')
  }.compact
end
enquadramento_cofinsst(cofinsst) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 365
def enquadramento_cofinsst(cofinsst)
  return unless cofinsst.present?
  {
      dsSigla: 'COFINSST',
      tpEnquadramento: 'IM',
      situacao: 'T',
      vlTributavel: cofinsst.atributo('vBC'),
      vlAliquota: cofinsst.atributo('pCOFINS'),
      vlImposto: cofinsst.atributo('vCOFINS'),
      vlImpostoUnitario: cofinsst.atributo('vAliqProd')
  }.compact
end
enquadramento_icms(icms) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 245
def enquadramento_icms(icms)
  return if icms.blank? ||
      ['ICMS00', 'ICMS10', 'ICMS20', 'ICMS40', 'ICMS51', 'ICMS70', 'ICMS90'].exclude?(icms.atributo('tipo'))
  {
      dsSigla: 'ICMS',
      situacao: situacao_do_icms_cst(icms.atributo('CST')),
      tpEnquadramento: 'IM',
      vlTributavel: icms.atributo('vBC'),
      vlAliquota: icms.atributo('pICMS'),
      vlImposto: icms.atributo('vICMS'),
      percReducaoBase: icms.atributo('pRedBC'),
      modbc: icms.atributo('modbc')
  }.compact
end
enquadramento_icmsst(icms) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 260
def enquadramento_icmsst(icms)
  return if icms.blank? ||
      ['ICMS10', 'ICMS30', 'ICMS70', 'ICMS90'].exclude?(icms.atributo('tipo'))
  {
      dsSigla: 'ST',
      situacao: situacao_do_icms_cst(icms.atributo('CST')),
      tpEnquadramento: 'IM',
      vlBase: icms.atributo('vBCST'),
      vlTributavel: icms.atributo('vBCST'),
      vlAliquota: icms.atributo('pICMSST'),
      vlImposto: icms.atributo('vICMSST'),
      vlPercentualMVA: icms.atributo('pMVAST'),
      percReducaoBase: icms.atributo('pRedBCST'),
      modBCST: icms.atributo('modBCST')
  }.compact
end
enquadramento_icmsste(icms) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 277
def enquadramento_icmsste(icms)
  return if icms.blank? ||
      ['ICMS60'].exclude?(icms.atributo('tipo'))
  {
      dsSigla: 'STE',
      situacao: situacao_do_icms_cst(icms.atributo('CST')),
      tpEnquadramento: 'IM',
      vlBase: icms.atributo('vBCST'),
      vlTributavel: icms.atributo('vBCSTRet'),
      vlImposto: icms.atributo('vICMSSTRet'),
      vlPercentualMVA: icms.atributo('pMVAST')
  }.compact
end
enquadramento_ii(ii) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 311
def enquadramento_ii(ii)
  return if ii.blank? || ii.atributo('vII').to_f <= 0.0
  {
      dsSigla: 'II',
      situacao: 'T',
      vlTributavel: ii.atributo('vBC'),
      vlImposto: ii.atributo('vII'),
      vlIOF: ii.atributo('vlIOF'),
      vDespAdu: ii.atributo('vDespAdu'),
      tpEnquadramento: 'IM'
  }.compact
end
enquadramento_ipi(ipi) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 291
def enquadramento_ipi(ipi)
  return if ipi.blank?
  vlr_unid = ipi.atributo('vUnid')
  {
      dsSigla: 'IPI',
      situacao: 'T',
      tpEnquadramento: 'IM',
      clEnq: ipi.atributo('clEnq'),
      CNPJProd: ipi.atributo('CNPJProd'),
      cSelo: ipi.atributo('cSelo'),
      qSelo: ipi.atributo('qSelo'),
      cEnq: ipi.atributo('cEnq'),
      vlImposto: ipi.atributo('vIPI'),
      vlTributavel: (vlr_unid.present? && vlr_unid.to_f > 0 ? 0 : ipi.atributo('vBC')),
      vlAliquota: ipi.atributo('pIPI'),
      vUnid: vlr_unid,
      qUnid: ipi.atributo('qUnid')
  }.compact
end
enquadramento_pis(pis) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 324
def enquadramento_pis(pis)
  return unless pis.present?
  {
      dsSigla: 'PIS',
      tpEnquadramento: 'IM',
      situacao: 'T',
      vlTributavel: pis.atributo('vBC'),
      vlAliquota: pis.atributo('pPIS'),
      vlImposto: pis.atributo('vPIS'),
      qBCProd: pis.atributo('qBCProd'),
      vlImpostoUnitario: pis.atributo('vAliqProd')
  }.compact
end
enquadramento_pisst(pisst) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 338
def enquadramento_pisst(pisst)
  return unless pisst.present?
  {
      dsSigla: 'PISST',
      tpEnquadramento: 'IM',
      situacao: 'T',
      vlTributavel: pisst.atributo('vBC'),
      vlAliquota: pisst.atributo('pPIS'),
      vlImposto: pisst.atributo('vPIS'),
      vlImpostoUnitario: pisst.atributo('vAliqProd')
  }.compact
end
enquadramentos_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 228
def enquadramentos_do_item(item)
  imposto = item.atributo('imposto')
  icms = icms_do_item(item)
  [
      enquadramento_icms(icms), # 0 ICMS
      enquadramento_icmsst(icms), # 1 ST
      nil, # 2 ???
      enquadramento_icmsste(icms), # 3 STE
      enquadramento_ipi(ipi_do_item(item)), # 4 IPI
      enquadramento_ii(imposto.atributo('II')), # 5 II
      enquadramento_pis(pis_do_item(item)), # 6 PIS
      enquadramento_pisst(imposto.atributo('PISST')), # 7 PISST
      enquadramento_cofins(cofins_do_item(item)), # 8 COFINS
      enquadramento_cofinsst(imposto.atributo('COFINSST')), # 9 COFINSST
  ]
end
icms_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 171
def icms_do_item(item)
  unless item.dados(:icms).present?
    imposto = item.atributo('imposto.ICMS')
    ['ICMS00', 'ICMS10', 'ICMS20', 'ICMS30', 'ICMS40', 'ICMS51', 'ICMS60', 'ICMS70', 'ICMS90'].each do |tipo_icms|
      item.dados(:icms, imposto.atributo(tipo_icms))
      if item.dados(:icms).present?
        item.dados(:icms).atualizar(tipo: tipo_icms)
        break
      end
    end
  end
  item.dados(:icms)
end
ipi_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 185
def ipi_do_item(item)
  unless item.dados(:ipi).present?
    item.dados(:ipi, item.atributo('imposto.IPI'))
    ['IPINT', 'IPITrib'].each do |tipo|
      imposto = item.dados(:ipi).atributo(tipo)
      if imposto.present?
        item.dados(:ipi).atualizar(imposto.to_h)
        item.dados(:ipi).atualizar(tipo: tipo)
        break
      end
    end
  end
  item.dados(:ipi)
end
itens() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 114
def itens
  itens = inf_nfe.atributo('det')
  itens = [itens] unless itens.is_a?(Array)
  itens.map do |item|
    produto = item.atributo('prod')
    next unless produto.present?
    {
        cdCSTICMS: cst_icms_do_item(item),
        cdCSTIPI: cst_ipi_do_item(item),
        cdCSTPIS: cst_pis_do_item(item),
        cdCSTCOFINS: cst_cofins_do_item(item),
        cdItemDocFiscal: item.atributo('nItem'),
        cdCfop: produto.atributo('CFOP'),
        unidade: produto.atributo('uCom'),
        qtItemDocFiscal: produto.atributo('qCom'),
        vlUnitario: produto.atributo('vUnCom'),
        vlTotalCI: produto.atributo('vProd'),
        vlTotal: produto.atributo('vProd'),
        qtTributariaUnidade: produto.atributo('uTrib'),
        qtTributaria: quantidade_tributaria_do_item(item),
        vUnTrib: produto.atributo('vUnTrib'),
        vlFrete: produto.atributo('vFrete'),
        vlSeguro: produto.atributo('vSeg'),
        vlDesconto: produto.atributo('vDesc'),
        vlOda: produto.atributo('vOutro'),
        DI: produto.atributo('DI').to_h,
        xPed: produto.atributo('xPed'),
        nItemPed: produto.atributo('nItemPed'),
        cdClassificacao: 'M',
        deduzCFOP: 'S',
        deduzCSTICMS: 'S',
        deduzCSTPIS: 'S',
        deduzCSTCOFINS: 'S',
        deduzCSTIPI: 'S',
        prodItem: produto_do_item(item),
        enquadramentos: enquadramentos_do_item(item)
    }.compact
  end.compact
end
mapear_documento() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 19
def mapear_documento
  {
      idDocFiscal: inf_nfe.atributo('ide.cNF'),
      natOp: inf_nfe.atributo('ide.natOp'),
      tipoPagto: inf_nfe.atributo('ide.indPag'),
      modelo: inf_nfe.atributo('ide.mod'),
      serie: inf_nfe.atributo('ide.serie'),
      numero: inf_nfe.atributo('ide.nNF'),
      dtEmissao: data_de_emissao,
      dtES: inf_nfe.atributo('ide.dSaiEnt'),
      dtPagto: inf_nfe.atributo('ide.dSaiEnt'),
      cMunFG: inf_nfe.atributo('ide.cMunFg'),
      refNFP: inf_nfe.atributo('ide.refNFP'),
      refCTE: inf_nfe.atributo('ide.refCTE'),
      refECF: inf_nfe.atributo('ide.refECF'),
      tpImp: inf_nfe.atributo('ide.tpImp'),
      tpEmis: inf_nfe.atributo('ide.tpEmis'),
      cDV: inf_nfe.atributo('ide.cDV'),
      tpAmb: inf_nfe.atributo('ide.tpAmb'),
      finNFe: inf_nfe.atributo('ide.finNFe'),
      procEmi: inf_nfe.atributo('ide.procEmi'),
      verProc: inf_nfe.atributo('ide.verProc'),
      dhCont: inf_nfe.atributo('ide.dhCont'),
      xJust: inf_nfe.atributo('ide.xJust'),
      vNF: inf_nfe.atributo('total.ICMSTot.vNF'),
      indConsumidorFinal: (inf_nfe.atributo('ide.indFinal') == '1' ? 'S' : 'N'),
      emitente: emitente,
      destinatario: destinatario,
      retirada: inf_nfe.atributo('retirada').to_h,
      entrega: inf_nfe.atributo('entrega').to_h,
      itensDocFiscal: itens,
      tipoOperacao: tipo_de_operacao,
      tpDocFiscal: 'FT',
      naturezaOperacao: '002'
  }.compact
end
origem_do_produto(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 399
def origem_do_produto(item)
  ipi_do_item(item).atributo('orig') || icms_do_item(item).atributo('orig')
end
pis_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 200
def pis_do_item(item)
  unless item.dados(:pis).present?
    imposto = item.atributo('imposto.PIS')
    ['PISNT', 'PISAliq', 'PISQtde', 'PISOutr'].each do |tipo|
      item.dados(:pis, imposto.atributo(tipo))
      if item.dados(:pis).present?
        item.dados(:pis).atualizar(tipo: tipo)
        break
      end
    end
  end
  item.dados(:pis)
end
produto_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 154
def produto_do_item(item)
  produto = item.atributo('prod')
  return {} unless produto.present?
  {
      indTot: produto.atributo('indTot'),
      cEANTrib: produto.atributo('cEANTrib'),
      codigo: produto.atributo('cProd'),
      EAN: produto.atributo('cEAN'),
      descricao: produto.atributo('xProd'),
      NCM: produto.atributo('NCM'),
      CEST: produto.atributo('CEST'),
      exTIPI: produto.atributo('EXTIPI'),
      cdOrigem: origem_do_produto(item),
      aplicacao: 'C'
  }.compact
end
quantidade_tributaria_do_item(item) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 437
def quantidade_tributaria_do_item(item)
  item.atributo('imposto.COFINSST.qBCProd') ||
      item.atributo('imposto.COFINS.COFINSOutr.qBCProd') ||
      item.atributo('imposto.PISST.qBCProd') ||
      item.atributo('imposto.PIS.PISOutr.qBCProd') ||
      item.atributo('prod.qTrib')
end
situacao_do_icms_cst(cst) click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 421
def situacao_do_icms_cst(cst)
  return if cst.blank?
  case cst.to_s
    when '40' # Isenta
      'I'
    when '41' # Não tributada
      'N'
    when '50' # Suspensão
      'S'
    when '51' # Diferimento
      'D'
    else # Tributada
      'T'
  end
end
tipo_de_operacao() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 382
def tipo_de_operacao
  emit_uf = inf_nfe.atributo('emit.UF')
  dest_uf = inf_nfe.atributo('dest.UF')
  if emit_uf && dest_uf
    emit_uf == dest_uf ? 'E' : 'I'
  end
end
to_dfe() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 15
def to_dfe
  @documento = mapear_documento
end

Private Instance Methods

inf_nfe() click to toggle source
# File lib/dfe_taxweb/nfe.rb, line 468
def inf_nfe
  @inf_nfe ||= nfe.atributo('nfeProc.NFe.infNFe') ||
      nfe.atributo('NFe.infNFe') ||
      nfe.atributo('infNFe') ||
      Conjunto.new({})
end