his_emr_api_lab 2.3.8 → 2.3.9.beta

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee7a7342538d7d538f428dcdd2b275fdb344c58fd357d54e8582f4e838c2a12f
4
- data.tar.gz: b18f15f0c432db303b3b7ebde6987a58333e1117b7f292062ba3650efdb07fb1
3
+ metadata.gz: 765ba6c202e8acbcc7b4c527f825712faaa90dcf6065652b8af1af697ad95a43
4
+ data.tar.gz: 7c669c0d903dd3f55269a771faf3987f92c35b2d4e6c6f9ff0649bf886ad44c9
5
5
  SHA512:
6
- metadata.gz: e0cec0ece1963d176983de30fcc5fd28c284c147daa48657b04461f7ffc202bb78fef7d3e15e51a33d5f0cfb6ac597ba6134bbbe78b910afb1175a7d5b017bce
7
- data.tar.gz: baeae9fa92dd7be44cf7659650799f6672e22be67aa34138d171b9affc88d4cba2b401cc1483eda52a419456df83b88173253afcf66f296d1b815ecc0f6ce445
6
+ metadata.gz: b86dd7203397f49373d56a54738f17959732e2b8a334da57c24a62396c86f4b125d8bc52aabcab0e21dc34fd661e10ecec49f58c82967ebc9b77a6b6a1afd785
7
+ data.tar.gz: 0131d1135c05cbe03b41ce3e05993087607cffbc28c7845c530df10a740ff16f0c6697880142816dc656c280b8766a4bed47e2cbcbef093a4cd0ab40629152e1
@@ -27,22 +27,46 @@ class Lab::NotificationService
27
27
  end
28
28
  end
29
29
 
30
- def create_notification(alert_type, alert_message)
30
+ def create_notification(alert_type, alert_message,
31
+ uniq_checkers: { test_type_id: nil, order_id: nil, specimen_id: nil })
31
32
  return if alert_type != 'LIMS'
32
33
 
33
- # Use unscoped to find user regardless of location context
34
- lab = Lab::Lims::Utils.lab_user
34
+ test_type_id = uniq_checkers[:test_type_id]
35
+ order_id = uniq_checkers[:order_id]
36
+ specimen_id = uniq_checkers[:specimen_id]
37
+
38
+ return unless test_type_id.present? && order_id.present? && specimen_id.present?
35
39
 
40
+ lab = Lab::Lims::Utils.lab_user
36
41
  unless lab
37
42
  Rails.logger.warn('NotificationService: lab_daemon user not found, skipping notification creation')
38
43
  return
39
44
  end
40
45
 
41
46
  ActiveRecord::Base.transaction do
42
- alert = NotificationAlert.create!(text: alert_message.to_json, date_to_expire: Time.now + not_period.days,
43
- creator: lab, changed_by: lab, date_created: Time.now)
44
- notify(alert, User.joins(:roles).uniq)
45
- # ActionCable.server.broadcast('nlims_channel', alert)
47
+ # Atomic find or create - checks and creates in one operation
48
+ alert = NotificationAlert.find_or_create_by!(
49
+ test_type_id: test_type_id,
50
+ order_id: order_id,
51
+ specimen_id: specimen_id
52
+ ) do |new_alert|
53
+ # Only set these attributes on creation
54
+ new_alert.text = alert_message.to_json
55
+ new_alert.date_to_expire = Time.now + not_period.days
56
+ new_alert.creator = lab
57
+ new_alert.changed_by = lab
58
+ new_alert.date_created = Time.now
59
+ end
60
+
61
+ # Only notify if this is a new record (not a duplicate)
62
+ notify(alert, User.joins(:roles).uniq) if alert.previously_new_record?
63
+ rescue ActiveRecord::RecordNotUnique
64
+ # Handle race condition if unique constraint exists
65
+ Rails.logger.info("Duplicate notification prevented for test_type: #{test_type_id}, order: #{order_id}, specimen: #{specimen_id}")
66
+ rescue ActiveRecord::InvalidForeignKey => e
67
+ Rails.logger.error("Invalid foreign key: #{e.message}")
68
+ rescue StandardError => e
69
+ Rails.logger.error("Unexpected error: #{e.message}")
46
70
  end
47
71
  end
48
72
 
@@ -74,6 +74,11 @@ module Lab
74
74
  def precess_notification_message(result, values, result_enter_by)
75
75
  order = Order.find(result.order_id)
76
76
  test_concept_id = result.test&.value_coded
77
+ uniq_checkers = {
78
+ test_type_id: test_concept_id,
79
+ order_id: order&.order_id,
80
+ specimen_id: order.concept_id
81
+ }
77
82
 
78
83
  data = { Type: result_enter_by,
79
84
  Specimen: get_test_catalog_name(order.concept_id) || ConceptName.find_by(concept_id: order.concept_id)&.name,
@@ -84,7 +89,7 @@ module Lab
84
89
  PatientID: result.person_id,
85
90
  'Ordered By': Order.columns.include?('provider_id') ? order&.provider&.person&.name : Person.find(User.unscoped.find(order.creator).person_id)&.name,
86
91
  Result: values }.as_json
87
- NotificationService.new.create_notification(result_enter_by, data)
92
+ NotificationService.new.create_notification(result_enter_by, data, uniq_checkers: uniq_checkers)
88
93
  end
89
94
 
90
95
  def process_acknowledgement(results, results_enter_by)
data/lib/lab/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lab
4
- VERSION = '2.3.8'
4
+ VERSION = '2.3.9.beta'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: his_emr_api_lab
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.8
4
+ version: 2.3.9.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elizabeth Glaser Pediatric Foundation Malawi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-21 00:00:00.000000000 Z
11
+ date: 2026-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: couchrest
@@ -341,9 +341,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
341
341
  version: '0'
342
342
  required_rubygems_version: !ruby/object:Gem::Requirement
343
343
  requirements:
344
- - - ">="
344
+ - - ">"
345
345
  - !ruby/object:Gem::Version
346
- version: '0'
346
+ version: 1.3.1
347
347
  requirements: []
348
348
  rubygems_version: 3.4.1
349
349
  signing_key: