Class: MergeAuditService

Inherits:
Object
  • Object
show all
Defined in:
app/services/merge_audit_service.rb

Overview

This service will handle merge audits with their tree structure

Instance Method Summary collapse

Instance Method Details

#common_merge_fetch(field, fetch_value) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
# File 'app/services/merge_audit_service.rb', line 35

def common_merge_fetch(field, fetch_value)
  ActiveRecord::Base.connection.select_one <<~SQL
    SELECT ma.id, ma.primary_id, ma.secondary_id, ma.created_at merge_date, ma.merge_type, pn.given_name primary_first_name, pn.family_name primary_surname, p.gender primary_gender, p.birthdate primary_birthdate,
    spn.given_name secondary_first_name, spn.family_name secondary_surname, sp.gender secondary_gender, sp.birthdate secondary_birthdate
    FROM merge_audits ma
    INNER JOIN person_name pn ON pn.person_id = ma.primary_id
    INNER JOIN person p ON p.person_id = ma.primary_id
    INNER JOIN person_name spn ON spn.person_id = ma.secondary_id AND spn.voided = 1
    INNER JOIN person sp ON sp.person_id = ma.secondary_id AND sp.voided = 1
    WHERE #{field} = #{fetch_value} AND ma.voided = 0
  SQL
end

#create_merge_audit(primary_patient, secondary_patient, merge_type) ⇒ Object

This method a merge audit for us



6
7
8
9
10
11
12
# File 'app/services/merge_audit_service.rb', line 6

def create_merge_audit(primary_patient, secondary_patient, merge_type)
  recent_merge_id = MergeAudit.where(primary_id: secondary_patient).last&.id
  merge_audit = MergeAudit.create({ primary_id: primary_patient, secondary_id: secondary_patient,
                                    creator: User.current.id, merge_type: merge_type,
                                    secondary_previous_merge_id: recent_merge_id })
  raise "Could not create audit trail due to #{merge_audit.errors.as_json}" unless merge_audit.errors.empty?
end

#fetch_merge_audit(secondary) ⇒ Object

this uses the patient id to get the audit tree and it is used by get patient_audit

Raises:

  • (NotFoundError)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'app/services/merge_audit_service.rb', line 20

def fetch_merge_audit(secondary)
  first_merge = common_merge_fetch('ma.secondary_id', secondary)
  raise NotFoundError, "There is no merge for #{secondary}" if first_merge.blank?

  count = 0
  tree = [first_merge.merge({ 'merge_number' => count += 1 })]
  merge_id = MergeAudit.where(primary_id: first_merge['primary_id']).last&.id
  until merge_id.blank?
    parent = common_merge_fetch('ma.secondary_previous_merge_id', merge_id)
    tree << parent.merge({ 'merge_number' => count += 1 }) unless parent.blank?
    merge_id = parent.blank? ? nil : MergeAudit.where(primary_id: parent['primary_id']).last&.id
  end
  tree.reverse
end

#find_voided_identifier(identifier) ⇒ Object

Raises:

  • (NotFoundError)


48
49
50
51
52
53
54
55
# File 'app/services/merge_audit_service.rb', line 48

def find_voided_identifier(identifier)
  result = ActiveRecord::Base.connection.select_one <<~SQL
    SELECT patient_id FROM patient_identifier WHERE identifier = '#{identifier}' AND identifier_type = 3 AND voided = 1 ORDER BY date_voided ASC
  SQL
  raise NotFoundError, "Failed to find voided identifier: #{identifier}" if result.blank?

  result['patient_id']
end

#get_patient_audit(identifier) ⇒ Object

this uses the patient identifier to get the audit tree



15
16
17
# File 'app/services/merge_audit_service.rb', line 15

def get_patient_audit(identifier)
  fetch_merge_audit(find_voided_identifier(identifier))
end