How to create visits for preexisting encounters

For one reason or another, you may have a bunch of encounters that do not have a corresponding visit. Sometimes, as with the registration encounter, this is normal. But sometimes you might want to attach visits to groups of encounters. Here is a mysql script to do that.

-- create-visits-for-encounters.sql -- This is a SQL script that will create visits for already-existing encounters -- in the OpenMRS database. It creates one visit per patient-day; thus all -- encounters that take place on the same day are assumed to be part of the -- same visit. -- -- Note that this means that if a real-world patient visit involves multiple -- encounters that happen on different sides of midnight UTC, they will appear -- as different visits. -- -- Parameters: -- @visit_type_id: the visit_type_id to use for the created visits. If you -- need to use different visit_type_ids for different types of encounters, -- do separate runs of this script varying this parameter and -- encounter_type_exclusions as necessary. -- @encounter_type_exclusions: a comma-separated string enumerating the -- encounter_type_ids which should be excluded from these visits. -- -- `location_id` and `creator` are assumed to be the same across each -- encounter group (i.e., per patient-day). If they are not, it is undefined -- which of the different values will be used. -- SET @visit_type_id = 1; SET @encounter_type_exclusions = '2'; /* a comma-separated string like '1,2,3' */ -- Create the visits INSERT INTO visit (patient_id, visit_type_id, date_started, date_stopped, location_id, creator, date_created, voided, uuid) SELECT e.patient_id, @visit_type_id, e.date_started, e.date_stopped, e.location_id, e.creator, now(), 0, uuid() FROM ( SELECT patient_id, Subtime(Min(encounter_datetime), '00:05:00') AS date_started, /* visit must start before first enc */ Addtime(Max(encounter_datetime), '00:05:00') AS date_stopped, /* visit must end after last enc */ location_id, creator FROM encounter WHERE FIND_IN_SET(encounter_type, @encounter_type_exclusions) = 0 GROUP BY patient_id, Date(encounter_datetime) ) AS e; -- Add the visit_ids to their encounters UPDATE encounter e INNER JOIN visit v ON e.patient_id = v.patient_id AND Date(e.encounter_datetime) = Date(v.date_started) SET e.visit_id = v.visit_id WHERE FIND_IN_SET(e.encounter_type, @encounter_type_exclusions) = 0;