malawi_hiv_program_reports 1.0.25 → 1.0.26
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 +4 -4
- data/app/services/malawi_hiv_program_reports/moh/cumulative_cohort.rb +62 -55
- data/app/services/malawi_hiv_program_reports/moh/cumulative_outcome.rb +255 -212
- data/app/services/malawi_hiv_program_reports/pepfar/tx_ml.rb +55 -110
- data/app/services/malawi_hiv_program_reports/pepfar/tx_new.rb +58 -59
- data/app/services/malawi_hiv_program_reports/pepfar/tx_rtt.rb +42 -160
- data/lib/malawi_hiv_program_reports/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53d6565fca96ee2021dfe480bdede7d60e308abc3988c209c86658e56d66baa4
|
4
|
+
data.tar.gz: c8f56f53589f21725e00c4afe769ffbc330f6a2a687455e6fd43bc128657eb8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9909ffb6013589e67b6ccce8f7833308270cedb69c74d7ac77a203b2870475e69bbef0c635d88ad51d1095958670313b26c862dc16407358aa448a3eaf1378e
|
7
|
+
data.tar.gz: a08774fa4213673af1cfa0efa728059a52bbe6dcc0f0dd70174ebaddc68581ba25c50d53a56946c474ed99bd60234762b67c8e57b77f0d94eea8a2477790f27a
|
@@ -17,13 +17,17 @@ module MalawiHivProgramReports
|
|
17
17
|
@rebuild = kwargs[:rebuild]&.casecmp?('true')
|
18
18
|
locations = kwargs[:locations]
|
19
19
|
@locations = locations.present? ? locations.split(',') : []
|
20
|
-
@definition = kwargs[:definition]
|
20
|
+
@definition = kwargs[:definition] || 'pepfar'
|
21
|
+
|
22
|
+
definition = @definition.downcase
|
23
|
+
raise ArgumentError, "Invalid outcomes definition: #{definition}" unless %w[moh pepfar].include?(definition)
|
21
24
|
end
|
22
25
|
|
23
26
|
def find_report
|
24
27
|
start_time = Time.now
|
25
28
|
prepare_tables
|
26
29
|
clear_tables if rebuild
|
30
|
+
clear_cohort_status unless rebuild
|
27
31
|
process_thread
|
28
32
|
end_time = Time.now
|
29
33
|
time_in_minutes = ((end_time - start_time) / 60).round(2)
|
@@ -60,7 +64,8 @@ module MalawiHivProgramReports
|
|
60
64
|
ActiveRecord::Base.connection_pool.with_connection do
|
61
65
|
process_data loc
|
62
66
|
rescue StandardError => e
|
63
|
-
Rails.logger.
|
67
|
+
Rails.logger.info("Error processing location #{loc}: #{e.message}")
|
68
|
+
Rails.logger.info(e.backtrace.join("\n"))
|
64
69
|
save_incomplete_site(location: loc, time_taken: 0)
|
65
70
|
end
|
66
71
|
end
|
@@ -80,8 +85,8 @@ module MalawiHivProgramReports
|
|
80
85
|
potential_cohort_members location
|
81
86
|
reason_for_starting_art location
|
82
87
|
cohort_members location
|
83
|
-
outcome = MalawiHivProgramReports::Moh::CumulativeOutcome.new(end_date:, location:, definition:, rebuild:)
|
84
|
-
outcome.find_report
|
88
|
+
outcome = MalawiHivProgramReports::Moh::CumulativeOutcome.new(end_date:, location:, definition:, rebuild:, start_date:)
|
89
|
+
rebuild ? outcome.find_report : outcome.update_outcomes_by_definition
|
85
90
|
end_time = Time.now
|
86
91
|
time_taken = ((end_time - start_time) / 60).round(2)
|
87
92
|
save_completed_site(location:, time_taken:)
|
@@ -260,7 +265,7 @@ module MalawiHivProgramReports
|
|
260
265
|
INSERT INTO cdr_temp_cohort_members PARTITION (p#{location})
|
261
266
|
SELECT
|
262
267
|
pcm.patient_id,
|
263
|
-
|
268
|
+
#{location},
|
264
269
|
pcm.birthdate,
|
265
270
|
pcm.birthdate_estimated,
|
266
271
|
pcm.death_date,
|
@@ -271,11 +276,10 @@ module MalawiHivProgramReports
|
|
271
276
|
IF(pcm.birthdate IS NOT NULL, TIMESTAMPDIFF(YEAR, pcm.birthdate, COALESCE(ti.value_datetime, mdo.start_date)), NULL) AS age_at_initiation,
|
272
277
|
IF(pcm.birthdate IS NOT NULL, TIMESTAMPDIFF(DAY, pcm.birthdate, COALESCE(ti.value_datetime, mdo.start_date)), NULL) AS age_in_days,
|
273
278
|
rfsa.reason_for_starting_art
|
274
|
-
FROM cdr_temp_potential_cohort_members pcm
|
275
|
-
INNER JOIN cdr_temp_min_drug_orders mdo ON mdo.patient_id = pcm.patient_id
|
276
|
-
INNER JOIN cdr_reason_for_starting_art rfsa ON rfsa.patient_id = pcm.patient_id
|
277
|
-
LEFT JOIN cdr_temp_transfer_ins ti ON ti.patient_id = pcm.patient_id
|
278
|
-
WHERE pcm.site_id = #{location}
|
279
|
+
FROM cdr_temp_potential_cohort_members PARTITION (p#{location}) pcm
|
280
|
+
INNER JOIN cdr_temp_min_drug_orders PARTITION (p#{location}) mdo ON mdo.patient_id = pcm.patient_id
|
281
|
+
INNER JOIN cdr_reason_for_starting_art PARTITION (p#{location}) AS rfsa ON rfsa.patient_id = pcm.patient_id
|
282
|
+
LEFT JOIN cdr_temp_transfer_ins PARTITION (p#{location}) ti ON ti.patient_id = pcm.patient_id
|
279
283
|
HAVING reason_for_starting_art IS NOT NULL
|
280
284
|
ON DUPLICATE KEY UPDATE birthdate = VALUES(birthdate), birthdate_estimated = VALUES(birthdate_estimated), death_date = VALUES(death_date),
|
281
285
|
gender = VALUES(gender), date_enrolled = VALUES(date_enrolled), earliest_start_date = VALUES(earliest_start_date),
|
@@ -289,19 +293,18 @@ module MalawiHivProgramReports
|
|
289
293
|
INSERT INTO cdr_temp_potential_cohort_members PARTITION (p#{location})
|
290
294
|
SELECT
|
291
295
|
pp.patient_id,
|
292
|
-
|
296
|
+
#{location},
|
293
297
|
p.birthdate,
|
294
298
|
p.birthdate_estimated,
|
295
299
|
p.death_date,
|
296
300
|
LEFT(p.gender, 1) gender
|
297
|
-
FROM patient_program pp
|
298
|
-
INNER JOIN person p ON p.person_id = pp.patient_id AND p.
|
299
|
-
INNER JOIN patient_state ps ON ps.patient_program_id = pp.patient_program_id
|
301
|
+
FROM patient_program PARTITION (p#{location}) AS pp
|
302
|
+
INNER JOIN person PARTITION (p#{location}) AS p ON p.person_id = pp.patient_id AND p.voided = 0
|
303
|
+
INNER JOIN patient_state PARTITION (p#{location}) AS ps ON ps.patient_program_id = pp.patient_program_id
|
300
304
|
AND ps.voided = 0 AND ps.state = 7 AND ps.start_date IS NOT NULL -- 7 is On antiretrovirals
|
301
305
|
AND ps.start_date < (DATE(#{end_date}) + INTERVAL 1 DAY)
|
302
|
-
WHERE pp.program_id = 1 AND pp.voided = 0 AND (pp.patient_id
|
303
|
-
|
304
|
-
GROUP BY pp.patient_id, pp.site_id
|
306
|
+
WHERE pp.program_id = 1 AND pp.voided = 0 AND (pp.patient_id) NOT IN (SELECT patient_id FROM cdr_temp_external_clients PARTITION (p#{location}))
|
307
|
+
GROUP BY pp.patient_id
|
305
308
|
ON DUPLICATE KEY UPDATE birthdate = VALUES(birthdate), birthdate_estimated = VALUES(birthdate_estimated), death_date = VALUES(death_date),
|
306
309
|
gender = VALUES(gender)
|
307
310
|
SQL
|
@@ -310,24 +313,24 @@ module MalawiHivProgramReports
|
|
310
313
|
def min_drug_orders(location)
|
311
314
|
ActiveRecord::Base.connection.execute <<~SQL
|
312
315
|
INSERT INTO cdr_temp_min_drug_orders PARTITION (p#{location})
|
313
|
-
SELECT o.patient_id,
|
314
|
-
FROM orders o
|
315
|
-
INNER JOIN drug_order do ON do.order_id = o.order_id AND do.
|
316
|
+
SELECT o.patient_id, #{location}, DATE(MIN(o.start_date)) start_date
|
317
|
+
FROM orders PARTITION (p#{location}) AS o
|
318
|
+
INNER JOIN drug_order PARTITION (p#{location}) AS do ON do.order_id = o.order_id AND do.quantity > 0
|
316
319
|
LEFT JOIN (
|
317
|
-
SELECT o.person_id patient_id,
|
318
|
-
FROM obs o
|
319
|
-
INNER JOIN cdr_other_patient_types other ON other.patient_id = o.person_id
|
320
|
+
SELECT o.person_id patient_id, #{location}, DATE(MIN(o.obs_datetime)) registered_date
|
321
|
+
FROM obs PARTITION (p#{location}) AS o
|
322
|
+
INNER JOIN cdr_other_patient_types PARTITION (p#{location}) AS other ON other.patient_id = o.person_id
|
320
323
|
WHERE o.concept_id = 3289 -- Type of patient
|
321
324
|
AND o.value_coded = 7572 -- New patient
|
322
325
|
AND o.voided = 0
|
323
326
|
AND o.obs_datetime < (DATE(#{end_date}) + INTERVAL 1 DAY)
|
324
|
-
GROUP BY o.person_id
|
325
|
-
) np ON np.patient_id = o.patient_id
|
327
|
+
GROUP BY o.person_id
|
328
|
+
) np ON np.patient_id = o.patient_id
|
326
329
|
WHERE o.voided = 0 AND o.start_date < (DATE(#{end_date}) + INTERVAL 1 DAY)
|
327
330
|
AND o.start_date > COALESCE(np.registered_date, DATE('1900-01-01'))
|
328
331
|
AND o.concept_id IN (SELECT concept_id FROM concept_set WHERE concept_set = 1085) -- 1085 is ARV DRUGS
|
329
|
-
AND o.order_type_id = 1
|
330
|
-
GROUP BY o.patient_id
|
332
|
+
AND o.order_type_id = 1
|
333
|
+
GROUP BY o.patient_id
|
331
334
|
ON DUPLICATE KEY UPDATE start_date = VALUES(start_date)
|
332
335
|
SQL
|
333
336
|
end
|
@@ -335,15 +338,15 @@ module MalawiHivProgramReports
|
|
335
338
|
def transfer_ins(location)
|
336
339
|
ActiveRecord::Base.connection.execute <<~SQL
|
337
340
|
INSERT INTO cdr_temp_transfer_ins PARTITION (p#{location})
|
338
|
-
SELECT o.person_id,
|
339
|
-
FROM obs o
|
340
|
-
INNER JOIN encounter e ON e.patient_id = o.person_id AND e.
|
341
|
-
AND e.program_id = 1
|
341
|
+
SELECT o.person_id, #{location}, DATE(MIN(o.value_datetime)) value_datetime
|
342
|
+
FROM obs PARTITION (p#{location}) AS o
|
343
|
+
INNER JOIN encounter PARTITION (p#{location}) AS e ON e.patient_id = o.person_id AND e.encounter_id = o.encounter_id
|
344
|
+
AND e.program_id = 1 -- HIV Program
|
345
|
+
AND e.encounter_datetime < (DATE(#{end_date}) + INTERVAL 1 DAY)
|
342
346
|
AND e.encounter_type = 9 -- HIV CLINIC REGISTRATION
|
343
347
|
AND e.voided = 0
|
344
348
|
WHERE o.concept_id = 2516 AND o.voided = 0 AND o.obs_datetime < (DATE(#{end_date}) + INTERVAL 1 DAY) -- 2516 is Date antiretrovirals started
|
345
|
-
|
346
|
-
GROUP BY o.person_id, o.site_id
|
349
|
+
GROUP BY o.person_id
|
347
350
|
ON DUPLICATE KEY UPDATE value_datetime = VALUES(value_datetime)
|
348
351
|
SQL
|
349
352
|
end
|
@@ -351,24 +354,21 @@ module MalawiHivProgramReports
|
|
351
354
|
def external_clients(location)
|
352
355
|
ActiveRecord::Base.connection.execute <<~SQL
|
353
356
|
INSERT INTO cdr_temp_external_clients PARTITION (p#{location})
|
354
|
-
SELECT e.patient_id,
|
355
|
-
FROM patient_program
|
356
|
-
INNER JOIN obs AS patient_type ON patient_type.person_id = e.patient_id
|
357
|
-
AND patient_type.site_id = e.site_id
|
357
|
+
SELECT e.patient_id, #{location}, GROUP_CONCAT(DISTINCT(patient_type.value_coded)) AS patient_types, clinic_registration.encounter_id
|
358
|
+
FROM patient_program PARTITION (p#{location}) AS e
|
359
|
+
INNER JOIN obs PARTITION (p#{location}) AS patient_type ON patient_type.person_id = e.patient_id
|
358
360
|
AND patient_type.voided = 0
|
359
361
|
AND patient_type.concept_id = 3289 -- Type of patient
|
360
362
|
AND patient_type.obs_datetime < DATE(#{end_date}) + INTERVAL 1 DAY
|
361
|
-
LEFT JOIN encounter
|
362
|
-
AND clinic_registration.
|
363
|
-
AND clinic_registration.program_id = 1
|
363
|
+
LEFT JOIN encounter PARTITION (p#{location}) AS clinic_registration ON clinic_registration.patient_id = e.patient_id
|
364
|
+
AND clinic_registration.program_id = 1 -- HIV PROGRAM
|
364
365
|
AND clinic_registration.encounter_type = 9 -- HIV CLINIC REGISTRATION
|
365
366
|
AND clinic_registration.encounter_datetime < DATE(#{end_date}) + INTERVAL 1 DAY
|
366
367
|
AND clinic_registration.voided = 0
|
367
368
|
WHERE e.program_id = 1 -- HIV program
|
368
369
|
AND e.voided = 0
|
369
|
-
AND e.site_id = #{location}
|
370
370
|
-- AND clinic_registration.encounter_id IS NOT NULL -- bone of contention
|
371
|
-
GROUP BY e.patient_id
|
371
|
+
GROUP BY e.patient_id
|
372
372
|
HAVING FIND_IN_SET('7572', patient_types) = 0 AND encounter_id IS NULL
|
373
373
|
ON DUPLICATE KEY UPDATE patient_types = VALUES(patient_types)
|
374
374
|
SQL
|
@@ -377,14 +377,13 @@ module MalawiHivProgramReports
|
|
377
377
|
def cdr_other_patient_types(location)
|
378
378
|
ActiveRecord::Base.connection.execute <<~SQL
|
379
379
|
INSERT INTO cdr_other_patient_types PARTITION (p#{location})
|
380
|
-
SELECT o.person_id,
|
381
|
-
FROM obs o
|
380
|
+
SELECT o.person_id, #{location}
|
381
|
+
FROM obs PARTITION (p#{location}) AS o
|
382
382
|
WHERE o.concept_id = 3289 -- Type of patient
|
383
383
|
AND o.value_coded != 7572 -- New patient
|
384
384
|
AND o.voided = 0
|
385
385
|
AND o.obs_datetime < (DATE(#{end_date}) + INTERVAL 1 DAY)
|
386
|
-
|
387
|
-
GROUP BY o.person_id, o.site_id
|
386
|
+
GROUP BY o.person_id
|
388
387
|
-- on duplicate just ignore
|
389
388
|
ON DUPLICATE KEY UPDATE site_id = VALUES(site_id)
|
390
389
|
SQL
|
@@ -393,14 +392,15 @@ module MalawiHivProgramReports
|
|
393
392
|
def reason_for_starting_art(location)
|
394
393
|
ActiveRecord::Base.connection.execute <<~SQL
|
395
394
|
INSERT INTO cdr_reason_for_starting_art PARTITION (p#{location})
|
396
|
-
SELECT a.person_id,
|
397
|
-
FROM obs a
|
398
|
-
INNER JOIN cdr_temp_potential_cohort_members ct ON ct.patient_id = a.person_id
|
399
|
-
LEFT OUTER JOIN obs b ON a.person_id = b.person_id AND
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
395
|
+
SELECT a.person_id, #{location}, a.value_coded
|
396
|
+
FROM obs PARTITION (p#{location}) a
|
397
|
+
INNER JOIN cdr_temp_potential_cohort_members PARTITION (p#{location}) AS ct ON ct.patient_id = a.person_id
|
398
|
+
LEFT OUTER JOIN obs PARTITION (p#{location}) AS b ON a.person_id = b.person_id AND b.concept_id = a.concept_id
|
399
|
+
AND b.concept_id = 7563
|
400
|
+
AND a.obs_datetime < b.obs_datetime AND b.voided = 0
|
401
|
+
AND b.obs_datetime < DATE(#{end_date}) + INTERVAL 1 DAY AND a.obs_datetime < DATE(#{end_date}) + INTERVAL 1 DAY
|
402
|
+
WHERE b.obs_id IS NULL AND a.concept_id = 7563 AND a.voided = 0
|
403
|
+
GROUP BY a.person_id
|
404
404
|
ON DUPLICATE KEY UPDATE reason_for_starting_art = VALUES(reason_for_starting_art)
|
405
405
|
SQL
|
406
406
|
end
|
@@ -417,7 +417,6 @@ module MalawiHivProgramReports
|
|
417
417
|
ActiveRecord::Base.connection.execute('TRUNCATE TABLE cdr_temp_cohort_members')
|
418
418
|
ActiveRecord::Base.connection.execute('TRUNCATE TABLE cdr_temp_external_clients')
|
419
419
|
ActiveRecord::Base.connection.execute('TRUNCATE TABLE cdr_reason_for_starting_art')
|
420
|
-
ActiveRecord::Base.connection.execute('TRUNCATE TABLE cdr_temp_cohort_status')
|
421
420
|
else
|
422
421
|
ActiveRecord::Base.connection.execute("DELETE FROM cdr_other_patient_types WHERE site_id IN (#{locations.join(',')})")
|
423
422
|
ActiveRecord::Base.connection.execute("DELETE FROM cdr_temp_potential_cohort_members WHERE site_id IN (#{locations.join(',')})")
|
@@ -426,6 +425,14 @@ module MalawiHivProgramReports
|
|
426
425
|
ActiveRecord::Base.connection.execute("DELETE FROM cdr_temp_cohort_members WHERE site_id IN (#{locations.join(',')})")
|
427
426
|
ActiveRecord::Base.connection.execute("DELETE FROM cdr_temp_external_clients WHERE site_id IN (#{locations.join(',')})")
|
428
427
|
ActiveRecord::Base.connection.execute("DELETE FROM cdr_reason_for_starting_art WHERE site_id IN (#{locations.join(',')})")
|
428
|
+
end
|
429
|
+
clear_cohort_status
|
430
|
+
end
|
431
|
+
|
432
|
+
def clear_cohort_status
|
433
|
+
if locations.empty?
|
434
|
+
ActiveRecord::Base.connection.execute('TRUNCATE TABLE cdr_temp_cohort_status')
|
435
|
+
else
|
429
436
|
ActiveRecord::Base.connection.execute("DELETE FROM cdr_temp_cohort_status WHERE site_id IN (#{locations.join(',')})")
|
430
437
|
end
|
431
438
|
end
|