From 94eb3db7968ec9c096a7ae0d3a735ce9f30afe91 Mon Sep 17 00:00:00 2001
From: Thomas  OBADIA <thomas.obadia@pasteur.fr>
Date: Thu, 22 May 2025 17:01:11 +0200
Subject: [PATCH] Make casting for REDCAP system variables explicit to address
 changes in the redcapAPI methods

---
 ...NTERVENTIONAL_M0_01_dump_REDCap_database.R | 33 ++++++++++++-------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_01_dump_REDCap_database.R b/03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_01_dump_REDCap_database.R
index 3740ebc..6e9f665 100644
--- a/03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_01_dump_REDCap_database.R
+++ b/03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_01_dump_REDCap_database.R
@@ -17,6 +17,7 @@
 ### SOURCE THE R ENVIRONMENT
 ######################################################################
 source("./03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_00_R_environment.R")
+source("./03_INTERVENTIONAL_M0/INTERVENTIONAL_M0_00_R_functions.R")
 
 
 
@@ -51,15 +52,15 @@ if (DATA_SOURCE_REDCAP_AHRI_INT_M0) {
 # Passive Case Detection datasets
 if (DATA_SOURCE_REDCAP_IPP_INT_PCD) {
   RCON_IPP_INTERVENTIONAL_PCD  <- redcapAPI::redcapConnection(url   = Sys.getenv("REDCAP_IPP_API_URL"), 
-                                                             token = Sys.getenv("REDCAP_IPP_API_TOKEN_INTERVENTIONAL_PCD"))
+                                                              token = Sys.getenv("REDCAP_IPP_API_TOKEN_INTERVENTIONAL_PCD"))
 }
 if (DATA_SOURCE_REDCAP_IPM_INT_PCD) {
   RCON_IPM_INTERVENTIONAL_PCD  <- redcapAPI::redcapConnection(url   = Sys.getenv("REDCAP_IPM_API_URL"), 
-                                                             token = Sys.getenv("REDCAP_IPM_API_TOKEN_INTERVENTIONAL_PCD"))
+                                                              token = Sys.getenv("REDCAP_IPM_API_TOKEN_INTERVENTIONAL_PCD"))
 }
 if (DATA_SOURCE_REDCAP_AHRI_INT_PCD) {
   RCON_AHRI_INTERVENTIONAL_PCD <- redcapAPI::redcapConnection(url   = Sys.getenv("REDCAP_AHRI_API_URL"), 
-                                                             token = Sys.getenv("REDCAP_AHRI_API_TOKEN_INTERVENTIONAL_PCD"))
+                                                              token = Sys.getenv("REDCAP_AHRI_API_TOKEN_INTERVENTIONAL_PCD"))
 }
 
 
@@ -105,26 +106,36 @@ if (!DATA_EXTRACT_IS_RECENT_INT_M0) {
                                                                          # Radio buttons reported as label instead of code
                                                                          "radio"    = castLabelCharacter, 
                                                                          "yesno"    = castLabelCharacter, 
-                                                                         "dropdown" = castLabelCharacter
+                                                                         "dropdown" = castLabelCharacter, 
+                                                                         "system"   = castLabelCharacter
                                                                        )) %>% 
       
       # Convert the '999' code to NA, except in Date/POSIX fields because it'll mess them up
       mutate(across(-c(where(is.POSIXt), 
-                       where(is.Date)), function(x) (ifelse(x == 999, NA, x)))) %>% 
+                       where(is.Date)), function(x) (ifelse(as.character(x) == "999", NA, x)))) %>% 
       
       # Add data source for convenience
       mutate(data_source   = RCON)
     
     ## Check for invalid records before moving on
     print(reviewInvalidRecords(dat_interventional_m0_raw[[RCON]]))
+    
+    ## Propagate baseline data to subsequent events
+    dat_interventional_m0_raw[[RCON]] <- propagate_unique_data(x           = dat_interventional_m0_raw[[RCON]], 
+                                                               metadata    = RCON_INTERVENTIONAL_M0[[RCON]]$metadata(), 
+                                                               events.from = c("participant_screening", 
+                                                                               "eligibility_consent", 
+                                                                               "identification_demographics", 
+                                                                               "safety_of_study_drugs", 
+                                                                               "final_status"))
   }
   
-  # Cleanup that loop
-  rm(RCON)
-  
   # Concatenate all data into a single table
   dat_interventional_m0_raw <- dat_interventional_m0_raw %>% 
-    bind_rows()
+    bind_rows() 
+  
+  # Cleanup that loop
+  rm(RCON)
   
   ## Passive Case Detection datasets
   for (RCON in names(RCON_INTERVENTIONAL_PCD)) {
@@ -138,7 +149,8 @@ if (!DATA_EXTRACT_IS_RECENT_INT_M0) {
                                                                           # Radio buttons reported as label instead of code
                                                                           "radio"    = castLabelCharacter, 
                                                                           "yesno"    = castLabelCharacter, 
-                                                                          "dropdown" = castLabelCharacter
+                                                                          "dropdown" = castLabelCharacter, 
+                                                                          "system"   = castLabelCharacter
                                                                         )) %>% 
       
       # Convert the '999' code to NA, except in Date/POSIX fields because it'll mess them up
@@ -228,4 +240,3 @@ rm(INTERVENTIONAL_M0_OUT_01_FILENAME,
 DATA_EXTRACT_IS_RECENT_INT_M0    <- as.logical(difftime(time1 = Sys.Date(), 
                                                         time2 = as.Date(ifelse(exists("DATA_EXTRACT_TS_INT_M0"), DATA_EXTRACT_TS_INT_M0, DATA_EXTRACT_TS_DEFAULT)), 
                                                         units = "days") <= DATA_EXTRACT_EXPIRY_TIME_D)
-
-- 
GitLab