emr_ohsp_interface 1.0.1 → 1.1.0

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: 615b6608b86d4635ef984daf489d23fd7d2eda027ceba04df262593e03dc8abf
4
- data.tar.gz: 3862e0ce3eb31e36b386c1be405fc840f67ed33b57e953d6f4e42d857f86230b
3
+ metadata.gz: 649cb3e2144f053db93789503c1cd14bb48263a93c31d9fa92eb3edb30a54e42
4
+ data.tar.gz: 8f80cd97e51363c047610f2ac3661ca2cc967d81d1a475c157d9a402d3f009aa
5
5
  SHA512:
6
- metadata.gz: af1d17bb456373feed6325bb5b7168d1f980e8c33fe1b918b638da1b78d229ba564c1623fcc4a9e4ef1ad16feb5d737adf2a38fd93f949763ff18634e082b389
7
- data.tar.gz: 9b29acf9e63db3bfec739df4add596c2f4e61f53d6f576d3af1018d80eaaedd749adf17d994c90a2daddadf636c9c0982acebfda1e86cf63891aca99c32e6c4c
6
+ metadata.gz: 7a965d0f5e3d1bbbf830bdba32faad6426ca5a34970b908808b7165e8fa5a1851688e54f1a16b6c38ee545a3e59440c74c5d074642009f648258a600e264977f
7
+ data.tar.gz: 483de992deb8ab577a65821ebb60b8f6aaeaeb209d5d570eccf27aa996eb13c2dd7f59a948b847bbaa1d1ced9c6c9dc5398edd6c7e1a136fd9ea3cec24726bec
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2021 petroskayange
1
+ Copyright 2022 petroskayange, dominickasanga
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -18,6 +18,10 @@ class EmrOhspInterface::EmrOhspInterfaceController < ::ApplicationController
18
18
  def generate_hmis_15_report
19
19
  render json: service.generate_hmis_15_report(params[:start_date],params[:end_date]);
20
20
  end
21
+
22
+ def generate_hmis_17_report
23
+ render json: service.generate_hmis_17_report(params[:start_date],params[:end_date]);
24
+ end
21
25
 
22
26
  def service
23
27
  EmrOhspInterface::EmrOhspInterfaceService
@@ -267,7 +267,10 @@ module EmrOhspInterface
267
267
 
268
268
  special_indicators = ["Malaria - new cases (under 5)",
269
269
  "Malaria - new cases (5 & over)",
270
- "HIV confirmed positive (15-49 years) new cases"
270
+ "HIV confirmed positive (15-49 years) new cases",
271
+ "Diarrhoea non - bloody -new cases (under5)",
272
+ "Malnutrition - new case (under 5)",
273
+ "Acute respiratory infections - new cases (U5)"
271
274
  ]
272
275
 
273
276
  diag_map.each do |key,value|
@@ -317,7 +320,6 @@ module EmrOhspInterface
317
320
  options["ids"] = under_five
318
321
 
319
322
  collection[key] = options
320
-
321
323
  end
322
324
 
323
325
  if key.eql?("Malaria - new cases (5 & over)")
@@ -352,11 +354,225 @@ module EmrOhspInterface
352
354
 
353
355
  collection[key] = options
354
356
  end
357
+
358
+ if key.eql?("Diarrhoea non - bloody -new cases (under5)")
359
+ data = Encounter.where('encounter_datetime BETWEEN ? AND ?
360
+ AND encounter_type = ? AND value_coded IN (?)
361
+ AND concept_id IN(6543, 6542)',
362
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
363
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
364
+ joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
365
+ INNER JOIN person p ON p.person_id = encounter.patient_id').\
366
+ select('encounter.encounter_type, obs.value_coded, p.*')
367
+
368
+ under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
369
+ collect{|record| record["person_id"]}
370
+
371
+ options["ids"] = under_five
372
+
373
+ collection[key] = options
374
+ end
375
+
376
+ if key.eql?("Malnutrition - new case (under 5)")
377
+ data = Encounter.where('encounter_datetime BETWEEN ? AND ?
378
+ AND encounter_type = ? AND value_coded IN (?)
379
+ AND concept_id IN(6543, 6542)',
380
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
381
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
382
+ joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
383
+ INNER JOIN person p ON p.person_id = encounter.patient_id').\
384
+ select('encounter.encounter_type, obs.value_coded, p.*')
385
+
386
+ under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
387
+ collect{|record| record["person_id"]}
388
+
389
+ options["ids"] = under_five
390
+
391
+ collection[key] = options
392
+ end
393
+
394
+ if key.eql?("Acute respiratory infections - new cases (U5)")
395
+ data = Encounter.where('encounter_datetime BETWEEN ? AND ?
396
+ AND encounter_type = ? AND value_coded IN (?)
397
+ AND concept_id IN(6543, 6542)',
398
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
399
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
400
+ joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
401
+ INNER JOIN person p ON p.person_id = encounter.patient_id').\
402
+ select('encounter.encounter_type, obs.value_coded, p.*')
403
+
404
+ under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
405
+ collect{|record| record["person_id"]}
406
+
407
+ options["ids"] = under_five
408
+
409
+ collection[key] = options
410
+ end
411
+
355
412
  end
356
413
  end
357
414
  collection
358
415
  end
359
416
 
417
+ def disaggregate(disaggregate_key, concept_ids, start_date, end_date, type)
418
+ options = {"ids"=>nil}
419
+ data = Encounter.where('encounter_datetime BETWEEN ? AND ?
420
+ AND encounter_type = ? AND value_coded IN (?)
421
+ AND concept_id IN(6543, 6542)',
422
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
423
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
424
+ joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
425
+ INNER JOIN person p ON p.person_id = encounter.patient_id').\
426
+ select('encounter.encounter_type, obs.value_coded, p.*')
427
+
428
+ if disaggregate_key == "less"
429
+ options["ids"] = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
430
+ collect{|record| record["person_id"]}
431
+ else
432
+ if disaggregate_key == "greater"
433
+ options["ids"] = data.select{|record| calculate_age(record["birthdate"]) >= 5 }.\
434
+ collect{|record| record["person_id"]}
435
+ end
436
+ end
437
+
438
+ options
439
+ end
440
+
441
+ def generate_hmis_17_report(start_date=nil,end_date=nil)
442
+
443
+ diag_map = settings["hmis_17_map"]
444
+
445
+ #pull the data
446
+ type = EncounterType.find_by_name 'Outpatient diagnosis'
447
+ collection = {}
448
+
449
+ special_indicators = [
450
+ "Referals from other institutions",
451
+ "OPD total attendance",
452
+ "Referal to other institutions",
453
+ "Malaria 5 years and older - new"
454
+ ]
455
+
456
+ special_under_five_indicators = [
457
+ "Measles under five years - new",
458
+ "Pneumonia under 5 years- new",
459
+ "Dysentery under 5 years - new",
460
+ "Diarrhoea non - bloody -new cases (under5)",
461
+ "Malaria under 5 years - new"
462
+ ]
463
+
464
+ diag_map.each do |key,value|
465
+ options = {"ids"=>nil}
466
+ concept_ids = ConceptName.where(name: value).collect{|cn| cn.concept_id}
467
+
468
+ if !special_indicators.include?(key) && !special_under_five_indicators.include?(key)
469
+ data = Encounter.where('encounter_datetime BETWEEN ? AND ?
470
+ AND encounter_type = ? AND value_coded IN (?)
471
+ AND concept_id IN(6543, 6542)',
472
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
473
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
474
+ joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
475
+ INNER JOIN person p ON p.person_id = encounter.patient_id').\
476
+ select('encounter.encounter_type, obs.value_coded, p.*')
477
+
478
+ all = data.collect{|record| record.person_id}
479
+
480
+
481
+ options["ids"] = all
482
+
483
+ collection[key] = options
484
+ else
485
+ if key.eql?("Referals from other institutions")
486
+ _type = EncounterType.find_by_name 'PATIENT REGISTRATION'
487
+ visit_type = ConceptName.find_by_name 'Type of visit'
488
+
489
+ data = Encounter.where('encounter_datetime BETWEEN ? AND ?
490
+ AND encounter_type = ? AND value_coded IS NOT NULL
491
+ AND obs.concept_id = ?', start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
492
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),_type.id, visit_type.concept_id).\
493
+ joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
494
+ INNER JOIN person p ON p.person_id = encounter.patient_id
495
+ INNER JOIN concept_name c ON c.concept_id = 6541').\
496
+ select('encounter.encounter_type, obs.value_coded, obs.obs_datetime, p.*, c.name visit_type').\
497
+ group('p.person_id, encounter.encounter_id')
498
+
499
+ all = data.collect{|record| record.person_id}
500
+
501
+ options["ids"] = all
502
+
503
+ collection[key] = options
504
+ end
505
+
506
+ if key.eql?("OPD total attendance")
507
+ _type = EncounterType.find_by_name 'PATIENT REGISTRATION'
508
+ visit_type = ConceptName.find_by_name 'Type of visit'
509
+
510
+ data = Encounter.where('encounter_datetime BETWEEN ? AND ?
511
+ AND encounter_type = ? AND value_coded IS NOT NULL
512
+ AND obs.concept_id = ?', start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
513
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),_type.id, visit_type.concept_id).\
514
+ joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
515
+ INNER JOIN person p ON p.person_id = encounter.patient_id
516
+ INNER JOIN concept_name c ON c.concept_id = obs.value_coded
517
+ LEFT JOIN person_name n ON n.person_id = encounter.patient_id AND n.voided = 0
518
+ RIGHT JOIN person_address a ON a.person_id = encounter.patient_id').\
519
+ select('encounter.encounter_type, n.family_name, n.given_name,
520
+ obs.value_coded, obs.obs_datetime, p.*, c.name visit_type,
521
+ a.state_province district, a.township_division ta, a.city_village village').\
522
+ order('n.date_created DESC').group('n.person_id, encounter.encounter_id')
523
+
524
+ all = data.collect{|record| record.person_id}
525
+
526
+ options["ids"] = all
527
+
528
+ collection[key] = options
529
+ end
530
+
531
+ if key.eql?("Referal to other institutions")
532
+ data = Observation.where("obs_datetime BETWEEN ? AND ?
533
+ AND concept_id = ?",start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
534
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),'7414').\
535
+ joins('LEFT JOIN location l ON l.location_id = obs.value_text').\
536
+ select('obs.person_id').order('obs_datetime DESC')
537
+
538
+ all = data.collect{|record| record.person_id}
539
+
540
+ options["ids"] = all
541
+
542
+ collection[key] = options
543
+ end
544
+
545
+ if key.eql?("Measles under five years - new")
546
+ collection[key] = disaggregate('less',concept_ids, start_date, end_date, type)
547
+ end
548
+
549
+ if key.eql?("Pneumonia under 5 years- new")
550
+ collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
551
+ end
552
+
553
+ if key.eql?("Malaria under 5 years - new")
554
+ collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
555
+ end
556
+
557
+ if key.eql?("Malaria 5 years and older - new")
558
+ collection[key] = disaggregate('greater',concept_ids, start_date, end_date, type)
559
+ end
560
+
561
+ if key.eql?("Dysentery under 5 years - new")
562
+ collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
563
+ end
564
+
565
+ if key.eql?("Diarrhoea non - bloody -new cases (under5)")
566
+ collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
567
+ end
568
+
569
+ end
570
+ end
571
+
572
+ collection
573
+
574
+ end
575
+
360
576
  def generate_notifiable_disease_conditions_report(start_date=nil,end_date=nil)
361
577
  diag_map = settings["notifiable_disease_conditions"]
362
578
 
data/config/routes.rb CHANGED
@@ -6,6 +6,7 @@ EmrOhspInterface::Engine.routes.draw do
6
6
  get '/generate_weekly_idsr_report', to: 'emr_ohsp_interface#generate_weekly_idsr_report'
7
7
  get '/generate_monthly_idsr_report', to: 'emr_ohsp_interface#generate_monthly_idsr_report'
8
8
  get '/generate_hmis_15_report', to: 'emr_ohsp_interface#generate_hmis_15_report'
9
+ get '/generate_hmis_17_report', to: 'emr_ohsp_interface#generate_hmis_17_report'
9
10
 
10
11
  # for the new crossplatform OPD system
11
12
  get 'api/v1/get_lims_user', to: 'emr_lims_interface#get_user_info'
@@ -14,4 +15,5 @@ EmrOhspInterface::Engine.routes.draw do
14
15
  get 'api/v1/generate_weekly_idsr_report', to: 'emr_ohsp_interface#generate_weekly_idsr_report'
15
16
  get 'api/v1/generate_monthly_idsr_report', to: 'emr_ohsp_interface#generate_monthly_idsr_report'
16
17
  get 'api/v1/generate_hmis_15_report', to: 'emr_ohsp_interface#generate_hmis_15_report'
18
+ get 'api/v1/generate_hmis_17_report', to: 'emr_ohsp_interface#generate_hmis_17_report'
17
19
  end
@@ -1,3 +1,3 @@
1
1
  module EmrOhspInterface
2
- VERSION = '1.0.1'
2
+ VERSION = '1.1.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: emr_ohsp_interface
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Justin Manda and Petros Kayange
7
+ - Justin Manda, Petros Kayange, and Dominic Kasanga
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-11 00:00:00.000000000 Z
11
+ date: 2022-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -74,7 +74,7 @@ dependencies:
74
74
  version: '0'
75
75
  description:
76
76
  email:
77
- - justinmandah@gmail.com, kayangepetros@gmail.com
77
+ - justinmandah@gmail.com, kayangepetros@gmail.com, dominickasanga@gmail.com
78
78
  executables: []
79
79
  extensions: []
80
80
  extra_rdoc_files: []