Class: Provider

Inherits:
Object
  • Object
show all
Includes:
Mongoid::Attributes::Dynamic, Mongoid::Tree, Personable
Defined in:
lib/health-data-standards/models/provider.rb

Constant Summary collapse

NPI_OID =
'2.16.840.1.113883.4.6'
TAX_ID_OID =
'2.16.840.1.113883.4.2'

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Personable

included

Class Method Details

.luhn_checksum(num) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/health-data-standards/models/provider.rb', line 64

def self.luhn_checksum(num)
  double = {'0' => 0, '1' => 2, '2' => 4, '3' => 6, '4' => 8, '5' => 1, '6' => 3, '7' => 5, '8' => 7, '9' => 9}
  sum = 0
  num.reverse!
  num.split("").each_with_index do |char, i|
    if (i%2)==0
      sum+=double[char]
    else
      sum+=char.to_i
    end
  end
  sum = (9*sum)%10

  return sum.to_s
end

.resolve_provider(provider_hash, patient = nil) ⇒ Object

When using the ProviderImporter class this method will be called if a parsed provider can not be found in the database if the parsed provider does not have an npi number associated with it. This allows applications to handle this how they see fit by redefining this method. The default implementation is to return an orphan parent (the singular provider without an NPI) if one exists. If this method call return nil an attempt will be made to discover the Provider by name matching and if that fails a Provider will be created in the db based on the information in the parsed hash.



88
89
90
# File 'lib/health-data-standards/models/provider.rb', line 88

def self.resolve_provider(provider_hash, patient=nil)
  Provider.where(:npi => nil).first
end

.valid_npi?(npi) ⇒ Boolean

validate the NPI, should be 10 or 15 digits total with the final digit being a checksum using the Luhn algorithm with additional special handling as described in www.cms.gov/NationalProvIdentStand/Downloads/NPIcheckdigit.pdf

Returns:

  • (Boolean)


50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/health-data-standards/models/provider.rb', line 50

def self.valid_npi?(npi)
  return false unless npi
  return false if npi.length != 10 and npi.length != 15
  return false if npi.gsub(/\d/, '').length > 0 # npi must be all digits
  return false if npi.length == 15 and (npi =~ /^80840/)==nil # 15 digit npi must start with 80840

  # checksum is always calculated as if 80840 prefix is present
  if npi.length==10
    npi = '80840'+npi
  end

  return luhn_checksum(npi[0,14])==npi[14]
end

Instance Method Details

#npiObject



29
30
31
32
# File 'lib/health-data-standards/models/provider.rb', line 29

def npi
  cda_id_npi = self.cda_identifiers.where(root: NPI_OID).first
  cda_id_npi ? cda_id_npi.extension : nil
end

#npi=(an_npi) ⇒ Object



19
20
21
22
23
24
25
26
27
# File 'lib/health-data-standards/models/provider.rb', line 19

def npi=(an_npi)
  cda_id_npi = self.cda_identifiers.where(root: NPI_OID).first
  if cda_id_npi
    cda_id_npi.extension = an_npi
    cda_id_npi.save!
  else
    self.cda_identifiers << CDAIdentifier.new(root: NPI_OID, extension: an_npi)
  end
end

#records(effective_date = nil) ⇒ Object



43
44
45
# File 'lib/health-data-standards/models/provider.rb', line 43

def records(effective_date=nil)
  Record.by_provider(self, effective_date)
end

#tinObject



38
39
40
41
# File 'lib/health-data-standards/models/provider.rb', line 38

def tin
  cda_id_tin = self.cda_identifiers.where(root: TAX_ID_OID).first
  cda_id_tin ? cda_id_tin.extension : nil
end

#tin=(a_tin) ⇒ Object



34
35
36
# File 'lib/health-data-standards/models/provider.rb', line 34

def tin=(a_tin)
  self.cda_identifiers << CDAIdentifier.new(root: TAX_ID_OID, extension: a_tin)
end